@igo2/geo 1.14.3 → 1.14.4
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/assets/icons/cross_black_18px.svg +88 -88
- package/assets/icons/place_blue_36px.svg +55 -55
- package/assets/icons/place_green_36px.svg +55 -55
- package/assets/icons/place_red_36px.svg +55 -55
- package/assets/icons/place_yellow_36px.svg +55 -55
- package/esm2020/igo2-geo.mjs +4 -4
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +300 -300
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +305 -305
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -246
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +79 -79
- package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +208 -208
- package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +78 -78
- package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +216 -216
- package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +94 -94
- package/esm2020/lib/catalog/catalog.module.mjs +52 -52
- package/esm2020/lib/catalog/index.mjs +4 -4
- package/esm2020/lib/catalog/shared/catalog.abstract.mjs +94 -94
- package/esm2020/lib/catalog/shared/catalog.enum.mjs +15 -15
- package/esm2020/lib/catalog/shared/catalog.interface.mjs +1 -1
- package/esm2020/lib/catalog/shared/catalog.service.mjs +605 -605
- package/esm2020/lib/catalog/shared/index.mjs +5 -5
- package/esm2020/lib/datasource/datasource.module.mjs +21 -21
- package/esm2020/lib/datasource/index.mjs +3 -3
- package/esm2020/lib/datasource/shared/capabilities.service.mjs +431 -431
- package/esm2020/lib/datasource/shared/datasource.service.mjs +235 -235
- package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +144 -144
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +108 -108
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +14 -14
- package/esm2020/lib/datasource/shared/datasources/data.service.mjs +2 -2
- package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/datasource.mjs +28 -28
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +42 -42
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +56 -56
- package/esm2020/lib/datasource/shared/datasources/index.mjs +36 -36
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +27 -27
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +11 -11
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +48 -48
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +14 -14
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +53 -53
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +71 -71
- package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +151 -151
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +205 -205
- package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +206 -206
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +15 -15
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +8 -8
- package/esm2020/lib/datasource/shared/index.mjs +4 -4
- package/esm2020/lib/datasource/shared/options/index.mjs +4 -4
- package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +1 -1
- package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +14 -14
- package/esm2020/lib/datasource/shared/options/options-api.service.mjs +80 -80
- package/esm2020/lib/datasource/shared/options/options.service.mjs +2 -2
- package/esm2020/lib/datasource/utils/esri-style-generator.mjs +356 -356
- package/esm2020/lib/datasource/utils/index.mjs +2 -2
- package/esm2020/lib/datasource/utils/tilegrid.mjs +19 -19
- package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +223 -223
- package/esm2020/lib/directions/directions-buttons/index.mjs +2 -2
- package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +289 -289
- package/esm2020/lib/directions/directions-inputs/index.mjs +2 -2
- package/esm2020/lib/directions/directions-results/directions-results.component.mjs +195 -195
- package/esm2020/lib/directions/directions-results/index.mjs +2 -2
- package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +1 -1
- package/esm2020/lib/directions/directions-sources/directions-source.mjs +2 -2
- package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +15 -15
- package/esm2020/lib/directions/directions-sources/index.mjs +5 -5
- package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +99 -99
- package/esm2020/lib/directions/directions.component.mjs +310 -310
- package/esm2020/lib/directions/directions.module.mjs +101 -101
- package/esm2020/lib/directions/index.mjs +7 -7
- package/esm2020/lib/directions/shared/directions-source.service.mjs +17 -17
- package/esm2020/lib/directions/shared/directions.enum.mjs +28 -28
- package/esm2020/lib/directions/shared/directions.interface.mjs +1 -1
- package/esm2020/lib/directions/shared/directions.service.mjs +28 -28
- package/esm2020/lib/directions/shared/directions.utils.mjs +508 -508
- package/esm2020/lib/directions/shared/index.mjs +6 -6
- package/esm2020/lib/directions/shared/store.mjs +23 -23
- package/esm2020/lib/download/download-button/download-button.component.mjs +60 -60
- package/esm2020/lib/download/download-button/index.mjs +2 -2
- package/esm2020/lib/download/download.module.mjs +41 -41
- package/esm2020/lib/download/index.mjs +3 -3
- package/esm2020/lib/download/shared/download.interface.mjs +2 -2
- package/esm2020/lib/download/shared/download.service.mjs +64 -64
- package/esm2020/lib/download/shared/index.mjs +3 -3
- package/esm2020/lib/draw/draw/draw-layer-popup.component.mjs +54 -54
- package/esm2020/lib/draw/draw/draw-popup.component.mjs +590 -590
- package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +47 -47
- package/esm2020/lib/draw/draw/draw.component.mjs +1298 -1298
- package/esm2020/lib/draw/draw/draw.module.mjs +112 -112
- package/esm2020/lib/draw/drawingTool.module.mjs +19 -19
- package/esm2020/lib/draw/index.mjs +3 -3
- package/esm2020/lib/draw/shared/draw-icon.service.mjs +26 -26
- package/esm2020/lib/draw/shared/draw-style.service.mjs +189 -189
- package/esm2020/lib/draw/shared/draw.enum.mjs +36 -36
- package/esm2020/lib/draw/shared/draw.interface.mjs +1 -1
- package/esm2020/lib/draw/shared/draw.utils.mjs +121 -121
- package/esm2020/lib/draw/shared/index.mjs +5 -5
- package/esm2020/lib/feature/feature-details/feature-details.component.mjs +404 -404
- package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +53 -53
- package/esm2020/lib/feature/feature-details/feature-details.module.mjs +47 -47
- package/esm2020/lib/feature/feature-form/feature-form.component.mjs +111 -111
- package/esm2020/lib/feature/feature-form/feature-form.module.mjs +33 -33
- package/esm2020/lib/feature/feature.module.mjs +27 -27
- package/esm2020/lib/feature/index.mjs +3 -3
- package/esm2020/lib/feature/shared/feature.enums.mjs +9 -9
- package/esm2020/lib/feature/shared/feature.interfaces.mjs +1 -1
- package/esm2020/lib/feature/shared/feature.utils.mjs +346 -346
- package/esm2020/lib/feature/shared/index.mjs +6 -6
- package/esm2020/lib/feature/shared/store.mjs +123 -123
- package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +112 -112
- package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +93 -93
- package/esm2020/lib/feature/shared/strategies/index.mjs +5 -5
- package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +103 -103
- package/esm2020/lib/feature/shared/strategies/loading.mjs +132 -132
- package/esm2020/lib/feature/shared/strategies/selection.mjs +369 -369
- package/esm2020/lib/feature/shared/strategies.utils.mjs +36 -36
- package/esm2020/lib/filter/filter.module.mjs +288 -288
- package/esm2020/lib/filter/index.mjs +15 -15
- package/esm2020/lib/filter/ogc-filter-button/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +139 -139
- package/esm2020/lib/filter/ogc-filter-form/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +644 -644
- package/esm2020/lib/filter/ogc-filter-selection/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +1301 -1301
- package/esm2020/lib/filter/ogc-filter-time/index.mjs +2 -2
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +176 -176
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +897 -897
- package/esm2020/lib/filter/ogc-filterable-form/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +58 -58
- package/esm2020/lib/filter/ogc-filterable-item/index.mjs +1 -1
- package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +306 -306
- package/esm2020/lib/filter/ogc-filterable-list/index.mjs +2 -2
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +30 -30
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +43 -43
- package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +54 -54
- package/esm2020/lib/filter/shared/index.mjs +11 -11
- package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +71 -71
- package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +29 -29
- package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +1 -1
- package/esm2020/lib/filter/shared/ogc-filter.mjs +691 -691
- package/esm2020/lib/filter/shared/ogc-filter.service.mjs +45 -45
- package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +22 -22
- package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +1 -1
- package/esm2020/lib/filter/shared/spatial-filter.service.mjs +268 -268
- package/esm2020/lib/filter/shared/time-filter.enum.mjs +12 -12
- package/esm2020/lib/filter/shared/time-filter.interface.mjs +1 -1
- package/esm2020/lib/filter/shared/time-filter.service.mjs +106 -106
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1088 -1088
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +207 -207
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +1 -1
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +143 -143
- package/esm2020/lib/filter/time-filter-button/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +77 -77
- package/esm2020/lib/filter/time-filter-form/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +733 -733
- package/esm2020/lib/filter/time-filter-item/index.mjs +1 -1
- package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +118 -118
- package/esm2020/lib/filter/time-filter-list/index.mjs +2 -2
- package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +30 -30
- package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +38 -38
- package/esm2020/lib/geo.module.mjs +101 -101
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +520 -520
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +188 -188
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +63 -63
- package/esm2020/lib/geometry/geometry.module.mjs +26 -26
- package/esm2020/lib/geometry/index.mjs +3 -3
- package/esm2020/lib/geometry/shared/controls/draw.mjs +313 -313
- package/esm2020/lib/geometry/shared/controls/index.mjs +4 -4
- package/esm2020/lib/geometry/shared/controls/modify.mjs +520 -520
- package/esm2020/lib/geometry/shared/controls/slice.mjs +176 -176
- package/esm2020/lib/geometry/shared/geometry.errors.mjs +25 -25
- package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +1 -1
- package/esm2020/lib/geometry/shared/geometry.utils.mjs +121 -121
- package/esm2020/lib/geometry/shared/index.mjs +5 -5
- package/esm2020/lib/import-export/export-button/export-button.component.mjs +63 -63
- package/esm2020/lib/import-export/export-button/index.mjs +2 -2
- package/esm2020/lib/import-export/import-export/import-export.component.mjs +1219 -1219
- package/esm2020/lib/import-export/import-export/index.mjs +2 -2
- package/esm2020/lib/import-export/import-export.module.mjs +95 -95
- package/esm2020/lib/import-export/index.mjs +4 -4
- package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +134 -134
- package/esm2020/lib/import-export/shared/export.errors.mjs +15 -15
- package/esm2020/lib/import-export/shared/export.interface.mjs +1 -1
- package/esm2020/lib/import-export/shared/export.service.mjs +194 -194
- package/esm2020/lib/import-export/shared/export.type.mjs +3 -3
- package/esm2020/lib/import-export/shared/export.utils.mjs +54 -54
- package/esm2020/lib/import-export/shared/import.errors.mjs +38 -38
- package/esm2020/lib/import-export/shared/import.interface.mjs +1 -1
- package/esm2020/lib/import-export/shared/import.service.mjs +214 -214
- package/esm2020/lib/import-export/shared/import.utils.mjs +234 -234
- package/esm2020/lib/import-export/shared/index.mjs +11 -11
- package/esm2020/lib/import-export/style-list/index.mjs +4 -4
- package/esm2020/lib/import-export/style-list/style-list.interface.mjs +1 -1
- package/esm2020/lib/import-export/style-list/style-list.module.mjs +22 -22
- package/esm2020/lib/import-export/style-list/style-list.provider.mjs +20 -20
- package/esm2020/lib/import-export/style-list/style-list.service.mjs +50 -50
- package/esm2020/lib/layer/index.mjs +10 -10
- package/esm2020/lib/layer/layer-item/index.mjs +1 -1
- package/esm2020/lib/layer/layer-item/layer-item.component.mjs +299 -299
- package/esm2020/lib/layer/layer-legend/index.mjs +1 -1
- package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +387 -387
- package/esm2020/lib/layer/layer-legend-item/index.mjs +1 -1
- package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +83 -83
- package/esm2020/lib/layer/layer-legend-list/index.mjs +2 -2
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +47 -47
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +194 -194
- package/esm2020/lib/layer/layer-list/index.mjs +3 -3
- package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +58 -58
- package/esm2020/lib/layer/layer-list/layer-list.component.mjs +1008 -1008
- package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +18 -18
- package/esm2020/lib/layer/layer-list-tool/index.mjs +4 -4
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +164 -164
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +6 -6
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +1 -1
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +21 -21
- package/esm2020/lib/layer/layer.module.mjs +184 -184
- package/esm2020/lib/layer/shared/clusterParam.mjs +1 -1
- package/esm2020/lib/layer/shared/index.mjs +6 -6
- package/esm2020/lib/layer/shared/layer.enums.mjs +1 -1
- package/esm2020/lib/layer/shared/layer.service.mjs +185 -185
- package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/any-layer.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/image-layer.mjs +67 -67
- package/esm2020/lib/layer/shared/layers/index.mjs +13 -13
- package/esm2020/lib/layer/shared/layers/layer.interface.mjs +16 -16
- package/esm2020/lib/layer/shared/layers/layer.mjs +163 -163
- package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/tile-layer.mjs +46 -46
- package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/vector-layer.mjs +377 -377
- package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +1 -1
- package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +103 -103
- package/esm2020/lib/layer/shared/style.service.mjs +355 -355
- package/esm2020/lib/layer/shared/vector-style.interface.mjs +1 -1
- package/esm2020/lib/layer/style-modal/index.mjs +1 -1
- package/esm2020/lib/layer/style-modal/style-modal.component.mjs +287 -287
- package/esm2020/lib/layer/track-feature-button/index.mjs +1 -1
- package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +58 -58
- package/esm2020/lib/layer/utils/image-watcher.mjs +61 -61
- package/esm2020/lib/layer/utils/index.mjs +5 -5
- package/esm2020/lib/layer/utils/layer.utils.mjs +9 -9
- package/esm2020/lib/layer/utils/outputLegend.mjs +26 -26
- package/esm2020/lib/layer/utils/tile-watcher.mjs +49 -49
- package/esm2020/lib/layer/utils/vector-watcher.mjs +47 -47
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +19 -19
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +96 -96
- package/esm2020/lib/map/baselayers-switcher/index.mjs +2 -2
- package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +140 -140
- package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +78 -78
- package/esm2020/lib/map/geolocate-button/index.mjs +1 -1
- package/esm2020/lib/map/home-extent-button/home-extent-button.component.mjs +62 -62
- package/esm2020/lib/map/home-extent-button/index.mjs +1 -1
- package/esm2020/lib/map/index.mjs +13 -13
- package/esm2020/lib/map/info-section/index.mjs +1 -1
- package/esm2020/lib/map/info-section/info-section.component.mjs +29 -29
- package/esm2020/lib/map/map-browser/index.mjs +1 -1
- package/esm2020/lib/map/map-browser/map-browser.component.mjs +65 -65
- package/esm2020/lib/map/map-center/index.mjs +1 -1
- package/esm2020/lib/map/map-center/map-center.component.mjs +49 -49
- package/esm2020/lib/map/map.module.mjs +126 -126
- package/esm2020/lib/map/menu-button/index.mjs +1 -1
- package/esm2020/lib/map/menu-button/menu-button.component.mjs +61 -61
- package/esm2020/lib/map/offline-button/index.mjs +1 -1
- package/esm2020/lib/map/offline-button/offline-button.component.mjs +75 -75
- package/esm2020/lib/map/rotation-button/index.mjs +1 -1
- package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +69 -69
- package/esm2020/lib/map/shared/controllers/controller.mjs +41 -41
- package/esm2020/lib/map/shared/controllers/geolocation.mjs +307 -307
- package/esm2020/lib/map/shared/controllers/index.mjs +3 -3
- package/esm2020/lib/map/shared/controllers/view.mjs +350 -350
- package/esm2020/lib/map/shared/hover-feature.directive.mjs +502 -502
- package/esm2020/lib/map/shared/index.mjs +13 -13
- package/esm2020/lib/map/shared/linkedLayers.utils.mjs +237 -237
- package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +106 -106
- package/esm2020/lib/map/shared/map.enums.mjs +5 -5
- package/esm2020/lib/map/shared/map.interface.mjs +1 -1
- package/esm2020/lib/map/shared/map.mjs +412 -407
- package/esm2020/lib/map/shared/map.service.mjs +28 -28
- package/esm2020/lib/map/shared/map.utils.mjs +462 -462
- package/esm2020/lib/map/shared/mapOffline.directive.mjs +162 -162
- package/esm2020/lib/map/shared/projection.interfaces.mjs +1 -1
- package/esm2020/lib/map/shared/projection.service.mjs +64 -64
- package/esm2020/lib/map/shared/projection.utils.mjs +63 -63
- package/esm2020/lib/map/swipe-control/index.mjs +1 -1
- package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +192 -192
- package/esm2020/lib/map/utils/layer-watcher.mjs +78 -78
- package/esm2020/lib/map/wake-lock-button/index.mjs +1 -1
- package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +113 -113
- package/esm2020/lib/map/zoom-button/index.mjs +1 -1
- package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +39 -39
- package/esm2020/lib/measure/index.mjs +3 -3
- package/esm2020/lib/measure/measure.module.mjs +19 -19
- package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +36 -36
- package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +179 -179
- package/esm2020/lib/measure/measurer/measurer-item.component.mjs +139 -139
- package/esm2020/lib/measure/measurer/measurer.component.mjs +1041 -1041
- package/esm2020/lib/measure/measurer/measurer.module.mjs +93 -93
- package/esm2020/lib/measure/shared/index.mjs +4 -4
- package/esm2020/lib/measure/shared/measure.enum.mjs +36 -36
- package/esm2020/lib/measure/shared/measure.interfaces.mjs +1 -1
- package/esm2020/lib/measure/shared/measure.utils.mjs +488 -488
- package/esm2020/lib/metadata/index.mjs +2 -2
- package/esm2020/lib/metadata/metadata-button/index.mjs +2 -2
- package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +134 -134
- package/esm2020/lib/metadata/metadata.module.mjs +54 -54
- package/esm2020/lib/metadata/shared/index.mjs +3 -3
- package/esm2020/lib/metadata/shared/metadata.interface.mjs +1 -1
- package/esm2020/lib/metadata/shared/metadata.service.mjs +19 -19
- package/esm2020/lib/offline/geoDB/configFileToGeoDB.service.mjs +104 -104
- package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +5 -5
- package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +1 -1
- package/esm2020/lib/offline/geoDB/geoDB.service.mjs +166 -166
- package/esm2020/lib/offline/geoDB/index.mjs +5 -5
- package/esm2020/lib/offline/index.mjs +2 -2
- package/esm2020/lib/offline/shared/geo-network.service.mjs +65 -65
- package/esm2020/lib/offline/shared/index.mjs +2 -2
- package/esm2020/lib/overlay/index.mjs +2 -2
- package/esm2020/lib/overlay/overlay.module.mjs +22 -22
- package/esm2020/lib/overlay/shared/index.mjs +6 -6
- package/esm2020/lib/overlay/shared/overlay-marker-style.utils.mjs +68 -68
- package/esm2020/lib/overlay/shared/overlay.directive.mjs +32 -32
- package/esm2020/lib/overlay/shared/overlay.enum.mjs +7 -7
- package/esm2020/lib/overlay/shared/overlay.mjs +129 -129
- package/esm2020/lib/overlay/shared/overlay.service.mjs +26 -26
- package/esm2020/lib/overlay/shared/overlay.utils.mjs +102 -102
- package/esm2020/lib/print/index.mjs +4 -4
- package/esm2020/lib/print/print/print.component.mjs +125 -125
- package/esm2020/lib/print/print-form/index.mjs +2 -2
- package/esm2020/lib/print/print-form/print-form.component.mjs +427 -427
- package/esm2020/lib/print/print.module.mjs +64 -64
- package/esm2020/lib/print/shared/geopdf.mjs +57 -57
- package/esm2020/lib/print/shared/index.mjs +5 -5
- package/esm2020/lib/print/shared/print.interface.mjs +1 -1
- package/esm2020/lib/print/shared/print.service.mjs +933 -933
- package/esm2020/lib/print/shared/print.type.mjs +29 -29
- package/esm2020/lib/query/index.mjs +2 -2
- package/esm2020/lib/query/query.module.mjs +28 -28
- package/esm2020/lib/query/shared/index.mjs +7 -7
- package/esm2020/lib/query/shared/query-search-source.mjs +34 -34
- package/esm2020/lib/query/shared/query-search-source.providers.mjs +21 -21
- package/esm2020/lib/query/shared/query.directive.mjs +260 -260
- package/esm2020/lib/query/shared/query.enums.mjs +30 -30
- package/esm2020/lib/query/shared/query.interfaces.mjs +1 -1
- package/esm2020/lib/query/shared/query.service.mjs +732 -732
- package/esm2020/lib/query/shared/query.utils.mjs +36 -36
- package/esm2020/lib/search/index.mjs +11 -11
- package/esm2020/lib/search/search-bar/search-bar.component.mjs +511 -511
- package/esm2020/lib/search/search-bar/search-bar.module.mjs +74 -74
- package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +34 -34
- package/esm2020/lib/search/search-results/save-feature-dialog.component.mjs +117 -117
- package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +370 -370
- package/esm2020/lib/search/search-results/search-results-item.component.mjs +123 -123
- package/esm2020/lib/search/search-results/search-results.component.mjs +339 -339
- package/esm2020/lib/search/search-results/search-results.module.mjs +103 -103
- package/esm2020/lib/search/search-selector/search-selector.component.mjs +122 -122
- package/esm2020/lib/search/search-selector/search-selector.module.mjs +55 -55
- package/esm2020/lib/search/search-settings/search-settings.component.mjs +441 -441
- package/esm2020/lib/search/search-settings/search-settings.module.mjs +59 -59
- package/esm2020/lib/search/search.module.mjs +66 -66
- package/esm2020/lib/search/shared/index.mjs +9 -9
- package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +321 -321
- package/esm2020/lib/search/shared/search-source-service.providers.mjs +19 -19
- package/esm2020/lib/search/shared/search-source.service.mjs +46 -46
- package/esm2020/lib/search/shared/search.enums.mjs +3 -3
- package/esm2020/lib/search/shared/search.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/search.service.mjs +120 -120
- package/esm2020/lib/search/shared/search.utils.mjs +90 -90
- package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/coordinates.mjs +153 -153
- package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +39 -39
- package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/icherche.mjs +767 -767
- package/esm2020/lib/search/shared/sources/icherche.providers.mjs +65 -65
- package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/ilayer.mjs +320 -320
- package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +39 -39
- package/esm2020/lib/search/shared/sources/index.mjs +17 -17
- package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +2 -2
- package/esm2020/lib/search/shared/sources/nominatim.mjs +252 -252
- package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +22 -22
- package/esm2020/lib/search/shared/sources/source.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/source.mjs +178 -178
- package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +1 -1
- package/esm2020/lib/search/shared/sources/storedqueries.mjs +425 -425
- package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +40 -40
- package/esm2020/lib/toast/index.mjs +2 -2
- package/esm2020/lib/toast/toast.component.mjs +112 -112
- package/esm2020/lib/toast/toast.module.mjs +44 -44
- package/esm2020/lib/utils/commonVectorStyle.interface.mjs +1 -1
- package/esm2020/lib/utils/commonVectorStyle.mjs +74 -74
- package/esm2020/lib/utils/googleLinks.mjs +12 -12
- package/esm2020/lib/utils/id-generator.mjs +109 -109
- package/esm2020/lib/utils/index.mjs +5 -5
- package/esm2020/lib/utils/osmLinks.mjs +9 -9
- package/esm2020/lib/wkt/index.mjs +2 -2
- package/esm2020/lib/wkt/shared/index.mjs +2 -2
- package/esm2020/lib/wkt/shared/wkt.service.mjs +224 -224
- package/esm2020/lib/wkt/wkt.module.mjs +21 -21
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +47 -47
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +35 -35
- package/esm2020/lib/workspace/confirmation-popup/index.mjs +2 -2
- package/esm2020/lib/workspace/index.mjs +8 -8
- package/esm2020/lib/workspace/shared/edition-workspace.mjs +279 -279
- package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +656 -656
- package/esm2020/lib/workspace/shared/feature-workspace.mjs +34 -34
- package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +149 -149
- package/esm2020/lib/workspace/shared/index.mjs +8 -8
- package/esm2020/lib/workspace/shared/wfs-workspace.mjs +34 -34
- package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +149 -149
- package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +259 -259
- package/esm2020/lib/workspace/shared/workspace.utils.mjs +23 -23
- package/esm2020/lib/workspace/widgets/index.mjs +4 -4
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +46 -46
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +35 -35
- package/esm2020/lib/workspace/widgets/widgets.mjs +15 -15
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +132 -132
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +27 -27
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +112 -112
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +27 -27
- package/esm2020/lib/workspace/workspace.module.mjs +61 -61
- package/esm2020/public_api.mjs +54 -54
- package/fesm2015/igo2-geo.mjs +44992 -44987
- package/fesm2015/igo2-geo.mjs.map +1 -1
- package/fesm2020/igo2-geo.mjs +43034 -43029
- package/fesm2020/igo2-geo.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +126 -126
- package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +80 -80
- package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +105 -105
- package/lib/catalog/catalog-browser/catalog-browser.module.d.ts +22 -22
- package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +45 -45
- package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +25 -25
- package/lib/catalog/catalog-library/catalog-library.component.d.ts +65 -65
- package/lib/catalog/catalog-library/catalog-library.module.d.ts +26 -26
- package/lib/catalog/catalog.module.d.ts +14 -14
- package/lib/catalog/index.d.ts +4 -4
- package/lib/catalog/shared/catalog.abstract.d.ts +50 -50
- package/lib/catalog/shared/catalog.enum.d.ts +14 -14
- package/lib/catalog/shared/catalog.interface.d.ts +66 -66
- package/lib/catalog/shared/catalog.service.d.ts +36 -36
- package/lib/catalog/shared/index.d.ts +4 -4
- package/lib/datasource/datasource.module.d.ts +8 -8
- package/lib/datasource/index.d.ts +2 -2
- package/lib/datasource/shared/capabilities.service.d.ts +37 -37
- package/lib/datasource/shared/datasource.service.d.ts +37 -37
- package/lib/datasource/shared/datasources/any-datasource.d.ts +16 -16
- package/lib/datasource/shared/datasources/any-datasource.interface.d.ts +15 -15
- package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +14 -14
- package/lib/datasource/shared/datasources/arcgisrest-datasource.interface.d.ts +14 -14
- package/lib/datasource/shared/datasources/carto-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/carto-datasource.interface.d.ts +13 -13
- package/lib/datasource/shared/datasources/cluster-datasource.d.ts +10 -10
- package/lib/datasource/shared/datasources/cluster-datasource.interface.d.ts +11 -11
- package/lib/datasource/shared/datasources/data.service.d.ts +3 -3
- package/lib/datasource/shared/datasources/datasource.d.ts +20 -20
- package/lib/datasource/shared/datasources/datasource.interface.d.ts +100 -100
- package/lib/datasource/shared/datasources/feature-datasource.d.ts +12 -12
- package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +18 -18
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.d.ts +15 -15
- package/lib/datasource/shared/datasources/index.d.ts +35 -35
- package/lib/datasource/shared/datasources/mvt-datasource.d.ts +10 -10
- package/lib/datasource/shared/datasources/mvt-datasource.interface.d.ts +13 -13
- package/lib/datasource/shared/datasources/osm-datasource.d.ts +9 -9
- package/lib/datasource/shared/datasources/osm-datasource.interface.d.ts +7 -7
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.d.ts +14 -14
- package/lib/datasource/shared/datasources/tiledebug-datasource.d.ts +9 -9
- package/lib/datasource/shared/datasources/tiledebug-datasource.interface.d.ts +9 -9
- package/lib/datasource/shared/datasources/websocket-datasource.d.ts +15 -15
- package/lib/datasource/shared/datasources/websocket-datasource.interface.d.ts +7 -7
- package/lib/datasource/shared/datasources/wfs-datasource.d.ts +20 -20
- package/lib/datasource/shared/datasources/wfs-datasource.interface.d.ts +20 -20
- package/lib/datasource/shared/datasources/wfs.service.d.ts +17 -17
- package/lib/datasource/shared/datasources/wms-datasource.d.ts +31 -31
- package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +32 -32
- package/lib/datasource/shared/datasources/wms-wfs.utils.d.ts +41 -41
- package/lib/datasource/shared/datasources/wmts-datasource.d.ts +10 -10
- package/lib/datasource/shared/datasources/wmts-datasource.interface.d.ts +13 -13
- package/lib/datasource/shared/datasources/xyz-datasource.d.ts +9 -9
- package/lib/datasource/shared/datasources/xyz-datasource.interface.d.ts +11 -11
- package/lib/datasource/shared/index.d.ts +4 -4
- package/lib/datasource/shared/options/index.d.ts +4 -4
- package/lib/datasource/shared/options/options-api.interface.d.ts +4 -4
- package/lib/datasource/shared/options/options-api.providers.d.ts +10 -10
- package/lib/datasource/shared/options/options-api.service.d.ts +16 -16
- package/lib/datasource/shared/options/options.service.d.ts +6 -6
- package/lib/datasource/utils/esri-style-generator.d.ts +21 -21
- package/lib/datasource/utils/index.d.ts +2 -2
- package/lib/datasource/utils/tilegrid.d.ts +2 -2
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +30 -30
- package/lib/directions/directions-buttons/index.d.ts +1 -1
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +45 -45
- package/lib/directions/directions-inputs/index.d.ts +1 -1
- package/lib/directions/directions-results/directions-results.component.d.ts +30 -30
- package/lib/directions/directions-results/index.d.ts +1 -1
- package/lib/directions/directions-sources/directions-source.d.ts +7 -7
- package/lib/directions/directions-sources/directions-source.interface.d.ts +11 -11
- package/lib/directions/directions-sources/directions-source.provider.d.ts +11 -11
- package/lib/directions/directions-sources/index.d.ts +4 -4
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +23 -23
- package/lib/directions/directions.component.d.ts +56 -56
- package/lib/directions/directions.module.d.ts +26 -26
- package/lib/directions/index.d.ts +6 -6
- package/lib/directions/shared/directions-source.service.d.ts +11 -11
- package/lib/directions/shared/directions.enum.d.ts +22 -22
- package/lib/directions/shared/directions.interface.d.ts +126 -126
- package/lib/directions/shared/directions.service.d.ts +13 -13
- package/lib/directions/shared/directions.utils.d.ts +42 -42
- package/lib/directions/shared/index.d.ts +5 -5
- package/lib/directions/shared/store.d.ts +18 -18
- package/lib/download/download-button/download-button.component.d.ts +18 -18
- package/lib/download/download-button/index.d.ts +1 -1
- package/lib/download/download.module.d.ts +14 -14
- package/lib/download/index.d.ts +2 -2
- package/lib/download/shared/download.interface.d.ts +10 -10
- package/lib/download/shared/download.service.d.ts +11 -11
- package/lib/download/shared/index.d.ts +2 -2
- package/lib/draw/draw/draw-layer-popup.component.d.ts +14 -14
- package/lib/draw/draw/draw-popup.component.d.ts +63 -63
- package/lib/draw/draw/draw-shorcuts.component.d.ts +5 -5
- package/lib/draw/draw/draw.component.d.ts +239 -239
- package/lib/draw/draw/draw.module.d.ts +34 -34
- package/lib/draw/drawingTool.module.d.ts +7 -7
- package/lib/draw/index.d.ts +2 -2
- package/lib/draw/shared/draw-icon.service.d.ts +12 -12
- package/lib/draw/shared/draw-style.service.d.ts +36 -36
- package/lib/draw/shared/draw.enum.d.ts +32 -32
- package/lib/draw/shared/draw.interface.d.ts +40 -40
- package/lib/draw/shared/draw.utils.d.ts +35 -35
- package/lib/draw/shared/index.d.ts +5 -5
- package/lib/feature/feature-details/feature-details.component.d.ts +60 -60
- package/lib/feature/feature-details/feature-details.directive.d.ts +19 -19
- package/lib/feature/feature-details/feature-details.module.d.ts +15 -15
- package/lib/feature/feature-form/feature-form.component.d.ts +50 -50
- package/lib/feature/feature-form/feature-form.module.d.ts +12 -12
- package/lib/feature/feature.module.d.ts +9 -9
- package/lib/feature/index.d.ts +3 -3
- package/lib/feature/shared/feature.enums.d.ts +7 -7
- package/lib/feature/shared/feature.interfaces.d.ts +74 -74
- package/lib/feature/shared/feature.utils.d.ts +104 -104
- package/lib/feature/shared/index.d.ts +6 -6
- package/lib/feature/shared/store.d.ts +71 -71
- package/lib/feature/shared/strategies/in-map-extent.d.ts +52 -52
- package/lib/feature/shared/strategies/in-map-resolution.d.ts +52 -52
- package/lib/feature/shared/strategies/index.d.ts +5 -5
- package/lib/feature/shared/strategies/loading-layer.d.ts +59 -59
- package/lib/feature/shared/strategies/loading.d.ts +75 -75
- package/lib/feature/shared/strategies/selection.d.ts +176 -176
- package/lib/feature/shared/strategies.utils.d.ts +17 -17
- package/lib/filter/filter.module.d.ts +53 -53
- package/lib/filter/index.d.ts +15 -15
- package/lib/filter/ogc-filter-button/index.d.ts +1 -1
- package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +20 -20
- package/lib/filter/ogc-filter-form/index.d.ts +1 -1
- package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +65 -65
- package/lib/filter/ogc-filter-selection/index.d.ts +1 -1
- package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +93 -93
- package/lib/filter/ogc-filter-time/index.d.ts +2 -2
- package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +39 -39
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +86 -86
- package/lib/filter/ogc-filterable-form/index.d.ts +1 -1
- package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +15 -15
- package/lib/filter/ogc-filterable-item/index.d.ts +1 -1
- package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +41 -41
- package/lib/filter/ogc-filterable-list/index.d.ts +2 -2
- package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +14 -14
- package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +10 -10
- package/lib/filter/shared/filterable-datasource.pipe.d.ts +10 -10
- package/lib/filter/shared/index.d.ts +11 -11
- package/lib/filter/shared/ogc-filter-time.service.d.ts +19 -19
- package/lib/filter/shared/ogc-filter.d.ts +29 -29
- package/lib/filter/shared/ogc-filter.enum.d.ts +27 -27
- package/lib/filter/shared/ogc-filter.interface.d.ts +200 -200
- package/lib/filter/shared/ogc-filter.service.d.ts +11 -11
- package/lib/filter/shared/spatial-filter.enum.d.ts +19 -19
- package/lib/filter/shared/spatial-filter.interface.d.ts +10 -10
- package/lib/filter/shared/spatial-filter.service.d.ts +37 -37
- package/lib/filter/shared/time-filter.enum.d.ts +10 -10
- package/lib/filter/shared/time-filter.interface.d.ts +29 -29
- package/lib/filter/shared/time-filter.service.d.ts +11 -11
- package/lib/filter/spatial-filter/spatial-filter-item/index.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +166 -166
- package/lib/filter/spatial-filter/spatial-filter-list/index.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +58 -58
- package/lib/filter/spatial-filter/spatial-filter-type/index.d.ts +1 -1
- package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +45 -45
- package/lib/filter/time-filter-button/index.d.ts +1 -1
- package/lib/filter/time-filter-button/time-filter-button.component.d.ts +20 -20
- package/lib/filter/time-filter-form/index.d.ts +1 -1
- package/lib/filter/time-filter-form/time-filter-form.component.d.ts +77 -77
- package/lib/filter/time-filter-item/index.d.ts +1 -1
- package/lib/filter/time-filter-item/time-filter-item.component.d.ts +28 -28
- package/lib/filter/time-filter-list/index.d.ts +2 -2
- package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +14 -14
- package/lib/filter/time-filter-list/time-filter-list.component.d.ts +12 -12
- package/lib/geo.module.d.ts +28 -28
- package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +206 -206
- package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +88 -88
- package/lib/geometry/geometry-form-field/geometry-form-field.module.d.ts +19 -19
- package/lib/geometry/geometry.module.d.ts +8 -8
- package/lib/geometry/index.d.ts +3 -3
- package/lib/geometry/shared/controls/draw.d.ts +150 -150
- package/lib/geometry/shared/controls/index.d.ts +3 -3
- package/lib/geometry/shared/controls/modify.d.ts +228 -228
- package/lib/geometry/shared/controls/slice.d.ts +99 -99
- package/lib/geometry/shared/geometry.errors.d.ts +11 -11
- package/lib/geometry/shared/geometry.interfaces.d.ts +13 -13
- package/lib/geometry/shared/geometry.utils.d.ts +45 -45
- package/lib/geometry/shared/index.d.ts +4 -4
- package/lib/import-export/export-button/export-button.component.d.ts +16 -16
- package/lib/import-export/export-button/index.d.ts +1 -1
- package/lib/import-export/import-export/import-export.component.d.ts +104 -104
- package/lib/import-export/import-export/index.d.ts +1 -1
- package/lib/import-export/import-export.module.d.ts +26 -26
- package/lib/import-export/index.d.ts +4 -4
- package/lib/import-export/shared/drop-geo-file.directive.d.ts +36 -36
- package/lib/import-export/shared/export.errors.d.ts +8 -8
- package/lib/import-export/shared/export.interface.d.ts +11 -11
- package/lib/import-export/shared/export.service.d.ts +30 -30
- package/lib/import-export/shared/export.type.d.ts +16 -16
- package/lib/import-export/shared/export.utils.d.ts +19 -19
- package/lib/import-export/shared/import.errors.d.ts +20 -20
- package/lib/import-export/shared/import.interface.d.ts +8 -8
- package/lib/import-export/shared/import.service.d.ts +31 -31
- package/lib/import-export/shared/import.utils.d.ts +18 -18
- package/lib/import-export/shared/index.d.ts +10 -10
- package/lib/import-export/style-list/index.d.ts +4 -4
- package/lib/import-export/style-list/style-list.interface.d.ts +6 -6
- package/lib/import-export/style-list/style-list.module.d.ts +8 -8
- package/lib/import-export/style-list/style-list.provider.d.ts +15 -15
- package/lib/import-export/style-list/style-list.service.d.ts +18 -18
- package/lib/layer/index.d.ts +10 -10
- package/lib/layer/layer-item/index.d.ts +1 -1
- package/lib/layer/layer-item/layer-item.component.d.ts +62 -62
- package/lib/layer/layer-legend/index.d.ts +1 -1
- package/lib/layer/layer-legend/layer-legend.component.d.ts +90 -90
- package/lib/layer/layer-legend-item/index.d.ts +1 -1
- package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +22 -22
- package/lib/layer/layer-legend-list/index.d.ts +2 -2
- package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +16 -16
- package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +31 -31
- package/lib/layer/layer-list/index.d.ts +3 -3
- package/lib/layer/layer-list/layer-list-binding.directive.d.ts +19 -19
- package/lib/layer/layer-list/layer-list.component.d.ts +127 -127
- package/lib/layer/layer-list/layer-list.enum.d.ts +15 -15
- package/lib/layer/layer-list-tool/index.d.ts +4 -4
- package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +32 -32
- package/lib/layer/layer-list-tool/layer-list-tool.enum.d.ts +5 -5
- package/lib/layer/layer-list-tool/layer-list-tool.interface.d.ts +8 -8
- package/lib/layer/layer-list-tool/layer-list-tool.service.d.ts +14 -14
- package/lib/layer/layer.module.d.ts +36 -36
- package/lib/layer/shared/clusterParam.d.ts +13 -13
- package/lib/layer/shared/index.d.ts +6 -6
- package/lib/layer/shared/layer.enums.d.ts +1 -1
- package/lib/layer/shared/layer.service.d.ts +30 -30
- package/lib/layer/shared/layers/any-layer.d.ts +6 -6
- package/lib/layer/shared/layers/any-layer.interface.d.ts +6 -6
- package/lib/layer/shared/layers/image-layer.d.ts +22 -22
- package/lib/layer/shared/layers/image-layer.interface.d.ts +19 -19
- package/lib/layer/shared/layers/index.d.ts +12 -12
- package/lib/layer/shared/layers/layer.d.ts +62 -62
- package/lib/layer/shared/layers/layer.interface.d.ts +109 -109
- package/lib/layer/shared/layers/tile-layer.d.ts +31 -31
- package/lib/layer/shared/layers/tile-layer.interface.d.ts +20 -20
- package/lib/layer/shared/layers/vector-layer.d.ts +78 -78
- package/lib/layer/shared/layers/vector-layer.interface.d.ts +41 -41
- package/lib/layer/shared/layers/vectortile-layer.d.ts +28 -28
- package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +18 -18
- package/lib/layer/shared/style.service.d.ts +57 -57
- package/lib/layer/shared/vector-style.interface.d.ts +38 -38
- package/lib/layer/style-modal/index.d.ts +1 -1
- package/lib/layer/style-modal/style-modal.component.d.ts +42 -42
- package/lib/layer/track-feature-button/index.d.ts +1 -1
- package/lib/layer/track-feature-button/track-feature-button.component.d.ts +15 -15
- package/lib/layer/utils/image-watcher.d.ts +17 -17
- package/lib/layer/utils/index.d.ts +5 -5
- package/lib/layer/utils/layer.utils.d.ts +2 -2
- package/lib/layer/utils/outputLegend.d.ts +7 -7
- package/lib/layer/utils/tile-watcher.d.ts +14 -14
- package/lib/layer/utils/vector-watcher.d.ts +13 -13
- package/lib/map/baselayers-switcher/baselayers-switcher.animation.d.ts +2 -2
- package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +21 -21
- package/lib/map/baselayers-switcher/index.d.ts +2 -2
- package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +29 -29
- package/lib/map/geolocate-button/geolocate-button.component.d.ts +22 -22
- package/lib/map/geolocate-button/index.d.ts +1 -1
- package/lib/map/home-extent-button/home-extent-button.component.d.ts +20 -20
- package/lib/map/home-extent-button/index.d.ts +1 -1
- package/lib/map/index.d.ts +13 -13
- package/lib/map/info-section/index.d.ts +1 -1
- package/lib/map/info-section/info-section.component.d.ts +7 -7
- package/lib/map/map-browser/index.d.ts +1 -1
- package/lib/map/map-browser/map-browser.component.d.ts +25 -25
- package/lib/map/map-center/index.d.ts +1 -1
- package/lib/map/map-center/map-center.component.d.ts +31 -31
- package/lib/map/map.module.d.ts +28 -28
- package/lib/map/menu-button/index.d.ts +1 -1
- package/lib/map/menu-button/menu-button.component.d.ts +17 -17
- package/lib/map/offline-button/index.d.ts +1 -1
- package/lib/map/offline-button/offline-button.component.d.ts +23 -23
- package/lib/map/rotation-button/index.d.ts +1 -1
- package/lib/map/rotation-button/rotation-button.component.d.ts +17 -17
- package/lib/map/shared/controllers/controller.d.ts +29 -29
- package/lib/map/shared/controllers/geolocation.d.ts +112 -112
- package/lib/map/shared/controllers/index.d.ts +3 -3
- package/lib/map/shared/controllers/view.d.ts +200 -200
- package/lib/map/shared/hover-feature.directive.d.ts +132 -132
- package/lib/map/shared/index.d.ts +13 -13
- package/lib/map/shared/linkedLayers.utils.d.ts +17 -17
- package/lib/map/shared/map-pointer-position.directive.d.ts +71 -71
- package/lib/map/shared/map.d.ts +135 -135
- package/lib/map/shared/map.enums.d.ts +4 -4
- package/lib/map/shared/map.interface.d.ts +57 -57
- package/lib/map/shared/map.service.d.ts +19 -19
- package/lib/map/shared/map.utils.d.ts +90 -90
- package/lib/map/shared/mapOffline.directive.d.ts +21 -21
- package/lib/map/shared/projection.interfaces.d.ts +29 -29
- package/lib/map/shared/projection.service.d.ts +19 -19
- package/lib/map/shared/projection.utils.d.ts +19 -19
- package/lib/map/swipe-control/index.d.ts +1 -1
- package/lib/map/swipe-control/swipe-control.component.d.ts +97 -97
- package/lib/map/utils/layer-watcher.d.ts +20 -20
- package/lib/map/wake-lock-button/index.d.ts +1 -1
- package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +30 -30
- package/lib/map/zoom-button/index.d.ts +1 -1
- package/lib/map/zoom-button/zoom-button.component.d.ts +12 -12
- package/lib/measure/index.d.ts +3 -3
- package/lib/measure/measure.module.d.ts +7 -7
- package/lib/measure/measurer/measure-format.pipe.d.ts +15 -15
- package/lib/measure/measurer/measurer-dialog.component.d.ts +14 -14
- package/lib/measure/measurer/measurer-item.component.d.ts +66 -66
- package/lib/measure/measurer/measurer.component.d.ts +405 -405
- package/lib/measure/measurer/measurer.module.d.ts +25 -25
- package/lib/measure/shared/index.d.ts +3 -3
- package/lib/measure/shared/measure.enum.d.ts +33 -33
- package/lib/measure/shared/measure.interfaces.d.ts +21 -21
- package/lib/measure/shared/measure.utils.d.ts +180 -180
- package/lib/metadata/index.d.ts +2 -2
- package/lib/metadata/metadata-button/index.d.ts +1 -1
- package/lib/metadata/metadata-button/metadata-button.component.d.ts +26 -26
- package/lib/metadata/metadata.module.d.ts +15 -15
- package/lib/metadata/shared/index.d.ts +2 -2
- package/lib/metadata/shared/metadata.interface.d.ts +13 -13
- package/lib/metadata/shared/metadata.service.d.ts +8 -8
- package/lib/offline/geoDB/configFileToGeoDB.service.d.ts +14 -14
- package/lib/offline/geoDB/geoDB.enums.d.ts +4 -4
- package/lib/offline/geoDB/geoDB.interface.d.ts +19 -19
- package/lib/offline/geoDB/geoDB.service.d.ts +37 -37
- package/lib/offline/geoDB/index.d.ts +4 -4
- package/lib/offline/index.d.ts +2 -2
- package/lib/offline/shared/geo-network.service.d.ts +28 -28
- package/lib/offline/shared/index.d.ts +1 -1
- package/lib/overlay/index.d.ts +1 -1
- package/lib/overlay/overlay.module.d.ts +9 -9
- package/lib/overlay/shared/index.d.ts +6 -6
- package/lib/overlay/shared/overlay-marker-style.utils.d.ts +11 -11
- package/lib/overlay/shared/overlay.d.ts +81 -81
- package/lib/overlay/shared/overlay.directive.d.ts +18 -18
- package/lib/overlay/shared/overlay.enum.d.ts +6 -6
- package/lib/overlay/shared/overlay.service.d.ts +14 -14
- package/lib/overlay/shared/overlay.utils.d.ts +17 -17
- package/lib/print/index.d.ts +3 -3
- package/lib/print/print/print.component.d.ts +35 -35
- package/lib/print/print-form/index.d.ts +1 -1
- package/lib/print/print-form/print-form.component.d.ts +97 -97
- package/lib/print/print.module.d.ts +19 -19
- package/lib/print/shared/geopdf.d.ts +1 -1
- package/lib/print/shared/index.d.ts +4 -4
- package/lib/print/shared/print.interface.d.ts +22 -22
- package/lib/print/shared/print.service.d.ts +168 -168
- package/lib/print/shared/print.type.d.ts +45 -45
- package/lib/query/index.d.ts +1 -1
- package/lib/query/query.module.d.ts +11 -11
- package/lib/query/shared/index.d.ts +6 -6
- package/lib/query/shared/query-search-source.d.ts +17 -17
- package/lib/query/shared/query-search-source.providers.d.ts +17 -17
- package/lib/query/shared/query.directive.d.ts +105 -105
- package/lib/query/shared/query.enums.d.ts +26 -26
- package/lib/query/shared/query.interfaces.d.ts +35 -35
- package/lib/query/shared/query.service.d.ts +56 -56
- package/lib/query/shared/query.utils.d.ts +27 -27
- package/lib/search/index.d.ts +11 -11
- package/lib/search/search-bar/search-bar.component.d.ts +230 -230
- package/lib/search/search-bar/search-bar.module.d.ts +23 -23
- package/lib/search/search-bar/search-url-param.directive.d.ts +13 -13
- package/lib/search/search-results/save-feature-dialog.component.d.ts +32 -32
- package/lib/search/search-results/search-results-add-button.component.d.ts +76 -76
- package/lib/search/search-results/search-results-item.component.d.ts +47 -47
- package/lib/search/search-results/search-results.component.d.ts +161 -161
- package/lib/search/search-results/search-results.module.d.ts +28 -28
- package/lib/search/search-selector/search-selector.component.d.ts +58 -58
- package/lib/search/search-selector/search-selector.module.d.ts +19 -19
- package/lib/search/search-settings/search-settings.component.d.ts +102 -102
- package/lib/search/search-settings/search-settings.module.d.ts +20 -20
- package/lib/search/search.module.d.ts +14 -14
- package/lib/search/shared/index.d.ts +8 -8
- package/lib/search/shared/search-pointer-summary.directive.d.ts +133 -133
- package/lib/search/shared/search-source-service.providers.d.ts +15 -15
- package/lib/search/shared/search-source.service.d.ts +32 -32
- package/lib/search/shared/search.enums.d.ts +1 -1
- package/lib/search/shared/search.interfaces.d.ts +29 -29
- package/lib/search/shared/search.service.d.ts +53 -53
- package/lib/search/shared/search.utils.d.ts +39 -39
- package/lib/search/shared/sources/coordinates.d.ts +40 -40
- package/lib/search/shared/sources/coordinates.interfaces.d.ts +12 -12
- package/lib/search/shared/sources/coordinates.providers.d.ts +31 -31
- package/lib/search/shared/sources/icherche.d.ts +96 -96
- package/lib/search/shared/sources/icherche.interfaces.d.ts +30 -30
- package/lib/search/shared/sources/icherche.providers.d.ts +46 -46
- package/lib/search/shared/sources/ilayer.d.ts +55 -55
- package/lib/search/shared/sources/ilayer.interfaces.d.ts +47 -47
- package/lib/search/shared/sources/ilayer.providers.d.ts +31 -31
- package/lib/search/shared/sources/index.d.ts +17 -17
- package/lib/search/shared/sources/nominatim.d.ts +45 -45
- package/lib/search/shared/sources/nominatim.interfaces.d.ts +10 -10
- package/lib/search/shared/sources/nominatim.providers.d.ts +18 -18
- package/lib/search/shared/sources/source.d.ts +108 -108
- package/lib/search/shared/sources/source.interfaces.d.ts +47 -47
- package/lib/search/shared/sources/storedqueries.d.ts +73 -73
- package/lib/search/shared/sources/storedqueries.interfaces.d.ts +42 -42
- package/lib/search/shared/sources/storedqueries.providers.d.ts +32 -32
- package/lib/toast/index.d.ts +1 -1
- package/lib/toast/toast.component.d.ts +33 -33
- package/lib/toast/toast.module.d.ts +14 -14
- package/lib/utils/commonVectorStyle.d.ts +14 -14
- package/lib/utils/commonVectorStyle.interface.d.ts +16 -16
- package/lib/utils/googleLinks.d.ts +5 -5
- package/lib/utils/id-generator.d.ts +54 -54
- package/lib/utils/index.d.ts +5 -5
- package/lib/utils/osmLinks.d.ts +4 -4
- package/lib/wkt/index.d.ts +1 -1
- package/lib/wkt/shared/index.d.ts +1 -1
- package/lib/wkt/shared/wkt.service.d.ts +19 -19
- package/lib/wkt/wkt.module.d.ts +8 -8
- package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +23 -23
- package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +14 -14
- package/lib/workspace/confirmation-popup/index.d.ts +2 -2
- package/lib/workspace/index.d.ts +7 -7
- package/lib/workspace/shared/edition-workspace.d.ts +82 -82
- package/lib/workspace/shared/edition-workspace.service.d.ts +52 -52
- package/lib/workspace/shared/feature-workspace.d.ts +18 -18
- package/lib/workspace/shared/feature-workspace.service.d.ts +19 -19
- package/lib/workspace/shared/index.d.ts +7 -7
- package/lib/workspace/shared/wfs-workspace.d.ts +18 -18
- package/lib/workspace/shared/wfs-workspace.service.d.ts +19 -19
- package/lib/workspace/shared/wms-workspace.service.d.ts +22 -22
- package/lib/workspace/shared/workspace.utils.d.ts +10 -10
- package/lib/workspace/widgets/index.d.ts +3 -3
- package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +29 -29
- package/lib/workspace/widgets/ogc-filter/ogc-filter.module.d.ts +14 -14
- package/lib/workspace/widgets/widgets.d.ts +9 -9
- package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +32 -32
- package/lib/workspace/workspace-selector/workspace-selector.module.d.ts +11 -11
- package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +26 -26
- package/lib/workspace/workspace-updator/workspace-updator.module.d.ts +11 -11
- package/lib/workspace/workspace.module.d.ts +14 -14
- package/package.json +4 -4
- package/public_api.d.ts +51 -51
|
@@ -1,692 +1,692 @@
|
|
|
1
|
-
import * as olfilter from 'ol/format/filter';
|
|
2
|
-
import olFormatWKT from 'ol/format/WKT';
|
|
3
|
-
import olFormatWFS from 'ol/format/WFS';
|
|
4
|
-
import { uuid, ObjectUtils } from '@igo2/utils';
|
|
5
|
-
import { OgcFilterOperatorType, OgcFilterOperator } from './ogc-filter.enum';
|
|
6
|
-
import { default as moment } from 'moment';
|
|
7
|
-
export class OgcFilterWriter {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.filterSequence = [];
|
|
10
|
-
this.operators = {
|
|
11
|
-
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
12
|
-
spatial: false,
|
|
13
|
-
fieldRestrict: []
|
|
14
|
-
},
|
|
15
|
-
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
16
|
-
spatial: false,
|
|
17
|
-
fieldRestrict: []
|
|
18
|
-
},
|
|
19
|
-
[OgcFilterOperator.PropertyIsLike]: {
|
|
20
|
-
spatial: false,
|
|
21
|
-
fieldRestrict: ['string']
|
|
22
|
-
},
|
|
23
|
-
[OgcFilterOperator.PropertyIsGreaterThan]: {
|
|
24
|
-
spatial: false,
|
|
25
|
-
fieldRestrict: ['number']
|
|
26
|
-
},
|
|
27
|
-
[OgcFilterOperator.PropertyIsGreaterThanOrEqualTo]: {
|
|
28
|
-
spatial: false,
|
|
29
|
-
fieldRestrict: ['number']
|
|
30
|
-
},
|
|
31
|
-
[OgcFilterOperator.PropertyIsLessThan]: {
|
|
32
|
-
spatial: false,
|
|
33
|
-
fieldRestrict: ['number']
|
|
34
|
-
},
|
|
35
|
-
[OgcFilterOperator.PropertyIsLessThanOrEqualTo]: {
|
|
36
|
-
spatial: false,
|
|
37
|
-
fieldRestrict: ['number']
|
|
38
|
-
},
|
|
39
|
-
[OgcFilterOperator.PropertyIsBetween]: {
|
|
40
|
-
spatial: false,
|
|
41
|
-
fieldRestrict: ['number']
|
|
42
|
-
},
|
|
43
|
-
[OgcFilterOperator.During]: { spatial: false, fieldRestrict: [] },
|
|
44
|
-
[OgcFilterOperator.PropertyIsNull]: {
|
|
45
|
-
spatial: false,
|
|
46
|
-
fieldRestrict: []
|
|
47
|
-
},
|
|
48
|
-
[OgcFilterOperator.Intersects]: {
|
|
49
|
-
spatial: true,
|
|
50
|
-
fieldRestrict: []
|
|
51
|
-
},
|
|
52
|
-
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] },
|
|
53
|
-
[OgcFilterOperator.Contains]: { spatial: true, fieldRestrict: [] }
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
defineOgcFiltersDefaultOptions(ogcFiltersOptions, fieldNameGeometry, srcType) {
|
|
57
|
-
let ogcFiltersDefaultValue = true; // default values for wfs.
|
|
58
|
-
if (srcType && srcType === 'wms') {
|
|
59
|
-
ogcFiltersDefaultValue = false;
|
|
60
|
-
}
|
|
61
|
-
ogcFiltersOptions = ogcFiltersOptions || {};
|
|
62
|
-
ogcFiltersOptions.enabled =
|
|
63
|
-
ogcFiltersOptions.enabled === undefined
|
|
64
|
-
? ogcFiltersDefaultValue
|
|
65
|
-
: ogcFiltersOptions.enabled;
|
|
66
|
-
ogcFiltersOptions.editable =
|
|
67
|
-
ogcFiltersOptions.editable === undefined
|
|
68
|
-
? ogcFiltersDefaultValue
|
|
69
|
-
: ogcFiltersOptions.editable;
|
|
70
|
-
ogcFiltersOptions.geometryName = fieldNameGeometry;
|
|
71
|
-
ogcFiltersOptions.advancedOgcFilters = true;
|
|
72
|
-
if (ogcFiltersOptions.enabled && (ogcFiltersOptions.pushButtons || ogcFiltersOptions.checkboxes
|
|
73
|
-
|| ogcFiltersOptions.radioButtons || ogcFiltersOptions.select || ogcFiltersOptions.autocomplete)) {
|
|
74
|
-
ogcFiltersOptions.advancedOgcFilters = false;
|
|
75
|
-
}
|
|
76
|
-
return ogcFiltersOptions;
|
|
77
|
-
}
|
|
78
|
-
buildFilter(filters, extent, proj, fieldNameGeometry, options) {
|
|
79
|
-
let ourBboxFilter;
|
|
80
|
-
let enableBbox;
|
|
81
|
-
if (/intersects|contains|within/gi.test(JSON.stringify(filters))) {
|
|
82
|
-
enableBbox = false;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
enableBbox = true;
|
|
86
|
-
}
|
|
87
|
-
if (filters) {
|
|
88
|
-
fieldNameGeometry =
|
|
89
|
-
filters.geometryName !== undefined
|
|
90
|
-
? filters.geometryName
|
|
91
|
-
: fieldNameGeometry;
|
|
92
|
-
}
|
|
93
|
-
if (extent && filters) {
|
|
94
|
-
ourBboxFilter = olfilter.bbox(fieldNameGeometry, extent, proj.getCode());
|
|
95
|
-
}
|
|
96
|
-
let filterAssembly;
|
|
97
|
-
if (filters) {
|
|
98
|
-
filters = this.checkIgoFiltersProperties(filters, fieldNameGeometry, proj);
|
|
99
|
-
if (extent && enableBbox) {
|
|
100
|
-
filterAssembly = olfilter.and(ourBboxFilter, this.bundleFilter(filters, options));
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
filterAssembly = this.bundleFilter(filters, options);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
return 'bbox=' + extent.join(',') + ',' + proj.getCode();
|
|
108
|
-
}
|
|
109
|
-
const wfsOptions = {
|
|
110
|
-
srsName: '',
|
|
111
|
-
featureNS: '',
|
|
112
|
-
featurePrefix: '',
|
|
113
|
-
featureTypes: ['featureTypes'],
|
|
114
|
-
filter: filterAssembly,
|
|
115
|
-
outputFormat: '',
|
|
116
|
-
geometryName: fieldNameGeometry
|
|
117
|
-
};
|
|
118
|
-
const query = new olFormatWFS().writeGetFeature(wfsOptions);
|
|
119
|
-
const str = new XMLSerializer().serializeToString(query);
|
|
120
|
-
const regexp1 = /typenames *=|typename *=\"featureTypes\" *>/gi;
|
|
121
|
-
const regexp2 = /<\/Query><\/GetFeature>/gi;
|
|
122
|
-
return 'filter=' + str.split(regexp1)[1].split(regexp2)[0];
|
|
123
|
-
}
|
|
124
|
-
bundleFilter(filterObject, options) {
|
|
125
|
-
if (filterObject instanceof Array) {
|
|
126
|
-
const logicalArray = [];
|
|
127
|
-
filterObject.forEach((element) => {
|
|
128
|
-
logicalArray.push(this.bundleFilter(element, options));
|
|
129
|
-
});
|
|
130
|
-
return logicalArray;
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
if (filterObject.hasOwnProperty('logical')) {
|
|
134
|
-
return this.createFilter({
|
|
135
|
-
operator: filterObject.logical,
|
|
136
|
-
logicalArray: this.bundleFilter(filterObject.filters, options)
|
|
137
|
-
}, options);
|
|
138
|
-
}
|
|
139
|
-
else if (filterObject.hasOwnProperty('operator')) {
|
|
140
|
-
return this.createFilter(filterObject, options);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
createFilter(filterOptions, options) {
|
|
145
|
-
const operator = filterOptions.operator;
|
|
146
|
-
const logicalArray = filterOptions.logicalArray;
|
|
147
|
-
const wfsPropertyName = filterOptions.propertyName;
|
|
148
|
-
const wfsPattern = filterOptions.pattern;
|
|
149
|
-
const wfsMatchCase = filterOptions.matchCase
|
|
150
|
-
? filterOptions.matchCase
|
|
151
|
-
: true;
|
|
152
|
-
const wfsWildCard = filterOptions.wildCard ? filterOptions.wildCard : '*';
|
|
153
|
-
const wfsSingleChar = filterOptions.singleChar
|
|
154
|
-
? filterOptions.singleChar
|
|
155
|
-
: '.';
|
|
156
|
-
const wfsEscapeChar = filterOptions.escapeChar
|
|
157
|
-
? filterOptions.escapeChar
|
|
158
|
-
: '!';
|
|
159
|
-
const wfsLowerBoundary = filterOptions.lowerBoundary;
|
|
160
|
-
const wfsUpperBoundary = filterOptions.upperBoundary;
|
|
161
|
-
const wfsGeometryName = filterOptions.geometryName;
|
|
162
|
-
const wfsExtent = filterOptions.extent;
|
|
163
|
-
const wfsWktGeometry = filterOptions.wkt_geometry;
|
|
164
|
-
const wfsSrsName = filterOptions.srsName
|
|
165
|
-
? filterOptions.srsName
|
|
166
|
-
: 'EPSG:3857';
|
|
167
|
-
const wfsBegin = this.parseFilterOptionDate(filterOptions.begin, options ? options.minDate : undefined);
|
|
168
|
-
const wfsEnd = this.parseFilterOptionDate(filterOptions.end, options ? options.maxDate : undefined);
|
|
169
|
-
const wfsExpression = filterOptions.expression;
|
|
170
|
-
let geometry;
|
|
171
|
-
if (wfsWktGeometry) {
|
|
172
|
-
const wkt = new olFormatWKT();
|
|
173
|
-
geometry = wkt.readGeometry(wfsWktGeometry, {
|
|
174
|
-
dataProjection: wfsSrsName,
|
|
175
|
-
featureProjection: wfsSrsName || 'EPSG:3857'
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
switch (operator.toLowerCase()) {
|
|
179
|
-
case OgcFilterOperator.BBOX.toLowerCase():
|
|
180
|
-
return olfilter.bbox(wfsGeometryName, wfsExtent, wfsSrsName);
|
|
181
|
-
case OgcFilterOperator.PropertyIsBetween.toLowerCase():
|
|
182
|
-
return olfilter.between(wfsPropertyName, wfsLowerBoundary || 1e40 * -1, wfsUpperBoundary || 1e40);
|
|
183
|
-
case OgcFilterOperator.Contains.toLowerCase():
|
|
184
|
-
return olfilter.contains(wfsGeometryName, geometry, wfsSrsName);
|
|
185
|
-
case OgcFilterOperator.During.toLowerCase():
|
|
186
|
-
return olfilter.during(wfsPropertyName, wfsBegin, wfsEnd);
|
|
187
|
-
case OgcFilterOperator.PropertyIsEqualTo.toLowerCase():
|
|
188
|
-
return olfilter.equalTo(wfsPropertyName, wfsExpression, wfsMatchCase);
|
|
189
|
-
case OgcFilterOperator.PropertyIsGreaterThan.toLowerCase():
|
|
190
|
-
return olfilter.greaterThan(wfsPropertyName, wfsExpression);
|
|
191
|
-
case OgcFilterOperator.PropertyIsGreaterThanOrEqualTo.toLowerCase():
|
|
192
|
-
return olfilter.greaterThanOrEqualTo(wfsPropertyName, wfsExpression);
|
|
193
|
-
case OgcFilterOperator.Intersects.toLowerCase():
|
|
194
|
-
return olfilter.intersects(wfsGeometryName, geometry, wfsSrsName);
|
|
195
|
-
case OgcFilterOperator.PropertyIsNull.toLowerCase():
|
|
196
|
-
return olfilter.isNull(wfsPropertyName);
|
|
197
|
-
case OgcFilterOperator.PropertyIsLessThan.toLowerCase():
|
|
198
|
-
return olfilter.lessThan(wfsPropertyName, wfsExpression);
|
|
199
|
-
case OgcFilterOperator.PropertyIsLessThanOrEqualTo.toLowerCase():
|
|
200
|
-
return olfilter.lessThanOrEqualTo(wfsPropertyName, wfsExpression);
|
|
201
|
-
case OgcFilterOperator.PropertyIsLike.toLowerCase():
|
|
202
|
-
return olfilter.like(wfsPropertyName, wfsPattern ? wfsPattern.replace(/[()_]/gi, wfsSingleChar) : wfsWildCard, wfsWildCard, wfsSingleChar, wfsEscapeChar, wfsMatchCase);
|
|
203
|
-
case OgcFilterOperator.PropertyIsNotEqualTo.toLowerCase():
|
|
204
|
-
return olfilter.notEqualTo(wfsPropertyName, wfsExpression, wfsMatchCase);
|
|
205
|
-
case OgcFilterOperator.Within.toLowerCase():
|
|
206
|
-
return olfilter.within(wfsGeometryName, geometry, wfsSrsName);
|
|
207
|
-
// LOGICAL
|
|
208
|
-
case OgcFilterOperator.And.toLowerCase():
|
|
209
|
-
return olfilter.and.apply(null, logicalArray);
|
|
210
|
-
case OgcFilterOperator.Or.toLowerCase():
|
|
211
|
-
return olfilter.or.apply(null, logicalArray);
|
|
212
|
-
case OgcFilterOperator.Not.toLowerCase():
|
|
213
|
-
return olfilter.not.apply(null, logicalArray);
|
|
214
|
-
default:
|
|
215
|
-
return undefined;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
defineInterfaceFilterSequence(filterObject, geometryName, logical = '', level = -1) {
|
|
219
|
-
if (filterObject instanceof Array) {
|
|
220
|
-
filterObject.forEach((element) => {
|
|
221
|
-
this.filterSequence.concat(this.defineInterfaceFilterSequence(element, geometryName, logical, level));
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
if (filterObject.hasOwnProperty('logical')) {
|
|
226
|
-
level = level + 1;
|
|
227
|
-
this.filterSequence.concat(this.defineInterfaceFilterSequence(filterObject.filters, geometryName, filterObject.logical, level));
|
|
228
|
-
}
|
|
229
|
-
else if (filterObject.hasOwnProperty('operator')) {
|
|
230
|
-
this.filterSequence.push(this.addInterfaceFilter(filterObject, geometryName, level, logical));
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return this.filterSequence;
|
|
234
|
-
}
|
|
235
|
-
computeAllowedOperators(fields, propertyName, defaultOperatorsType) {
|
|
236
|
-
let effectiveOperators = {};
|
|
237
|
-
let allowedOperators;
|
|
238
|
-
let fieldsHasSpatialOperator;
|
|
239
|
-
let includeContains;
|
|
240
|
-
if (fields && propertyName) {
|
|
241
|
-
const srcField = fields.find((field) => field.name === propertyName);
|
|
242
|
-
allowedOperators =
|
|
243
|
-
srcField && srcField.allowedOperatorsType
|
|
244
|
-
? srcField.allowedOperatorsType
|
|
245
|
-
: defaultOperatorsType;
|
|
246
|
-
}
|
|
247
|
-
if (fields) {
|
|
248
|
-
fields.map((field) => {
|
|
249
|
-
if (!field.allowedOperatorsType) {
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
const allowedOperatorsType = field.allowedOperatorsType.toLowerCase();
|
|
253
|
-
if (allowedOperatorsType === OgcFilterOperatorType.All.toLowerCase() ||
|
|
254
|
-
allowedOperatorsType ===
|
|
255
|
-
OgcFilterOperatorType.Spatial.toLowerCase() ||
|
|
256
|
-
allowedOperatorsType ===
|
|
257
|
-
OgcFilterOperatorType.BasicAndSpatial.toLowerCase()) {
|
|
258
|
-
fieldsHasSpatialOperator = true;
|
|
259
|
-
if (allowedOperatorsType === OgcFilterOperatorType.All.toLowerCase()) {
|
|
260
|
-
includeContains = true;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
allowedOperators = allowedOperators
|
|
266
|
-
? allowedOperators
|
|
267
|
-
: OgcFilterOperatorType.BasicAndSpatial;
|
|
268
|
-
switch (allowedOperators.toLowerCase()) {
|
|
269
|
-
case OgcFilterOperatorType.All:
|
|
270
|
-
effectiveOperators = this.operators;
|
|
271
|
-
break;
|
|
272
|
-
case OgcFilterOperatorType.Spatial:
|
|
273
|
-
effectiveOperators = {
|
|
274
|
-
[OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
|
|
275
|
-
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
|
|
276
|
-
};
|
|
277
|
-
break;
|
|
278
|
-
case OgcFilterOperatorType.BasicAndSpatial:
|
|
279
|
-
effectiveOperators = {
|
|
280
|
-
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
281
|
-
spatial: false,
|
|
282
|
-
fieldRestrict: []
|
|
283
|
-
},
|
|
284
|
-
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
285
|
-
spatial: false,
|
|
286
|
-
fieldRestrict: []
|
|
287
|
-
},
|
|
288
|
-
[OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
|
|
289
|
-
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
|
|
290
|
-
};
|
|
291
|
-
break;
|
|
292
|
-
case OgcFilterOperatorType.Basic:
|
|
293
|
-
effectiveOperators = {
|
|
294
|
-
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
295
|
-
spatial: false,
|
|
296
|
-
fieldRestrict: []
|
|
297
|
-
},
|
|
298
|
-
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
299
|
-
spatial: false,
|
|
300
|
-
fieldRestrict: []
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
break;
|
|
304
|
-
case OgcFilterOperatorType.Time:
|
|
305
|
-
effectiveOperators = {
|
|
306
|
-
[OgcFilterOperator.During]: { spatial: false, fieldRestrict: [] }
|
|
307
|
-
};
|
|
308
|
-
break;
|
|
309
|
-
case OgcFilterOperatorType.BasicNumericOperator:
|
|
310
|
-
effectiveOperators = {
|
|
311
|
-
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
312
|
-
spatial: false,
|
|
313
|
-
fieldRestrict: []
|
|
314
|
-
},
|
|
315
|
-
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
316
|
-
spatial: false,
|
|
317
|
-
fieldRestrict: []
|
|
318
|
-
},
|
|
319
|
-
[OgcFilterOperator.PropertyIsGreaterThan]: {
|
|
320
|
-
spatial: false,
|
|
321
|
-
fieldRestrict: ['number']
|
|
322
|
-
},
|
|
323
|
-
[OgcFilterOperator.PropertyIsGreaterThanOrEqualTo]: {
|
|
324
|
-
spatial: false,
|
|
325
|
-
fieldRestrict: ['number']
|
|
326
|
-
},
|
|
327
|
-
[OgcFilterOperator.PropertyIsLessThan]: {
|
|
328
|
-
spatial: false,
|
|
329
|
-
fieldRestrict: ['number']
|
|
330
|
-
},
|
|
331
|
-
[OgcFilterOperator.PropertyIsLessThanOrEqualTo]: {
|
|
332
|
-
spatial: false,
|
|
333
|
-
fieldRestrict: ['number']
|
|
334
|
-
}
|
|
335
|
-
};
|
|
336
|
-
break;
|
|
337
|
-
default:
|
|
338
|
-
effectiveOperators = {
|
|
339
|
-
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
340
|
-
spatial: false,
|
|
341
|
-
fieldRestrict: []
|
|
342
|
-
},
|
|
343
|
-
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
344
|
-
spatial: false,
|
|
345
|
-
fieldRestrict: []
|
|
346
|
-
},
|
|
347
|
-
[OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
|
|
348
|
-
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
if (fieldsHasSpatialOperator) {
|
|
352
|
-
effectiveOperators.Intersects = {
|
|
353
|
-
spatial: true,
|
|
354
|
-
fieldRestrict: []
|
|
355
|
-
};
|
|
356
|
-
effectiveOperators.Within = { spatial: true, fieldRestrict: [] };
|
|
357
|
-
if (includeContains) {
|
|
358
|
-
effectiveOperators.Contains = {
|
|
359
|
-
spatial: true,
|
|
360
|
-
fieldRestrict: []
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return effectiveOperators;
|
|
365
|
-
}
|
|
366
|
-
addInterfaceFilter(igoOgcFilterObject, geometryName, level = 0, parentLogical = 'Or') {
|
|
367
|
-
if (!igoOgcFilterObject) {
|
|
368
|
-
igoOgcFilterObject = { operator: 'PropertyIsEqualTo' };
|
|
369
|
-
}
|
|
370
|
-
const f = {
|
|
371
|
-
propertyName: '',
|
|
372
|
-
operator: '',
|
|
373
|
-
active: '',
|
|
374
|
-
filterid: uuid(),
|
|
375
|
-
step: '',
|
|
376
|
-
begin: '',
|
|
377
|
-
end: '',
|
|
378
|
-
sliderOptions: {},
|
|
379
|
-
lowerBoundary: '',
|
|
380
|
-
upperBoundary: '',
|
|
381
|
-
expression: '',
|
|
382
|
-
pattern: '',
|
|
383
|
-
wildCard: '*',
|
|
384
|
-
singleChar: '.',
|
|
385
|
-
escapeChar: '!',
|
|
386
|
-
matchCase: true,
|
|
387
|
-
igoSpatialSelector: '',
|
|
388
|
-
igoSNRC: '',
|
|
389
|
-
geometryName: '',
|
|
390
|
-
geometry: '',
|
|
391
|
-
wkt_geometry: '',
|
|
392
|
-
extent: '',
|
|
393
|
-
srsName: '',
|
|
394
|
-
parentLogical: '',
|
|
395
|
-
level: 0
|
|
396
|
-
};
|
|
397
|
-
return Object.assign(f, {
|
|
398
|
-
parentLogical,
|
|
399
|
-
level,
|
|
400
|
-
geometryName
|
|
401
|
-
}, igoOgcFilterObject);
|
|
402
|
-
}
|
|
403
|
-
checkIgoFiltersProperties(filterObject, fieldNameGeometry, proj, active = false) {
|
|
404
|
-
const filterArray = [];
|
|
405
|
-
if (filterObject instanceof Array) {
|
|
406
|
-
filterObject.forEach((element) => {
|
|
407
|
-
filterArray.push(this.checkIgoFiltersProperties(element, fieldNameGeometry, proj, active));
|
|
408
|
-
});
|
|
409
|
-
return filterArray;
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
if (filterObject.hasOwnProperty('logical')) {
|
|
413
|
-
return Object.assign({}, {
|
|
414
|
-
logical: filterObject.logical,
|
|
415
|
-
filters: this.checkIgoFiltersProperties(filterObject.filters, fieldNameGeometry, proj, active)
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
else if (filterObject.hasOwnProperty('operator')) {
|
|
419
|
-
return this.addFilterProperties(filterObject, fieldNameGeometry, proj, active);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
addFilterProperties(igoOgcFilterObject, fieldNameGeometry, proj, active = false) {
|
|
424
|
-
const filterid = igoOgcFilterObject.hasOwnProperty('filterid')
|
|
425
|
-
? igoOgcFilterObject.filterid
|
|
426
|
-
: uuid();
|
|
427
|
-
const status = igoOgcFilterObject.hasOwnProperty('active')
|
|
428
|
-
? igoOgcFilterObject.active
|
|
429
|
-
: active;
|
|
430
|
-
const srsName = igoOgcFilterObject.hasOwnProperty('srsName')
|
|
431
|
-
? igoOgcFilterObject.srsName
|
|
432
|
-
: proj
|
|
433
|
-
? proj.getCode()
|
|
434
|
-
: 'EPSG:3857';
|
|
435
|
-
return Object.assign({}, {
|
|
436
|
-
filterid,
|
|
437
|
-
active: status,
|
|
438
|
-
igoSpatialSelector: 'fixedExtent',
|
|
439
|
-
srsName
|
|
440
|
-
}, igoOgcFilterObject, { geometryName: fieldNameGeometry });
|
|
441
|
-
}
|
|
442
|
-
rebuiltIgoOgcFilterObjectFromSequence(sequence) {
|
|
443
|
-
if (sequence instanceof Array) {
|
|
444
|
-
if (sequence.length >= 1) {
|
|
445
|
-
let lastParentLogical = sequence[0].parentLogical;
|
|
446
|
-
let nextElement;
|
|
447
|
-
let logicalArray = [];
|
|
448
|
-
let lastProcessedFilter;
|
|
449
|
-
sequence.forEach((uiFilter) => {
|
|
450
|
-
const element = Object.assign({}, uiFilter);
|
|
451
|
-
const index = sequence.indexOf(uiFilter);
|
|
452
|
-
if (index >= 0 && index < sequence.length - 1) {
|
|
453
|
-
nextElement = sequence[index + 1];
|
|
454
|
-
}
|
|
455
|
-
else {
|
|
456
|
-
nextElement = element;
|
|
457
|
-
}
|
|
458
|
-
delete element.active;
|
|
459
|
-
delete element.filterid;
|
|
460
|
-
delete element.parentLogical;
|
|
461
|
-
logicalArray.push(element);
|
|
462
|
-
if (sequence.length === 1) {
|
|
463
|
-
lastProcessedFilter = element;
|
|
464
|
-
}
|
|
465
|
-
else if (lastParentLogical !== nextElement.parentLogical) {
|
|
466
|
-
if (logicalArray.length === 1) {
|
|
467
|
-
console.log('You must set at ' +
|
|
468
|
-
'least two operator in a logical (' +
|
|
469
|
-
lastParentLogical +
|
|
470
|
-
')');
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
lastProcessedFilter = Object.assign({}, { logical: lastParentLogical, filters: logicalArray });
|
|
474
|
-
logicalArray = [lastProcessedFilter];
|
|
475
|
-
lastParentLogical = nextElement.parentLogical;
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
});
|
|
479
|
-
return lastProcessedFilter;
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
return undefined;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
return undefined;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
computeIgoSelector(selectors) {
|
|
490
|
-
if (selectors.groups.every((group) => group.computedSelectors !== undefined)) {
|
|
491
|
-
return selectors;
|
|
492
|
-
}
|
|
493
|
-
let selector;
|
|
494
|
-
if (selectors.groups && selectors.bundles) {
|
|
495
|
-
if (!selectors.bundles.every((bundle) => bundle.id !== undefined)) {
|
|
496
|
-
throw new Error('You must set an id for each of your bundles');
|
|
497
|
-
}
|
|
498
|
-
selector = ObjectUtils.copyDeep(selectors);
|
|
499
|
-
selector.groups.forEach((group) => {
|
|
500
|
-
group.title = group.title ? group.title : group.name;
|
|
501
|
-
group.enabled = group.enabled ? group.enabled : false;
|
|
502
|
-
group.computedSelectors = ObjectUtils.copyDeep(selector.bundles.filter((b) => group.ids.includes(b.id)));
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
else if (!selectors.groups && selectors.bundles) {
|
|
506
|
-
selector = ObjectUtils.copyDeep(selectors);
|
|
507
|
-
selector.groups = [
|
|
508
|
-
{
|
|
509
|
-
title: 'group1',
|
|
510
|
-
name: 'group1',
|
|
511
|
-
computedSelectors: ObjectUtils.copyDeep(selector.bundles)
|
|
512
|
-
}
|
|
513
|
-
];
|
|
514
|
-
}
|
|
515
|
-
else {
|
|
516
|
-
selector = {
|
|
517
|
-
bundles: selectors,
|
|
518
|
-
groups: [
|
|
519
|
-
{
|
|
520
|
-
title: 'group1',
|
|
521
|
-
name: 'group1',
|
|
522
|
-
computedSelectors: ObjectUtils.copyDeep(selectors)
|
|
523
|
-
}
|
|
524
|
-
],
|
|
525
|
-
selectorType: selector.selectorType
|
|
526
|
-
};
|
|
527
|
-
}
|
|
528
|
-
if (!selector.groups.find((selectorGroup) => selectorGroup.enabled)) {
|
|
529
|
-
selector.groups[0].enabled = true;
|
|
530
|
-
}
|
|
531
|
-
return selector;
|
|
532
|
-
}
|
|
533
|
-
handleOgcFiltersAppliedValue(options, fieldNameGeometry, extent, proj) {
|
|
534
|
-
const ogcFilters = options.ogcFilters;
|
|
535
|
-
if (!ogcFilters) {
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
const conditions = [];
|
|
539
|
-
let filterQueryStringSelector = '';
|
|
540
|
-
let filterQueryStringAdvancedFilters = '';
|
|
541
|
-
if (ogcFilters.enabled && (ogcFilters.pushButtons || ogcFilters.checkboxes || ogcFilters.radioButtons || ogcFilters.select
|
|
542
|
-
|| ogcFilters.autocomplete)) {
|
|
543
|
-
let selectors;
|
|
544
|
-
if (ogcFilters.pushButtons) {
|
|
545
|
-
selectors = ogcFilters.pushButtons;
|
|
546
|
-
const pushConditions = this.formatGroupAndFilter(ogcFilters, selectors);
|
|
547
|
-
for (const condition of pushConditions) {
|
|
548
|
-
conditions.push(condition);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
if (ogcFilters.checkboxes) {
|
|
552
|
-
selectors = ogcFilters.checkboxes;
|
|
553
|
-
const checkboxConditions = this.formatGroupAndFilter(ogcFilters, selectors);
|
|
554
|
-
for (const condition of checkboxConditions) {
|
|
555
|
-
conditions.push(condition);
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
if (ogcFilters.radioButtons) {
|
|
559
|
-
selectors = ogcFilters.radioButtons;
|
|
560
|
-
const selectorsCorr = this.verifyMultipleEnableds(selectors);
|
|
561
|
-
const radioConditions = this.formatGroupAndFilter(ogcFilters, selectorsCorr);
|
|
562
|
-
for (const condition of radioConditions) {
|
|
563
|
-
conditions.push(condition);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
if (ogcFilters.select) {
|
|
567
|
-
selectors = ogcFilters.select;
|
|
568
|
-
const selectorsCorr = this.verifyMultipleEnableds(selectors);
|
|
569
|
-
const selectConditions = this.formatGroupAndFilter(ogcFilters, selectorsCorr);
|
|
570
|
-
for (const condition of selectConditions) {
|
|
571
|
-
conditions.push(condition);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
if (ogcFilters.autocomplete) {
|
|
575
|
-
selectors = ogcFilters.autocomplete;
|
|
576
|
-
const selectConditions = this.formatGroupAndFilter(ogcFilters, selectors);
|
|
577
|
-
for (const condition of selectConditions) {
|
|
578
|
-
conditions.push(condition);
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
if (conditions.length >= 1) {
|
|
582
|
-
filterQueryStringSelector = this.buildFilter(conditions.length === 1
|
|
583
|
-
? conditions[0]
|
|
584
|
-
: { logical: 'And', filters: conditions }, extent, proj, ogcFilters.geometryName);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
if (ogcFilters.enabled && ogcFilters.filters) {
|
|
588
|
-
ogcFilters.geometryName = ogcFilters.geometryName || fieldNameGeometry;
|
|
589
|
-
const igoFilters = ogcFilters.filters;
|
|
590
|
-
filterQueryStringAdvancedFilters = this.buildFilter(igoFilters, extent, proj, ogcFilters.geometryName, options);
|
|
591
|
-
}
|
|
592
|
-
let filterQueryString = ogcFilters.advancedOgcFilters
|
|
593
|
-
? filterQueryStringAdvancedFilters
|
|
594
|
-
: filterQueryStringSelector;
|
|
595
|
-
if (options.type === 'wms') {
|
|
596
|
-
filterQueryString = this.formatProcessedOgcFilter(filterQueryString, options.params.LAYERS);
|
|
597
|
-
}
|
|
598
|
-
if (options.type === 'wfs') {
|
|
599
|
-
filterQueryString = this.formatProcessedOgcFilter(filterQueryString, options.params.featureTypes);
|
|
600
|
-
}
|
|
601
|
-
return filterQueryString;
|
|
602
|
-
}
|
|
603
|
-
verifyMultipleEnableds(selectors) {
|
|
604
|
-
selectors.bundles.forEach(bundle => {
|
|
605
|
-
if (!bundle.multiple && bundle.selectors) {
|
|
606
|
-
const enableds = bundle.selectors.reduce((list, filter, index) => (filter.enabled) === true ? list.concat(index) : list, []);
|
|
607
|
-
if (enableds.length > 1) {
|
|
608
|
-
enableds.splice(0, 1);
|
|
609
|
-
enableds.forEach(index => {
|
|
610
|
-
bundle.selectors[index].enabled = false;
|
|
611
|
-
});
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
});
|
|
615
|
-
return selectors;
|
|
616
|
-
}
|
|
617
|
-
formatGroupAndFilter(ogcFilters, selectors) {
|
|
618
|
-
selectors = this.computeIgoSelector(selectors);
|
|
619
|
-
const selectorBundle = selectors.groups.find((g) => g.enabled).computedSelectors;
|
|
620
|
-
const conditions = [];
|
|
621
|
-
selectorBundle.map((bundle) => {
|
|
622
|
-
const bundleCondition = [];
|
|
623
|
-
const selectorsType = bundle.selectors;
|
|
624
|
-
if (!selectorsType) {
|
|
625
|
-
return;
|
|
626
|
-
}
|
|
627
|
-
selectorsType
|
|
628
|
-
.filter((ogcselector) => ogcselector.enabled === true)
|
|
629
|
-
.forEach((enabledSelector) => bundleCondition.push(enabledSelector.filters));
|
|
630
|
-
if (bundleCondition.length === 1) {
|
|
631
|
-
conditions.push(bundleCondition[0]);
|
|
632
|
-
}
|
|
633
|
-
else if (bundleCondition.length > 1) {
|
|
634
|
-
conditions.push({
|
|
635
|
-
logical: bundle.logical,
|
|
636
|
-
filters: bundleCondition
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
});
|
|
640
|
-
if (selectors.selectorType === 'pushButton') {
|
|
641
|
-
ogcFilters.pushButtons = selectors;
|
|
642
|
-
}
|
|
643
|
-
else if (selectors.selectorType === 'checkbox') {
|
|
644
|
-
ogcFilters.checkboxes = selectors;
|
|
645
|
-
}
|
|
646
|
-
else if (selectors.selectorType === 'radioButton') {
|
|
647
|
-
ogcFilters.radioButtons = selectors;
|
|
648
|
-
}
|
|
649
|
-
else if (selectors.selectorType === 'select') {
|
|
650
|
-
ogcFilters.select = selectors;
|
|
651
|
-
}
|
|
652
|
-
else if (selectors.selectorType === 'autocomplete') {
|
|
653
|
-
ogcFilters.autocomplete = selectors;
|
|
654
|
-
}
|
|
655
|
-
return conditions;
|
|
656
|
-
}
|
|
657
|
-
formatProcessedOgcFilter(processedFilter, layersOrTypenames) {
|
|
658
|
-
if (!processedFilter) {
|
|
659
|
-
return undefined;
|
|
660
|
-
}
|
|
661
|
-
;
|
|
662
|
-
let appliedFilter = '';
|
|
663
|
-
if (processedFilter.length === 0 && layersOrTypenames.indexOf(',') === -1) {
|
|
664
|
-
appliedFilter = processedFilter;
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
layersOrTypenames.split(',').forEach((layerOrTypenames) => {
|
|
668
|
-
appliedFilter = `${appliedFilter}(${processedFilter.replace('filter=', '')})`;
|
|
669
|
-
});
|
|
670
|
-
}
|
|
671
|
-
appliedFilter = appliedFilter.replace(/\(\)/g, '');
|
|
672
|
-
const filterValue = appliedFilter.length > 0
|
|
673
|
-
? appliedFilter.replace('filter=', '')
|
|
674
|
-
: undefined;
|
|
675
|
-
return filterValue;
|
|
676
|
-
}
|
|
677
|
-
parseFilterOptionDate(value, defaultValue) {
|
|
678
|
-
if (!value) {
|
|
679
|
-
return defaultValue;
|
|
680
|
-
}
|
|
681
|
-
else if (value === 'today') {
|
|
682
|
-
return undefined;
|
|
683
|
-
}
|
|
684
|
-
else if (moment(value).isValid()) {
|
|
685
|
-
return value;
|
|
686
|
-
}
|
|
687
|
-
else {
|
|
688
|
-
return undefined;
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
1
|
+
import * as olfilter from 'ol/format/filter';
|
|
2
|
+
import olFormatWKT from 'ol/format/WKT';
|
|
3
|
+
import olFormatWFS from 'ol/format/WFS';
|
|
4
|
+
import { uuid, ObjectUtils } from '@igo2/utils';
|
|
5
|
+
import { OgcFilterOperatorType, OgcFilterOperator } from './ogc-filter.enum';
|
|
6
|
+
import { default as moment } from 'moment';
|
|
7
|
+
export class OgcFilterWriter {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.filterSequence = [];
|
|
10
|
+
this.operators = {
|
|
11
|
+
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
12
|
+
spatial: false,
|
|
13
|
+
fieldRestrict: []
|
|
14
|
+
},
|
|
15
|
+
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
16
|
+
spatial: false,
|
|
17
|
+
fieldRestrict: []
|
|
18
|
+
},
|
|
19
|
+
[OgcFilterOperator.PropertyIsLike]: {
|
|
20
|
+
spatial: false,
|
|
21
|
+
fieldRestrict: ['string']
|
|
22
|
+
},
|
|
23
|
+
[OgcFilterOperator.PropertyIsGreaterThan]: {
|
|
24
|
+
spatial: false,
|
|
25
|
+
fieldRestrict: ['number']
|
|
26
|
+
},
|
|
27
|
+
[OgcFilterOperator.PropertyIsGreaterThanOrEqualTo]: {
|
|
28
|
+
spatial: false,
|
|
29
|
+
fieldRestrict: ['number']
|
|
30
|
+
},
|
|
31
|
+
[OgcFilterOperator.PropertyIsLessThan]: {
|
|
32
|
+
spatial: false,
|
|
33
|
+
fieldRestrict: ['number']
|
|
34
|
+
},
|
|
35
|
+
[OgcFilterOperator.PropertyIsLessThanOrEqualTo]: {
|
|
36
|
+
spatial: false,
|
|
37
|
+
fieldRestrict: ['number']
|
|
38
|
+
},
|
|
39
|
+
[OgcFilterOperator.PropertyIsBetween]: {
|
|
40
|
+
spatial: false,
|
|
41
|
+
fieldRestrict: ['number']
|
|
42
|
+
},
|
|
43
|
+
[OgcFilterOperator.During]: { spatial: false, fieldRestrict: [] },
|
|
44
|
+
[OgcFilterOperator.PropertyIsNull]: {
|
|
45
|
+
spatial: false,
|
|
46
|
+
fieldRestrict: []
|
|
47
|
+
},
|
|
48
|
+
[OgcFilterOperator.Intersects]: {
|
|
49
|
+
spatial: true,
|
|
50
|
+
fieldRestrict: []
|
|
51
|
+
},
|
|
52
|
+
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] },
|
|
53
|
+
[OgcFilterOperator.Contains]: { spatial: true, fieldRestrict: [] }
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
defineOgcFiltersDefaultOptions(ogcFiltersOptions, fieldNameGeometry, srcType) {
|
|
57
|
+
let ogcFiltersDefaultValue = true; // default values for wfs.
|
|
58
|
+
if (srcType && srcType === 'wms') {
|
|
59
|
+
ogcFiltersDefaultValue = false;
|
|
60
|
+
}
|
|
61
|
+
ogcFiltersOptions = ogcFiltersOptions || {};
|
|
62
|
+
ogcFiltersOptions.enabled =
|
|
63
|
+
ogcFiltersOptions.enabled === undefined
|
|
64
|
+
? ogcFiltersDefaultValue
|
|
65
|
+
: ogcFiltersOptions.enabled;
|
|
66
|
+
ogcFiltersOptions.editable =
|
|
67
|
+
ogcFiltersOptions.editable === undefined
|
|
68
|
+
? ogcFiltersDefaultValue
|
|
69
|
+
: ogcFiltersOptions.editable;
|
|
70
|
+
ogcFiltersOptions.geometryName = fieldNameGeometry;
|
|
71
|
+
ogcFiltersOptions.advancedOgcFilters = true;
|
|
72
|
+
if (ogcFiltersOptions.enabled && (ogcFiltersOptions.pushButtons || ogcFiltersOptions.checkboxes
|
|
73
|
+
|| ogcFiltersOptions.radioButtons || ogcFiltersOptions.select || ogcFiltersOptions.autocomplete)) {
|
|
74
|
+
ogcFiltersOptions.advancedOgcFilters = false;
|
|
75
|
+
}
|
|
76
|
+
return ogcFiltersOptions;
|
|
77
|
+
}
|
|
78
|
+
buildFilter(filters, extent, proj, fieldNameGeometry, options) {
|
|
79
|
+
let ourBboxFilter;
|
|
80
|
+
let enableBbox;
|
|
81
|
+
if (/intersects|contains|within/gi.test(JSON.stringify(filters))) {
|
|
82
|
+
enableBbox = false;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
enableBbox = true;
|
|
86
|
+
}
|
|
87
|
+
if (filters) {
|
|
88
|
+
fieldNameGeometry =
|
|
89
|
+
filters.geometryName !== undefined
|
|
90
|
+
? filters.geometryName
|
|
91
|
+
: fieldNameGeometry;
|
|
92
|
+
}
|
|
93
|
+
if (extent && filters) {
|
|
94
|
+
ourBboxFilter = olfilter.bbox(fieldNameGeometry, extent, proj.getCode());
|
|
95
|
+
}
|
|
96
|
+
let filterAssembly;
|
|
97
|
+
if (filters) {
|
|
98
|
+
filters = this.checkIgoFiltersProperties(filters, fieldNameGeometry, proj);
|
|
99
|
+
if (extent && enableBbox) {
|
|
100
|
+
filterAssembly = olfilter.and(ourBboxFilter, this.bundleFilter(filters, options));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
filterAssembly = this.bundleFilter(filters, options);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return 'bbox=' + extent.join(',') + ',' + proj.getCode();
|
|
108
|
+
}
|
|
109
|
+
const wfsOptions = {
|
|
110
|
+
srsName: '',
|
|
111
|
+
featureNS: '',
|
|
112
|
+
featurePrefix: '',
|
|
113
|
+
featureTypes: ['featureTypes'],
|
|
114
|
+
filter: filterAssembly,
|
|
115
|
+
outputFormat: '',
|
|
116
|
+
geometryName: fieldNameGeometry
|
|
117
|
+
};
|
|
118
|
+
const query = new olFormatWFS().writeGetFeature(wfsOptions);
|
|
119
|
+
const str = new XMLSerializer().serializeToString(query);
|
|
120
|
+
const regexp1 = /typenames *=|typename *=\"featureTypes\" *>/gi;
|
|
121
|
+
const regexp2 = /<\/Query><\/GetFeature>/gi;
|
|
122
|
+
return 'filter=' + str.split(regexp1)[1].split(regexp2)[0];
|
|
123
|
+
}
|
|
124
|
+
bundleFilter(filterObject, options) {
|
|
125
|
+
if (filterObject instanceof Array) {
|
|
126
|
+
const logicalArray = [];
|
|
127
|
+
filterObject.forEach((element) => {
|
|
128
|
+
logicalArray.push(this.bundleFilter(element, options));
|
|
129
|
+
});
|
|
130
|
+
return logicalArray;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
if (filterObject.hasOwnProperty('logical')) {
|
|
134
|
+
return this.createFilter({
|
|
135
|
+
operator: filterObject.logical,
|
|
136
|
+
logicalArray: this.bundleFilter(filterObject.filters, options)
|
|
137
|
+
}, options);
|
|
138
|
+
}
|
|
139
|
+
else if (filterObject.hasOwnProperty('operator')) {
|
|
140
|
+
return this.createFilter(filterObject, options);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
createFilter(filterOptions, options) {
|
|
145
|
+
const operator = filterOptions.operator;
|
|
146
|
+
const logicalArray = filterOptions.logicalArray;
|
|
147
|
+
const wfsPropertyName = filterOptions.propertyName;
|
|
148
|
+
const wfsPattern = filterOptions.pattern;
|
|
149
|
+
const wfsMatchCase = filterOptions.matchCase
|
|
150
|
+
? filterOptions.matchCase
|
|
151
|
+
: true;
|
|
152
|
+
const wfsWildCard = filterOptions.wildCard ? filterOptions.wildCard : '*';
|
|
153
|
+
const wfsSingleChar = filterOptions.singleChar
|
|
154
|
+
? filterOptions.singleChar
|
|
155
|
+
: '.';
|
|
156
|
+
const wfsEscapeChar = filterOptions.escapeChar
|
|
157
|
+
? filterOptions.escapeChar
|
|
158
|
+
: '!';
|
|
159
|
+
const wfsLowerBoundary = filterOptions.lowerBoundary;
|
|
160
|
+
const wfsUpperBoundary = filterOptions.upperBoundary;
|
|
161
|
+
const wfsGeometryName = filterOptions.geometryName;
|
|
162
|
+
const wfsExtent = filterOptions.extent;
|
|
163
|
+
const wfsWktGeometry = filterOptions.wkt_geometry;
|
|
164
|
+
const wfsSrsName = filterOptions.srsName
|
|
165
|
+
? filterOptions.srsName
|
|
166
|
+
: 'EPSG:3857';
|
|
167
|
+
const wfsBegin = this.parseFilterOptionDate(filterOptions.begin, options ? options.minDate : undefined);
|
|
168
|
+
const wfsEnd = this.parseFilterOptionDate(filterOptions.end, options ? options.maxDate : undefined);
|
|
169
|
+
const wfsExpression = filterOptions.expression;
|
|
170
|
+
let geometry;
|
|
171
|
+
if (wfsWktGeometry) {
|
|
172
|
+
const wkt = new olFormatWKT();
|
|
173
|
+
geometry = wkt.readGeometry(wfsWktGeometry, {
|
|
174
|
+
dataProjection: wfsSrsName,
|
|
175
|
+
featureProjection: wfsSrsName || 'EPSG:3857'
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
switch (operator.toLowerCase()) {
|
|
179
|
+
case OgcFilterOperator.BBOX.toLowerCase():
|
|
180
|
+
return olfilter.bbox(wfsGeometryName, wfsExtent, wfsSrsName);
|
|
181
|
+
case OgcFilterOperator.PropertyIsBetween.toLowerCase():
|
|
182
|
+
return olfilter.between(wfsPropertyName, wfsLowerBoundary || 1e40 * -1, wfsUpperBoundary || 1e40);
|
|
183
|
+
case OgcFilterOperator.Contains.toLowerCase():
|
|
184
|
+
return olfilter.contains(wfsGeometryName, geometry, wfsSrsName);
|
|
185
|
+
case OgcFilterOperator.During.toLowerCase():
|
|
186
|
+
return olfilter.during(wfsPropertyName, wfsBegin, wfsEnd);
|
|
187
|
+
case OgcFilterOperator.PropertyIsEqualTo.toLowerCase():
|
|
188
|
+
return olfilter.equalTo(wfsPropertyName, wfsExpression, wfsMatchCase);
|
|
189
|
+
case OgcFilterOperator.PropertyIsGreaterThan.toLowerCase():
|
|
190
|
+
return olfilter.greaterThan(wfsPropertyName, wfsExpression);
|
|
191
|
+
case OgcFilterOperator.PropertyIsGreaterThanOrEqualTo.toLowerCase():
|
|
192
|
+
return olfilter.greaterThanOrEqualTo(wfsPropertyName, wfsExpression);
|
|
193
|
+
case OgcFilterOperator.Intersects.toLowerCase():
|
|
194
|
+
return olfilter.intersects(wfsGeometryName, geometry, wfsSrsName);
|
|
195
|
+
case OgcFilterOperator.PropertyIsNull.toLowerCase():
|
|
196
|
+
return olfilter.isNull(wfsPropertyName);
|
|
197
|
+
case OgcFilterOperator.PropertyIsLessThan.toLowerCase():
|
|
198
|
+
return olfilter.lessThan(wfsPropertyName, wfsExpression);
|
|
199
|
+
case OgcFilterOperator.PropertyIsLessThanOrEqualTo.toLowerCase():
|
|
200
|
+
return olfilter.lessThanOrEqualTo(wfsPropertyName, wfsExpression);
|
|
201
|
+
case OgcFilterOperator.PropertyIsLike.toLowerCase():
|
|
202
|
+
return olfilter.like(wfsPropertyName, wfsPattern ? wfsPattern.replace(/[()_]/gi, wfsSingleChar) : wfsWildCard, wfsWildCard, wfsSingleChar, wfsEscapeChar, wfsMatchCase);
|
|
203
|
+
case OgcFilterOperator.PropertyIsNotEqualTo.toLowerCase():
|
|
204
|
+
return olfilter.notEqualTo(wfsPropertyName, wfsExpression, wfsMatchCase);
|
|
205
|
+
case OgcFilterOperator.Within.toLowerCase():
|
|
206
|
+
return olfilter.within(wfsGeometryName, geometry, wfsSrsName);
|
|
207
|
+
// LOGICAL
|
|
208
|
+
case OgcFilterOperator.And.toLowerCase():
|
|
209
|
+
return olfilter.and.apply(null, logicalArray);
|
|
210
|
+
case OgcFilterOperator.Or.toLowerCase():
|
|
211
|
+
return olfilter.or.apply(null, logicalArray);
|
|
212
|
+
case OgcFilterOperator.Not.toLowerCase():
|
|
213
|
+
return olfilter.not.apply(null, logicalArray);
|
|
214
|
+
default:
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
defineInterfaceFilterSequence(filterObject, geometryName, logical = '', level = -1) {
|
|
219
|
+
if (filterObject instanceof Array) {
|
|
220
|
+
filterObject.forEach((element) => {
|
|
221
|
+
this.filterSequence.concat(this.defineInterfaceFilterSequence(element, geometryName, logical, level));
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
if (filterObject.hasOwnProperty('logical')) {
|
|
226
|
+
level = level + 1;
|
|
227
|
+
this.filterSequence.concat(this.defineInterfaceFilterSequence(filterObject.filters, geometryName, filterObject.logical, level));
|
|
228
|
+
}
|
|
229
|
+
else if (filterObject.hasOwnProperty('operator')) {
|
|
230
|
+
this.filterSequence.push(this.addInterfaceFilter(filterObject, geometryName, level, logical));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return this.filterSequence;
|
|
234
|
+
}
|
|
235
|
+
computeAllowedOperators(fields, propertyName, defaultOperatorsType) {
|
|
236
|
+
let effectiveOperators = {};
|
|
237
|
+
let allowedOperators;
|
|
238
|
+
let fieldsHasSpatialOperator;
|
|
239
|
+
let includeContains;
|
|
240
|
+
if (fields && propertyName) {
|
|
241
|
+
const srcField = fields.find((field) => field.name === propertyName);
|
|
242
|
+
allowedOperators =
|
|
243
|
+
srcField && srcField.allowedOperatorsType
|
|
244
|
+
? srcField.allowedOperatorsType
|
|
245
|
+
: defaultOperatorsType;
|
|
246
|
+
}
|
|
247
|
+
if (fields) {
|
|
248
|
+
fields.map((field) => {
|
|
249
|
+
if (!field.allowedOperatorsType) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const allowedOperatorsType = field.allowedOperatorsType.toLowerCase();
|
|
253
|
+
if (allowedOperatorsType === OgcFilterOperatorType.All.toLowerCase() ||
|
|
254
|
+
allowedOperatorsType ===
|
|
255
|
+
OgcFilterOperatorType.Spatial.toLowerCase() ||
|
|
256
|
+
allowedOperatorsType ===
|
|
257
|
+
OgcFilterOperatorType.BasicAndSpatial.toLowerCase()) {
|
|
258
|
+
fieldsHasSpatialOperator = true;
|
|
259
|
+
if (allowedOperatorsType === OgcFilterOperatorType.All.toLowerCase()) {
|
|
260
|
+
includeContains = true;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
allowedOperators = allowedOperators
|
|
266
|
+
? allowedOperators
|
|
267
|
+
: OgcFilterOperatorType.BasicAndSpatial;
|
|
268
|
+
switch (allowedOperators.toLowerCase()) {
|
|
269
|
+
case OgcFilterOperatorType.All:
|
|
270
|
+
effectiveOperators = this.operators;
|
|
271
|
+
break;
|
|
272
|
+
case OgcFilterOperatorType.Spatial:
|
|
273
|
+
effectiveOperators = {
|
|
274
|
+
[OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
|
|
275
|
+
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
|
|
276
|
+
};
|
|
277
|
+
break;
|
|
278
|
+
case OgcFilterOperatorType.BasicAndSpatial:
|
|
279
|
+
effectiveOperators = {
|
|
280
|
+
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
281
|
+
spatial: false,
|
|
282
|
+
fieldRestrict: []
|
|
283
|
+
},
|
|
284
|
+
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
285
|
+
spatial: false,
|
|
286
|
+
fieldRestrict: []
|
|
287
|
+
},
|
|
288
|
+
[OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
|
|
289
|
+
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
|
|
290
|
+
};
|
|
291
|
+
break;
|
|
292
|
+
case OgcFilterOperatorType.Basic:
|
|
293
|
+
effectiveOperators = {
|
|
294
|
+
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
295
|
+
spatial: false,
|
|
296
|
+
fieldRestrict: []
|
|
297
|
+
},
|
|
298
|
+
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
299
|
+
spatial: false,
|
|
300
|
+
fieldRestrict: []
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
break;
|
|
304
|
+
case OgcFilterOperatorType.Time:
|
|
305
|
+
effectiveOperators = {
|
|
306
|
+
[OgcFilterOperator.During]: { spatial: false, fieldRestrict: [] }
|
|
307
|
+
};
|
|
308
|
+
break;
|
|
309
|
+
case OgcFilterOperatorType.BasicNumericOperator:
|
|
310
|
+
effectiveOperators = {
|
|
311
|
+
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
312
|
+
spatial: false,
|
|
313
|
+
fieldRestrict: []
|
|
314
|
+
},
|
|
315
|
+
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
316
|
+
spatial: false,
|
|
317
|
+
fieldRestrict: []
|
|
318
|
+
},
|
|
319
|
+
[OgcFilterOperator.PropertyIsGreaterThan]: {
|
|
320
|
+
spatial: false,
|
|
321
|
+
fieldRestrict: ['number']
|
|
322
|
+
},
|
|
323
|
+
[OgcFilterOperator.PropertyIsGreaterThanOrEqualTo]: {
|
|
324
|
+
spatial: false,
|
|
325
|
+
fieldRestrict: ['number']
|
|
326
|
+
},
|
|
327
|
+
[OgcFilterOperator.PropertyIsLessThan]: {
|
|
328
|
+
spatial: false,
|
|
329
|
+
fieldRestrict: ['number']
|
|
330
|
+
},
|
|
331
|
+
[OgcFilterOperator.PropertyIsLessThanOrEqualTo]: {
|
|
332
|
+
spatial: false,
|
|
333
|
+
fieldRestrict: ['number']
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
break;
|
|
337
|
+
default:
|
|
338
|
+
effectiveOperators = {
|
|
339
|
+
[OgcFilterOperator.PropertyIsEqualTo]: {
|
|
340
|
+
spatial: false,
|
|
341
|
+
fieldRestrict: []
|
|
342
|
+
},
|
|
343
|
+
[OgcFilterOperator.PropertyIsNotEqualTo]: {
|
|
344
|
+
spatial: false,
|
|
345
|
+
fieldRestrict: []
|
|
346
|
+
},
|
|
347
|
+
[OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
|
|
348
|
+
[OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
if (fieldsHasSpatialOperator) {
|
|
352
|
+
effectiveOperators.Intersects = {
|
|
353
|
+
spatial: true,
|
|
354
|
+
fieldRestrict: []
|
|
355
|
+
};
|
|
356
|
+
effectiveOperators.Within = { spatial: true, fieldRestrict: [] };
|
|
357
|
+
if (includeContains) {
|
|
358
|
+
effectiveOperators.Contains = {
|
|
359
|
+
spatial: true,
|
|
360
|
+
fieldRestrict: []
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return effectiveOperators;
|
|
365
|
+
}
|
|
366
|
+
addInterfaceFilter(igoOgcFilterObject, geometryName, level = 0, parentLogical = 'Or') {
|
|
367
|
+
if (!igoOgcFilterObject) {
|
|
368
|
+
igoOgcFilterObject = { operator: 'PropertyIsEqualTo' };
|
|
369
|
+
}
|
|
370
|
+
const f = {
|
|
371
|
+
propertyName: '',
|
|
372
|
+
operator: '',
|
|
373
|
+
active: '',
|
|
374
|
+
filterid: uuid(),
|
|
375
|
+
step: '',
|
|
376
|
+
begin: '',
|
|
377
|
+
end: '',
|
|
378
|
+
sliderOptions: {},
|
|
379
|
+
lowerBoundary: '',
|
|
380
|
+
upperBoundary: '',
|
|
381
|
+
expression: '',
|
|
382
|
+
pattern: '',
|
|
383
|
+
wildCard: '*',
|
|
384
|
+
singleChar: '.',
|
|
385
|
+
escapeChar: '!',
|
|
386
|
+
matchCase: true,
|
|
387
|
+
igoSpatialSelector: '',
|
|
388
|
+
igoSNRC: '',
|
|
389
|
+
geometryName: '',
|
|
390
|
+
geometry: '',
|
|
391
|
+
wkt_geometry: '',
|
|
392
|
+
extent: '',
|
|
393
|
+
srsName: '',
|
|
394
|
+
parentLogical: '',
|
|
395
|
+
level: 0
|
|
396
|
+
};
|
|
397
|
+
return Object.assign(f, {
|
|
398
|
+
parentLogical,
|
|
399
|
+
level,
|
|
400
|
+
geometryName
|
|
401
|
+
}, igoOgcFilterObject);
|
|
402
|
+
}
|
|
403
|
+
checkIgoFiltersProperties(filterObject, fieldNameGeometry, proj, active = false) {
|
|
404
|
+
const filterArray = [];
|
|
405
|
+
if (filterObject instanceof Array) {
|
|
406
|
+
filterObject.forEach((element) => {
|
|
407
|
+
filterArray.push(this.checkIgoFiltersProperties(element, fieldNameGeometry, proj, active));
|
|
408
|
+
});
|
|
409
|
+
return filterArray;
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
if (filterObject.hasOwnProperty('logical')) {
|
|
413
|
+
return Object.assign({}, {
|
|
414
|
+
logical: filterObject.logical,
|
|
415
|
+
filters: this.checkIgoFiltersProperties(filterObject.filters, fieldNameGeometry, proj, active)
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
else if (filterObject.hasOwnProperty('operator')) {
|
|
419
|
+
return this.addFilterProperties(filterObject, fieldNameGeometry, proj, active);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
addFilterProperties(igoOgcFilterObject, fieldNameGeometry, proj, active = false) {
|
|
424
|
+
const filterid = igoOgcFilterObject.hasOwnProperty('filterid')
|
|
425
|
+
? igoOgcFilterObject.filterid
|
|
426
|
+
: uuid();
|
|
427
|
+
const status = igoOgcFilterObject.hasOwnProperty('active')
|
|
428
|
+
? igoOgcFilterObject.active
|
|
429
|
+
: active;
|
|
430
|
+
const srsName = igoOgcFilterObject.hasOwnProperty('srsName')
|
|
431
|
+
? igoOgcFilterObject.srsName
|
|
432
|
+
: proj
|
|
433
|
+
? proj.getCode()
|
|
434
|
+
: 'EPSG:3857';
|
|
435
|
+
return Object.assign({}, {
|
|
436
|
+
filterid,
|
|
437
|
+
active: status,
|
|
438
|
+
igoSpatialSelector: 'fixedExtent',
|
|
439
|
+
srsName
|
|
440
|
+
}, igoOgcFilterObject, { geometryName: fieldNameGeometry });
|
|
441
|
+
}
|
|
442
|
+
rebuiltIgoOgcFilterObjectFromSequence(sequence) {
|
|
443
|
+
if (sequence instanceof Array) {
|
|
444
|
+
if (sequence.length >= 1) {
|
|
445
|
+
let lastParentLogical = sequence[0].parentLogical;
|
|
446
|
+
let nextElement;
|
|
447
|
+
let logicalArray = [];
|
|
448
|
+
let lastProcessedFilter;
|
|
449
|
+
sequence.forEach((uiFilter) => {
|
|
450
|
+
const element = Object.assign({}, uiFilter);
|
|
451
|
+
const index = sequence.indexOf(uiFilter);
|
|
452
|
+
if (index >= 0 && index < sequence.length - 1) {
|
|
453
|
+
nextElement = sequence[index + 1];
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
nextElement = element;
|
|
457
|
+
}
|
|
458
|
+
delete element.active;
|
|
459
|
+
delete element.filterid;
|
|
460
|
+
delete element.parentLogical;
|
|
461
|
+
logicalArray.push(element);
|
|
462
|
+
if (sequence.length === 1) {
|
|
463
|
+
lastProcessedFilter = element;
|
|
464
|
+
}
|
|
465
|
+
else if (lastParentLogical !== nextElement.parentLogical) {
|
|
466
|
+
if (logicalArray.length === 1) {
|
|
467
|
+
console.log('You must set at ' +
|
|
468
|
+
'least two operator in a logical (' +
|
|
469
|
+
lastParentLogical +
|
|
470
|
+
')');
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
lastProcessedFilter = Object.assign({}, { logical: lastParentLogical, filters: logicalArray });
|
|
474
|
+
logicalArray = [lastProcessedFilter];
|
|
475
|
+
lastParentLogical = nextElement.parentLogical;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
return lastProcessedFilter;
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
return undefined;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
return undefined;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
computeIgoSelector(selectors) {
|
|
490
|
+
if (selectors.groups.every((group) => group.computedSelectors !== undefined)) {
|
|
491
|
+
return selectors;
|
|
492
|
+
}
|
|
493
|
+
let selector;
|
|
494
|
+
if (selectors.groups && selectors.bundles) {
|
|
495
|
+
if (!selectors.bundles.every((bundle) => bundle.id !== undefined)) {
|
|
496
|
+
throw new Error('You must set an id for each of your bundles');
|
|
497
|
+
}
|
|
498
|
+
selector = ObjectUtils.copyDeep(selectors);
|
|
499
|
+
selector.groups.forEach((group) => {
|
|
500
|
+
group.title = group.title ? group.title : group.name;
|
|
501
|
+
group.enabled = group.enabled ? group.enabled : false;
|
|
502
|
+
group.computedSelectors = ObjectUtils.copyDeep(selector.bundles.filter((b) => group.ids.includes(b.id)));
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
else if (!selectors.groups && selectors.bundles) {
|
|
506
|
+
selector = ObjectUtils.copyDeep(selectors);
|
|
507
|
+
selector.groups = [
|
|
508
|
+
{
|
|
509
|
+
title: 'group1',
|
|
510
|
+
name: 'group1',
|
|
511
|
+
computedSelectors: ObjectUtils.copyDeep(selector.bundles)
|
|
512
|
+
}
|
|
513
|
+
];
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
selector = {
|
|
517
|
+
bundles: selectors,
|
|
518
|
+
groups: [
|
|
519
|
+
{
|
|
520
|
+
title: 'group1',
|
|
521
|
+
name: 'group1',
|
|
522
|
+
computedSelectors: ObjectUtils.copyDeep(selectors)
|
|
523
|
+
}
|
|
524
|
+
],
|
|
525
|
+
selectorType: selector.selectorType
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
if (!selector.groups.find((selectorGroup) => selectorGroup.enabled)) {
|
|
529
|
+
selector.groups[0].enabled = true;
|
|
530
|
+
}
|
|
531
|
+
return selector;
|
|
532
|
+
}
|
|
533
|
+
handleOgcFiltersAppliedValue(options, fieldNameGeometry, extent, proj) {
|
|
534
|
+
const ogcFilters = options.ogcFilters;
|
|
535
|
+
if (!ogcFilters) {
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
const conditions = [];
|
|
539
|
+
let filterQueryStringSelector = '';
|
|
540
|
+
let filterQueryStringAdvancedFilters = '';
|
|
541
|
+
if (ogcFilters.enabled && (ogcFilters.pushButtons || ogcFilters.checkboxes || ogcFilters.radioButtons || ogcFilters.select
|
|
542
|
+
|| ogcFilters.autocomplete)) {
|
|
543
|
+
let selectors;
|
|
544
|
+
if (ogcFilters.pushButtons) {
|
|
545
|
+
selectors = ogcFilters.pushButtons;
|
|
546
|
+
const pushConditions = this.formatGroupAndFilter(ogcFilters, selectors);
|
|
547
|
+
for (const condition of pushConditions) {
|
|
548
|
+
conditions.push(condition);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
if (ogcFilters.checkboxes) {
|
|
552
|
+
selectors = ogcFilters.checkboxes;
|
|
553
|
+
const checkboxConditions = this.formatGroupAndFilter(ogcFilters, selectors);
|
|
554
|
+
for (const condition of checkboxConditions) {
|
|
555
|
+
conditions.push(condition);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
if (ogcFilters.radioButtons) {
|
|
559
|
+
selectors = ogcFilters.radioButtons;
|
|
560
|
+
const selectorsCorr = this.verifyMultipleEnableds(selectors);
|
|
561
|
+
const radioConditions = this.formatGroupAndFilter(ogcFilters, selectorsCorr);
|
|
562
|
+
for (const condition of radioConditions) {
|
|
563
|
+
conditions.push(condition);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
if (ogcFilters.select) {
|
|
567
|
+
selectors = ogcFilters.select;
|
|
568
|
+
const selectorsCorr = this.verifyMultipleEnableds(selectors);
|
|
569
|
+
const selectConditions = this.formatGroupAndFilter(ogcFilters, selectorsCorr);
|
|
570
|
+
for (const condition of selectConditions) {
|
|
571
|
+
conditions.push(condition);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
if (ogcFilters.autocomplete) {
|
|
575
|
+
selectors = ogcFilters.autocomplete;
|
|
576
|
+
const selectConditions = this.formatGroupAndFilter(ogcFilters, selectors);
|
|
577
|
+
for (const condition of selectConditions) {
|
|
578
|
+
conditions.push(condition);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
if (conditions.length >= 1) {
|
|
582
|
+
filterQueryStringSelector = this.buildFilter(conditions.length === 1
|
|
583
|
+
? conditions[0]
|
|
584
|
+
: { logical: 'And', filters: conditions }, extent, proj, ogcFilters.geometryName);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
if (ogcFilters.enabled && ogcFilters.filters) {
|
|
588
|
+
ogcFilters.geometryName = ogcFilters.geometryName || fieldNameGeometry;
|
|
589
|
+
const igoFilters = ogcFilters.filters;
|
|
590
|
+
filterQueryStringAdvancedFilters = this.buildFilter(igoFilters, extent, proj, ogcFilters.geometryName, options);
|
|
591
|
+
}
|
|
592
|
+
let filterQueryString = ogcFilters.advancedOgcFilters
|
|
593
|
+
? filterQueryStringAdvancedFilters
|
|
594
|
+
: filterQueryStringSelector;
|
|
595
|
+
if (options.type === 'wms') {
|
|
596
|
+
filterQueryString = this.formatProcessedOgcFilter(filterQueryString, options.params.LAYERS);
|
|
597
|
+
}
|
|
598
|
+
if (options.type === 'wfs') {
|
|
599
|
+
filterQueryString = this.formatProcessedOgcFilter(filterQueryString, options.params.featureTypes);
|
|
600
|
+
}
|
|
601
|
+
return filterQueryString;
|
|
602
|
+
}
|
|
603
|
+
verifyMultipleEnableds(selectors) {
|
|
604
|
+
selectors.bundles.forEach(bundle => {
|
|
605
|
+
if (!bundle.multiple && bundle.selectors) {
|
|
606
|
+
const enableds = bundle.selectors.reduce((list, filter, index) => (filter.enabled) === true ? list.concat(index) : list, []);
|
|
607
|
+
if (enableds.length > 1) {
|
|
608
|
+
enableds.splice(0, 1);
|
|
609
|
+
enableds.forEach(index => {
|
|
610
|
+
bundle.selectors[index].enabled = false;
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
});
|
|
615
|
+
return selectors;
|
|
616
|
+
}
|
|
617
|
+
formatGroupAndFilter(ogcFilters, selectors) {
|
|
618
|
+
selectors = this.computeIgoSelector(selectors);
|
|
619
|
+
const selectorBundle = selectors.groups.find((g) => g.enabled).computedSelectors;
|
|
620
|
+
const conditions = [];
|
|
621
|
+
selectorBundle.map((bundle) => {
|
|
622
|
+
const bundleCondition = [];
|
|
623
|
+
const selectorsType = bundle.selectors;
|
|
624
|
+
if (!selectorsType) {
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
selectorsType
|
|
628
|
+
.filter((ogcselector) => ogcselector.enabled === true)
|
|
629
|
+
.forEach((enabledSelector) => bundleCondition.push(enabledSelector.filters));
|
|
630
|
+
if (bundleCondition.length === 1) {
|
|
631
|
+
conditions.push(bundleCondition[0]);
|
|
632
|
+
}
|
|
633
|
+
else if (bundleCondition.length > 1) {
|
|
634
|
+
conditions.push({
|
|
635
|
+
logical: bundle.logical,
|
|
636
|
+
filters: bundleCondition
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
if (selectors.selectorType === 'pushButton') {
|
|
641
|
+
ogcFilters.pushButtons = selectors;
|
|
642
|
+
}
|
|
643
|
+
else if (selectors.selectorType === 'checkbox') {
|
|
644
|
+
ogcFilters.checkboxes = selectors;
|
|
645
|
+
}
|
|
646
|
+
else if (selectors.selectorType === 'radioButton') {
|
|
647
|
+
ogcFilters.radioButtons = selectors;
|
|
648
|
+
}
|
|
649
|
+
else if (selectors.selectorType === 'select') {
|
|
650
|
+
ogcFilters.select = selectors;
|
|
651
|
+
}
|
|
652
|
+
else if (selectors.selectorType === 'autocomplete') {
|
|
653
|
+
ogcFilters.autocomplete = selectors;
|
|
654
|
+
}
|
|
655
|
+
return conditions;
|
|
656
|
+
}
|
|
657
|
+
formatProcessedOgcFilter(processedFilter, layersOrTypenames) {
|
|
658
|
+
if (!processedFilter) {
|
|
659
|
+
return undefined;
|
|
660
|
+
}
|
|
661
|
+
;
|
|
662
|
+
let appliedFilter = '';
|
|
663
|
+
if (processedFilter.length === 0 && layersOrTypenames.indexOf(',') === -1) {
|
|
664
|
+
appliedFilter = processedFilter;
|
|
665
|
+
}
|
|
666
|
+
else {
|
|
667
|
+
layersOrTypenames.split(',').forEach((layerOrTypenames) => {
|
|
668
|
+
appliedFilter = `${appliedFilter}(${processedFilter.replace('filter=', '')})`;
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
appliedFilter = appliedFilter.replace(/\(\)/g, '');
|
|
672
|
+
const filterValue = appliedFilter.length > 0
|
|
673
|
+
? appliedFilter.replace('filter=', '')
|
|
674
|
+
: undefined;
|
|
675
|
+
return filterValue;
|
|
676
|
+
}
|
|
677
|
+
parseFilterOptionDate(value, defaultValue) {
|
|
678
|
+
if (!value) {
|
|
679
|
+
return defaultValue;
|
|
680
|
+
}
|
|
681
|
+
else if (value === 'today') {
|
|
682
|
+
return undefined;
|
|
683
|
+
}
|
|
684
|
+
else if (moment(value).isValid()) {
|
|
685
|
+
return value;
|
|
686
|
+
}
|
|
687
|
+
else {
|
|
688
|
+
return undefined;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
692
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2djLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9zaGFyZWQvb2djLWZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLFdBQXVDLE1BQU0sZUFBZSxDQUFDO0FBS3BFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBYWhELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxPQUFPLElBQUksTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE1BQU0sT0FBTyxlQUFlO0lBQTVCO1FBQ1UsbUJBQWMsR0FBZ0MsRUFBRSxDQUFDO1FBQ2xELGNBQVMsR0FBRztZQUNqQixDQUFDLGlCQUFpQixDQUFDLGlCQUEyQixDQUFDLEVBQUU7Z0JBQy9DLE9BQU8sRUFBRSxLQUFLO2dCQUNkLGFBQWEsRUFBRSxFQUFFO2FBQ2xCO1lBQ0QsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBOEIsQ0FBQyxFQUFFO2dCQUNsRCxPQUFPLEVBQUUsS0FBSztnQkFDZCxhQUFhLEVBQUUsRUFBRTthQUNsQjtZQUNELENBQUMsaUJBQWlCLENBQUMsY0FBd0IsQ0FBQyxFQUFFO2dCQUM1QyxPQUFPLEVBQUUsS0FBSztnQkFDZCxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUM7YUFDMUI7WUFDRCxDQUFDLGlCQUFpQixDQUFDLHFCQUErQixDQUFDLEVBQUU7Z0JBQ25ELE9BQU8sRUFBRSxLQUFLO2dCQUNkLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQzthQUMxQjtZQUNELENBQUMsaUJBQWlCLENBQUMsOEJBQXdDLENBQUMsRUFBRTtnQkFD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LE9BQU8sU0FBUyxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsT0FBTyxTQUFTLENBQUM7U0FDbEI7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvbGZpbHRlciBmcm9tICdvbC9mb3JtYXQvZmlsdGVyJztcbmltcG9ydCBvbEZvcm1hdFdLVCBmcm9tICdvbC9mb3JtYXQvV0tUJztcbmltcG9ydCBvbEZvcm1hdFdGUywgeyBXcml0ZUdldEZlYXR1cmVPcHRpb25zIH0gZnJvbSAnb2wvZm9ybWF0L1dGUyc7XG5pbXBvcnQgb2xHZW9tZXRyeSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcblxuaW1wb3J0IG9sUHJvamVjdGlvbiBmcm9tICdvbC9wcm9qL1Byb2plY3Rpb24nO1xuXG5pbXBvcnQgeyB1dWlkLCBPYmplY3RVdGlscyB9IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgT2djRmlsdGVyLFxuICBJZ29PZ2NGaWx0ZXJPYmplY3QsXG4gIEFueUJhc2VPZ2NGaWx0ZXJPcHRpb25zLFxuICBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zLFxuICBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnMsXG4gIE9nY0ZpbHRlcnNPcHRpb25zLFxuICBJZ29PZ2NTZWxlY3RvcixcbiAgU2VsZWN0b3JHcm91cCxcbiAgT2djU2VsZWN0b3JCdW5kbGVcbn0gZnJvbSAnLi9vZ2MtZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUsIE9nY0ZpbHRlck9wZXJhdG9yIH0gZnJvbSAnLi9vZ2MtZmlsdGVyLmVudW0nO1xuaW1wb3J0IHsgU291cmNlRmllbGRzT3B0aW9uc1BhcmFtcyB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2RhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgbW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmV4cG9ydCBjbGFzcyBPZ2NGaWx0ZXJXcml0ZXIge1xuICBwcml2YXRlIGZpbHRlclNlcXVlbmNlOiBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zW10gPSBbXTtcbiAgcHVibGljIG9wZXJhdG9ycyA9IHtcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0VxdWFsVG8gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgZmllbGRSZXN0cmljdDogW11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGlrZSBhcyBzdHJpbmddOiB7XG4gICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgIGZpZWxkUmVzdHJpY3Q6IFsnc3RyaW5nJ11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzR3JlYXRlclRoYW4gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbJ251bWJlciddXG4gICAgfSxcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbiBhcyBzdHJpbmddOiB7XG4gICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgIGZpZWxkUmVzdHJpY3Q6IFsnbnVtYmVyJ11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGVzc1RoYW5PckVxdWFsVG8gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbJ251bWJlciddXG4gICAgfSxcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0JldHdlZW4gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbJ251bWJlciddXG4gICAgfSxcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuRHVyaW5nIGFzIHN0cmluZ106IHsgc3BhdGlhbDogZmFsc2UsIGZpZWxkUmVzdHJpY3Q6IFtdIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOdWxsIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgZmllbGRSZXN0cmljdDogW11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5JbnRlcnNlY3RzIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IHRydWUsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLldpdGhpbiBhcyBzdHJpbmddOiB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLkNvbnRhaW5zIGFzIHN0cmluZ106IHsgc3BhdGlhbDogdHJ1ZSwgZmllbGRSZXN0cmljdDogW10gfVxuICB9O1xuXG4gIGRlZmluZU9nY0ZpbHRlcnNEZWZhdWx0T3B0aW9ucyhcbiAgICBvZ2NGaWx0ZXJzT3B0aW9uczogT2djRmlsdGVyc09wdGlvbnMsXG4gICAgZmllbGROYW1lR2VvbWV0cnk6IHN0cmluZyxcbiAgICBzcmNUeXBlPzogc3RyaW5nXG4gICk6IE9nY0ZpbHRlcnNPcHRpb25zIHtcbiAgICBsZXQgb2djRmlsdGVyc0RlZmF1bHRWYWx1ZSA9IHRydWU7IC8vIGRlZmF1bHQgdmFsdWVzIGZvciB3ZnMuXG4gICAgaWYgKHNyY1R5cGUgJiYgc3JjVHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIG9nY0ZpbHRlcnNEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvZ2NGaWx0ZXJzT3B0aW9ucyA9IG9nY0ZpbHRlcnNPcHRpb25zIHx8IHt9O1xuICAgIG9nY0ZpbHRlcnNPcHRpb25zLmVuYWJsZWQgPVxuICAgICAgb2djRmlsdGVyc09wdGlvbnMuZW5hYmxlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gb2djRmlsdGVyc0RlZmF1bHRWYWx1ZVxuICAgICAgICA6IG9nY0ZpbHRlcnNPcHRpb25zLmVuYWJsZWQ7XG4gICAgb2djRmlsdGVyc09wdGlvbnMuZWRpdGFibGUgPVxuICAgICAgb2djRmlsdGVyc09wdGlvbnMuZWRpdGFibGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9nY0ZpbHRlcnNEZWZhdWx0VmFsdWVcbiAgICAgICAgOiBvZ2NGaWx0ZXJzT3B0aW9ucy5lZGl0YWJsZTtcbiAgICBvZ2NGaWx0ZXJzT3B0aW9ucy5nZW9tZXRyeU5hbWUgPSBmaWVsZE5hbWVHZW9tZXRyeTtcblxuICAgIG9nY0ZpbHRlcnNPcHRpb25zLmFkdmFuY2VkT2djRmlsdGVycyA9IHRydWU7XG4gICAgaWYgKG9nY0ZpbHRlcnNPcHRpb25zLmVuYWJsZWQgJiYgKG9nY0ZpbHRlcnNPcHRpb25zLnB1c2hCdXR0b25zIHx8IG9nY0ZpbHRlcnNPcHRpb25zLmNoZWNrYm94ZXNcbiAgICAgIHx8IG9nY0ZpbHRlcnNPcHRpb25zLnJhZGlvQnV0dG9ucyB8fCBvZ2NGaWx0ZXJzT3B0aW9ucy5zZWxlY3QgfHwgb2djRmlsdGVyc09wdGlvbnMuYXV0b2NvbXBsZXRlKSkge1xuICAgICAgb2djRmlsdGVyc09wdGlvbnMuYWR2YW5jZWRPZ2NGaWx0ZXJzID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvZ2NGaWx0ZXJzT3B0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBidWlsZEZpbHRlcihcbiAgICBmaWx0ZXJzPzogSWdvT2djRmlsdGVyT2JqZWN0LFxuICAgIGV4dGVudD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHByb2o/OiBvbFByb2plY3Rpb24sXG4gICAgZmllbGROYW1lR2VvbWV0cnk/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGxldCBvdXJCYm94RmlsdGVyO1xuICAgIGxldCBlbmFibGVCYm94OiBib29sZWFuO1xuICAgIGlmICgvaW50ZXJzZWN0c3xjb250YWluc3x3aXRoaW4vZ2kudGVzdChKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSkpIHtcbiAgICAgIGVuYWJsZUJib3ggPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlQmJveCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWVsZE5hbWVHZW9tZXRyeSA9XG4gICAgICAgIChmaWx0ZXJzIGFzIGFueSkuZ2VvbWV0cnlOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChmaWx0ZXJzIGFzIGFueSkuZ2VvbWV0cnlOYW1lXG4gICAgICAgICAgOiBmaWVsZE5hbWVHZW9tZXRyeTtcbiAgICB9XG4gICAgaWYgKGV4dGVudCAmJiBmaWx0ZXJzKSB7XG4gICAgICBvdXJCYm94RmlsdGVyID0gb2xmaWx0ZXIuYmJveChmaWVsZE5hbWVHZW9tZXRyeSwgZXh0ZW50LCBwcm9qLmdldENvZGUoKSk7XG4gICAgfVxuICAgIGxldCBmaWx0ZXJBc3NlbWJseTogT2djRmlsdGVyO1xuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWx0ZXJzID0gdGhpcy5jaGVja0lnb0ZpbHRlcnNQcm9wZXJ0aWVzKFxuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBmaWVsZE5hbWVHZW9tZXRyeSxcbiAgICAgICAgcHJvalxuICAgICAgKTtcbiAgICAgIGlmIChleHRlbnQgJiYgZW5hYmxlQmJveCkge1xuICAgICAgICBmaWx0ZXJBc3NlbWJseSA9IG9sZmlsdGVyLmFuZChcbiAgICAgICAgICBvdXJCYm94RmlsdGVyLFxuICAgICAgICAgIHRoaXMuYnVuZGxlRmlsdGVyKGZpbHRlcnMsIG9wdGlvbnMpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXJBc3NlbWJseSA9IHRoaXMuYnVuZGxlRmlsdGVyKGZpbHRlcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2Jib3g9JyArIGV4dGVudC5qb2luKCcsJykgKyAnLCcgKyBwcm9qLmdldENvZGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZnNPcHRpb25zOiBXcml0ZUdldEZlYXR1cmVPcHRpb25zID0ge1xuICAgICAgc3JzTmFtZTogJycsXG4gICAgICBmZWF0dXJlTlM6ICcnLFxuICAgICAgZmVhdHVyZVByZWZpeDogJycsXG4gICAgICBmZWF0dXJlVHlwZXM6IFsnZmVhdHVyZVR5cGVzJ10sXG4gICAgICBmaWx0ZXI6IGZpbHRlckFzc2VtYmx5LFxuICAgICAgb3V0cHV0Rm9ybWF0OiAnJyxcbiAgICAgIGdlb21ldHJ5TmFtZTogZmllbGROYW1lR2VvbWV0cnlcbiAgICB9O1xuXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgb2xGb3JtYXRXRlMoKS53cml0ZUdldEZlYXR1cmUod2ZzT3B0aW9ucyk7XG4gICAgY29uc3Qgc3RyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhxdWVyeSk7XG4gICAgY29uc3QgcmVnZXhwMSA9IC90eXBlbmFtZXMgKj18dHlwZW5hbWUgKj1cXFwiZmVhdHVyZVR5cGVzXFxcIiAqPi9naTtcbiAgICBjb25zdCByZWdleHAyID0gLzxcXC9RdWVyeT48XFwvR2V0RmVhdHVyZT4vZ2k7XG5cbiAgICByZXR1cm4gJ2ZpbHRlcj0nICsgc3RyLnNwbGl0KHJlZ2V4cDEpWzFdLnNwbGl0KHJlZ2V4cDIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBidW5kbGVGaWx0ZXIoXG4gICAgZmlsdGVyT2JqZWN0OiBhbnksXG4gICAgb3B0aW9ucz86IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9uc1xuICApIHtcbiAgICBpZiAoZmlsdGVyT2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNvbnN0IGxvZ2ljYWxBcnJheSA9IFtdO1xuICAgICAgZmlsdGVyT2JqZWN0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgbG9naWNhbEFycmF5LnB1c2godGhpcy5idW5kbGVGaWx0ZXIoZWxlbWVudCwgb3B0aW9ucykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbG9naWNhbEFycmF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmlsdGVyT2JqZWN0Lmhhc093blByb3BlcnR5KCdsb2dpY2FsJykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRmlsdGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wZXJhdG9yOiBmaWx0ZXJPYmplY3QubG9naWNhbCxcbiAgICAgICAgICAgIGxvZ2ljYWxBcnJheTogdGhpcy5idW5kbGVGaWx0ZXIoZmlsdGVyT2JqZWN0LmZpbHRlcnMsIG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb3BlcmF0b3InKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGaWx0ZXIoXG4gICAgICAgICAgZmlsdGVyT2JqZWN0IGFzIEFueUJhc2VPZ2NGaWx0ZXJPcHRpb25zLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpbHRlcihcbiAgICBmaWx0ZXJPcHRpb25zLFxuICAgIG9wdGlvbnM/OiBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnNcbiAgKTogT2djRmlsdGVyIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IGZpbHRlck9wdGlvbnMub3BlcmF0b3I7XG4gICAgY29uc3QgbG9naWNhbEFycmF5ID0gZmlsdGVyT3B0aW9ucy5sb2dpY2FsQXJyYXk7XG5cbiAgICBjb25zdCB3ZnNQcm9wZXJ0eU5hbWUgPSBmaWx0ZXJPcHRpb25zLnByb3BlcnR5TmFtZTtcbiAgICBjb25zdCB3ZnNQYXR0ZXJuID0gZmlsdGVyT3B0aW9ucy5wYXR0ZXJuO1xuICAgIGNvbnN0IHdmc01hdGNoQ2FzZSA9IGZpbHRlck9wdGlvbnMubWF0Y2hDYXNlXG4gICAgICA/IGZpbHRlck9wdGlvbnMubWF0Y2hDYXNlXG4gICAgICA6IHRydWU7XG4gICAgY29uc3Qgd2ZzV2lsZENhcmQgPSBmaWx0ZXJPcHRpb25zLndpbGRDYXJkID8gZmlsdGVyT3B0aW9ucy53aWxkQ2FyZCA6ICcqJztcbiAgICBjb25zdCB3ZnNTaW5nbGVDaGFyID0gZmlsdGVyT3B0aW9ucy5zaW5nbGVDaGFyXG4gICAgICA/IGZpbHRlck9wdGlvbnMuc2luZ2xlQ2hhclxuICAgICAgOiAnLic7XG4gICAgY29uc3Qgd2ZzRXNjYXBlQ2hhciA9IGZpbHRlck9wdGlvbnMuZXNjYXBlQ2hhclxuICAgICAgPyBmaWx0ZXJPcHRpb25zLmVzY2FwZUNoYXJcbiAgICAgIDogJyEnO1xuXG4gICAgY29uc3Qgd2ZzTG93ZXJCb3VuZGFyeSA9IGZpbHRlck9wdGlvbnMubG93ZXJCb3VuZGFyeTtcbiAgICBjb25zdCB3ZnNVcHBlckJvdW5kYXJ5ID0gZmlsdGVyT3B0aW9ucy51cHBlckJvdW5kYXJ5O1xuXG4gICAgY29uc3Qgd2ZzR2VvbWV0cnlOYW1lID0gZmlsdGVyT3B0aW9ucy5nZW9tZXRyeU5hbWU7XG4gICAgY29uc3Qgd2ZzRXh0ZW50ID0gZmlsdGVyT3B0aW9ucy5leHRlbnQ7XG4gICAgY29uc3Qgd2ZzV2t0R2VvbWV0cnkgPSBmaWx0ZXJPcHRpb25zLndrdF9nZW9tZXRyeTtcbiAgICBjb25zdCB3ZnNTcnNOYW1lID0gZmlsdGVyT3B0aW9ucy5zcnNOYW1lXG4gICAgICA/IGZpbHRlck9wdGlvbnMuc3JzTmFtZVxuICAgICAgOiAnRVBTRzozODU3JztcblxuICAgIGNvbnN0IHdmc0JlZ2luID0gdGhpcy5wYXJzZUZpbHRlck9wdGlvbkRhdGUoXG4gICAgICBmaWx0ZXJPcHRpb25zLmJlZ2luLFxuICAgICAgb3B0aW9ucyA/IG9wdGlvbnMubWluRGF0ZSA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgY29uc3Qgd2ZzRW5kID0gdGhpcy5wYXJzZUZpbHRlck9wdGlvbkRhdGUoXG4gICAgICBmaWx0ZXJPcHRpb25zLmVuZCxcbiAgICAgIG9wdGlvbnMgPyBvcHRpb25zLm1heERhdGUgOiB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgY29uc3Qgd2ZzRXhwcmVzc2lvbiA9IGZpbHRlck9wdGlvbnMuZXhwcmVzc2lvbjtcblxuICAgIGxldCBnZW9tZXRyeTogb2xHZW9tZXRyeTtcbiAgICBpZiAod2ZzV2t0R2VvbWV0cnkpIHtcbiAgICAgIGNvbnN0IHdrdCA9IG5ldyBvbEZvcm1hdFdLVCgpO1xuICAgICAgZ2VvbWV0cnkgPSB3a3QucmVhZEdlb21ldHJ5KHdmc1drdEdlb21ldHJ5LCB7XG4gICAgICAgIGRhdGFQcm9qZWN0aW9uOiB3ZnNTcnNOYW1lLFxuICAgICAgICBmZWF0dXJlUHJvamVjdGlvbjogd2ZzU3JzTmFtZSB8fCAnRVBTRzozODU3J1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChvcGVyYXRvci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLkJCT1gudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmJib3god2ZzR2VvbWV0cnlOYW1lLCB3ZnNFeHRlbnQsIHdmc1Nyc05hbWUpO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzQmV0d2Vlbi50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuYmV0d2VlbihcbiAgICAgICAgICB3ZnNQcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgd2ZzTG93ZXJCb3VuZGFyeSB8fCAxZTQwKi0xLFxuICAgICAgICAgIHdmc1VwcGVyQm91bmRhcnkgfHwgMWU0MFxuICAgICAgICApO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Db250YWlucy50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuY29udGFpbnMod2ZzR2VvbWV0cnlOYW1lLCBnZW9tZXRyeSwgd2ZzU3JzTmFtZSk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLkR1cmluZy50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuZHVyaW5nKHdmc1Byb3BlcnR5TmFtZSwgd2ZzQmVnaW4sIHdmc0VuZCk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNFcXVhbFRvLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5lcXVhbFRvKHdmc1Byb3BlcnR5TmFtZSwgd2ZzRXhwcmVzc2lvbiwgd2ZzTWF0Y2hDYXNlKTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0dyZWF0ZXJUaGFuLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5ncmVhdGVyVGhhbih3ZnNQcm9wZXJ0eU5hbWUsIHdmc0V4cHJlc3Npb24pO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzR3JlYXRlclRoYW5PckVxdWFsVG8udG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmdyZWF0ZXJUaGFuT3JFcXVhbFRvKHdmc1Byb3BlcnR5TmFtZSwgd2ZzRXhwcmVzc2lvbik7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLkludGVyc2VjdHMudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmludGVyc2VjdHMod2ZzR2VvbWV0cnlOYW1lLCBnZW9tZXRyeSwgd2ZzU3JzTmFtZSk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOdWxsLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5pc051bGwod2ZzUHJvcGVydHlOYW1lKTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0xlc3NUaGFuLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5sZXNzVGhhbih3ZnNQcm9wZXJ0eU5hbWUsIHdmc0V4cHJlc3Npb24pO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGVzc1RoYW5PckVxdWFsVG8udG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmxlc3NUaGFuT3JFcXVhbFRvKHdmc1Byb3BlcnR5TmFtZSwgd2ZzRXhwcmVzc2lvbik7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMaWtlLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5saWtlKFxuICAgICAgICAgIHdmc1Byb3BlcnR5TmFtZSxcbiAgICAgICAgICB3ZnNQYXR0ZXJuID8gd2ZzUGF0dGVybi5yZXBsYWNlKC9bKClfXS9naSwgd2ZzU2luZ2xlQ2hhcik6IHdmc1dpbGRDYXJkLFxuICAgICAgICAgIHdmc1dpbGRDYXJkLFxuICAgICAgICAgIHdmc1NpbmdsZUNoYXIsXG4gICAgICAgICAgd2ZzRXNjYXBlQ2hhcixcbiAgICAgICAgICB3ZnNNYXRjaENhc2VcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc05vdEVxdWFsVG8udG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLm5vdEVxdWFsVG8oXG4gICAgICAgICAgd2ZzUHJvcGVydHlOYW1lLFxuICAgICAgICAgIHdmc0V4cHJlc3Npb24sXG4gICAgICAgICAgd2ZzTWF0Y2hDYXNlXG4gICAgICAgICk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLldpdGhpbi50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIud2l0aGluKHdmc0dlb21ldHJ5TmFtZSwgZ2VvbWV0cnksIHdmc1Nyc05hbWUpO1xuICAgICAgLy8gTE9HSUNBTFxuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5BbmQudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmFuZC5hcHBseShudWxsLCBsb2dpY2FsQXJyYXkpO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Pci50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIub3IuYXBwbHkobnVsbCwgbG9naWNhbEFycmF5KTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuTm90LnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5ub3QuYXBwbHkobnVsbCwgbG9naWNhbEFycmF5KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVmaW5lSW50ZXJmYWNlRmlsdGVyU2VxdWVuY2UoXG4gICAgZmlsdGVyT2JqZWN0OiBhbnksXG4gICAgZ2VvbWV0cnlOYW1lLFxuICAgIGxvZ2ljYWwgPSAnJyxcbiAgICBsZXZlbCA9IC0xXG4gICk6IE9nY0ludGVyZmFjZUZpbHRlck9wdGlvbnNbXSB7XG4gICAgaWYgKGZpbHRlck9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBmaWx0ZXJPYmplY3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlclNlcXVlbmNlLmNvbmNhdChcbiAgICAgICAgICB0aGlzLmRlZmluZUludGVyZmFjZUZpbHRlclNlcXVlbmNlKFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGdlb21ldHJ5TmFtZSxcbiAgICAgICAgICAgIGxvZ2ljYWwsXG4gICAgICAgICAgICBsZXZlbFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmlsdGVyT2JqZWN0Lmhhc093blByb3BlcnR5KCdsb2dpY2FsJykpIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDE7XG4gICAgICAgIHRoaXMuZmlsdGVyU2VxdWVuY2UuY29uY2F0KFxuICAgICAgICAgIHRoaXMuZGVmaW5lSW50ZXJmYWNlRmlsdGVyU2VxdWVuY2UoXG4gICAgICAgICAgICBmaWx0ZXJPYmplY3QuZmlsdGVycyxcbiAgICAgICAgICAgIGdlb21ldHJ5TmFtZSxcbiAgICAgICAgICAgIGZpbHRlck9iamVjdC5sb2dpY2FsLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb3BlcmF0b3InKSkge1xuICAgICAgICB0aGlzLmZpbHRlclNlcXVlbmNlLnB1c2goXG4gICAgICAgICAgdGhpcy5hZGRJbnRlcmZhY2VGaWx0ZXIoZmlsdGVyT2JqZWN0LCBnZW9tZXRyeU5hbWUsIGxldmVsLCBsb2dpY2FsKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJTZXF1ZW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBjb21wdXRlQWxsb3dlZE9wZXJhdG9ycyhcbiAgICBmaWVsZHM/OiBTb3VyY2VGaWVsZHNPcHRpb25zUGFyYW1zW10sXG4gICAgcHJvcGVydHlOYW1lPzogc3RyaW5nLFxuICAgIGRlZmF1bHRPcGVyYXRvcnNUeXBlPzogT2djRmlsdGVyT3BlcmF0b3JUeXBlXG4gICkge1xuICAgIGxldCBlZmZlY3RpdmVPcGVyYXRvcnM6IHt9ID0ge307XG4gICAgbGV0IGFsbG93ZWRPcGVyYXRvcnM7XG4gICAgbGV0IGZpZWxkc0hhc1NwYXRpYWxPcGVyYXRvcjogYm9vbGVhbjtcbiAgICBsZXQgaW5jbHVkZUNvbnRhaW5zOiBib29sZWFuO1xuXG4gICAgaWYgKGZpZWxkcyAmJiBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHNyY0ZpZWxkID0gZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBwcm9wZXJ0eU5hbWUpO1xuICAgICAgYWxsb3dlZE9wZXJhdG9ycyA9XG4gICAgICAgIHNyY0ZpZWxkICYmIHNyY0ZpZWxkLmFsbG93ZWRPcGVyYXRvcnNUeXBlXG4gICAgICAgICAgPyBzcmNGaWVsZC5hbGxvd2VkT3BlcmF0b3JzVHlwZVxuICAgICAgICAgIDogZGVmYXVsdE9wZXJhdG9yc1R5cGU7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgZmllbGRzLm1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5hbGxvd2VkT3BlcmF0b3JzVHlwZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvd2VkT3BlcmF0b3JzVHlwZSA9IGZpZWxkLmFsbG93ZWRPcGVyYXRvcnNUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbGxvd2VkT3BlcmF0b3JzVHlwZSA9PT0gT2djRmlsdGVyT3BlcmF0b3JUeXBlLkFsbC50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgYWxsb3dlZE9wZXJhdG9yc1R5cGUgPT09XG4gICAgICAgICAgICBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuU3BhdGlhbC50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgYWxsb3dlZE9wZXJhdG9yc1R5cGUgPT09XG4gICAgICAgICAgICBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuQmFzaWNBbmRTcGF0aWFsLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGRzSGFzU3BhdGlhbE9wZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhbGxvd2VkT3BlcmF0b3JzVHlwZSA9PT0gT2djRmlsdGVyT3BlcmF0b3JUeXBlLkFsbC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpbmNsdWRlQ29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWxsb3dlZE9wZXJhdG9ycyA9IGFsbG93ZWRPcGVyYXRvcnNcbiAgICAgID8gYWxsb3dlZE9wZXJhdG9yc1xuICAgICAgOiBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuQmFzaWNBbmRTcGF0aWFsO1xuXG4gICAgc3dpdGNoIChhbGxvd2VkT3BlcmF0b3JzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3JUeXBlLkFsbDpcbiAgICAgICAgZWZmZWN0aXZlT3BlcmF0b3JzID0gdGhpcy5vcGVyYXRvcnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuU3BhdGlhbDpcbiAgICAgICAgZWZmZWN0aXZlT3BlcmF0b3JzID0ge1xuICAgICAgICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5JbnRlcnNlY3RzXTogeyBzcGF0aWFsOiB0cnVlLCBmaWVsZFJlc3RyaWN0OiBbXSB9LFxuICAgICAgICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5XaXRoaW5dOiB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yVHlwZS5CYXNpY0FuZFNwYXRpYWw6XG4gICAgICAgIGVmZmVjdGl2ZU9wZXJhdG9ycyA9IHtcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0VxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc05vdEVxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuSW50ZXJzZWN0c106IHsgc3BhdGlhbDogdHJ1ZSwgZmllbGRSZXN0cmljdDogW10gfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuV2l0aGluXTogeyBzcGF0aWFsOiB0cnVlLCBmaWVsZFJlc3RyaWN0OiBbXSB9XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuQmFzaWM6XG4gICAgICAgIGVmZmVjdGl2ZU9wZXJhdG9ycyA9IHtcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0VxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc05vdEVxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3JUeXBlLlRpbWU6XG4gICAgICAgIGVmZmVjdGl2ZU9wZXJhdG9ycyA9IHtcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuRHVyaW5nXTogeyBzcGF0aWFsOiBmYWxzZSwgZmllbGRSZXN0cmljdDogW10gfVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3JUeXBlLkJhc2ljTnVtZXJpY09wZXJhdG9yOlxuICAgICAgICBlZmZlY3RpdmVPcGVyYXRvcnMgPSB7XG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNHcmVhdGVyVGhhbl06IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNHcmVhdGVyVGhhbk9yRXF1YWxUb106IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbl06IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbk9yRXF1YWxUb106IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlZmZlY3RpdmVPcGVyYXRvcnMgPSB7XG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLkludGVyc2VjdHNdOiB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLldpdGhpbl06IHsgc3BhdGlhbDogdHJ1ZSwgZmllbGRSZXN0cmljdDogW10gfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChmaWVsZHNIYXNTcGF0aWFsT3BlcmF0b3IpIHtcbiAgICAgIChlZmZlY3RpdmVPcGVyYXRvcnMgYXMgYW55KS5JbnRlcnNlY3RzID0ge1xuICAgICAgICBzcGF0aWFsOiB0cnVlLFxuICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgfTtcbiAgICAgIChlZmZlY3RpdmVPcGVyYXRvcnMgYXMgYW55KS5XaXRoaW4gPSB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH07XG4gICAgICBpZiAoaW5jbHVkZUNvbnRhaW5zKSB7XG4gICAgICAgIChlZmZlY3RpdmVPcGVyYXRvcnMgYXMgYW55KS5Db250YWlucyA9IHtcbiAgICAgICAgICBzcGF0aWFsOiB0cnVlLFxuICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVmZmVjdGl2ZU9wZXJhdG9ycztcbiAgfVxuXG4gIHB1YmxpYyBhZGRJbnRlcmZhY2VGaWx0ZXIoXG4gICAgaWdvT2djRmlsdGVyT2JqZWN0PyxcbiAgICBnZW9tZXRyeU5hbWU/LFxuICAgIGxldmVsID0gMCxcbiAgICBwYXJlbnRMb2dpY2FsID0gJ09yJ1xuICApOiBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zIHtcbiAgICBpZiAoIWlnb09nY0ZpbHRlck9iamVjdCkge1xuICAgICAgaWdvT2djRmlsdGVyT2JqZWN0ID0geyBvcGVyYXRvcjogJ1Byb3BlcnR5SXNFcXVhbFRvJyB9O1xuICAgIH1cbiAgICBjb25zdCBmID0ge1xuICAgICAgcHJvcGVydHlOYW1lOiAnJyxcbiAgICAgIG9wZXJhdG9yOiAnJyxcbiAgICAgIGFjdGl2ZTogJycsXG4gICAgICBmaWx0ZXJpZDogdXVpZCgpLFxuICAgICAgc3RlcDogJycsXG4gICAgICBiZWdpbjogJycsXG4gICAgICBlbmQ6ICcnLFxuICAgICAgc2xpZGVyT3B0aW9uczoge30sXG4gICAgICBsb3dlckJvdW5kYXJ5OiAnJyxcbiAgICAgIHVwcGVyQm91bmRhcnk6ICcnLFxuICAgICAgZXhwcmVzc2lvbjogJycsXG4gICAgICBwYXR0ZXJuOiAnJyxcbiAgICAgIHdpbGRDYXJkOiAnKicsXG4gICAgICBzaW5nbGVDaGFyOiAnLicsXG4gICAgICBlc2NhcGVDaGFyOiAnIScsXG4gICAgICBtYXRjaENhc2U6IHRydWUsXG4gICAgICBpZ29TcGF0aWFsU2VsZWN0b3I6ICcnLFxuICAgICAgaWdvU05SQzogJycsXG4gICAgICBnZW9tZXRyeU5hbWU6ICcnLFxuICAgICAgZ2VvbWV0cnk6ICcnLFxuICAgICAgd2t0X2dlb21ldHJ5OiAnJyxcbiAgICAgIGV4dGVudDogJycsXG4gICAgICBzcnNOYW1lOiAnJyxcbiAgICAgIHBhcmVudExvZ2ljYWw6ICcnLFxuICAgICAgbGV2ZWw6IDBcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICBmLFxuICAgICAge1xuICAgICAgICBwYXJlbnRMb2dpY2FsLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgZ2VvbWV0cnlOYW1lXG4gICAgICB9LFxuICAgICAgaWdvT2djRmlsdGVyT2JqZWN0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0lnb0ZpbHRlcnNQcm9wZXJ0aWVzKFxuICAgIGZpbHRlck9iamVjdDogYW55LFxuICAgIGZpZWxkTmFtZUdlb21ldHJ5LFxuICAgIHByb2o6IG9sUHJvamVjdGlvbixcbiAgICBhY3RpdmUgPSBmYWxzZVxuICApIHtcbiAgICBjb25zdCBmaWx0ZXJBcnJheSA9IFtdO1xuICAgIGlmIChmaWx0ZXJPYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZmlsdGVyT2JqZWN0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgZmlsdGVyQXJyYXkucHVzaChcbiAgICAgICAgICB0aGlzLmNoZWNrSWdvRmlsdGVyc1Byb3BlcnRpZXMoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgZmllbGROYW1lR2VvbWV0cnksXG4gICAgICAgICAgICBwcm9qLFxuICAgICAgICAgICAgYWN0aXZlXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmlsdGVyQXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2xvZ2ljYWwnKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsb2dpY2FsOiBmaWx0ZXJPYmplY3QubG9naWNhbCxcbiAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuY2hlY2tJZ29GaWx0ZXJzUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgZmlsdGVyT2JqZWN0LmZpbHRlcnMsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZUdlb21ldHJ5LFxuICAgICAgICAgICAgICBwcm9qLFxuICAgICAgICAgICAgICBhY3RpdmVcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb3BlcmF0b3InKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJQcm9wZXJ0aWVzKFxuICAgICAgICAgIGZpbHRlck9iamVjdCBhcyBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zLFxuICAgICAgICAgIGZpZWxkTmFtZUdlb21ldHJ5LFxuICAgICAgICAgIHByb2osXG4gICAgICAgICAgYWN0aXZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRGaWx0ZXJQcm9wZXJ0aWVzKFxuICAgIGlnb09nY0ZpbHRlck9iamVjdDogT2djSW50ZXJmYWNlRmlsdGVyT3B0aW9ucyxcbiAgICBmaWVsZE5hbWVHZW9tZXRyeSxcbiAgICBwcm9qOiBvbFByb2plY3Rpb24sXG4gICAgYWN0aXZlID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgZmlsdGVyaWQgPSBpZ29PZ2NGaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2ZpbHRlcmlkJylcbiAgICAgID8gaWdvT2djRmlsdGVyT2JqZWN0LmZpbHRlcmlkXG4gICAgICA6IHV1aWQoKTtcbiAgICBjb25zdCBzdGF0dXMgPSBpZ29PZ2NGaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2FjdGl2ZScpXG4gICAgICA/IGlnb09nY0ZpbHRlck9iamVjdC5hY3RpdmVcbiAgICAgIDogYWN0aXZlO1xuXG4gICAgY29uc3Qgc3JzTmFtZSA9IGlnb09nY0ZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnc3JzTmFtZScpXG4gICAgICA/IGlnb09nY0ZpbHRlck9iamVjdC5zcnNOYW1lXG4gICAgICA6IHByb2pcbiAgICAgID8gcHJvai5nZXRDb2RlKClcbiAgICAgIDogJ0VQU0c6Mzg1Nyc7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBmaWx0ZXJpZCxcbiAgICAgICAgYWN0aXZlOiBzdGF0dXMsXG4gICAgICAgIGlnb1NwYXRpYWxTZWxlY3RvcjogJ2ZpeGVkRXh0ZW50JyxcbiAgICAgICAgc3JzTmFtZVxuICAgICAgfSxcbiAgICAgIGlnb09nY0ZpbHRlck9iamVjdCxcbiAgICAgIHsgZ2VvbWV0cnlOYW1lOiBmaWVsZE5hbWVHZW9tZXRyeSB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWJ1aWx0SWdvT2djRmlsdGVyT2JqZWN0RnJvbVNlcXVlbmNlKFxuICAgIHNlcXVlbmNlOiBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zW11cbiAgKTogSWdvT2djRmlsdGVyT2JqZWN0IHtcbiAgICBpZiAoc2VxdWVuY2UgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgaWYgKHNlcXVlbmNlLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGxldCBsYXN0UGFyZW50TG9naWNhbCA9IHNlcXVlbmNlWzBdLnBhcmVudExvZ2ljYWw7XG4gICAgICAgIGxldCBuZXh0RWxlbWVudDogYW55O1xuICAgICAgICBsZXQgbG9naWNhbEFycmF5ID0gW107XG4gICAgICAgIGxldCBsYXN0UHJvY2Vzc2VkRmlsdGVyO1xuICAgICAgICBzZXF1ZW5jZS5mb3JFYWNoKCh1aUZpbHRlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBPYmplY3QuYXNzaWduKHt9LCB1aUZpbHRlcik7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzZXF1ZW5jZS5pbmRleE9mKHVpRmlsdGVyKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHNlcXVlbmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIG5leHRFbGVtZW50ID0gc2VxdWVuY2VbaW5kZXggKyAxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgZWxlbWVudC5hY3RpdmU7XG4gICAgICAgICAgZGVsZXRlIGVsZW1lbnQuZmlsdGVyaWQ7XG4gICAgICAgICAgZGVsZXRlIGVsZW1lbnQucGFyZW50TG9naWNhbDtcbiAgICAgICAgICBsb2dpY2FsQXJyYXkucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgIGlmIChzZXF1ZW5jZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGxhc3RQcm9jZXNzZWRGaWx0ZXIgPSBlbGVtZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAobGFzdFBhcmVudExvZ2ljYWwgIT09IG5leHRFbGVtZW50LnBhcmVudExvZ2ljYWwpIHtcbiAgICAgICAgICAgIGlmIChsb2dpY2FsQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdZb3UgbXVzdCBzZXQgYXQgJyArXG4gICAgICAgICAgICAgICAgICAnbGVhc3QgdHdvIG9wZXJhdG9yIGluIGEgbG9naWNhbCAoJyArXG4gICAgICAgICAgICAgICAgICBsYXN0UGFyZW50TG9naWNhbCArXG4gICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxhc3RQcm9jZXNzZWRGaWx0ZXIgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHsgbG9naWNhbDogbGFzdFBhcmVudExvZ2ljYWwsIGZpbHRlcnM6IGxvZ2ljYWxBcnJheSB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGxvZ2ljYWxBcnJheSA9IFtsYXN0UHJvY2Vzc2VkRmlsdGVyXTtcbiAgICAgICAgICAgICAgbGFzdFBhcmVudExvZ2ljYWwgPSBuZXh0RWxlbWVudC5wYXJlbnRMb2dpY2FsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsYXN0UHJvY2Vzc2VkRmlsdGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVJZ29TZWxlY3RvcihzZWxlY3RvcnM6IElnb09nY1NlbGVjdG9yKTogSWdvT2djU2VsZWN0b3Ige1xuICAgIGlmIChcbiAgICAgIHNlbGVjdG9ycy5ncm91cHMuZXZlcnkoKGdyb3VwKSA9PiBncm91cC5jb21wdXRlZFNlbGVjdG9ycyAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHNlbGVjdG9ycztcbiAgICB9XG4gICAgbGV0IHNlbGVjdG9yOiBJZ29PZ2NTZWxlY3RvcjtcbiAgICBpZiAoc2VsZWN0b3JzLmdyb3VwcyAmJiBzZWxlY3RvcnMuYnVuZGxlcykge1xuICAgICAgaWYgKCFzZWxlY3RvcnMuYnVuZGxlcy5ldmVyeSgoYnVuZGxlKSA9PiBidW5kbGUuaWQgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdZb3UgbXVzdCBzZXQgYW4gaWQgZm9yIGVhY2ggb2YgeW91ciBidW5kbGVzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc2VsZWN0b3IgPSBPYmplY3RVdGlscy5jb3B5RGVlcChzZWxlY3RvcnMpO1xuICAgICAgc2VsZWN0b3IuZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICAgIGdyb3VwLnRpdGxlID0gZ3JvdXAudGl0bGUgPyBncm91cC50aXRsZSA6IGdyb3VwLm5hbWU7XG4gICAgICAgIGdyb3VwLmVuYWJsZWQgPSBncm91cC5lbmFibGVkID8gZ3JvdXAuZW5hYmxlZCA6IGZhbHNlO1xuICAgICAgICBncm91cC5jb21wdXRlZFNlbGVjdG9ycyA9IE9iamVjdFV0aWxzLmNvcHlEZWVwKFxuICAgICAgICAgIHNlbGVjdG9yLmJ1bmRsZXMuZmlsdGVyKChiKSA9PiBncm91cC5pZHMuaW5jbHVkZXMoYi5pZCkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFzZWxlY3RvcnMuZ3JvdXBzICYmIHNlbGVjdG9ycy5idW5kbGVzKSB7XG4gICAgICBzZWxlY3RvciA9IE9iamVjdFV0aWxzLmNvcHlEZWVwKHNlbGVjdG9ycyk7XG4gICAgICBzZWxlY3Rvci5ncm91cHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogJ2dyb3VwMScsXG4gICAgICAgICAgbmFtZTogJ2dyb3VwMScsXG4gICAgICAgICAgY29tcHV0ZWRTZWxlY3RvcnM6IE9iamVjdFV0aWxzLmNvcHlEZWVwKHNlbGVjdG9yLmJ1bmRsZXMpXG4gICAgICAgIH0gYXMgU2VsZWN0b3JHcm91cFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgIGJ1bmRsZXM6IHNlbGVjdG9ycyBhcyBhbnksXG4gICAgICAgIGdyb3VwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiAnZ3JvdXAxJyxcbiAgICAgICAgICAgIG5hbWU6ICdncm91cDEnLFxuICAgICAgICAgICAgY29tcHV0ZWRTZWxlY3RvcnM6IE9iamVjdFV0aWxzLmNvcHlEZWVwKFxuICAgICAgICAgICAgICBzZWxlY3RvcnNcbiAgICAgICAgICAgICkgYXMgT2djU2VsZWN0b3JCdW5kbGVbXVxuICAgICAgICAgIH0gYXMgU2VsZWN0b3JHcm91cFxuICAgICAgICBdLFxuICAgICAgICBzZWxlY3RvclR5cGU6IHNlbGVjdG9yLnNlbGVjdG9yVHlwZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFzZWxlY3Rvci5ncm91cHMuZmluZCgoc2VsZWN0b3JHcm91cCkgPT4gc2VsZWN0b3JHcm91cC5lbmFibGVkKSkge1xuICAgICAgc2VsZWN0b3IuZ3JvdXBzWzBdLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlT2djRmlsdGVyc0FwcGxpZWRWYWx1ZShcbiAgICBvcHRpb25zOiBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgZmllbGROYW1lR2VvbWV0cnk6IHN0cmluZyxcbiAgICBleHRlbnQ/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBwcm9qPzogb2xQcm9qZWN0aW9uXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgb2djRmlsdGVycyA9IG9wdGlvbnMub2djRmlsdGVycztcbiAgICBpZiAoIW9nY0ZpbHRlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtdO1xuICAgIGxldCBmaWx0ZXJRdWVyeVN0cmluZ1NlbGVjdG9yID0gJyc7XG4gICAgbGV0IGZpbHRlclF1ZXJ5U3RyaW5nQWR2YW5jZWRGaWx0ZXJzID0gJyc7XG4gICAgaWYgKG9nY0ZpbHRlcnMuZW5hYmxlZCAmJiAob2djRmlsdGVycy5wdXNoQnV0dG9ucyB8fCBvZ2NGaWx0ZXJzLmNoZWNrYm94ZXMgfHwgb2djRmlsdGVycy5yYWRpb0J1dHRvbnMgfHwgb2djRmlsdGVycy5zZWxlY3RcbiAgICAgIHx8IG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlKSkge1xuICAgICAgbGV0IHNlbGVjdG9ycztcbiAgICAgIGlmIChvZ2NGaWx0ZXJzLnB1c2hCdXR0b25zKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMucHVzaEJ1dHRvbnM7XG4gICAgICAgIGNvbnN0IHB1c2hDb25kaXRpb25zID0gdGhpcy5mb3JtYXRHcm91cEFuZEZpbHRlcihvZ2NGaWx0ZXJzLCBzZWxlY3RvcnMpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBwdXNoQ29uZGl0aW9ucykge1xuICAgICAgICAgIGNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2djRmlsdGVycy5jaGVja2JveGVzKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMuY2hlY2tib3hlcztcbiAgICAgICAgY29uc3QgY2hlY2tib3hDb25kaXRpb25zID0gdGhpcy5mb3JtYXRHcm91cEFuZEZpbHRlcihvZ2NGaWx0ZXJzLCBzZWxlY3RvcnMpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjaGVja2JveENvbmRpdGlvbnMpIHtcbiAgICAgICAgICBjb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9nY0ZpbHRlcnMucmFkaW9CdXR0b25zKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMucmFkaW9CdXR0b25zO1xuICAgICAgICBjb25zdCBzZWxlY3RvcnNDb3JyID0gdGhpcy52ZXJpZnlNdWx0aXBsZUVuYWJsZWRzKHNlbGVjdG9ycyk7XG4gICAgICAgIGNvbnN0IHJhZGlvQ29uZGl0aW9ucyA9IHRoaXMuZm9ybWF0R3JvdXBBbmRGaWx0ZXIob2djRmlsdGVycywgc2VsZWN0b3JzQ29ycik7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIHJhZGlvQ29uZGl0aW9ucykge1xuICAgICAgICAgIGNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2djRmlsdGVycy5zZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0b3JzID0gb2djRmlsdGVycy5zZWxlY3Q7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yc0NvcnIgPSB0aGlzLnZlcmlmeU11bHRpcGxlRW5hYmxlZHMoc2VsZWN0b3JzKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0Q29uZGl0aW9ucyA9IHRoaXMuZm9ybWF0R3JvdXBBbmRGaWx0ZXIob2djRmlsdGVycywgc2VsZWN0b3JzQ29ycik7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIHNlbGVjdENvbmRpdGlvbnMpIHtcbiAgICAgICAgICBjb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlO1xuICAgICAgICBjb25zdCBzZWxlY3RDb25kaXRpb25zID0gdGhpcy5mb3JtYXRHcm91cEFuZEZpbHRlcihvZ2NGaWx0ZXJzLCBzZWxlY3RvcnMpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBzZWxlY3RDb25kaXRpb25zKSB7XG4gICAgICAgICAgY29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgZmlsdGVyUXVlcnlTdHJpbmdTZWxlY3RvciA9IHRoaXMuYnVpbGRGaWx0ZXIoXG4gICAgICAgICAgY29uZGl0aW9ucy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gY29uZGl0aW9uc1swXVxuICAgICAgICAgICAgOiB7IGxvZ2ljYWw6ICdBbmQnLCBmaWx0ZXJzOiBjb25kaXRpb25zIH0sXG4gICAgICAgICAgZXh0ZW50LFxuICAgICAgICAgIHByb2osXG4gICAgICAgICAgb2djRmlsdGVycy5nZW9tZXRyeU5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9nY0ZpbHRlcnMuZW5hYmxlZCAmJiBvZ2NGaWx0ZXJzLmZpbHRlcnMpIHtcbiAgICAgIG9nY0ZpbHRlcnMuZ2VvbWV0cnlOYW1lID0gb2djRmlsdGVycy5nZW9tZXRyeU5hbWUgfHwgZmllbGROYW1lR2VvbWV0cnk7XG4gICAgICBjb25zdCBpZ29GaWx0ZXJzID0gb2djRmlsdGVycy5maWx0ZXJzO1xuICAgICAgZmlsdGVyUXVlcnlTdHJpbmdBZHZhbmNlZEZpbHRlcnMgPSB0aGlzLmJ1aWxkRmlsdGVyKFxuICAgICAgICBpZ29GaWx0ZXJzLFxuICAgICAgICBleHRlbnQsXG4gICAgICAgIHByb2osXG4gICAgICAgIG9nY0ZpbHRlcnMuZ2VvbWV0cnlOYW1lLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJRdWVyeVN0cmluZyA9IG9nY0ZpbHRlcnMuYWR2YW5jZWRPZ2NGaWx0ZXJzXG4gICAgICA/IGZpbHRlclF1ZXJ5U3RyaW5nQWR2YW5jZWRGaWx0ZXJzXG4gICAgICA6IGZpbHRlclF1ZXJ5U3RyaW5nU2VsZWN0b3I7XG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIGZpbHRlclF1ZXJ5U3RyaW5nID0gdGhpcy5mb3JtYXRQcm9jZXNzZWRPZ2NGaWx0ZXIoXG4gICAgICAgIGZpbHRlclF1ZXJ5U3RyaW5nLFxuICAgICAgICAob3B0aW9ucyBhcyBhbnkpLnBhcmFtcy5MQVlFUlNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICd3ZnMnKSB7XG4gICAgICBmaWx0ZXJRdWVyeVN0cmluZyA9IHRoaXMuZm9ybWF0UHJvY2Vzc2VkT2djRmlsdGVyKFxuICAgICAgICBmaWx0ZXJRdWVyeVN0cmluZyxcbiAgICAgICAgKG9wdGlvbnMgYXMgYW55KS5wYXJhbXMuZmVhdHVyZVR5cGVzXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJRdWVyeVN0cmluZztcbiAgfVxuXG4gIHB1YmxpYyB2ZXJpZnlNdWx0aXBsZUVuYWJsZWRzKHNlbGVjdG9ycykge1xuICAgIHNlbGVjdG9ycy5idW5kbGVzLmZvckVhY2goYnVuZGxlID0+IHtcbiAgICAgIGlmICghYnVuZGxlLm11bHRpcGxlICYmIGJ1bmRsZS5zZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZHMgPSBidW5kbGUuc2VsZWN0b3JzLnJlZHVjZSgobGlzdCwgZmlsdGVyLCBpbmRleCkgPT4gKGZpbHRlci5lbmFibGVkKSA9PT0gdHJ1ZSA/IGxpc3QuY29uY2F0KGluZGV4KSA6IGxpc3QsIFtdKTtcbiAgICAgICAgaWYgKGVuYWJsZWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBlbmFibGVkcy5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgZW5hYmxlZHMuZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICAgICAgICBidW5kbGUuc2VsZWN0b3JzW2luZGV4XS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0b3JzO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdEdyb3VwQW5kRmlsdGVyKG9nY0ZpbHRlcnM6IE9nY0ZpbHRlcnNPcHRpb25zLCBzZWxlY3RvcnMpIHtcbiAgICBzZWxlY3RvcnMgPSB0aGlzLmNvbXB1dGVJZ29TZWxlY3RvcihcbiAgICAgIHNlbGVjdG9yc1xuICAgICk7XG4gICAgY29uc3Qgc2VsZWN0b3JCdW5kbGUgPSBzZWxlY3RvcnMuZ3JvdXBzLmZpbmQoXG4gICAgICAoZykgPT4gZy5lbmFibGVkXG4gICAgKS5jb21wdXRlZFNlbGVjdG9ycztcbiAgICBjb25zdCBjb25kaXRpb25zID0gW107XG4gICAgc2VsZWN0b3JCdW5kbGUubWFwKChidW5kbGUpID0+IHtcbiAgICAgIGNvbnN0IGJ1bmRsZUNvbmRpdGlvbiA9IFtdO1xuICAgICAgY29uc3Qgc2VsZWN0b3JzVHlwZSA9IGJ1bmRsZS5zZWxlY3RvcnMgYXMgYW55O1xuICAgICAgaWYgKCFzZWxlY3RvcnNUeXBlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlbGVjdG9yc1R5cGVcbiAgICAgICAgLmZpbHRlcigob2djc2VsZWN0b3IpID0+IG9nY3NlbGVjdG9yLmVuYWJsZWQgPT09IHRydWUpXG4gICAgICAgIC5mb3JFYWNoKChlbmFibGVkU2VsZWN0b3IpID0+IGJ1bmRsZUNvbmRpdGlvbi5wdXNoKGVuYWJsZWRTZWxlY3Rvci5maWx0ZXJzKSk7XG4gICAgICBpZiAoYnVuZGxlQ29uZGl0aW9uLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25kaXRpb25zLnB1c2goYnVuZGxlQ29uZGl0aW9uWzBdKTtcbiAgICAgIH0gZWxzZSBpZiAoYnVuZGxlQ29uZGl0aW9uLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKHtcbiAgICAgICAgICBsb2dpY2FsOiBidW5kbGUubG9naWNhbCxcbiAgICAgICAgICBmaWx0ZXJzOiBidW5kbGVDb25kaXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoc2VsZWN0b3JzLnNlbGVjdG9yVHlwZSA9PT0gJ3B1c2hCdXR0b24nKSB7XG4gICAgICBvZ2NGaWx0ZXJzLnB1c2hCdXR0b25zID0gc2VsZWN0b3JzO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3JzLnNlbGVjdG9yVHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgb2djRmlsdGVycy5jaGVja2JveGVzID0gc2VsZWN0b3JzO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3JzLnNlbGVjdG9yVHlwZSA9PT0gJ3JhZGlvQnV0dG9uJykge1xuICAgICAgb2djRmlsdGVycy5yYWRpb0J1dHRvbnMgPSBzZWxlY3RvcnM7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RvcnMuc2VsZWN0b3JUeXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgb2djRmlsdGVycy5zZWxlY3QgPSBzZWxlY3RvcnM7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RvcnMuc2VsZWN0b3JUeXBlID09PSAnYXV0b2NvbXBsZXRlJykge1xuICAgICAgb2djRmlsdGVycy5hdXRvY29tcGxldGUgPSBzZWxlY3RvcnM7XG4gICAgfVxuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdFByb2Nlc3NlZE9nY0ZpbHRlcihcbiAgICBwcm9jZXNzZWRGaWx0ZXI6IHN0cmluZyxcbiAgICBsYXllcnNPclR5cGVuYW1lczogc3RyaW5nXG4gICk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXByb2Nlc3NlZEZpbHRlcikge3JldHVybiB1bmRlZmluZWQ7fTtcbiAgICBsZXQgYXBwbGllZEZpbHRlciA9ICcnO1xuICAgIGlmIChwcm9jZXNzZWRGaWx0ZXIubGVuZ3RoID09PSAwICYmIGxheWVyc09yVHlwZW5hbWVzLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICAgIGFwcGxpZWRGaWx0ZXIgPSBwcm9jZXNzZWRGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyc09yVHlwZW5hbWVzLnNwbGl0KCcsJykuZm9yRWFjaCgobGF5ZXJPclR5cGVuYW1lcykgPT4ge1xuICAgICAgICBhcHBsaWVkRmlsdGVyID0gYCR7YXBwbGllZEZpbHRlcn0oJHtwcm9jZXNzZWRGaWx0ZXIucmVwbGFjZShcbiAgICAgICAgICAnZmlsdGVyPScsXG4gICAgICAgICAgJydcbiAgICAgICAgKX0pYDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBhcHBsaWVkRmlsdGVyID0gYXBwbGllZEZpbHRlci5yZXBsYWNlKC9cXChcXCkvZywgJycpO1xuICAgIGNvbnN0IGZpbHRlclZhbHVlID1cbiAgICAgIGFwcGxpZWRGaWx0ZXIubGVuZ3RoID4gMFxuICAgICAgICA/IGFwcGxpZWRGaWx0ZXIucmVwbGFjZSgnZmlsdGVyPScsICcnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZmlsdGVyVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VGaWx0ZXJPcHRpb25EYXRlKHZhbHVlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAndG9kYXknKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAobW9tZW50KHZhbHVlKS5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|