geonetwork-ui 2.3.0-dev.f736344f → 2.3.0-dev.ff2a9db7
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/index.mjs +2 -1
- package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
- package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +14 -0
- package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +15 -0
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +52 -0
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +8 -4
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +4 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +2 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +123 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +116 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +138 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +2 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +242 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +59 -63
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +18 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +14 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +48 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +18 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +64 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +76 -59
- package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +76 -14
- package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
- package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +21 -7
- package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
- package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
- package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
- package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +35 -7
- package/esm2022/libs/data-access/gn4/src/openapi/model/models.mjs +1 -2
- package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
- package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +36 -3
- package/esm2022/libs/feature/editor/src/index.mjs +2 -2
- package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +6 -2
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.mjs +11 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.mjs +28 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.mjs +11 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +45 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.mjs +50 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +11 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +11 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +126 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +2 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +10 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +29 -0
- package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +10 -10
- package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +23 -1
- package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
- package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -2
- package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +3 -3
- package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +125 -0
- package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
- package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
- package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -3
- package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +12 -7
- package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +2 -1
- package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +73 -25
- package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +12 -49
- package/esm2022/libs/feature/notifications/src/index.mjs +4 -0
- package/esm2022/libs/feature/notifications/src/lib/feature-notifications.module.mjs +18 -0
- package/esm2022/libs/feature/notifications/src/lib/notification.model.mjs +2 -0
- package/esm2022/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.mjs +49 -0
- package/esm2022/libs/feature/notifications/src/lib/notifications.service.mjs +29 -0
- package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
- package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
- package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +9 -4
- package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
- package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
- package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +22 -7
- package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +52 -17
- package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
- package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
- package/esm2022/libs/feature/search/src/index.mjs +2 -1
- package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +3 -3
- package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
- package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
- package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
- package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +3 -3
- package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
- package/esm2022/libs/ui/elements/src/index.mjs +15 -15
- package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
- package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
- package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +5 -5
- package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
- package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +45 -0
- package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/notification/notification.component.mjs +34 -0
- package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +99 -36
- package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +4 -3
- package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +14 -10
- package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
- package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +60 -0
- package/esm2022/libs/ui/inputs/src/index.mjs +16 -16
- package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -1
- package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
- package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
- package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
- package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +19 -8
- package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +59 -0
- package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +183 -0
- package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
- package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
- package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +21 -3
- package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +21 -31
- package/esm2022/libs/ui/layout/src/index.mjs +7 -5
- package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
- package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
- package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +18 -0
- package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
- package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
- package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
- package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -0
- package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +60 -0
- package/esm2022/libs/util/shared/src/lib/utils/index.mjs +8 -6
- package/esm2022/translations/de.json +43 -0
- package/esm2022/translations/en.json +43 -0
- package/esm2022/translations/es.json +43 -0
- package/esm2022/translations/fr.json +43 -0
- package/esm2022/translations/it.json +43 -0
- package/esm2022/translations/nl.json +43 -0
- package/esm2022/translations/pt.json +43 -0
- package/fesm2022/geonetwork-ui.mjs +5728 -3420
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.ts +1 -0
- package/libs/api/metadata-converter/src/index.d.ts +4 -4
- package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/{metadata-base.mapper.d.ts → base.converter.d.ts} +3 -3
- package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/find-converter.d.ts +3 -0
- package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.d.ts → gn4.converter.d.ts} +5 -5
- package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +4 -0
- package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +2 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +9 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +20 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +21 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +2 -0
- package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +11 -0
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +34 -6
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +8 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +39 -3
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +14 -1
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
- package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
- package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
- package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -4
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
- package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
- package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
- package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
- package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +9 -5
- package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
- package/libs/data-access/gn4/src/openapi/model/models.d.ts +0 -1
- package/libs/data-access/gn4/src/openapi/model/models.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
- package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
- package/libs/feature/editor/src/index.d.ts +1 -1
- package/libs/feature/editor/src/index.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +8 -5
- package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.d.ts +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.d.ts.map +1 -0
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.d.ts +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.d.ts +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts +16 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts.map +1 -0
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.d.ts +2 -2
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts.map +1 -0
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -0
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -0
- package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.d.ts +13 -4
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.d.ts +3 -3
- package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/feature-editor.module.d.ts +1 -1
- package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/models/fields.model.d.ts +1 -1
- package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
- package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
- package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +28 -0
- package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -0
- package/libs/feature/map/src/lib/feature-map.module.d.ts +2 -1
- package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
- package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +2 -0
- package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
- package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +11 -5
- package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
- package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -3
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
- package/libs/feature/notifications/src/index.d.ts +4 -0
- package/libs/feature/notifications/src/index.d.ts.map +1 -0
- package/libs/feature/notifications/src/lib/feature-notifications.module.d.ts +7 -0
- package/libs/feature/notifications/src/lib/feature-notifications.module.d.ts.map +1 -0
- package/libs/feature/notifications/src/lib/notification.model.d.ts +7 -0
- package/libs/feature/notifications/src/lib/notification.model.d.ts.map +1 -0
- package/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.d.ts +12 -0
- package/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.d.ts.map +1 -0
- package/libs/feature/notifications/src/lib/notifications.service.d.ts +15 -0
- package/libs/feature/notifications/src/lib/notifications.service.d.ts.map +1 -0
- package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
- package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
- package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
- package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts +14 -4
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
- package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
- package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
- package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
- package/libs/feature/search/src/index.d.ts +1 -0
- package/libs/feature/search/src/index.d.ts.map +1 -1
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
- package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
- package/libs/ui/elements/src/index.d.ts +14 -14
- package/libs/ui/elements/src/index.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
- package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts +13 -0
- package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts.map +1 -0
- package/libs/ui/elements/src/lib/notification/notification.component.d.ts +13 -0
- package/libs/ui/elements/src/lib/notification/notification.component.d.ts.map +1 -0
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +24 -4
- package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -28
- package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
- package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
- package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +21 -0
- package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/index.d.ts +15 -15
- package/libs/ui/inputs/src/index.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
- package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
- package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
- package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts +14 -0
- package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +44 -0
- package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
- package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
- package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
- package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +5 -1
- package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -42
- package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
- package/libs/ui/layout/src/index.d.ts +6 -4
- package/libs/ui/layout/src/index.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
- package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
- package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
- package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts +8 -0
- package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts.map +1 -0
- package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
- package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
- package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
- package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -0
- package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -0
- package/libs/util/shared/src/lib/utils/image-resize.d.ts +3 -0
- package/libs/util/shared/src/lib/utils/image-resize.d.ts.map +1 -0
- package/libs/util/shared/src/lib/utils/index.d.ts +7 -5
- package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/libs/api/metadata-converter/src/index.ts +4 -4
- package/src/libs/api/metadata-converter/src/lib/{metadata-base.mapper.ts → base.converter.ts} +2 -2
- package/src/libs/api/metadata-converter/src/lib/find-converter.ts +16 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +32 -5
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +11 -4
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +33 -7
- package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +580 -0
- package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.ts → gn4.converter.ts} +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +9 -3
- package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +3 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +1 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +176 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +329 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +513 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +1 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +327 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +122 -83
- package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +20 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +175 -98
- package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +84 -16
- package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
- package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +40 -7
- package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -4
- package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
- package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
- package/src/libs/common/fixtures/src/index.ts +8 -6
- package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
- package/src/libs/common/fixtures/src/lib/records.fixtures.ts +3 -3
- package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
- package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +43 -12
- package/src/libs/data-access/gn4/src/openapi/model/models.ts +0 -1
- package/src/libs/data-access/gn4/src/spec.yaml +1 -1
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +52 -2
- package/src/libs/feature/editor/src/index.ts +1 -1
- package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +8 -1
- package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +8 -0
- package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +70 -0
- package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.ts +1 -0
- package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.ts +4 -1
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
- package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.ts +1 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +20 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +44 -0
- package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.ts +4 -1
- package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +1 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.css +0 -0
- package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.ts +1 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +97 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +142 -0
- package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.css +0 -0
- package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.html +1 -0
- package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.ts +4 -4
- package/src/libs/feature/editor/src/lib/feature-editor.module.ts +9 -9
- package/src/libs/feature/editor/src/lib/fields.config.ts +22 -0
- package/src/libs/feature/editor/src/lib/models/fields.model.ts +1 -1
- package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -16
- package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
- package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +1 -1
- package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
- package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +50 -0
- package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +135 -0
- package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -0
- package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +8 -0
- package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +5 -0
- package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +11 -3
- package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +78 -32
- package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +17 -61
- package/src/libs/feature/notifications/src/index.ts +3 -0
- package/src/libs/feature/notifications/src/lib/feature-notifications.module.ts +10 -0
- package/src/libs/feature/notifications/src/lib/notification.model.ts +6 -0
- package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.css +0 -0
- package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.html +17 -0
- package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.ts +44 -0
- package/src/libs/feature/notifications/src/lib/notifications.service.ts +27 -0
- package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +7 -2
- package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
- package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +48 -8
- package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +81 -24
- package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
- package/src/libs/feature/search/src/index.ts +1 -0
- package/src/libs/feature/search/src/lib/results-table/results-table.component.html +3 -3
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
- package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.html +5 -5
- package/src/libs/ui/elements/src/index.ts +14 -14
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
- package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
- package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +1 -1
- package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
- package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
- package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +0 -5
- package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +0 -21
- package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +1 -14
- package/src/libs/ui/elements/src/lib/notification/notification.component.css +0 -0
- package/src/libs/ui/elements/src/lib/notification/notification.component.html +52 -0
- package/src/libs/ui/elements/src/lib/notification/notification.component.ts +31 -0
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +27 -11
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +126 -30
- package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +5 -3
- package/src/libs/ui/elements/src/lib/ui-elements.module.ts +6 -3
- package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
- package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
- package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
- package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +62 -0
- package/src/libs/ui/inputs/src/index.ts +15 -15
- package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -1
- package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
- package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
- package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
- package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
- package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +14 -0
- package/src/libs/ui/inputs/src/lib/files-drop/files-drop.directive.ts +45 -0
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +0 -0
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +146 -0
- package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +193 -0
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
- package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
- package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
- package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
- package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +2 -1
- package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +17 -1
- package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +6 -22
- package/src/libs/ui/layout/src/index.ts +6 -4
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
- package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
- package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.css +0 -0
- package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +18 -0
- package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +16 -0
- package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
- package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
- package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
- package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +3 -0
- package/src/libs/util/shared/src/lib/utils/image-resize.ts +72 -0
- package/src/libs/util/shared/src/lib/utils/index.ts +7 -5
- package/tailwind.base.css +36 -0
- package/translations/de.json +43 -0
- package/translations/en.json +43 -0
- package/translations/es.json +43 -0
- package/translations/fr.json +43 -0
- package/translations/it.json +43 -0
- package/translations/nl.json +43 -0
- package/translations/pt.json +43 -0
- package/translations/sk.json +43 -0
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +0 -52
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +0 -14
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +0 -48
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +0 -18
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +0 -64
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +0 -130
- package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +0 -14
- package/esm2022/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.mjs +0 -13
- package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +0 -30
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.mjs +0 -11
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.mjs +0 -27
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.mjs +0 -11
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.mjs +0 -27
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.mjs +0 -49
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +0 -11
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +0 -11
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +0 -76
- package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +0 -2
- package/esm2022/libs/ui/inputs/src/lib/form-field/index.mjs +0 -10
- package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +0 -4
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +0 -1
- package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts +0 -18
- package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts.map +0 -1
- package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts +0 -11
- package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +0 -1
- package/libs/ui/inputs/src/lib/form-field/index.d.ts.map +0 -1
- package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +0 -196
- package/src/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.ts +0 -18
- package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.html +0 -11
- package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.ts +0 -15
- package/src/libs/ui/inputs/src/lib/form-field/form-field.component.html +0 -68
- package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +0 -80
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.d.ts +0 -0
- /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.d.ts +0 -0
- /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.d.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.ts +0 -0
- /package/src/libs/feature/editor/src/lib/{record-form/record-form.component.css → components/overview-upload/overview-upload.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.css +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.html +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.css +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.html +0 -0
- /package/src/libs/{ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.html +0 -0
- /package/src/libs/{ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.html +0 -0
- /package/src/libs/{ui/inputs/src/lib/form-field/form-field.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.css} +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.html +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.ts +0 -0
- /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.ts +0 -0
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { getStatusFromStatusCode } from './
|
|
2
|
-
import { getUpdateFrequencyFromFrequencyCode } from './
|
|
1
|
+
import { getStatusFromStatusCode } from './utils/status.mapper';
|
|
2
|
+
import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper';
|
|
3
3
|
import { findChildElement, findChildrenElement, findNestedElement, findNestedElements, findParent, readAttribute, readText, } from '../xml-utils';
|
|
4
4
|
import { combine, fallback, filterArray, flattenArray, getAtIndex, map, mapArray, pipe, } from '../function-utils';
|
|
5
|
-
import { getRoleFromRoleCode } from './
|
|
5
|
+
import { getRoleFromRoleCode } from './utils/role.mapper';
|
|
6
6
|
import { matchMimeType, matchProtocol } from '../common/distribution.mapper';
|
|
7
|
-
import { getKeywordTypeFromKeywordTypeCode } from './
|
|
8
|
-
|
|
7
|
+
import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper';
|
|
8
|
+
import { fullNameToParts } from './utils/individual-name';
|
|
9
|
+
export function extractCharacterString() {
|
|
9
10
|
return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
|
|
10
11
|
}
|
|
11
|
-
function extractDateTime() {
|
|
12
|
+
export function extractDateTime() {
|
|
12
13
|
return pipe(fallback(findChildElement('gco:DateTime', false), findChildElement('gco:Date', false)), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)));
|
|
13
14
|
}
|
|
14
|
-
function extractUrl() {
|
|
15
|
+
export function extractUrl() {
|
|
15
16
|
const getUrl = pipe(findChildElement('gmd:URL', false), readText());
|
|
16
17
|
const getCharacterString = pipe(findChildElement('gco:CharacterString', false), readText());
|
|
17
18
|
const getAnchor = pipe(findChildElement('gmx:Anchor', false), readAttribute('xlink:href'));
|
|
@@ -24,15 +25,15 @@ function extractUrl() {
|
|
|
24
25
|
}
|
|
25
26
|
}));
|
|
26
27
|
}
|
|
27
|
-
function extractMandatoryUrl() {
|
|
28
|
+
export function extractMandatoryUrl() {
|
|
28
29
|
return fallback(extractUrl(), () => new URL('http://missing'));
|
|
29
30
|
}
|
|
30
31
|
// from gmd:role
|
|
31
|
-
function extractRole() {
|
|
32
|
+
export function extractRole() {
|
|
32
33
|
return pipe(findChildElement('gmd:CI_RoleCode'), readAttribute('codeListValue'), map(getRoleFromRoleCode));
|
|
33
34
|
}
|
|
34
35
|
// from gmd:CI_ResponsibleParty
|
|
35
|
-
function extractOrganization() {
|
|
36
|
+
export function extractOrganization() {
|
|
36
37
|
const getUrl = pipe(findNestedElements('gmd:contactInfo', 'gmd:CI_Contact', 'gmd:onlineResource', 'gmd:CI_OnlineResource', 'gmd:linkage'), getAtIndex(0), extractUrl());
|
|
37
38
|
return pipe(combine(pipe(findChildElement('gmd:organisationName', false), extractCharacterString()), getUrl), map(([name, website]) => ({
|
|
38
39
|
name,
|
|
@@ -40,63 +41,67 @@ function extractOrganization() {
|
|
|
40
41
|
})));
|
|
41
42
|
}
|
|
42
43
|
// from gmd:CI_ResponsibleParty
|
|
43
|
-
function
|
|
44
|
+
export function extractIndividual() {
|
|
44
45
|
const getRole = pipe(findChildElement('gmd:role'), extractRole());
|
|
45
46
|
const getPosition = pipe(findChildElement('gmd:positionName'), extractCharacterString());
|
|
46
47
|
const getNameParts = pipe(findChildElement('gmd:individualName'), extractCharacterString(), map((fullName) => {
|
|
47
48
|
if (!fullName)
|
|
48
49
|
return [];
|
|
49
|
-
|
|
50
|
-
if (!parts.length)
|
|
51
|
-
return [fullName, null];
|
|
52
|
-
const first = parts.shift();
|
|
53
|
-
return [first, parts.join(' ')];
|
|
50
|
+
return fullNameToParts(fullName);
|
|
54
51
|
}));
|
|
55
52
|
const getOrganization = extractOrganization();
|
|
56
|
-
const
|
|
57
|
-
|
|
53
|
+
const getContactRoot = findNestedElement('gmd:contactInfo', 'gmd:CI_Contact');
|
|
54
|
+
const getEmail = pipe(getContactRoot, findChildElement('gmd:electronicMailAddress'), extractCharacterString(), map((email) => (email === null ? 'missing@missing.com' : email)));
|
|
55
|
+
const getAddress = pipe(getContactRoot, findNestedElement('gmd:address', 'gmd:CI_Address'), combine(pipe(findChildElement('gmd:deliveryPoint', false), extractCharacterString()), pipe(findChildElement('gmd:city', false), extractCharacterString()), pipe(findChildElement('gmd:postalCode', false), extractCharacterString()), pipe(findChildElement('gmd:country', false), extractCharacterString())), map((parts) => parts.filter((p) => !!p).join(', ')));
|
|
56
|
+
const getPhone = pipe(getContactRoot, findNestedElement('gmd:phone', 'gmd:CI_Telephone', 'gmd:voice'), extractCharacterString());
|
|
57
|
+
return pipe(combine(getRole, getPosition, getNameParts, getOrganization, getEmail, getAddress, getPhone), map(([role, position, [firstName, lastName], organization, email, address, phone,]) => ({
|
|
58
58
|
email,
|
|
59
59
|
role,
|
|
60
60
|
organization,
|
|
61
61
|
...(position && { position }),
|
|
62
62
|
...(firstName && { firstName }),
|
|
63
63
|
...(lastName && { lastName }),
|
|
64
|
-
|
|
64
|
+
...(address && { address }),
|
|
65
|
+
...(phone && { phone }),
|
|
66
|
+
})));
|
|
65
67
|
}
|
|
66
|
-
function extractStatus() {
|
|
68
|
+
export function extractStatus() {
|
|
67
69
|
return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
|
|
68
70
|
}
|
|
69
71
|
// from gmd:resourceConstraints
|
|
70
|
-
function extractLegalConstraints() {
|
|
72
|
+
export function extractLegalConstraints() {
|
|
71
73
|
return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
|
|
72
74
|
...(url && { url }),
|
|
73
75
|
text,
|
|
74
76
|
})));
|
|
75
77
|
}
|
|
76
78
|
// from gmd:resourceConstraints
|
|
77
|
-
function extractSecurityConstraints() {
|
|
79
|
+
export function extractSecurityConstraints() {
|
|
78
80
|
return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
|
|
79
81
|
...(url && { url }),
|
|
80
82
|
text,
|
|
81
83
|
})));
|
|
82
84
|
}
|
|
83
85
|
// from gmd:resourceConstraints
|
|
84
|
-
function extractOtherConstraints() {
|
|
86
|
+
export function extractOtherConstraints() {
|
|
85
87
|
return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
|
|
86
88
|
...(url && { url }),
|
|
87
89
|
text,
|
|
88
90
|
})));
|
|
89
91
|
}
|
|
90
92
|
// from gmd:resourceConstraints
|
|
91
|
-
function extractLicenses() {
|
|
93
|
+
export function extractLicenses() {
|
|
92
94
|
return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
|
|
93
95
|
...(url && { url }),
|
|
94
96
|
text,
|
|
95
97
|
})));
|
|
96
98
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
99
|
+
const getMimeType = pipe(findParent('gmd:MD_Distribution'), findNestedElement('gmd:distributionFormat', 'gmd:MD_Format', 'gmd:name'), extractCharacterString(), map(matchMimeType));
|
|
100
|
+
/**
|
|
101
|
+
* Extract distributions from a MD_Distribution element
|
|
102
|
+
* @param getMimeTypeFn This function starts from a gmd:transferOptions element
|
|
103
|
+
*/
|
|
104
|
+
export function extractDatasetDistributions(getMimeTypeFn) {
|
|
100
105
|
const getUrl = pipe(findChildElement('gmd:linkage'), extractMandatoryUrl());
|
|
101
106
|
const getProtocolStr = pipe(findChildElement('gmd:protocol'), extractCharacterString());
|
|
102
107
|
const getProtocol = pipe(getProtocolStr, map(matchProtocol));
|
|
@@ -106,7 +111,7 @@ function extractDatasetDistributions() {
|
|
|
106
111
|
/download/i.test(protocolStr)));
|
|
107
112
|
const getName = pipe(findChildElement('gmd:name'), extractCharacterString());
|
|
108
113
|
const getDescription = pipe(findChildElement('gmd:description'), extractCharacterString());
|
|
109
|
-
return pipe(findNestedElements('gmd:transferOptions', 'gmd:MD_DigitalTransferOptions', 'gmd:onLine', 'gmd:CI_OnlineResource'), mapArray(combine(getIsService, getIsDownload, getProtocol, getUrl, getName, getDescription,
|
|
114
|
+
return pipe(findNestedElements('gmd:transferOptions', 'gmd:MD_DigitalTransferOptions', 'gmd:onLine', 'gmd:CI_OnlineResource'), mapArray(combine(getIsService, getIsDownload, getProtocol, getUrl, getName, getDescription, getMimeTypeFn)), mapArray(([isService, isDownload, protocol, url, name, description, mimeType]) => {
|
|
110
115
|
if (isService) {
|
|
111
116
|
const hasIdentifier = protocol === 'wms' || protocol === 'wfs';
|
|
112
117
|
return {
|
|
@@ -119,7 +124,6 @@ function extractDatasetDistributions() {
|
|
|
119
124
|
};
|
|
120
125
|
}
|
|
121
126
|
else if (isDownload) {
|
|
122
|
-
const mimeType = format;
|
|
123
127
|
return {
|
|
124
128
|
type: 'download',
|
|
125
129
|
url: url,
|
|
@@ -138,7 +142,7 @@ function extractDatasetDistributions() {
|
|
|
138
142
|
}
|
|
139
143
|
}));
|
|
140
144
|
}
|
|
141
|
-
function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
|
|
145
|
+
export function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
|
|
142
146
|
if (!isoPeriod)
|
|
143
147
|
return null;
|
|
144
148
|
const matches = isoPeriod.match(/^-?P(?:([0-9]+)Y)?(?:([0-9]+)M)?(?:([0-9]+)D)?T?(?:([0-9]+)H)?/);
|
|
@@ -175,7 +179,7 @@ function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
|
|
|
175
179
|
else if (days <= 7) {
|
|
176
180
|
return {
|
|
177
181
|
per: 'week',
|
|
178
|
-
updatedTimes: Math.round(7 / days),
|
|
182
|
+
updatedTimes: Math.round(7 / days - 0.0001), // this is to make sure that 'every 2 days' = '3 times per week'
|
|
179
183
|
};
|
|
180
184
|
}
|
|
181
185
|
else if (days) {
|
|
@@ -193,26 +197,21 @@ function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
|
|
|
193
197
|
return null;
|
|
194
198
|
}
|
|
195
199
|
// from gmd:MD_MaintenanceInformation
|
|
196
|
-
function extractUpdateFrequency() {
|
|
200
|
+
export function extractUpdateFrequency() {
|
|
197
201
|
return fallback(pipe(findChildElement('gmd:MD_MaintenanceFrequencyCode'), readAttribute('codeListValue'), map(getUpdateFrequencyFromFrequencyCode)), pipe(findNestedElement('gmd:userDefinedMaintenanceFrequency', 'gts:TM_PeriodDuration'), readText(), map(getUpdateFrequencyFromCustomPeriod)), map(() => 'unknown'));
|
|
198
202
|
}
|
|
199
203
|
/**
|
|
200
204
|
* Looks for srv:SV_ServiceIdentification or gmd:MD_DataIdentification element
|
|
201
|
-
*
|
|
205
|
+
* Will find the first one that exists, not reading the type of the record
|
|
206
|
+
* (this allows using this function in other similar schemas)
|
|
202
207
|
*/
|
|
203
|
-
function findIdentification() {
|
|
204
|
-
return (
|
|
205
|
-
const kind = readKind(rootEl);
|
|
206
|
-
let eltName = 'gmd:MD_DataIdentification';
|
|
207
|
-
if (kind === 'service')
|
|
208
|
-
eltName = 'srv:SV_ServiceIdentification';
|
|
209
|
-
return findNestedElement('gmd:identificationInfo', eltName)(rootEl);
|
|
210
|
-
};
|
|
208
|
+
export function findIdentification() {
|
|
209
|
+
return pipe(findChildElement('gmd:identificationInfo', false), combine(findChildElement('gmd:MD_DataIdentification', false), findChildElement('srv:SV_ServiceIdentification', false)), filterArray((el) => el !== null), getAtIndex(0));
|
|
211
210
|
}
|
|
212
|
-
function
|
|
211
|
+
export function extractIdentificationDate(type) {
|
|
213
212
|
return pipe(findIdentification(), findNestedElements('gmd:citation', 'gmd:CI_Citation', 'gmd:date'), filterArray(pipe(findNestedElements('gmd:CI_Date', 'gmd:dateType', 'gmd:CI_DateTypeCode'), getAtIndex(0), readAttribute('codeListValue'), map((value) => value === type))), getAtIndex(0), findNestedElements('gmd:CI_Date', 'gmd:date'), getAtIndex(0), extractDateTime());
|
|
214
213
|
}
|
|
215
|
-
function getSpatialRepresentationFromCode(spatialRepresentationCode) {
|
|
214
|
+
export function getSpatialRepresentationFromCode(spatialRepresentationCode) {
|
|
216
215
|
switch (spatialRepresentationCode) {
|
|
217
216
|
case 'grid':
|
|
218
217
|
case 'vector':
|
|
@@ -233,10 +232,16 @@ export function readKind(rootEl) {
|
|
|
233
232
|
export function readOwnerOrganization(rootEl) {
|
|
234
233
|
return pipe(findNestedElement('gmd:contact', 'gmd:CI_ResponsibleParty'), extractOrganization())(rootEl);
|
|
235
234
|
}
|
|
236
|
-
export function
|
|
237
|
-
return
|
|
235
|
+
export function readResourceUpdated(rootEl) {
|
|
236
|
+
return extractIdentificationDate('revision')(rootEl);
|
|
237
|
+
}
|
|
238
|
+
export function readResourceCreated(rootEl) {
|
|
239
|
+
return extractIdentificationDate('creation')(rootEl);
|
|
238
240
|
}
|
|
239
|
-
export function
|
|
241
|
+
export function readResourcePublished(rootEl) {
|
|
242
|
+
return extractIdentificationDate('publication')(rootEl);
|
|
243
|
+
}
|
|
244
|
+
export function readRecordUpdated(rootEl) {
|
|
240
245
|
return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
|
|
241
246
|
}
|
|
242
247
|
export function readTitle(rootEl) {
|
|
@@ -245,17 +250,14 @@ export function readTitle(rootEl) {
|
|
|
245
250
|
export function readAbstract(rootEl) {
|
|
246
251
|
return pipe(findIdentification(), findChildElement('gmd:abstract', false), extractCharacterString())(rootEl);
|
|
247
252
|
}
|
|
248
|
-
export function readDatasetCreated(rootEl) {
|
|
249
|
-
return extractCitationDate('creation')(rootEl);
|
|
250
|
-
}
|
|
251
|
-
export function readDatasetUpdated(rootEl) {
|
|
252
|
-
return extractCitationDate('revision')(rootEl);
|
|
253
|
-
}
|
|
254
253
|
export function readContacts(rootEl) {
|
|
255
|
-
return pipe(
|
|
254
|
+
return pipe(findChildrenElement('gmd:contact', false), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividual()))(rootEl);
|
|
255
|
+
}
|
|
256
|
+
export function readContactsForResource(rootEl) {
|
|
257
|
+
return pipe(findIdentification(), combine(findChildrenElement('gmd:contact', false), findChildrenElement('gmd:pointOfContact', false)), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividual()))(rootEl);
|
|
256
258
|
}
|
|
257
259
|
// from gmd:thesaurusName
|
|
258
|
-
function readThesaurus(rootEl) {
|
|
260
|
+
export function readThesaurus(rootEl) {
|
|
259
261
|
if (!rootEl)
|
|
260
262
|
return null;
|
|
261
263
|
const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
|
|
@@ -269,7 +271,7 @@ function readThesaurus(rootEl) {
|
|
|
269
271
|
};
|
|
270
272
|
}
|
|
271
273
|
// from gmd:MD_Keywords
|
|
272
|
-
function readKeywordGroup(rootEl) {
|
|
274
|
+
export function readKeywordGroup(rootEl) {
|
|
273
275
|
const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
|
|
274
276
|
const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
|
|
275
277
|
return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
|
|
@@ -313,17 +315,11 @@ export function readOverviews(rootEl) {
|
|
|
313
315
|
...(description && { description }),
|
|
314
316
|
})))(rootEl);
|
|
315
317
|
}
|
|
316
|
-
export function readSpatialExtents(rootEl) {
|
|
317
|
-
return []; // TODO
|
|
318
|
-
}
|
|
319
|
-
export function readTemporalExtents(rootEl) {
|
|
320
|
-
return []; // TODO
|
|
321
|
-
}
|
|
322
318
|
export function readLineage(rootEl) {
|
|
323
319
|
return pipe(findNestedElement('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), extractCharacterString())(rootEl);
|
|
324
320
|
}
|
|
325
321
|
export function readDistributions(rootEl) {
|
|
326
|
-
return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractDatasetDistributions()), flattenArray())(rootEl);
|
|
322
|
+
return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractDatasetDistributions(getMimeType)), flattenArray())(rootEl);
|
|
327
323
|
}
|
|
328
324
|
export function readUpdateFrequency(rootEl) {
|
|
329
325
|
return pipe(findIdentification(), findNestedElement('gmd:resourceMaintenance', 'gmd:MD_MaintenanceInformation'), extractUpdateFrequency(), map((updateFrequency) => updateFrequency || 'unknown'))(rootEl);
|
|
@@ -358,4 +354,4 @@ export function extractServiceOnlineResources() {
|
|
|
358
354
|
export function readOnlineResources(rootEl) {
|
|
359
355
|
return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractServiceOnlineResources()), flattenArray())(rootEl);
|
|
360
356
|
}
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1wYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL21ldGFkYXRhLWNvbnZlcnRlci9zcmMvbGliL2lzbzE5MTM5L3JlYWQtcGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ25FLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBQ3pGLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLGFBQWEsRUFDYixRQUFRLEdBRVQsTUFBTSxjQUFjLENBQUE7QUFDckIsT0FBTyxFQUVMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQzVFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRTlFLFNBQVMsc0JBQXNCO0lBQzdCLE9BQU8sSUFBSSxDQUNULFFBQVEsQ0FDTixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsRUFDOUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUN0QyxFQUNELFFBQVEsRUFBRSxDQUNYLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3RCLE9BQU8sSUFBSSxDQUNULFFBQVEsQ0FDTixnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLEVBQ3ZDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxL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c0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uc3RyYWludCxcbiAgRGF0YXNldERpc3RyaWJ1dGlvbixcbiAgRGF0YXNldFNwYXRpYWxFeHRlbnQsXG4gIERhdGFzZXRUZW1wb3JhbEV4dGVudCxcbiAgR3JhcGhpY092ZXJ2aWV3LFxuICBJbmRpdmlkdWFsLFxuICBLZXl3b3JkLFxuICBLZXl3b3JkVGhlc2F1cnVzLFxuICBPcmdhbml6YXRpb24sXG4gIFJlY29yZEtpbmQsXG4gIFJlY29yZFN0YXR1cyxcbiAgUm9sZSxcbiAgU2VydmljZU9ubGluZVJlc291cmNlLFxuICBTcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlLFxuICBVcGRhdGVGcmVxdWVuY3ksXG4gIFVwZGF0ZUZyZXF1ZW5jeUN1c3RvbSxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vZG9tYWluL3NyYy9saWIvbW9kZWwvcmVjb3JkJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzRnJvbVN0YXR1c0NvZGUgfSBmcm9tICcuL2NvZGVsaXN0cy9zdGF0dXMubWFwcGVyJ1xuaW1wb3J0IHsgZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUZyZXF1ZW5jeUNvZGUgfSBmcm9tICcuL2NvZGVsaXN0cy91cGRhdGUtZnJlcXVlbmN5Lm1hcHBlcidcbmltcG9ydCB7XG4gIGZpbmRDaGlsZEVsZW1lbnQsXG4gIGZpbmRDaGlsZHJlbkVsZW1lbnQsXG4gIGZpbmROZXN0ZWRFbGVtZW50LFxuICBmaW5kTmVzdGVkRWxlbWVudHMsXG4gIGZpbmRQYXJlbnQsXG4gIHJlYWRBdHRyaWJ1dGUsXG4gIHJlYWRUZXh0LFxuICBYbWxFbGVtZW50LFxufSBmcm9tICcuLi94bWwtdXRpbHMnXG5pbXBvcnQge1xuICBDaGFpbmFibGVGdW5jdGlvbixcbiAgY29tYmluZSxcbiAgZmFsbGJhY2ssXG4gIGZpbHRlckFycmF5LFxuICBmbGF0dGVuQXJyYXksXG4gIGdldEF0SW5kZXgsXG4gIG1hcCxcbiAgbWFwQXJyYXksXG4gIHBpcGUsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHsgZ2V0Um9sZUZyb21Sb2xlQ29kZSB9IGZyb20gJy4vY29kZWxpc3RzL3JvbGUubWFwcGVyJ1xuaW1wb3J0IHsgbWF0Y2hNaW1lVHlwZSwgbWF0Y2hQcm90b2NvbCB9IGZyb20gJy4uL2NvbW1vbi9kaXN0cmlidXRpb24ubWFwcGVyJ1xuaW1wb3J0IHsgZ2V0S2V5d29yZFR5cGVGcm9tS2V5d29yZFR5cGVDb2RlIH0gZnJvbSAnLi9jb2RlbGlzdHMva2V5d29yZC5tYXBwZXInXG5cbmZ1bmN0aW9uIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgc3RyaW5nPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZhbGxiYWNrKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ2NvOkNoYXJhY3RlclN0cmluZycsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dteDpBbmNob3InLCBmYWxzZSlcbiAgICApLFxuICAgIHJlYWRUZXh0KClcbiAgKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RGF0ZVRpbWUoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgRGF0ZT4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmYWxsYmFjayhcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpEYXRlVGltZScsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpEYXRlJywgZmFsc2UpXG4gICAgKSxcbiAgICByZWFkVGV4dCgpLFxuICAgIG1hcCgoZGF0ZVN0cikgPT4gKGRhdGVTdHIgPyBuZXcgRGF0ZShkYXRlU3RyKSA6IG51bGwpKVxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RVcmwoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgVVJMPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOlVSTCcsIGZhbHNlKSwgcmVhZFRleHQoKSlcbiAgY29uc3QgZ2V0Q2hhcmFjdGVyU3RyaW5nID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnY286Q2hhcmFjdGVyU3RyaW5nJywgZmFsc2UpLFxuICAgIHJlYWRUZXh0KClcbiAgKVxuICBjb25zdCBnZXRBbmNob3IgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dteDpBbmNob3InLCBmYWxzZSksXG4gICAgcmVhZEF0dHJpYnV0ZSgneGxpbms6aHJlZicpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmFsbGJhY2soZ2V0VXJsLCBnZXRBbmNob3IsIGdldENoYXJhY3RlclN0cmluZyksXG4gICAgbWFwKCh1cmxTdHIpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHVybFN0cilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9KVxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSB7XG4gIHJldHVybiBmYWxsYmFjayhleHRyYWN0VXJsKCksICgpID0+IG5ldyBVUkwoJ2h0dHA6Ly9taXNzaW5nJykpXG59XG5cbi8vIGZyb20gZ21kOnJvbGVcbmZ1bmN0aW9uIGV4dHJhY3RSb2xlKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFJvbGU+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRSb2xlRnJvbVJvbGVDb2RlKVxuICApXG59XG5cbi8vIGZyb20gZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHlcbmZ1bmN0aW9uIGV4dHJhY3RPcmdhbml6YXRpb24oKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgT3JnYW5pemF0aW9uPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgJ2dtZDpjb250YWN0SW5mbycsXG4gICAgICAnZ21kOkNJX0NvbnRhY3QnLFxuICAgICAgJ2dtZDpvbmxpbmVSZXNvdXJjZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJyxcbiAgICAgICdnbWQ6bGlua2FnZSdcbiAgICApLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZXh0cmFjdFVybCgpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgY29tYmluZShcbiAgICAgIHBpcGUoXG4gICAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpvcmdhbmlzYXRpb25OYW1lJywgZmFsc2UpLFxuICAgICAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgICAgICksXG4gICAgICBnZXRVcmxcbiAgICApLFxuICAgIG1hcCgoW25hbWUsIHdlYnNpdGVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIC4uLih3ZWJzaXRlICYmIHsgd2Vic2l0ZSB9KSxcbiAgICB9KSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpDSV9SZXNwb25zaWJsZVBhcnR5XG5mdW5jdGlvbiBleHRyYWN0SW5kaXZpZHVhbHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PEluZGl2aWR1YWw+XG4+IHtcbiAgY29uc3QgZ2V0Um9sZSA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOnJvbGUnKSwgZXh0cmFjdFJvbGUoKSlcbiAgY29uc3QgZ2V0UG9zaXRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpwb3NpdGlvbk5hbWUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKVxuICBjb25zdCBnZXROYW1lUGFydHMgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDppbmRpdmlkdWFsTmFtZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgICBtYXAoKGZ1bGxOYW1lKSA9PiB7XG4gICAgICBpZiAoIWZ1bGxOYW1lKSByZXR1cm4gW11cbiAgICAgIGNvbnN0IHBhcnRzID0gZnVsbE5hbWUuc3BsaXQoL1xccysvKVxuICAgICAgaWYgKCFwYXJ0cy5sZW5ndGgpIHJldHVybiBbZnVsbE5hbWUsIG51bGxdXG4gICAgICBjb25zdCBmaXJzdCA9IHBhcnRzLnNoaWZ0KClcbiAgICAgIHJldHVybiBbZmlyc3QsIHBhcnRzLmpvaW4oJyAnKV1cbiAgICB9KVxuICApXG4gIGNvbnN0IGdldE9yZ2FuaXphdGlvbiA9IGV4dHJhY3RPcmdhbml6YXRpb24oKVxuICBjb25zdCBnZXRFbWFpbCA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmVsZWN0cm9uaWNNYWlsQWRkcmVzcycpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgICBtYXAoKGVtYWlsKSA9PiAoZW1haWwgPT09IG51bGwgPyAnbWlzc2luZ0BtaXNzaW5nLmNvbScgOiBlbWFpbCkpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgY29tYmluZShcbiAgICAgIGdldFJvbGUsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldE5hbWVQYXJ0cyxcbiAgICAgIGdldE9yZ2FuaXphdGlvbixcbiAgICAgIHBpcGUoZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOmNvbnRhY3RJbmZvJyksIG1hcEFycmF5KGdldEVtYWlsKSlcbiAgICApLFxuICAgIG1hcCgoW3JvbGUsIHBvc2l0aW9uLCBbZmlyc3ROYW1lLCBsYXN0TmFtZV0sIG9yZ2FuaXphdGlvbiwgZW1haWxzXSkgPT5cbiAgICAgIGVtYWlscy5tYXAoKGVtYWlsKSA9PiAoe1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgb3JnYW5pemF0aW9uLFxuICAgICAgICAuLi4ocG9zaXRpb24gJiYgeyBwb3NpdGlvbiB9KSxcbiAgICAgICAgLi4uKGZpcnN0TmFtZSAmJiB7IGZpcnN0TmFtZSB9KSxcbiAgICAgICAgLi4uKGxhc3ROYW1lICYmIHsgbGFzdE5hbWUgfSksXG4gICAgICB9KSlcbiAgICApXG4gIClcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0YXR1cygpOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBSZWNvcmRTdGF0dXM+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX1Byb2dyZXNzQ29kZScpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSxcbiAgICBtYXAoZ2V0U3RhdHVzRnJvbVN0YXR1c0NvZGUpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZnVuY3Rpb24gZXh0cmFjdExlZ2FsQ29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnLCBmYWxzZSksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgIG1hcCgodmFsdWVzKSA9PiB2YWx1ZXMuaW5kZXhPZignbGljZW5zZScpID09PSAtMSlcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKVxuICAgICAgKVxuICAgICksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgbWFwQXJyYXkoY29tYmluZShleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksIGV4dHJhY3RVcmwoKSkpLFxuICAgIG1hcEFycmF5KChbdGV4dCwgdXJsXSkgPT4gKHtcbiAgICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gICAgICB0ZXh0LFxuICAgIH0pKVxuICApXG59XG5cbi8vIGZyb20gZ21kOnJlc291cmNlQ29uc3RyYWludHNcbmZ1bmN0aW9uIGV4dHJhY3RTZWN1cml0eUNvbnN0cmFpbnRzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBBcnJheTxDb25zdHJhaW50PlxuPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOk1EX1NlY3VyaXR5Q29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZnVuY3Rpb24gZXh0cmFjdE90aGVyQ29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6TURfQ29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZnVuY3Rpb24gZXh0cmFjdExpY2Vuc2VzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIEFycmF5PENvbnN0cmFpbnQ+PiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJywgZmFsc2UpLFxuICAgIGZpbHRlckFycmF5KFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZScpLFxuICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICBtYXAoKHZhbHVlcykgPT4gdmFsdWVzLmluZGV4T2YoJ2xpY2Vuc2UnKSA+IC0xKVxuICAgICAgKVxuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICBjb21iaW5lKFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6b3RoZXJDb25zdHJhaW50cycpLFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6dXNlTGltaXRhdGlvbicpXG4gICAgICApXG4gICAgKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6TURfRGlzdHJpYnV0aW9uXG5mdW5jdGlvbiBleHRyYWN0RGF0YXNldERpc3RyaWJ1dGlvbnMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIERhdGFzZXREaXN0cmlidXRpb25bXVxuPiB7XG4gIGNvbnN0IGdldEZvcm1hdCA9IHBpcGUoXG4gICAgZmluZFBhcmVudCgnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uRm9ybWF0JywgJ2dtZDpNRF9Gb3JtYXQnLCAnZ21kOm5hbWUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksXG4gICAgbWFwKG1hdGNoTWltZVR5cGUpXG4gIClcblxuICBjb25zdCBnZXRVcmwgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpsaW5rYWdlJyksIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSlcbiAgY29uc3QgZ2V0UHJvdG9jb2xTdHIgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpwcm90b2NvbCcpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIGNvbnN0IGdldFByb3RvY29sID0gcGlwZShnZXRQcm90b2NvbFN0ciwgbWFwKG1hdGNoUHJvdG9jb2wpKVxuICBjb25zdCBnZXRPbmxpbmVGdW5jdGlvbiA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpmdW5jdGlvbicsICdnbWQ6Q0lfT25MaW5lRnVuY3Rpb25Db2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpXG4gIClcbiAgY29uc3QgZ2V0SXNTZXJ2aWNlID0gcGlwZShcbiAgICBnZXRQcm90b2NvbCxcbiAgICBtYXAoKHByb3RvY29sKSA9PiBwcm90b2NvbCAhPT0gJ290aGVyJylcbiAgKVxuICBjb25zdCBnZXRJc0Rvd25sb2FkID0gcGlwZShcbiAgICBjb21iaW5lKGdldElzU2VydmljZSwgZ2V0T25saW5lRnVuY3Rpb24sIGdldFByb3RvY29sU3RyKSxcbiAgICBtYXAoXG4gICAgICAoW2lzU2VydmljZSwgb25saW5lRnVuY3Rpb24sIHByb3RvY29sU3RyXSkgPT5cbiAgICAgICAgKCFpc1NlcnZpY2UgJiYgb25saW5lRnVuY3Rpb24gPT09ICdkb3dubG9hZCcpIHx8XG4gICAgICAgIC9kb3dubG9hZC9pLnRlc3QocHJvdG9jb2xTdHIpXG4gICAgKVxuICApXG4gIGNvbnN0IGdldE5hbWUgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpuYW1lJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgY29uc3QgZ2V0RGVzY3JpcHRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6dHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOm9uTGluZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJ1xuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICBjb21iaW5lKFxuICAgICAgICBnZXRJc1NlcnZpY2UsXG4gICAgICAgIGdldElzRG93bmxvYWQsXG4gICAgICAgIGdldFByb3RvY29sLFxuICAgICAgICBnZXRVcmwsXG4gICAgICAgIGdldE5hbWUsXG4gICAgICAgIGdldERlc2NyaXB0aW9uLFxuICAgICAgICBnZXRGb3JtYXRcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgKFtpc1NlcnZpY2UsIGlzRG93bmxvYWQsIHByb3RvY29sLCB1cmwsIG5hbWUsIGRlc2NyaXB0aW9uLCBmb3JtYXRdKSA9PiB7XG4gICAgICAgIGlmIChpc1NlcnZpY2UpIHtcbiAgICAgICAgICBjb25zdCBoYXNJZGVudGlmaWVyID0gcHJvdG9jb2wgPT09ICd3bXMnIHx8IHByb3RvY29sID09PSAnd2ZzJ1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnc2VydmljZScsXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIGFjY2Vzc1NlcnZpY2VQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICAgICAgICAuLi4obmFtZSAmJiBoYXNJZGVudGlmaWVyICYmIHsgaWRlbnRpZmllckluU2VydmljZTogbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0Rvd25sb2FkKSB7XG4gICAgICAgICAgY29uc3QgbWltZVR5cGUgPSBmb3JtYXRcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2Rvd25sb2FkJyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICAuLi4obWltZVR5cGUgJiYgeyBtaW1lVHlwZSB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21DdXN0b21QZXJpb2QoXG4gIGlzb1BlcmlvZDogc3RyaW5nXG4pOiBVcGRhdGVGcmVxdWVuY3lDdXN0b20ge1xuICBpZiAoIWlzb1BlcmlvZCkgcmV0dXJuIG51bGxcbiAgY29uc3QgbWF0Y2hlcyA9IGlzb1BlcmlvZC5tYXRjaChcbiAgICAvXi0/UCg/OihbMC05XSspWSk/KD86KFswLTldKylNKT8oPzooWzAtOV0rKUQpP1Q/KD86KFswLTldKylIKT8vXG4gIClcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gbnVsbFxuICBjb25zdCB5ZWFycyA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSB8fCAwXG4gIGNvbnN0IG1vbnRocyA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKSB8fCAwXG4gIGNvbnN0IGRheXMgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCkgfHwgMFxuICBjb25zdCBob3VycyA9IHBhcnNlSW50KG1hdGNoZXNbNF0sIDEwKSB8fCAwXG4gIGlmICh5ZWFycykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICd5ZWFyJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogMSxcbiAgICB9XG4gIH0gZWxzZSBpZiAobW9udGhzID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ21vbnRoJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogMSxcbiAgICB9XG4gIH0gZWxzZSBpZiAobW9udGhzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ3llYXInLFxuICAgICAgdXBkYXRlZFRpbWVzOiBNYXRoLnJvdW5kKDEyIC8gbW9udGhzKSxcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGF5cyA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICdkYXknLFxuICAgICAgdXBkYXRlZFRpbWVzOiAxLFxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXlzIDw9IDcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAnd2VlaycsXG4gICAgICB1cGRhdGVkVGltZXM6IE1hdGgucm91bmQoNyAvIGRheXMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXlzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ21vbnRoJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogTWF0aC5yb3VuZCgzMCAvIGRheXMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChob3Vycykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICdkYXknLFxuICAgICAgdXBkYXRlZFRpbWVzOiBNYXRoLnJvdW5kKDI0IC8gZGF5cyksXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8vIGZyb20gZ21kOk1EX01haW50ZW5hbmNlSW5mb3JtYXRpb25cbmZ1bmN0aW9uIGV4dHJhY3RVcGRhdGVGcmVxdWVuY3koKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIFVwZGF0ZUZyZXF1ZW5jeVxuPiB7XG4gIHJldHVybiBmYWxsYmFjayhcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX01haW50ZW5hbmNlRnJlcXVlbmN5Q29kZScpLFxuICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgbWFwKGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21GcmVxdWVuY3lDb2RlKVxuICAgICksXG4gICAgcGlwZShcbiAgICAgIGZpbmROZXN0ZWRFbGVtZW50KFxuICAgICAgICAnZ21kOnVzZXJEZWZpbmVkTWFpbnRlbmFuY2VGcmVxdWVuY3knLFxuICAgICAgICAnZ3RzOlRNX1BlcmlvZER1cmF0aW9uJ1xuICAgICAgKSxcbiAgICAgIHJlYWRUZXh0KCksXG4gICAgICBtYXAoZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUN1c3RvbVBlcmlvZClcbiAgICApLFxuICAgIG1hcCgoKSA9PiAndW5rbm93bicpXG4gIClcbn1cblxuLyoqXG4gKiBMb29rcyBmb3Igc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbiBvciBnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uIGVsZW1lbnRcbiAqIGRlcGVuZGluZyBvbiByZWNvcmQgdHlwZVxuICovXG5mdW5jdGlvbiBmaW5kSWRlbnRpZmljYXRpb24oKSB7XG4gIHJldHVybiAocm9vdEVsOiBYbWxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgICBsZXQgZWx0TmFtZSA9ICdnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uJ1xuICAgIGlmIChraW5kID09PSAnc2VydmljZScpIGVsdE5hbWUgPSAnc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbidcbiAgICByZXR1cm4gZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDppZGVudGlmaWNhdGlvbkluZm8nLCBlbHROYW1lKShyb290RWwpXG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdENpdGF0aW9uRGF0ZSh0eXBlOiAnY3JlYXRpb24nIHwgJ3JldmlzaW9uJyB8ICdwdWJsaWNhdGlvbicpIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6Y2l0YXRpb24nLCAnZ21kOkNJX0NpdGF0aW9uJywgJ2dtZDpkYXRlJyksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAgICAgJ2dtZDpDSV9EYXRlJyxcbiAgICAgICAgICAnZ21kOmRhdGVUeXBlJyxcbiAgICAgICAgICAnZ21kOkNJX0RhdGVUeXBlQ29kZSdcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0QXRJbmRleCgwKSxcbiAgICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHlwZSlcbiAgICAgIClcbiAgICApLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6Q0lfRGF0ZScsICdnbWQ6ZGF0ZScpLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZXh0cmFjdERhdGVUaW1lKClcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRTcGF0aWFsUmVwcmVzZW50YXRpb25Gcm9tQ29kZShcbiAgc3BhdGlhbFJlcHJlc2VudGF0aW9uQ29kZTogc3RyaW5nXG4pOiBTcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlIHwgbnVsbCB7XG4gIHN3aXRjaCAoc3BhdGlhbFJlcHJlc2VudGF0aW9uQ29kZSkge1xuICAgIGNhc2UgJ2dyaWQnOlxuICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgY2FzZSAndGluJzpcbiAgICBjYXNlICd0YWJsZSc6XG4gICAgY2FzZSAncG9pbnQnOlxuICAgICAgcmV0dXJuIHNwYXRpYWxSZXByZXNlbnRhdGlvbkNvZGVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFVuaXF1ZUlkZW50aWZpZXIocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVJZGVudGlmaWVyJywgZmFsc2UpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLaW5kKHJvb3RFbDogWG1sRWxlbWVudCk6IFJlY29yZEtpbmQge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmhpZXJhcmNoeUxldmVsJywgJ2dtZDpNRF9TY29wZUNvZGUnKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgbWFwKFxuICAgICAgKHNjb3BlQ29kZSk6IFJlY29yZEtpbmQgPT5cbiAgICAgICAgc2NvcGVDb2RlID09PSAnc2VydmljZScgPyAnc2VydmljZScgOiAnZGF0YXNldCdcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE93bmVyT3JnYW5pemF0aW9uKHJvb3RFbDogWG1sRWxlbWVudCk6IE9yZ2FuaXphdGlvbiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6Y29udGFjdCcsICdnbWQ6Q0lfUmVzcG9uc2libGVQYXJ0eScpLFxuICAgIGV4dHJhY3RPcmdhbml6YXRpb24oKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZWNvcmRVcGRhdGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGF0ZVN0YW1wJyksIGV4dHJhY3REYXRlVGltZSgpKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVjb3JkUHVibGlzaGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGF0ZVN0YW1wJyksIGV4dHJhY3REYXRlVGltZSgpKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVGl0bGUocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFic3RyYWN0KHJvb3RFbDogWG1sRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDphYnN0cmFjdCcsIGZhbHNlKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0YXNldENyZWF0ZWQocm9vdEVsOiBYbWxFbGVtZW50KTogRGF0ZSB7XG4gIHJldHVybiBleHRyYWN0Q2l0YXRpb25EYXRlKCdjcmVhdGlvbicpKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREYXRhc2V0VXBkYXRlZChyb290RWw6IFhtbEVsZW1lbnQpOiBEYXRlIHtcbiAgcmV0dXJuIGV4dHJhY3RDaXRhdGlvbkRhdGUoJ3JldmlzaW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRhY3RzKHJvb3RFbDogWG1sRWxlbWVudCk6IEluZGl2aWR1YWxbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGNvbWJpbmUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6Y29udGFjdCcpLFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JylcbiAgICApLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIG1hcEFycmF5KGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpDSV9SZXNwb25zaWJsZVBhcnR5JywgZmFsc2UpKSxcbiAgICBtYXBBcnJheShleHRyYWN0SW5kaXZpZHVhbHMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbi8vIGZyb20gZ21kOnRoZXNhdXJ1c05hbWVcbmZ1bmN0aW9uIHJlYWRUaGVzYXVydXMocm9vdEVsOiBYbWxFbGVtZW50KTogS2V5d29yZFRoZXNhdXJ1cyB7XG4gIGlmICghcm9vdEVsKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGZpbmRJZGVudGlmaWVyID0gZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgJ2dtZDpDSV9DaXRhdGlvbicsXG4gICAgJ2dtZDppZGVudGlmaWVyJyxcbiAgICAnZ21kOk1EX0lkZW50aWZpZXInLFxuICAgICdnbWQ6Y29kZSdcbiAgKVxuICBjb25zdCBpZCA9IHBpcGUoZmluZElkZW50aWZpZXIsIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSkocm9vdEVsKVxuICBjb25zdCB1cmwgPSBwaXBlKGZpbmRJZGVudGlmaWVyLCBleHRyYWN0VXJsKCkpKHJvb3RFbClcbiAgY29uc3QgbmFtZSA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpDSV9DaXRhdGlvbicsICdnbWQ6dGl0bGUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gIH1cbn1cblxuLy8gZnJvbSBnbWQ6TURfS2V5d29yZHNcbmZ1bmN0aW9uIHJlYWRLZXl3b3JkR3JvdXAocm9vdEVsOiBYbWxFbGVtZW50KTogS2V5d29yZFtdIHtcbiAgY29uc3QgdHlwZSA9IHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX0tleXdvcmRUeXBlQ29kZScpLFxuICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgbWFwKCh2YWx1ZXMpID0+IGdldEtleXdvcmRUeXBlRnJvbUtleXdvcmRUeXBlQ29kZSh2YWx1ZXNbMF0pKVxuICApKHJvb3RFbClcbiAgY29uc3QgdGhlc2F1cnVzID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOnRoZXNhdXJ1c05hbWUnKSxcbiAgICByZWFkVGhlc2F1cnVzXG4gICkocm9vdEVsKVxuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6a2V5d29yZCcpLFxuICAgIG1hcEFycmF5KChlbCkgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkoZWwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4odGhlc2F1cnVzID8geyB0aGVzYXVydXMgfSA6IHt9KSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHR5cGUsXG4gICAgICB9IGFzIEtleXdvcmRcbiAgICB9KVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLZXl3b3Jkcyhyb290RWw6IFhtbEVsZW1lbnQpOiBLZXl3b3JkW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpkZXNjcmlwdGl2ZUtleXdvcmRzJywgJ2dtZDpNRF9LZXl3b3JkcycpLFxuICAgIG1hcEFycmF5KHJlYWRLZXl3b3JkR3JvdXApLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0YXR1cyhyb290RWw6IFhtbEVsZW1lbnQpOiBSZWNvcmRTdGF0dXMge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6c3RhdHVzJywgZmFsc2UpLFxuICAgIGV4dHJhY3RTdGF0dXMoKVxuICApKHJvb3RFbClcbn1cblxuY29uc3QgZ2V0Q29uc3RyYWludHMgPSBwaXBlKFxuICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnLCBmYWxzZSlcbilcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRMZWdhbENvbnN0cmFpbnRzKHJvb3RFbDogWG1sRWxlbWVudCk6IENvbnN0cmFpbnRbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGdldENvbnN0cmFpbnRzLFxuICAgIG1hcEFycmF5KGV4dHJhY3RMZWdhbENvbnN0cmFpbnRzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNlY3VyaXR5Q29uc3RyYWludHMocm9vdEVsOiBYbWxFbGVtZW50KTogQ29uc3RyYWludFtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZ2V0Q29uc3RyYWludHMsXG4gICAgbWFwQXJyYXkoZXh0cmFjdFNlY3VyaXR5Q29uc3RyYWludHMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3RoZXJDb25zdHJhaW50cyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0T3RoZXJDb25zdHJhaW50cygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRMaWNlbnNlcyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0TGljZW5zZXMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbi8vIG5vdCB1c2VkIHlldFxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRJc29Ub3BpY3Mocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfVG9waWNDYXRlZ29yeUNvZGUnLCB0cnVlKSxcbiAgICBtYXBBcnJheShyZWFkVGV4dCgpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTcGF0aWFsUmVwcmVzZW50YXRpb24oXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKTogU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZSB8IG51bGwge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6c3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZScsXG4gICAgICAnZ21kOk1EX1NwYXRpYWxSZXByZXNlbnRhdGlvblR5cGVDb2RlJ1xuICAgICksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRTcGF0aWFsUmVwcmVzZW50YXRpb25Gcm9tQ29kZSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3ZlcnZpZXdzKHJvb3RFbDogWG1sRWxlbWVudCk6IEdyYXBoaWNPdmVydmlld1tdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOmdyYXBoaWNPdmVydmlldycsIGZhbHNlKSxcbiAgICBtYXBBcnJheShcbiAgICAgIGNvbWJpbmUoXG4gICAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVOYW1lJyksIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSksXG4gICAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVEZXNjcmlwdGlvbicpLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpXG4gICAgICApXG4gICAgKSxcbiAgICBtYXBBcnJheSgoW3VybCwgZGVzY3JpcHRpb25dKSA9PiAoe1xuICAgICAgdXJsLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgfSkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNwYXRpYWxFeHRlbnRzKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGFzZXRTcGF0aWFsRXh0ZW50W10ge1xuICByZXR1cm4gW10gLy8gVE9ET1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFRlbXBvcmFsRXh0ZW50cyhcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pOiBEYXRhc2V0VGVtcG9yYWxFeHRlbnRbXSB7XG4gIHJldHVybiBbXSAvLyBUT0RPXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkTGluZWFnZShyb290RWw6IFhtbEVsZW1lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6ZGF0YVF1YWxpdHlJbmZvJyxcbiAgICAgICdnbWQ6RFFfRGF0YVF1YWxpdHknLFxuICAgICAgJ2dtZDpsaW5lYWdlJyxcbiAgICAgICdnbWQ6TElfTGluZWFnZScsXG4gICAgICAnZ21kOnN0YXRlbWVudCdcbiAgICApLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREaXN0cmlidXRpb25zKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGFzZXREaXN0cmlidXRpb25bXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIG1hcEFycmF5KGV4dHJhY3REYXRhc2V0RGlzdHJpYnV0aW9ucygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVcGRhdGVGcmVxdWVuY3kocm9vdEVsOiBYbWxFbGVtZW50KTogVXBkYXRlRnJlcXVlbmN5IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAnZ21kOnJlc291cmNlTWFpbnRlbmFuY2UnLFxuICAgICAgJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJ1xuICAgICksXG4gICAgZXh0cmFjdFVwZGF0ZUZyZXF1ZW5jeSgpLFxuICAgIG1hcCgodXBkYXRlRnJlcXVlbmN5KSA9PiB1cGRhdGVGcmVxdWVuY3kgfHwgJ3Vua25vd24nKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTZXJ2aWNlT25saW5lUmVzb3VyY2VzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBTZXJ2aWNlT25saW5lUmVzb3VyY2VbXVxuPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmxpbmthZ2UnKSwgZXh0cmFjdE1hbmRhdG9yeVVybCgpKVxuICBjb25zdCBnZXRQcm90b2NvbFN0ciA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOnByb3RvY29sJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gIClcbiAgY29uc3QgZ2V0UHJvdG9jb2wgPSBwaXBlKGdldFByb3RvY29sU3RyLCBtYXAobWF0Y2hQcm90b2NvbCkpXG4gIGNvbnN0IGdldE9ubGluZUZ1bmN0aW9uID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmZ1bmN0aW9uJywgJ2dtZDpDSV9PbkxpbmVGdW5jdGlvbkNvZGUnKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJylcbiAgKVxuICBjb25zdCBnZXRJc0xpbmsgPSBwaXBlKFxuICAgIGdldE9ubGluZUZ1bmN0aW9uLFxuICAgIG1hcCgob25saW5lRnVuY3Rpb24pID0+IG9ubGluZUZ1bmN0aW9uID09PSAnaW5mb3JtYXRpb24nKVxuICApXG4gIGNvbnN0IGdldE5hbWUgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpuYW1lJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgY29uc3QgZ2V0RGVzY3JpcHRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6dHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOm9uTGluZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJ1xuICAgICksXG4gICAgbWFwQXJyYXkoY29tYmluZShnZXRJc0xpbmssIGdldFByb3RvY29sLCBnZXRVcmwsIGdldE5hbWUsIGdldERlc2NyaXB0aW9uKSksXG4gICAgbWFwQXJyYXkoKFtpc0xpbmssIHByb3RvY29sLCB1cmwsIG5hbWUsIGRlc2NyaXB0aW9uXSkgPT4ge1xuICAgICAgaWYgKGlzTGluaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ2VuZHBvaW50JyxcbiAgICAgICAgICBlbmRwb2ludFVybDogdXJsLFxuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE9ubGluZVJlc291cmNlcyhcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pOiBTZXJ2aWNlT25saW5lUmVzb3VyY2VbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIG1hcEFycmF5KGV4dHJhY3RTZXJ2aWNlT25saW5lUmVzb3VyY2VzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuIl19
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1wYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL21ldGFkYXRhLWNvbnZlcnRlci9zcmMvbGliL2lzbzE5MTM5L3JlYWQtcGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQy9ELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3JGLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLGFBQWEsRUFDYixRQUFRLEdBRVQsTUFBTSxjQUFjLENBQUE7QUFDckIsT0FBTyxFQUVMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQzVFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUV6RCxNQUFNLFVBQVUsc0JBQXNCO0lBSXBDLE9BQU8sSUFBSSxDQUNULFFBQVEsQ0FDTixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsRUFDOUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUN0QyxFQUNELFFBQVEsRUFBRSxDQUNYLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxJQUFJLENBQ1QsUUFBUSxDQUNOLGdCQUFnQixD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QVksRUFDWix1QkFBdUIsQ0FDeEIsRUFDRCxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUMxRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFO1FBQ3RELElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTTtnQkFDWixHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQzthQUNwQyxDQUFBO1NBQ0Y7YUFBTTtZQUNMLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFdBQVcsRUFBRSxHQUFHO2dCQUNoQixRQUFRO2dCQUNSLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQzthQUNwQyxDQUFBO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBa0I7SUFFbEIsT0FBTyxJQUFJLENBQ1Qsa0JBQWtCLENBQUMsc0JBQXNCLEVBQUUscUJBQXFCLENBQUMsRUFDakUsUUFBUSxDQUFDLDZCQUE2QixFQUFFLENBQUMsRUFDekMsWUFBWSxFQUFFLENBQ2YsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25zdHJhaW50LFxuICBEYXRhc2V0RGlzdHJpYnV0aW9uLFxuICBHcmFwaGljT3ZlcnZpZXcsXG4gIEluZGl2aWR1YWwsXG4gIEtleXdvcmQsXG4gIEtleXdvcmRUaGVzYXVydXMsXG4gIE9yZ2FuaXphdGlvbixcbiAgUmVjb3JkS2luZCxcbiAgUmVjb3JkU3RhdHVzLFxuICBSb2xlLFxuICBTZXJ2aWNlT25saW5lUmVzb3VyY2UsXG4gIFNwYXRpYWxSZXByZXNlbnRhdGlvblR5cGUsXG4gIFVwZGF0ZUZyZXF1ZW5jeSxcbiAgVXBkYXRlRnJlcXVlbmN5Q3VzdG9tLFxufSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5pbXBvcnQgeyBnZXRTdGF0dXNGcm9tU3RhdHVzQ29kZSB9IGZyb20gJy4vdXRpbHMvc3RhdHVzLm1hcHBlcidcbmltcG9ydCB7IGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21GcmVxdWVuY3lDb2RlIH0gZnJvbSAnLi91dGlscy91cGRhdGUtZnJlcXVlbmN5Lm1hcHBlcidcbmltcG9ydCB7XG4gIGZpbmRDaGlsZEVsZW1lbnQsXG4gIGZpbmRDaGlsZHJlbkVsZW1lbnQsXG4gIGZpbmROZXN0ZWRFbGVtZW50LFxuICBmaW5kTmVzdGVkRWxlbWVudHMsXG4gIGZpbmRQYXJlbnQsXG4gIHJlYWRBdHRyaWJ1dGUsXG4gIHJlYWRUZXh0LFxuICBYbWxFbGVtZW50LFxufSBmcm9tICcuLi94bWwtdXRpbHMnXG5pbXBvcnQge1xuICBDaGFpbmFibGVGdW5jdGlvbixcbiAgY29tYmluZSxcbiAgZmFsbGJhY2ssXG4gIGZpbHRlckFycmF5LFxuICBmbGF0dGVuQXJyYXksXG4gIGdldEF0SW5kZXgsXG4gIG1hcCxcbiAgbWFwQXJyYXksXG4gIHBpcGUsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHsgZ2V0Um9sZUZyb21Sb2xlQ29kZSB9IGZyb20gJy4vdXRpbHMvcm9sZS5tYXBwZXInXG5pbXBvcnQgeyBtYXRjaE1pbWVUeXBlLCBtYXRjaFByb3RvY29sIH0gZnJvbSAnLi4vY29tbW9uL2Rpc3RyaWJ1dGlvbi5tYXBwZXInXG5pbXBvcnQgeyBnZXRLZXl3b3JkVHlwZUZyb21LZXl3b3JkVHlwZUNvZGUgfSBmcm9tICcuL3V0aWxzL2tleXdvcmQubWFwcGVyJ1xuaW1wb3J0IHsgZnVsbE5hbWVUb1BhcnRzIH0gZnJvbSAnLi91dGlscy9pbmRpdmlkdWFsLW5hbWUnXG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBzdHJpbmdcbj4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmYWxsYmFjayhcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpDaGFyYWN0ZXJTdHJpbmcnLCBmYWxzZSksXG4gICAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbXg6QW5jaG9yJywgZmFsc2UpXG4gICAgKSxcbiAgICByZWFkVGV4dCgpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REYXRlVGltZSgpOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBEYXRlPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZhbGxiYWNrKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ2NvOkRhdGVUaW1lJywgZmFsc2UpLFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ2NvOkRhdGUnLCBmYWxzZSlcbiAgICApLFxuICAgIHJlYWRUZXh0KCksXG4gICAgbWFwKChkYXRlU3RyKSA9PiAoZGF0ZVN0ciA/IG5ldyBEYXRlKGRhdGVTdHIpIDogbnVsbCkpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVcmwoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgVVJMPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOlVSTCcsIGZhbHNlKSwgcmVhZFRleHQoKSlcbiAgY29uc3QgZ2V0Q2hhcmFjdGVyU3RyaW5nID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnY286Q2hhcmFjdGVyU3RyaW5nJywgZmFsc2UpLFxuICAgIHJlYWRUZXh0KClcbiAgKVxuICBjb25zdCBnZXRBbmNob3IgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dteDpBbmNob3InLCBmYWxzZSksXG4gICAgcmVhZEF0dHJpYnV0ZSgneGxpbms6aHJlZicpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmFsbGJhY2soZ2V0VXJsLCBnZXRBbmNob3IsIGdldENoYXJhY3RlclN0cmluZyksXG4gICAgbWFwKCh1cmxTdHIpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHVybFN0cilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFuZGF0b3J5VXJsKCkge1xuICByZXR1cm4gZmFsbGJhY2soZXh0cmFjdFVybCgpLCAoKSA9PiBuZXcgVVJMKCdodHRwOi8vbWlzc2luZycpKVxufVxuXG4vLyBmcm9tIGdtZDpyb2xlXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJvbGUoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgUm9sZT4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6Q0lfUm9sZUNvZGUnKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgbWFwKGdldFJvbGVGcm9tUm9sZUNvZGUpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6Q0lfUmVzcG9uc2libGVQYXJ0eVxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RPcmdhbml6YXRpb24oKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIE9yZ2FuaXphdGlvblxuPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgJ2dtZDpjb250YWN0SW5mbycsXG4gICAgICAnZ21kOkNJX0NvbnRhY3QnLFxuICAgICAgJ2dtZDpvbmxpbmVSZXNvdXJjZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJyxcbiAgICAgICdnbWQ6bGlua2FnZSdcbiAgICApLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZXh0cmFjdFVybCgpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgY29tYmluZShcbiAgICAgIHBpcGUoXG4gICAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpvcmdhbmlzYXRpb25OYW1lJywgZmFsc2UpLFxuICAgICAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgICAgICksXG4gICAgICBnZXRVcmxcbiAgICApLFxuICAgIG1hcCgoW25hbWUsIHdlYnNpdGVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIC4uLih3ZWJzaXRlICYmIHsgd2Vic2l0ZSB9KSxcbiAgICB9KSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpDSV9SZXNwb25zaWJsZVBhcnR5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEluZGl2aWR1YWwoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgSW5kaXZpZHVhbD4ge1xuICBjb25zdCBnZXRSb2xlID0gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6cm9sZScpLCBleHRyYWN0Um9sZSgpKVxuICBjb25zdCBnZXRQb3NpdGlvbiA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOnBvc2l0aW9uTmFtZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIGNvbnN0IGdldE5hbWVQYXJ0cyA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmluZGl2aWR1YWxOYW1lJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpLFxuICAgIG1hcCgoZnVsbE5hbWUpID0+IHtcbiAgICAgIGlmICghZnVsbE5hbWUpIHJldHVybiBbXVxuICAgICAgcmV0dXJuIGZ1bGxOYW1lVG9QYXJ0cyhmdWxsTmFtZSlcbiAgICB9KVxuICApXG4gIGNvbnN0IGdldE9yZ2FuaXphdGlvbiA9IGV4dHJhY3RPcmdhbml6YXRpb24oKVxuICBjb25zdCBnZXRDb250YWN0Um9vdCA9IGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6Y29udGFjdEluZm8nLCAnZ21kOkNJX0NvbnRhY3QnKVxuICBjb25zdCBnZXRFbWFpbCA9IHBpcGUoXG4gICAgZ2V0Q29udGFjdFJvb3QsXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmVsZWN0cm9uaWNNYWlsQWRkcmVzcycpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgICBtYXAoKGVtYWlsKSA9PiAoZW1haWwgPT09IG51bGwgPyAnbWlzc2luZ0BtaXNzaW5nLmNvbScgOiBlbWFpbCkpXG4gIClcbiAgY29uc3QgZ2V0QWRkcmVzcyA9IHBpcGUoXG4gICAgZ2V0Q29udGFjdFJvb3QsXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDphZGRyZXNzJywgJ2dtZDpDSV9BZGRyZXNzJyksXG4gICAgY29tYmluZShcbiAgICAgIHBpcGUoXG4gICAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZWxpdmVyeVBvaW50JywgZmFsc2UpLFxuICAgICAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgICAgICksXG4gICAgICBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpjaXR5JywgZmFsc2UpLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpLFxuICAgICAgcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6cG9zdGFsQ29kZScsIGZhbHNlKSwgZXh0cmFjdENoYXJhY3RlclN0cmluZygpKSxcbiAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmNvdW50cnknLCBmYWxzZSksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgICApLFxuICAgIG1hcCgocGFydHMpID0+IHBhcnRzLmZpbHRlcigocCkgPT4gISFwKS5qb2luKCcsICcpKVxuICApXG4gIGNvbnN0IGdldFBob25lID0gcGlwZShcbiAgICBnZXRDb250YWN0Um9vdCxcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOnBob25lJywgJ2dtZDpDSV9UZWxlcGhvbmUnLCAnZ21kOnZvaWNlJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgY29tYmluZShcbiAgICAgIGdldFJvbGUsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldE5hbWVQYXJ0cyxcbiAgICAgIGdldE9yZ2FuaXphdGlvbixcbiAgICAgIGdldEVtYWlsLFxuICAgICAgZ2V0QWRkcmVzcyxcbiAgICAgIGdldFBob25lXG4gICAgKSxcbiAgICBtYXAoXG4gICAgICAoW1xuICAgICAgICByb2xlLFxuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgW2ZpcnN0TmFtZSwgbGFzdE5hbWVdLFxuICAgICAgICBvcmdhbml6YXRpb24sXG4gICAgICAgIGVtYWlsLFxuICAgICAgICBhZGRyZXNzLFxuICAgICAgICBwaG9uZSxcbiAgICAgIF0pID0+ICh7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICByb2xlLFxuICAgICAgICBvcmdhbml6YXRpb24sXG4gICAgICAgIC4uLihwb3NpdGlvbiAmJiB7IHBvc2l0aW9uIH0pLFxuICAgICAgICAuLi4oZmlyc3ROYW1lICYmIHsgZmlyc3ROYW1lIH0pLFxuICAgICAgICAuLi4obGFzdE5hbWUgJiYgeyBsYXN0TmFtZSB9KSxcbiAgICAgICAgLi4uKGFkZHJlc3MgJiYgeyBhZGRyZXNzIH0pLFxuICAgICAgICAuLi4ocGhvbmUgJiYgeyBwaG9uZSB9KSxcbiAgICAgIH0pXG4gICAgKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U3RhdHVzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFJlY29yZFN0YXR1cz4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6TURfUHJvZ3Jlc3NDb2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRTdGF0dXNGcm9tU3RhdHVzQ29kZSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpyZXNvdXJjZUNvbnN0cmFpbnRzXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExlZ2FsQ29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnLCBmYWxzZSksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgIG1hcCgodmFsdWVzKSA9PiB2YWx1ZXMuaW5kZXhPZignbGljZW5zZScpID09PSAtMSlcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKVxuICAgICAgKVxuICAgICksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgbWFwQXJyYXkoY29tYmluZShleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksIGV4dHJhY3RVcmwoKSkpLFxuICAgIG1hcEFycmF5KChbdGV4dCwgdXJsXSkgPT4gKHtcbiAgICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gICAgICB0ZXh0LFxuICAgIH0pKVxuICApXG59XG5cbi8vIGZyb20gZ21kOnJlc291cmNlQ29uc3RyYWludHNcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U2VjdXJpdHlDb25zdHJhaW50cygpOiBDaGFpbmFibGVGdW5jdGlvbjxcbiAgWG1sRWxlbWVudCxcbiAgQXJyYXk8Q29uc3RyYWludD5cbj4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpNRF9TZWN1cml0eUNvbnN0cmFpbnRzJywgJ2dtZDp1c2VMaW1pdGF0aW9uJyksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgbWFwQXJyYXkoY29tYmluZShleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksIGV4dHJhY3RVcmwoKSkpLFxuICAgIG1hcEFycmF5KChbdGV4dCwgdXJsXSkgPT4gKHtcbiAgICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gICAgICB0ZXh0LFxuICAgIH0pKVxuICApXG59XG5cbi8vIGZyb20gZ21kOnJlc291cmNlQ29uc3RyYWludHNcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0T3RoZXJDb25zdHJhaW50cygpOiBDaGFpbmFibGVGdW5jdGlvbjxcbiAgWG1sRWxlbWVudCxcbiAgQXJyYXk8Q29uc3RyYWludD5cbj4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpNRF9Db25zdHJhaW50cycsICdnbWQ6dXNlTGltaXRhdGlvbicpLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIG1hcEFycmF5KGNvbWJpbmUoZXh0cmFjdENoYXJhY3RlclN0cmluZygpLCBleHRyYWN0VXJsKCkpKSxcbiAgICBtYXBBcnJheSgoW3RleHQsIHVybF0pID0+ICh7XG4gICAgICAuLi4odXJsICYmIHsgdXJsIH0pLFxuICAgICAgdGV4dCxcbiAgICB9KSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpyZXNvdXJjZUNvbnN0cmFpbnRzXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpY2Vuc2VzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBBcnJheTxDb25zdHJhaW50PlxuPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJywgZmFsc2UpLFxuICAgIGZpbHRlckFycmF5KFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZScpLFxuICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICBtYXAoKHZhbHVlcykgPT4gdmFsdWVzLmluZGV4T2YoJ2xpY2Vuc2UnKSA+IC0xKVxuICAgICAgKVxuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICBjb21iaW5lKFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6b3RoZXJDb25zdHJhaW50cycpLFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6dXNlTGltaXRhdGlvbicpXG4gICAgICApXG4gICAgKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuY29uc3QgZ2V0TWltZVR5cGUgPSBwaXBlKFxuICBmaW5kUGFyZW50KCdnbWQ6TURfRGlzdHJpYnV0aW9uJyksXG4gIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uRm9ybWF0JywgJ2dtZDpNRF9Gb3JtYXQnLCAnZ21kOm5hbWUnKSxcbiAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpLFxuICBtYXAobWF0Y2hNaW1lVHlwZSlcbilcblxuLyoqXG4gKiBFeHRyYWN0IGRpc3RyaWJ1dGlvbnMgZnJvbSBhIE1EX0Rpc3RyaWJ1dGlvbiBlbGVtZW50XG4gKiBAcGFyYW0gZ2V0TWltZVR5cGVGbiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBmcm9tIGEgZ21kOnRyYW5zZmVyT3B0aW9ucyBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGF0YXNldERpc3RyaWJ1dGlvbnMoXG4gIGdldE1pbWVUeXBlRm46IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIHN0cmluZz5cbik6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIERhdGFzZXREaXN0cmlidXRpb25bXT4ge1xuICBjb25zdCBnZXRVcmwgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpsaW5rYWdlJyksIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSlcbiAgY29uc3QgZ2V0UHJvdG9jb2xTdHIgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpwcm90b2NvbCcpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIGNvbnN0IGdldFByb3RvY29sID0gcGlwZShnZXRQcm90b2NvbFN0ciwgbWFwKG1hdGNoUHJvdG9jb2wpKVxuICBjb25zdCBnZXRPbmxpbmVGdW5jdGlvbiA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpmdW5jdGlvbicsICdnbWQ6Q0lfT25MaW5lRnVuY3Rpb25Db2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpXG4gIClcbiAgY29uc3QgZ2V0SXNTZXJ2aWNlID0gcGlwZShcbiAgICBnZXRQcm90b2NvbCxcbiAgICBtYXAoKHByb3RvY29sKSA9PiBwcm90b2NvbCAhPT0gJ290aGVyJylcbiAgKVxuICBjb25zdCBnZXRJc0Rvd25sb2FkID0gcGlwZShcbiAgICBjb21iaW5lKGdldElzU2VydmljZSwgZ2V0T25saW5lRnVuY3Rpb24sIGdldFByb3RvY29sU3RyKSxcbiAgICBtYXAoXG4gICAgICAoW2lzU2VydmljZSwgb25saW5lRnVuY3Rpb24sIHByb3RvY29sU3RyXSkgPT5cbiAgICAgICAgKCFpc1NlcnZpY2UgJiYgb25saW5lRnVuY3Rpb24gPT09ICdkb3dubG9hZCcpIHx8XG4gICAgICAgIC9kb3dubG9hZC9pLnRlc3QocHJvdG9jb2xTdHIpXG4gICAgKVxuICApXG4gIGNvbnN0IGdldE5hbWUgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpuYW1lJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgY29uc3QgZ2V0RGVzY3JpcHRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6dHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOm9uTGluZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJ1xuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICBjb21iaW5lKFxuICAgICAgICBnZXRJc1NlcnZpY2UsXG4gICAgICAgIGdldElzRG93bmxvYWQsXG4gICAgICAgIGdldFByb3RvY29sLFxuICAgICAgICBnZXRVcmwsXG4gICAgICAgIGdldE5hbWUsXG4gICAgICAgIGdldERlc2NyaXB0aW9uLFxuICAgICAgICBnZXRNaW1lVHlwZUZuXG4gICAgICApXG4gICAgKSxcbiAgICBtYXBBcnJheShcbiAgICAgIChbaXNTZXJ2aWNlLCBpc0Rvd25sb2FkLCBwcm90b2NvbCwgdXJsLCBuYW1lLCBkZXNjcmlwdGlvbiwgbWltZVR5cGVdKSA9PiB7XG4gICAgICAgIGlmIChpc1NlcnZpY2UpIHtcbiAgICAgICAgICBjb25zdCBoYXNJZGVudGlmaWVyID0gcHJvdG9jb2wgPT09ICd3bXMnIHx8IHByb3RvY29sID09PSAnd2ZzJ1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnc2VydmljZScsXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIGFjY2Vzc1NlcnZpY2VQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICAgICAgICAuLi4obmFtZSAmJiBoYXNJZGVudGlmaWVyICYmIHsgaWRlbnRpZmllckluU2VydmljZTogbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0Rvd25sb2FkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdkb3dubG9hZCcsXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgLi4uKG1pbWVUeXBlICYmIHsgbWltZVR5cGUgfSksXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUN1c3RvbVBlcmlvZChcbiAgaXNvUGVyaW9kOiBzdHJpbmdcbik6IFVwZGF0ZUZyZXF1ZW5jeUN1c3RvbSB7XG4gIGlmICghaXNvUGVyaW9kKSByZXR1cm4gbnVsbFxuICBjb25zdCBtYXRjaGVzID0gaXNvUGVyaW9kLm1hdGNoKFxuICAgIC9eLT9QKD86KFswLTldKylZKT8oPzooWzAtOV0rKU0pPyg/OihbMC05XSspRCk/VD8oPzooWzAtOV0rKUgpPy9cbiAgKVxuICBpZiAoIW1hdGNoZXMpIHJldHVybiBudWxsXG4gIGNvbnN0IHllYXJzID0gcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApIHx8IDBcbiAgY29uc3QgbW9udGhzID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApIHx8IDBcbiAgY29uc3QgZGF5cyA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKSB8fCAwXG4gIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApIHx8IDBcbiAgaWYgKHllYXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ3llYXInLFxuICAgICAgdXBkYXRlZFRpbWVzOiAxLFxuICAgIH1cbiAgfSBlbHNlIGlmIChtb250aHMgPT09IDEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAnbW9udGgnLFxuICAgICAgdXBkYXRlZFRpbWVzOiAxLFxuICAgIH1cbiAgfSBlbHNlIGlmIChtb250aHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAneWVhcicsXG4gICAgICB1cGRhdGVkVGltZXM6IE1hdGgucm91bmQoMTIgLyBtb250aHMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXlzID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ2RheScsXG4gICAgICB1cGRhdGVkVGltZXM6IDEsXG4gICAgfVxuICB9IGVsc2UgaWYgKGRheXMgPD0gNykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICd3ZWVrJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogTWF0aC5yb3VuZCg3IC8gZGF5cyAtIDAuMDAwMSksIC8vIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoYXQgJ2V2ZXJ5IDIgZGF5cycgPSAnMyB0aW1lcyBwZXIgd2VlaydcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGF5cykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICdtb250aCcsXG4gICAgICB1cGRhdGVkVGltZXM6IE1hdGgucm91bmQoMzAgLyBkYXlzKSxcbiAgICB9XG4gIH0gZWxzZSBpZiAoaG91cnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAnZGF5JyxcbiAgICAgIHVwZGF0ZWRUaW1lczogTWF0aC5yb3VuZCgyNCAvIGRheXMpLFxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vLyBmcm9tIGdtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVwZGF0ZUZyZXF1ZW5jeSgpOiBDaGFpbmFibGVGdW5jdGlvbjxcbiAgWG1sRWxlbWVudCxcbiAgVXBkYXRlRnJlcXVlbmN5XG4+IHtcbiAgcmV0dXJuIGZhbGxiYWNrKFxuICAgIHBpcGUoXG4gICAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6TURfTWFpbnRlbmFuY2VGcmVxdWVuY3lDb2RlJyksXG4gICAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgICBtYXAoZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUZyZXF1ZW5jeUNvZGUpXG4gICAgKSxcbiAgICBwaXBlKFxuICAgICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAgICdnbWQ6dXNlckRlZmluZWRNYWludGVuYW5jZUZyZXF1ZW5jeScsXG4gICAgICAgICdndHM6VE1fUGVyaW9kRHVyYXRpb24nXG4gICAgICApLFxuICAgICAgcmVhZFRleHQoKSxcbiAgICAgIG1hcChnZXRVcGRhdGVGcmVxdWVuY3lGcm9tQ3VzdG9tUGVyaW9kKVxuICAgICksXG4gICAgbWFwKCgpID0+ICd1bmtub3duJylcbiAgKVxufVxuXG4vKipcbiAqIExvb2tzIGZvciBzcnY6U1ZfU2VydmljZUlkZW50aWZpY2F0aW9uIG9yIGdtZDpNRF9EYXRhSWRlbnRpZmljYXRpb24gZWxlbWVudFxuICogV2lsbCBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBleGlzdHMsIG5vdCByZWFkaW5nIHRoZSB0eXBlIG9mIHRoZSByZWNvcmRcbiAqICh0aGlzIGFsbG93cyB1c2luZyB0aGlzIGZ1bmN0aW9uIGluIG90aGVyIHNpbWlsYXIgc2NoZW1hcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJZGVudGlmaWNhdGlvbigpIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmlkZW50aWZpY2F0aW9uSW5mbycsIGZhbHNlKSxcbiAgICBjb21iaW5lKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX0RhdGFJZGVudGlmaWNhdGlvbicsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ3NydjpTVl9TZXJ2aWNlSWRlbnRpZmljYXRpb24nLCBmYWxzZSlcbiAgICApLFxuICAgIGZpbHRlckFycmF5KChlbCkgPT4gZWwgIT09IG51bGwpLFxuICAgIGdldEF0SW5kZXgoMClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdElkZW50aWZpY2F0aW9uRGF0ZShcbiAgdHlwZTogJ2NyZWF0aW9uJyB8ICdyZXZpc2lvbicgfCAncHVibGljYXRpb24nXG4pIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6Y2l0YXRpb24nLCAnZ21kOkNJX0NpdGF0aW9uJywgJ2dtZDpkYXRlJyksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAgICAgJ2dtZDpDSV9EYXRlJyxcbiAgICAgICAgICAnZ21kOmRhdGVUeXBlJyxcbiAgICAgICAgICAnZ21kOkNJX0RhdGVUeXBlQ29kZSdcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0QXRJbmRleCgwKSxcbiAgICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHlwZSlcbiAgICAgIClcbiAgICApLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6Q0lfRGF0ZScsICdnbWQ6ZGF0ZScpLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZXh0cmFjdERhdGVUaW1lKClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhdGlhbFJlcHJlc2VudGF0aW9uRnJvbUNvZGUoXG4gIHNwYXRpYWxSZXByZXNlbnRhdGlvbkNvZGU6IHN0cmluZ1xuKTogU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZSB8IG51bGwge1xuICBzd2l0Y2ggKHNwYXRpYWxSZXByZXNlbnRhdGlvbkNvZGUpIHtcbiAgICBjYXNlICdncmlkJzpcbiAgICBjYXNlICd2ZWN0b3InOlxuICAgIGNhc2UgJ3Rpbic6XG4gICAgY2FzZSAndGFibGUnOlxuICAgIGNhc2UgJ3BvaW50JzpcbiAgICAgIHJldHVybiBzcGF0aWFsUmVwcmVzZW50YXRpb25Db2RlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVbmlxdWVJZGVudGlmaWVyKHJvb3RFbDogWG1sRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpmaWxlSWRlbnRpZmllcicsIGZhbHNlKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkS2luZChyb290RWw6IFhtbEVsZW1lbnQpOiBSZWNvcmRLaW5kIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpoaWVyYXJjaHlMZXZlbCcsICdnbWQ6TURfU2NvcGVDb2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChcbiAgICAgIChzY29wZUNvZGUpOiBSZWNvcmRLaW5kID0+XG4gICAgICAgIHNjb3BlQ29kZSA9PT0gJ3NlcnZpY2UnID8gJ3NlcnZpY2UnIDogJ2RhdGFzZXQnXG4gICAgKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRPd25lck9yZ2FuaXphdGlvbihyb290RWw6IFhtbEVsZW1lbnQpOiBPcmdhbml6YXRpb24ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmNvbnRhY3QnLCAnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknKSxcbiAgICBleHRyYWN0T3JnYW5pemF0aW9uKClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVzb3VyY2VVcGRhdGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gZXh0cmFjdElkZW50aWZpY2F0aW9uRGF0ZSgncmV2aXNpb24nKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVzb3VyY2VDcmVhdGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gZXh0cmFjdElkZW50aWZpY2F0aW9uRGF0ZSgnY3JlYXRpb24nKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVzb3VyY2VQdWJsaXNoZWQocm9vdEVsOiBYbWxFbGVtZW50KTogRGF0ZSB7XG4gIHJldHVybiBleHRyYWN0SWRlbnRpZmljYXRpb25EYXRlKCdwdWJsaWNhdGlvbicpKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZWNvcmRVcGRhdGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGF0ZVN0YW1wJyksIGV4dHJhY3REYXRlVGltZSgpKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVGl0bGUocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFic3RyYWN0KHJvb3RFbDogWG1sRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDphYnN0cmFjdCcsIGZhbHNlKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGFjdHMocm9vdEVsOiBYbWxFbGVtZW50KTogSW5kaXZpZHVhbFtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOmNvbnRhY3QnLCBmYWxzZSksXG4gICAgbWFwQXJyYXkoZmluZENoaWxkRWxlbWVudCgnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknLCBmYWxzZSkpLFxuICAgIG1hcEFycmF5KGV4dHJhY3RJbmRpdmlkdWFsKCkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRhY3RzRm9yUmVzb3VyY2Uocm9vdEVsOiBYbWxFbGVtZW50KTogSW5kaXZpZHVhbFtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgY29tYmluZShcbiAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpjb250YWN0JywgZmFsc2UpLFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JywgZmFsc2UpXG4gICAgKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6Q0lfUmVzcG9uc2libGVQYXJ0eScsIGZhbHNlKSksXG4gICAgbWFwQXJyYXkoZXh0cmFjdEluZGl2aWR1YWwoKSlcbiAgKShyb290RWwpXG59XG5cbi8vIGZyb20gZ21kOnRoZXNhdXJ1c05hbWVcbmV4cG9ydCBmdW5jdGlvbiByZWFkVGhlc2F1cnVzKHJvb3RFbDogWG1sRWxlbWVudCk6IEtleXdvcmRUaGVzYXVydXMge1xuICBpZiAoIXJvb3RFbCkgcmV0dXJuIG51bGxcblxuICBjb25zdCBmaW5kSWRlbnRpZmllciA9IGZpbmROZXN0ZWRFbGVtZW50KFxuICAgICdnbWQ6Q0lfQ2l0YXRpb24nLFxuICAgICdnbWQ6aWRlbnRpZmllcicsXG4gICAgJ2dtZDpNRF9JZGVudGlmaWVyJyxcbiAgICAnZ21kOmNvZGUnXG4gIClcbiAgY29uc3QgaWQgPSBwaXBlKGZpbmRJZGVudGlmaWVyLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpKHJvb3RFbClcbiAgY29uc3QgdXJsID0gcGlwZShmaW5kSWRlbnRpZmllciwgZXh0cmFjdFVybCgpKShyb290RWwpXG4gIGNvbnN0IG5hbWUgPSBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICkocm9vdEVsKVxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAuLi4odXJsICYmIHsgdXJsIH0pLFxuICB9XG59XG5cbi8vIGZyb20gZ21kOk1EX0tleXdvcmRzXG5leHBvcnQgZnVuY3Rpb24gcmVhZEtleXdvcmRHcm91cChyb290RWw6IFhtbEVsZW1lbnQpOiBLZXl3b3JkW10ge1xuICBjb25zdCB0eXBlID0gcGlwZShcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfS2V5d29yZFR5cGVDb2RlJyksXG4gICAgbWFwQXJyYXkocmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpKSxcbiAgICBtYXAoKHZhbHVlcykgPT4gZ2V0S2V5d29yZFR5cGVGcm9tS2V5d29yZFR5cGVDb2RlKHZhbHVlc1swXSkpXG4gICkocm9vdEVsKVxuICBjb25zdCB0aGVzYXVydXMgPSBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6dGhlc2F1cnVzTmFtZScpLFxuICAgIHJlYWRUaGVzYXVydXNcbiAgKShyb290RWwpXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDprZXl3b3JkJyksXG4gICAgbWFwQXJyYXkoKGVsKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKShlbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLih0aGVzYXVydXMgPyB7IHRoZXNhdXJ1cyB9IDoge30pLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgdHlwZSxcbiAgICAgIH0gYXMgS2V5d29yZFxuICAgIH0pXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEtleXdvcmRzKHJvb3RFbDogWG1sRWxlbWVudCk6IEtleXdvcmRbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRlc2NyaXB0aXZlS2V5d29yZHMnLCAnZ21kOk1EX0tleXdvcmRzJyksXG4gICAgbWFwQXJyYXkocmVhZEtleXdvcmRHcm91cCksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU3RhdHVzKHJvb3RFbDogWG1sRWxlbWVudCk6IFJlY29yZFN0YXR1cyB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpzdGF0dXMnLCBmYWxzZSksXG4gICAgZXh0cmFjdFN0YXR1cygpXG4gICkocm9vdEVsKVxufVxuXG5jb25zdCBnZXRDb25zdHJhaW50cyA9IHBpcGUoXG4gIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6cmVzb3VyY2VDb25zdHJhaW50cycsIGZhbHNlKVxuKVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZExlZ2FsQ29uc3RyYWludHMocm9vdEVsOiBYbWxFbGVtZW50KTogQ29uc3RyYWludFtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZ2V0Q29uc3RyYWludHMsXG4gICAgbWFwQXJyYXkoZXh0cmFjdExlZ2FsQ29uc3RyYWludHMoKSksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU2VjdXJpdHlDb25zdHJhaW50cyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0U2VjdXJpdHlDb25zdHJhaW50cygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRPdGhlckNvbnN0cmFpbnRzKHJvb3RFbDogWG1sRWxlbWVudCk6IENvbnN0cmFpbnRbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGdldENvbnN0cmFpbnRzLFxuICAgIG1hcEFycmF5KGV4dHJhY3RPdGhlckNvbnN0cmFpbnRzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZExpY2Vuc2VzKHJvb3RFbDogWG1sRWxlbWVudCk6IENvbnN0cmFpbnRbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGdldENvbnN0cmFpbnRzLFxuICAgIG1hcEFycmF5KGV4dHJhY3RMaWNlbnNlcygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuLy8gbm90IHVzZWQgeWV0XG5leHBvcnQgZnVuY3Rpb24gcmVhZElzb1RvcGljcyhyb290RWw6IFhtbEVsZW1lbnQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9Ub3BpY0NhdGVnb3J5Q29kZScsIHRydWUpLFxuICAgIG1hcEFycmF5KHJlYWRUZXh0KCkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNwYXRpYWxSZXByZXNlbnRhdGlvbihcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pOiBTcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlIHwgbnVsbCB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KFxuICAgICAgJ2dtZDpzcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlJyxcbiAgICAgICdnbWQ6TURfU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZUNvZGUnXG4gICAgKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgbWFwKGdldFNwYXRpYWxSZXByZXNlbnRhdGlvbkZyb21Db2RlKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRPdmVydmlld3Mocm9vdEVsOiBYbWxFbGVtZW50KTogR3JhcGhpY092ZXJ2aWV3W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6Z3JhcGhpY092ZXJ2aWV3JywgZmFsc2UpLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZmlsZU5hbWUnKSwgZXh0cmFjdE1hbmRhdG9yeVVybCgpKSxcbiAgICAgICAgcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZmlsZURlc2NyaXB0aW9uJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KChbdXJsLCBkZXNjcmlwdGlvbl0pID0+ICh7XG4gICAgICB1cmwsXG4gICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICB9KSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkTGluZWFnZShyb290RWw6IFhtbEVsZW1lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6ZGF0YVF1YWxpdHlJbmZvJyxcbiAgICAgICdnbWQ6RFFfRGF0YVF1YWxpdHknLFxuICAgICAgJ2dtZDpsaW5lYWdlJyxcbiAgICAgICdnbWQ6TElfTGluZWFnZScsXG4gICAgICAnZ21kOnN0YXRlbWVudCdcbiAgICApLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREaXN0cmlidXRpb25zKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGFzZXREaXN0cmlidXRpb25bXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIG1hcEFycmF5KGV4dHJhY3REYXRhc2V0RGlzdHJpYnV0aW9ucyhnZXRNaW1lVHlwZSkpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFVwZGF0ZUZyZXF1ZW5jeShyb290RWw6IFhtbEVsZW1lbnQpOiBVcGRhdGVGcmVxdWVuY3kge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6cmVzb3VyY2VNYWludGVuYW5jZScsXG4gICAgICAnZ21kOk1EX01haW50ZW5hbmNlSW5mb3JtYXRpb24nXG4gICAgKSxcbiAgICBleHRyYWN0VXBkYXRlRnJlcXVlbmN5KCksXG4gICAgbWFwKCh1cGRhdGVGcmVxdWVuY3kpID0+IHVwZGF0ZUZyZXF1ZW5jeSB8fCAndW5rbm93bicpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlcnZpY2VPbmxpbmVSZXNvdXJjZXMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIFNlcnZpY2VPbmxpbmVSZXNvdXJjZVtdXG4+IHtcbiAgY29uc3QgZ2V0VXJsID0gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6bGlua2FnZScpLCBleHRyYWN0TWFuZGF0b3J5VXJsKCkpXG4gIGNvbnN0IGdldFByb3RvY29sU3RyID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKVxuICBjb25zdCBnZXRQcm90b2NvbCA9IHBpcGUoZ2V0UHJvdG9jb2xTdHIsIG1hcChtYXRjaFByb3RvY29sKSlcbiAgY29uc3QgZ2V0T25saW5lRnVuY3Rpb24gPSBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nLCAnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKVxuICApXG4gIGNvbnN0IGdldElzTGluayA9IHBpcGUoXG4gICAgZ2V0T25saW5lRnVuY3Rpb24sXG4gICAgbWFwKChvbmxpbmVGdW5jdGlvbikgPT4gb25saW5lRnVuY3Rpb24gPT09ICdpbmZvcm1hdGlvbicpXG4gIClcbiAgY29uc3QgZ2V0TmFtZSA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOm5hbWUnKSwgZXh0cmFjdENoYXJhY3RlclN0cmluZygpKVxuICBjb25zdCBnZXREZXNjcmlwdGlvbiA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmRlc2NyaXB0aW9uJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgJ2dtZDp0cmFuc2Zlck9wdGlvbnMnLFxuICAgICAgJ2dtZDpNRF9EaWdpdGFsVHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6b25MaW5lJyxcbiAgICAgICdnbWQ6Q0lfT25saW5lUmVzb3VyY2UnXG4gICAgKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGdldElzTGluaywgZ2V0UHJvdG9jb2wsIGdldFVybCwgZ2V0TmFtZSwgZ2V0RGVzY3JpcHRpb24pKSxcbiAgICBtYXBBcnJheSgoW2lzTGluaywgcHJvdG9jb2wsIHVybCwgbmFtZSwgZGVzY3JpcHRpb25dKSA9PiB7XG4gICAgICBpZiAoaXNMaW5rKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ2xpbmsnLFxuICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnZW5kcG9pbnQnLFxuICAgICAgICAgIGVuZHBvaW50VXJsOiB1cmwsXG4gICAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT25saW5lUmVzb3VyY2VzKFxuICByb290RWw6IFhtbEVsZW1lbnRcbik6IFNlcnZpY2VPbmxpbmVSZXNvdXJjZVtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6ZGlzdHJpYnV0aW9uSW5mbycsICdnbWQ6TURfRGlzdHJpYnV0aW9uJyksXG4gICAgbWFwQXJyYXkoZXh0cmFjdFNlcnZpY2VPbmxpbmVSZXNvdXJjZXMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parts are [firstName, lastName]
|
|
3
|
+
* Second part will be null if no separation could be done
|
|
4
|
+
* @param fullName
|
|
5
|
+
*/
|
|
6
|
+
export function fullNameToParts(fullName) {
|
|
7
|
+
const parts = fullName.trim().split(/\s+/);
|
|
8
|
+
const first = parts.shift();
|
|
9
|
+
return [first, parts.join(' ').trim() || null];
|
|
10
|
+
}
|
|
11
|
+
export function namePartsToFull(firstName, lastName) {
|
|
12
|
+
const first = firstName?.trim();
|
|
13
|
+
const last = lastName?.trim();
|
|
14
|
+
if (!first && !last)
|
|
15
|
+
return null;
|
|
16
|
+
return last && first ? `${first} ${last}` : last || first;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kaXZpZHVhbC1uYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvbWV0YWRhdGEtY29udmVydGVyL3NyYy9saWIvaXNvMTkxMzkvdXRpbHMvaW5kaXZpZHVhbC1uYW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzNCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsU0FBd0IsRUFDeEIsUUFBdUI7SUFFdkIsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQy9CLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUM3QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2hDLE9BQU8sSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUE7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFydHMgYXJlIFtmaXJzdE5hbWUsIGxhc3ROYW1lXVxuICogU2Vjb25kIHBhcnQgd2lsbCBiZSBudWxsIGlmIG5vIHNlcGFyYXRpb24gY291bGQgYmUgZG9uZVxuICogQHBhcmFtIGZ1bGxOYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdWxsTmFtZVRvUGFydHMoZnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZyB8IG51bGxdIHtcbiAgY29uc3QgcGFydHMgPSBmdWxsTmFtZS50cmltKCkuc3BsaXQoL1xccysvKVxuICBjb25zdCBmaXJzdCA9IHBhcnRzLnNoaWZ0KClcbiAgcmV0dXJuIFtmaXJzdCwgcGFydHMuam9pbignICcpLnRyaW0oKSB8fCBudWxsXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmFtZVBhcnRzVG9GdWxsKFxuICBmaXJzdE5hbWU6IHN0cmluZyB8IG51bGwsXG4gIGxhc3ROYW1lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZmlyc3QgPSBmaXJzdE5hbWU/LnRyaW0oKVxuICBjb25zdCBsYXN0ID0gbGFzdE5hbWU/LnRyaW0oKVxuICBpZiAoIWZpcnN0ICYmICFsYXN0KSByZXR1cm4gbnVsbFxuICByZXR1cm4gbGFzdCAmJiBmaXJzdCA/IGAke2ZpcnN0fSAke2xhc3R9YCA6IGxhc3QgfHwgZmlyc3Rcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function getKeywordTypeFromKeywordTypeCode(typeCode) {
|
|
2
|
+
if (!typeCode)
|
|
3
|
+
return 'other';
|
|
4
|
+
switch (typeCode) {
|
|
5
|
+
case 'theme':
|
|
6
|
+
case 'place':
|
|
7
|
+
case 'temporal':
|
|
8
|
+
case 'other':
|
|
9
|
+
return typeCode;
|
|
10
|
+
default:
|
|
11
|
+
return 'other';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5d29yZC5tYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS91dGlscy9rZXl3b3JkLm1hcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsaUNBQWlDLENBQy9DLFFBQWdCO0lBRWhCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxPQUFPLENBQUE7SUFDN0IsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE9BQU8sUUFBUSxDQUFBO1FBQ2pCO1lBQ0UsT0FBTyxPQUFPLENBQUE7S0FDakI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5d29yZFR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXl3b3JkVHlwZUZyb21LZXl3b3JkVHlwZUNvZGUoXG4gIHR5cGVDb2RlOiBzdHJpbmdcbik6IEtleXdvcmRUeXBlIHtcbiAgaWYgKCF0eXBlQ29kZSkgcmV0dXJuICdvdGhlcidcbiAgc3dpdGNoICh0eXBlQ29kZSkge1xuICAgIGNhc2UgJ3RoZW1lJzpcbiAgICBjYXNlICdwbGFjZSc6XG4gICAgY2FzZSAndGVtcG9yYWwnOlxuICAgIGNhc2UgJ290aGVyJzpcbiAgICAgIHJldHVybiB0eXBlQ29kZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ290aGVyJ1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function getRoleFromRoleCode(roleCode) {
|
|
2
|
+
if (!roleCode)
|
|
3
|
+
return 'unspecified';
|
|
4
|
+
switch (roleCode) {
|
|
5
|
+
case 'author':
|
|
6
|
+
case 'coAuthor':
|
|
7
|
+
return 'author';
|
|
8
|
+
case 'originator':
|
|
9
|
+
return 'originator';
|
|
10
|
+
case 'principalInvestigator':
|
|
11
|
+
return 'principal_investigator';
|
|
12
|
+
case 'resourceProvider':
|
|
13
|
+
return 'resource_provider';
|
|
14
|
+
case 'processor':
|
|
15
|
+
return 'processor';
|
|
16
|
+
case 'custodian':
|
|
17
|
+
return 'custodian';
|
|
18
|
+
case 'owner':
|
|
19
|
+
return 'owner';
|
|
20
|
+
case 'pointOfContact':
|
|
21
|
+
return 'point_of_contact';
|
|
22
|
+
case 'publisher':
|
|
23
|
+
return 'publisher';
|
|
24
|
+
case 'distributor':
|
|
25
|
+
return 'distributor';
|
|
26
|
+
case 'user':
|
|
27
|
+
return 'user';
|
|
28
|
+
case 'collaborator':
|
|
29
|
+
return 'collaborator';
|
|
30
|
+
case 'editor':
|
|
31
|
+
return 'editor';
|
|
32
|
+
case 'contributor':
|
|
33
|
+
return 'contributor';
|
|
34
|
+
case 'stakeholder':
|
|
35
|
+
return 'stakeholder';
|
|
36
|
+
case 'sponsor':
|
|
37
|
+
return 'sponsor';
|
|
38
|
+
case 'funder':
|
|
39
|
+
return 'funder';
|
|
40
|
+
case 'rightsHolder':
|
|
41
|
+
return 'rights_holder';
|
|
42
|
+
case 'mediator':
|
|
43
|
+
return 'mediator';
|
|
44
|
+
default:
|
|
45
|
+
return 'other';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5tYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS91dGlscy9yb2xlLm1hcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsUUFBZ0I7SUFDbEQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLGFBQWEsQ0FBQTtJQUNuQyxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLEtBQUssWUFBWTtZQUNmLE9BQU8sWUFBWSxDQUFBO1FBQ3JCLEtBQUssdUJBQXVCO1lBQzFCLE9BQU8sd0JBQXdCLENBQUE7UUFDakMsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxtQkFBbUIsQ0FBQTtRQUM1QixLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLFdBQVc7WUFDZCxPQUFPLFdBQVcsQ0FBQTtRQUNwQixLQUFLLE9BQU87WUFDVixPQUFPLE9BQU8sQ0FBQTtRQUNoQixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLGtCQUFrQixDQUFBO1FBQzNCLEtBQUssV0FBVztZQUNkLE9BQU8sV0FBVyxDQUFBO1FBQ3BCLEtBQUssYUFBYTtZQUNoQixPQUFPLGFBQWEsQ0FBQTtRQUN0QixLQUFLLE1BQU07WUFDVCxPQUFPLE1BQU0sQ0FBQTtRQUNmLEtBQUssY0FBYztZQUNqQixPQUFPLGNBQWMsQ0FBQTtRQUN2QixLQUFLLFFBQVE7WUFDWCxPQUFPLFFBQVEsQ0FBQTtRQUNqQixLQUFLLGFBQWE7WUFDaEIsT0FBTyxhQUFhLENBQUE7UUFDdEIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3RCLEtBQUssU0FBUztZQUNaLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLEtBQUssUUFBUTtZQUNYLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLEtBQUssY0FBYztZQUNqQixPQUFPLGVBQWUsQ0FBQTtRQUN4QixLQUFLLFVBQVU7WUFDYixPQUFPLFVBQVUsQ0FBQTtRQUNuQjtZQUNFLE9BQU8sT0FBTyxDQUFBO0tBQ2pCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvbGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb2xlRnJvbVJvbGVDb2RlKHJvbGVDb2RlOiBzdHJpbmcpOiBSb2xlIHtcbiAgaWYgKCFyb2xlQ29kZSkgcmV0dXJuICd1bnNwZWNpZmllZCdcbiAgc3dpdGNoIChyb2xlQ29kZSkge1xuICAgIGNhc2UgJ2F1dGhvcic6XG4gICAgY2FzZSAnY29BdXRob3InOlxuICAgICAgcmV0dXJuICdhdXRob3InXG4gICAgY2FzZSAnb3JpZ2luYXRvcic6XG4gICAgICByZXR1cm4gJ29yaWdpbmF0b3InXG4gICAgY2FzZSAncHJpbmNpcGFsSW52ZXN0aWdhdG9yJzpcbiAgICAgIHJldHVybiAncHJpbmNpcGFsX2ludmVzdGlnYXRvcidcbiAgICBjYXNlICdyZXNvdXJjZVByb3ZpZGVyJzpcbiAgICAgIHJldHVybiAncmVzb3VyY2VfcHJvdmlkZXInXG4gICAgY2FzZSAncHJvY2Vzc29yJzpcbiAgICAgIHJldHVybiAncHJvY2Vzc29yJ1xuICAgIGNhc2UgJ2N1c3RvZGlhbic6XG4gICAgICByZXR1cm4gJ2N1c3RvZGlhbidcbiAgICBjYXNlICdvd25lcic6XG4gICAgICByZXR1cm4gJ293bmVyJ1xuICAgIGNhc2UgJ3BvaW50T2ZDb250YWN0JzpcbiAgICAgIHJldHVybiAncG9pbnRfb2ZfY29udGFjdCdcbiAgICBjYXNlICdwdWJsaXNoZXInOlxuICAgICAgcmV0dXJuICdwdWJsaXNoZXInXG4gICAgY2FzZSAnZGlzdHJpYnV0b3InOlxuICAgICAgcmV0dXJuICdkaXN0cmlidXRvcidcbiAgICBjYXNlICd1c2VyJzpcbiAgICAgIHJldHVybiAndXNlcidcbiAgICBjYXNlICdjb2xsYWJvcmF0b3InOlxuICAgICAgcmV0dXJuICdjb2xsYWJvcmF0b3InXG4gICAgY2FzZSAnZWRpdG9yJzpcbiAgICAgIHJldHVybiAnZWRpdG9yJ1xuICAgIGNhc2UgJ2NvbnRyaWJ1dG9yJzpcbiAgICAgIHJldHVybiAnY29udHJpYnV0b3InXG4gICAgY2FzZSAnc3Rha2Vob2xkZXInOlxuICAgICAgcmV0dXJuICdzdGFrZWhvbGRlcidcbiAgICBjYXNlICdzcG9uc29yJzpcbiAgICAgIHJldHVybiAnc3BvbnNvcidcbiAgICBjYXNlICdmdW5kZXInOlxuICAgICAgcmV0dXJuICdmdW5kZXInXG4gICAgY2FzZSAncmlnaHRzSG9sZGVyJzpcbiAgICAgIHJldHVybiAncmlnaHRzX2hvbGRlcidcbiAgICBjYXNlICdtZWRpYXRvcic6XG4gICAgICByZXR1cm4gJ21lZGlhdG9yJ1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ290aGVyJ1xuICB9XG59XG4iXX0=
|