@igo2/geo 1.15.4 → 16.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/igo2-geo.mjs +5 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +320 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +319 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +278 -0
- package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +78 -0
- package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +223 -0
- package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +89 -0
- package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +230 -0
- package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +91 -0
- package/esm2022/lib/catalog/catalog.module.mjs +48 -0
- package/esm2022/lib/catalog/index.mjs +5 -0
- package/esm2022/lib/catalog/shared/catalog.abstract.mjs +32 -0
- package/esm2022/lib/catalog/shared/catalog.enum.mjs +16 -0
- package/esm2022/lib/catalog/shared/catalog.interface.mjs +2 -0
- package/esm2022/lib/catalog/shared/catalog.service.mjs +666 -0
- package/esm2022/lib/catalog/shared/catalogs.mjs +75 -0
- package/esm2022/lib/catalog/shared/index.mjs +5 -0
- package/esm2022/lib/datasource/datasource.module.mjs +22 -0
- package/esm2022/lib/datasource/index.mjs +3 -0
- package/esm2022/lib/datasource/shared/capabilities.service.mjs +448 -0
- package/esm2022/lib/datasource/shared/datasource.service.mjs +259 -0
- package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +212 -0
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +109 -0
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +15 -0
- package/esm2022/lib/datasource/shared/datasources/data.service.mjs +3 -0
- package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/datasource.mjs +34 -0
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +43 -0
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +61 -0
- package/esm2022/lib/datasource/shared/datasources/index.mjs +36 -0
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +28 -0
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +12 -0
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +51 -0
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +15 -0
- package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +55 -0
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +79 -0
- package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +169 -0
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +218 -0
- package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +222 -0
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +16 -0
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +9 -0
- package/esm2022/lib/datasource/shared/index.mjs +5 -0
- package/esm2022/lib/datasource/shared/options/index.mjs +5 -0
- package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +2 -0
- package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +15 -0
- package/esm2022/lib/datasource/shared/options/options-api.service.mjs +85 -0
- package/esm2022/lib/datasource/shared/options/options.service.mjs +3 -0
- package/esm2022/lib/datasource/utils/index.mjs +2 -0
- package/esm2022/lib/datasource/utils/tilegrid.mjs +20 -0
- package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +265 -0
- package/esm2022/lib/directions/directions-buttons/index.mjs +2 -0
- package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +294 -0
- package/esm2022/lib/directions/directions-inputs/index.mjs +2 -0
- package/esm2022/lib/directions/directions-results/directions-results.component.mjs +215 -0
- package/esm2022/lib/directions/directions-results/index.mjs +2 -0
- package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +2 -0
- package/esm2022/lib/directions/directions-sources/directions-source.mjs +3 -0
- package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +16 -0
- package/esm2022/lib/directions/directions-sources/index.mjs +5 -0
- package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +128 -0
- package/esm2022/lib/directions/directions.component.mjs +374 -0
- package/esm2022/lib/directions/directions.module.mjs +106 -0
- package/esm2022/lib/directions/index.mjs +7 -0
- package/esm2022/lib/directions/shared/directions-source.service.mjs +18 -0
- package/esm2022/lib/directions/shared/directions.enum.mjs +28 -0
- package/esm2022/lib/directions/shared/directions.interface.mjs +2 -0
- package/esm2022/lib/directions/shared/directions.service.mjs +202 -0
- package/esm2022/lib/directions/shared/directions.utils.mjs +559 -0
- package/esm2022/lib/directions/shared/index.mjs +6 -0
- package/esm2022/lib/directions/shared/store.mjs +21 -0
- package/esm2022/lib/download/download-button/download-button.component.mjs +65 -0
- package/esm2022/lib/download/download-button/index.mjs +2 -0
- package/esm2022/lib/download/download.module.mjs +42 -0
- package/esm2022/lib/download/index.mjs +3 -0
- package/esm2022/lib/download/shared/download.interface.mjs +2 -0
- package/esm2022/lib/download/shared/download.service.mjs +67 -0
- package/esm2022/lib/download/shared/index.mjs +3 -0
- package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +57 -0
- package/esm2022/lib/draw/draw/draw-popup.component.mjs +677 -0
- package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +48 -0
- package/esm2022/lib/draw/draw/draw.component.mjs +1369 -0
- package/esm2022/lib/draw/draw/draw.module.mjs +117 -0
- package/esm2022/lib/draw/drawingTool.module.mjs +18 -0
- package/esm2022/lib/draw/index.mjs +3 -0
- package/esm2022/lib/draw/shared/draw-icon.service.mjs +30 -0
- package/esm2022/lib/draw/shared/draw.enum.mjs +21 -0
- package/esm2022/lib/draw/shared/draw.interface.mjs +2 -0
- package/esm2022/lib/draw/shared/draw.utils.mjs +125 -0
- package/esm2022/lib/draw/shared/index.mjs +5 -0
- package/esm2022/lib/feature/feature-details/feature-details.component.mjs +440 -0
- package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +57 -0
- package/esm2022/lib/feature/feature-details/feature-details.module.mjs +40 -0
- package/esm2022/lib/feature/feature-form/feature-form.component.mjs +120 -0
- package/esm2022/lib/feature/feature-form/feature-form.module.mjs +23 -0
- package/esm2022/lib/feature/feature.module.mjs +21 -0
- package/esm2022/lib/feature/index.mjs +4 -0
- package/esm2022/lib/feature/shared/feature-store.utils.mjs +27 -0
- package/esm2022/lib/feature/shared/feature.enums.mjs +9 -0
- package/esm2022/lib/feature/shared/feature.interfaces.mjs +2 -0
- package/esm2022/lib/feature/shared/feature.utils.mjs +333 -0
- package/esm2022/lib/feature/shared/index.mjs +8 -0
- package/esm2022/lib/feature/shared/store.mjs +143 -0
- package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +216 -0
- package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +115 -0
- package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +96 -0
- package/esm2022/lib/feature/shared/strategies/index.mjs +8 -0
- package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +104 -0
- package/esm2022/lib/feature/shared/strategies/loading.mjs +136 -0
- package/esm2022/lib/feature/shared/strategies/search.mjs +159 -0
- package/esm2022/lib/feature/shared/strategies/selection.mjs +384 -0
- package/esm2022/lib/feature/shared/strategies.utils.mjs +37 -0
- package/esm2022/lib/filter/filter.module.mjs +300 -0
- package/esm2022/lib/filter/index.mjs +16 -0
- package/esm2022/lib/filter/ogc-filter-button/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +153 -0
- package/esm2022/lib/filter/ogc-filter-form/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +663 -0
- package/esm2022/lib/filter/ogc-filter-selection/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +1344 -0
- package/esm2022/lib/filter/ogc-filter-time/index.mjs +3 -0
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +226 -0
- package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +936 -0
- package/esm2022/lib/filter/ogc-filterable-form/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +83 -0
- package/esm2022/lib/filter/ogc-filterable-item/index.mjs +2 -0
- package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +320 -0
- package/esm2022/lib/filter/ogc-filterable-list/index.mjs +3 -0
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +36 -0
- package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +47 -0
- package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +55 -0
- package/esm2022/lib/filter/shared/index.mjs +12 -0
- package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +73 -0
- package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +30 -0
- package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +2 -0
- package/esm2022/lib/filter/shared/ogc-filter.mjs +699 -0
- package/esm2022/lib/filter/shared/ogc-filter.service.mjs +48 -0
- package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +23 -0
- package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +2 -0
- package/esm2022/lib/filter/shared/spatial-filter.service.mjs +280 -0
- package/esm2022/lib/filter/shared/time-filter.enum.mjs +13 -0
- package/esm2022/lib/filter/shared/time-filter.interface.mjs +2 -0
- package/esm2022/lib/filter/shared/time-filter.service.mjs +108 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1150 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +244 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
- package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +157 -0
- package/esm2022/lib/filter/time-filter-button/index.mjs +2 -0
- package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +82 -0
- package/esm2022/lib/filter/time-filter-form/index.mjs +2 -0
- package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +755 -0
- package/esm2022/lib/filter/time-filter-item/index.mjs +2 -0
- package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +124 -0
- package/esm2022/lib/filter/time-filter-list/index.mjs +3 -0
- package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +36 -0
- package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +40 -0
- package/esm2022/lib/geo.module.mjs +106 -0
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +563 -0
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +218 -0
- package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +56 -0
- package/esm2022/lib/geometry/geometry.module.mjs +20 -0
- package/esm2022/lib/geometry/index.mjs +4 -0
- package/esm2022/lib/geometry/shared/controls/draw.mjs +340 -0
- package/esm2022/lib/geometry/shared/controls/index.mjs +4 -0
- package/esm2022/lib/geometry/shared/controls/modify.mjs +541 -0
- package/esm2022/lib/geometry/shared/controls/slice.mjs +190 -0
- package/esm2022/lib/geometry/shared/geometry.errors.mjs +26 -0
- package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +2 -0
- package/esm2022/lib/geometry/shared/geometry.utils.mjs +122 -0
- package/esm2022/lib/geometry/shared/index.mjs +5 -0
- package/esm2022/lib/import-export/export-button/export-button.component.mjs +66 -0
- package/esm2022/lib/import-export/export-button/index.mjs +2 -0
- package/esm2022/lib/import-export/import-export/import-export.component.mjs +1350 -0
- package/esm2022/lib/import-export/import-export/index.mjs +2 -0
- package/esm2022/lib/import-export/import-export.module.mjs +98 -0
- package/esm2022/lib/import-export/index.mjs +4 -0
- package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +174 -0
- package/esm2022/lib/import-export/shared/export.errors.mjs +15 -0
- package/esm2022/lib/import-export/shared/export.interface.mjs +2 -0
- package/esm2022/lib/import-export/shared/export.service.mjs +205 -0
- package/esm2022/lib/import-export/shared/export.type.mjs +13 -0
- package/esm2022/lib/import-export/shared/export.utils.mjs +47 -0
- package/esm2022/lib/import-export/shared/import.errors.mjs +39 -0
- package/esm2022/lib/import-export/shared/import.interface.mjs +2 -0
- package/esm2022/lib/import-export/shared/import.service.mjs +221 -0
- package/esm2022/lib/import-export/shared/import.utils.mjs +203 -0
- package/esm2022/lib/import-export/shared/index.mjs +11 -0
- package/esm2022/lib/layer/index.mjs +10 -0
- package/esm2022/lib/layer/layer-item/index.mjs +2 -0
- package/esm2022/lib/layer/layer-item/layer-item.component.mjs +324 -0
- package/esm2022/lib/layer/layer-legend/index.mjs +2 -0
- package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +429 -0
- package/esm2022/lib/layer/layer-legend-item/index.mjs +2 -0
- package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +93 -0
- package/esm2022/lib/layer/layer-legend-list/index.mjs +3 -0
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +54 -0
- package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +201 -0
- package/esm2022/lib/layer/layer-list/index.mjs +4 -0
- package/esm2022/lib/layer/layer-list/layer-list-binding.directive.mjs +69 -0
- package/esm2022/lib/layer/layer-list/layer-list.component.mjs +1022 -0
- package/esm2022/lib/layer/layer-list/layer-list.enum.mjs +19 -0
- package/esm2022/lib/layer/layer-list-tool/index.mjs +5 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +157 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +7 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +2 -0
- package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +22 -0
- package/esm2022/lib/layer/layer.module.mjs +175 -0
- package/esm2022/lib/layer/shared/clusterParam.mjs +2 -0
- package/esm2022/lib/layer/shared/index.mjs +5 -0
- package/esm2022/lib/layer/shared/layer.enums.mjs +2 -0
- package/esm2022/lib/layer/shared/layer.service.mjs +268 -0
- package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/any-layer.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/image-layer.mjs +70 -0
- package/esm2022/lib/layer/shared/layers/index.mjs +13 -0
- package/esm2022/lib/layer/shared/layers/layer.interface.mjs +17 -0
- package/esm2022/lib/layer/shared/layers/layer.mjs +184 -0
- package/esm2022/lib/layer/shared/layers/legend.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/tile-layer.mjs +50 -0
- package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/vector-layer.mjs +562 -0
- package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
- package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +107 -0
- package/esm2022/lib/layer/track-feature-button/index.mjs +2 -0
- package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +60 -0
- package/esm2022/lib/layer/utils/image-watcher.mjs +62 -0
- package/esm2022/lib/layer/utils/index.mjs +6 -0
- package/esm2022/lib/layer/utils/layer.utils.mjs +11 -0
- package/esm2022/lib/layer/utils/outputLegend.mjs +28 -0
- package/esm2022/lib/layer/utils/tile-watcher.mjs +52 -0
- package/esm2022/lib/layer/utils/vector-watcher.mjs +50 -0
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +16 -0
- package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +120 -0
- package/esm2022/lib/map/baselayers-switcher/index.mjs +3 -0
- package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +155 -0
- package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +87 -0
- package/esm2022/lib/map/geolocate-button/index.mjs +2 -0
- package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +80 -0
- package/esm2022/lib/map/home-extent-button/index.mjs +2 -0
- package/esm2022/lib/map/index.mjs +14 -0
- package/esm2022/lib/map/info-section/index.mjs +2 -0
- package/esm2022/lib/map/info-section/info-section.component.mjs +29 -0
- package/esm2022/lib/map/map-browser/index.mjs +2 -0
- package/esm2022/lib/map/map-browser/map-browser.component.mjs +74 -0
- package/esm2022/lib/map/map-center/index.mjs +2 -0
- package/esm2022/lib/map/map-center/map-center.component.mjs +61 -0
- package/esm2022/lib/map/map.module.mjs +120 -0
- package/esm2022/lib/map/menu-button/index.mjs +2 -0
- package/esm2022/lib/map/menu-button/menu-button.component.mjs +55 -0
- package/esm2022/lib/map/offline-button/index.mjs +2 -0
- package/esm2022/lib/map/offline-button/offline-button.component.mjs +55 -0
- package/esm2022/lib/map/rotation-button/index.mjs +2 -0
- package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +73 -0
- package/esm2022/lib/map/shared/controllers/controller.mjs +44 -0
- package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +8 -0
- package/esm2022/lib/map/shared/controllers/geolocation.mjs +431 -0
- package/esm2022/lib/map/shared/controllers/index.mjs +5 -0
- package/esm2022/lib/map/shared/controllers/view.mjs +360 -0
- package/esm2022/lib/map/shared/hover-feature.directive.mjs +493 -0
- package/esm2022/lib/map/shared/index.mjs +15 -0
- package/esm2022/lib/map/shared/linkedLayers.utils.mjs +248 -0
- package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +121 -0
- package/esm2022/lib/map/shared/map.abstract.mjs +23 -0
- package/esm2022/lib/map/shared/map.enums.mjs +6 -0
- package/esm2022/lib/map/shared/map.interface.mjs +2 -0
- package/esm2022/lib/map/shared/map.mjs +434 -0
- package/esm2022/lib/map/shared/map.service.mjs +30 -0
- package/esm2022/lib/map/shared/map.utils.mjs +456 -0
- package/esm2022/lib/map/shared/mapOffline.directive.mjs +107 -0
- package/esm2022/lib/map/shared/projection.interfaces.mjs +2 -0
- package/esm2022/lib/map/shared/projection.service.mjs +67 -0
- package/esm2022/lib/map/shared/projection.utils.mjs +64 -0
- package/esm2022/lib/map/swipe-control/index.mjs +2 -0
- package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +219 -0
- package/esm2022/lib/map/utils/layer-watcher.mjs +78 -0
- package/esm2022/lib/map/wake-lock-button/index.mjs +2 -0
- package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +106 -0
- package/esm2022/lib/map/zoom-button/index.mjs +2 -0
- package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +49 -0
- package/esm2022/lib/measure/index.mjs +4 -0
- package/esm2022/lib/measure/measure.module.mjs +18 -0
- package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +39 -0
- package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +184 -0
- package/esm2022/lib/measure/measurer/measurer-item.component.mjs +162 -0
- package/esm2022/lib/measure/measurer/measurer.component.mjs +1121 -0
- package/esm2022/lib/measure/measurer/measurer.module.mjs +95 -0
- package/esm2022/lib/measure/shared/index.mjs +4 -0
- package/esm2022/lib/measure/shared/measure.enum.mjs +37 -0
- package/esm2022/lib/measure/shared/measure.interfaces.mjs +2 -0
- package/esm2022/lib/measure/shared/measure.utils.mjs +497 -0
- package/esm2022/lib/metadata/index.mjs +3 -0
- package/esm2022/lib/metadata/metadata-button/index.mjs +2 -0
- package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +140 -0
- package/esm2022/lib/metadata/metadata.module.mjs +47 -0
- package/esm2022/lib/metadata/shared/index.mjs +3 -0
- package/esm2022/lib/metadata/shared/metadata.interface.mjs +2 -0
- package/esm2022/lib/metadata/shared/metadata.service.mjs +19 -0
- package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +128 -0
- package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +6 -0
- package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +2 -0
- package/esm2022/lib/offline/geoDB/geoDB.service.mjs +175 -0
- package/esm2022/lib/offline/geoDB/index.mjs +5 -0
- package/esm2022/lib/offline/index.mjs +4 -0
- package/esm2022/lib/offline/layerDB/index.mjs +3 -0
- package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +2 -0
- package/esm2022/lib/offline/layerDB/layerDB.service.mjs +84 -0
- package/esm2022/lib/offline/shared/geo-network.service.mjs +87 -0
- package/esm2022/lib/offline/shared/index.mjs +2 -0
- package/esm2022/lib/overlay/index.mjs +2 -0
- package/esm2022/lib/overlay/overlay.module.mjs +23 -0
- package/esm2022/lib/overlay/shared/index.mjs +6 -0
- package/esm2022/lib/overlay/shared/overlay.directive.mjs +38 -0
- package/esm2022/lib/overlay/shared/overlay.enum.mjs +8 -0
- package/esm2022/lib/overlay/shared/overlay.mjs +138 -0
- package/esm2022/lib/overlay/shared/overlay.service.mjs +26 -0
- package/esm2022/lib/overlay/shared/overlay.utils.mjs +17 -0
- package/esm2022/lib/print/index.mjs +4 -0
- package/esm2022/lib/print/print/print.component.mjs +122 -0
- package/esm2022/lib/print/print-form/index.mjs +2 -0
- package/esm2022/lib/print/print-form/print-form.component.mjs +580 -0
- package/esm2022/lib/print/print.module.mjs +65 -0
- package/esm2022/lib/print/shared/geopdf.mjs +68 -0
- package/esm2022/lib/print/shared/index.mjs +5 -0
- package/esm2022/lib/print/shared/print.interface.mjs +2 -0
- package/esm2022/lib/print/shared/print.service.mjs +1093 -0
- package/esm2022/lib/print/shared/print.type.mjs +30 -0
- package/esm2022/lib/query/index.mjs +2 -0
- package/esm2022/lib/query/query.module.mjs +29 -0
- package/esm2022/lib/query/shared/index.mjs +7 -0
- package/esm2022/lib/query/shared/query-search-source.mjs +35 -0
- package/esm2022/lib/query/shared/query-search-source.providers.mjs +22 -0
- package/esm2022/lib/query/shared/query.directive.mjs +285 -0
- package/esm2022/lib/query/shared/query.enums.mjs +30 -0
- package/esm2022/lib/query/shared/query.interfaces.mjs +2 -0
- package/esm2022/lib/query/shared/query.service.mjs +753 -0
- package/esm2022/lib/query/shared/query.utils.mjs +41 -0
- package/esm2022/lib/search/index.mjs +12 -0
- package/esm2022/lib/search/search-bar/search-bar.component.mjs +559 -0
- package/esm2022/lib/search/search-bar/search-bar.module.mjs +73 -0
- package/esm2022/lib/search/search-bar/search-url-param.directive.mjs +40 -0
- package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +132 -0
- package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +456 -0
- package/esm2022/lib/search/search-results/search-results-item.component.mjs +166 -0
- package/esm2022/lib/search/search-results/search-results.component.mjs +480 -0
- package/esm2022/lib/search/search-results/search-results.module.mjs +104 -0
- package/esm2022/lib/search/search-selector/search-selector.component.mjs +133 -0
- package/esm2022/lib/search/search-selector/search-selector.module.mjs +56 -0
- package/esm2022/lib/search/search-settings/search-settings.component.mjs +448 -0
- package/esm2022/lib/search/search-settings/search-settings.module.mjs +60 -0
- package/esm2022/lib/search/search.module.mjs +67 -0
- package/esm2022/lib/search/shared/index.mjs +9 -0
- package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +337 -0
- package/esm2022/lib/search/shared/search-source-service.providers.mjs +20 -0
- package/esm2022/lib/search/shared/search-source.service.mjs +56 -0
- package/esm2022/lib/search/shared/search.enums.mjs +4 -0
- package/esm2022/lib/search/shared/search.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/search.service.mjs +130 -0
- package/esm2022/lib/search/shared/search.utils.mjs +92 -0
- package/esm2022/lib/search/shared/sources/cadastre.mjs +139 -0
- package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +23 -0
- package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/coordinates.mjs +166 -0
- package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +40 -0
- package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/icherche.mjs +796 -0
- package/esm2022/lib/search/shared/sources/icherche.providers.mjs +66 -0
- package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/ilayer.mjs +335 -0
- package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +46 -0
- package/esm2022/lib/search/shared/sources/index.mjs +23 -0
- package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/nominatim.mjs +263 -0
- package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +23 -0
- package/esm2022/lib/search/shared/sources/source.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/source.mjs +220 -0
- package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/storedqueries.mjs +455 -0
- package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +41 -0
- package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +2 -0
- package/esm2022/lib/search/shared/sources/workspace.mjs +191 -0
- package/esm2022/lib/search/shared/sources/workspace.providers.mjs +22 -0
- package/esm2022/lib/style/index.mjs +5 -0
- package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +359 -0
- package/esm2022/lib/style/shared/datasource/index.mjs +2 -0
- package/esm2022/lib/style/shared/feature/feature-style.mjs +161 -0
- package/esm2022/lib/style/shared/feature/index.mjs +2 -0
- package/esm2022/lib/style/shared/font.enum.mjs +17 -0
- package/esm2022/lib/style/shared/index.mjs +5 -0
- package/esm2022/lib/style/shared/overlay/index.mjs +3 -0
- package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +45 -0
- package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +88 -0
- package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +78 -0
- package/esm2022/lib/style/shared/vector/conversion.utils.mjs +27 -0
- package/esm2022/lib/style/shared/vector/index.mjs +4 -0
- package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +2 -0
- package/esm2022/lib/style/style-list/index.mjs +5 -0
- package/esm2022/lib/style/style-list/style-list.interface.mjs +2 -0
- package/esm2022/lib/style/style-list/style-list.module.mjs +23 -0
- package/esm2022/lib/style/style-list/style-list.provider.mjs +21 -0
- package/esm2022/lib/style/style-list/style-list.service.mjs +52 -0
- package/esm2022/lib/style/style-modal/drawing/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +288 -0
- package/esm2022/lib/style/style-modal/index.mjs +5 -0
- package/esm2022/lib/style/style-modal/layer/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +182 -0
- package/esm2022/lib/style/style-modal/layer-button/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +48 -0
- package/esm2022/lib/style/style-modal/shared/index.mjs +2 -0
- package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +2 -0
- package/esm2022/lib/style/style-service/draw-style.service.mjs +256 -0
- package/esm2022/lib/style/style-service/index.mjs +3 -0
- package/esm2022/lib/style/style-service/style.service.mjs +393 -0
- package/esm2022/lib/style/style.module.mjs +92 -0
- package/esm2022/lib/toast/index.mjs +2 -0
- package/esm2022/lib/toast/toast.component.mjs +119 -0
- package/esm2022/lib/toast/toast.module.mjs +45 -0
- package/esm2022/lib/utils/googleLinks.mjs +13 -0
- package/esm2022/lib/utils/id-generator.mjs +110 -0
- package/esm2022/lib/utils/index.mjs +5 -0
- package/esm2022/lib/utils/osmLinks.mjs +9 -0
- package/esm2022/lib/utils/propertyTypeDetector/index.mjs +3 -0
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +2 -0
- package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +64 -0
- package/esm2022/lib/wkt/index.mjs +2 -0
- package/esm2022/lib/wkt/shared/index.mjs +2 -0
- package/esm2022/lib/wkt/shared/wkt.service.mjs +236 -0
- package/esm2022/lib/wkt/wkt.module.mjs +22 -0
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +52 -0
- package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +36 -0
- package/esm2022/lib/workspace/confirmation-popup/index.mjs +3 -0
- package/esm2022/lib/workspace/index.mjs +8 -0
- package/esm2022/lib/workspace/shared/edition-workspace.mjs +304 -0
- package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +711 -0
- package/esm2022/lib/workspace/shared/feature-workspace.mjs +41 -0
- package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +109 -0
- package/esm2022/lib/workspace/shared/index.mjs +8 -0
- package/esm2022/lib/workspace/shared/wfs-workspace.mjs +41 -0
- package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +102 -0
- package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +225 -0
- package/esm2022/lib/workspace/shared/workspace.utils.mjs +185 -0
- package/esm2022/lib/workspace/widgets/index.mjs +4 -0
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +52 -0
- package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +25 -0
- package/esm2022/lib/workspace/widgets/widgets.mjs +15 -0
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +167 -0
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +22 -0
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +135 -0
- package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +22 -0
- package/esm2022/lib/workspace/workspace.module.mjs +58 -0
- package/esm2022/public_api.mjs +57 -0
- package/fesm2022/igo2-geo.mjs +48164 -0
- package/fesm2022/igo2-geo.mjs.map +1 -0
- package/geo-theme.scss +21 -0
- package/index.d.ts +5 -5
- package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +117 -117
- package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +77 -77
- package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +99 -99
- 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 +64 -64
- 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 +41 -50
- package/lib/catalog/shared/catalog.enum.d.ts +14 -14
- package/lib/catalog/shared/catalog.interface.d.ts +76 -76
- package/lib/catalog/shared/catalog.service.d.ts +36 -36
- package/lib/catalog/shared/catalogs.d.ts +35 -0
- 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 +113 -113
- package/lib/datasource/shared/datasources/feature-datasource.d.ts +12 -12
- package/lib/datasource/shared/datasources/feature-datasource.interface.d.ts +23 -23
- 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 +45 -31
- package/lib/datasource/shared/datasources/wms-datasource.interface.d.ts +37 -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/index.d.ts +1 -1
- package/lib/datasource/utils/tilegrid.d.ts +2 -2
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +35 -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/directions-results.theming.scss +10 -0
- 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 +24 -23
- package/lib/directions/directions.component.d.ts +64 -56
- package/lib/directions/directions.module.d.ts +27 -26
- package/lib/directions/directions.theming.scss +6 -0
- 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 +28 -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 +10 -10
- 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 +240 -240
- package/lib/draw/draw/draw.module.d.ts +33 -34
- package/lib/draw/draw.theming.scss +32 -0
- 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.enum.d.ts +17 -17
- 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 +4 -4
- 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-details/feature-details.theming.scss +16 -0
- 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/feature.theming.scss +4 -0
- package/lib/feature/index.d.ts +3 -3
- package/lib/feature/shared/feature-store.utils.d.ts +10 -0
- package/lib/feature/shared/feature.enums.d.ts +7 -7
- package/lib/feature/shared/feature.interfaces.d.ts +82 -79
- package/lib/feature/shared/feature.utils.d.ts +97 -106
- package/lib/feature/shared/index.d.ts +7 -6
- package/lib/feature/shared/store.d.ts +78 -78
- package/lib/feature/shared/strategies/geo-properties.d.ts +61 -0
- 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 +7 -6
- 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/search.d.ts +55 -55
- 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/filter.theming.scss +16 -0
- 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-selection/ogc-filter-selection.theming.scss +18 -0
- 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-slider.theming.scss +15 -0
- 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 +15 -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 +57 -57
- 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-form/time-filter-form.theming.scss +5 -0
- 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 +29 -29
- package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +202 -202
- 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 +109 -109
- package/lib/import-export/import-export/index.d.ts +1 -1
- package/lib/import-export/import-export.module.d.ts +25 -25
- package/lib/import-export/index.d.ts +3 -3
- package/lib/import-export/shared/drop-geo-file.directive.d.ts +39 -39
- 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 +10 -10
- package/lib/import-export/shared/import.service.d.ts +31 -31
- package/lib/import-export/shared/import.utils.d.ts +20 -20
- package/lib/import-export/shared/index.d.ts +10 -10
- package/lib/layer/index.d.ts +9 -9
- 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/layer-legend.theming.scss +10 -0
- 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-list-tool/layer-list-tool.theming.scss +22 -0
- package/lib/layer/layer.module.d.ts +34 -35
- package/lib/layer/layer.theming.scss +24 -0
- package/lib/layer/shared/clusterParam.d.ts +13 -13
- package/lib/layer/shared/index.d.ts +4 -4
- package/lib/layer/shared/layer.enums.d.ts +1 -1
- package/lib/layer/shared/layer.service.d.ts +33 -33
- 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 +21 -21
- 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 +66 -66
- package/lib/layer/shared/layers/layer.interface.d.ts +90 -109
- package/lib/layer/shared/layers/legend.interface.d.ts +22 -0
- 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 +94 -94
- package/lib/layer/shared/layers/vector-layer.interface.d.ts +42 -42
- package/lib/layer/shared/layers/vectortile-layer.d.ts +28 -28
- package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +16 -16
- 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 +16 -16
- 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 +22 -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-browser/map-browser.theming.scss +46 -0
- 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/map.theming.scss +9 -0
- 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/menu-button/menu-button.theming.scss +20 -0
- package/lib/map/offline-button/index.d.ts +1 -1
- package/lib/map/offline-button/offline-button.component.d.ts +15 -15
- 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 +95 -127
- package/lib/map/shared/controllers/geolocation.interface.d.ts +30 -0
- package/lib/map/shared/controllers/index.d.ts +4 -3
- package/lib/map/shared/controllers/view.d.ts +200 -200
- package/lib/map/shared/hover-feature.directive.d.ts +124 -124
- package/lib/map/shared/index.d.ts +14 -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.abstract.d.ts +59 -0
- package/lib/map/shared/map.d.ts +140 -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 +18 -18
- 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 +27 -27
- package/lib/map/zoom-button/index.d.ts +1 -1
- package/lib/map/zoom-button/zoom-button.component.d.ts +12 -12
- package/lib/map/zoom-button/zoom-button.theming.scss +32 -0
- package/lib/measure/index.d.ts +3 -3
- package/lib/measure/measure.module.d.ts +7 -7
- package/lib/measure/measure.theming.scss +5 -0
- 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 +26 -25
- package/lib/measure/measurer/measurer.theming.scss +26 -0
- 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 +3 -3
- package/lib/offline/layerDB/index.d.ts +2 -2
- package/lib/offline/layerDB/layerDB.interface.d.ts +7 -7
- package/lib/offline/layerDB/layerDB.service.d.ts +36 -36
- 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 +5 -5
- 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 +6 -6
- 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 +99 -99
- 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 +171 -174
- 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 +231 -230
- package/lib/search/search-bar/search-bar.module.d.ts +24 -23
- package/lib/search/search-bar/search-bar.theming.scss +36 -0
- 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 +84 -84
- package/lib/search/search-results/search-results-item.component.d.ts +52 -52
- package/lib/search/search-results/search-results.component.d.ts +165 -165
- package/lib/search/search-results/search-results.module.d.ts +29 -29
- 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/search.theming.scss +5 -0
- package/lib/search/shared/index.d.ts +8 -8
- package/lib/search/shared/search-pointer-summary.directive.d.ts +125 -124
- package/lib/search/shared/search-source-service.providers.d.ts +15 -15
- package/lib/search/shared/search-source.service.d.ts +39 -39
- package/lib/search/shared/search.enums.d.ts +1 -1
- package/lib/search/shared/search.interfaces.d.ts +54 -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/cadastre.d.ts +34 -33
- package/lib/search/shared/sources/cadastre.providers.d.ts +18 -18
- 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 +98 -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 +56 -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 +22 -22
- package/lib/search/shared/sources/nominatim.d.ts +46 -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 +86 -114
- package/lib/search/shared/sources/source.interfaces.d.ts +54 -47
- package/lib/search/shared/sources/storedqueries.d.ts +75 -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/search/shared/sources/workspace.d.ts +33 -33
- package/lib/search/shared/sources/workspace.interfaces.d.ts +9 -9
- package/lib/search/shared/sources/workspace.providers.d.ts +17 -17
- package/lib/style/index.d.ts +4 -4
- package/lib/style/shared/datasource/esri-style-generator.d.ts +21 -21
- package/lib/style/shared/datasource/index.d.ts +1 -1
- package/lib/style/shared/feature/feature-style.d.ts +18 -18
- package/lib/style/shared/feature/index.d.ts +1 -1
- package/lib/style/shared/font.enum.d.ts +15 -15
- package/lib/style/shared/index.d.ts +4 -4
- package/lib/style/shared/overlay/index.d.ts +2 -2
- package/lib/style/shared/overlay/overlay-marker-style.utils.d.ts +11 -11
- package/lib/style/shared/overlay/overlay-style.utils.d.ts +19 -19
- package/lib/style/shared/vector/commonVectorStyle.d.ts +14 -14
- package/lib/style/shared/vector/conversion.utils.d.ts +22 -22
- package/lib/style/shared/vector/index.d.ts +3 -3
- package/lib/style/shared/vector/vector-style.interface.d.ts +69 -69
- package/lib/style/style-list/index.d.ts +4 -4
- package/lib/style/style-list/style-list.interface.d.ts +6 -6
- package/lib/style/style-list/style-list.module.d.ts +8 -8
- package/lib/style/style-list/style-list.provider.d.ts +15 -15
- package/lib/style/style-list/style-list.service.d.ts +18 -18
- package/lib/style/style-modal/drawing/index.d.ts +1 -1
- package/lib/style/style-modal/drawing/style-modal-drawing.component.d.ts +33 -31
- package/lib/style/style-modal/index.d.ts +4 -4
- package/lib/style/style-modal/layer/index.d.ts +1 -1
- package/lib/style/style-modal/layer/style-modal-layer.component.d.ts +32 -30
- package/lib/style/style-modal/layer-button/index.d.ts +1 -1
- package/lib/style/style-modal/layer-button/style-modal-layer-button.component.d.ts +14 -14
- package/lib/style/style-modal/shared/index.d.ts +1 -1
- package/lib/style/style-modal/shared/style-modal.interface.d.ts +17 -17
- package/lib/style/style-service/draw-style.service.d.ts +35 -35
- package/lib/style/style-service/index.d.ts +2 -2
- package/lib/style/style-service/style.service.d.ts +57 -57
- package/lib/style/style.module.d.ts +23 -22
- 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/googleLinks.d.ts +5 -5
- package/lib/utils/id-generator.d.ts +54 -54
- package/lib/utils/index.d.ts +4 -3
- package/lib/utils/osmLinks.d.ts +4 -4
- package/lib/utils/propertyTypeDetector/index.d.ts +2 -0
- package/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.d.ts +5 -0
- package/lib/utils/propertyTypeDetector/propertyTypeDetector.service.d.ts +15 -0
- 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/confirmation-popup.theming.scss +14 -0
- 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 +84 -82
- package/lib/workspace/shared/edition-workspace.service.d.ts +50 -51
- package/lib/workspace/shared/feature-workspace.d.ts +18 -18
- package/lib/workspace/shared/feature-workspace.service.d.ts +22 -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 +22 -19
- package/lib/workspace/shared/wms-workspace.service.d.ts +24 -22
- package/lib/workspace/shared/workspace.utils.d.ts +23 -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/lib/workspace/workspace.theming.scss +6 -0
- package/locale/en.geo.json +808 -0
- package/locale/fr.geo.json +809 -0
- package/package.json +38 -38
- package/public_api.d.ts +53 -53
- package/style/style.css +350 -0
- package/esm2020/igo2-geo.mjs +0 -5
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +0 -303
- package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +0 -306
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +0 -250
- package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +0 -80
- package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +0 -209
- package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +0 -79
- package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +0 -212
- package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +0 -95
- package/esm2020/lib/catalog/catalog.module.mjs +0 -53
- package/esm2020/lib/catalog/index.mjs +0 -5
- package/esm2020/lib/catalog/shared/catalog.abstract.mjs +0 -95
- package/esm2020/lib/catalog/shared/catalog.enum.mjs +0 -16
- package/esm2020/lib/catalog/shared/catalog.interface.mjs +0 -2
- package/esm2020/lib/catalog/shared/catalog.service.mjs +0 -604
- package/esm2020/lib/catalog/shared/index.mjs +0 -5
- package/esm2020/lib/datasource/datasource.module.mjs +0 -22
- package/esm2020/lib/datasource/index.mjs +0 -3
- package/esm2020/lib/datasource/shared/capabilities.service.mjs +0 -431
- package/esm2020/lib/datasource/shared/datasource.service.mjs +0 -232
- package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +0 -145
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +0 -109
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +0 -15
- package/esm2020/lib/datasource/shared/datasources/data.service.mjs +0 -3
- package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/datasource.mjs +0 -29
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +0 -43
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +0 -57
- package/esm2020/lib/datasource/shared/datasources/index.mjs +0 -36
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +0 -28
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +0 -12
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +0 -49
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +0 -15
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +0 -54
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +0 -72
- package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +0 -152
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +0 -206
- package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +0 -207
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +0 -16
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +0 -9
- package/esm2020/lib/datasource/shared/index.mjs +0 -5
- package/esm2020/lib/datasource/shared/options/index.mjs +0 -5
- package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +0 -2
- package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +0 -15
- package/esm2020/lib/datasource/shared/options/options-api.service.mjs +0 -81
- package/esm2020/lib/datasource/shared/options/options.service.mjs +0 -3
- package/esm2020/lib/datasource/utils/index.mjs +0 -2
- package/esm2020/lib/datasource/utils/tilegrid.mjs +0 -20
- package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +0 -218
- package/esm2020/lib/directions/directions-buttons/index.mjs +0 -2
- package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +0 -290
- package/esm2020/lib/directions/directions-inputs/index.mjs +0 -2
- package/esm2020/lib/directions/directions-results/directions-results.component.mjs +0 -196
- package/esm2020/lib/directions/directions-results/index.mjs +0 -2
- package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +0 -2
- package/esm2020/lib/directions/directions-sources/directions-source.mjs +0 -3
- package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +0 -16
- package/esm2020/lib/directions/directions-sources/index.mjs +0 -5
- package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +0 -99
- package/esm2020/lib/directions/directions.component.mjs +0 -311
- package/esm2020/lib/directions/directions.module.mjs +0 -102
- package/esm2020/lib/directions/index.mjs +0 -7
- package/esm2020/lib/directions/shared/directions-source.service.mjs +0 -17
- package/esm2020/lib/directions/shared/directions.enum.mjs +0 -28
- package/esm2020/lib/directions/shared/directions.interface.mjs +0 -2
- package/esm2020/lib/directions/shared/directions.service.mjs +0 -29
- package/esm2020/lib/directions/shared/directions.utils.mjs +0 -509
- package/esm2020/lib/directions/shared/index.mjs +0 -6
- package/esm2020/lib/directions/shared/store.mjs +0 -24
- package/esm2020/lib/download/download-button/download-button.component.mjs +0 -61
- package/esm2020/lib/download/download-button/index.mjs +0 -2
- package/esm2020/lib/download/download.module.mjs +0 -42
- package/esm2020/lib/download/index.mjs +0 -3
- package/esm2020/lib/download/shared/download.interface.mjs +0 -2
- package/esm2020/lib/download/shared/download.service.mjs +0 -62
- package/esm2020/lib/download/shared/index.mjs +0 -3
- package/esm2020/lib/draw/draw/draw-layer-popup.component.mjs +0 -55
- package/esm2020/lib/draw/draw/draw-popup.component.mjs +0 -591
- package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +0 -48
- package/esm2020/lib/draw/draw/draw.component.mjs +0 -1300
- package/esm2020/lib/draw/draw/draw.module.mjs +0 -113
- package/esm2020/lib/draw/drawingTool.module.mjs +0 -20
- package/esm2020/lib/draw/index.mjs +0 -3
- package/esm2020/lib/draw/shared/draw-icon.service.mjs +0 -27
- package/esm2020/lib/draw/shared/draw.enum.mjs +0 -21
- package/esm2020/lib/draw/shared/draw.interface.mjs +0 -2
- package/esm2020/lib/draw/shared/draw.utils.mjs +0 -122
- package/esm2020/lib/draw/shared/index.mjs +0 -5
- package/esm2020/lib/feature/feature-details/feature-details.component.mjs +0 -404
- package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +0 -54
- package/esm2020/lib/feature/feature-details/feature-details.module.mjs +0 -48
- package/esm2020/lib/feature/feature-form/feature-form.component.mjs +0 -112
- package/esm2020/lib/feature/feature-form/feature-form.module.mjs +0 -34
- package/esm2020/lib/feature/feature.module.mjs +0 -28
- package/esm2020/lib/feature/index.mjs +0 -4
- package/esm2020/lib/feature/shared/feature.enums.mjs +0 -9
- package/esm2020/lib/feature/shared/feature.interfaces.mjs +0 -2
- package/esm2020/lib/feature/shared/feature.utils.mjs +0 -349
- package/esm2020/lib/feature/shared/index.mjs +0 -7
- package/esm2020/lib/feature/shared/store.mjs +0 -133
- package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +0 -113
- package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +0 -94
- package/esm2020/lib/feature/shared/strategies/index.mjs +0 -7
- package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +0 -104
- package/esm2020/lib/feature/shared/strategies/loading.mjs +0 -133
- package/esm2020/lib/feature/shared/strategies/search.mjs +0 -150
- package/esm2020/lib/feature/shared/strategies/selection.mjs +0 -370
- package/esm2020/lib/feature/shared/strategies.utils.mjs +0 -37
- package/esm2020/lib/filter/filter.module.mjs +0 -289
- package/esm2020/lib/filter/index.mjs +0 -16
- package/esm2020/lib/filter/ogc-filter-button/index.mjs +0 -2
- package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +0 -140
- package/esm2020/lib/filter/ogc-filter-form/index.mjs +0 -2
- package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +0 -645
- package/esm2020/lib/filter/ogc-filter-selection/index.mjs +0 -2
- package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +0 -1302
- package/esm2020/lib/filter/ogc-filter-time/index.mjs +0 -3
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +0 -177
- package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +0 -898
- package/esm2020/lib/filter/ogc-filterable-form/index.mjs +0 -2
- package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +0 -59
- package/esm2020/lib/filter/ogc-filterable-item/index.mjs +0 -2
- package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +0 -307
- package/esm2020/lib/filter/ogc-filterable-list/index.mjs +0 -3
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +0 -31
- package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +0 -44
- package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +0 -55
- package/esm2020/lib/filter/shared/index.mjs +0 -12
- package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +0 -72
- package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +0 -30
- package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +0 -2
- package/esm2020/lib/filter/shared/ogc-filter.mjs +0 -692
- package/esm2020/lib/filter/shared/ogc-filter.service.mjs +0 -46
- package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +0 -23
- package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +0 -2
- package/esm2020/lib/filter/shared/spatial-filter.service.mjs +0 -269
- package/esm2020/lib/filter/shared/time-filter.enum.mjs +0 -13
- package/esm2020/lib/filter/shared/time-filter.interface.mjs +0 -2
- package/esm2020/lib/filter/shared/time-filter.service.mjs +0 -107
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +0 -2
- package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +0 -1089
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +0 -2
- package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +0 -207
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +0 -2
- package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +0 -144
- package/esm2020/lib/filter/time-filter-button/index.mjs +0 -2
- package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +0 -78
- package/esm2020/lib/filter/time-filter-form/index.mjs +0 -2
- package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +0 -734
- package/esm2020/lib/filter/time-filter-item/index.mjs +0 -2
- package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +0 -119
- package/esm2020/lib/filter/time-filter-list/index.mjs +0 -3
- package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +0 -31
- package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +0 -39
- package/esm2020/lib/geo.module.mjs +0 -106
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +0 -522
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +0 -189
- package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +0 -64
- package/esm2020/lib/geometry/geometry.module.mjs +0 -27
- package/esm2020/lib/geometry/index.mjs +0 -4
- package/esm2020/lib/geometry/shared/controls/draw.mjs +0 -314
- package/esm2020/lib/geometry/shared/controls/index.mjs +0 -4
- package/esm2020/lib/geometry/shared/controls/modify.mjs +0 -521
- package/esm2020/lib/geometry/shared/controls/slice.mjs +0 -177
- package/esm2020/lib/geometry/shared/geometry.errors.mjs +0 -26
- package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +0 -2
- package/esm2020/lib/geometry/shared/geometry.utils.mjs +0 -122
- package/esm2020/lib/geometry/shared/index.mjs +0 -5
- package/esm2020/lib/import-export/export-button/export-button.component.mjs +0 -64
- package/esm2020/lib/import-export/export-button/index.mjs +0 -2
- package/esm2020/lib/import-export/import-export/import-export.component.mjs +0 -1228
- package/esm2020/lib/import-export/import-export/index.mjs +0 -2
- package/esm2020/lib/import-export/import-export.module.mjs +0 -92
- package/esm2020/lib/import-export/index.mjs +0 -4
- package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +0 -152
- package/esm2020/lib/import-export/shared/export.errors.mjs +0 -15
- package/esm2020/lib/import-export/shared/export.interface.mjs +0 -2
- package/esm2020/lib/import-export/shared/export.service.mjs +0 -195
- package/esm2020/lib/import-export/shared/export.type.mjs +0 -4
- package/esm2020/lib/import-export/shared/export.utils.mjs +0 -46
- package/esm2020/lib/import-export/shared/import.errors.mjs +0 -39
- package/esm2020/lib/import-export/shared/import.interface.mjs +0 -2
- package/esm2020/lib/import-export/shared/import.service.mjs +0 -215
- package/esm2020/lib/import-export/shared/import.utils.mjs +0 -202
- package/esm2020/lib/import-export/shared/index.mjs +0 -11
- package/esm2020/lib/layer/index.mjs +0 -10
- package/esm2020/lib/layer/layer-item/index.mjs +0 -2
- package/esm2020/lib/layer/layer-item/layer-item.component.mjs +0 -300
- package/esm2020/lib/layer/layer-legend/index.mjs +0 -2
- package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +0 -388
- package/esm2020/lib/layer/layer-legend-item/index.mjs +0 -2
- package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +0 -84
- package/esm2020/lib/layer/layer-legend-list/index.mjs +0 -3
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +0 -48
- package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +0 -195
- package/esm2020/lib/layer/layer-list/index.mjs +0 -4
- package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +0 -59
- package/esm2020/lib/layer/layer-list/layer-list.component.mjs +0 -1009
- package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +0 -19
- package/esm2020/lib/layer/layer-list-tool/index.mjs +0 -5
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +0 -165
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +0 -7
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +0 -2
- package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +0 -22
- package/esm2020/lib/layer/layer.module.mjs +0 -180
- package/esm2020/lib/layer/shared/clusterParam.mjs +0 -2
- package/esm2020/lib/layer/shared/index.mjs +0 -5
- package/esm2020/lib/layer/shared/layer.enums.mjs +0 -2
- package/esm2020/lib/layer/shared/layer.service.mjs +0 -237
- package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +0 -2
- package/esm2020/lib/layer/shared/layers/any-layer.mjs +0 -2
- package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +0 -2
- package/esm2020/lib/layer/shared/layers/image-layer.mjs +0 -67
- package/esm2020/lib/layer/shared/layers/index.mjs +0 -13
- package/esm2020/lib/layer/shared/layers/layer.interface.mjs +0 -17
- package/esm2020/lib/layer/shared/layers/layer.mjs +0 -166
- package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +0 -2
- package/esm2020/lib/layer/shared/layers/tile-layer.mjs +0 -47
- package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +0 -2
- package/esm2020/lib/layer/shared/layers/vector-layer.mjs +0 -527
- package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +0 -2
- package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +0 -104
- package/esm2020/lib/layer/track-feature-button/index.mjs +0 -2
- package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +0 -59
- package/esm2020/lib/layer/utils/image-watcher.mjs +0 -59
- package/esm2020/lib/layer/utils/index.mjs +0 -6
- package/esm2020/lib/layer/utils/layer.utils.mjs +0 -10
- package/esm2020/lib/layer/utils/outputLegend.mjs +0 -28
- package/esm2020/lib/layer/utils/tile-watcher.mjs +0 -50
- package/esm2020/lib/layer/utils/vector-watcher.mjs +0 -48
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +0 -20
- package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +0 -97
- package/esm2020/lib/map/baselayers-switcher/index.mjs +0 -3
- package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +0 -142
- package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +0 -79
- package/esm2020/lib/map/geolocate-button/index.mjs +0 -2
- package/esm2020/lib/map/home-extent-button/home-extent-button.component.mjs +0 -63
- package/esm2020/lib/map/home-extent-button/index.mjs +0 -2
- package/esm2020/lib/map/index.mjs +0 -14
- package/esm2020/lib/map/info-section/index.mjs +0 -2
- package/esm2020/lib/map/info-section/info-section.component.mjs +0 -30
- package/esm2020/lib/map/map-browser/index.mjs +0 -2
- package/esm2020/lib/map/map-browser/map-browser.component.mjs +0 -66
- package/esm2020/lib/map/map-center/index.mjs +0 -2
- package/esm2020/lib/map/map-center/map-center.component.mjs +0 -50
- package/esm2020/lib/map/map.module.mjs +0 -127
- package/esm2020/lib/map/menu-button/index.mjs +0 -2
- package/esm2020/lib/map/menu-button/menu-button.component.mjs +0 -62
- package/esm2020/lib/map/offline-button/index.mjs +0 -2
- package/esm2020/lib/map/offline-button/offline-button.component.mjs +0 -53
- package/esm2020/lib/map/rotation-button/index.mjs +0 -2
- package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +0 -70
- package/esm2020/lib/map/shared/controllers/controller.mjs +0 -42
- package/esm2020/lib/map/shared/controllers/geolocation.mjs +0 -423
- package/esm2020/lib/map/shared/controllers/index.mjs +0 -4
- package/esm2020/lib/map/shared/controllers/view.mjs +0 -351
- package/esm2020/lib/map/shared/hover-feature.directive.mjs +0 -454
- package/esm2020/lib/map/shared/index.mjs +0 -14
- package/esm2020/lib/map/shared/linkedLayers.utils.mjs +0 -240
- package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +0 -107
- package/esm2020/lib/map/shared/map.enums.mjs +0 -6
- package/esm2020/lib/map/shared/map.interface.mjs +0 -2
- package/esm2020/lib/map/shared/map.mjs +0 -409
- package/esm2020/lib/map/shared/map.service.mjs +0 -29
- package/esm2020/lib/map/shared/map.utils.mjs +0 -463
- package/esm2020/lib/map/shared/mapOffline.directive.mjs +0 -98
- package/esm2020/lib/map/shared/projection.interfaces.mjs +0 -2
- package/esm2020/lib/map/shared/projection.service.mjs +0 -65
- package/esm2020/lib/map/shared/projection.utils.mjs +0 -64
- package/esm2020/lib/map/swipe-control/index.mjs +0 -2
- package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +0 -193
- package/esm2020/lib/map/utils/layer-watcher.mjs +0 -79
- package/esm2020/lib/map/wake-lock-button/index.mjs +0 -2
- package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +0 -103
- package/esm2020/lib/map/zoom-button/index.mjs +0 -2
- package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +0 -40
- package/esm2020/lib/measure/index.mjs +0 -4
- package/esm2020/lib/measure/measure.module.mjs +0 -20
- package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +0 -37
- package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +0 -180
- package/esm2020/lib/measure/measurer/measurer-item.component.mjs +0 -140
- package/esm2020/lib/measure/measurer/measurer.component.mjs +0 -1042
- package/esm2020/lib/measure/measurer/measurer.module.mjs +0 -94
- package/esm2020/lib/measure/shared/index.mjs +0 -4
- package/esm2020/lib/measure/shared/measure.enum.mjs +0 -37
- package/esm2020/lib/measure/shared/measure.interfaces.mjs +0 -2
- package/esm2020/lib/measure/shared/measure.utils.mjs +0 -489
- package/esm2020/lib/metadata/index.mjs +0 -3
- package/esm2020/lib/metadata/metadata-button/index.mjs +0 -2
- package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +0 -134
- package/esm2020/lib/metadata/metadata.module.mjs +0 -55
- package/esm2020/lib/metadata/shared/index.mjs +0 -3
- package/esm2020/lib/metadata/shared/metadata.interface.mjs +0 -2
- package/esm2020/lib/metadata/shared/metadata.service.mjs +0 -19
- package/esm2020/lib/offline/geoDB/configFileToGeoDB.service.mjs +0 -105
- package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +0 -6
- package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +0 -2
- package/esm2020/lib/offline/geoDB/geoDB.service.mjs +0 -167
- package/esm2020/lib/offline/geoDB/index.mjs +0 -5
- package/esm2020/lib/offline/index.mjs +0 -4
- package/esm2020/lib/offline/layerDB/index.mjs +0 -3
- package/esm2020/lib/offline/layerDB/layerDB.interface.mjs +0 -2
- package/esm2020/lib/offline/layerDB/layerDB.service.mjs +0 -76
- package/esm2020/lib/offline/shared/geo-network.service.mjs +0 -66
- package/esm2020/lib/offline/shared/index.mjs +0 -2
- package/esm2020/lib/overlay/index.mjs +0 -2
- package/esm2020/lib/overlay/overlay.module.mjs +0 -23
- package/esm2020/lib/overlay/shared/index.mjs +0 -6
- package/esm2020/lib/overlay/shared/overlay.directive.mjs +0 -33
- package/esm2020/lib/overlay/shared/overlay.enum.mjs +0 -8
- package/esm2020/lib/overlay/shared/overlay.mjs +0 -130
- package/esm2020/lib/overlay/shared/overlay.service.mjs +0 -27
- package/esm2020/lib/overlay/shared/overlay.utils.mjs +0 -17
- package/esm2020/lib/print/index.mjs +0 -4
- package/esm2020/lib/print/print/print.component.mjs +0 -112
- package/esm2020/lib/print/print-form/index.mjs +0 -2
- package/esm2020/lib/print/print-form/print-form.component.mjs +0 -514
- package/esm2020/lib/print/print.module.mjs +0 -65
- package/esm2020/lib/print/shared/geopdf.mjs +0 -58
- package/esm2020/lib/print/shared/index.mjs +0 -5
- package/esm2020/lib/print/shared/print.interface.mjs +0 -2
- package/esm2020/lib/print/shared/print.service.mjs +0 -984
- package/esm2020/lib/print/shared/print.type.mjs +0 -30
- package/esm2020/lib/query/index.mjs +0 -2
- package/esm2020/lib/query/query.module.mjs +0 -29
- package/esm2020/lib/query/shared/index.mjs +0 -7
- package/esm2020/lib/query/shared/query-search-source.mjs +0 -35
- package/esm2020/lib/query/shared/query-search-source.providers.mjs +0 -22
- package/esm2020/lib/query/shared/query.directive.mjs +0 -261
- package/esm2020/lib/query/shared/query.enums.mjs +0 -30
- package/esm2020/lib/query/shared/query.interfaces.mjs +0 -2
- package/esm2020/lib/query/shared/query.service.mjs +0 -731
- package/esm2020/lib/query/shared/query.utils.mjs +0 -37
- package/esm2020/lib/search/index.mjs +0 -12
- package/esm2020/lib/search/search-bar/search-bar.component.mjs +0 -512
- package/esm2020/lib/search/search-bar/search-bar.module.mjs +0 -75
- package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +0 -35
- package/esm2020/lib/search/search-results/save-feature-dialog.component.mjs +0 -118
- package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +0 -429
- package/esm2020/lib/search/search-results/search-results-item.component.mjs +0 -147
- package/esm2020/lib/search/search-results/search-results.component.mjs +0 -454
- package/esm2020/lib/search/search-results/search-results.module.mjs +0 -108
- package/esm2020/lib/search/search-selector/search-selector.component.mjs +0 -123
- package/esm2020/lib/search/search-selector/search-selector.module.mjs +0 -56
- package/esm2020/lib/search/search-settings/search-settings.component.mjs +0 -440
- package/esm2020/lib/search/search-settings/search-settings.module.mjs +0 -60
- package/esm2020/lib/search/search.module.mjs +0 -67
- package/esm2020/lib/search/shared/index.mjs +0 -9
- package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +0 -295
- package/esm2020/lib/search/shared/search-source-service.providers.mjs +0 -20
- package/esm2020/lib/search/shared/search-source.service.mjs +0 -55
- package/esm2020/lib/search/shared/search.enums.mjs +0 -4
- package/esm2020/lib/search/shared/search.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/search.service.mjs +0 -121
- package/esm2020/lib/search/shared/search.utils.mjs +0 -91
- package/esm2020/lib/search/shared/sources/cadastre.mjs +0 -126
- package/esm2020/lib/search/shared/sources/cadastre.providers.mjs +0 -23
- package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/coordinates.mjs +0 -153
- package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +0 -40
- package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/icherche.mjs +0 -767
- package/esm2020/lib/search/shared/sources/icherche.providers.mjs +0 -66
- package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/ilayer.mjs +0 -320
- package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +0 -40
- package/esm2020/lib/search/shared/sources/index.mjs +0 -23
- package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/nominatim.mjs +0 -253
- package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +0 -23
- package/esm2020/lib/search/shared/sources/source.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/source.mjs +0 -209
- package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/storedqueries.mjs +0 -425
- package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +0 -41
- package/esm2020/lib/search/shared/sources/workspace.interfaces.mjs +0 -2
- package/esm2020/lib/search/shared/sources/workspace.mjs +0 -186
- package/esm2020/lib/search/shared/sources/workspace.providers.mjs +0 -26
- package/esm2020/lib/style/index.mjs +0 -5
- package/esm2020/lib/style/shared/datasource/esri-style-generator.mjs +0 -357
- package/esm2020/lib/style/shared/datasource/index.mjs +0 -2
- package/esm2020/lib/style/shared/feature/feature-style.mjs +0 -141
- package/esm2020/lib/style/shared/feature/index.mjs +0 -2
- package/esm2020/lib/style/shared/font.enum.mjs +0 -17
- package/esm2020/lib/style/shared/index.mjs +0 -5
- package/esm2020/lib/style/shared/overlay/index.mjs +0 -3
- package/esm2020/lib/style/shared/overlay/overlay-marker-style.utils.mjs +0 -43
- package/esm2020/lib/style/shared/overlay/overlay-style.utils.mjs +0 -88
- package/esm2020/lib/style/shared/vector/commonVectorStyle.mjs +0 -75
- package/esm2020/lib/style/shared/vector/conversion.utils.mjs +0 -27
- package/esm2020/lib/style/shared/vector/index.mjs +0 -4
- package/esm2020/lib/style/shared/vector/vector-style.interface.mjs +0 -2
- package/esm2020/lib/style/style-list/index.mjs +0 -5
- package/esm2020/lib/style/style-list/style-list.interface.mjs +0 -2
- package/esm2020/lib/style/style-list/style-list.module.mjs +0 -23
- package/esm2020/lib/style/style-list/style-list.provider.mjs +0 -21
- package/esm2020/lib/style/style-list/style-list.service.mjs +0 -51
- package/esm2020/lib/style/style-modal/drawing/index.mjs +0 -2
- package/esm2020/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +0 -288
- package/esm2020/lib/style/style-modal/index.mjs +0 -5
- package/esm2020/lib/style/style-modal/layer/index.mjs +0 -2
- package/esm2020/lib/style/style-modal/layer/style-modal-layer.component.mjs +0 -187
- package/esm2020/lib/style/style-modal/layer-button/index.mjs +0 -2
- package/esm2020/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +0 -44
- package/esm2020/lib/style/style-modal/shared/index.mjs +0 -2
- package/esm2020/lib/style/style-modal/shared/style-modal.interface.mjs +0 -2
- package/esm2020/lib/style/style-service/draw-style.service.mjs +0 -187
- package/esm2020/lib/style/style-service/index.mjs +0 -3
- package/esm2020/lib/style/style-service/style.service.mjs +0 -356
- package/esm2020/lib/style/style.module.mjs +0 -74
- package/esm2020/lib/toast/index.mjs +0 -2
- package/esm2020/lib/toast/toast.component.mjs +0 -113
- package/esm2020/lib/toast/toast.module.mjs +0 -45
- package/esm2020/lib/utils/googleLinks.mjs +0 -13
- package/esm2020/lib/utils/id-generator.mjs +0 -110
- package/esm2020/lib/utils/index.mjs +0 -4
- package/esm2020/lib/utils/osmLinks.mjs +0 -10
- package/esm2020/lib/wkt/index.mjs +0 -2
- package/esm2020/lib/wkt/shared/index.mjs +0 -2
- package/esm2020/lib/wkt/shared/wkt.service.mjs +0 -239
- package/esm2020/lib/wkt/wkt.module.mjs +0 -22
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +0 -48
- package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +0 -36
- package/esm2020/lib/workspace/confirmation-popup/index.mjs +0 -3
- package/esm2020/lib/workspace/index.mjs +0 -8
- package/esm2020/lib/workspace/shared/edition-workspace.mjs +0 -280
- package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +0 -642
- package/esm2020/lib/workspace/shared/feature-workspace.mjs +0 -35
- package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +0 -157
- package/esm2020/lib/workspace/shared/index.mjs +0 -8
- package/esm2020/lib/workspace/shared/wfs-workspace.mjs +0 -35
- package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +0 -150
- package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +0 -260
- package/esm2020/lib/workspace/shared/workspace.utils.mjs +0 -24
- package/esm2020/lib/workspace/widgets/index.mjs +0 -4
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +0 -47
- package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +0 -36
- package/esm2020/lib/workspace/widgets/widgets.mjs +0 -15
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +0 -133
- package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -28
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +0 -113
- package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +0 -28
- package/esm2020/lib/workspace/workspace.module.mjs +0 -62
- package/esm2020/public_api.mjs +0 -57
- package/fesm2015/igo2-geo.mjs +0 -46894
- package/fesm2015/igo2-geo.mjs.map +0 -1
- package/fesm2020/igo2-geo.mjs +0 -44993
- package/fesm2020/igo2-geo.mjs.map +0 -1
- package/ngcc.config.js +0 -3
- package/style/geo.theming.scss +0 -12
|
@@ -1,984 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Observable, Subject, forkJoin } from 'rxjs';
|
|
3
|
-
import { map as rxMap } from 'rxjs/operators';
|
|
4
|
-
import { saveAs } from 'file-saver';
|
|
5
|
-
import jsPDF from 'jspdf';
|
|
6
|
-
import html2canvas from 'html2canvas';
|
|
7
|
-
import { default as JSZip } from 'jszip';
|
|
8
|
-
import { SubjectStatus } from '@igo2/utils';
|
|
9
|
-
import { SecureImagePipe } from '@igo2/common';
|
|
10
|
-
import { formatScale } from '../../map/shared/map.utils';
|
|
11
|
-
import { getLayersLegends } from '../../layer/utils/outputLegend';
|
|
12
|
-
import GeoPdfPlugin from './geopdf';
|
|
13
|
-
import { PrintPaperFormat } from './print.type';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@angular/common/http";
|
|
16
|
-
import * as i2 from "@igo2/core";
|
|
17
|
-
export class PrintService {
|
|
18
|
-
constructor(http, messageService, activityService, languageService, configService) {
|
|
19
|
-
this.http = http;
|
|
20
|
-
this.messageService = messageService;
|
|
21
|
-
this.activityService = activityService;
|
|
22
|
-
this.languageService = languageService;
|
|
23
|
-
this.configService = configService;
|
|
24
|
-
this.TEXTPDFFONT = {
|
|
25
|
-
titleFont: 'Times',
|
|
26
|
-
titleFontStyle: 'bold',
|
|
27
|
-
subtitleFont: 'Times',
|
|
28
|
-
subtitleFontStyle: 'bold',
|
|
29
|
-
commentFont: 'courier',
|
|
30
|
-
commentFontStyle: 'normal',
|
|
31
|
-
commentFontSize: 12
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
print(map, options) {
|
|
35
|
-
const status$ = new Subject();
|
|
36
|
-
const paperFormat = options.paperFormat;
|
|
37
|
-
const resolution = +options.resolution; // Default is 96
|
|
38
|
-
const orientation = options.orientation;
|
|
39
|
-
const legendPostion = options.legendPosition;
|
|
40
|
-
this.activityId = this.activityService.register();
|
|
41
|
-
GeoPdfPlugin(jsPDF.API);
|
|
42
|
-
const doc = new jsPDF({
|
|
43
|
-
orientation,
|
|
44
|
-
format: paperFormat.toLowerCase(),
|
|
45
|
-
unit: 'mm' // default
|
|
46
|
-
});
|
|
47
|
-
const dimensions = [
|
|
48
|
-
doc.internal.pageSize.width,
|
|
49
|
-
doc.internal.pageSize.height
|
|
50
|
-
];
|
|
51
|
-
const margins = [10, 10, 10, 10];
|
|
52
|
-
const width = dimensions[0] - margins[3] - margins[1];
|
|
53
|
-
const height = dimensions[1] - margins[0] - margins[2];
|
|
54
|
-
const size = [width, height];
|
|
55
|
-
let titleSizes;
|
|
56
|
-
let subtitleSizes;
|
|
57
|
-
// if paper format A1 or A0 add margin top
|
|
58
|
-
if ((options.title !== '' || options.subtitle) &&
|
|
59
|
-
(paperFormat === PrintPaperFormat.A1 || paperFormat === PrintPaperFormat.A0)) {
|
|
60
|
-
margins[0] += 10;
|
|
61
|
-
}
|
|
62
|
-
// PDF title
|
|
63
|
-
const fontSizeInPt = Math.round(2 * (height + 145) * 0.05) / 2; //calculate the fontSize title from the page height.
|
|
64
|
-
if (options.title !== undefined && options.title !== '') {
|
|
65
|
-
titleSizes = this.getTextPdfObjectSizeAndMarg(options.title, margins, this.TEXTPDFFONT.titleFont, fontSizeInPt, this.TEXTPDFFONT.titleFontStyle, doc);
|
|
66
|
-
this.addTextInPdfDoc(doc, options.title, this.TEXTPDFFONT.titleFont, this.TEXTPDFFONT.titleFontStyle, titleSizes.fontSize, titleSizes.marginLeft + margins[3], margins[0]);
|
|
67
|
-
margins[0] = titleSizes.height + margins[0]; // cumulative margin top for next elem to place in pdf doc
|
|
68
|
-
}
|
|
69
|
-
// PDF subtitle
|
|
70
|
-
if (options.subtitle !== undefined && options.subtitle !== '') {
|
|
71
|
-
subtitleSizes = this.getTextPdfObjectSizeAndMarg(options.subtitle, margins, this.TEXTPDFFONT.subtitleFont, (options.title !== '') ? titleSizes.fontSize * 0.7 : fontSizeInPt * 0.7, // 70% size of title
|
|
72
|
-
this.TEXTPDFFONT.subtitleFontStyle, doc);
|
|
73
|
-
this.addTextInPdfDoc(doc, options.subtitle, this.TEXTPDFFONT.subtitleFont, this.TEXTPDFFONT.subtitleFontStyle, subtitleSizes.fontSize, subtitleSizes.marginLeft + margins[3], margins[0]);
|
|
74
|
-
margins[0] += 5; // cumulative marg top for next elem to place in pdf doc. 5 is a fix it could be adjust
|
|
75
|
-
}
|
|
76
|
-
if (options.showProjection === true || options.showScale === true) {
|
|
77
|
-
this.addProjScale(doc, map, resolution, options.showProjection, options.showScale);
|
|
78
|
-
}
|
|
79
|
-
if (options.comment !== undefined && options.comment !== '') {
|
|
80
|
-
this.addComment(doc, options.comment);
|
|
81
|
-
}
|
|
82
|
-
this.addMap(doc, map, resolution, size, margins).subscribe(async (status) => {
|
|
83
|
-
if (status === SubjectStatus.Done) {
|
|
84
|
-
await this.addScale(doc, map, margins);
|
|
85
|
-
await this.handleMeasureLayer(doc, map, margins);
|
|
86
|
-
const width = this.imgSizeAdded[0];
|
|
87
|
-
const height = this.imgSizeAdded[1];
|
|
88
|
-
const res = 1;
|
|
89
|
-
this.addGeoRef(doc, map, width, height, res, margins);
|
|
90
|
-
if (options.legendPosition !== 'none') {
|
|
91
|
-
if (['topleft', 'topright', 'bottomleft', 'bottomright'].indexOf(options.legendPosition) > -1) {
|
|
92
|
-
await this.addLegendSamePage(doc, map, margins, resolution, options.legendPosition);
|
|
93
|
-
}
|
|
94
|
-
else if (options.legendPosition === 'newpage') {
|
|
95
|
-
await this.addLegend(doc, map, margins, resolution);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
await this.saveDoc(doc);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (status === SubjectStatus.Done || status === SubjectStatus.Error) {
|
|
103
|
-
this.activityService.unregister(this.activityId);
|
|
104
|
-
status$.next(SubjectStatus.Done);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
return status$;
|
|
108
|
-
}
|
|
109
|
-
// ref GeoMoose https://github.com/geomoose/gm3/tree/main/src/gm3/components/print
|
|
110
|
-
addGeoRef(doc, map, width, height, resolution, margins) {
|
|
111
|
-
const unit = 'mm';
|
|
112
|
-
const docHeight = doc.internal.pageSize.getHeight();
|
|
113
|
-
// x,y = margin left-bottom corner for img in pdf doc
|
|
114
|
-
const x = margins[3];
|
|
115
|
-
const y = docHeight - margins[0] - height;
|
|
116
|
-
let pdf_extents = [x, y, x + width, y + height];
|
|
117
|
-
for (let i = 0; i < pdf_extents.length; i++) {
|
|
118
|
-
pdf_extents[i] = this.pdf_units2points(pdf_extents[i], unit);
|
|
119
|
-
}
|
|
120
|
-
const mapExtent = map.viewController.getExtent('EPSG:3857');
|
|
121
|
-
doc.setGeoArea(pdf_extents, mapExtent);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Add measure overlay on the map on the document when the measure layer is present
|
|
125
|
-
* @param doc - Pdf document where measure tooltip will be added
|
|
126
|
-
* @param map - Map of the app
|
|
127
|
-
* @param margins - Page margins
|
|
128
|
-
*/
|
|
129
|
-
async handleMeasureLayer(doc, map, margins) {
|
|
130
|
-
if (map.layers.find(layer => layer.visible && layer.id.startsWith('igo-measures-'))) {
|
|
131
|
-
let canvasOverlayHTMLMeasures;
|
|
132
|
-
const mapOverlayMeasuresHTML = map.ol.getOverlayContainer();
|
|
133
|
-
await html2canvas(mapOverlayMeasuresHTML, {
|
|
134
|
-
scale: 1,
|
|
135
|
-
backgroundColor: null
|
|
136
|
-
}).then(e => {
|
|
137
|
-
canvasOverlayHTMLMeasures = e;
|
|
138
|
-
});
|
|
139
|
-
this.addCanvas(doc, canvasOverlayHTMLMeasures, margins); // this adds measure overlays
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Get html code for all layers legend
|
|
144
|
-
* @param map IgoMap
|
|
145
|
-
* @param width The width that the legend need to be
|
|
146
|
-
* @return Html code for the legend
|
|
147
|
-
*/
|
|
148
|
-
getLayersLegendHtml(map, width, resolution) {
|
|
149
|
-
return new Observable((observer) => {
|
|
150
|
-
let html = '';
|
|
151
|
-
const legends = getLayersLegends(map.layers, {
|
|
152
|
-
resolution: map.viewController.getResolution(),
|
|
153
|
-
extent: map.viewController.getExtent(),
|
|
154
|
-
projection: map.viewController.getOlProjection().getCode(),
|
|
155
|
-
// scale: map.viewController.getScale(resolution),
|
|
156
|
-
size: map.ol.getSize()
|
|
157
|
-
});
|
|
158
|
-
if (legends.filter(l => l.display === true).length === 0) {
|
|
159
|
-
observer.next(html);
|
|
160
|
-
observer.complete();
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
// Define important style to be sure that all container is convert
|
|
164
|
-
// to image not just visible part
|
|
165
|
-
html += '<style media="screen" type="text/css">';
|
|
166
|
-
html += '.html2canvas-container { width: ' + width + 'mm !important; height: 2000px !important; }';
|
|
167
|
-
html += 'table.tableLegend {table-layout: auto;}';
|
|
168
|
-
html += 'div.styleLegend {padding-top: 5px; padding-right:5px;padding-left:5px;padding-bottom:5px;}';
|
|
169
|
-
html += '</style>';
|
|
170
|
-
// The font size will also be lowered afterwards (globally along the legend size)
|
|
171
|
-
// this allows having a good relative font size here and to keep ajusting the legend size
|
|
172
|
-
// while keeping good relative font size
|
|
173
|
-
html += '<font size="3" face="Times" >';
|
|
174
|
-
html += '<div class="styleLegend">';
|
|
175
|
-
html += '<table class="tableLegend" >';
|
|
176
|
-
// For each legend, define an html table cell
|
|
177
|
-
const images$ = legends.filter(l => l.display && l.isInResolutionsRange === true)
|
|
178
|
-
.map((legend) => this.getDataImage(legend.url).pipe(rxMap((dataImage) => {
|
|
179
|
-
let htmlImg = '<tr><td>' + legend.title.toUpperCase() + '</td></tr>';
|
|
180
|
-
htmlImg += '<tr><td><img src="' + dataImage + '"></td></tr>';
|
|
181
|
-
return htmlImg;
|
|
182
|
-
})));
|
|
183
|
-
forkJoin(images$).subscribe((dataImages) => {
|
|
184
|
-
html = dataImages.reduce((acc, current) => (acc += current), html);
|
|
185
|
-
html += '</table>';
|
|
186
|
-
html += '</div>';
|
|
187
|
-
observer.next(html);
|
|
188
|
-
observer.complete();
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
getDataImage(url) {
|
|
193
|
-
const secureIMG = new SecureImagePipe(this.http, this.configService);
|
|
194
|
-
return secureIMG.transform(url);
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Get all the legend in a single image
|
|
198
|
-
* * @param format - Image format. default value to "png"
|
|
199
|
-
* @return The image of the legend
|
|
200
|
-
*/
|
|
201
|
-
async getLayersLegendImage(map, format = 'png', doZipFile, resolution) {
|
|
202
|
-
const status$ = new Subject();
|
|
203
|
-
// Get html code for the legend
|
|
204
|
-
const width = 200; // milimeters unit, originally define for document pdf
|
|
205
|
-
let html = await this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
206
|
-
format = format.toLowerCase();
|
|
207
|
-
// If no legend show No LEGEND in an image
|
|
208
|
-
if (html.length === 0) {
|
|
209
|
-
html = '<font size="12" face="Courier New" >';
|
|
210
|
-
html += '<div align="center"><b>NO LEGEND</b></div>';
|
|
211
|
-
}
|
|
212
|
-
// Create div to contain html code for legend
|
|
213
|
-
const div = window.document.createElement('div');
|
|
214
|
-
div.style.position = 'absolute';
|
|
215
|
-
div.style.top = '0';
|
|
216
|
-
// Add html code to convert in the new window
|
|
217
|
-
window.document.body.appendChild(div);
|
|
218
|
-
div.innerHTML = html;
|
|
219
|
-
await this.timeout(1);
|
|
220
|
-
const canvas = await html2canvas(div, { useCORS: true }).catch((e) => {
|
|
221
|
-
console.log(e);
|
|
222
|
-
});
|
|
223
|
-
if (canvas) {
|
|
224
|
-
let status = SubjectStatus.Done;
|
|
225
|
-
try {
|
|
226
|
-
if (!doZipFile) {
|
|
227
|
-
// Save the canvas as file
|
|
228
|
-
this.saveCanvasImageAsFile(canvas, 'legendImage', format);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
// Add the canvas to zip
|
|
232
|
-
this.generateCanvaFileToZip(canvas, 'legendImage' + '.' + format);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
catch (err) {
|
|
236
|
-
status = SubjectStatus.Error;
|
|
237
|
-
}
|
|
238
|
-
status$.next(status);
|
|
239
|
-
}
|
|
240
|
-
return status$;
|
|
241
|
-
}
|
|
242
|
-
getTextPdfObjectSizeAndMarg(text, margins, font, fontSizeInPt, fontStyle, doc) {
|
|
243
|
-
const pdfResolution = 96;
|
|
244
|
-
const docWidth = doc.internal.pageSize.getWidth();
|
|
245
|
-
const pageWidth = docWidth - margins[1] - margins[3];
|
|
246
|
-
// important to set it first, the textDimension change when font change!
|
|
247
|
-
doc.setFont(font, fontStyle);
|
|
248
|
-
doc.setFontSize(fontSizeInPt);
|
|
249
|
-
let textDimensions = doc.getTextDimensions(text);
|
|
250
|
-
let textMarginLeft;
|
|
251
|
-
if (textDimensions.w > pageWidth) {
|
|
252
|
-
// if the text is to long, reduce fontSize 70% and the overflow with be cut in print...
|
|
253
|
-
textMarginLeft = 0;
|
|
254
|
-
fontSizeInPt = fontSizeInPt * 0.7;
|
|
255
|
-
doc.setFontSize(fontSizeInPt);
|
|
256
|
-
textDimensions = doc.getTextDimensions(text);
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
textMarginLeft = (pageWidth - textDimensions.w) / 2;
|
|
260
|
-
}
|
|
261
|
-
return {
|
|
262
|
-
'fontSize': fontSizeInPt,
|
|
263
|
-
'marginLeft': textMarginLeft,
|
|
264
|
-
'height': textDimensions.h
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Add comment to the document
|
|
269
|
-
* * @param doc - pdf document
|
|
270
|
-
* * @param comment - Comment to add in the document
|
|
271
|
-
*/
|
|
272
|
-
addComment(doc, comment) {
|
|
273
|
-
const commentMarginLeft = 10; //margin left and bottom is fix
|
|
274
|
-
const commentMarginBottom = 10;
|
|
275
|
-
const marginTop = doc.internal.pageSize.height - commentMarginBottom;
|
|
276
|
-
this.addTextInPdfDoc(doc, comment, this.TEXTPDFFONT.commentFont, this.TEXTPDFFONT.commentFontStyle, this.TEXTPDFFONT.commentFontSize, commentMarginLeft, marginTop, true);
|
|
277
|
-
}
|
|
278
|
-
addTextInPdfDoc(doc, textToAdd, textFont, textFontStyle, textFontSize, textMarginLeft, textMarginTop, isComment = false) {
|
|
279
|
-
doc.setFont(textFont, textFontStyle);
|
|
280
|
-
doc.setFontSize(textFontSize);
|
|
281
|
-
if (isComment) {
|
|
282
|
-
textToAdd = doc.splitTextToSize(textToAdd, (doc.internal.pageSize.getWidth() - (textMarginLeft * 3)));
|
|
283
|
-
}
|
|
284
|
-
doc.text(textToAdd, textMarginLeft, textMarginTop);
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Add projection and/or scale to the document
|
|
288
|
-
* @param doc - pdf document
|
|
289
|
-
* @param map - Map of the app
|
|
290
|
-
* @param dpi - DPI resolution of the document
|
|
291
|
-
* @param projection - Bool to indicate if projection need to be added
|
|
292
|
-
* @param scale - Bool to indicate if scale need to be added
|
|
293
|
-
*/
|
|
294
|
-
addProjScale(doc, map, dpi, projection, scale) {
|
|
295
|
-
const translate = this.languageService.translate;
|
|
296
|
-
const projScaleSize = 12;
|
|
297
|
-
const projScaleMarginLeft = 10;
|
|
298
|
-
const marginBottom = 15;
|
|
299
|
-
const heightPixels = doc.internal.pageSize.height - marginBottom;
|
|
300
|
-
let textProjScale = '';
|
|
301
|
-
if (projection === true) {
|
|
302
|
-
const projText = translate.instant('igo.geo.printForm.projection');
|
|
303
|
-
textProjScale += projText + ': ' + map.projection;
|
|
304
|
-
}
|
|
305
|
-
if (scale === true) {
|
|
306
|
-
if (projection === true) {
|
|
307
|
-
textProjScale += ' ';
|
|
308
|
-
}
|
|
309
|
-
const scaleText = translate.instant('igo.geo.printForm.scale');
|
|
310
|
-
const mapScale = map.viewController.getScale(dpi);
|
|
311
|
-
textProjScale += scaleText + ': ~ 1 / ' + formatScale(mapScale);
|
|
312
|
-
}
|
|
313
|
-
doc.setFont('courier');
|
|
314
|
-
doc.setFontSize(projScaleSize);
|
|
315
|
-
doc.text(textProjScale, projScaleMarginLeft, heightPixels);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Add the legend to the document
|
|
319
|
-
* @param doc - Pdf document where legend will be added
|
|
320
|
-
* @param map - Map of the app
|
|
321
|
-
* @param margins - Page margins
|
|
322
|
-
*/
|
|
323
|
-
async addLegend(doc, map, margins, resolution) {
|
|
324
|
-
// Get html code for the legend
|
|
325
|
-
const width = doc.internal.pageSize.width;
|
|
326
|
-
const html = await this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
327
|
-
// If no legend, save the map directly
|
|
328
|
-
if (html === '') {
|
|
329
|
-
await this.saveDoc(doc);
|
|
330
|
-
return true;
|
|
331
|
-
}
|
|
332
|
-
// Create div to contain html code for legend
|
|
333
|
-
const div = window.document.createElement('div');
|
|
334
|
-
div.style.position = 'absolute';
|
|
335
|
-
div.style.top = '0';
|
|
336
|
-
// Add html code to convert in the new window
|
|
337
|
-
window.document.body.appendChild(div);
|
|
338
|
-
div.innerHTML = html;
|
|
339
|
-
await this.timeout(1);
|
|
340
|
-
const canvas = await html2canvas(div, { useCORS: true }).catch((e) => {
|
|
341
|
-
console.log(e);
|
|
342
|
-
});
|
|
343
|
-
if (canvas) {
|
|
344
|
-
const pourcentageReduction = 0.85;
|
|
345
|
-
const imageSize = [pourcentageReduction * (25.4 * canvas.width) / resolution, pourcentageReduction
|
|
346
|
-
* (25.4 * canvas.height) / resolution];
|
|
347
|
-
let imgData;
|
|
348
|
-
doc.addPage();
|
|
349
|
-
imgData = canvas.toDataURL('image/png');
|
|
350
|
-
doc.addImage(imgData, 'PNG', 10, 10, imageSize[0], imageSize[1]);
|
|
351
|
-
}
|
|
352
|
-
await this.saveDoc(doc);
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Add the legend to the document
|
|
356
|
-
* @param doc - Pdf document where legend will be added
|
|
357
|
-
* @param map - Map of the app
|
|
358
|
-
* @param margins - Page margins
|
|
359
|
-
*/
|
|
360
|
-
async addLegendSamePage(doc, map, margins, resolution, legendPosition) {
|
|
361
|
-
// Get html code for the legend
|
|
362
|
-
const width = doc.internal.pageSize.width;
|
|
363
|
-
const html = await this.getLayersLegendHtml(map, width, resolution).toPromise();
|
|
364
|
-
// If no legend, save the map directly
|
|
365
|
-
if (html === '') {
|
|
366
|
-
await this.saveDoc(doc);
|
|
367
|
-
return true;
|
|
368
|
-
}
|
|
369
|
-
// Create div to contain html code for legend
|
|
370
|
-
const div = window.document.createElement('div');
|
|
371
|
-
div.style.position = 'absolute';
|
|
372
|
-
div.style.top = '0';
|
|
373
|
-
// Add html code to convert in the new window
|
|
374
|
-
window.document.body.appendChild(div);
|
|
375
|
-
div.innerHTML = html;
|
|
376
|
-
await this.timeout(1);
|
|
377
|
-
const canvas = await html2canvas(div, { useCORS: true }).catch((e) => {
|
|
378
|
-
console.log(e);
|
|
379
|
-
});
|
|
380
|
-
let marginsLegend;
|
|
381
|
-
if (canvas) {
|
|
382
|
-
const pourcentageReduction = 0.85;
|
|
383
|
-
const imageSize = [pourcentageReduction * (25.4 * canvas.width) / resolution,
|
|
384
|
-
pourcentageReduction * (25.4 * canvas.height) / resolution];
|
|
385
|
-
// Move the legend to the correct position on the page
|
|
386
|
-
if (legendPosition === 'bottomright') {
|
|
387
|
-
marginsLegend = [doc.internal.pageSize.height - margins[2] - imageSize[1], margins[1],
|
|
388
|
-
margins[2], doc.internal.pageSize.width - margins[1] - imageSize[0]];
|
|
389
|
-
}
|
|
390
|
-
else if (legendPosition === 'topright') {
|
|
391
|
-
marginsLegend = [margins[0], margins[1], doc.internal.pageSize.height - margins[0] - imageSize[1],
|
|
392
|
-
doc.internal.pageSize.width - margins[1] - imageSize[0]];
|
|
393
|
-
}
|
|
394
|
-
else if (legendPosition === 'bottomleft') {
|
|
395
|
-
// When the legend is in the bottom left, raise the legend slightly upward so that attributions are visible
|
|
396
|
-
marginsLegend = [doc.internal.pageSize.height - margins[2] - imageSize[1] - 15,
|
|
397
|
-
doc.internal.pageSize.width - margins[3] - imageSize[0], margins[2] + 15, margins[3]];
|
|
398
|
-
}
|
|
399
|
-
else if (legendPosition === 'topleft') {
|
|
400
|
-
marginsLegend = [margins[0], doc.internal.pageSize.width - margins[3] - imageSize[0],
|
|
401
|
-
doc.internal.pageSize.height - margins[0] - imageSize[1], margins[3]];
|
|
402
|
-
}
|
|
403
|
-
this.addCanvas(doc, canvas, marginsLegend); // this adds the legend
|
|
404
|
-
await this.saveDoc(doc);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* Add scale and attributions on the map on the document
|
|
409
|
-
* @param doc - Pdf document where legend will be added
|
|
410
|
-
* @param map - Map of the app
|
|
411
|
-
* @param margins - Page margins
|
|
412
|
-
*/
|
|
413
|
-
async addScale(doc, map, margins) {
|
|
414
|
-
const mapSize = map.ol.getSize();
|
|
415
|
-
const extent = map.ol.getView().calculateExtent(mapSize);
|
|
416
|
-
// Get the scale and attribution
|
|
417
|
-
// we use cloneNode to modify the nodes to print without modifying it on the page, using deep:true to get children
|
|
418
|
-
let canvasOverlayHTML;
|
|
419
|
-
const mapOverlayHTML = map.ol.getOverlayContainerStopEvent();
|
|
420
|
-
// Remove the UI buttons from the nodes
|
|
421
|
-
const OverlayHTMLButtons = mapOverlayHTML.getElementsByTagName('button');
|
|
422
|
-
const OverlayHTMLButtonsarr = Array.from(OverlayHTMLButtons);
|
|
423
|
-
for (const OverlayHTMLButton of OverlayHTMLButtonsarr) {
|
|
424
|
-
OverlayHTMLButton.setAttribute('data-html2canvas-ignore', 'true');
|
|
425
|
-
}
|
|
426
|
-
// Find attributions by class and delete
|
|
427
|
-
// the collapsed class to open attribution Copyright
|
|
428
|
-
const element = mapOverlayHTML.querySelector('.ol-attribution');
|
|
429
|
-
const olCollapsed = element.classList.contains('ol-collapsed');
|
|
430
|
-
if (olCollapsed) {
|
|
431
|
-
element.classList.remove('ol-collapsed');
|
|
432
|
-
}
|
|
433
|
-
// Change the styles of hyperlink in the printed version
|
|
434
|
-
// Transform the Overlay into a canvas
|
|
435
|
-
// scale is necessary to make it in google chrome
|
|
436
|
-
// background as null because otherwise it is white and cover the map
|
|
437
|
-
// allowtaint is to allow rendering images in the attributions
|
|
438
|
-
// useCORS: true pour permettre de renderer les images (ne marche pas en local)
|
|
439
|
-
const canvas = await html2canvas(mapOverlayHTML, {
|
|
440
|
-
scale: 1,
|
|
441
|
-
backgroundColor: null,
|
|
442
|
-
allowTaint: true,
|
|
443
|
-
useCORS: true,
|
|
444
|
-
}).then(e => {
|
|
445
|
-
canvasOverlayHTML = e;
|
|
446
|
-
});
|
|
447
|
-
this.addCanvas(doc, canvasOverlayHTML, margins); // this adds scales and attributions
|
|
448
|
-
if (olCollapsed) {
|
|
449
|
-
element.classList.add('ol-collapsed');
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
/**
|
|
453
|
-
* Add Copyrigh to the map canvas
|
|
454
|
-
* @param map - Map of the app
|
|
455
|
-
* @param canvas Canvas of the map
|
|
456
|
-
*/
|
|
457
|
-
async addCopyrightToImage(map, canvas) {
|
|
458
|
-
const context = canvas.getContext('2d');
|
|
459
|
-
let canvasOverlayHTML;
|
|
460
|
-
const mapOverlayHTML = map.ol.getOverlayContainerStopEvent();
|
|
461
|
-
// Remove the UI buttons from the nodes
|
|
462
|
-
const OverlayHTMLButtons = mapOverlayHTML.getElementsByTagName('button');
|
|
463
|
-
const OverlayHTMLButtonsarr = Array.from(OverlayHTMLButtons);
|
|
464
|
-
for (const OverlayHTMLButton of OverlayHTMLButtonsarr) {
|
|
465
|
-
OverlayHTMLButton.setAttribute('data-html2canvas-ignore', 'true');
|
|
466
|
-
}
|
|
467
|
-
// Find attributions by class and delete
|
|
468
|
-
// the collapsed class to open attribution Copyright
|
|
469
|
-
const element = mapOverlayHTML.querySelector('.ol-attribution');
|
|
470
|
-
const olCollapsed = element.classList.contains('ol-collapsed');
|
|
471
|
-
if (olCollapsed) {
|
|
472
|
-
element.classList.remove('ol-collapsed');
|
|
473
|
-
}
|
|
474
|
-
await html2canvas(mapOverlayHTML, {
|
|
475
|
-
scale: 1,
|
|
476
|
-
backgroundColor: null,
|
|
477
|
-
allowTaint: true,
|
|
478
|
-
useCORS: true,
|
|
479
|
-
}).then(e => {
|
|
480
|
-
canvasOverlayHTML = e;
|
|
481
|
-
});
|
|
482
|
-
context.drawImage(canvasOverlayHTML, 0, 0);
|
|
483
|
-
if (olCollapsed) {
|
|
484
|
-
element.classList.add('ol-collapsed');
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
defineNbFileToProcess(nbFileToProcess) {
|
|
488
|
-
this.nbFileToProcess = nbFileToProcess;
|
|
489
|
-
}
|
|
490
|
-
timeout(ms) {
|
|
491
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
492
|
-
}
|
|
493
|
-
addCanvas(doc, canvas, margins) {
|
|
494
|
-
let image;
|
|
495
|
-
if (canvas) {
|
|
496
|
-
image = canvas.toDataURL('image/png');
|
|
497
|
-
}
|
|
498
|
-
if (image !== undefined) {
|
|
499
|
-
if (image.length < 20) { // img is corrupt todo: fix addScale in mobile make a corrupt img
|
|
500
|
-
console.log('Warning: An image cannot be print in pdf file');
|
|
501
|
-
return;
|
|
502
|
-
}
|
|
503
|
-
const imageSize = this.getImageSizeToFitPdf(doc, canvas, margins);
|
|
504
|
-
doc.addImage(image, 'PNG', margins[3], margins[0], imageSize[0], imageSize[1]);
|
|
505
|
-
doc.rect(margins[3], margins[0], imageSize[0], imageSize[1]);
|
|
506
|
-
this.imgSizeAdded = imageSize; // keep img size for georef later
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
// TODO fix printing with image resolution
|
|
510
|
-
addMap(doc, map, resolution, size, margins) {
|
|
511
|
-
const status$ = new Subject();
|
|
512
|
-
const mapSize = map.ol.getSize();
|
|
513
|
-
const extent = map.ol.getView().calculateExtent(mapSize);
|
|
514
|
-
const widthPixels = Math.round((size[0] * resolution) / 25.4);
|
|
515
|
-
const heightPixels = Math.round((size[1] * resolution) / 25.4);
|
|
516
|
-
let timeout;
|
|
517
|
-
map.ol.once('rendercomplete', (event) => {
|
|
518
|
-
const canvases = event.target.getViewport().getElementsByTagName('canvas');
|
|
519
|
-
const mapStatus$$ = map.status$.subscribe((mapStatus) => {
|
|
520
|
-
clearTimeout(timeout);
|
|
521
|
-
if (mapStatus !== SubjectStatus.Done) {
|
|
522
|
-
return;
|
|
523
|
-
}
|
|
524
|
-
mapStatus$$.unsubscribe();
|
|
525
|
-
let status = SubjectStatus.Done;
|
|
526
|
-
try {
|
|
527
|
-
for (const canvas of canvases) {
|
|
528
|
-
if (canvas.width !== 0) {
|
|
529
|
-
this.addCanvas(doc, canvas, margins);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
catch (err) {
|
|
534
|
-
status = SubjectStatus.Error;
|
|
535
|
-
this.messageService.error('igo.geo.printForm.corsErrorMessageBody', 'igo.geo.printForm.corsErrorMessageHeader');
|
|
536
|
-
}
|
|
537
|
-
this.renderMap(map, mapSize, extent);
|
|
538
|
-
status$.next(status);
|
|
539
|
-
});
|
|
540
|
-
// If no loading as started after 200ms, then probably no loading
|
|
541
|
-
// is required.
|
|
542
|
-
timeout = window.setTimeout(() => {
|
|
543
|
-
mapStatus$$.unsubscribe();
|
|
544
|
-
let status = SubjectStatus.Done;
|
|
545
|
-
try {
|
|
546
|
-
for (const canvas of canvases) {
|
|
547
|
-
if (canvas.width !== 0) {
|
|
548
|
-
this.addCanvas(doc, canvas, margins);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
catch (err) {
|
|
553
|
-
status = SubjectStatus.Error;
|
|
554
|
-
this.messageService.error('igo.geo.printForm.corsErrorMessageBody', 'igo.geo.printForm.corsErrorMessageHeader');
|
|
555
|
-
}
|
|
556
|
-
this.renderMap(map, mapSize, extent);
|
|
557
|
-
status$.next(status);
|
|
558
|
-
}, 200);
|
|
559
|
-
});
|
|
560
|
-
this.renderMap(map, [widthPixels, heightPixels], extent);
|
|
561
|
-
return status$;
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* Download an image of the map with addition of informations
|
|
565
|
-
* @param map - Map of the app
|
|
566
|
-
* @param format - Image format. default value to "png"
|
|
567
|
-
* @param projection - Indicate if projection need to be add. Default to false
|
|
568
|
-
* @param scale - Indicate if scale need to be add. Default to false
|
|
569
|
-
* @param legend - Indicate if the legend of layers need to be download. Default to false
|
|
570
|
-
* @param title - Title to add for the map - Default to blank
|
|
571
|
-
* @param subtitle - Subtitle to add for the map - Default to blank
|
|
572
|
-
* @param comment - Comment to add for the map - Default to blank
|
|
573
|
-
* @param doZipFile - Indicate if we do a zip with the file
|
|
574
|
-
* @return Image file of the map with extension format given as parameter
|
|
575
|
-
*/
|
|
576
|
-
downloadMapImage(map, resolution, format = 'png', projection = false, scale = false, title = '', subtitle = '', comment = '', doZipFile = true, legendPosition) {
|
|
577
|
-
const status$ = new Subject();
|
|
578
|
-
// const resolution = map.ol.getView().getResolution();
|
|
579
|
-
this.activityId = this.activityService.register();
|
|
580
|
-
const translate = this.languageService.translate;
|
|
581
|
-
map.ol.once('rendercomplete', async (event) => {
|
|
582
|
-
format = format.toLowerCase();
|
|
583
|
-
const oldCanvas = event.target
|
|
584
|
-
.getViewport()
|
|
585
|
-
.getElementsByTagName('canvas')[0];
|
|
586
|
-
const newCanvas = document.createElement('canvas');
|
|
587
|
-
const newContext = newCanvas.getContext('2d');
|
|
588
|
-
// Postion in height to set the canvas in new canvas
|
|
589
|
-
let positionHCanvas = 0;
|
|
590
|
-
// Get height/width of map canvas
|
|
591
|
-
const width = oldCanvas.width;
|
|
592
|
-
let height = oldCanvas.height;
|
|
593
|
-
// Set Font to calculate comment width
|
|
594
|
-
newContext.font = '20px Calibri';
|
|
595
|
-
const commentWidth = newContext.measureText(comment).width;
|
|
596
|
-
// Add height for title if defined
|
|
597
|
-
height = title !== '' ? height + 30 : height;
|
|
598
|
-
// Add height for title if defined
|
|
599
|
-
height = subtitle !== '' ? height + 30 : height;
|
|
600
|
-
// Add height for projection or scale (same line) if defined
|
|
601
|
-
height = projection !== false || scale !== false ? height + 30 : height;
|
|
602
|
-
const positionHProjScale = height - 10;
|
|
603
|
-
// Define number of line depending of the comment length
|
|
604
|
-
const commentNbLine = Math.ceil(commentWidth / width);
|
|
605
|
-
// Add height for multiline comment if defined
|
|
606
|
-
height = comment !== '' ? height + commentNbLine * 30 : height;
|
|
607
|
-
let positionHComment = height - commentNbLine * 20 + 5;
|
|
608
|
-
// Set the new canvas with the new calculated size
|
|
609
|
-
newCanvas.width = width;
|
|
610
|
-
newCanvas.height = height;
|
|
611
|
-
if (['bmp', 'gif', 'jpeg', 'png', 'tiff'].indexOf(format) > -1) {
|
|
612
|
-
// Patch Jpeg default black background to white
|
|
613
|
-
if (format === 'jpeg') {
|
|
614
|
-
newContext.fillStyle = '#ffffff';
|
|
615
|
-
newContext.fillRect(0, 0, width, height);
|
|
616
|
-
newContext.fillStyle = '#000000';
|
|
617
|
-
}
|
|
618
|
-
else if (title !== '' || subtitle !== '' || comment !== '' ||
|
|
619
|
-
projection !== false || scale !== false) {
|
|
620
|
-
newContext.fillStyle = '#ffffff';
|
|
621
|
-
newContext.fillRect(0, 0, width, height);
|
|
622
|
-
newContext.fillStyle = '#000000';
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
// If a title need to be added to canvas
|
|
626
|
-
if (title !== '') {
|
|
627
|
-
// Set font for title
|
|
628
|
-
// Adjust according to title length
|
|
629
|
-
newContext.font = '26px Calibri';
|
|
630
|
-
positionHCanvas = 30;
|
|
631
|
-
newContext.textAlign = 'center';
|
|
632
|
-
newContext.fillText(title, width / 2, 20, width * 0.9);
|
|
633
|
-
}
|
|
634
|
-
if (subtitle !== '') {
|
|
635
|
-
// Set font for subtitle
|
|
636
|
-
// Adjust according to title length
|
|
637
|
-
newContext.font = '26px Calibri';
|
|
638
|
-
positionHCanvas = 60;
|
|
639
|
-
newContext.textAlign = 'center';
|
|
640
|
-
newContext.fillText(subtitle, width / 2, 50, width * 0.9);
|
|
641
|
-
}
|
|
642
|
-
// Set font for next section
|
|
643
|
-
newContext.font = '20px Calibri';
|
|
644
|
-
// If projection or/end scale need to be added to canvas
|
|
645
|
-
if ((projection !== false) || (scale !== false)) {
|
|
646
|
-
let projectionScaleText = '';
|
|
647
|
-
if (projection !== false) {
|
|
648
|
-
const projText = translate.instant('igo.geo.printForm.projection');
|
|
649
|
-
projectionScaleText = projText + ': ' + map.projection + ' ';
|
|
650
|
-
}
|
|
651
|
-
if (scale !== false) {
|
|
652
|
-
const scaleText = translate.instant('igo.geo.printForm.scale');
|
|
653
|
-
const mapScale = map.viewController.getScale(resolution);
|
|
654
|
-
projectionScaleText += scaleText + ': ~ 1 / ' + formatScale(mapScale);
|
|
655
|
-
}
|
|
656
|
-
newContext.textAlign = 'center';
|
|
657
|
-
newContext.fillText(projectionScaleText, width / 2, positionHProjScale, width * 0.9);
|
|
658
|
-
}
|
|
659
|
-
// If a comment need to be added to canvas
|
|
660
|
-
if (comment !== '') {
|
|
661
|
-
newContext.textAlign = 'center';
|
|
662
|
-
// If only one line, no need to multiline the comment
|
|
663
|
-
if (commentNbLine === 1) {
|
|
664
|
-
newContext.fillText(comment, width / 2, positionHComment);
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
// Separate the setenses to be approx. the same length
|
|
668
|
-
const nbCommentChar = comment.length;
|
|
669
|
-
const CommentLengthToCut = Math.floor(nbCommentChar / commentNbLine);
|
|
670
|
-
let commentCurrentLine = '';
|
|
671
|
-
let positionFirstCutChar = 0;
|
|
672
|
-
let positionLastBlank;
|
|
673
|
-
// Loop for the number of line calculated
|
|
674
|
-
for (let i = 0; i < commentNbLine; i++) {
|
|
675
|
-
// For all line except last
|
|
676
|
-
if (commentNbLine - 1 > i) {
|
|
677
|
-
// Get comment current line to find the right place tu cut comment
|
|
678
|
-
commentCurrentLine = comment.substr(positionFirstCutChar, CommentLengthToCut);
|
|
679
|
-
// Cut the setence at blank
|
|
680
|
-
positionLastBlank = commentCurrentLine.lastIndexOf(' ');
|
|
681
|
-
newContext.fillText(commentCurrentLine.substr(0, positionLastBlank), width / 2, positionHComment);
|
|
682
|
-
positionFirstCutChar += positionLastBlank;
|
|
683
|
-
// Go to next line for insertion
|
|
684
|
-
positionHComment += 20;
|
|
685
|
-
}
|
|
686
|
-
else {
|
|
687
|
-
// Don't cut last part
|
|
688
|
-
newContext.fillText(comment.substr(positionFirstCutChar), width / 2, positionHComment);
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
// Add map to new canvas
|
|
694
|
-
newContext.drawImage(oldCanvas, 0, positionHCanvas);
|
|
695
|
-
// Add copyrigh
|
|
696
|
-
await this.addCopyrightToImage(map, newCanvas);
|
|
697
|
-
// Check the legendPosition
|
|
698
|
-
if (legendPosition !== 'none') {
|
|
699
|
-
if (['topleft', 'topright', 'bottomleft', 'bottomright'].indexOf(legendPosition) > -1) {
|
|
700
|
-
await this.addLegendToImage(newCanvas, map, resolution, legendPosition, format);
|
|
701
|
-
}
|
|
702
|
-
else if (legendPosition === 'newpage') {
|
|
703
|
-
await this.getLayersLegendImage(map, format, doZipFile, resolution);
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
let status = SubjectStatus.Done;
|
|
707
|
-
let fileNameWithExt = 'map.' + format;
|
|
708
|
-
if (format.toLowerCase() === 'tiff') {
|
|
709
|
-
fileNameWithExt = 'map' + map.projection.replace(':', '_') + '.' + format;
|
|
710
|
-
}
|
|
711
|
-
try {
|
|
712
|
-
// Save the canvas as file
|
|
713
|
-
if (!doZipFile) {
|
|
714
|
-
this.saveCanvasImageAsFile(newCanvas, fileNameWithExt, format);
|
|
715
|
-
}
|
|
716
|
-
else if (format.toLowerCase() === 'tiff') {
|
|
717
|
-
// Add the canvas to zip
|
|
718
|
-
this.generateCanvaFileToZip(newCanvas, fileNameWithExt);
|
|
719
|
-
}
|
|
720
|
-
else {
|
|
721
|
-
// Add the canvas to zip
|
|
722
|
-
this.generateCanvaFileToZip(newCanvas, fileNameWithExt);
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
catch (err) {
|
|
726
|
-
status = SubjectStatus.Error;
|
|
727
|
-
}
|
|
728
|
-
status$.next(status);
|
|
729
|
-
if (format.toLowerCase() === 'tiff') {
|
|
730
|
-
const tfwFileNameWithExt = fileNameWithExt.substring(0, fileNameWithExt.toLowerCase().indexOf('.tiff')) + '.tfw';
|
|
731
|
-
const tiwContent = this.getWorldFileInformation(map);
|
|
732
|
-
const blob = new Blob([tiwContent], {
|
|
733
|
-
type: 'text/plain;charset=utf-8'
|
|
734
|
-
});
|
|
735
|
-
if (!doZipFile) {
|
|
736
|
-
// saveAs automaticly replace ':' for '_'
|
|
737
|
-
saveAs(blob, tfwFileNameWithExt);
|
|
738
|
-
this.saveFileProcessing();
|
|
739
|
-
}
|
|
740
|
-
else {
|
|
741
|
-
// Add the canvas to zip
|
|
742
|
-
this.addFileToZip(tfwFileNameWithExt, blob);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
});
|
|
746
|
-
map.ol.renderSync();
|
|
747
|
-
return status$;
|
|
748
|
-
}
|
|
749
|
-
/**
|
|
750
|
-
* Create and Add Legend to the map canvas
|
|
751
|
-
* @param canvas Canvas of the map
|
|
752
|
-
* @param map Map of the app
|
|
753
|
-
* @param resolution Resolution of map
|
|
754
|
-
* @param legendPosition Legend position
|
|
755
|
-
* @param format Image format
|
|
756
|
-
*/
|
|
757
|
-
async addLegendToImage(canvas, map, resolution, legendPosition, format) {
|
|
758
|
-
const fileNameWithExt = 'map.' + format;
|
|
759
|
-
const context = canvas.getContext('2d');
|
|
760
|
-
// Get html code for the legend
|
|
761
|
-
const html = await this.getLayersLegendHtml(map, canvas.width, resolution).toPromise();
|
|
762
|
-
// If no legend, save the map directly
|
|
763
|
-
if (html === '') {
|
|
764
|
-
await this.saveCanvasImageAsFile(canvas, fileNameWithExt, format);
|
|
765
|
-
return true;
|
|
766
|
-
}
|
|
767
|
-
// Create div to contain html code for legend
|
|
768
|
-
const div = window.document.createElement('div');
|
|
769
|
-
div.style.position = 'absolute';
|
|
770
|
-
div.style.top = '0';
|
|
771
|
-
// Add html code to convert in the new window
|
|
772
|
-
window.document.body.appendChild(div);
|
|
773
|
-
div.innerHTML = html;
|
|
774
|
-
await this.timeout(1);
|
|
775
|
-
const canvasLegend = await html2canvas(div, { useCORS: true }).catch((e) => {
|
|
776
|
-
console.log(e);
|
|
777
|
-
});
|
|
778
|
-
if (canvasLegend) {
|
|
779
|
-
const canvasHeight = canvas.height;
|
|
780
|
-
const canvasWidth = canvas.width;
|
|
781
|
-
const legendHeight = canvasLegend.height;
|
|
782
|
-
const legendWidth = canvasLegend.width;
|
|
783
|
-
// Move the legend to the correct position on the page
|
|
784
|
-
const offset = canvasHeight * 0.01;
|
|
785
|
-
let legendX;
|
|
786
|
-
let legendY;
|
|
787
|
-
if (legendPosition === 'bottomright') {
|
|
788
|
-
legendX = canvasWidth - legendWidth - offset;
|
|
789
|
-
legendY = canvasHeight - legendHeight - offset;
|
|
790
|
-
}
|
|
791
|
-
else if (legendPosition === 'topright') {
|
|
792
|
-
legendX = canvasWidth - legendWidth - offset;
|
|
793
|
-
legendY = offset;
|
|
794
|
-
}
|
|
795
|
-
else if (legendPosition === 'bottomleft') {
|
|
796
|
-
legendX = offset;
|
|
797
|
-
legendY = canvasHeight - legendHeight - offset - 15;
|
|
798
|
-
}
|
|
799
|
-
else if (legendPosition === 'topleft') {
|
|
800
|
-
legendX = offset;
|
|
801
|
-
legendY = offset;
|
|
802
|
-
}
|
|
803
|
-
context.drawImage(canvasLegend, legendX, legendY, legendWidth, legendHeight);
|
|
804
|
-
context.strokeRect(legendX, legendY, legendWidth, legendHeight);
|
|
805
|
-
div.parentNode.removeChild(div); // remove temp div (IE style)
|
|
806
|
-
return true;
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
renderMap(map, size, extent) {
|
|
810
|
-
map.ol.updateSize();
|
|
811
|
-
map.ol.renderSync();
|
|
812
|
-
}
|
|
813
|
-
/**
|
|
814
|
-
* Save document
|
|
815
|
-
* @param doc - Document to save
|
|
816
|
-
*/
|
|
817
|
-
async saveDoc(doc) {
|
|
818
|
-
await doc.save('map_georef.pdf', { returnPromise: true });
|
|
819
|
-
}
|
|
820
|
-
/**
|
|
821
|
-
* Calculate the best Image size to fit in pdf
|
|
822
|
-
* @param doc - Pdf Document
|
|
823
|
-
* @param canvas - Canvas of image
|
|
824
|
-
* @param margins - Page margins
|
|
825
|
-
*/
|
|
826
|
-
getImageSizeToFitPdf(doc, canvas, margins) {
|
|
827
|
-
// Define variable to calculate best size to fit in one page
|
|
828
|
-
const pageHeight = doc.internal.pageSize.getHeight() - (margins[0] + margins[2] + 10);
|
|
829
|
-
const pageWidth = doc.internal.pageSize.getWidth() - (margins[1] + margins[3]);
|
|
830
|
-
const canHeight = this.pdf_units2points(canvas.height, 'mm');
|
|
831
|
-
const canWidth = this.pdf_units2points(canvas.width, 'mm');
|
|
832
|
-
const heightRatio = canHeight / pageHeight;
|
|
833
|
-
const widthRatio = canWidth / pageWidth;
|
|
834
|
-
const maxRatio = heightRatio > widthRatio ? heightRatio : widthRatio;
|
|
835
|
-
const imgHeigh = maxRatio > 1 ? canHeight / maxRatio : canHeight;
|
|
836
|
-
const imgWidth = maxRatio > 1 ? canWidth / maxRatio : canWidth;
|
|
837
|
-
return [imgWidth, imgHeigh];
|
|
838
|
-
}
|
|
839
|
-
/**
|
|
840
|
-
* Get a world file information for tiff
|
|
841
|
-
* @param map - Map of the app
|
|
842
|
-
*/
|
|
843
|
-
getWorldFileInformation(map) {
|
|
844
|
-
const currentResolution = map.viewController.getResolution();
|
|
845
|
-
const currentExtent = map.viewController.getExtent(); // Return [minx, miny, maxx, maxy]
|
|
846
|
-
return [
|
|
847
|
-
currentResolution,
|
|
848
|
-
0,
|
|
849
|
-
0,
|
|
850
|
-
-currentResolution,
|
|
851
|
-
currentExtent[0] + currentResolution / 0.5,
|
|
852
|
-
currentExtent[3] - currentResolution / 0.5
|
|
853
|
-
].join('\n');
|
|
854
|
-
}
|
|
855
|
-
/**
|
|
856
|
-
* Save canvas image as file
|
|
857
|
-
* @param canvas - Canvas to save
|
|
858
|
-
* @param name - Name of the file
|
|
859
|
-
* @param format - file format
|
|
860
|
-
*/
|
|
861
|
-
saveCanvasImageAsFile(canvas, nameWithExt, format) {
|
|
862
|
-
const blobFormat = 'image/' + format;
|
|
863
|
-
const that = this;
|
|
864
|
-
try {
|
|
865
|
-
canvas.toDataURL(); // Just to make the catch trigger wihtout toBlob Error throw not catched
|
|
866
|
-
canvas.toBlob((blob) => {
|
|
867
|
-
// download image
|
|
868
|
-
saveAs(blob, nameWithExt);
|
|
869
|
-
that.saveFileProcessing();
|
|
870
|
-
}, blobFormat);
|
|
871
|
-
}
|
|
872
|
-
catch (err) {
|
|
873
|
-
this.messageService.error('igo.geo.printForm.corsErrorMessageBody', 'igo.geo.printForm.corsErrorMessageHeader');
|
|
874
|
-
}
|
|
875
|
-
}
|
|
876
|
-
/**
|
|
877
|
-
* Add file to a zip
|
|
878
|
-
* @param canvas - File to add to the zip
|
|
879
|
-
* @param name -Name of the fileoverview
|
|
880
|
-
*/
|
|
881
|
-
generateCanvaFileToZip(canvas, name) {
|
|
882
|
-
const blobFormat = 'image/' + 'jpeg';
|
|
883
|
-
const that = this;
|
|
884
|
-
if (!this.hasOwnProperty('zipFile') ||
|
|
885
|
-
typeof this.zipFile === 'undefined') {
|
|
886
|
-
this.zipFile = new JSZip();
|
|
887
|
-
}
|
|
888
|
-
try {
|
|
889
|
-
canvas.toDataURL(); // Just to make the catch trigger wihtout toBlob Error throw not catched
|
|
890
|
-
if (navigator.msSaveBlob) {
|
|
891
|
-
this.addFileToZip(name, canvas.msToBlob());
|
|
892
|
-
}
|
|
893
|
-
else {
|
|
894
|
-
canvas.toBlob((blob) => {
|
|
895
|
-
that.addFileToZip(name, blob);
|
|
896
|
-
}, blobFormat);
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
catch (err) {
|
|
900
|
-
this.messageService.error('igo.geo.printForm.corsErrorMessageBody', 'igo.geo.printForm.corsErrorMessageHeader');
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
/**
|
|
904
|
-
* Add file to zip, if all file are zipped, download
|
|
905
|
-
* @param name - Name of the files
|
|
906
|
-
* @param blob - Contain of file
|
|
907
|
-
*/
|
|
908
|
-
addFileToZip(name, blob) {
|
|
909
|
-
// add file to zip
|
|
910
|
-
this.zipFile.file(name, blob);
|
|
911
|
-
this.nbFileToProcess--;
|
|
912
|
-
// If all files are proccessed
|
|
913
|
-
if (this.nbFileToProcess === 0) {
|
|
914
|
-
// Download zip file
|
|
915
|
-
this.getZipFile();
|
|
916
|
-
// Stop loading
|
|
917
|
-
this.activityService.unregister(this.activityId);
|
|
918
|
-
}
|
|
919
|
-
}
|
|
920
|
-
saveFileProcessing() {
|
|
921
|
-
this.nbFileToProcess--;
|
|
922
|
-
// If all files are proccessed
|
|
923
|
-
if (this.nbFileToProcess === 0) {
|
|
924
|
-
// Stop loading
|
|
925
|
-
this.activityService.unregister(this.activityId);
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
/**
|
|
929
|
-
* Get the zipped file
|
|
930
|
-
* @return Retun a zip file
|
|
931
|
-
*/
|
|
932
|
-
getZipFile() {
|
|
933
|
-
const that = this;
|
|
934
|
-
this.zipFile.generateAsync({ type: 'blob' }).then((blob) => {
|
|
935
|
-
// 1) generate the zip file
|
|
936
|
-
saveAs(blob, 'map.zip');
|
|
937
|
-
delete that.zipFile;
|
|
938
|
-
});
|
|
939
|
-
}
|
|
940
|
-
pdf_units2points(n, unit) {
|
|
941
|
-
let k = 1;
|
|
942
|
-
// this code is borrowed from jsPDF
|
|
943
|
-
// as it does not expose a public API
|
|
944
|
-
// for converting units to points.
|
|
945
|
-
switch (unit) {
|
|
946
|
-
case 'pt':
|
|
947
|
-
k = 1;
|
|
948
|
-
break;
|
|
949
|
-
case 'mm':
|
|
950
|
-
k = 72 / 25.4;
|
|
951
|
-
break;
|
|
952
|
-
case 'cm':
|
|
953
|
-
k = 72 / 2.54;
|
|
954
|
-
break;
|
|
955
|
-
case 'in':
|
|
956
|
-
k = 72;
|
|
957
|
-
break;
|
|
958
|
-
case 'px':
|
|
959
|
-
k = 96 / 72;
|
|
960
|
-
break;
|
|
961
|
-
case 'pc':
|
|
962
|
-
k = 12;
|
|
963
|
-
break;
|
|
964
|
-
case 'em':
|
|
965
|
-
k = 12;
|
|
966
|
-
break;
|
|
967
|
-
case 'ex':
|
|
968
|
-
k = 6;
|
|
969
|
-
break;
|
|
970
|
-
default:
|
|
971
|
-
throw new Error('Invalid unit: ' + unit);
|
|
972
|
-
}
|
|
973
|
-
return n * k;
|
|
974
|
-
}
|
|
975
|
-
}
|
|
976
|
-
PrintService.ɵfac = function PrintService_Factory(t) { return new (t || PrintService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.MessageService), i0.ɵɵinject(i2.ActivityService), i0.ɵɵinject(i2.LanguageService), i0.ɵɵinject(i2.ConfigService)); };
|
|
977
|
-
PrintService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PrintService, factory: PrintService.ɵfac, providedIn: 'root' });
|
|
978
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrintService, [{
|
|
979
|
-
type: Injectable,
|
|
980
|
-
args: [{
|
|
981
|
-
providedIn: 'root'
|
|
982
|
-
}]
|
|
983
|
-
}], function () { return [{ type: i1.HttpClient }, { type: i2.MessageService }, { type: i2.ActivityService }, { type: i2.LanguageService }, { type: i2.ConfigService }]; }, null); })();
|
|
984
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxHQUFHLElBQUksS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLElBQUksS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUkvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHbEUsT0FBTyxZQUFZLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQVdoRCxNQUFNLE9BQU8sWUFBWTtJQWdCdkIsWUFDVSxJQUFnQixFQUNoQixjQUE4QixFQUM5QixlQUFnQyxFQUNoQyxlQUFnQyxFQUNoQyxhQUE0QjtRQUo1QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsb0JBQWUsR0FB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LElBQUk7Z0JBQ0wsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDTixNQUFNO1lBQ1Y7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7O3dFQXhyQ1UsWUFBWTtrRUFBWixZQUFZLFdBQVosWUFBWSxtQkFGWCxNQUFNO3VGQUVQLFlBQVk7Y0FIeEIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIGFzIHJ4TWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCBqc1BERiBmcm9tICdqc3BkZic7XHJcbmltcG9ydCBodG1sMmNhbnZhcyBmcm9tICdodG1sMmNhbnZhcyc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgSlNaaXAgfSBmcm9tICdqc3ppcCc7XHJcblxyXG5pbXBvcnQgeyBTdWJqZWN0U3RhdHVzIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xyXG5pbXBvcnQgeyBTZWN1cmVJbWFnZVBpcGUgfSBmcm9tICdAaWdvMi9jb21tb24nO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgQWN0aXZpdHlTZXJ2aWNlLCBMYW5ndWFnZVNlcnZpY2UsIENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlJztcclxuXHJcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwJztcclxuaW1wb3J0IHsgZm9ybWF0U2NhbGUgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcC51dGlscyc7XHJcbmltcG9ydCB7IExlZ2VuZE1hcFZpZXdPcHRpb25zIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy9sYXllci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBnZXRMYXllcnNMZWdlbmRzIH0gZnJvbSAnLi4vLi4vbGF5ZXIvdXRpbHMvb3V0cHV0TGVnZW5kJztcclxuXHJcbmltcG9ydCB7IFByaW50T3B0aW9ucywgVGV4dFBkZlNpemVBbmRNYXJnaW4gfSBmcm9tICcuL3ByaW50LmludGVyZmFjZSc7XHJcbmltcG9ydCBHZW9QZGZQbHVnaW4gZnJvbSAnLi9nZW9wZGYnO1xyXG5pbXBvcnQgeyBQcmludFBhcGVyRm9ybWF0IH0gZnJvbSAnLi9wcmludC50eXBlJztcclxuXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICBpbnRlcmZhY2UgTmF2aWdhdG9yIHtcclxuICAgIG1zU2F2ZUJsb2I/OiAoYmxvYjogYW55LCBkZWZhdWx0TmFtZT86IHN0cmluZykgPT4gYm9vbGVhblxyXG4gIH1cclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJpbnRTZXJ2aWNlIHtcclxuICB6aXBGaWxlOiBKU1ppcDtcclxuICBuYkZpbGVUb1Byb2Nlc3M6IG51bWJlcjtcclxuICBhY3Rpdml0eUlkOiBzdHJpbmc7XHJcbiAgaW1nU2l6ZUFkZGVkOiBBcnJheTxudW1iZXI+O1xyXG5cclxuICBURVhUUERGRk9OVCA9IHtcclxuICAgIHRpdGxlRm9udDogJ1RpbWVzJyxcclxuICAgIHRpdGxlRm9udFN0eWxlOiAnYm9sZCcsXHJcbiAgICBzdWJ0aXRsZUZvbnQ6ICdUaW1lcycsXHJcbiAgICBzdWJ0aXRsZUZvbnRTdHlsZTogJ2JvbGQnLFxyXG4gICAgY29tbWVudEZvbnQ6ICdjb3VyaWVyJyxcclxuICAgIGNvbW1lbnRGb250U3R5bGU6ICdub3JtYWwnLFxyXG4gICAgY29tbWVudEZvbnRTaXplOiAxMlxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFjdGl2aXR5U2VydmljZTogQWN0aXZpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgcHJpbnQobWFwOiBJZ29NYXAsIG9wdGlvbnM6IFByaW50T3B0aW9ucyk6IFN1YmplY3Q8YW55PiB7XHJcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcclxuICAgIGNvbnN0IHBhcGVyRm9ybWF0OiBzdHJpbmcgPSBvcHRpb25zLnBhcGVyRm9ybWF0O1xyXG4gICAgY29uc3QgcmVzb2x1dGlvbiA9ICtvcHRpb25zLnJlc29sdXRpb247IC8vIERlZmF1bHQgaXMgOTZcclxuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gb3B0aW9ucy5vcmllbnRhdGlvbjtcclxuICAgIGNvbnN0IGxlZ2VuZFBvc3Rpb24gPSBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uO1xyXG4gICAgdGhpcy5hY3Rpdml0eUlkID0gdGhpcy5hY3Rpdml0eVNlcnZpY2UucmVnaXN0ZXIoKTtcclxuXHJcbiAgICBHZW9QZGZQbHVnaW4oanNQREYuQVBJKTtcclxuXHJcbiAgICBjb25zdCBkb2MgPSBuZXcganNQREYoe1xyXG4gICAgICBvcmllbnRhdGlvbixcclxuICAgICAgZm9ybWF0OiBwYXBlckZvcm1hdC50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICB1bml0OiAnbW0nIC8vIGRlZmF1bHRcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBbXHJcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCxcclxuICAgICAgZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodFxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCBtYXJnaW5zID0gWzEwLCAxMCwgMTAsIDEwXTtcclxuICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9uc1swXSAtIG1hcmdpbnNbM10gLSBtYXJnaW5zWzFdO1xyXG4gICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXSAtIG1hcmdpbnNbMF0gLSBtYXJnaW5zWzJdO1xyXG4gICAgY29uc3Qgc2l6ZSA9IFt3aWR0aCwgaGVpZ2h0XTtcclxuICAgIGxldCB0aXRsZVNpemVzOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbjtcclxuICAgIGxldCBzdWJ0aXRsZVNpemVzOiBUZXh0UGRmU2l6ZUFuZE1hcmdpbjtcclxuXHJcbiAgICAvLyBpZiBwYXBlciBmb3JtYXQgQTEgb3IgQTAgYWRkIG1hcmdpbiB0b3BcclxuICAgIGlmICgob3B0aW9ucy50aXRsZSAhPT0gJycgfHwgb3B0aW9ucy5zdWJ0aXRsZSkgJiZcclxuICAgICAgKHBhcGVyRm9ybWF0ID09PSBQcmludFBhcGVyRm9ybWF0LkExIHx8IHBhcGVyRm9ybWF0ID09PSBQcmludFBhcGVyRm9ybWF0LkEwKSkge1xyXG4gICAgICBtYXJnaW5zWzBdICs9IDEwO1xyXG4gICAgfVxyXG4gICAgLy8gUERGIHRpdGxlXHJcbiAgICBjb25zdCBmb250U2l6ZUluUHQgPSBNYXRoLnJvdW5kKDIgKiAoaGVpZ2h0ICsgMTQ1KSAqIDAuMDUpIC8gMjsgLy9jYWxjdWxhdGUgdGhlIGZvbnRTaXplIHRpdGxlIGZyb20gdGhlIHBhZ2UgaGVpZ2h0LlxyXG4gICAgaWYgKG9wdGlvbnMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnRpdGxlICE9PSAnJykge1xyXG4gICAgICB0aXRsZVNpemVzID0gdGhpcy5nZXRUZXh0UGRmT2JqZWN0U2l6ZUFuZE1hcmcob3B0aW9ucy50aXRsZSxcclxuICAgICAgICBtYXJnaW5zLFxyXG4gICAgICAgIHRoaXMuVEVYVFBERkZPTlQudGl0bGVGb250LFxyXG4gICAgICAgIGZvbnRTaXplSW5QdCxcclxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxyXG4gICAgICAgIGRvYyk7XHJcblxyXG4gICAgICB0aGlzLmFkZFRleHRJblBkZkRvYyhkb2MsXHJcbiAgICAgICAgb3B0aW9ucy50aXRsZSxcclxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udCxcclxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnRpdGxlRm9udFN0eWxlLFxyXG4gICAgICAgIHRpdGxlU2l6ZXMuZm9udFNpemUsXHJcbiAgICAgICAgdGl0bGVTaXplcy5tYXJnaW5MZWZ0ICsgbWFyZ2luc1szXSxcclxuICAgICAgICBtYXJnaW5zWzBdKTtcclxuXHJcbiAgICAgIG1hcmdpbnNbMF0gPSB0aXRsZVNpemVzLmhlaWdodCArIG1hcmdpbnNbMF07IC8vIGN1bXVsYXRpdmUgbWFyZ2luIHRvcCBmb3IgbmV4dCBlbGVtIHRvIHBsYWNlIGluIHBkZiBkb2NcclxuICAgIH1cclxuXHJcbiAgICAvLyBQREYgc3VidGl0bGVcclxuICAgIGlmIChvcHRpb25zLnN1YnRpdGxlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zdWJ0aXRsZSAhPT0gJycpIHtcclxuICAgICAgc3VidGl0bGVTaXplcyA9IHRoaXMuZ2V0VGV4dFBkZk9iamVjdFNpemVBbmRNYXJnKG9wdGlvbnMuc3VidGl0bGUsXHJcbiAgICAgICAgbWFyZ2lucyxcclxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udCxcclxuICAgICAgICAob3B0aW9ucy50aXRsZSAhPT0gJycpID8gdGl0bGVTaXplcy5mb250U2l6ZSAqIDAuNyA6IGZvbnRTaXplSW5QdCAqIDAuNywgLy8gNzAlIHNpemUgb2YgdGl0bGVcclxuICAgICAgICB0aGlzLlRFWFRQREZGT05ULnN1YnRpdGxlRm9udFN0eWxlLFxyXG4gICAgICAgIGRvYyk7XHJcblxyXG4gICAgICAgdGhpcy5hZGRUZXh0SW5QZGZEb2MoZG9jLFxyXG4gICAgICAgIG9wdGlvbnMuc3VidGl0bGUsXHJcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC5zdWJ0aXRsZUZvbnQsXHJcbiAgICAgICAgdGhpcy5URVhUUERGRk9OVC5zdWJ0aXRsZUZvbnRTdHlsZSxcclxuICAgICAgICBzdWJ0aXRsZVNpemVzLmZvbnRTaXplLFxyXG4gICAgICAgIHN1YnRpdGxlU2l6ZXMubWFyZ2luTGVmdCArIG1hcmdpbnNbM10sXHJcbiAgICAgICAgbWFyZ2luc1swXVxyXG4gICAgICApO1xyXG5cclxuICAgICAgbWFyZ2luc1swXSArPSA1OyAvLyBjdW11bGF0aXZlIG1hcmcgdG9wIGZvciBuZXh0IGVsZW0gdG8gcGxhY2UgaW4gcGRmIGRvYy4gNSBpcyBhIGZpeCBpdCBjb3VsZCBiZSBhZGp1c3RcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucy5zaG93UHJvamVjdGlvbiA9PT0gdHJ1ZSB8fCBvcHRpb25zLnNob3dTY2FsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmFkZFByb2pTY2FsZShcclxuICAgICAgICBkb2MsXHJcbiAgICAgICAgbWFwLFxyXG4gICAgICAgIHJlc29sdXRpb24sXHJcbiAgICAgICAgb3B0aW9ucy5zaG93UHJvamVjdGlvbixcclxuICAgICAgICBvcHRpb25zLnNob3dTY2FsZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5jb21tZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5jb21tZW50ICE9PSAnJykge1xyXG4gICAgICB0aGlzLmFkZENvbW1lbnQoZG9jLCBvcHRpb25zLmNvbW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWRkTWFwKGRvYywgbWFwLCByZXNvbHV0aW9uLCBzaXplLCBtYXJnaW5zKS5zdWJzY3JpYmUoXHJcbiAgICAgIGFzeW5jIChzdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcclxuICAgICAgICBpZiAoc3RhdHVzID09PSBTdWJqZWN0U3RhdHVzLkRvbmUpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuYWRkU2NhbGUoZG9jLCBtYXAsIG1hcmdpbnMpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNZWFzdXJlTGF5ZXIoZG9jLCBtYXAsIG1hcmdpbnMpO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pbWdTaXplQWRkZWRbMF07XHJcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmltZ1NpemVBZGRlZFsxXTtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IDE7XHJcbiAgICAgICAgICB0aGlzLmFkZEdlb1JlZihkb2MsIG1hcCwgd2lkdGgsIGhlaWdodCwgcmVzLCBtYXJnaW5zKTtcclxuXHJcbiAgICAgICAgICBpZiAob3B0aW9ucy5sZWdlbmRQb3NpdGlvbiAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGlmIChbJ3RvcGxlZnQnLCAndG9wcmlnaHQnLCAnYm90dG9tbGVmdCcsICdib3R0b21yaWdodCddLmluZGV4T2Yob3B0aW9ucy5sZWdlbmRQb3NpdGlvbikgPiAtMSApIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZExlZ2VuZFNhbWVQYWdlKGRvYywgbWFwLCBtYXJnaW5zLCByZXNvbHV0aW9uLCBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmxlZ2VuZFBvc2l0aW9uID09PSAnbmV3cGFnZScpIHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZExlZ2VuZChkb2MsIG1hcCwgbWFyZ2lucywgcmVzb2x1dGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5Eb25lIHx8IHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5FcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xyXG4gICAgICAgICAgc3RhdHVzJC5uZXh0KFN1YmplY3RTdGF0dXMuRG9uZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBzdGF0dXMkO1xyXG4gIH1cclxuICAvLyByZWYgR2VvTW9vc2UgaHR0cHM6Ly9naXRodWIuY29tL2dlb21vb3NlL2dtMy90cmVlL21haW4vc3JjL2dtMy9jb21wb25lbnRzL3ByaW50XHJcbiAgYWRkR2VvUmVmKGRvYywgbWFwLCB3aWR0aCwgaGVpZ2h0LCByZXNvbHV0aW9uLCBtYXJnaW5zKSB7XHJcbiAgICBjb25zdCB1bml0ID0gJ21tJztcclxuICAgIGNvbnN0IGRvY0hlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcclxuXHJcbiAgICAvLyB4LHkgPSBtYXJnaW4gbGVmdC1ib3R0b20gY29ybmVyIGZvciBpbWcgaW4gcGRmIGRvY1xyXG4gICAgY29uc3QgeCA9IG1hcmdpbnNbM107XHJcbiAgICBjb25zdCB5ID0gZG9jSGVpZ2h0IC0gbWFyZ2luc1swXSAtIGhlaWdodDtcclxuXHJcbiAgICBsZXQgcGRmX2V4dGVudHMgPSBbeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0XTtcclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwZGZfZXh0ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBwZGZfZXh0ZW50c1tpXSA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhwZGZfZXh0ZW50c1tpXSwgdW5pdCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWFwRXh0ZW50ID0gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgnRVBTRzozODU3Jyk7XHJcbiAgICBkb2Muc2V0R2VvQXJlYShwZGZfZXh0ZW50cywgbWFwRXh0ZW50KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgbWVhc3VyZSBvdmVybGF5IG9uIHRoZSBtYXAgb24gdGhlIGRvY3VtZW50IHdoZW4gdGhlIG1lYXN1cmUgbGF5ZXIgaXMgcHJlc2VudFxyXG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIG1lYXN1cmUgdG9vbHRpcCB3aWxsIGJlIGFkZGVkXHJcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxyXG4gICAqIEBwYXJhbSAgbWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlTWVhc3VyZUxheWVyKFxyXG4gICAgZG9jOiBqc1BERixcclxuICAgIG1hcDogSWdvTWFwLFxyXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPlxyXG4gICkge1xyXG4gICAgaWYgKG1hcC5sYXllcnMuZmluZChsYXllciA9PiBsYXllci52aXNpYmxlICYmIGxheWVyLmlkLnN0YXJ0c1dpdGgoJ2lnby1tZWFzdXJlcy0nKSkpIHtcclxuICAgICAgbGV0IGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXM7XHJcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xyXG4gICAgICBhd2FpdCBodG1sMmNhbnZhcyhtYXBPdmVybGF5TWVhc3VyZXNIVE1MLCB7XHJcbiAgICAgICAgc2NhbGU6IDEsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsXHJcbiAgICAgIH0pLnRoZW4oZSA9PiB7XHJcbiAgICAgICAgY2FudmFzT3ZlcmxheUhUTUxNZWFzdXJlcyA9IGU7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhc092ZXJsYXlIVE1MTWVhc3VyZXMsIG1hcmdpbnMpOyAvLyB0aGlzIGFkZHMgbWVhc3VyZSBvdmVybGF5c1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGh0bWwgY29kZSBmb3IgYWxsIGxheWVycyBsZWdlbmRcclxuICAgKiBAcGFyYW0gIG1hcCBJZ29NYXBcclxuICAgKiBAcGFyYW0gIHdpZHRoIFRoZSB3aWR0aCB0aGF0IHRoZSBsZWdlbmQgbmVlZCB0byBiZVxyXG4gICAqIEByZXR1cm4gSHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXHJcbiAgICovXHJcbiAgZ2V0TGF5ZXJzTGVnZW5kSHRtbChcclxuICAgIG1hcDogSWdvTWFwLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIHJlc29sdXRpb246IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgIGxldCBodG1sID0gJyc7XHJcbiAgICAgIGNvbnN0IGxlZ2VuZHMgPSBnZXRMYXllcnNMZWdlbmRzKFxyXG4gICAgICAgIG1hcC5sYXllcnMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmVzb2x1dGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKSxcclxuICAgICAgICAgIGV4dGVudDogbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpLFxyXG4gICAgICAgICAgcHJvamVjdGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldE9sUHJvamVjdGlvbigpLmdldENvZGUoKSxcclxuICAgICAgICAgIC8vIHNjYWxlOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbiksXHJcbiAgICAgICAgICBzaXplOiBtYXAub2wuZ2V0U2l6ZSgpXHJcbiAgICAgICAgfSBhcyBMZWdlbmRNYXBWaWV3T3B0aW9uc1xyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGxlZ2VuZHMuZmlsdGVyKGwgPT4gbC5kaXNwbGF5ID09PSB0cnVlKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBvYnNlcnZlci5uZXh0KGh0bWwpO1xyXG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIERlZmluZSBpbXBvcnRhbnQgc3R5bGUgdG8gYmUgc3VyZSB0aGF0IGFsbCBjb250YWluZXIgaXMgY29udmVydFxyXG4gICAgICAvLyB0byBpbWFnZSBub3QganVzdCB2aXNpYmxlIHBhcnRcclxuICAgICAgaHRtbCArPSAnPHN0eWxlIG1lZGlhPVwic2NyZWVuXCIgdHlwZT1cInRleHQvY3NzXCI+JztcclxuICAgICAgaHRtbCArPSAnLmh0bWwyY2FudmFzLWNvbnRhaW5lciB7IHdpZHRoOiAnICsgd2lkdGggKyAnbW0gIWltcG9ydGFudDsgaGVpZ2h0OiAyMDAwcHggIWltcG9ydGFudDsgfSc7XHJcbiAgICAgIGh0bWwgKz0gJ3RhYmxlLnRhYmxlTGVnZW5kIHt0YWJsZS1sYXlvdXQ6IGF1dG87fSc7XHJcbiAgICAgIGh0bWwgKz0gJ2Rpdi5zdHlsZUxlZ2VuZCB7cGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDo1cHg7cGFkZGluZy1sZWZ0OjVweDtwYWRkaW5nLWJvdHRvbTo1cHg7fSc7XHJcbiAgICAgIGh0bWwgKz0gJzwvc3R5bGU+JztcclxuICAgICAgLy8gVGhlIGZvbnQgc2l6ZSB3aWxsIGFsc28gYmUgbG93ZXJlZCBhZnRlcndhcmRzIChnbG9iYWxseSBhbG9uZyB0aGUgbGVnZW5kIHNpemUpXHJcbiAgICAgIC8vIHRoaXMgYWxsb3dzIGhhdmluZyBhIGdvb2QgcmVsYXRpdmUgZm9udCBzaXplIGhlcmUgYW5kIHRvIGtlZXAgYWp1c3RpbmcgdGhlIGxlZ2VuZCBzaXplXHJcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgZ29vZCByZWxhdGl2ZSBmb250IHNpemVcclxuICAgICAgaHRtbCArPSAnPGZvbnQgc2l6ZT1cIjNcIiBmYWNlPVwiVGltZXNcIiA+JztcclxuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInN0eWxlTGVnZW5kXCI+JztcclxuICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPVwidGFibGVMZWdlbmRcIiA+JztcclxuXHJcbiAgICAgIC8vIEZvciBlYWNoIGxlZ2VuZCwgZGVmaW5lIGFuIGh0bWwgdGFibGUgY2VsbFxyXG4gICAgICBjb25zdCBpbWFnZXMkID0gbGVnZW5kcy5maWx0ZXIobCA9PiBsLmRpc3BsYXkgJiYgbC5pc0luUmVzb2x1dGlvbnNSYW5nZSA9PT0gdHJ1ZSlcclxuICAgICAgLm1hcCgobGVnZW5kKSA9PlxyXG4gICAgICAgIHRoaXMuZ2V0RGF0YUltYWdlKGxlZ2VuZC51cmwpLnBpcGUoXHJcbiAgICAgICAgICByeE1hcCgoZGF0YUltYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBodG1sSW1nID0gJzx0cj48dGQ+JyArIGxlZ2VuZC50aXRsZS50b1VwcGVyQ2FzZSgpICsgJzwvdGQ+PC90cj4nO1xyXG4gICAgICAgICAgICBodG1sSW1nICs9ICc8dHI+PHRkPjxpbWcgc3JjPVwiJyArIGRhdGFJbWFnZSArICdcIj48L3RkPjwvdHI+JztcclxuICAgICAgICAgICAgcmV0dXJuIGh0bWxJbWc7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgICAgZm9ya0pvaW4oaW1hZ2VzJCkuc3Vic2NyaWJlKChkYXRhSW1hZ2VzKSA9PiB7XHJcbiAgICAgICAgaHRtbCA9IGRhdGFJbWFnZXMucmVkdWNlKChhY2MsIGN1cnJlbnQpID0+IChhY2MgKz0gY3VycmVudCksIGh0bWwpO1xyXG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcclxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xyXG4gICAgICAgIG9ic2VydmVyLm5leHQoaHRtbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldERhdGFJbWFnZSh1cmw6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBzZWN1cmVJTUcgPSBuZXcgU2VjdXJlSW1hZ2VQaXBlKHRoaXMuaHR0cCwgdGhpcy5jb25maWdTZXJ2aWNlKTtcclxuICAgIHJldHVybiBzZWN1cmVJTUcudHJhbnNmb3JtKHVybCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIHRoZSBsZWdlbmQgaW4gYSBzaW5nbGUgaW1hZ2VcclxuICAgKiAqIEBwYXJhbSAgZm9ybWF0IC0gSW1hZ2UgZm9ybWF0LiBkZWZhdWx0IHZhbHVlIHRvIFwicG5nXCJcclxuICAgKiBAcmV0dXJuIFRoZSBpbWFnZSBvZiB0aGUgbGVnZW5kXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0TGF5ZXJzTGVnZW5kSW1hZ2UoXHJcbiAgICBtYXAsXHJcbiAgICBmb3JtYXQ6IHN0cmluZyA9ICdwbmcnLFxyXG4gICAgZG9aaXBGaWxlOiBib29sZWFuLFxyXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcclxuICAgIC8vIEdldCBodG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcclxuICAgIGNvbnN0IHdpZHRoID0gMjAwOyAvLyBtaWxpbWV0ZXJzIHVuaXQsIG9yaWdpbmFsbHkgZGVmaW5lIGZvciBkb2N1bWVudCBwZGZcclxuICAgIGxldCBodG1sID0gYXdhaXQgdGhpcy5nZXRMYXllcnNMZWdlbmRIdG1sKFxyXG4gICAgICBtYXAsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICByZXNvbHV0aW9uXHJcbiAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgZm9ybWF0ID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgLy8gSWYgbm8gbGVnZW5kIHNob3cgTm8gTEVHRU5EIGluIGFuIGltYWdlXHJcbiAgICBpZiAoaHRtbC5sZW5ndGggPT09IDApIHtcclxuICAgICAgaHRtbCA9ICc8Zm9udCBzaXplPVwiMTJcIiBmYWNlPVwiQ291cmllciBOZXdcIiA+JztcclxuICAgICAgaHRtbCArPSAnPGRpdiBhbGlnbj1cImNlbnRlclwiPjxiPk5PIExFR0VORDwvYj48L2Rpdj4nO1xyXG4gICAgfVxyXG4gICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXHJcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcclxuXHJcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcclxuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XHJcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XHJcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChjYW52YXMpIHtcclxuICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xyXG4gICAgICAgICAgLy8gU2F2ZSB0aGUgY2FudmFzIGFzIGZpbGVcclxuICAgICAgICAgIHRoaXMuc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgJ2xlZ2VuZEltYWdlJywgZm9ybWF0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAoY2FudmFzLCAnbGVnZW5kSW1hZ2UnICsgJy4nICsgZm9ybWF0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0YXR1cyQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VGV4dFBkZk9iamVjdFNpemVBbmRNYXJnKHRleHQ6IHN0cmluZywgbWFyZ2lucywgZm9udDpzdHJpbmcsIGZvbnRTaXplSW5QdDogbnVtYmVyLCBmb250U3R5bGU6c3RyaW5nLCBkb2M6IGpzUERGKVxyXG4gIDogVGV4dFBkZlNpemVBbmRNYXJnaW4ge1xyXG4gICAgY29uc3QgcGRmUmVzb2x1dGlvbiA9IDk2O1xyXG4gICAgY29uc3QgZG9jV2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKTtcclxuICAgIGNvbnN0IHBhZ2VXaWR0aCA9IGRvY1dpZHRoIC0gbWFyZ2luc1sxXSAtIG1hcmdpbnNbM107XHJcblxyXG4gICAgLy8gaW1wb3J0YW50IHRvIHNldCBpdCBmaXJzdCwgdGhlIHRleHREaW1lbnNpb24gY2hhbmdlIHdoZW4gZm9udCBjaGFuZ2UhXHJcbiAgICBkb2Muc2V0Rm9udChmb250LCBmb250U3R5bGUpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKGZvbnRTaXplSW5QdCk7XHJcblxyXG4gICAgbGV0IHRleHREaW1lbnNpb25zID0gZG9jLmdldFRleHREaW1lbnNpb25zKHRleHQpO1xyXG4gICAgbGV0IHRleHRNYXJnaW5MZWZ0OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHRleHREaW1lbnNpb25zLncgPiBwYWdlV2lkdGgpIHtcclxuICAgICAgLy8gaWYgdGhlIHRleHQgaXMgdG8gbG9uZywgcmVkdWNlIGZvbnRTaXplIDcwJSBhbmQgdGhlIG92ZXJmbG93IHdpdGggYmUgY3V0IGluIHByaW50Li4uXHJcbiAgICAgIHRleHRNYXJnaW5MZWZ0ID0gMDtcclxuICAgICAgZm9udFNpemVJblB0ID0gZm9udFNpemVJblB0ICogMC43O1xyXG4gICAgICBkb2Muc2V0Rm9udFNpemUoZm9udFNpemVJblB0KTtcclxuICAgICAgdGV4dERpbWVuc2lvbnMgPSBkb2MuZ2V0VGV4dERpbWVuc2lvbnModGV4dCk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGV4dE1hcmdpbkxlZnQgPSAocGFnZVdpZHRoIC0gdGV4dERpbWVuc2lvbnMudyApIC8gMiA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2ZvbnRTaXplJzogZm9udFNpemVJblB0LFxyXG4gICAgICAnbWFyZ2luTGVmdCc6IHRleHRNYXJnaW5MZWZ0LFxyXG4gICAgICAnaGVpZ2h0JzogdGV4dERpbWVuc2lvbnMuaFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBjb21tZW50IHRvIHRoZSBkb2N1bWVudFxyXG4gICAqICogQHBhcmFtICBkb2MgLSBwZGYgZG9jdW1lbnRcclxuICAgKiAqIEBwYXJhbSAgY29tbWVudCAtIENvbW1lbnQgdG8gYWRkIGluIHRoZSBkb2N1bWVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWRkQ29tbWVudChkb2M6IGpzUERGLCBjb21tZW50OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbW1lbnRNYXJnaW5MZWZ0ID0gMTA7IC8vbWFyZ2luIGxlZnQgYW5kIGJvdHRvbSBpcyBmaXhcclxuICAgIGNvbnN0IGNvbW1lbnRNYXJnaW5Cb3R0b20gPSAxMDtcclxuICAgIGNvbnN0IG1hcmdpblRvcCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBjb21tZW50TWFyZ2luQm90dG9tO1xyXG4gICAgdGhpcy4gYWRkVGV4dEluUGRmRG9jKGRvYyxjb21tZW50LFxyXG4gICAgICB0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250LFxyXG4gICAgICB0aGlzLlRFWFRQREZGT05ULmNvbW1lbnRGb250U3R5bGUsXHJcbiAgICAgIHRoaXMuVEVYVFBERkZPTlQuY29tbWVudEZvbnRTaXplLFxyXG4gICAgICBjb21tZW50TWFyZ2luTGVmdCxcclxuICAgICAgbWFyZ2luVG9wLFxyXG4gICAgICB0cnVlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRUZXh0SW5QZGZEb2MoZG9jOiBqc1BERixcclxuICAgIHRleHRUb0FkZDogc3RyaW5nLFxyXG4gICAgdGV4dEZvbnQ6IHN0cmluZyxcclxuICAgIHRleHRGb250U3R5bGU6IHN0cmluZyxcclxuICAgIHRleHRGb250U2l6ZTogbnVtYmVyLFxyXG4gICAgdGV4dE1hcmdpbkxlZnQ6IG51bWJlcixcclxuICAgIHRleHRNYXJnaW5Ub3A6IG51bWJlcixcclxuICAgIGlzQ29tbWVudDogYm9vbGVhbiA9IGZhbHNlKVxyXG4gICAge1xyXG4gICAgICBkb2Muc2V0Rm9udCh0ZXh0Rm9udCwgdGV4dEZvbnRTdHlsZSk7XHJcbiAgICAgIGRvYy5zZXRGb250U2l6ZSh0ZXh0Rm9udFNpemUpO1xyXG5cclxuICAgICAgaWYoaXNDb21tZW50KSB7XHJcbiAgICAgICAgdGV4dFRvQWRkID0gZG9jLnNwbGl0VGV4dFRvU2l6ZSh0ZXh0VG9BZGQsIChkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtICh0ZXh0TWFyZ2luTGVmdCAqIDMpKSk7XHJcbiAgICAgIH1cclxuICAgICAgZG9jLnRleHQodGV4dFRvQWRkLCB0ZXh0TWFyZ2luTGVmdCwgdGV4dE1hcmdpblRvcCk7XHJcbiAgICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBwcm9qZWN0aW9uIGFuZC9vciBzY2FsZSB0byB0aGUgZG9jdW1lbnRcclxuICAgKiBAcGFyYW0gIGRvYyAtIHBkZiBkb2N1bWVudFxyXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcclxuICAgKiBAcGFyYW0gIGRwaSAtIERQSSByZXNvbHV0aW9uIG9mIHRoZSBkb2N1bWVudFxyXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEJvb2wgdG8gaW5kaWNhdGUgaWYgcHJvamVjdGlvbiBuZWVkIHRvIGJlIGFkZGVkXHJcbiAgICogQHBhcmFtICBzY2FsZSAtIEJvb2wgdG8gaW5kaWNhdGUgaWYgc2NhbGUgbmVlZCB0byBiZSBhZGRlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWRkUHJvalNjYWxlKFxyXG4gICAgZG9jOiBqc1BERixcclxuICAgIG1hcDogSWdvTWFwLFxyXG4gICAgZHBpOiBudW1iZXIsXHJcbiAgICBwcm9qZWN0aW9uOiBib29sZWFuLFxyXG4gICAgc2NhbGU6IGJvb2xlYW5cclxuICApIHtcclxuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcclxuICAgIGNvbnN0IHByb2pTY2FsZVNpemUgPSAxMjtcclxuICAgIGNvbnN0IHByb2pTY2FsZU1hcmdpbkxlZnQgPSAxMDtcclxuICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IDE1O1xyXG4gICAgY29uc3QgaGVpZ2h0UGl4ZWxzID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIG1hcmdpbkJvdHRvbTtcclxuXHJcbiAgICBsZXQgdGV4dFByb2pTY2FsZTogc3RyaW5nID0gJyc7XHJcbiAgICBpZiAocHJvamVjdGlvbiA9PT0gdHJ1ZSkge1xyXG4gICAgICBjb25zdCBwcm9qVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5wcm9qZWN0aW9uJyk7XHJcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb247XHJcbiAgICB9XHJcbiAgICBpZiAoc2NhbGUgPT09IHRydWUpIHtcclxuICAgICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcclxuICAgICAgICB0ZXh0UHJvalNjYWxlICs9ICcgICAnO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xyXG4gICAgICBjb25zdCBtYXBTY2FsZSA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShkcGkpO1xyXG4gICAgICB0ZXh0UHJvalNjYWxlICs9IHNjYWxlVGV4dCArICc6IH4gMSAvICcgKyBmb3JtYXRTY2FsZShtYXBTY2FsZSk7XHJcbiAgICB9XHJcbiAgICBkb2Muc2V0Rm9udCgnY291cmllcicpO1xyXG4gICAgZG9jLnNldEZvbnRTaXplKHByb2pTY2FsZVNpemUpO1xyXG4gICAgZG9jLnRleHQodGV4dFByb2pTY2FsZSwgcHJvalNjYWxlTWFyZ2luTGVmdCwgaGVpZ2h0UGl4ZWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCB0aGUgbGVnZW5kIHRvIHRoZSBkb2N1bWVudFxyXG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXHJcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxyXG4gICAqIEBwYXJhbSAgbWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxyXG4gICAgZG9jOiBqc1BERixcclxuICAgIG1hcDogSWdvTWFwLFxyXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcclxuICAgIHJlc29sdXRpb246IG51bWJlclxyXG4gICkge1xyXG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxyXG4gICAgY29uc3Qgd2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XHJcbiAgICBjb25zdCBodG1sID0gYXdhaXQgdGhpcy5nZXRMYXllcnNMZWdlbmRIdG1sKFxyXG4gICAgICBtYXAsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICByZXNvbHV0aW9uXHJcbiAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgLy8gSWYgbm8gbGVnZW5kLCBzYXZlIHRoZSBtYXAgZGlyZWN0bHlcclxuICAgIGlmIChodG1sID09PSAnJykge1xyXG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcclxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xyXG5cclxuICAgIC8vIEFkZCBodG1sIGNvZGUgdG8gY29udmVydCBpbiB0aGUgbmV3IHdpbmRvd1xyXG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcclxuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xyXG5cclxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcclxuICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyB1c2VDT1JTOiB0cnVlIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGNhbnZhcykge1xyXG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XHJcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSAvIHJlc29sdXRpb24sIHBvdXJjZW50YWdlUmVkdWN0aW9uXHJcbiAgICAgICAgKiAoMjUuNCAqIGNhbnZhcy5oZWlnaHQpIC8gcmVzb2x1dGlvbl07XHJcbiAgICAgIGxldCBpbWdEYXRhO1xyXG4gICAgICBkb2MuYWRkUGFnZSgpO1xyXG4gICAgICBpbWdEYXRhID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XHJcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XHJcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcclxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXHJcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXHJcbiAgICovXHJcbiAgICAgcHJpdmF0ZSBhc3luYyBhZGRMZWdlbmRTYW1lUGFnZShcclxuICAgICAgZG9jOiBqc1BERixcclxuICAgICAgbWFwOiBJZ29NYXAsXHJcbiAgICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj4sXHJcbiAgICAgIHJlc29sdXRpb246IG51bWJlcixcclxuICAgICAgbGVnZW5kUG9zaXRpb246IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgIC8vIEdldCBodG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcclxuICAgICAgY29uc3Qgd2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XHJcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXHJcbiAgICAgICAgbWFwLFxyXG4gICAgICAgIHdpZHRoLFxyXG4gICAgICAgIHJlc29sdXRpb25cclxuICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgICAgLy8gSWYgbm8gbGVnZW5kLCBzYXZlIHRoZSBtYXAgZGlyZWN0bHlcclxuICAgICAgaWYgKGh0bWwgPT09ICcnKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXHJcbiAgICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XHJcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XHJcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICBhd2FpdCB0aGlzLnRpbWVvdXQoMSk7XHJcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyB1c2VDT1JTOiB0cnVlIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgbWFyZ2luc0xlZ2VuZDtcclxuICAgICAgaWYgKGNhbnZhcykge1xyXG4gICAgICAgIGNvbnN0IHBvdXJjZW50YWdlUmVkdWN0aW9uID0gMC44NTtcclxuICAgICAgICBjb25zdCBpbWFnZVNpemUgPSBbcG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy53aWR0aCkgLyByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgIHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMuaGVpZ2h0KSAvIHJlc29sdXRpb25dO1xyXG4gICAgICAgIC8vIE1vdmUgdGhlIGxlZ2VuZCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiBvbiB0aGUgcGFnZVxyXG4gICAgICAgIGlmICggbGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21yaWdodCcpIHtcclxuICAgICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIG1hcmdpbnNbMl0gLSBpbWFnZVNpemVbMV0sIG1hcmdpbnNbMV0sXHJcbiAgICAgICAgICAgbWFyZ2luc1syXSwgZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoIC0gbWFyZ2luc1sxXSAtIGltYWdlU2l6ZVswXV07XHJcbiAgICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xyXG4gICAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFttYXJnaW5zWzBdLCBtYXJnaW5zWzFdLCBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSxcclxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbMV0gLSBpbWFnZVNpemVbMF0gXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tbGVmdCcpIHtcclxuICAgICAgICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBpbiB0aGUgYm90dG9tIGxlZnQsIHJhaXNlIHRoZSBsZWdlbmQgc2xpZ2h0bHkgdXB3YXJkIHNvIHRoYXQgYXR0cmlidXRpb25zIGFyZSB2aXNpYmxlXHJcbiAgICAgICAgICBtYXJnaW5zTGVnZW5kID0gW2RvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzJdIC0gaW1hZ2VTaXplWzFdIC0gMTUsXHJcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBtYXJnaW5zWzNdIC0gaW1hZ2VTaXplWzBdLCBtYXJnaW5zWzJdICsgMTUsIG1hcmdpbnNbM10gXTtcclxuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcclxuICAgICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbbWFyZ2luc1swXSwgZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoIC0gbWFyZ2luc1szXSAtIGltYWdlU2l6ZVswXSxcclxuICAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSwgbWFyZ2luc1szXSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhcywgbWFyZ2luc0xlZ2VuZCk7IC8vIHRoaXMgYWRkcyB0aGUgbGVnZW5kXHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIHNjYWxlIGFuZCBhdHRyaWJ1dGlvbnMgb24gdGhlIG1hcCBvbiB0aGUgZG9jdW1lbnRcclxuICAgKiBAcGFyYW0gIGRvYyAtIFBkZiBkb2N1bWVudCB3aGVyZSBsZWdlbmQgd2lsbCBiZSBhZGRlZFxyXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcclxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkZFNjYWxlKFxyXG4gICAgZG9jOiBqc1BERixcclxuICAgIG1hcDogSWdvTWFwLFxyXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPlxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IG1hcFNpemUgPSBtYXAub2wuZ2V0U2l6ZSgpO1xyXG4gICAgICBjb25zdCBleHRlbnQgPSBtYXAub2wuZ2V0VmlldygpLmNhbGN1bGF0ZUV4dGVudChtYXBTaXplKTtcclxuICAgICAgLy8gR2V0IHRoZSBzY2FsZSBhbmQgYXR0cmlidXRpb25cclxuICAgICAgLy8gd2UgdXNlIGNsb25lTm9kZSB0byBtb2RpZnkgdGhlIG5vZGVzIHRvIHByaW50IHdpdGhvdXQgbW9kaWZ5aW5nIGl0IG9uIHRoZSBwYWdlLCB1c2luZyBkZWVwOnRydWUgdG8gZ2V0IGNoaWxkcmVuXHJcbiAgICAgIGxldCBjYW52YXNPdmVybGF5SFRNTDtcclxuICAgICAgY29uc3QgbWFwT3ZlcmxheUhUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lclN0b3BFdmVudCgpO1xyXG4gICAgICAvLyBSZW1vdmUgdGhlIFVJIGJ1dHRvbnMgZnJvbSB0aGUgbm9kZXNcclxuICAgICAgY29uc3QgT3ZlcmxheUhUTUxCdXR0b25zID0gbWFwT3ZlcmxheUhUTUwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgICBjb25zdCBPdmVybGF5SFRNTEJ1dHRvbnNhcnIgPSBBcnJheS5mcm9tKE92ZXJsYXlIVE1MQnV0dG9ucyk7XHJcbiAgICAgIGZvciAoY29uc3QgT3ZlcmxheUhUTUxCdXR0b24gb2YgT3ZlcmxheUhUTUxCdXR0b25zYXJyKSB7XHJcbiAgICAgICAgT3ZlcmxheUhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRmluZCBhdHRyaWJ1dGlvbnMgYnkgY2xhc3MgYW5kIGRlbGV0ZVxyXG4gICAgICAvLyB0aGUgY29sbGFwc2VkIGNsYXNzIHRvIG9wZW4gYXR0cmlidXRpb24gQ29weXJpZ2h0XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBtYXBPdmVybGF5SFRNTC5xdWVyeVNlbGVjdG9yKCcub2wtYXR0cmlidXRpb24nKTtcclxuICAgICAgY29uc3Qgb2xDb2xsYXBzZWQ6IGJvb2xlYW4gPSBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnb2wtY29sbGFwc2VkJyk7XHJcbiAgICAgIGlmIChvbENvbGxhcHNlZCkge1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb2wtY29sbGFwc2VkJyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2hhbmdlIHRoZSBzdHlsZXMgb2YgaHlwZXJsaW5rIGluIHRoZSBwcmludGVkIHZlcnNpb25cclxuICAgICAgLy8gVHJhbnNmb3JtIHRoZSBPdmVybGF5IGludG8gYSBjYW52YXNcclxuICAgICAgLy8gc2NhbGUgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgaW4gZ29vZ2xlIGNocm9tZVxyXG4gICAgICAvLyBiYWNrZ3JvdW5kIGFzIG51bGwgYmVjYXVzZSBvdGhlcndpc2UgaXQgaXMgd2hpdGUgYW5kIGNvdmVyIHRoZSBtYXBcclxuICAgICAgLy8gYWxsb3d0YWludCBpcyB0byBhbGxvdyByZW5kZXJpbmcgaW1hZ2VzIGluIHRoZSBhdHRyaWJ1dGlvbnNcclxuICAgICAgLy8gdXNlQ09SUzogdHJ1ZSBwb3VyIHBlcm1ldHRyZSBkZSByZW5kZXJlciBsZXMgaW1hZ2VzIChuZSBtYXJjaGUgcGFzIGVuIGxvY2FsKVxyXG4gICAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhtYXBPdmVybGF5SFRNTCwge1xyXG4gICAgICAgIHNjYWxlOiAxLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogbnVsbCxcclxuICAgICAgICBhbGxvd1RhaW50OiB0cnVlLFxyXG4gICAgICAgIHVzZUNPUlM6IHRydWUsXHJcbiAgICAgIH0pLnRoZW4oIGUgPT4ge1xyXG4gICAgICAgIGNhbnZhc092ZXJsYXlIVE1MID0gZTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzT3ZlcmxheUhUTUwsIG1hcmdpbnMpOyAvLyB0aGlzIGFkZHMgc2NhbGVzIGFuZCBhdHRyaWJ1dGlvbnNcclxuICAgICAgaWYgKG9sQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvbC1jb2xsYXBzZWQnKTtcclxuICAgICAgfVxyXG4gfVxyXG5cclxuIC8qKlxyXG4gICogQWRkIENvcHlyaWdoIHRvIHRoZSBtYXAgY2FudmFzXHJcbiAgKiBAcGFyYW0gbWFwIC0gTWFwIG9mIHRoZSBhcHBcclxuICAqIEBwYXJhbSBjYW52YXMgQ2FudmFzIG9mIHRoZSBtYXBcclxuICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkQ29weXJpZ2h0VG9JbWFnZShcclxuICAgIG1hcDogSWdvTWFwLFxyXG4gICAgY2FudmFzIDogSFRNTENhbnZhc0VsZW1lbnRcclxuICAgICkge1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgIGxldCBjYW52YXNPdmVybGF5SFRNTDtcclxuICAgICAgY29uc3QgbWFwT3ZlcmxheUhUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lclN0b3BFdmVudCgpO1xyXG4gICAgICAvLyBSZW1vdmUgdGhlIFVJIGJ1dHRvbnMgZnJvbSB0aGUgbm9kZXNcclxuICAgICAgY29uc3QgT3ZlcmxheUhUTUxCdXR0b25zID0gbWFwT3ZlcmxheUhUTUwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgICBjb25zdCBPdmVybGF5SFRNTEJ1dHRvbnNhcnIgPSBBcnJheS5mcm9tKE92ZXJsYXlIVE1MQnV0dG9ucyk7XHJcbiAgICAgIGZvciAoY29uc3QgT3ZlcmxheUhUTUxCdXR0b24gb2YgT3ZlcmxheUhUTUxCdXR0b25zYXJyKSB7XHJcbiAgICAgICAgT3ZlcmxheUhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRmluZCBhdHRyaWJ1dGlvbnMgYnkgY2xhc3MgYW5kIGRlbGV0ZVxyXG4gICAgICAvLyB0aGUgY29sbGFwc2VkIGNsYXNzIHRvIG9wZW4gYXR0cmlidXRpb24gQ29weXJpZ2h0XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBtYXBPdmVybGF5SFRNTC5xdWVyeVNlbGVjdG9yKCcub2wtYXR0cmlidXRpb24nKTtcclxuICAgICAgY29uc3Qgb2xDb2xsYXBzZWQ6IGJvb2xlYW4gPSBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnb2wtY29sbGFwc2VkJyk7XHJcbiAgICAgIGlmIChvbENvbGxhcHNlZCkge1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb2wtY29sbGFwc2VkJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IGh0bWwyY2FudmFzKG1hcE92ZXJsYXlIVE1MLCB7XHJcbiAgICAgICAgc2NhbGU6IDEsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gICAgICAgIGFsbG93VGFpbnQ6IHRydWUsXHJcbiAgICAgICAgdXNlQ09SUzogdHJ1ZSxcclxuICAgICAgfSkudGhlbiggZSA9PiB7XHJcbiAgICAgICAgY2FudmFzT3ZlcmxheUhUTUwgPSBlO1xyXG4gICAgICB9KTtcclxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoY2FudmFzT3ZlcmxheUhUTUwsIDAsIDApO1xyXG4gICAgICBpZiAob2xDb2xsYXBzZWQpIHtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29sLWNvbGxhcHNlZCcpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBkZWZpbmVOYkZpbGVUb1Byb2Nlc3MobmJGaWxlVG9Qcm9jZXNzKSB7XHJcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGltZW91dChtcykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZENhbnZhcyhcclxuICAgIGRvYzoganNQREYsXHJcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxyXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPlxyXG4gICkge1xyXG4gICAgbGV0IGltYWdlO1xyXG4gICAgaWYgKGNhbnZhcykge1xyXG4gICAgICBpbWFnZSA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbWFnZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChpbWFnZS5sZW5ndGggPCAyMCApIHsgLy8gIGltZyBpcyBjb3JydXB0ICAgIHRvZG86IGZpeCBhZGRTY2FsZSBpbiBtb2JpbGUgbWFrZSBhIGNvcnJ1cHQgaW1nXHJcbiAgICAgICAgY29uc29sZS5sb2coJ1dhcm5pbmc6IEFuIGltYWdlIGNhbm5vdCBiZSBwcmludCBpbiBwZGYgZmlsZScpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbWFnZVNpemUgPSB0aGlzLmdldEltYWdlU2l6ZVRvRml0UGRmKGRvYywgY2FudmFzLCBtYXJnaW5zKTtcclxuICAgICAgZG9jLmFkZEltYWdlKFxyXG4gICAgICAgIGltYWdlLFxyXG4gICAgICAgICdQTkcnLFxyXG4gICAgICAgIG1hcmdpbnNbM10sXHJcbiAgICAgICAgbWFyZ2luc1swXSxcclxuICAgICAgICBpbWFnZVNpemVbMF0sXHJcbiAgICAgICAgaW1hZ2VTaXplWzFdXHJcbiAgICAgICk7XHJcbiAgICAgIGRvYy5yZWN0KG1hcmdpbnNbM10sIG1hcmdpbnNbMF0sIGltYWdlU2l6ZVswXSwgaW1hZ2VTaXplWzFdKTtcclxuICAgICAgdGhpcy5pbWdTaXplQWRkZWQgPSBpbWFnZVNpemU7IC8vIGtlZXAgaW1nIHNpemUgZm9yIGdlb3JlZiBsYXRlclxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETyBmaXggcHJpbnRpbmcgd2l0aCBpbWFnZSByZXNvbHV0aW9uXHJcbiAgcHJpdmF0ZSBhZGRNYXAoXHJcbiAgICBkb2M6IGpzUERGLFxyXG4gICAgbWFwOiBJZ29NYXAsXHJcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXHJcbiAgICBzaXplOiBBcnJheTxudW1iZXI+LFxyXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPlxyXG4gICkge1xyXG4gICAgY29uc3Qgc3RhdHVzJCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gICAgY29uc3QgbWFwU2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XHJcbiAgICBjb25zdCBleHRlbnQgPSBtYXAub2wuZ2V0VmlldygpLmNhbGN1bGF0ZUV4dGVudChtYXBTaXplKTtcclxuXHJcbiAgICBjb25zdCB3aWR0aFBpeGVscyA9IE1hdGgucm91bmQoKHNpemVbMF0gKiByZXNvbHV0aW9uKSAvIDI1LjQpO1xyXG4gICAgY29uc3QgaGVpZ2h0UGl4ZWxzID0gTWF0aC5yb3VuZCgoc2l6ZVsxXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XHJcblxyXG4gICAgbGV0IHRpbWVvdXQ7XHJcblxyXG4gICAgbWFwLm9sLm9uY2UoJ3JlbmRlcmNvbXBsZXRlJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgY2FudmFzZXMgPSBldmVudC50YXJnZXQuZ2V0Vmlld3BvcnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FudmFzJyk7XHJcbiAgICAgIGNvbnN0IG1hcFN0YXR1cyQkID0gbWFwLnN0YXR1cyQuc3Vic2NyaWJlKChtYXBTdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcblxyXG4gICAgICAgIGlmIChtYXBTdGF0dXMgIT09IFN1YmplY3RTdGF0dXMuRG9uZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgY2FudmFzZXMpIHtcclxuICAgICAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5JywnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlck1hcChtYXAsIG1hcFNpemUsIGV4dGVudCk7XHJcbiAgICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gSWYgbm8gbG9hZGluZyBhcyBzdGFydGVkIGFmdGVyIDIwMG1zLCB0aGVuIHByb2JhYmx5IG5vIGxvYWRpbmdcclxuICAgICAgLy8gaXMgcmVxdWlyZWQuXHJcbiAgICAgIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgY2FudmFzZXMpIHtcclxuICAgICAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5JywgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJNYXAobWFwLCBtYXBTaXplLCBleHRlbnQpO1xyXG4gICAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xyXG4gICAgICB9LCAyMDApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJNYXAobWFwLCBbd2lkdGhQaXhlbHMsIGhlaWdodFBpeGVsc10sIGV4dGVudCk7XHJcblxyXG4gICAgcmV0dXJuIHN0YXR1cyQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb3dubG9hZCBhbiBpbWFnZSBvZiB0aGUgbWFwIHdpdGggYWRkaXRpb24gb2YgaW5mb3JtYXRpb25zXHJcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxyXG4gICAqIEBwYXJhbSAgZm9ybWF0IC0gSW1hZ2UgZm9ybWF0LiBkZWZhdWx0IHZhbHVlIHRvIFwicG5nXCJcclxuICAgKiBAcGFyYW0gIHByb2plY3Rpb24gLSBJbmRpY2F0ZSBpZiBwcm9qZWN0aW9uIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXHJcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXHJcbiAgICogQHBhcmFtICBsZWdlbmQgLSBJbmRpY2F0ZSBpZiB0aGUgbGVnZW5kIG9mIGxheWVycyBuZWVkIHRvIGJlIGRvd25sb2FkLiBEZWZhdWx0IHRvIGZhbHNlXHJcbiAgICogQHBhcmFtICB0aXRsZSAtIFRpdGxlIHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcclxuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xyXG4gICAqIEBwYXJhbSAgY29tbWVudCAtIENvbW1lbnQgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xyXG4gICAqIEBwYXJhbSAgZG9aaXBGaWxlIC0gSW5kaWNhdGUgaWYgd2UgZG8gYSB6aXAgd2l0aCB0aGUgZmlsZVxyXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcclxuICAgKi9cclxuICBkb3dubG9hZE1hcEltYWdlKFxyXG4gICAgbWFwOiBJZ29NYXAsXHJcbiAgICByZXNvbHV0aW9uOiBudW1iZXIsXHJcbiAgICBmb3JtYXQgPSAncG5nJyxcclxuICAgIHByb2plY3Rpb24gPSBmYWxzZSxcclxuICAgIHNjYWxlID0gZmFsc2UsXHJcbiAgICB0aXRsZSA9ICcnLFxyXG4gICAgc3VidGl0bGUgPSAnJyxcclxuICAgIGNvbW1lbnQgPSAnJyxcclxuICAgIGRvWmlwRmlsZSA9IHRydWUsXHJcbiAgICBsZWdlbmRQb3NpdGlvbjogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcclxuICAgIC8vIGNvbnN0IHJlc29sdXRpb24gPSBtYXAub2wuZ2V0VmlldygpLmdldFJlc29sdXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZpdHlJZCA9IHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnJlZ2lzdGVyKCk7XHJcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XHJcbiAgICBtYXAub2wub25jZSgncmVuZGVyY29tcGxldGUnLCBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBmb3JtYXQgPSBmb3JtYXQudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3Qgb2xkQ2FudmFzID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLmdldFZpZXdwb3J0KClcclxuICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2NhbnZhcycpWzBdO1xyXG4gICAgICBjb25zdCBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgbmV3Q29udGV4dCA9IG5ld0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAvLyBQb3N0aW9uIGluIGhlaWdodCB0byBzZXQgdGhlIGNhbnZhcyBpbiBuZXcgY2FudmFzXHJcbiAgICAgIGxldCBwb3NpdGlvbkhDYW52YXMgPSAwO1xyXG4gICAgICAvLyBHZXQgaGVpZ2h0L3dpZHRoIG9mIG1hcCBjYW52YXNcclxuICAgICAgY29uc3Qgd2lkdGggPSBvbGRDYW52YXMud2lkdGg7XHJcbiAgICAgIGxldCBoZWlnaHQgPSBvbGRDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAvLyBTZXQgRm9udCB0byBjYWxjdWxhdGUgY29tbWVudCB3aWR0aFxyXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcclxuICAgICAgY29uc3QgY29tbWVudFdpZHRoID0gbmV3Q29udGV4dC5tZWFzdXJlVGV4dChjb21tZW50KS53aWR0aDtcclxuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgdGl0bGUgaWYgZGVmaW5lZFxyXG4gICAgICBoZWlnaHQgPSB0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcclxuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgdGl0bGUgaWYgZGVmaW5lZFxyXG4gICAgICBoZWlnaHQgPSBzdWJ0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcclxuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgcHJvamVjdGlvbiBvciBzY2FsZSAoc2FtZSBsaW5lKSBpZiBkZWZpbmVkXHJcbiAgICAgIGhlaWdodCA9IHByb2plY3Rpb24gIT09IGZhbHNlIHx8IHNjYWxlICE9PSBmYWxzZSA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xyXG4gICAgICBjb25zdCBwb3NpdGlvbkhQcm9qU2NhbGUgPSBoZWlnaHQgLSAxMDtcclxuICAgICAgLy8gRGVmaW5lIG51bWJlciBvZiBsaW5lIGRlcGVuZGluZyBvZiB0aGUgY29tbWVudCBsZW5ndGhcclxuICAgICAgY29uc3QgY29tbWVudE5iTGluZSA9IE1hdGguY2VpbChjb21tZW50V2lkdGggLyB3aWR0aCk7XHJcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIG11bHRpbGluZSBjb21tZW50IGlmIGRlZmluZWRcclxuICAgICAgaGVpZ2h0ID0gY29tbWVudCAhPT0gJycgPyBoZWlnaHQgKyBjb21tZW50TmJMaW5lICogMzAgOiBoZWlnaHQ7XHJcbiAgICAgIGxldCBwb3NpdGlvbkhDb21tZW50ID0gaGVpZ2h0IC0gY29tbWVudE5iTGluZSAqIDIwICsgNTtcclxuICAgICAgLy8gU2V0IHRoZSBuZXcgY2FudmFzIHdpdGggdGhlIG5ldyBjYWxjdWxhdGVkIHNpemVcclxuICAgICAgbmV3Q2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgIGlmIChbJ2JtcCcsJ2dpZicsICdqcGVnJywgJ3BuZycsICd0aWZmJ10uaW5kZXhPZihmb3JtYXQpID4gLTEpIHtcclxuICAgICAgICAvLyBQYXRjaCBKcGVnIGRlZmF1bHQgYmxhY2sgYmFja2dyb3VuZCB0byB3aGl0ZVxyXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdqcGVnJykge1xyXG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnI2ZmZmZmZic7XHJcbiAgICAgICAgICBuZXdDb250ZXh0LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aXRsZSAhPT0gJycgfHwgc3VidGl0bGUgIT09ICcnIHx8IGNvbW1lbnQgIT09ICcnIHx8XHJcbiAgICAgICAgICAgIHByb2plY3Rpb24gIT09IGZhbHNlIHx8IHNjYWxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gJyNmZmZmZmYnO1xyXG4gICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBhIHRpdGxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXHJcbiAgICAgIGlmICh0aXRsZSAhPT0gJycpIHtcclxuICAgICAgICAvLyBTZXQgZm9udCBmb3IgdGl0bGVcclxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxyXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xyXG4gICAgICAgIHBvc2l0aW9uSENhbnZhcyA9IDMwO1xyXG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dCh0aXRsZSwgd2lkdGggLyAyLCAyMCwgd2lkdGggKiAwLjkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdWJ0aXRsZSAhPT0gJycpIHtcclxuICAgICAgICAvLyBTZXQgZm9udCBmb3Igc3VidGl0bGVcclxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxyXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xyXG4gICAgICAgIHBvc2l0aW9uSENhbnZhcyA9IDYwO1xyXG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChzdWJ0aXRsZSwgd2lkdGggLyAyLCA1MCwgd2lkdGggKiAwLjkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFNldCBmb250IGZvciBuZXh0IHNlY3Rpb25cclxuICAgICAgbmV3Q29udGV4dC5mb250ID0gJzIwcHggQ2FsaWJyaSc7XHJcbiAgICAgIC8vIElmIHByb2plY3Rpb24gb3IvZW5kIHNjYWxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXHJcbiAgICAgIGlmKChwcm9qZWN0aW9uICE9PSBmYWxzZSkgfHwgKHNjYWxlICE9PSBmYWxzZSkpIHtcclxuICAgICAgICBsZXQgcHJvamVjdGlvblNjYWxlVGV4dCA9ICcnO1xyXG4gICAgICAgIGlmIChwcm9qZWN0aW9uICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgY29uc3QgcHJvalRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0ucHJvamVjdGlvbicpO1xyXG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCA9IHByb2pUZXh0ICsgJzogJyArIG1hcC5wcm9qZWN0aW9uICsgJyAgICAgICAgICc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2NhbGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICBjb25zdCBzY2FsZVRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0uc2NhbGUnKTtcclxuICAgICAgICAgIGNvbnN0IG1hcFNjYWxlID0gbWFwLnZpZXdDb250cm9sbGVyLmdldFNjYWxlKHJlc29sdXRpb24pO1xyXG4gICAgICAgICAgcHJvamVjdGlvblNjYWxlVGV4dCArPSBzY2FsZVRleHQgKyAnOiB+IDEgLyAnICsgZm9ybWF0U2NhbGUobWFwU2NhbGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdDb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQocHJvamVjdGlvblNjYWxlVGV4dCwgd2lkdGggLyAyLCBwb3NpdGlvbkhQcm9qU2NhbGUsIHdpZHRoICogMC45KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSWYgYSBjb21tZW50IG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXHJcbiAgICAgIGlmIChjb21tZW50ICE9PSAnJykge1xyXG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICAgICAgLy8gSWYgb25seSBvbmUgbGluZSwgbm8gbmVlZCB0byBtdWx0aWxpbmUgdGhlIGNvbW1lbnRcclxuICAgICAgICBpZiAoY29tbWVudE5iTGluZSA9PT0gMSkge1xyXG4gICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChjb21tZW50LCB3aWR0aCAvIDIsIHBvc2l0aW9uSENvbW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBTZXBhcmF0ZSB0aGUgc2V0ZW5zZXMgdG8gYmUgYXBwcm94LiB0aGUgc2FtZSBsZW5ndGhcclxuICAgICAgICAgIGNvbnN0IG5iQ29tbWVudENoYXIgPSBjb21tZW50Lmxlbmd0aDtcclxuICAgICAgICAgIGNvbnN0IENvbW1lbnRMZW5ndGhUb0N1dCA9IE1hdGguZmxvb3IobmJDb21tZW50Q2hhciAvIGNvbW1lbnROYkxpbmUpO1xyXG4gICAgICAgICAgbGV0IGNvbW1lbnRDdXJyZW50TGluZSA9ICcnO1xyXG4gICAgICAgICAgbGV0IHBvc2l0aW9uRmlyc3RDdXRDaGFyID0gMDtcclxuICAgICAgICAgIGxldCBwb3NpdGlvbkxhc3RCbGFuaztcclxuICAgICAgICAgIC8vIExvb3AgZm9yIHRoZSBudW1iZXIgb2YgbGluZSBjYWxjdWxhdGVkXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1lbnROYkxpbmU7IGkrKykge1xyXG4gICAgICAgICAgICAvLyBGb3IgYWxsIGxpbmUgZXhjZXB0IGxhc3RcclxuICAgICAgICAgICAgaWYgKGNvbW1lbnROYkxpbmUgLSAxID4gaSkge1xyXG4gICAgICAgICAgICAgIC8vIEdldCBjb21tZW50IGN1cnJlbnQgbGluZSB0byBmaW5kIHRoZSByaWdodCBwbGFjZSB0dSBjdXQgY29tbWVudFxyXG4gICAgICAgICAgICAgIGNvbW1lbnRDdXJyZW50TGluZSA9IGNvbW1lbnQuc3Vic3RyKFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25GaXJzdEN1dENoYXIsXHJcbiAgICAgICAgICAgICAgICBDb21tZW50TGVuZ3RoVG9DdXRcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIC8vIEN1dCB0aGUgc2V0ZW5jZSBhdCBibGFua1xyXG4gICAgICAgICAgICAgIHBvc2l0aW9uTGFzdEJsYW5rID0gY29tbWVudEN1cnJlbnRMaW5lLmxhc3RJbmRleE9mKCcgJyk7XHJcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcclxuICAgICAgICAgICAgICAgIGNvbW1lbnRDdXJyZW50TGluZS5zdWJzdHIoMCwgcG9zaXRpb25MYXN0QmxhbmspLFxyXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb25GaXJzdEN1dENoYXIgKz0gcG9zaXRpb25MYXN0Qmxhbms7XHJcbiAgICAgICAgICAgICAgLy8gR28gdG8gbmV4dCBsaW5lIGZvciBpbnNlcnRpb25cclxuICAgICAgICAgICAgICBwb3NpdGlvbkhDb21tZW50ICs9IDIwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIERvbid0IGN1dCBsYXN0IHBhcnRcclxuICAgICAgICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KFxyXG4gICAgICAgICAgICAgICAgY29tbWVudC5zdWJzdHIocG9zaXRpb25GaXJzdEN1dENoYXIpLFxyXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBtYXAgdG8gbmV3IGNhbnZhc1xyXG4gICAgICBuZXdDb250ZXh0LmRyYXdJbWFnZShvbGRDYW52YXMsIDAsIHBvc2l0aW9uSENhbnZhcyk7XHJcbiAgICAgIC8vIEFkZCBjb3B5cmlnaFxyXG4gICAgICBhd2FpdCB0aGlzLmFkZENvcHlyaWdodFRvSW1hZ2UobWFwLCBuZXdDYW52YXMpO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgdGhlIGxlZ2VuZFBvc2l0aW9uXHJcbiAgICAgIGlmIChsZWdlbmRQb3NpdGlvbiAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgaWYgKFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihsZWdlbmRQb3NpdGlvbikgPiAtMSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGRMZWdlbmRUb0ltYWdlKFxyXG4gICAgICAgICAgICBuZXdDYW52YXMsXHJcbiAgICAgICAgICAgIG1hcCxcclxuICAgICAgICAgICAgcmVzb2x1dGlvbixcclxuICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24sXHJcbiAgICAgICAgICAgIGZvcm1hdFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnbmV3cGFnZScpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSW1hZ2UoXHJcbiAgICAgICAgICAgIG1hcCxcclxuICAgICAgICAgICAgZm9ybWF0LFxyXG4gICAgICAgICAgICBkb1ppcEZpbGUsXHJcbiAgICAgICAgICAgIHJlc29sdXRpb25cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xyXG4gICAgICBsZXQgZmlsZU5hbWVXaXRoRXh0ID0gJ21hcC4nICsgZm9ybWF0O1xyXG4gICAgICBpZiAoZm9ybWF0LnRvTG93ZXJDYXNlKCkgPT09ICd0aWZmJykge1xyXG4gICAgICAgIGZpbGVOYW1lV2l0aEV4dCA9ICdtYXAnICsgbWFwLnByb2plY3Rpb24ucmVwbGFjZSgnOicsICdfJykgKyAnLicgKyBmb3JtYXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgY2FudmFzIGFzIGZpbGVcclxuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xyXG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUobmV3Q2FudmFzLCBmaWxlTmFtZVdpdGhFeHQsIGZvcm1hdCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQudG9Mb3dlckNhc2UoKSA9PT0gJ3RpZmYnKSB7XHJcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChuZXdDYW52YXMsIGZpbGVOYW1lV2l0aEV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKG5ld0NhbnZhcywgZmlsZU5hbWVXaXRoRXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xyXG5cclxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcclxuICAgICAgICBjb25zdCB0ZndGaWxlTmFtZVdpdGhFeHQgPSBmaWxlTmFtZVdpdGhFeHQuc3Vic3RyaW5nKDAsIGZpbGVOYW1lV2l0aEV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJy50aWZmJykpICsgJy50ZncnO1xyXG4gICAgICAgIGNvbnN0IHRpd0NvbnRlbnQgPSB0aGlzLmdldFdvcmxkRmlsZUluZm9ybWF0aW9uKG1hcCk7XHJcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0aXdDb250ZW50XSwge1xyXG4gICAgICAgICAgdHlwZTogJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCdcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xyXG4gICAgICAgICAgLy8gc2F2ZUFzIGF1dG9tYXRpY2x5IHJlcGxhY2UgJzonIGZvciAnXydcclxuICAgICAgICAgIHNhdmVBcyhibG9iLCB0ZndGaWxlTmFtZVdpdGhFeHQpO1xyXG4gICAgICAgICAgdGhpcy5zYXZlRmlsZVByb2Nlc3NpbmcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXHJcbiAgICAgICAgICB0aGlzLmFkZEZpbGVUb1ppcCh0ZndGaWxlTmFtZVdpdGhFeHQsYmxvYik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIG1hcC5vbC5yZW5kZXJTeW5jKCk7XHJcblxyXG4gICAgcmV0dXJuIHN0YXR1cyQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW5kIEFkZCBMZWdlbmQgdG8gdGhlIG1hcCBjYW52YXNcclxuICAgKiBAcGFyYW0gIGNhbnZhcyBDYW52YXMgb2YgdGhlIG1hcFxyXG4gICAqIEBwYXJhbSAgbWFwIE1hcCBvZiB0aGUgYXBwXHJcbiAgICogQHBhcmFtICByZXNvbHV0aW9uIFJlc29sdXRpb24gb2YgbWFwXHJcbiAgICogQHBhcmFtICBsZWdlbmRQb3NpdGlvbiBMZWdlbmQgcG9zaXRpb25cclxuICAgKiBAcGFyYW0gIGZvcm1hdCBJbWFnZSBmb3JtYXRcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFRvSW1hZ2UoXHJcbiAgICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXHJcbiAgICAgIG1hcDogSWdvTWFwLFxyXG4gICAgICByZXNvbHV0aW9uOiBudW1iZXIsXHJcbiAgICAgIGxlZ2VuZFBvc2l0aW9uOiBzdHJpbmcsXHJcbiAgICAgIGZvcm1hdDogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBjb25zdCBmaWxlTmFtZVdpdGhFeHQgPSAnbWFwLicgKyBmb3JtYXQ7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxyXG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcclxuICAgICAgbWFwLFxyXG4gICAgICBjYW52YXMud2lkdGgsXHJcbiAgICAgIHJlc29sdXRpb25cclxuICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICAvLyBJZiBubyBsZWdlbmQsIHNhdmUgdGhlIG1hcCBkaXJlY3RseVxyXG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgZmlsZU5hbWVXaXRoRXh0LCBmb3JtYXQpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxyXG4gICAgY29uc3QgZGl2ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcclxuICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XHJcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcclxuICAgIGNvbnN0IGNhbnZhc0xlZ2VuZCA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyB1c2VDT1JTOiB0cnVlIH0pLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGNhbnZhc0xlZ2VuZCkge1xyXG4gICAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xyXG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgbGVnZW5kSGVpZ2h0ID0gY2FudmFzTGVnZW5kLmhlaWdodDtcclxuICAgICAgY29uc3QgbGVnZW5kV2lkdGggPSBjYW52YXNMZWdlbmQud2lkdGg7XHJcbiAgICAgIC8vIE1vdmUgdGhlIGxlZ2VuZCB0byB0aGUgY29ycmVjdCBwb3NpdGlvbiBvbiB0aGUgcGFnZVxyXG4gICAgICBjb25zdCBvZmZzZXQgPSBjYW52YXNIZWlnaHQgKiAwLjAxO1xyXG4gICAgICBsZXQgbGVnZW5kWDogbnVtYmVyO1xyXG4gICAgICBsZXQgbGVnZW5kWTogbnVtYmVyO1xyXG5cclxuICAgICAgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAnYm90dG9tcmlnaHQnKSB7XHJcbiAgICAgICAgbGVnZW5kWCA9IGNhbnZhc1dpZHRoIC0gbGVnZW5kV2lkdGggLSBvZmZzZXQ7XHJcbiAgICAgICAgbGVnZW5kWSA9IGNhbnZhc0hlaWdodCAtIGxlZ2VuZEhlaWdodCAtIG9mZnNldDtcclxuICAgICAgfSBlbHNlIGlmIChsZWdlbmRQb3NpdGlvbiA9PT0gJ3RvcHJpZ2h0Jykge1xyXG4gICAgICAgIGxlZ2VuZFggPSBjYW52YXNXaWR0aCAtIGxlZ2VuZFdpZHRoIC0gb2Zmc2V0O1xyXG4gICAgICAgIGxlZ2VuZFkgPSBvZmZzZXQ7XHJcbiAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xyXG4gICAgICAgIGxlZ2VuZFggPSBvZmZzZXQ7XHJcbiAgICAgICAgbGVnZW5kWSA9IGNhbnZhc0hlaWdodCAtIGxlZ2VuZEhlaWdodCAtIG9mZnNldCAtIDE1O1xyXG4gICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcclxuICAgICAgICBsZWdlbmRYID0gb2Zmc2V0O1xyXG4gICAgICAgIGxlZ2VuZFkgPSBvZmZzZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGNhbnZhc0xlZ2VuZCwgbGVnZW5kWCwgbGVnZW5kWSwgbGVnZW5kV2lkdGgsIGxlZ2VuZEhlaWdodCk7XHJcbiAgICAgIGNvbnRleHQuc3Ryb2tlUmVjdChsZWdlbmRYLCBsZWdlbmRZLCBsZWdlbmRXaWR0aCwgbGVnZW5kSGVpZ2h0KTtcclxuICAgICAgZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTsgLy8gcmVtb3ZlIHRlbXAgZGl2IChJRSBzdHlsZSlcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlck1hcChtYXAsIHNpemUsIGV4dGVudCkge1xyXG4gICAgbWFwLm9sLnVwZGF0ZVNpemUoKTtcclxuICAgIG1hcC5vbC5yZW5kZXJTeW5jKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYXZlIGRvY3VtZW50XHJcbiAgICogQHBhcmFtICBkb2MgLSBEb2N1bWVudCB0byBzYXZlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVEb2MoZG9jOiBqc1BERikge1xyXG4gICAgYXdhaXQgZG9jLnNhdmUoJ21hcF9nZW9yZWYucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlIHRoZSBiZXN0IEltYWdlIHNpemUgdG8gZml0IGluIHBkZlxyXG4gICAqIEBwYXJhbSBkb2MgLSBQZGYgRG9jdW1lbnRcclxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXHJcbiAgICogQHBhcmFtIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcclxuICAgKi9cclxuICBwcml2YXRlIGdldEltYWdlU2l6ZVRvRml0UGRmKGRvYywgY2FudmFzLCBtYXJnaW5zKSB7XHJcbiAgICAvLyBEZWZpbmUgdmFyaWFibGUgdG8gY2FsY3VsYXRlIGJlc3Qgc2l6ZSB0byBmaXQgaW4gb25lIHBhZ2VcclxuICAgIGNvbnN0IHBhZ2VIZWlnaHQgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSAobWFyZ2luc1swXSArIG1hcmdpbnNbMl0gKyAxMCk7XHJcbiAgICBjb25zdCBwYWdlV2lkdGggPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChtYXJnaW5zWzFdICsgbWFyZ2luc1szXSk7XHJcbiAgICBjb25zdCBjYW5IZWlnaHQgPSB0aGlzLnBkZl91bml0czJwb2ludHMoY2FudmFzLmhlaWdodCwgJ21tJyk7XHJcbiAgICBjb25zdCBjYW5XaWR0aCA9IHRoaXMucGRmX3VuaXRzMnBvaW50cyhjYW52YXMud2lkdGgsICdtbScpO1xyXG5cclxuICAgIGNvbnN0IGhlaWdodFJhdGlvID0gY2FuSGVpZ2h0IC8gcGFnZUhlaWdodDtcclxuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBjYW5XaWR0aCAvIHBhZ2VXaWR0aDtcclxuICAgIGNvbnN0IG1heFJhdGlvID0gaGVpZ2h0UmF0aW8gPiB3aWR0aFJhdGlvID8gaGVpZ2h0UmF0aW8gOiB3aWR0aFJhdGlvO1xyXG4gICAgY29uc3QgaW1nSGVpZ2ggPSBtYXhSYXRpbyA+IDEgPyBjYW5IZWlnaHQgLyBtYXhSYXRpbyA6IGNhbkhlaWdodDtcclxuICAgIGNvbnN0IGltZ1dpZHRoID0gbWF4UmF0aW8gPiAxID8gY2FuV2lkdGggLyBtYXhSYXRpbyA6IGNhbldpZHRoO1xyXG5cclxuICAgIHJldHVybiBbaW1nV2lkdGgsIGltZ0hlaWdoXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHdvcmxkIGZpbGUgaW5mb3JtYXRpb24gZm9yIHRpZmZcclxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRXb3JsZEZpbGVJbmZvcm1hdGlvbihtYXApIHtcclxuICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKTtcclxuICAgIGNvbnN0IGN1cnJlbnRFeHRlbnQgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0RXh0ZW50KCk7IC8vIFJldHVybiBbbWlueCwgbWlueSwgbWF4eCwgbWF4eV1cclxuICAgIHJldHVybiBbXHJcbiAgICAgIGN1cnJlbnRSZXNvbHV0aW9uLFxyXG4gICAgICAwLFxyXG4gICAgICAwLFxyXG4gICAgICAtY3VycmVudFJlc29sdXRpb24sXHJcbiAgICAgIGN1cnJlbnRFeHRlbnRbMF0gKyBjdXJyZW50UmVzb2x1dGlvbiAvIDAuNSxcclxuICAgICAgY3VycmVudEV4dGVudFszXSAtIGN1cnJlbnRSZXNvbHV0aW9uIC8gMC41XHJcbiAgICBdLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2F2ZSBjYW52YXMgaW1hZ2UgYXMgZmlsZVxyXG4gICAqIEBwYXJhbSBjYW52YXMgLSBDYW52YXMgdG8gc2F2ZVxyXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgZmlsZVxyXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBmaWxlIGZvcm1hdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgbmFtZVdpdGhFeHQsIGZvcm1hdCkge1xyXG4gICAgY29uc3QgYmxvYkZvcm1hdCA9ICdpbWFnZS8nICsgZm9ybWF0O1xyXG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FudmFzLnRvRGF0YVVSTCgpOyAvLyBKdXN0IHRvIG1ha2UgdGhlIGNhdGNoIHRyaWdnZXIgd2lodG91dCB0b0Jsb2IgRXJyb3IgdGhyb3cgbm90IGNhdGNoZWRcclxuICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICAgIC8vIGRvd25sb2FkIGltYWdlXHJcbiAgICAgICAgc2F2ZUFzKGJsb2IsIG5hbWVXaXRoRXh0KTtcclxuICAgICAgICB0aGF0LnNhdmVGaWxlUHJvY2Vzc2luZygpO1xyXG4gICAgICB9LCBibG9iRm9ybWF0KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKCdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keScsJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBmaWxlIHRvIGEgemlwXHJcbiAgICogQHBhcmFtIGNhbnZhcyAtIEZpbGUgdG8gYWRkIHRvIHRoZSB6aXBcclxuICAgKiBAcGFyYW0gIG5hbWUgLU5hbWUgb2YgdGhlIGZpbGVvdmVydmlld1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsIG5hbWUpIHtcclxuICAgIGNvbnN0IGJsb2JGb3JtYXQgPSAnaW1hZ2UvJyArICdqcGVnJztcclxuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5oYXNPd25Qcm9wZXJ0eSgnemlwRmlsZScpIHx8XHJcbiAgICAgIHR5cGVvZiB0aGlzLnppcEZpbGUgPT09ICd1bmRlZmluZWQnXHJcbiAgICApIHtcclxuICAgICAgdGhpcy56aXBGaWxlID0gbmV3IEpTWmlwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FudmFzLnRvRGF0YVVSTCgpOyAvLyBKdXN0IHRvIG1ha2UgdGhlIGNhdGNoIHRyaWdnZXIgd2lodG91dCB0b0Jsb2IgRXJyb3IgdGhyb3cgbm90IGNhdGNoZWRcclxuICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XHJcbiAgICAgICAgdGhpcy5hZGRGaWxlVG9aaXAobmFtZSwgY2FudmFzLm1zVG9CbG9iKCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgICAgIHRoYXQuYWRkRmlsZVRvWmlwKG5hbWUsIGJsb2IpO1xyXG4gICAgICAgIH0sIGJsb2JGb3JtYXQpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcignaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknLCdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgZmlsZSB0byB6aXAsIGlmIGFsbCBmaWxlIGFyZSB6aXBwZWQsIGRvd25sb2FkXHJcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlc1xyXG4gICAqIEBwYXJhbSBibG9iIC0gQ29udGFpbiBvZiBmaWxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGRGaWxlVG9aaXAobmFtZSwgYmxvYikge1xyXG4gICAgLy8gYWRkIGZpbGUgdG8gemlwXHJcbiAgICB0aGlzLnppcEZpbGUuZmlsZShuYW1lLCBibG9iKTtcclxuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XHJcblxyXG4gICAgLy8gSWYgYWxsIGZpbGVzIGFyZSBwcm9jY2Vzc2VkXHJcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcclxuICAgICAgLy8gRG93bmxvYWQgemlwIGZpbGVcclxuICAgICAgdGhpcy5nZXRaaXBGaWxlKCk7XHJcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xyXG4gICAgICB0aGlzLmFjdGl2aXR5U2VydmljZS51bnJlZ2lzdGVyKHRoaXMuYWN0aXZpdHlJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVGaWxlUHJvY2Vzc2luZygpIHtcclxuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XHJcblxyXG4gICAgLy8gSWYgYWxsIGZpbGVzIGFyZSBwcm9jY2Vzc2VkXHJcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcclxuICAgICAgLy8gU3RvcCBsb2FkaW5nXHJcbiAgICAgIHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5hY3Rpdml0eUlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgemlwcGVkIGZpbGVcclxuICAgKiBAcmV0dXJuIFJldHVuIGEgemlwIGZpbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldFppcEZpbGUoKSB7XHJcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuICAgIHRoaXMuemlwRmlsZS5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2IpID0+IHtcclxuICAgICAgLy8gMSkgZ2VuZXJhdGUgdGhlIHppcCBmaWxlXHJcbiAgICAgIHNhdmVBcyhibG9iLCAnbWFwLnppcCcpO1xyXG4gICAgICBkZWxldGUgdGhhdC56aXBGaWxlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBwZGZfdW5pdHMycG9pbnRzKG4sIHVuaXQpOiBudW1iZXIge1xyXG4gICAgbGV0IGsgPSAxO1xyXG5cclxuICAgIC8vIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIGpzUERGXHJcbiAgICAvLyAgYXMgaXQgZG9lcyBub3QgZXhwb3NlIGEgcHVibGljIEFQSVxyXG4gICAgLy8gIGZvciBjb252ZXJ0aW5nIHVuaXRzIHRvIHBvaW50cy5cclxuICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICAgIGNhc2UgJ3B0JzpcclxuICAgICAgICAgICAgayA9IDE7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ21tJzpcclxuICAgICAgICAgICAgayA9IDcyIC8gMjUuNDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnY20nOlxyXG4gICAgICAgICAgICBrID0gNzIgLyAyLjU0O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdpbic6XHJcbiAgICAgICAgICAgIGsgPSA3MjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncHgnOlxyXG4gICAgICAgICAgICBrID0gOTYgLyA3MjtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncGMnOlxyXG4gICAgICAgICAgICBrID0gMTI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2VtJzpcclxuICAgICAgICAgICAgayA9IDEyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdleCc6XHJcbiAgICAgICAgICAgIGsgPSA2O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdW5pdDogJyArIHVuaXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuICogaztcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|