@igo2/geo 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/icons/cross_black_18px.svg +88 -88
- package/assets/icons/place_blue_36px.svg +55 -55
- package/assets/icons/place_green_36px.svg +55 -55
- package/assets/icons/place_red_36px.svg +55 -55
- package/assets/icons/place_yellow_36px.svg +55 -55
- package/bundles/igo2-geo.umd.js +3651 -2762
- package/bundles/igo2-geo.umd.js.map +1 -1
- package/esm2015/lib/catalog/catalog-browser/catalog-browser-group.component.js +2 -2
- package/esm2015/lib/catalog/catalog-browser/catalog-browser-layer.component.js +2 -2
- package/esm2015/lib/catalog/catalog-browser/catalog-browser.module.js +1 -1
- package/esm2015/lib/catalog/catalog-library/add-catalog-dialog.component.js +72 -53
- package/esm2015/lib/catalog/catalog-library/catalog-library.component.js +2 -1
- package/esm2015/lib/catalog/catalog.module.js +1 -1
- package/esm2015/lib/catalog/shared/catalog.abstract.js +1 -1
- package/esm2015/lib/catalog/shared/catalog.interface.js +1 -1
- package/esm2015/lib/catalog/shared/catalog.service.js +13 -3
- package/esm2015/lib/catalog/shared/index.js +1 -1
- package/esm2015/lib/datasource/datasource.module.js +1 -1
- package/esm2015/lib/datasource/index.js +1 -1
- package/esm2015/lib/datasource/shared/capabilities.service.js +4 -4
- package/esm2015/lib/datasource/shared/datasources/carto-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/carto-datasource.js +2 -2
- package/esm2015/lib/datasource/shared/datasources/cluster-datasource.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/data.service.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/datasource.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/mvt-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/mvt-datasource.js +2 -2
- package/esm2015/lib/datasource/shared/datasources/osm-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/websocket-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/websocket-datasource.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/wfs-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/wfs.service.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/wms-wfs.utils.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/wmts-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/xyz-datasource.interface.js +1 -1
- package/esm2015/lib/datasource/shared/datasources/xyz-datasource.js +1 -1
- package/esm2015/lib/datasource/shared/index.js +1 -1
- package/esm2015/lib/datasource/shared/options/index.js +1 -1
- package/esm2015/lib/datasource/shared/options/options-api.interface.js +1 -1
- package/esm2015/lib/datasource/shared/options/options-api.providers.js +1 -1
- package/esm2015/lib/datasource/shared/options/options-api.service.js +1 -1
- package/esm2015/lib/datasource/shared/options/options.service.js +1 -1
- package/esm2015/lib/datasource/utils/esri-style-generator.js +1 -1
- package/esm2015/lib/datasource/utils/index.js +1 -1
- package/esm2015/lib/datasource/utils/tilegrid.js +1 -1
- package/esm2015/lib/directions/directions-buttons/directions-buttons.component.js +223 -0
- package/esm2015/lib/directions/directions-buttons/index.js +2 -0
- package/esm2015/lib/directions/directions-inputs/directions-inputs.component.js +300 -0
- package/esm2015/lib/directions/directions-inputs/index.js +2 -0
- package/esm2015/lib/directions/directions-results/directions-results.component.js +204 -0
- package/esm2015/lib/directions/directions-results/index.js +2 -0
- package/esm2015/lib/directions/directions-sources/directions-source.interface.js +1 -1
- package/esm2015/lib/directions/directions-sources/directions-source.js +1 -1
- package/esm2015/lib/directions/directions-sources/directions-source.provider.js +1 -1
- package/esm2015/lib/directions/directions-sources/index.js +1 -1
- package/esm2015/lib/directions/directions-sources/osrm-directions-source.js +11 -2
- package/esm2015/lib/directions/directions.component.js +314 -0
- package/esm2015/lib/directions/directions.module.js +31 -10
- package/esm2015/lib/directions/index.js +5 -2
- package/esm2015/lib/directions/shared/directions-source.service.js +1 -1
- package/esm2015/lib/directions/shared/directions.enum.js +20 -3
- package/esm2015/lib/directions/shared/directions.interface.js +1 -1
- package/esm2015/lib/directions/shared/directions.service.js +1 -1
- package/esm2015/lib/directions/shared/directions.utils.js +507 -0
- package/esm2015/lib/directions/shared/index.js +3 -1
- package/esm2015/lib/directions/shared/store.js +24 -0
- package/esm2015/lib/download/download-button/download-button.component.js +1 -1
- package/esm2015/lib/download/download-button/index.js +1 -1
- package/esm2015/lib/download/download.module.js +1 -1
- package/esm2015/lib/download/index.js +1 -1
- package/esm2015/lib/download/shared/download.interface.js +1 -1
- package/esm2015/lib/download/shared/download.service.js +1 -1
- package/esm2015/lib/download/shared/index.js +1 -1
- package/esm2015/lib/draw/draw/draw-popup.component.js +6 -5
- package/esm2015/lib/draw/draw/draw.component.js +22 -17
- package/esm2015/lib/draw/shared/draw.utils.js +1 -1
- package/esm2015/lib/feature/feature-details/feature-details.directive.js +1 -1
- package/esm2015/lib/feature/feature-details/feature-details.module.js +1 -1
- package/esm2015/lib/feature/feature-form/feature-form.component.js +1 -1
- package/esm2015/lib/feature/feature-form/feature-form.module.js +1 -1
- package/esm2015/lib/feature/feature.module.js +1 -1
- package/esm2015/lib/feature/index.js +1 -1
- package/esm2015/lib/feature/shared/feature.enums.js +1 -1
- package/esm2015/lib/feature/shared/feature.interfaces.js +1 -1
- package/esm2015/lib/feature/shared/index.js +1 -1
- package/esm2015/lib/feature/shared/strategies/in-map-extent.js +1 -1
- package/esm2015/lib/feature/shared/strategies/in-map-resolution.js +1 -1
- package/esm2015/lib/feature/shared/strategies/index.js +1 -1
- package/esm2015/lib/feature/shared/strategies/loading-layer.js +1 -1
- package/esm2015/lib/feature/shared/strategies/loading.js +1 -1
- package/esm2015/lib/feature/shared/strategies/selection.js +5 -9
- package/esm2015/lib/feature/shared/strategies.utils.js +1 -1
- package/esm2015/lib/filter/filter.module.js +7 -4
- package/esm2015/lib/filter/ogc-filter-button/index.js +1 -1
- package/esm2015/lib/filter/ogc-filter-button/ogc-filter-button.component.js +1 -1
- package/esm2015/lib/filter/ogc-filter-form/index.js +1 -1
- package/esm2015/lib/filter/ogc-filter-form/ogc-filter-form.component.js +3 -3
- package/esm2015/lib/filter/ogc-filter-selection/ogc-filter-selection.component.js +1 -1
- package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time.component.js +240 -121
- package/esm2015/lib/filter/ogc-filterable-form/index.js +1 -1
- package/esm2015/lib/filter/ogc-filterable-item/index.js +1 -1
- package/esm2015/lib/filter/ogc-filterable-item/ogc-filterable-item.component.js +2 -2
- package/esm2015/lib/filter/ogc-filterable-list/index.js +1 -1
- package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.js +1 -1
- package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list.component.js +1 -1
- package/esm2015/lib/filter/shared/filterable-datasource.pipe.js +1 -1
- package/esm2015/lib/filter/shared/index.js +1 -1
- package/esm2015/lib/filter/shared/ogc-filter.enum.js +1 -1
- package/esm2015/lib/filter/shared/ogc-filter.interface.js +1 -1
- package/esm2015/lib/filter/shared/ogc-filter.js +1 -1
- package/esm2015/lib/filter/shared/ogc-filter.service.js +1 -1
- package/esm2015/lib/filter/shared/spatial-filter.enum.js +1 -1
- package/esm2015/lib/filter/shared/spatial-filter.interface.js +1 -1
- package/esm2015/lib/filter/shared/time-filter.enum.js +1 -1
- package/esm2015/lib/filter/shared/time-filter.interface.js +1 -1
- package/esm2015/lib/filter/shared/time-filter.service.js +1 -1
- package/esm2015/lib/filter/spatial-filter/spatial-filter-item/index.js +1 -1
- package/esm2015/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.js +185 -95
- package/esm2015/lib/filter/spatial-filter/spatial-filter-list/index.js +1 -1
- package/esm2015/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.js +1 -1
- package/esm2015/lib/filter/spatial-filter/spatial-filter-type/index.js +1 -1
- package/esm2015/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.js +1 -1
- package/esm2015/lib/filter/time-filter-button/index.js +1 -1
- package/esm2015/lib/filter/time-filter-button/time-filter-button.component.js +1 -1
- package/esm2015/lib/filter/time-filter-form/index.js +1 -1
- package/esm2015/lib/filter/time-filter-form/time-filter-form.component.js +1 -1
- package/esm2015/lib/filter/time-filter-item/index.js +1 -1
- package/esm2015/lib/filter/time-filter-item/time-filter-item.component.js +2 -2
- package/esm2015/lib/filter/time-filter-list/index.js +1 -1
- package/esm2015/lib/filter/time-filter-list/time-filter-list-binding.directive.js +1 -1
- package/esm2015/lib/filter/time-filter-list/time-filter-list.component.js +1 -1
- package/esm2015/lib/geometry/geometry-form-field/geometry-form-field-input.component.js +3 -3
- package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.component.js +1 -1
- package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.module.js +1 -1
- package/esm2015/lib/geometry/geometry.module.js +1 -1
- package/esm2015/lib/geometry/index.js +1 -1
- package/esm2015/lib/geometry/shared/controls/draw.js +1 -1
- package/esm2015/lib/geometry/shared/controls/index.js +1 -1
- package/esm2015/lib/geometry/shared/geometry.errors.js +3 -3
- package/esm2015/lib/geometry/shared/index.js +1 -1
- package/esm2015/lib/import-export/export-button/export-button.component.js +1 -1
- package/esm2015/lib/import-export/export-button/index.js +1 -1
- package/esm2015/lib/import-export/import-export/import-export.component.js +179 -66
- package/esm2015/lib/import-export/import-export.module.js +1 -1
- package/esm2015/lib/import-export/index.js +1 -1
- package/esm2015/lib/import-export/shared/drop-geo-file.directive.js +1 -1
- package/esm2015/lib/import-export/shared/export.errors.js +1 -1
- package/esm2015/lib/import-export/shared/export.interface.js +1 -1
- package/esm2015/lib/import-export/shared/export.type.js +1 -1
- package/esm2015/lib/import-export/shared/export.utils.js +1 -1
- package/esm2015/lib/import-export/shared/import.interface.js +1 -1
- package/esm2015/lib/import-export/shared/import.service.js +1 -1
- package/esm2015/lib/import-export/shared/import.utils.js +1 -1
- package/esm2015/lib/import-export/shared/index.js +1 -1
- package/esm2015/lib/import-export/style-list/index.js +1 -1
- package/esm2015/lib/import-export/style-list/style-list.interface.js +1 -1
- package/esm2015/lib/import-export/style-list/style-list.module.js +1 -1
- package/esm2015/lib/import-export/style-list/style-list.provider.js +1 -1
- package/esm2015/lib/import-export/style-list/style-list.service.js +1 -1
- package/esm2015/lib/layer/index.js +1 -1
- package/esm2015/lib/layer/layer-item/index.js +1 -1
- package/esm2015/lib/layer/layer-item/layer-item.component.js +3 -3
- package/esm2015/lib/layer/layer-legend/index.js +1 -1
- package/esm2015/lib/layer/layer-legend/layer-legend.component.js +23 -16
- package/esm2015/lib/layer/layer-legend-item/index.js +1 -1
- package/esm2015/lib/layer/layer-legend-item/layer-legend-item.component.js +1 -1
- package/esm2015/lib/layer/layer-legend-list/index.js +1 -1
- package/esm2015/lib/layer/layer-legend-list/layer-legend-list-binding.directive.js +1 -1
- package/esm2015/lib/layer/layer-legend-list/layer-legend-list.component.js +5 -5
- package/esm2015/lib/layer/layer-list/index.js +1 -1
- package/esm2015/lib/layer/layer-list/layer-list-binding.directive.js +1 -1
- package/esm2015/lib/layer/layer-list/layer-list.component.js +44 -44
- package/esm2015/lib/layer/layer-list/layer-list.enum.js +1 -1
- package/esm2015/lib/layer/layer-list-tool/index.js +1 -1
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.component.js +2 -2
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.enum.js +1 -1
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.interface.js +1 -1
- package/esm2015/lib/layer/layer-list-tool/layer-list-tool.service.js +1 -1
- package/esm2015/lib/layer/layer.module.js +8 -5
- package/esm2015/lib/layer/shared/clusterParam.js +1 -1
- package/esm2015/lib/layer/shared/index.js +1 -1
- package/esm2015/lib/layer/shared/layer.enums.js +1 -1
- package/esm2015/lib/layer/shared/layer.service.js +20 -17
- package/esm2015/lib/layer/shared/layers/any-layer.interface.js +1 -1
- package/esm2015/lib/layer/shared/layers/any-layer.js +1 -1
- package/esm2015/lib/layer/shared/layers/image-layer.js +9 -4
- package/esm2015/lib/layer/shared/layers/index.js +1 -1
- package/esm2015/lib/layer/shared/layers/layer.js +15 -5
- package/esm2015/lib/layer/shared/layers/tile-layer.js +23 -3
- package/esm2015/lib/layer/shared/layers/vector-layer.interface.js +1 -1
- package/esm2015/lib/layer/shared/layers/vector-layer.js +20 -10
- package/esm2015/lib/layer/shared/layers/vectortile-layer.interface.js +1 -1
- package/esm2015/lib/layer/shared/layers/vectortile-layer.js +13 -3
- package/esm2015/lib/layer/shared/style.service.js +21 -16
- package/esm2015/lib/layer/shared/vector-style.interface.js +1 -1
- package/esm2015/lib/layer/track-feature-button/index.js +1 -1
- package/esm2015/lib/layer/track-feature-button/track-feature-button.component.js +1 -1
- package/esm2015/lib/layer/utils/index.js +2 -1
- package/esm2015/lib/layer/utils/layer.utils.js +11 -0
- package/esm2015/lib/layer/utils/layerSync-watcher.js +1 -1
- package/esm2015/lib/layer/utils/tile-watcher.js +1 -1
- package/esm2015/lib/map/baselayers-switcher/baselayers-switcher.animation.js +1 -1
- package/esm2015/lib/map/baselayers-switcher/index.js +1 -1
- package/esm2015/lib/map/baselayers-switcher/mini-basemap.component.js +1 -1
- package/esm2015/lib/map/geolocate-button/geolocate-button.component.js +1 -1
- package/esm2015/lib/map/geolocate-button/index.js +1 -1
- package/esm2015/lib/map/index.js +2 -1
- package/esm2015/lib/map/map-browser/index.js +1 -1
- package/esm2015/lib/map/map-browser/map-browser.component.js +1 -1
- package/esm2015/lib/map/map.module.js +10 -5
- package/esm2015/lib/map/menu-button/index.js +2 -0
- package/esm2015/lib/map/menu-button/menu-button.component.js +66 -0
- package/esm2015/lib/map/offline-button/index.js +1 -1
- package/esm2015/lib/map/offline-button/offline-button.component.js +1 -1
- package/esm2015/lib/map/rotation-button/index.js +1 -1
- package/esm2015/lib/map/rotation-button/rotation-button.component.js +1 -1
- package/esm2015/lib/map/shared/controllers/index.js +1 -1
- package/esm2015/lib/map/shared/hover-feature.directive.js +231 -80
- package/esm2015/lib/map/shared/map-pointer-position.directive.js +3 -1
- package/esm2015/lib/map/shared/map.enums.js +1 -1
- package/esm2015/lib/map/shared/map.interface.js +1 -1
- package/esm2015/lib/map/shared/map.js +38 -16
- package/esm2015/lib/map/shared/map.service.js +1 -1
- package/esm2015/lib/map/shared/map.utils.js +7 -3
- package/esm2015/lib/map/shared/projection.service.js +1 -1
- package/esm2015/lib/map/shared/projection.utils.js +1 -1
- package/esm2015/lib/map/swipe-control/swipe-control.component.js +1 -1
- package/esm2015/lib/map/zoom-button/index.js +1 -1
- package/esm2015/lib/map/zoom-button/zoom-button.component.js +1 -1
- package/esm2015/lib/measure/index.js +1 -1
- package/esm2015/lib/measure/measure.module.js +1 -1
- package/esm2015/lib/measure/measurer/measure-format.pipe.js +1 -1
- package/esm2015/lib/measure/measurer/measurer-dialog.component.js +188 -176
- package/esm2015/lib/measure/measurer/measurer-item.component.js +17 -12
- package/esm2015/lib/measure/measurer/measurer.component.js +170 -69
- package/esm2015/lib/measure/measurer/measurer.module.js +13 -8
- package/esm2015/lib/measure/shared/index.js +1 -1
- package/esm2015/lib/measure/shared/measure.enum.js +1 -1
- package/esm2015/lib/measure/shared/measure.interfaces.js +1 -1
- package/esm2015/lib/measure/shared/measure.utils.js +1 -1
- package/esm2015/lib/metadata/index.js +1 -1
- package/esm2015/lib/metadata/metadata-button/index.js +1 -1
- package/esm2015/lib/metadata/shared/index.js +1 -1
- package/esm2015/lib/metadata/shared/metadata.service.js +1 -1
- package/esm2015/lib/overlay/index.js +1 -1
- package/esm2015/lib/overlay/overlay.module.js +1 -1
- package/esm2015/lib/overlay/shared/index.js +1 -1
- package/esm2015/lib/overlay/shared/overlay-marker-style.utils.js +2 -2
- package/esm2015/lib/overlay/shared/overlay.directive.js +1 -1
- package/esm2015/lib/overlay/shared/overlay.enum.js +1 -1
- package/esm2015/lib/overlay/shared/overlay.service.js +1 -1
- package/esm2015/lib/print/index.js +1 -1
- package/esm2015/lib/print/print-form/index.js +1 -1
- package/esm2015/lib/print/print.module.js +1 -1
- package/esm2015/lib/print/shared/index.js +1 -1
- package/esm2015/lib/print/shared/print.service.js +1 -1
- package/esm2015/lib/query/index.js +1 -1
- package/esm2015/lib/query/query.module.js +1 -1
- package/esm2015/lib/query/shared/index.js +1 -1
- package/esm2015/lib/query/shared/query-search-source.js +1 -1
- package/esm2015/lib/query/shared/query-search-source.providers.js +1 -1
- package/esm2015/lib/query/shared/query.directive.js +4 -4
- package/esm2015/lib/query/shared/query.enums.js +1 -1
- package/esm2015/lib/query/shared/query.interfaces.js +1 -1
- package/esm2015/lib/query/shared/query.service.js +24 -3
- package/esm2015/lib/query/shared/query.utils.js +19 -1
- package/esm2015/lib/search/index.js +1 -1
- package/esm2015/lib/search/search-bar/search-bar.component.js +2 -2
- package/esm2015/lib/search/search-bar/search-bar.module.js +1 -1
- package/esm2015/lib/search/search-bar/search-url-param.directive.js +1 -1
- package/esm2015/lib/search/search-results/search-results-add-button.component.js +2 -2
- package/esm2015/lib/search/search-results/search-results-item.component.js +1 -1
- package/esm2015/lib/search/search-results/search-results.component.js +1 -1
- package/esm2015/lib/search/search-results/search-results.module.js +1 -1
- package/esm2015/lib/search/search-selector/search-selector.component.js +1 -1
- package/esm2015/lib/search/search-selector/search-selector.module.js +1 -1
- package/esm2015/lib/search/search-settings/search-settings.module.js +1 -1
- package/esm2015/lib/search/shared/index.js +1 -1
- package/esm2015/lib/search/shared/search-pointer-summary.directive.js +17 -6
- package/esm2015/lib/search/shared/search-source-service.providers.js +1 -1
- package/esm2015/lib/search/shared/search-source.service.js +1 -1
- package/esm2015/lib/search/shared/search.enums.js +1 -1
- package/esm2015/lib/search/shared/search.interfaces.js +1 -1
- package/esm2015/lib/search/shared/search.utils.js +1 -1
- package/esm2015/lib/search/shared/sources/cadastre.js +9 -2
- package/esm2015/lib/search/shared/sources/coordinates.interfaces.js +1 -1
- package/esm2015/lib/search/shared/sources/coordinates.js +9 -2
- package/esm2015/lib/search/shared/sources/icherche.js +17 -4
- package/esm2015/lib/search/shared/sources/ilayer.interfaces.js +1 -1
- package/esm2015/lib/search/shared/sources/ilayer.js +9 -2
- package/esm2015/lib/search/shared/sources/index.js +1 -1
- package/esm2015/lib/search/shared/sources/nominatim.interfaces.js +1 -1
- package/esm2015/lib/search/shared/sources/nominatim.js +9 -2
- package/esm2015/lib/search/shared/sources/storedqueries.interfaces.js +1 -1
- package/esm2015/lib/search/shared/sources/storedqueries.js +20 -12
- package/esm2015/lib/toast/index.js +1 -1
- package/esm2015/lib/toast/toast.component.js +1 -1
- package/esm2015/lib/toast/toast.module.js +1 -1
- package/esm2015/lib/utils/commonVectorStyle.interface.js +1 -1
- package/esm2015/lib/utils/googleLinks.js +1 -1
- package/esm2015/lib/utils/osmLinks.js +1 -1
- package/esm2015/lib/wkt/index.js +1 -1
- package/esm2015/lib/wkt/shared/index.js +1 -1
- package/esm2015/lib/wkt/shared/wkt.service.js +15 -15
- package/esm2015/lib/wkt/wkt.module.js +1 -1
- package/esm2015/lib/workspace/index.js +1 -1
- package/esm2015/lib/workspace/shared/feature-workspace.js +1 -1
- package/esm2015/lib/workspace/shared/feature-workspace.service.js +1 -1
- package/esm2015/lib/workspace/shared/index.js +1 -1
- package/esm2015/lib/workspace/shared/wfs-workspace.js +1 -1
- package/esm2015/lib/workspace/shared/wfs-workspace.service.js +1 -1
- package/esm2015/lib/workspace/shared/wms-workspace.service.js +1 -1
- package/esm2015/lib/workspace/widgets/index.js +1 -1
- package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.component.js +1 -1
- package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.module.js +1 -1
- package/esm2015/lib/workspace/widgets/widgets.js +1 -1
- package/esm2015/lib/workspace/workspace-selector/workspace-selector.directive.js +1 -1
- package/esm2015/lib/workspace/workspace-selector/workspace-selector.module.js +1 -1
- package/esm2015/lib/workspace/workspace-updator/workspace-updator.directive.js +1 -1
- package/esm2015/lib/workspace/workspace-updator/workspace-updator.module.js +1 -1
- package/esm2015/lib/workspace/workspace.module.js +1 -1
- package/fesm2015/igo2-geo.js +3221 -2431
- package/fesm2015/igo2-geo.js.map +1 -1
- package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +1 -1
- package/lib/datasource/shared/datasources/datasource.interface.d.ts +1 -0
- package/lib/directions/directions-buttons/directions-buttons.component.d.ts +29 -0
- package/lib/directions/directions-buttons/index.d.ts +1 -0
- package/lib/directions/directions-inputs/directions-inputs.component.d.ts +45 -0
- package/lib/directions/directions-inputs/index.d.ts +1 -0
- package/lib/directions/directions-results/directions-results.component.d.ts +30 -0
- package/lib/directions/directions-results/index.d.ts +1 -0
- package/lib/directions/directions-sources/directions-source.d.ts +2 -2
- package/lib/directions/directions-sources/osrm-directions-source.d.ts +2 -2
- package/lib/directions/directions.component.d.ts +55 -0
- package/lib/directions/directions.module.d.ts +19 -16
- package/lib/directions/index.d.ts +4 -1
- package/lib/directions/shared/directions.enum.d.ts +16 -2
- package/lib/directions/shared/directions.interface.d.ts +53 -3
- package/lib/directions/shared/directions.service.d.ts +3 -3
- package/lib/directions/shared/directions.utils.d.ts +42 -0
- package/lib/directions/shared/index.d.ts +2 -0
- package/lib/directions/shared/store.d.ts +18 -0
- package/lib/draw/draw/draw-popup.component.d.ts +6 -2
- package/lib/feature/shared/strategies/selection.d.ts +1 -0
- package/lib/filter/filter.module.d.ts +1 -1
- package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +6 -1
- package/lib/filter/shared/ogc-filter.interface.d.ts +1 -0
- package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +7 -2
- package/lib/import-export/import-export/import-export.component.d.ts +2 -0
- package/lib/import-export/shared/export.interface.d.ts +2 -1
- package/lib/layer/layer-legend/layer-legend.component.d.ts +0 -1
- package/lib/layer/layer.module.d.ts +1 -1
- package/lib/layer/shared/layer.service.d.ts +1 -1
- package/lib/layer/shared/layers/layer.d.ts +1 -0
- package/lib/layer/shared/layers/tile-layer.d.ts +10 -1
- package/lib/layer/shared/layers/vector-layer.interface.d.ts +1 -0
- package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +1 -0
- package/lib/layer/shared/style.service.d.ts +4 -1
- package/lib/layer/shared/vector-style.interface.d.ts +9 -5
- package/lib/layer/utils/index.d.ts +1 -0
- package/lib/layer/utils/layer.utils.d.ts +2 -0
- package/lib/map/index.d.ts +1 -0
- package/lib/map/map.module.d.ts +8 -7
- package/lib/map/menu-button/index.d.ts +1 -0
- package/lib/map/menu-button/menu-button.component.d.ts +17 -0
- package/lib/map/shared/hover-feature.directive.d.ts +14 -5
- package/lib/map/shared/map.d.ts +2 -1
- package/lib/map/shared/map.interface.d.ts +1 -0
- package/lib/map/shared/map.utils.d.ts +1 -1
- package/lib/measure/measurer/measurer.component.d.ts +10 -0
- package/lib/measure/measurer/measurer.module.d.ts +4 -3
- package/lib/query/shared/query.interfaces.d.ts +2 -0
- package/lib/query/shared/query.service.d.ts +9 -1
- package/lib/query/shared/query.utils.d.ts +12 -0
- package/lib/search/shared/search-pointer-summary.directive.d.ts +6 -0
- package/lib/search/shared/search.interfaces.d.ts +1 -0
- package/ngcc.config.js +3 -3
- package/package.json +14 -13
- package/esm2015/lib/directions/directions-form/directions-form-binding.directive.js +0 -99
- package/esm2015/lib/directions/directions-form/directions-form.component.js +0 -1537
- package/esm2015/lib/directions/directions-form/directions-form.service.js +0 -26
- package/esm2015/lib/directions/directions-form/index.js +0 -4
- package/lib/directions/directions-form/directions-form-binding.directive.d.ts +0 -18
- package/lib/directions/directions-form/directions-form.component.d.ts +0 -137
- package/lib/directions/directions-form/directions-form.service.d.ts +0 -11
- package/lib/directions/directions-form/index.d.ts +0 -3
|
@@ -1,1537 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, Optional } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import { Subject, BehaviorSubject } from 'rxjs';
|
|
4
|
-
import { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';
|
|
5
|
-
import olFeature from 'ol/Feature';
|
|
6
|
-
import OlGeoJSON from 'ol/format/GeoJSON';
|
|
7
|
-
import * as olgeom from 'ol/geom';
|
|
8
|
-
import * as olproj from 'ol/proj';
|
|
9
|
-
import * as olstyle from 'ol/style';
|
|
10
|
-
import * as olcondition from 'ol/events/condition';
|
|
11
|
-
import * as olinteraction from 'ol/interaction';
|
|
12
|
-
import * as olobservable from 'ol/Observable';
|
|
13
|
-
import { Clipboard } from '@igo2/utils';
|
|
14
|
-
import { getEntityTitle } from '@igo2/common';
|
|
15
|
-
import { VectorLayer } from '../../layer/shared/layers/vector-layer';
|
|
16
|
-
import { FeatureDataSource } from '../../datasource/shared/datasources/feature-datasource';
|
|
17
|
-
import { FeatureMotion, FEATURE } from '../../feature/shared/feature.enums';
|
|
18
|
-
import { moveToOlFeatures, tryBindStoreLayer } from '../../feature/shared/feature.utils';
|
|
19
|
-
import { tryAddLoadingStrategy } from '../../feature/shared/strategies.utils';
|
|
20
|
-
import { FeatureStoreLoadingStrategy } from '../../feature/shared/strategies/loading';
|
|
21
|
-
import { roundCoordTo } from '../../map/shared/map.utils';
|
|
22
|
-
import { createOverlayMarkerStyle } from '../../overlay/shared/overlay-marker-style.utils';
|
|
23
|
-
import * as i0 from "@angular/core";
|
|
24
|
-
import * as i1 from "@angular/forms";
|
|
25
|
-
import * as i2 from "../shared/directions.service";
|
|
26
|
-
import * as i3 from "@igo2/core";
|
|
27
|
-
import * as i4 from "../../search/shared/search.service";
|
|
28
|
-
import * as i5 from "../../query/shared/query.service";
|
|
29
|
-
import * as i6 from "./directions-form.service";
|
|
30
|
-
import * as i7 from "@angular/common";
|
|
31
|
-
import * as i8 from "@angular/material/button";
|
|
32
|
-
import * as i9 from "@angular/material/tooltip";
|
|
33
|
-
import * as i10 from "@angular/material/icon";
|
|
34
|
-
import * as i11 from "@angular/material/list";
|
|
35
|
-
import * as i12 from "@angular/material/form-field";
|
|
36
|
-
import * as i13 from "@angular/material/input";
|
|
37
|
-
import * as i14 from "@angular/material/autocomplete";
|
|
38
|
-
import * as i15 from "@angular/material/core";
|
|
39
|
-
import * as i16 from "@angular/material/divider";
|
|
40
|
-
import * as i17 from "@angular/material/select";
|
|
41
|
-
import * as i18 from "@ngx-translate/core";
|
|
42
|
-
function DirectionsFormComponent_div_1_button_4_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
-
const _r16 = i0.ɵɵgetCurrentView();
|
|
44
|
-
i0.ɵɵelementStart(0, "button", 17);
|
|
45
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_div_1_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const i_r7 = i0.ɵɵnextContext().index; const ctx_r14 = i0.ɵɵnextContext(); return ctx_r14.geolocateStop(i_r7); });
|
|
46
|
-
i0.ɵɵpipe(1, "translate");
|
|
47
|
-
i0.ɵɵelement(2, "mat-icon", 18);
|
|
48
|
-
i0.ɵɵelementEnd();
|
|
49
|
-
} if (rf & 2) {
|
|
50
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.geolocate"));
|
|
51
|
-
} }
|
|
52
|
-
function DirectionsFormComponent_div_1_button_8_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
-
const _r19 = i0.ɵɵgetCurrentView();
|
|
54
|
-
i0.ɵɵelementStart(0, "button", 19);
|
|
55
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_div_1_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const i_r7 = i0.ɵɵnextContext().index; const ctx_r17 = i0.ɵɵnextContext(); return ctx_r17.clearStop(i_r7); });
|
|
56
|
-
i0.ɵɵelement(1, "mat-icon", 20);
|
|
57
|
-
i0.ɵɵelementEnd();
|
|
58
|
-
} }
|
|
59
|
-
function DirectionsFormComponent_div_1_mat_optgroup_11_mat_option_1_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
-
const _r24 = i0.ɵɵgetCurrentView();
|
|
61
|
-
i0.ɵɵelementStart(0, "mat-option", 23);
|
|
62
|
-
i0.ɵɵlistener("onSelectionChange", function DirectionsFormComponent_div_1_mat_optgroup_11_mat_option_1_Template_mat_option_onSelectionChange_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r24); const result_r22 = restoredCtx.$implicit; const i_r7 = i0.ɵɵnextContext(2).index; const ctx_r23 = i0.ɵɵnextContext(); return ctx_r23.chooseProposal(result_r22, i_r7); });
|
|
63
|
-
i0.ɵɵtext(1);
|
|
64
|
-
i0.ɵɵelementEnd();
|
|
65
|
-
} if (rf & 2) {
|
|
66
|
-
const result_r22 = ctx.$implicit;
|
|
67
|
-
i0.ɵɵproperty("value", result_r22.meta ? result_r22.meta.title : "")("matTooltip", result_r22.meta ? result_r22.meta.title : "");
|
|
68
|
-
i0.ɵɵadvance(1);
|
|
69
|
-
i0.ɵɵtextInterpolate1(" ", result_r22.meta ? result_r22.meta.title : "", " ");
|
|
70
|
-
} }
|
|
71
|
-
function DirectionsFormComponent_div_1_mat_optgroup_11_Template(rf, ctx) { if (rf & 1) {
|
|
72
|
-
i0.ɵɵelementStart(0, "mat-optgroup", 21);
|
|
73
|
-
i0.ɵɵtemplate(1, DirectionsFormComponent_div_1_mat_optgroup_11_mat_option_1_Template, 2, 3, "mat-option", 22);
|
|
74
|
-
i0.ɵɵelementEnd();
|
|
75
|
-
} if (rf & 2) {
|
|
76
|
-
const source_r20 = ctx.$implicit;
|
|
77
|
-
i0.ɵɵproperty("label", source_r20.source.title)("disabled", source_r20.source.enabled === false);
|
|
78
|
-
i0.ɵɵadvance(1);
|
|
79
|
-
i0.ɵɵproperty("ngForOf", source_r20.results);
|
|
80
|
-
} }
|
|
81
|
-
function DirectionsFormComponent_div_1_button_12_Template(rf, ctx) { if (rf & 1) {
|
|
82
|
-
const _r28 = i0.ɵɵgetCurrentView();
|
|
83
|
-
i0.ɵɵelementStart(0, "button", 24);
|
|
84
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_div_1_button_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const i_r7 = i0.ɵɵnextContext().index; const ctx_r26 = i0.ɵɵnextContext(); return ctx_r26.removeStop(i_r7); });
|
|
85
|
-
i0.ɵɵpipe(1, "translate");
|
|
86
|
-
i0.ɵɵelement(2, "mat-icon", 25);
|
|
87
|
-
i0.ɵɵelementEnd();
|
|
88
|
-
} if (rf & 2) {
|
|
89
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.removeStop"));
|
|
90
|
-
} }
|
|
91
|
-
function DirectionsFormComponent_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
-
const _r30 = i0.ɵɵgetCurrentView();
|
|
93
|
-
i0.ɵɵelementStart(0, "div", 8, 9);
|
|
94
|
-
i0.ɵɵelementStart(2, "mat-list-item", 10);
|
|
95
|
-
i0.ɵɵelementStart(3, "div", 11);
|
|
96
|
-
i0.ɵɵtemplate(4, DirectionsFormComponent_div_1_button_4_Template, 3, 3, "button", 12);
|
|
97
|
-
i0.ɵɵelementStart(5, "mat-form-field");
|
|
98
|
-
i0.ɵɵelementStart(6, "input", 13);
|
|
99
|
-
i0.ɵɵlistener("focus", function DirectionsFormComponent_div_1_Template_input_focus_6_listener() { const restoredCtx = i0.ɵɵrestoreView(_r30); const i_r7 = restoredCtx.index; const ctx_r29 = i0.ɵɵnextContext(); return ctx_r29.focus(i_r7); })("keyup", function DirectionsFormComponent_div_1_Template_input_keyup_6_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r30); const i_r7 = restoredCtx.index; const ctx_r31 = i0.ɵɵnextContext(); return ctx_r31.keyup(i_r7, $event); })("keydown.enter", function DirectionsFormComponent_div_1_Template_input_keydown_enter_6_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r32 = i0.ɵɵnextContext(); return ctx_r32.prevent($event); });
|
|
100
|
-
i0.ɵɵpipe(7, "translate");
|
|
101
|
-
i0.ɵɵelementEnd();
|
|
102
|
-
i0.ɵɵtemplate(8, DirectionsFormComponent_div_1_button_8_Template, 2, 0, "button", 14);
|
|
103
|
-
i0.ɵɵelementStart(9, "mat-autocomplete", null, 15);
|
|
104
|
-
i0.ɵɵtemplate(11, DirectionsFormComponent_div_1_mat_optgroup_11_Template, 2, 3, "mat-optgroup", 16);
|
|
105
|
-
i0.ɵɵelementEnd();
|
|
106
|
-
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵtemplate(12, DirectionsFormComponent_div_1_button_12_Template, 3, 3, "button", 6);
|
|
108
|
-
i0.ɵɵelementEnd();
|
|
109
|
-
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementEnd();
|
|
111
|
-
} if (rf & 2) {
|
|
112
|
-
const stop_r6 = ctx.$implicit;
|
|
113
|
-
const i_r7 = ctx.index;
|
|
114
|
-
const _r11 = i0.ɵɵreference(10);
|
|
115
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
116
|
-
i0.ɵɵadvance(2);
|
|
117
|
-
i0.ɵɵproperty("formGroupName", i_r7);
|
|
118
|
-
i0.ɵɵadvance(2);
|
|
119
|
-
i0.ɵɵproperty("ngIf", ctx_r0.map.geolocationFeature);
|
|
120
|
-
i0.ɵɵadvance(2);
|
|
121
|
-
i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(7, 7, "igo.geo.directionsForm." + stop_r6.value.directionsText));
|
|
122
|
-
i0.ɵɵproperty("matAutocomplete", _r11);
|
|
123
|
-
i0.ɵɵadvance(2);
|
|
124
|
-
i0.ɵɵproperty("ngIf", stop_r6.value && (stop_r6.value.stopPoint.length > 0 || stop_r6.value.stopProposals.length > 0));
|
|
125
|
-
i0.ɵɵadvance(3);
|
|
126
|
-
i0.ɵɵproperty("ngForOf", stop_r6.value.stopProposals);
|
|
127
|
-
i0.ɵɵadvance(1);
|
|
128
|
-
i0.ɵɵproperty("ngIf", i_r7 !== 0 && i_r7 !== ctx_r0.stops.length - 1);
|
|
129
|
-
} }
|
|
130
|
-
function DirectionsFormComponent_button_6_Template(rf, ctx) { if (rf & 1) {
|
|
131
|
-
const _r34 = i0.ɵɵgetCurrentView();
|
|
132
|
-
i0.ɵɵelementStart(0, "button", 3);
|
|
133
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_button_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r33 = i0.ɵɵnextContext(); return ctx_r33.zoomRoute(); });
|
|
134
|
-
i0.ɵɵpipe(1, "translate");
|
|
135
|
-
i0.ɵɵelement(2, "mat-icon", 26);
|
|
136
|
-
i0.ɵɵelementEnd();
|
|
137
|
-
} if (rf & 2) {
|
|
138
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.zoomRoute"));
|
|
139
|
-
} }
|
|
140
|
-
function DirectionsFormComponent_button_7_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
-
const _r36 = i0.ɵɵgetCurrentView();
|
|
142
|
-
i0.ɵɵelementStart(0, "button", 24);
|
|
143
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_button_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r36); const ctx_r35 = i0.ɵɵnextContext(); return ctx_r35.resetForm(true); });
|
|
144
|
-
i0.ɵɵpipe(1, "translate");
|
|
145
|
-
i0.ɵɵelement(2, "mat-icon", 27);
|
|
146
|
-
i0.ɵɵelementEnd();
|
|
147
|
-
} if (rf & 2) {
|
|
148
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.resetDirectionsBtn"));
|
|
149
|
-
} }
|
|
150
|
-
function DirectionsFormComponent_button_8_Template(rf, ctx) { if (rf & 1) {
|
|
151
|
-
const _r38 = i0.ɵɵgetCurrentView();
|
|
152
|
-
i0.ɵɵelementStart(0, "button", 3);
|
|
153
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_button_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r38); const ctx_r37 = i0.ɵɵnextContext(); return ctx_r37.copyDirectionsToClipboard(); });
|
|
154
|
-
i0.ɵɵpipe(1, "translate");
|
|
155
|
-
i0.ɵɵelement(2, "mat-icon", 28);
|
|
156
|
-
i0.ɵɵelementEnd();
|
|
157
|
-
} if (rf & 2) {
|
|
158
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.copy"));
|
|
159
|
-
} }
|
|
160
|
-
function DirectionsFormComponent_button_9_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
-
const _r40 = i0.ɵɵgetCurrentView();
|
|
162
|
-
i0.ɵɵelementStart(0, "button", 3);
|
|
163
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_button_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r40); const ctx_r39 = i0.ɵɵnextContext(); return ctx_r39.copyLinkToClipboard(); });
|
|
164
|
-
i0.ɵɵpipe(1, "translate");
|
|
165
|
-
i0.ɵɵelement(2, "mat-icon", 29);
|
|
166
|
-
i0.ɵɵelementEnd();
|
|
167
|
-
} if (rf & 2) {
|
|
168
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 1, "igo.geo.directionsForm.link"));
|
|
169
|
-
} }
|
|
170
|
-
function DirectionsFormComponent_div_10_mat_form_field_1_mat_option_3_Template(rf, ctx) { if (rf & 1) {
|
|
171
|
-
i0.ɵɵelementStart(0, "mat-option", 36);
|
|
172
|
-
i0.ɵɵtext(1);
|
|
173
|
-
i0.ɵɵelementEnd();
|
|
174
|
-
} if (rf & 2) {
|
|
175
|
-
const pathDirections_r45 = ctx.$implicit;
|
|
176
|
-
const cnt_r46 = ctx.index;
|
|
177
|
-
const ctx_r44 = i0.ɵɵnextContext(3);
|
|
178
|
-
i0.ɵɵproperty("value", pathDirections_r45);
|
|
179
|
-
i0.ɵɵadvance(1);
|
|
180
|
-
i0.ɵɵtextInterpolate3(" Option ", cnt_r46 + 1, " : ", ctx_r44.formatDistance(pathDirections_r45.distance), " (", ctx_r44.formatDuration(pathDirections_r45.duration), ") ");
|
|
181
|
-
} }
|
|
182
|
-
function DirectionsFormComponent_div_10_mat_form_field_1_Template(rf, ctx) { if (rf & 1) {
|
|
183
|
-
const _r48 = i0.ɵɵgetCurrentView();
|
|
184
|
-
i0.ɵɵelementStart(0, "mat-form-field");
|
|
185
|
-
i0.ɵɵelementStart(1, "mat-select", 34);
|
|
186
|
-
i0.ɵɵlistener("selectionChange", function DirectionsFormComponent_div_10_mat_form_field_1_Template_mat_select_selectionChange_1_listener() { i0.ɵɵrestoreView(_r48); const ctx_r47 = i0.ɵɵnextContext(2); return ctx_r47.changeRoute(); })("ngModelChange", function DirectionsFormComponent_div_10_mat_form_field_1_Template_mat_select_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r48); const ctx_r49 = i0.ɵɵnextContext(2); return ctx_r49.activeRoute = $event; });
|
|
187
|
-
i0.ɵɵpipe(2, "translate");
|
|
188
|
-
i0.ɵɵtemplate(3, DirectionsFormComponent_div_10_mat_form_field_1_mat_option_3_Template, 2, 4, "mat-option", 35);
|
|
189
|
-
i0.ɵɵelementEnd();
|
|
190
|
-
i0.ɵɵelementEnd();
|
|
191
|
-
} if (rf & 2) {
|
|
192
|
-
const ctx_r41 = i0.ɵɵnextContext(2);
|
|
193
|
-
i0.ɵɵadvance(1);
|
|
194
|
-
i0.ɵɵpropertyInterpolate("placeholder", i0.ɵɵpipeBind1(2, 3, "igo.geo.directionsForm.drivingOptions"));
|
|
195
|
-
i0.ɵɵproperty("ngModel", ctx_r41.activeRoute);
|
|
196
|
-
i0.ɵɵadvance(2);
|
|
197
|
-
i0.ɵɵproperty("ngForOf", ctx_r41.routesResults);
|
|
198
|
-
} }
|
|
199
|
-
function DirectionsFormComponent_div_10_mat_divider_2_Template(rf, ctx) { if (rf & 1) {
|
|
200
|
-
i0.ɵɵelement(0, "mat-divider");
|
|
201
|
-
} }
|
|
202
|
-
function DirectionsFormComponent_div_10_mat_list_item_8_Template(rf, ctx) { if (rf & 1) {
|
|
203
|
-
const _r53 = i0.ɵɵgetCurrentView();
|
|
204
|
-
i0.ɵɵelementStart(0, "mat-list-item", 37);
|
|
205
|
-
i0.ɵɵlistener("mouseenter", function DirectionsFormComponent_div_10_mat_list_item_8_Template_mat_list_item_mouseenter_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r53); const step_r50 = restoredCtx.$implicit; const ctx_r52 = i0.ɵɵnextContext(2); return ctx_r52.showSegment(step_r50); })("click", function DirectionsFormComponent_div_10_mat_list_item_8_Template_mat_list_item_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r53); const step_r50 = restoredCtx.$implicit; const ctx_r54 = i0.ɵɵnextContext(2); return ctx_r54.showSegment(step_r50, true); });
|
|
206
|
-
i0.ɵɵelement(1, "mat-icon", 38);
|
|
207
|
-
i0.ɵɵelementStart(2, "h4", 39);
|
|
208
|
-
i0.ɵɵtext(3);
|
|
209
|
-
i0.ɵɵelementEnd();
|
|
210
|
-
i0.ɵɵelementStart(4, "h4", 40);
|
|
211
|
-
i0.ɵɵtext(5);
|
|
212
|
-
i0.ɵɵelementEnd();
|
|
213
|
-
i0.ɵɵelementEnd();
|
|
214
|
-
} if (rf & 2) {
|
|
215
|
-
const step_r50 = ctx.$implicit;
|
|
216
|
-
const cnt_r51 = ctx.index;
|
|
217
|
-
const ctx_r43 = i0.ɵɵnextContext(2);
|
|
218
|
-
i0.ɵɵadvance(1);
|
|
219
|
-
i0.ɵɵpropertyInterpolate("svgIcon", ctx_r43.formatStep(step_r50, cnt_r51).image);
|
|
220
|
-
i0.ɵɵproperty("ngClass", ctx_r43.formatStep(step_r50, cnt_r51).cssClass);
|
|
221
|
-
i0.ɵɵadvance(2);
|
|
222
|
-
i0.ɵɵtextInterpolate2("", cnt_r51 + 1, ". ", ctx_r43.formatStep(step_r50, cnt_r51).instruction, "");
|
|
223
|
-
i0.ɵɵadvance(2);
|
|
224
|
-
i0.ɵɵtextInterpolate(ctx_r43.formatDistance(step_r50.distance));
|
|
225
|
-
} }
|
|
226
|
-
function DirectionsFormComponent_div_10_Template(rf, ctx) { if (rf & 1) {
|
|
227
|
-
i0.ɵɵelementStart(0, "div", 11);
|
|
228
|
-
i0.ɵɵtemplate(1, DirectionsFormComponent_div_10_mat_form_field_1_Template, 4, 5, "mat-form-field", 30);
|
|
229
|
-
i0.ɵɵtemplate(2, DirectionsFormComponent_div_10_mat_divider_2_Template, 1, 0, "mat-divider", 30);
|
|
230
|
-
i0.ɵɵelementStart(3, "mat-list");
|
|
231
|
-
i0.ɵɵelementStart(4, "h2", 31);
|
|
232
|
-
i0.ɵɵtext(5);
|
|
233
|
-
i0.ɵɵelementEnd();
|
|
234
|
-
i0.ɵɵelementStart(6, "h2", 32);
|
|
235
|
-
i0.ɵɵtext(7);
|
|
236
|
-
i0.ɵɵelementEnd();
|
|
237
|
-
i0.ɵɵtemplate(8, DirectionsFormComponent_div_10_mat_list_item_8_Template, 6, 5, "mat-list-item", 33);
|
|
238
|
-
i0.ɵɵelement(9, "mat-divider");
|
|
239
|
-
i0.ɵɵelementEnd();
|
|
240
|
-
i0.ɵɵelementEnd();
|
|
241
|
-
} if (rf & 2) {
|
|
242
|
-
const ctx_r5 = i0.ɵɵnextContext();
|
|
243
|
-
i0.ɵɵadvance(1);
|
|
244
|
-
i0.ɵɵproperty("ngIf", ctx_r5.routesResults && ctx_r5.routesResults.length > 1);
|
|
245
|
-
i0.ɵɵadvance(1);
|
|
246
|
-
i0.ɵɵproperty("ngIf", ctx_r5.routesResults && ctx_r5.routesResults.length === 0);
|
|
247
|
-
i0.ɵɵadvance(3);
|
|
248
|
-
i0.ɵɵtextInterpolate(ctx_r5.activeRoute.title);
|
|
249
|
-
i0.ɵɵadvance(2);
|
|
250
|
-
i0.ɵɵtextInterpolate2("", ctx_r5.formatDistance(ctx_r5.activeRoute.distance), ", ", ctx_r5.formatDuration(ctx_r5.activeRoute.duration), "");
|
|
251
|
-
i0.ɵɵadvance(1);
|
|
252
|
-
i0.ɵɵproperty("ngForOf", ctx_r5.activeRoute.steps);
|
|
253
|
-
} }
|
|
254
|
-
export class DirectionsFormComponent {
|
|
255
|
-
constructor(formBuilder, directionsService, languageService, messageService, searchService, queryService, directionsFormService, changeDetectorRefs, route) {
|
|
256
|
-
this.formBuilder = formBuilder;
|
|
257
|
-
this.directionsService = directionsService;
|
|
258
|
-
this.languageService = languageService;
|
|
259
|
-
this.messageService = messageService;
|
|
260
|
-
this.searchService = searchService;
|
|
261
|
-
this.queryService = queryService;
|
|
262
|
-
this.directionsFormService = directionsFormService;
|
|
263
|
-
this.changeDetectorRefs = changeDetectorRefs;
|
|
264
|
-
this.route = route;
|
|
265
|
-
this.invalidKeys = ['Control', 'Shift', 'Alt'];
|
|
266
|
-
this.subscriptions$$ = [];
|
|
267
|
-
this.projection = 'EPSG:4326';
|
|
268
|
-
this.routesQueries$$ = [];
|
|
269
|
-
this.stream$ = new Subject();
|
|
270
|
-
this.activeRoute$ = new BehaviorSubject(undefined);
|
|
271
|
-
this.focusOnStop = false;
|
|
272
|
-
this.focusKey = [];
|
|
273
|
-
this.debounce = 200;
|
|
274
|
-
this.length = 2;
|
|
275
|
-
this.stopsStore$ = new BehaviorSubject(undefined);
|
|
276
|
-
this.activeRouteDescription = new EventEmitter();
|
|
277
|
-
}
|
|
278
|
-
get activeRoute() {
|
|
279
|
-
return this._activeRoute;
|
|
280
|
-
}
|
|
281
|
-
set activeRoute(value) {
|
|
282
|
-
this._activeRoute = value;
|
|
283
|
-
if (value && this.activeRoute$.getValue() && value.id !== this.activeRoute$.getValue().id) {
|
|
284
|
-
this.activeRoute$.next(value);
|
|
285
|
-
}
|
|
286
|
-
this.activeRouteDescription.emit(this.directionsToText());
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* The stops store
|
|
290
|
-
*/
|
|
291
|
-
get stopsStore() {
|
|
292
|
-
return this._stopsStore;
|
|
293
|
-
}
|
|
294
|
-
set stopsStore(value) {
|
|
295
|
-
this._stopsStore = value;
|
|
296
|
-
this.stopsStore$.next(value);
|
|
297
|
-
}
|
|
298
|
-
get routeFromFeatureDetail() {
|
|
299
|
-
return this._routeFromFeatureDetail;
|
|
300
|
-
}
|
|
301
|
-
set routeFromFeatureDetail(value) {
|
|
302
|
-
this._routeFromFeatureDetail = value;
|
|
303
|
-
}
|
|
304
|
-
changeRoute() {
|
|
305
|
-
this.showRouteGeometry(true);
|
|
306
|
-
}
|
|
307
|
-
prevent(event) {
|
|
308
|
-
event.preventDefault();
|
|
309
|
-
}
|
|
310
|
-
ngOnInit() {
|
|
311
|
-
this.queryService.queryEnabled = false;
|
|
312
|
-
this.focusOnStop = false;
|
|
313
|
-
this.browserLanguage = this.languageService.getLanguage();
|
|
314
|
-
this.stopsForm = this.formBuilder.group({
|
|
315
|
-
directionsType: 'car',
|
|
316
|
-
directionsMode: 'driving',
|
|
317
|
-
stopOrderPriority: true,
|
|
318
|
-
directionsFixedStartEnd: false,
|
|
319
|
-
stops: this.formBuilder.array([
|
|
320
|
-
this.createStop('start'),
|
|
321
|
-
this.createStop('end')
|
|
322
|
-
])
|
|
323
|
-
});
|
|
324
|
-
setTimeout(() => {
|
|
325
|
-
this.initStores();
|
|
326
|
-
this.initOlInteraction();
|
|
327
|
-
}, 1);
|
|
328
|
-
this.subscribeToFormChange();
|
|
329
|
-
this.routesQueries$$.push(this.stream$
|
|
330
|
-
.pipe(debounceTime(this.debounce), distinctUntilChanged())
|
|
331
|
-
.subscribe((term) => this.handleTermChanged(term)));
|
|
332
|
-
this.stopsStore$.subscribe(() => {
|
|
333
|
-
if (this.routeFromFeatureDetail === true) {
|
|
334
|
-
this.directionsFormService.setStops([]);
|
|
335
|
-
setTimeout(() => {
|
|
336
|
-
this.resetForm(false);
|
|
337
|
-
for (const feature of this.stopsStore.all()) {
|
|
338
|
-
if (feature.properties.id && feature.properties.id.toString().startsWith('directionsStop')) {
|
|
339
|
-
this.stopsStore.delete(feature);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if (this.stopsStore.all().length === 2) {
|
|
343
|
-
let i = 0;
|
|
344
|
-
const coordinates = [];
|
|
345
|
-
for (const feature of this.stopsStore.all()) {
|
|
346
|
-
coordinates.push(feature.geometry.coordinates);
|
|
347
|
-
this.handleLocationProposals(feature.geometry.coordinates, i);
|
|
348
|
-
this.chooseProposal(feature, i);
|
|
349
|
-
i++;
|
|
350
|
-
}
|
|
351
|
-
this.writeStopsToFormService(coordinates);
|
|
352
|
-
const routeResponse = this.directionsService.route(coordinates, {});
|
|
353
|
-
if (routeResponse) {
|
|
354
|
-
routeResponse.map(res => this.routesQueries$$.push(res.subscribe(route => {
|
|
355
|
-
this.routesResults = route;
|
|
356
|
-
this.activeRoute = this.routesResults[0];
|
|
357
|
-
this.showRouteGeometry(true);
|
|
358
|
-
this.changeDetectorRefs.detectChanges();
|
|
359
|
-
})));
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
else if (this.stopsStore.all().length === 1) {
|
|
363
|
-
this.handleLocationProposals(this.stopsStore.all()[0].geometry.coordinates, 1);
|
|
364
|
-
this.chooseProposal(this.stopsStore.all()[0], 1);
|
|
365
|
-
this.writeStopsToFormService(this.stopsStore.all()[0].geometry.coordinates);
|
|
366
|
-
}
|
|
367
|
-
}, 1);
|
|
368
|
-
this.routeFromFeatureDetail = false;
|
|
369
|
-
}
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
ngOnDestroy() {
|
|
373
|
-
this.unsubscribeRoutesQueries();
|
|
374
|
-
this.unlistenSingleClick();
|
|
375
|
-
this.queryService.queryEnabled = true;
|
|
376
|
-
this.freezeStores();
|
|
377
|
-
this.writeStopsToFormService();
|
|
378
|
-
this.subscriptions$$.map(s => s.unsubscribe());
|
|
379
|
-
}
|
|
380
|
-
initStores() {
|
|
381
|
-
const loadingStrategy = new FeatureStoreLoadingStrategy({
|
|
382
|
-
motion: FeatureMotion.None
|
|
383
|
-
});
|
|
384
|
-
// STOP STORE
|
|
385
|
-
const stopsStore = this.stopsStore;
|
|
386
|
-
const stopsLayer = new VectorLayer({
|
|
387
|
-
id: 'igo-direction-stops-layer',
|
|
388
|
-
title: this.languageService.translate.instant('igo.geo.directionsForm.stopLayer'),
|
|
389
|
-
zIndex: 911,
|
|
390
|
-
source: new FeatureDataSource(),
|
|
391
|
-
showInLayerList: true,
|
|
392
|
-
workspace: {
|
|
393
|
-
enabled: false,
|
|
394
|
-
},
|
|
395
|
-
linkedLayers: {
|
|
396
|
-
linkId: 'igo-direction-stops-layer',
|
|
397
|
-
links: [
|
|
398
|
-
{
|
|
399
|
-
bidirectionnal: false,
|
|
400
|
-
syncedDelete: true,
|
|
401
|
-
linkedIds: ['igo-direction-route-layer'],
|
|
402
|
-
properties: []
|
|
403
|
-
}
|
|
404
|
-
]
|
|
405
|
-
},
|
|
406
|
-
exportable: true,
|
|
407
|
-
browsable: false,
|
|
408
|
-
style: stopMarker
|
|
409
|
-
});
|
|
410
|
-
tryBindStoreLayer(stopsStore, stopsLayer);
|
|
411
|
-
stopsStore.layer.visible = true;
|
|
412
|
-
tryAddLoadingStrategy(stopsStore, loadingStrategy);
|
|
413
|
-
// ROUTE AND VERTEX STORE
|
|
414
|
-
const routeStore = this.routeStore;
|
|
415
|
-
const routeLayer = new VectorLayer({
|
|
416
|
-
id: 'igo-direction-route-layer',
|
|
417
|
-
title: this.languageService.translate.instant('igo.geo.directionsForm.routeLayer'),
|
|
418
|
-
zIndex: 910,
|
|
419
|
-
source: new FeatureDataSource(),
|
|
420
|
-
showInLayerList: true,
|
|
421
|
-
workspace: {
|
|
422
|
-
enabled: false,
|
|
423
|
-
},
|
|
424
|
-
linkedLayers: {
|
|
425
|
-
linkId: 'igo-direction-route-layer'
|
|
426
|
-
},
|
|
427
|
-
exportable: true,
|
|
428
|
-
browsable: false,
|
|
429
|
-
style: stopMarker
|
|
430
|
-
});
|
|
431
|
-
tryBindStoreLayer(routeStore, routeLayer);
|
|
432
|
-
routeStore.layer.visible = true;
|
|
433
|
-
tryAddLoadingStrategy(routeStore, loadingStrategy);
|
|
434
|
-
this.subscriptions$$.push(this.stopsStore.count$.subscribe(cnt => {
|
|
435
|
-
cnt >= 1 ?
|
|
436
|
-
this.stopsStore.layer.options.showInLayerList = true :
|
|
437
|
-
this.stopsStore.layer.options.showInLayerList = false;
|
|
438
|
-
}));
|
|
439
|
-
this.subscriptions$$.push(this.routeStore.count$.subscribe(cnt => {
|
|
440
|
-
cnt >= 1 ?
|
|
441
|
-
this.routeStore.layer.options.showInLayerList = true :
|
|
442
|
-
this.routeStore.layer.options.showInLayerList = false;
|
|
443
|
-
}));
|
|
444
|
-
}
|
|
445
|
-
initOlInteraction() {
|
|
446
|
-
let selectedStopFeature;
|
|
447
|
-
this.selectStop = new olinteraction.Select({
|
|
448
|
-
layers: [this.stopsStore.layer.ol],
|
|
449
|
-
condition: olcondition.pointerMove,
|
|
450
|
-
hitTolerance: 7,
|
|
451
|
-
filter: feature => {
|
|
452
|
-
return feature.get('type') === 'stop';
|
|
453
|
-
}
|
|
454
|
-
});
|
|
455
|
-
this.selectStop.on('select', evt => {
|
|
456
|
-
selectedStopFeature = evt.target.getFeatures()[0];
|
|
457
|
-
});
|
|
458
|
-
this.translateStop = new olinteraction.Translate({
|
|
459
|
-
layers: [this.stopsStore.layer.ol],
|
|
460
|
-
features: selectedStopFeature
|
|
461
|
-
// TODO In Openlayers >= 6.x, filter is now allowed.
|
|
462
|
-
});
|
|
463
|
-
this.translateStop.on('translating', evt => {
|
|
464
|
-
const features = evt.features;
|
|
465
|
-
if (features.getLength() === 0) {
|
|
466
|
-
return;
|
|
467
|
-
}
|
|
468
|
-
this.executeTranslation(features, false, 50, true);
|
|
469
|
-
});
|
|
470
|
-
this.translateStop.on('translateend', evt => {
|
|
471
|
-
const features = evt.features;
|
|
472
|
-
if (features.getLength() === 0) {
|
|
473
|
-
return;
|
|
474
|
-
}
|
|
475
|
-
this.executeTranslation(features, true, 0, false);
|
|
476
|
-
});
|
|
477
|
-
this.selectedRoute = new olinteraction.Select({
|
|
478
|
-
layers: [this.routeStore.layer.ol],
|
|
479
|
-
condition: olcondition.click,
|
|
480
|
-
hitTolerance: 7,
|
|
481
|
-
filter: feature => {
|
|
482
|
-
return feature.getId() === 'route';
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
this.selectedRoute.on('select', evt => {
|
|
486
|
-
if (this.focusOnStop === false) {
|
|
487
|
-
const selectCoordinates = olproj.transform(evt.mapBrowserEvent.coordinate, this.map.projection, this.projection);
|
|
488
|
-
this.addStop();
|
|
489
|
-
const pos = this.stops.length - 2;
|
|
490
|
-
this.stops.at(pos).patchValue({ stopCoordinates: selectCoordinates });
|
|
491
|
-
this.handleLocationProposals(selectCoordinates, pos);
|
|
492
|
-
this.addStopOverlay(selectCoordinates, pos);
|
|
493
|
-
this.selectedRoute.getFeatures().clear();
|
|
494
|
-
}
|
|
495
|
-
this.selectedRoute.getFeatures().clear();
|
|
496
|
-
});
|
|
497
|
-
this.map.ol.addInteraction(this.selectStop);
|
|
498
|
-
this.map.ol.addInteraction(this.translateStop);
|
|
499
|
-
this.map.ol.addInteraction(this.selectedRoute);
|
|
500
|
-
}
|
|
501
|
-
subscribeToFormChange() {
|
|
502
|
-
this.routesQueries$$.push(this.stopsForm.valueChanges
|
|
503
|
-
.pipe(debounceTime(this.debounce))
|
|
504
|
-
.subscribe(val => {
|
|
505
|
-
this.writeStopsToFormService();
|
|
506
|
-
}));
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* Freeze any store, meaning the layer is removed, strategies are deactivated
|
|
510
|
-
* and some listener removed
|
|
511
|
-
* @internal
|
|
512
|
-
*/
|
|
513
|
-
freezeStores() {
|
|
514
|
-
const stopsStore = this.stopsStore;
|
|
515
|
-
const routeStore = this.routeStore;
|
|
516
|
-
this.map.ol.removeInteraction(this.selectStop);
|
|
517
|
-
this.map.ol.removeInteraction(this.translateStop);
|
|
518
|
-
this.map.ol.removeInteraction(this.selectedRoute);
|
|
519
|
-
stopsStore.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
|
|
520
|
-
routeStore.deactivateStrategyOfType(FeatureStoreLoadingStrategy);
|
|
521
|
-
}
|
|
522
|
-
executeTranslation(features, reverseSearchProposal = false, delay = 0, overview = false) {
|
|
523
|
-
this.routeStore.clear();
|
|
524
|
-
const firstFeature = features.getArray()[0];
|
|
525
|
-
const translatedID = firstFeature.getId();
|
|
526
|
-
const translatedPos = translatedID.split('_');
|
|
527
|
-
let p;
|
|
528
|
-
switch (translatedPos[1]) {
|
|
529
|
-
case 'start':
|
|
530
|
-
p = 0;
|
|
531
|
-
break;
|
|
532
|
-
case 'end':
|
|
533
|
-
p = this.stops.length - 1;
|
|
534
|
-
break;
|
|
535
|
-
default:
|
|
536
|
-
p = Number(translatedPos[1]);
|
|
537
|
-
break;
|
|
538
|
-
}
|
|
539
|
-
const translationCoordinates = olproj.transform(firstFeature.getGeometry().getCoordinates(), this.map.projection, this.projection);
|
|
540
|
-
this.stops
|
|
541
|
-
.at(p)
|
|
542
|
-
.patchValue({
|
|
543
|
-
stopCoordinates: translationCoordinates,
|
|
544
|
-
stopProposals: []
|
|
545
|
-
});
|
|
546
|
-
if (reverseSearchProposal) {
|
|
547
|
-
this.handleLocationProposals(translationCoordinates, p);
|
|
548
|
-
}
|
|
549
|
-
const directionsOptions = {
|
|
550
|
-
steps: true,
|
|
551
|
-
overview: false,
|
|
552
|
-
alternatives: true
|
|
553
|
-
};
|
|
554
|
-
if (overview) {
|
|
555
|
-
directionsOptions.overview = true;
|
|
556
|
-
directionsOptions.steps = false;
|
|
557
|
-
directionsOptions.alternatives = false;
|
|
558
|
-
}
|
|
559
|
-
if (delay > 0) {
|
|
560
|
-
if (typeof this.lastTimeoutRequest !== 'undefined') {
|
|
561
|
-
// cancel timeout when the mouse moves
|
|
562
|
-
clearTimeout(this.lastTimeoutRequest);
|
|
563
|
-
}
|
|
564
|
-
this.lastTimeoutRequest = setTimeout(() => {
|
|
565
|
-
this.getRoutes(undefined, directionsOptions);
|
|
566
|
-
}, delay);
|
|
567
|
-
}
|
|
568
|
-
else {
|
|
569
|
-
clearTimeout(this.lastTimeoutRequest);
|
|
570
|
-
this.getRoutes(undefined, directionsOptions);
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
handleLocationProposals(coordinates, stopIndex) {
|
|
574
|
-
const groupedLocations = [];
|
|
575
|
-
const roundedCoordinates = [
|
|
576
|
-
coordinates[0].toFixed(5),
|
|
577
|
-
coordinates[1].toFixed(5)
|
|
578
|
-
];
|
|
579
|
-
this.stops
|
|
580
|
-
.at(stopIndex)
|
|
581
|
-
.patchValue({ stopPoint: roundedCoordinates.join(',') });
|
|
582
|
-
this.searchService
|
|
583
|
-
.reverseSearch(coordinates, { zoom: this.map.viewController.getZoom() })
|
|
584
|
-
.map(res => this.routesQueries$$.push(res.request.pipe(map(f => f)).subscribe(results => {
|
|
585
|
-
results.forEach(result => {
|
|
586
|
-
if (groupedLocations.filter(f => f.source === result.source)
|
|
587
|
-
.length === 0) {
|
|
588
|
-
groupedLocations.push({
|
|
589
|
-
source: result.source,
|
|
590
|
-
results: results.map(r => r.data)
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
});
|
|
594
|
-
this.stops
|
|
595
|
-
.at(stopIndex)
|
|
596
|
-
.patchValue({ stopProposals: groupedLocations });
|
|
597
|
-
// TODO: Prefer another source?
|
|
598
|
-
if (results[0]) {
|
|
599
|
-
if (results[0].source.getId() === 'icherchereverse') {
|
|
600
|
-
// prefer address type.
|
|
601
|
-
let resultPos = 0;
|
|
602
|
-
for (let i = 0; i < results.length; i++) {
|
|
603
|
-
const feature = results[i].data;
|
|
604
|
-
if (feature.properties.type === 'adresses') {
|
|
605
|
-
resultPos = i;
|
|
606
|
-
break;
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
this.stops.at(stopIndex).patchValue({
|
|
610
|
-
stopPoint: getEntityTitle(results[resultPos])
|
|
611
|
-
});
|
|
612
|
-
if (results[resultPos].data.geometry.type === 'Point') {
|
|
613
|
-
this.stops.at(stopIndex).patchValue({
|
|
614
|
-
stopCoordinates: results[resultPos].data.geometry.coordinates
|
|
615
|
-
});
|
|
616
|
-
}
|
|
617
|
-
else {
|
|
618
|
-
// Not moving the translated point Only to suggest value into the UI.
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
else if (results[0].source.getId() === 'coordinatesreverse') {
|
|
622
|
-
this.stops.at(stopIndex).patchValue({
|
|
623
|
-
stopPoint: [
|
|
624
|
-
results[0].data.geometry.coordinates[0].toFixed(5),
|
|
625
|
-
results[0].data.geometry.coordinates[1].toFixed(5)
|
|
626
|
-
].join(',')
|
|
627
|
-
});
|
|
628
|
-
if (results[0].data.geometry.type === 'Point') {
|
|
629
|
-
this.stops.at(stopIndex).patchValue({
|
|
630
|
-
stopCoordinates: results[0].data.geometry.coordinates
|
|
631
|
-
});
|
|
632
|
-
}
|
|
633
|
-
else {
|
|
634
|
-
// Not moving the translated point Only to suggest value into the UI.
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
else {
|
|
639
|
-
this.stops
|
|
640
|
-
.at(stopIndex)
|
|
641
|
-
.patchValue({
|
|
642
|
-
stopPoint: roundedCoordinates.join(','),
|
|
643
|
-
stopProposals: []
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
this.changeDetectorRefs.detectChanges();
|
|
647
|
-
})));
|
|
648
|
-
}
|
|
649
|
-
directionsText(index, stopsCounts = this.stops.length) {
|
|
650
|
-
if (index === 0) {
|
|
651
|
-
return 'start';
|
|
652
|
-
}
|
|
653
|
-
else if (index === stopsCounts - 1 || stopsCounts === 1) {
|
|
654
|
-
return 'end';
|
|
655
|
-
}
|
|
656
|
-
else {
|
|
657
|
-
return 'intermediate';
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
raiseStop(index) {
|
|
661
|
-
if (index > 0) {
|
|
662
|
-
this.moveStop(index, -1);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
lowerStop(index) {
|
|
666
|
-
if (index < this.stops.length - 1) {
|
|
667
|
-
this.moveStop(index, 1);
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
moveStop(index, diff) {
|
|
671
|
-
const fromValue = this.stops.at(index);
|
|
672
|
-
this.removeStop(index);
|
|
673
|
-
this.stops.insert(index + diff, fromValue);
|
|
674
|
-
this.stops
|
|
675
|
-
.at(index)
|
|
676
|
-
.patchValue({ directionsText: this.directionsText(index) });
|
|
677
|
-
this.stops
|
|
678
|
-
.at(index + diff)
|
|
679
|
-
.patchValue({ directionsText: this.directionsText(index + diff) });
|
|
680
|
-
if (this.stops.at(index).value.stopCoordinates) {
|
|
681
|
-
this.addStopOverlay(this.stops.at(index).value.stopCoordinates, index);
|
|
682
|
-
}
|
|
683
|
-
if (this.stops.at(index + diff).value.stopCoordinates) {
|
|
684
|
-
this.addStopOverlay(this.stops.at(index + diff).value.stopCoordinates, index + diff);
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
get stops() {
|
|
688
|
-
return this.stopsForm.get('stops');
|
|
689
|
-
}
|
|
690
|
-
writeStopsToFormService(stopsArray) {
|
|
691
|
-
if (stopsArray) {
|
|
692
|
-
this.directionsFormService.setStops(stopsArray);
|
|
693
|
-
}
|
|
694
|
-
else {
|
|
695
|
-
const stops = [];
|
|
696
|
-
this.stops.value.forEach(stop => {
|
|
697
|
-
if (stop.stopCoordinates instanceof Array) {
|
|
698
|
-
stops.push(stop);
|
|
699
|
-
}
|
|
700
|
-
});
|
|
701
|
-
this.directionsFormService.setStops(stops);
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
addStop() {
|
|
705
|
-
const insertIndex = this.stops.length - 1;
|
|
706
|
-
this.stops.insert(insertIndex, this.createStop());
|
|
707
|
-
}
|
|
708
|
-
createStop(directionsPos = 'intermediate') {
|
|
709
|
-
return this.formBuilder.group({
|
|
710
|
-
stopPoint: [''],
|
|
711
|
-
stopProposals: [[]],
|
|
712
|
-
directionsText: directionsPos,
|
|
713
|
-
stopCoordinates: ['', [Validators.required]]
|
|
714
|
-
});
|
|
715
|
-
}
|
|
716
|
-
removeStop(index) {
|
|
717
|
-
const id = this.getStopOverlayID(index);
|
|
718
|
-
this.deleteStoreFeatureByID(this.stopsStore, id);
|
|
719
|
-
this.stops.removeAt(index);
|
|
720
|
-
let cnt = 0;
|
|
721
|
-
this.stops.value.forEach(stop => {
|
|
722
|
-
this.stops
|
|
723
|
-
.at(cnt)
|
|
724
|
-
.patchValue({ directionsText: this.directionsText(cnt) });
|
|
725
|
-
this.addStopOverlay(this.stops.at(cnt).value.stopCoordinates, cnt);
|
|
726
|
-
cnt++;
|
|
727
|
-
});
|
|
728
|
-
}
|
|
729
|
-
resetForm(stop) {
|
|
730
|
-
this.routesResults = undefined;
|
|
731
|
-
const nbStops = this.stops.length;
|
|
732
|
-
for (let i = 0; i < nbStops; i++) {
|
|
733
|
-
this.stops.removeAt(0);
|
|
734
|
-
}
|
|
735
|
-
this.stops.insert(0, this.createStop('start'));
|
|
736
|
-
this.stops.insert(1, this.createStop('end'));
|
|
737
|
-
if (stop === true) {
|
|
738
|
-
this.stopsStore.clear();
|
|
739
|
-
}
|
|
740
|
-
this.routeStore.clear();
|
|
741
|
-
}
|
|
742
|
-
formatStep(step, cnt) {
|
|
743
|
-
return this.formatInstruction(step.maneuver.type, step.maneuver.modifier, step.name, step.maneuver.bearing_after, cnt, step.maneuver.exit, cnt === this.activeRoute.steps.length - 1);
|
|
744
|
-
}
|
|
745
|
-
formatInstruction(type, modifier, route, direction, stepPosition, exit, lastStep = false) {
|
|
746
|
-
let directiveFr;
|
|
747
|
-
let directiveEn;
|
|
748
|
-
let image = 'forward';
|
|
749
|
-
let cssClass = 'rotate-270';
|
|
750
|
-
const translatedDirection = this.translateBearing(direction);
|
|
751
|
-
const translatedModifier = this.translateModifier(modifier);
|
|
752
|
-
const enPrefix = modifier === 'straight' ? '' : 'on the ';
|
|
753
|
-
const frPrefix = modifier === 'straight' ? '' : 'à ';
|
|
754
|
-
let frAggregatedDirection = frPrefix + translatedModifier;
|
|
755
|
-
let enAggregatedDirection = enPrefix + translatedModifier;
|
|
756
|
-
if (modifier && modifier.search('slight') >= 0) {
|
|
757
|
-
enAggregatedDirection = translatedModifier;
|
|
758
|
-
}
|
|
759
|
-
if (modifier === 'uturn') {
|
|
760
|
-
image = 'forward';
|
|
761
|
-
cssClass = 'rotate-90';
|
|
762
|
-
}
|
|
763
|
-
else if (modifier === 'sharp right') {
|
|
764
|
-
image = 'subdirectory-arrow-right';
|
|
765
|
-
cssClass = 'icon-flipped';
|
|
766
|
-
}
|
|
767
|
-
else if (modifier === 'right') {
|
|
768
|
-
image = 'subdirectory-arrow-right';
|
|
769
|
-
cssClass = 'icon-flipped';
|
|
770
|
-
}
|
|
771
|
-
else if (modifier === 'slight right') {
|
|
772
|
-
image = 'forward';
|
|
773
|
-
cssClass = 'rotate-290';
|
|
774
|
-
}
|
|
775
|
-
else if (modifier === 'straight') {
|
|
776
|
-
image = 'forward';
|
|
777
|
-
}
|
|
778
|
-
else if (modifier === 'slight left') {
|
|
779
|
-
image = 'forward';
|
|
780
|
-
cssClass = 'rotate-250';
|
|
781
|
-
}
|
|
782
|
-
else if (modifier === 'left') {
|
|
783
|
-
image = 'subdirectory-arrow-left';
|
|
784
|
-
cssClass = 'icon-flipped';
|
|
785
|
-
}
|
|
786
|
-
else if (modifier === 'sharp left') {
|
|
787
|
-
image = 'subdirectory-arrow-left';
|
|
788
|
-
cssClass = 'icon-flipped';
|
|
789
|
-
}
|
|
790
|
-
if (type === 'turn') {
|
|
791
|
-
if (modifier === 'straight') {
|
|
792
|
-
directiveFr = 'Continuer sur ' + route;
|
|
793
|
-
directiveEn = 'Continue on ' + route;
|
|
794
|
-
}
|
|
795
|
-
else if (modifier === 'uturn') {
|
|
796
|
-
directiveFr = 'Faire demi-tour sur ' + route;
|
|
797
|
-
directiveEn = 'Make u-turn on ' + route;
|
|
798
|
-
}
|
|
799
|
-
else {
|
|
800
|
-
directiveFr = 'Tourner ' + frAggregatedDirection + ' sur ' + route;
|
|
801
|
-
directiveEn = 'Turn ' + translatedModifier + ' onto ' + route;
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
else if (type === 'new name') {
|
|
805
|
-
directiveFr =
|
|
806
|
-
'Continuer en direction ' + translatedDirection + ' sur ' + route;
|
|
807
|
-
directiveEn = 'Head ' + translatedDirection + ' on ' + route;
|
|
808
|
-
image = 'compass';
|
|
809
|
-
cssClass = '';
|
|
810
|
-
}
|
|
811
|
-
else if (type === 'depart') {
|
|
812
|
-
directiveFr =
|
|
813
|
-
'Aller en direction ' + translatedDirection + ' sur ' + route;
|
|
814
|
-
directiveEn = 'Head ' + translatedDirection + ' on ' + route;
|
|
815
|
-
image = 'compass';
|
|
816
|
-
cssClass = '';
|
|
817
|
-
}
|
|
818
|
-
else if (type === 'arrive') {
|
|
819
|
-
if (lastStep) {
|
|
820
|
-
let coma = ', ';
|
|
821
|
-
if (!translatedModifier) {
|
|
822
|
-
frAggregatedDirection = '';
|
|
823
|
-
enAggregatedDirection = '';
|
|
824
|
-
coma = '';
|
|
825
|
-
}
|
|
826
|
-
directiveFr = 'Vous êtes arrivé' + coma + frAggregatedDirection;
|
|
827
|
-
directiveEn =
|
|
828
|
-
'You have reached your destination' + coma + enAggregatedDirection;
|
|
829
|
-
}
|
|
830
|
-
else {
|
|
831
|
-
directiveFr = 'Vous atteignez le point intermédiare sur ' + route;
|
|
832
|
-
directiveEn = 'You have reached the intermediate stop onto ' + route;
|
|
833
|
-
image = 'map-marker';
|
|
834
|
-
cssClass = '';
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
else if (type === 'merge') {
|
|
838
|
-
directiveFr = 'Continuer sur ' + route;
|
|
839
|
-
directiveEn = 'Continue on ' + route;
|
|
840
|
-
image = 'forward';
|
|
841
|
-
cssClass = 'rotate-270';
|
|
842
|
-
}
|
|
843
|
-
else if (type === 'on ramp') {
|
|
844
|
-
directiveFr = "Prendre l'entrée d'autoroute " + frAggregatedDirection;
|
|
845
|
-
directiveEn = 'Take the ramp ' + enAggregatedDirection;
|
|
846
|
-
}
|
|
847
|
-
else if (type === 'off ramp') {
|
|
848
|
-
directiveFr = "Prendre la sortie d'autoroute " + frAggregatedDirection;
|
|
849
|
-
directiveEn = 'Take exit ' + enAggregatedDirection;
|
|
850
|
-
}
|
|
851
|
-
else if (type === 'fork') {
|
|
852
|
-
if (modifier.search('left') >= 0) {
|
|
853
|
-
directiveFr = 'Garder la gauche sur ' + route;
|
|
854
|
-
directiveEn = 'Merge left onto ' + route;
|
|
855
|
-
}
|
|
856
|
-
else if (modifier.search('right') >= 0) {
|
|
857
|
-
directiveFr = 'Garder la droite sur ' + route;
|
|
858
|
-
directiveEn = 'Merge right onto ' + route;
|
|
859
|
-
}
|
|
860
|
-
else {
|
|
861
|
-
directiveFr = 'Continuer sur ' + route;
|
|
862
|
-
directiveEn = 'Continue on ' + route;
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
else if (type === 'end of road') {
|
|
866
|
-
directiveFr =
|
|
867
|
-
'À la fin de la route, tourner ' + translatedModifier + ' sur ' + route;
|
|
868
|
-
directiveEn =
|
|
869
|
-
'At the end of the road, turn ' + translatedModifier + ' onto ' + route;
|
|
870
|
-
}
|
|
871
|
-
else if (type === 'use lane') {
|
|
872
|
-
directiveFr = 'Prendre la voie de ... ';
|
|
873
|
-
directiveEn = 'Take the lane ...';
|
|
874
|
-
}
|
|
875
|
-
else if (type === 'continue' && modifier !== 'uturn') {
|
|
876
|
-
directiveFr = 'Continuer sur ' + route;
|
|
877
|
-
directiveEn = 'Continue on ' + route;
|
|
878
|
-
image = 'forward';
|
|
879
|
-
cssClass = 'rotate-270';
|
|
880
|
-
}
|
|
881
|
-
else if (type === 'roundabout') {
|
|
882
|
-
directiveFr = 'Au rond-point, prendre la ' + exit;
|
|
883
|
-
directiveFr += exit === 1 ? 're' : 'e';
|
|
884
|
-
directiveFr += ' sortie vers ' + route;
|
|
885
|
-
directiveEn = 'At the roundabout, take the ' + exit;
|
|
886
|
-
directiveEn += exit === 1 ? 'st' : 'rd';
|
|
887
|
-
directiveEn += ' exit towards ' + route;
|
|
888
|
-
image = 'chart-donut';
|
|
889
|
-
cssClass = '';
|
|
890
|
-
}
|
|
891
|
-
else if (type === 'rotary') {
|
|
892
|
-
directiveFr = 'Rond-point rotary....';
|
|
893
|
-
directiveEn = 'Roundabout rotary....';
|
|
894
|
-
image = 'chart-donut';
|
|
895
|
-
cssClass = '';
|
|
896
|
-
}
|
|
897
|
-
else if (type === 'roundabout turn') {
|
|
898
|
-
directiveFr = 'Rond-point, prendre la ...';
|
|
899
|
-
directiveEn = 'Roundabout, take the ...';
|
|
900
|
-
image = 'chart-donut';
|
|
901
|
-
cssClass = '';
|
|
902
|
-
}
|
|
903
|
-
else if (type === 'exit roundabout') {
|
|
904
|
-
directiveFr = 'Poursuivre vers ' + route;
|
|
905
|
-
directiveEn = 'Continue to ' + route;
|
|
906
|
-
image = 'forward';
|
|
907
|
-
cssClass = 'rotate-270';
|
|
908
|
-
}
|
|
909
|
-
else if (type === 'notification') {
|
|
910
|
-
directiveFr = 'notification ....';
|
|
911
|
-
directiveEn = 'notification ....';
|
|
912
|
-
}
|
|
913
|
-
else if (modifier === 'uturn') {
|
|
914
|
-
directiveFr =
|
|
915
|
-
'Faire demi-tour et continuer en direction ' +
|
|
916
|
-
translatedDirection +
|
|
917
|
-
' sur ' +
|
|
918
|
-
route;
|
|
919
|
-
directiveEn =
|
|
920
|
-
'Make u-turn and head ' + translatedDirection + ' on ' + route;
|
|
921
|
-
}
|
|
922
|
-
else {
|
|
923
|
-
directiveFr = '???';
|
|
924
|
-
directiveEn = '???';
|
|
925
|
-
}
|
|
926
|
-
if (lastStep) {
|
|
927
|
-
image = 'flag-variant';
|
|
928
|
-
cssClass = '';
|
|
929
|
-
}
|
|
930
|
-
if (stepPosition === 0) {
|
|
931
|
-
image = 'compass';
|
|
932
|
-
cssClass = '';
|
|
933
|
-
}
|
|
934
|
-
let directive;
|
|
935
|
-
if (this.browserLanguage === 'fr') {
|
|
936
|
-
directive = directiveFr;
|
|
937
|
-
}
|
|
938
|
-
else if (this.browserLanguage === 'en') {
|
|
939
|
-
directive = directiveEn;
|
|
940
|
-
}
|
|
941
|
-
return { instruction: directive, image, cssClass };
|
|
942
|
-
}
|
|
943
|
-
translateModifier(modifier) {
|
|
944
|
-
if (modifier === 'uturn') {
|
|
945
|
-
return this.languageService.translate.instant('igo.geo.directions.uturn');
|
|
946
|
-
}
|
|
947
|
-
else if (modifier === 'sharp right') {
|
|
948
|
-
return this.languageService.translate.instant('igo.geo.directions.sharp right');
|
|
949
|
-
}
|
|
950
|
-
else if (modifier === 'right') {
|
|
951
|
-
return this.languageService.translate.instant('igo.geo.directions.right');
|
|
952
|
-
}
|
|
953
|
-
else if (modifier === 'slight right') {
|
|
954
|
-
return this.languageService.translate.instant('igo.geo.directions.slight right');
|
|
955
|
-
}
|
|
956
|
-
else if (modifier === 'sharp left') {
|
|
957
|
-
return this.languageService.translate.instant('igo.geo.directions.sharp left');
|
|
958
|
-
}
|
|
959
|
-
else if (modifier === 'left') {
|
|
960
|
-
return this.languageService.translate.instant('igo.geo.directions.left');
|
|
961
|
-
}
|
|
962
|
-
else if (modifier === 'slight left') {
|
|
963
|
-
return this.languageService.translate.instant('igo.geo.directions.slight left');
|
|
964
|
-
}
|
|
965
|
-
else if (modifier === 'straight') {
|
|
966
|
-
return this.languageService.translate.instant('igo.geo.directions.straight');
|
|
967
|
-
}
|
|
968
|
-
else {
|
|
969
|
-
return modifier;
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
translateBearing(bearing) {
|
|
973
|
-
if (bearing >= 337 || bearing < 23) {
|
|
974
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.n');
|
|
975
|
-
}
|
|
976
|
-
else if (bearing < 67) {
|
|
977
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.ne');
|
|
978
|
-
}
|
|
979
|
-
else if (bearing < 113) {
|
|
980
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.e');
|
|
981
|
-
}
|
|
982
|
-
else if (bearing < 157) {
|
|
983
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.se');
|
|
984
|
-
}
|
|
985
|
-
else if (bearing < 203) {
|
|
986
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.s');
|
|
987
|
-
}
|
|
988
|
-
else if (bearing < 247) {
|
|
989
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.sw');
|
|
990
|
-
}
|
|
991
|
-
else if (bearing < 293) {
|
|
992
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.w');
|
|
993
|
-
}
|
|
994
|
-
else if (bearing < 337) {
|
|
995
|
-
return this.languageService.translate.instant('igo.geo.cardinalPoints.nw');
|
|
996
|
-
}
|
|
997
|
-
else {
|
|
998
|
-
return;
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
formatDistance(distance) {
|
|
1002
|
-
if (distance === 0) {
|
|
1003
|
-
return;
|
|
1004
|
-
}
|
|
1005
|
-
if (distance >= 100000) {
|
|
1006
|
-
return Math.round(distance / 1000) + ' km';
|
|
1007
|
-
}
|
|
1008
|
-
if (distance >= 10000) {
|
|
1009
|
-
return Math.round(distance / 100) / 10 + ' km';
|
|
1010
|
-
}
|
|
1011
|
-
if (distance >= 100) {
|
|
1012
|
-
return Math.round(distance / 100) / 10 + ' km';
|
|
1013
|
-
}
|
|
1014
|
-
return distance + ' m';
|
|
1015
|
-
}
|
|
1016
|
-
formatDuration(duration, summary = false) {
|
|
1017
|
-
if (duration >= 3600) {
|
|
1018
|
-
const hour = Math.floor(duration / 3600);
|
|
1019
|
-
const minute = Math.round((duration / 3600 - hour) * 60);
|
|
1020
|
-
if (minute === 60) {
|
|
1021
|
-
return hour + 1 + ' h';
|
|
1022
|
-
}
|
|
1023
|
-
return hour + ' h ' + minute + ' min';
|
|
1024
|
-
}
|
|
1025
|
-
if (duration >= 60) {
|
|
1026
|
-
return Math.round(duration / 60) + ' min';
|
|
1027
|
-
}
|
|
1028
|
-
return duration + ' s';
|
|
1029
|
-
}
|
|
1030
|
-
showSegment(step, zoomToExtent = false) {
|
|
1031
|
-
this.showRouteSegmentGeometry(step.geometry.coordinates, zoomToExtent);
|
|
1032
|
-
}
|
|
1033
|
-
showRouteSegmentGeometry(coordinates, zoomToExtent = false) {
|
|
1034
|
-
const vertexId = 'vertex';
|
|
1035
|
-
const geometry4326 = new olgeom.LineString(coordinates);
|
|
1036
|
-
const geometryMapProjection = geometry4326.transform('EPSG:4326', this.map.projection);
|
|
1037
|
-
const routeSegmentCoordinates = geometryMapProjection.getCoordinates();
|
|
1038
|
-
const lastPoint = routeSegmentCoordinates[0];
|
|
1039
|
-
const geometry = new olgeom.Point(lastPoint);
|
|
1040
|
-
const feature = new olFeature({ geometry });
|
|
1041
|
-
const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometry, {
|
|
1042
|
-
featureProjection: this.map.projection,
|
|
1043
|
-
dataProjection: this.map.projection
|
|
1044
|
-
});
|
|
1045
|
-
const previousVertex = this.routeStore.get(vertexId);
|
|
1046
|
-
const previousVertexRevision = previousVertex
|
|
1047
|
-
? previousVertex.meta.revision
|
|
1048
|
-
: 0;
|
|
1049
|
-
const vertexFeature = {
|
|
1050
|
-
type: FEATURE,
|
|
1051
|
-
geometry: geojsonGeom,
|
|
1052
|
-
projection: this.map.projection,
|
|
1053
|
-
properties: {
|
|
1054
|
-
id: vertexId,
|
|
1055
|
-
type: 'vertex'
|
|
1056
|
-
},
|
|
1057
|
-
meta: {
|
|
1058
|
-
id: vertexId,
|
|
1059
|
-
revision: previousVertexRevision + 1
|
|
1060
|
-
},
|
|
1061
|
-
ol: feature
|
|
1062
|
-
};
|
|
1063
|
-
this.routeStore.update(vertexFeature);
|
|
1064
|
-
if (zoomToExtent) {
|
|
1065
|
-
this.map.viewController.zoomToExtent(feature.getGeometry().getExtent());
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
zoomRoute(extent) {
|
|
1069
|
-
if (extent) {
|
|
1070
|
-
this.map.viewController.zoomToExtent(extent);
|
|
1071
|
-
}
|
|
1072
|
-
else {
|
|
1073
|
-
if (this.routeStore.layer) {
|
|
1074
|
-
const routeFeature = this.routeStore.layer.ol
|
|
1075
|
-
.getSource()
|
|
1076
|
-
.getFeatures()
|
|
1077
|
-
.find(f => f.getId() === 'route');
|
|
1078
|
-
if (routeFeature) {
|
|
1079
|
-
const routeExtent = routeFeature.getGeometry().getExtent();
|
|
1080
|
-
this.map.viewController.zoomToExtent(routeExtent);
|
|
1081
|
-
}
|
|
1082
|
-
}
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
showRouteGeometry(moveToExtent = false) {
|
|
1086
|
-
const geom = this.activeRoute.geometry.coordinates;
|
|
1087
|
-
const geometry4326 = new olgeom.LineString(geom);
|
|
1088
|
-
const geometryMapProjection = geometry4326.transform('EPSG:4326', this.map.projection);
|
|
1089
|
-
if (moveToExtent) {
|
|
1090
|
-
this.zoomRoute(geometryMapProjection.getExtent());
|
|
1091
|
-
}
|
|
1092
|
-
const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometryMapProjection, {
|
|
1093
|
-
featureProjection: this.map.projection,
|
|
1094
|
-
dataProjection: this.map.projection
|
|
1095
|
-
});
|
|
1096
|
-
const previousRoute = this.routeStore.get('route');
|
|
1097
|
-
const previousRouteRevision = previousRoute
|
|
1098
|
-
? previousRoute.meta.revision
|
|
1099
|
-
: 0;
|
|
1100
|
-
const routeFeature = {
|
|
1101
|
-
type: FEATURE,
|
|
1102
|
-
geometry: geojsonGeom,
|
|
1103
|
-
projection: this.map.projection,
|
|
1104
|
-
properties: {
|
|
1105
|
-
id: 'route',
|
|
1106
|
-
type: 'route'
|
|
1107
|
-
},
|
|
1108
|
-
meta: {
|
|
1109
|
-
id: 'route',
|
|
1110
|
-
revision: previousRouteRevision + 1
|
|
1111
|
-
},
|
|
1112
|
-
ol: new olFeature({ geometry: geometryMapProjection })
|
|
1113
|
-
};
|
|
1114
|
-
this.routeStore.update(routeFeature);
|
|
1115
|
-
}
|
|
1116
|
-
getRoutes(moveToExtent = false, directionsOptions = {}) {
|
|
1117
|
-
this.deleteStoreFeatureByID(this.routeStore, 'vertex');
|
|
1118
|
-
this.writeStopsToFormService();
|
|
1119
|
-
const coords = this.directionsFormService.getStopsCoordinates();
|
|
1120
|
-
if (coords.length < 2) {
|
|
1121
|
-
return;
|
|
1122
|
-
}
|
|
1123
|
-
const routeResponse = this.directionsService.route(coords, directionsOptions);
|
|
1124
|
-
if (routeResponse) {
|
|
1125
|
-
routeResponse.map(res => this.routesQueries$$.push(res.subscribe(route => {
|
|
1126
|
-
this.routesResults = route;
|
|
1127
|
-
this.activeRoute = this.routesResults[0];
|
|
1128
|
-
this.showRouteGeometry(moveToExtent);
|
|
1129
|
-
this.changeDetectorRefs.detectChanges();
|
|
1130
|
-
})));
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
unlistenSingleClick() {
|
|
1134
|
-
if (this.focusKey.length !== 0) {
|
|
1135
|
-
this.focusKey.forEach(key => {
|
|
1136
|
-
olobservable.unByKey(key);
|
|
1137
|
-
});
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
unsubscribeRoutesQueries() {
|
|
1141
|
-
this.routesQueries$$.forEach((sub) => sub.unsubscribe());
|
|
1142
|
-
this.routesQueries$$ = [];
|
|
1143
|
-
}
|
|
1144
|
-
copyLinkToClipboard() {
|
|
1145
|
-
const successful = Clipboard.copy(this.getUrl());
|
|
1146
|
-
if (successful) {
|
|
1147
|
-
const translate = this.languageService.translate;
|
|
1148
|
-
const title = translate.instant('igo.geo.directionsForm.dialog.copyTitle');
|
|
1149
|
-
const msg = translate.instant('igo.geo.directionsForm.dialog.copyMsgLink');
|
|
1150
|
-
this.messageService.success(msg, title);
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
copyDirectionsToClipboard() {
|
|
1154
|
-
const directionsBody = this.directionsToText();
|
|
1155
|
-
const successful = Clipboard.copy(directionsBody);
|
|
1156
|
-
if (successful) {
|
|
1157
|
-
const translate = this.languageService.translate;
|
|
1158
|
-
const title = translate.instant('igo.geo.directionsForm.dialog.copyTitle');
|
|
1159
|
-
const msg = translate.instant('igo.geo.directionsForm.dialog.copyMsg');
|
|
1160
|
-
this.messageService.success(msg, title);
|
|
1161
|
-
}
|
|
1162
|
-
}
|
|
1163
|
-
directionsToText() {
|
|
1164
|
-
const indent = '\t';
|
|
1165
|
-
let activeRouteDirective = this.languageService.translate.instant('igo.geo.directionsForm.instructions') + ':\n';
|
|
1166
|
-
let wayPointList = '';
|
|
1167
|
-
const summary = this.languageService.translate.instant('igo.geo.directionsForm.summary') +
|
|
1168
|
-
': \n' +
|
|
1169
|
-
indent +
|
|
1170
|
-
this.activeRoute.title +
|
|
1171
|
-
'\n' +
|
|
1172
|
-
indent +
|
|
1173
|
-
this.formatDistance(this.activeRoute.distance) +
|
|
1174
|
-
'\n' +
|
|
1175
|
-
indent +
|
|
1176
|
-
this.formatDuration(this.activeRoute.duration) +
|
|
1177
|
-
'\n\n' +
|
|
1178
|
-
this.languageService.translate.instant('igo.geo.directionsForm.stopsList') +
|
|
1179
|
-
':\n';
|
|
1180
|
-
const url = this.languageService.translate.instant('igo.geo.directionsForm.link') +
|
|
1181
|
-
':\n' +
|
|
1182
|
-
indent +
|
|
1183
|
-
this.getUrl();
|
|
1184
|
-
let wayPointsCnt = 1;
|
|
1185
|
-
this.stops.value.forEach(stop => {
|
|
1186
|
-
let coord = '';
|
|
1187
|
-
let stopPoint = '';
|
|
1188
|
-
if (stop.stopPoint !== stop.stopCoordinates) {
|
|
1189
|
-
stopPoint = stop.stopPoint;
|
|
1190
|
-
coord =
|
|
1191
|
-
' (' +
|
|
1192
|
-
[stop.stopCoordinates[1], stop.stopCoordinates[0]].join(',') +
|
|
1193
|
-
')';
|
|
1194
|
-
}
|
|
1195
|
-
else {
|
|
1196
|
-
stopPoint = [stop.stopCoordinates[1], stop.stopCoordinates[0]].join(',');
|
|
1197
|
-
}
|
|
1198
|
-
wayPointList =
|
|
1199
|
-
wayPointList +
|
|
1200
|
-
indent +
|
|
1201
|
-
wayPointsCnt.toLocaleString() +
|
|
1202
|
-
'. ' +
|
|
1203
|
-
stopPoint +
|
|
1204
|
-
coord +
|
|
1205
|
-
'\n';
|
|
1206
|
-
wayPointsCnt++;
|
|
1207
|
-
});
|
|
1208
|
-
// Directions
|
|
1209
|
-
let localCnt = 0;
|
|
1210
|
-
this.activeRoute.steps.forEach(step => {
|
|
1211
|
-
const instruction = this.formatStep(step, localCnt).instruction;
|
|
1212
|
-
const distance = this.formatDistance(step.distance) === undefined
|
|
1213
|
-
? ''
|
|
1214
|
-
: ' (' + this.formatDistance(step.distance) + ')';
|
|
1215
|
-
activeRouteDirective =
|
|
1216
|
-
activeRouteDirective +
|
|
1217
|
-
indent +
|
|
1218
|
-
(localCnt + 1).toLocaleString() +
|
|
1219
|
-
'. ' +
|
|
1220
|
-
instruction +
|
|
1221
|
-
distance +
|
|
1222
|
-
'\n';
|
|
1223
|
-
localCnt++;
|
|
1224
|
-
});
|
|
1225
|
-
const directionsBody = summary + wayPointList + '\n' + url + '\n\n' + activeRouteDirective;
|
|
1226
|
-
return directionsBody;
|
|
1227
|
-
}
|
|
1228
|
-
handleTermChanged(term) {
|
|
1229
|
-
if (term !== undefined || term.length !== 0) {
|
|
1230
|
-
const searchProposals = [];
|
|
1231
|
-
if (this.search$$) {
|
|
1232
|
-
this.search$$.unsubscribe();
|
|
1233
|
-
}
|
|
1234
|
-
const researches = this.searchService.search(term, { searchType: 'Feature' });
|
|
1235
|
-
researches.map(res => this.search$$ =
|
|
1236
|
-
res.request.subscribe(results => {
|
|
1237
|
-
results
|
|
1238
|
-
.filter(r => r.data.geometry)
|
|
1239
|
-
.forEach(element => {
|
|
1240
|
-
if (searchProposals.filter(r => r.source === element.source)
|
|
1241
|
-
.length === 0) {
|
|
1242
|
-
searchProposals.push({
|
|
1243
|
-
source: element.source,
|
|
1244
|
-
meta: element.meta,
|
|
1245
|
-
results: results.map(r => r.data)
|
|
1246
|
-
});
|
|
1247
|
-
}
|
|
1248
|
-
});
|
|
1249
|
-
if (this.stops) {
|
|
1250
|
-
this.stops
|
|
1251
|
-
.at(this.currentStopIndex)
|
|
1252
|
-
.patchValue({ stopProposals: searchProposals });
|
|
1253
|
-
}
|
|
1254
|
-
this.changeDetectorRefs.detectChanges();
|
|
1255
|
-
}));
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
setTerm(term) {
|
|
1259
|
-
this.term = term;
|
|
1260
|
-
if (this.keyIsValid(term) &&
|
|
1261
|
-
(term.length >= this.length || term.length === 0)) {
|
|
1262
|
-
this.stream$.next(term);
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
keyIsValid(key) {
|
|
1266
|
-
return this.invalidKeys.find(value => value === key) === undefined;
|
|
1267
|
-
}
|
|
1268
|
-
keyup(i, event) {
|
|
1269
|
-
const term = event.target.value;
|
|
1270
|
-
this.setTerm(term);
|
|
1271
|
-
this.map.ol.un('singleclick', evt => {
|
|
1272
|
-
this.handleMapClick(evt, i);
|
|
1273
|
-
});
|
|
1274
|
-
}
|
|
1275
|
-
clearStop(stopIndex) {
|
|
1276
|
-
// this.deleteDirectionsOverlaybyID(this.getStopOverlayID(stopIndex));
|
|
1277
|
-
const id = this.getStopOverlayID(stopIndex);
|
|
1278
|
-
this.deleteStoreFeatureByID(this.stopsStore, id);
|
|
1279
|
-
this.routeStore.clear();
|
|
1280
|
-
const stopsCounts = this.stops.length;
|
|
1281
|
-
this.stops.removeAt(stopIndex);
|
|
1282
|
-
this.stops.insert(stopIndex, this.createStop(this.directionsText(stopIndex, stopsCounts)));
|
|
1283
|
-
this.routesResults = undefined;
|
|
1284
|
-
this.getRoutes(false);
|
|
1285
|
-
}
|
|
1286
|
-
chooseProposal(proposal, i) {
|
|
1287
|
-
if (proposal !== undefined) {
|
|
1288
|
-
let geomCoord;
|
|
1289
|
-
const geom = proposal.geometry;
|
|
1290
|
-
if (geom.type === 'Point') {
|
|
1291
|
-
geomCoord = geom.coordinates;
|
|
1292
|
-
}
|
|
1293
|
-
else if (geom.type.search('Line') >= 0) {
|
|
1294
|
-
const line = new OlGeoJSON().readFeatures(geom);
|
|
1295
|
-
geomCoord = line[0].getGeometry().getFirstCoordinate();
|
|
1296
|
-
geomCoord = [geomCoord[0], geomCoord[1]];
|
|
1297
|
-
}
|
|
1298
|
-
else if (geom.type.search('Polygon') >= 0) {
|
|
1299
|
-
const poly = new OlGeoJSON().readFeatures(geom);
|
|
1300
|
-
geomCoord = poly[0].getGeometry().getType() === 'Polygon' ?
|
|
1301
|
-
geomCoord = poly[0].getGeometry().getInteriorPoint().getFirstCoordinate() :
|
|
1302
|
-
geomCoord = poly[0].getGeometry().getInteriorPoints().getFirstCoordinate();
|
|
1303
|
-
geomCoord = [geomCoord[0], geomCoord[1]];
|
|
1304
|
-
}
|
|
1305
|
-
if (geomCoord !== undefined) {
|
|
1306
|
-
this.stops.at(i).patchValue({ stopCoordinates: geomCoord });
|
|
1307
|
-
this.addStopOverlay(geomCoord, i);
|
|
1308
|
-
/* const proposalExtent = this.directionsStopsOverlayDataSource.ol
|
|
1309
|
-
.getFeatureById(this.getStopOverlayID(i))
|
|
1310
|
-
.getGeometry()
|
|
1311
|
-
.getExtent();*/
|
|
1312
|
-
/* if (!olextent.intersects(proposalExtent, this.map.viewController.getExtent())) {
|
|
1313
|
-
this.map.viewController.moveToExtent(proposalExtent);
|
|
1314
|
-
}*/
|
|
1315
|
-
}
|
|
1316
|
-
}
|
|
1317
|
-
}
|
|
1318
|
-
focus(i) {
|
|
1319
|
-
this.unlistenSingleClick();
|
|
1320
|
-
this.currentStopIndex = i;
|
|
1321
|
-
this.focusOnStop = true;
|
|
1322
|
-
this.focusKey.push(this.map.ol.once('singleclick', evt => {
|
|
1323
|
-
this.handleMapClick(evt, i);
|
|
1324
|
-
}));
|
|
1325
|
-
}
|
|
1326
|
-
handleMapClick(event, indexPos) {
|
|
1327
|
-
if (this.currentStopIndex === undefined) {
|
|
1328
|
-
this.addStop();
|
|
1329
|
-
indexPos = this.stops.length - 2;
|
|
1330
|
-
this.stops.at(indexPos).value.stopProposals = [];
|
|
1331
|
-
}
|
|
1332
|
-
else {
|
|
1333
|
-
indexPos = this.currentStopIndex;
|
|
1334
|
-
}
|
|
1335
|
-
const clickCoordinates = olproj.transform(event.coordinate, this.map.projection, this.projection);
|
|
1336
|
-
this.stops
|
|
1337
|
-
.at(indexPos)
|
|
1338
|
-
.patchValue({ stopProposals: [], stopCoordinates: clickCoordinates });
|
|
1339
|
-
this.handleLocationProposals(clickCoordinates, indexPos);
|
|
1340
|
-
this.addStopOverlay(clickCoordinates, indexPos);
|
|
1341
|
-
setTimeout(() => {
|
|
1342
|
-
this.focusOnStop = false; // prevent to trigger map click and Select on routes at same time.
|
|
1343
|
-
}, 500);
|
|
1344
|
-
}
|
|
1345
|
-
geolocateStop(index) {
|
|
1346
|
-
moveToOlFeatures(this.map, [this.map.geolocationFeature], FeatureMotion.Move);
|
|
1347
|
-
const geolocateCoordinates = this.map.viewController.getCenter(this.projection);
|
|
1348
|
-
this.stops.at(index).patchValue({ stopCoordinates: geolocateCoordinates });
|
|
1349
|
-
this.addStopOverlay(geolocateCoordinates, index);
|
|
1350
|
-
this.handleLocationProposals(geolocateCoordinates, index);
|
|
1351
|
-
}
|
|
1352
|
-
addStopOverlay(coordinates, index) {
|
|
1353
|
-
const directionsText = this.directionsText(index);
|
|
1354
|
-
let stopColor;
|
|
1355
|
-
let stopText;
|
|
1356
|
-
if (directionsText === 'start') {
|
|
1357
|
-
stopColor = '#008000';
|
|
1358
|
-
stopText = this.languageService.translate.instant('igo.geo.directionsForm.start');
|
|
1359
|
-
}
|
|
1360
|
-
else if (directionsText === 'end') {
|
|
1361
|
-
stopColor = '#f64139';
|
|
1362
|
-
stopText = this.languageService.translate.instant('igo.geo.directionsForm.end');
|
|
1363
|
-
}
|
|
1364
|
-
else {
|
|
1365
|
-
stopColor = '#ffd700';
|
|
1366
|
-
stopText =
|
|
1367
|
-
this.languageService.translate.instant('igo.geo.directionsForm.intermediate') +
|
|
1368
|
-
' #' +
|
|
1369
|
-
index;
|
|
1370
|
-
}
|
|
1371
|
-
const geometry = new olgeom.Point(olproj.transform(coordinates, this.projection, this.map.projection));
|
|
1372
|
-
const stopID = this.getStopOverlayID(index);
|
|
1373
|
-
const geojsonGeom = new OlGeoJSON().writeGeometryObject(geometry, {
|
|
1374
|
-
featureProjection: this.map.projection,
|
|
1375
|
-
dataProjection: this.map.projection
|
|
1376
|
-
});
|
|
1377
|
-
const previousStop = this.stopsStore.get(stopID);
|
|
1378
|
-
const previousStopRevision = previousStop ? previousStop.meta.revision : 0;
|
|
1379
|
-
const stopFeature = {
|
|
1380
|
-
type: FEATURE,
|
|
1381
|
-
geometry: geojsonGeom,
|
|
1382
|
-
projection: this.map.projection,
|
|
1383
|
-
properties: {
|
|
1384
|
-
id: stopID,
|
|
1385
|
-
type: 'stop',
|
|
1386
|
-
stopText,
|
|
1387
|
-
stopColor,
|
|
1388
|
-
stopOpacity: 1
|
|
1389
|
-
},
|
|
1390
|
-
meta: {
|
|
1391
|
-
id: stopID,
|
|
1392
|
-
revision: previousStopRevision + 1
|
|
1393
|
-
},
|
|
1394
|
-
ol: new olFeature({ geometry })
|
|
1395
|
-
};
|
|
1396
|
-
this.stopsStore.update(stopFeature);
|
|
1397
|
-
this.getRoutes();
|
|
1398
|
-
}
|
|
1399
|
-
getStopOverlayID(index) {
|
|
1400
|
-
let txt;
|
|
1401
|
-
if (index === 0) {
|
|
1402
|
-
txt = 'start';
|
|
1403
|
-
}
|
|
1404
|
-
else if (index === this.stops.length - 1) {
|
|
1405
|
-
txt = 'end';
|
|
1406
|
-
}
|
|
1407
|
-
else {
|
|
1408
|
-
txt = index;
|
|
1409
|
-
}
|
|
1410
|
-
return 'directionsStop_' + txt;
|
|
1411
|
-
}
|
|
1412
|
-
deleteStoreFeatureByID(store, id) {
|
|
1413
|
-
const entity = store.get(id);
|
|
1414
|
-
if (entity) {
|
|
1415
|
-
store.delete(entity);
|
|
1416
|
-
}
|
|
1417
|
-
}
|
|
1418
|
-
getUrl() {
|
|
1419
|
-
if (!this.route) {
|
|
1420
|
-
return;
|
|
1421
|
-
}
|
|
1422
|
-
const directionsKey = this.route.options.directionsCoordKey;
|
|
1423
|
-
const stopsCoordinates = [];
|
|
1424
|
-
if (this.directionsFormService &&
|
|
1425
|
-
this.directionsFormService.getStopsCoordinates() &&
|
|
1426
|
-
this.directionsFormService.getStopsCoordinates().length !== 0) {
|
|
1427
|
-
this.directionsFormService.getStopsCoordinates().forEach(coord => {
|
|
1428
|
-
stopsCoordinates.push(roundCoordTo(coord, 6));
|
|
1429
|
-
});
|
|
1430
|
-
}
|
|
1431
|
-
let directionsUrl = '';
|
|
1432
|
-
if (stopsCoordinates.length >= 2) {
|
|
1433
|
-
directionsUrl = `${directionsKey}=${stopsCoordinates.join(';')}`;
|
|
1434
|
-
}
|
|
1435
|
-
return `${location.origin}${location.pathname}?tool=directions&sidenav=1&${directionsUrl}`;
|
|
1436
|
-
}
|
|
1437
|
-
}
|
|
1438
|
-
DirectionsFormComponent.ɵfac = function DirectionsFormComponent_Factory(t) { return new (t || DirectionsFormComponent)(i0.ɵɵdirectiveInject(i1.FormBuilder), i0.ɵɵdirectiveInject(i2.DirectionsService), i0.ɵɵdirectiveInject(i3.LanguageService), i0.ɵɵdirectiveInject(i3.MessageService), i0.ɵɵdirectiveInject(i4.SearchService), i0.ɵɵdirectiveInject(i5.QueryService), i0.ɵɵdirectiveInject(i6.DirectionsFormService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i3.RouteService, 8)); };
|
|
1439
|
-
DirectionsFormComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DirectionsFormComponent, selectors: [["igo-directions-form"]], inputs: { term: "term", debounce: "debounce", length: "length", map: "map", stopsStore: "stopsStore", routeFromFeatureDetail: "routeFromFeatureDetail", routeStore: "routeStore" }, outputs: { activeRouteDescription: "activeRouteDescription" }, decls: 11, vars: 10, consts: [[1, "igo-form", 3, "formGroup"], ["formArrayName", "stops", 4, "ngFor", "ngForOf"], [1, "igo-form-button-group"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "primary", 3, "matTooltip", "click"], ["svgIcon", "map-marker-plus"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "primary", 3, "matTooltip", "click", 4, "ngIf"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "warn", 3, "matTooltip", "click", 4, "ngIf"], ["class", "igo-input-container", 4, "ngIf"], ["formArrayName", "stops"], ["inputs", ""], [3, "formGroupName"], [1, "igo-input-container"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "click", 4, "ngIf"], ["matInput", "", "formControlName", "stopPoint", 3, "matAutocomplete", "placeholder", "focus", "keyup", "keydown.enter"], ["mat-button", "", "matSuffix", "", "mat-icon-button", "", "color", "warn", "aria-label", "Clear", 3, "click", 4, "ngIf"], ["auto", "matAutocomplete"], [3, "label", "disabled", 4, "ngFor", "ngForOf"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "click"], ["svgIcon", "crosshairs-gps"], ["mat-button", "", "matSuffix", "", "mat-icon-button", "", "color", "warn", "aria-label", "Clear", 3, "click"], ["svgIcon", "close"], [3, "label", "disabled"], ["matTooltipShowDelay", "500", 3, "value", "matTooltip", "onSelectionChange", 4, "ngFor", "ngForOf"], ["matTooltipShowDelay", "500", 3, "value", "matTooltip", "onSelectionChange"], ["mat-icon-button", "", "tooltip-position", "below", "matTooltipShowDelay", "500", "color", "warn", 3, "matTooltip", "click"], ["svgIcon", "delete"], ["svgIcon", "magnify-plus-outline"], ["svgIcon", "file-restore"], ["svgIcon", "content-copy"], ["svgIcon", "link"], [4, "ngIf"], ["mat-header", "", 1, "igo-route-title", "mat-typography"], ["mat-subheader", ""], ["class", "igo-steps", "igoListItem", "", 3, "mouseenter", "click", 4, "ngFor", "ngForOf"], [3, "placeholder", "ngModel", "selectionChange", "ngModelChange"], [3, "value", 4, "ngFor", "ngForOf"], [3, "value"], ["igoListItem", "", 1, "igo-steps", 3, "mouseenter", "click"], ["mat-list-icon", "", 3, "ngClass", "svgIcon"], ["mat-line", ""], ["mat-line", "", 1, "right"]], template: function DirectionsFormComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1440
|
-
i0.ɵɵelementStart(0, "form", 0);
|
|
1441
|
-
i0.ɵɵtemplate(1, DirectionsFormComponent_div_1_Template, 13, 9, "div", 1);
|
|
1442
|
-
i0.ɵɵelementStart(2, "div", 2);
|
|
1443
|
-
i0.ɵɵelementStart(3, "button", 3);
|
|
1444
|
-
i0.ɵɵlistener("click", function DirectionsFormComponent_Template_button_click_3_listener() { return ctx.addStop(); });
|
|
1445
|
-
i0.ɵɵpipe(4, "translate");
|
|
1446
|
-
i0.ɵɵelement(5, "mat-icon", 4);
|
|
1447
|
-
i0.ɵɵelementEnd();
|
|
1448
|
-
i0.ɵɵtemplate(6, DirectionsFormComponent_button_6_Template, 3, 3, "button", 5);
|
|
1449
|
-
i0.ɵɵtemplate(7, DirectionsFormComponent_button_7_Template, 3, 3, "button", 6);
|
|
1450
|
-
i0.ɵɵtemplate(8, DirectionsFormComponent_button_8_Template, 3, 3, "button", 5);
|
|
1451
|
-
i0.ɵɵtemplate(9, DirectionsFormComponent_button_9_Template, 3, 3, "button", 5);
|
|
1452
|
-
i0.ɵɵelementEnd();
|
|
1453
|
-
i0.ɵɵelementEnd();
|
|
1454
|
-
i0.ɵɵtemplate(10, DirectionsFormComponent_div_10_Template, 10, 6, "div", 7);
|
|
1455
|
-
} if (rf & 2) {
|
|
1456
|
-
i0.ɵɵproperty("formGroup", ctx.stopsForm);
|
|
1457
|
-
i0.ɵɵadvance(1);
|
|
1458
|
-
i0.ɵɵproperty("ngForOf", ctx.stops.controls);
|
|
1459
|
-
i0.ɵɵadvance(2);
|
|
1460
|
-
i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(4, 8, "igo.geo.directionsForm.addStop"));
|
|
1461
|
-
i0.ɵɵadvance(3);
|
|
1462
|
-
i0.ɵɵproperty("ngIf", ctx.routesResults);
|
|
1463
|
-
i0.ɵɵadvance(1);
|
|
1464
|
-
i0.ɵɵproperty("ngIf", ctx.routesResults);
|
|
1465
|
-
i0.ɵɵadvance(1);
|
|
1466
|
-
i0.ɵɵproperty("ngIf", ctx.routesResults);
|
|
1467
|
-
i0.ɵɵadvance(1);
|
|
1468
|
-
i0.ɵɵproperty("ngIf", ctx.routesResults);
|
|
1469
|
-
i0.ɵɵadvance(1);
|
|
1470
|
-
i0.ɵɵproperty("ngIf", ctx.routesResults);
|
|
1471
|
-
} }, directives: [i1.ɵNgNoValidate, i1.NgControlStatusGroup, i1.FormGroupDirective, i7.NgForOf, i8.MatButton, i9.MatTooltip, i10.MatIcon, i7.NgIf, i1.FormArrayName, i11.MatListItem, i1.FormGroupName, i12.MatFormField, i13.MatInput, i1.DefaultValueAccessor, i14.MatAutocompleteTrigger, i1.NgControlStatus, i1.FormControlName, i14.MatAutocomplete, i12.MatSuffix, i15.MatOptgroup, i15.MatOption, i11.MatList, i11.MatListSubheaderCssMatStyler, i16.MatDivider, i17.MatSelect, i1.NgModel, i11.MatListIconCssMatStyler, i7.NgClass, i15.MatLine], pipes: [i18.TranslatePipe], styles: ["mat-form-field[_ngcontent-%COMP%]{width:85%}.igo-route-title[_ngcontent-%COMP%]{font-weight:bold}.igo-steps[_ngcontent-%COMP%]{cursor:pointer}form[_ngcontent-%COMP%]{padding:10px}h3[_ngcontent-%COMP%]{padding-left:5px;padding-right:5px}.mat-line[_ngcontent-%COMP%]{word-wrap:break-word!important;white-space:pre-wrap!important}.mat-line.right[_ngcontent-%COMP%]{text-align:right}.rotate-90[_ngcontent-%COMP%]{transform:rotate(90deg)}.rotate-45[_ngcontent-%COMP%]{transform:rotate(45deg)}.rotate-270[_ngcontent-%COMP%]{transform:rotate(270deg)}.rotate-250[_ngcontent-%COMP%]{transform:rotate(250deg)}.rotate-290[_ngcontent-%COMP%]{transform:rotate(290deg)}.icon-flipped[_ngcontent-%COMP%]{transform:scaleY(-1)}"] });
|
|
1472
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DirectionsFormComponent, [{
|
|
1473
|
-
type: Component,
|
|
1474
|
-
args: [{
|
|
1475
|
-
selector: 'igo-directions-form',
|
|
1476
|
-
templateUrl: './directions-form.component.html',
|
|
1477
|
-
styleUrls: ['./directions-form.component.scss']
|
|
1478
|
-
}]
|
|
1479
|
-
}], function () { return [{ type: i1.FormBuilder }, { type: i2.DirectionsService }, { type: i3.LanguageService }, { type: i3.MessageService }, { type: i4.SearchService }, { type: i5.QueryService }, { type: i6.DirectionsFormService }, { type: i0.ChangeDetectorRef }, { type: i3.RouteService, decorators: [{
|
|
1480
|
-
type: Optional
|
|
1481
|
-
}] }]; }, { term: [{
|
|
1482
|
-
type: Input
|
|
1483
|
-
}], debounce: [{
|
|
1484
|
-
type: Input
|
|
1485
|
-
}], length: [{
|
|
1486
|
-
type: Input
|
|
1487
|
-
}], map: [{
|
|
1488
|
-
type: Input
|
|
1489
|
-
}], stopsStore: [{
|
|
1490
|
-
type: Input
|
|
1491
|
-
}], routeFromFeatureDetail: [{
|
|
1492
|
-
type: Input
|
|
1493
|
-
}], routeStore: [{
|
|
1494
|
-
type: Input
|
|
1495
|
-
}], activeRouteDescription: [{
|
|
1496
|
-
type: Output
|
|
1497
|
-
}] }); })();
|
|
1498
|
-
/**
|
|
1499
|
-
* Create a style for the directions stops and routes
|
|
1500
|
-
* @param feature OlFeature
|
|
1501
|
-
* @returns OL style function
|
|
1502
|
-
*/
|
|
1503
|
-
export function stopMarker(feature, resolution) {
|
|
1504
|
-
const vertexStyle = [
|
|
1505
|
-
new olstyle.Style({
|
|
1506
|
-
geometry: feature.getGeometry(),
|
|
1507
|
-
image: new olstyle.Circle({
|
|
1508
|
-
radius: 7,
|
|
1509
|
-
stroke: new olstyle.Stroke({ color: '#FF0000', width: 3 })
|
|
1510
|
-
})
|
|
1511
|
-
})
|
|
1512
|
-
];
|
|
1513
|
-
const stopStyle = createOverlayMarkerStyle({
|
|
1514
|
-
text: feature.get('stopText'),
|
|
1515
|
-
opacity: feature.get('stopOpacity'),
|
|
1516
|
-
markerColor: feature.get('stopColor'),
|
|
1517
|
-
markerOutlineColor: [255, 255, 255]
|
|
1518
|
-
});
|
|
1519
|
-
const routeStyle = [
|
|
1520
|
-
new olstyle.Style({
|
|
1521
|
-
stroke: new olstyle.Stroke({ color: 'rgba(106, 121, 130, 0.75)', width: 10 })
|
|
1522
|
-
}),
|
|
1523
|
-
new olstyle.Style({
|
|
1524
|
-
stroke: new olstyle.Stroke({ color: 'rgba(79, 169, 221, 0.75)', width: 6 })
|
|
1525
|
-
})
|
|
1526
|
-
];
|
|
1527
|
-
if (feature.get('type') === 'stop') {
|
|
1528
|
-
return stopStyle;
|
|
1529
|
-
}
|
|
1530
|
-
if (feature.get('type') === 'vertex') {
|
|
1531
|
-
return vertexStyle;
|
|
1532
|
-
}
|
|
1533
|
-
if (feature.get('type') === 'route') {
|
|
1534
|
-
return routeStyle;
|
|
1535
|
-
}
|
|
1536
|
-
}
|
|
1537
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9ucy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2RpcmVjdGlvbnMvZGlyZWN0aW9ucy1mb3JtL2RpcmVjdGlvbnMtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kaXJlY3Rpb25zL2RpcmVjdGlvbnMtZm9ybS9kaXJlY3Rpb25zLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFHWixRQUFRLEVBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUEwQixVQUFVLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQWdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNKLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGFBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEtBQUssWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUc5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBT3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDbEIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQVM5RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNqRG5GLGtDQUFtTTtJQUEzQixxUEFBMEI7O0lBQ2hNLCtCQUE4QztJQUNoRCxpQkFBUzs7SUFGaUcscUZBQTZEOzs7O0lBT25LLGtDQUdtRjtJQUF2QixpUEFBc0I7SUFDaEYsK0JBQXFDO0lBQ3ZDLGlCQUFTOzs7O0lBSVAsc0NBRThFO0lBRDlFLGlYQUE4QztJQUU1QyxZQUNGO0lBQUEsaUJBQWE7OztJQUpxQyxvRUFBOEMsNERBQUE7SUFHOUYsZUFDRjtJQURFLDZFQUNGOzs7SUFMRix3Q0FBeUk7SUFDdkksNkdBSWE7SUFDZixpQkFBZTs7O0lBTitDLCtDQUE2QixpREFBQTtJQUMxRCxlQUFpQjtJQUFqQiw0Q0FBaUI7Ozs7SUFxQnBELGtDQUN1QztJQUF4QixtUEFBdUI7O0lBQ3BDLCtCQUFzQztJQUN4QyxpQkFBUzs7SUFINEcsc0ZBQThEOzs7O0lBekMzTCxpQ0FBdUY7SUFDckYseUNBQW1DO0lBRWpDLCtCQUFpQztJQUMvQixxRkFFUztJQUNULHNDQUFnQjtJQUNkLGlDQUU4RDtJQURzQixnUEFBa0IsaVBBQUEseU1BQUE7O0lBRHRHLGlCQUU4RDtJQUM1RCxxRkFLUztJQUVYLGtEQUEwQztJQUN4QyxtR0FNZTtJQUNqQixpQkFBbUI7SUFDckIsaUJBQWlCO0lBY2Ysc0ZBR1M7SUFFYixpQkFBTTtJQUVSLGlCQUFnQjtJQUNsQixpQkFBTTs7Ozs7O0lBaERXLGVBQW1CO0lBQW5CLG9DQUFtQjtJQUdyQixlQUE0QjtJQUE1QixvREFBNEI7SUFLakMsZUFBaUY7SUFBakYsdUhBQWlGO0lBRHZDLHNDQUF3QjtJQUsvRCxlQUE0RjtJQUE1RixzSEFBNEY7SUFNOUQsZUFBMkI7SUFBM0IscURBQTJCO0lBc0JyRCxlQUF1QztJQUF2QyxxRUFBdUM7Ozs7SUFjdEQsaUNBRXdCO0lBQXRCLGdNQUFxQjs7SUFDckIsK0JBQW9EO0lBQ3RELGlCQUFTOztJQUhQLHFGQUE2RDs7OztJQUkvRCxrQ0FFNEI7SUFBMUIsMkxBQW1CLElBQUksS0FBRTs7SUFDekIsK0JBQTRDO0lBQzlDLGlCQUFTOztJQUhQLDhGQUFzRTs7OztJQUl4RSxpQ0FDaUg7SUFBdEMsZ05BQXFDOztJQUM5RywrQkFBNEM7SUFDOUMsaUJBQVM7O0lBRlAsZ0ZBQXdEOzs7O0lBRzFELGlDQUMyRztJQUFoQywwTUFBK0I7O0lBQ3hHLCtCQUFvQztJQUN0QyxpQkFBUzs7SUFGUCxnRkFBd0Q7OztJQVV4RCxzQ0FBb0c7SUFDbEcsWUFDRjtJQUFBLGlCQUFhOzs7OztJQUY4RCwwQ0FBd0I7SUFDakcsZUFDRjtJQURFLDJLQUNGOzs7O0lBSkosc0NBQWtFO0lBQ2hFLHNDQUE4STtJQUE1RCwwT0FBaUMsc09BQUE7O0lBQ2pILCtHQUVhO0lBQ2YsaUJBQWE7SUFDZixpQkFBaUI7OztJQUxILGVBQXFFO0lBQXJFLHNHQUFxRTtJQUFtQyw2Q0FBeUI7SUFDcEcsZUFBa0I7SUFBbEIsK0NBQWtCOzs7SUFNN0QsOEJBQStFOzs7O0lBTTdFLHlDQUtjO0lBSGQsc1NBQWdDLDRRQUNOLElBQUksS0FERTtJQUk5QiwrQkFBc0g7SUFFdEgsOEJBQWE7SUFBQSxZQUFnRDtJQUFBLGlCQUFLO0lBQ2xFLDhCQUEyQjtJQUFBLFlBQWlDO0lBQUEsaUJBQUs7SUFDbkUsaUJBQWdCOzs7OztJQUpvRCxlQUF3QztJQUF4QyxnRkFBd0M7SUFBaEcsd0VBQXlDO0lBRXRDLGVBQWdEO0lBQWhELG1HQUFnRDtJQUNsQyxlQUFpQztJQUFqQywrREFBaUM7OztJQXhCbEUsK0JBQXVEO0lBQ3JELHNHQU1pQjtJQUVqQixnR0FBK0U7SUFFL0UsZ0NBQVU7SUFDUiw4QkFBc0Q7SUFBQSxZQUFxQjtJQUFBLGlCQUFLO0lBQ2hGLDhCQUFrQjtJQUFBLFlBQWtGO0lBQUEsaUJBQUs7SUFFekcsb0dBVWdCO0lBRWhCLDhCQUEyQjtJQUU3QixpQkFBVztJQUViLGlCQUFNOzs7SUE5QmEsZUFBK0M7SUFBL0MsOEVBQStDO0lBUWxELGVBQWlEO0lBQWpELGdGQUFpRDtJQUdQLGVBQXFCO0lBQXJCLDhDQUFxQjtJQUN6RCxlQUFrRjtJQUFsRiwySUFBa0Y7SUFNbkYsZUFBc0I7SUFBdEIsa0RBQXNCOztBRHBDM0MsTUFBTSxPQUFPLHVCQUF1QjtJQTBFbEMsWUFDVSxXQUF3QixFQUN4QixpQkFBb0MsRUFDcEMsZUFBZ0MsRUFDaEMsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIscUJBQTRDLEVBQzVDLGtCQUFxQyxFQUN6QixLQUFtQjtRQVIvQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQ3pCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFsRnhCLGdCQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5ELG9CQUFlLEdBQW1CLEVBQUUsQ0FBQztRQUd0QyxlQUFVLEdBQUcsV0FBVyxDQUFDO1FBRXpCLG9CQUFlLEdBQW1CLEVBQUUsQ0FBQztRQU1wQyxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQWNqQyxpQkFBWSxHQUFnQyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUcxRSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBTWIsYUFBUSxHQUFXLEdBQUcsQ0FBQztRQUV2QixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBaUI1QixnQkFBVyxHQUFrQyxJQUFJLGVBQWUsQ0FBZSxTQUFTLENBQUMsQ0FBQztRQWdCaEYsMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQVczRCxDQUFDO0lBbkVKLElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsS0FBaUI7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3pGLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFrQkQ7O09BRUc7SUFDSCxJQUNJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLEtBQW1CO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFLRCxJQUNJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsSUFBSSxzQkFBc0IsQ0FBQyxLQUFjO1FBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQXFCRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBSztRQUNYLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN0QyxjQUFjLEVBQUUsS0FBSztZQUNyQixjQUFjLEVBQUUsU0FBUztZQUN6QixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLHVCQUF1QixFQUFFLEtBQUs7WUFDOUIsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7YUFDdkIsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ3ZCLElBQUksQ0FBQyxPQUFPO2FBQ1QsSUFBSSxDQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQzNCLG9CQUFvQixFQUFFLENBQ3ZCO2FBQ0EsU0FBUyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDN0QsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUM5QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUMzQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFOzRCQUMxRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzt5QkFDakM7cUJBQ0Y7b0JBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDVixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7d0JBRXZCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRTs0QkFDM0MsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUMvQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNoQyxDQUFDLEVBQUUsQ0FBQzt5QkFDTDt3QkFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBRTFDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNwRSxJQUFJLGFBQWEsRUFBRTs0QkFDakIsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQ0FDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQWUsQ0FBQztnQ0FDdkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7NEJBQzFDLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQzt5QkFDSDtxQkFFRjt5QkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDN0MsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDL0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQzdFO2dCQUNILENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDTixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO2FBQ3JDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sVUFBVTtRQUNoQixNQUFNLGVBQWUsR0FBRyxJQUFJLDJCQUEyQixDQUFDO1lBQ3RELE1BQU0sRUFBRSxhQUFhLENBQUMsSUFBSTtTQUMzQixDQUFDLENBQUM7UUFFSCxhQUFhO1FBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUNqQyxFQUFFLEVBQUUsMkJBQTJCO1lBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUM7WUFDakYsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsSUFBSSxpQkFBaUIsRUFBRTtZQUMvQixlQUFlLEVBQUUsSUFBSTtZQUNyQixTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLEtBQUs7YUFDZjtZQUNELFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsMkJBQTJCO2dCQUNuQyxLQUFLLEVBQUU7b0JBQ0w7d0JBQ0UsY0FBYyxFQUFFLEtBQUs7d0JBQ3JCLFlBQVksRUFBRSxJQUFJO3dCQUNsQixTQUFTLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQzt3QkFDeEMsVUFBVSxFQUFFLEVBQUU7cUJBQ2Y7aUJBQ0Y7YUFDRjtZQUNELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxVQUFVO1NBQ2xCLENBQUMsQ0FBQztRQUNILGlCQUFpQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDaEMscUJBQXFCLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBRW5ELHlCQUF5QjtRQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksV0FBVyxDQUFDO1lBQ2pDLEVBQUUsRUFBRSwyQkFBMkI7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQztZQUNsRixNQUFNLEVBQUUsR0FBRztZQUNYLE1BQU0sRUFBRSxJQUFJLGlCQUFpQixFQUFFO1lBQy9CLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFNBQVMsRUFBRTtnQkFDVCxPQUFPLEVBQUUsS0FBSzthQUNmO1lBQ0QsWUFBWSxFQUFFO2dCQUNaLE1BQU0sRUFBRSwyQkFBMkI7YUFDcEM7WUFDRCxVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsVUFBVTtTQUNsQixDQUFDLENBQUM7UUFDSCxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0QsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDL0QsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksbUJBQW1CLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDekMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLFNBQVMsRUFBRSxXQUFXLENBQUMsV0FBVztZQUNsQyxZQUFZLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQztZQUN4QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUMvQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixvREFBb0Q7U0FDckQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDOUIsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUM5QixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUM5QixJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzVDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEtBQUs7WUFDNUIsWUFBWSxFQUFFLENBQUM7WUFDZixNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2hCLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLE9BQU8sQ0FBQztZQUNyQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLEVBQUU7Z0JBQzlCLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDdkMsR0FBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUNuQixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO2dCQUNGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBcUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBcUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7YUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWTtRQUNsQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsVUFBVSxDQUFDLHdCQUF3QixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDakUsVUFBVSxDQUFDLHdCQUF3QixDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixRQUFRLEVBQ1IscUJBQXFCLEdBQUcsS0FBSyxFQUM3QixRQUFnQixDQUFDLEVBQ2pCLFdBQW9CLEtBQUs7UUFFekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLENBQUM7UUFDTixRQUFRLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixLQUFLLE9BQU87Z0JBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDTixNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQzFCLE1BQU07WUFDUjtnQkFDRSxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixNQUFNO1NBQ1Q7UUFDRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQzdDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxjQUFjLEVBQUUsRUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQ25CLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSzthQUNQLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDTCxVQUFVLENBQUM7WUFDVixlQUFlLEVBQUUsc0JBQXNCO1lBQ3ZDLGFBQWEsRUFBRSxFQUFFO1NBQ2xCLENBQUMsQ0FBQztRQUNMLElBQUkscUJBQXFCLEVBQUU7WUFDekIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHNCQUEwQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdFO1FBRUQsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxLQUFLO1lBQ2YsWUFBWSxFQUFFLElBQUk7U0FDRSxDQUFDO1FBRXZCLElBQUksUUFBUSxFQUFFO1lBQ1osaUJBQWlCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDeEM7UUFFRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixJQUFJLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixLQUFLLFdBQVcsRUFBRTtnQkFDbEQsc0NBQXNDO2dCQUN0QyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDdkM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUMvQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDWDthQUFNO1lBQ0wsWUFBWSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsV0FBNkIsRUFBRSxTQUFpQjtRQUN0RSxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUM1QixNQUFNLGtCQUFrQixHQUFHO1lBQ3pCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzFCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSzthQUNQLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDYixVQUFVLENBQUMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsYUFBYTthQUNmLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzthQUN2RSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDVCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdkIsSUFDRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUM7cUJBQ3JELE1BQU0sS0FBSyxDQUFDLEVBQ2Y7b0JBQ0EsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUNwQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07d0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztxQkFDbEMsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsS0FBSztpQkFDUCxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNiLFVBQVUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDbkQsK0JBQStCO1lBQy9CLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNkLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxpQkFBaUIsRUFBRTtvQkFDbkQsdUJBQXVCO29CQUN2QixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN2QyxNQUFNLE9BQU8sR0FBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUNyQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTs0QkFDMUMsU0FBUyxHQUFHLENBQUMsQ0FBQzs0QkFDZCxNQUFNO3lCQUNQO3FCQUNGO29CQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQzt3QkFDbEMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQzlDLENBQUMsQ0FBQztvQkFDSCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7d0JBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQzs0QkFDbEMsZUFBZSxFQUNiLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVc7eUJBQy9DLENBQUMsQ0FBQztxQkFDSjt5QkFBTTt3QkFDTCxxRUFBcUU7cUJBQ3RFO2lCQUNGO3FCQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxvQkFBb0IsRUFBRTtvQkFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDO3dCQUNsQyxTQUFTLEVBQUU7NEJBQ1QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7NEJBQ2xELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3lCQUNuRCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7cUJBQ1osQ0FBQyxDQUFDO29CQUNILElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTt3QkFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDOzRCQUNsQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVzt5QkFDdEQsQ0FBQyxDQUFDO3FCQUNKO3lCQUFNO3dCQUNMLHFFQUFxRTtxQkFDdEU7aUJBQ0Y7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsS0FBSztxQkFDUCxFQUFFLENBQUMsU0FBUyxDQUFDO3FCQUNiLFVBQVUsQ0FBQztvQkFDVixTQUFTLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDdkMsYUFBYSxFQUFFLEVBQUU7aUJBQ2xCLENBQUMsQ0FBQzthQUNOO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBYSxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07UUFDM0QsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2YsT0FBTyxPQUFPLENBQUM7U0FDaEI7YUFBTSxJQUFJLEtBQUssS0FBSyxXQUFXLEdBQUcsQ0FBQyxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7WUFDekQsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsT0FBTyxjQUFjLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNyQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsS0FBSzthQUNQLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDVCxVQUFVLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUs7YUFDUCxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzthQUNoQixVQUFVLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDeEU7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ3JELElBQUksQ0FBQyxjQUFjLENBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUNqRCxLQUFLLEdBQUcsSUFBSSxDQUNiLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBYyxDQUFDO0lBQ2xELENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxVQUFXO1FBQ3hDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0wsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxZQUFZLEtBQUssRUFBRTtvQkFDekMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbEI7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFVBQVUsQ0FBQyxhQUFhLEdBQUcsY0FBYztRQUN2QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQzVCLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNmLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuQixjQUFjLEVBQUUsYUFBYTtZQUM3QixlQUFlLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUs7aUJBQ1AsRUFBRSxDQUFDLEdBQUcsQ0FBQztpQkFDUCxVQUFVLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLEdBQUcsRUFBRSxDQUFDO1FBQ1IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUFDLElBQWE7UUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRztRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUN0QixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUMzQixHQUFHLEVBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ2xCLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQixDQUNmLElBQUksRUFDSixRQUFRLEVBQ1IsS0FBSyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osSUFBSSxFQUNKLFFBQVEsR0FBRyxLQUFLO1FBRWhCLElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksV0FBVyxDQUFDO1FBQ2hCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUM7UUFDNUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDMUQsTUFBTSxRQUFRLEdBQUcsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFckQsSUFBSSxxQkFBcUIsR0FBRyxRQUFRLEdBQUcsa0JBQWtCLENBQUM7UUFDMUQsSUFBSSxxQkFBcUIsR0FBRyxRQUFRLEdBQUcsa0JBQWtCLENBQUM7UUFFMUQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUMscUJBQXFCLEdBQUcsa0JBQWtCLENBQUM7U0FDNUM7UUFFRCxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7WUFDeEIsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUNsQixRQUFRLEdBQUcsV0FBVyxDQUFDO1NBQ3hCO2FBQU0sSUFBSSxRQUFRLEtBQUssYUFBYSxFQUFFO1lBQ3JDLEtBQUssR0FBRywwQkFBMEIsQ0FBQztZQUNuQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1NBQzNCO2FBQU0sSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQy9CLEtBQUssR0FBRywwQkFBMEIsQ0FBQztZQUNuQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1NBQzNCO2FBQU0sSUFBSSxRQUFRLEtBQUssY0FBYyxFQUFFO1lBQ3RDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDbEIsUUFBUSxHQUFHLFlBQVksQ0FBQztTQUN6QjthQUFNLElBQUksUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUNsQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1NBQ25CO2FBQU0sSUFBSSxRQUFRLEtBQUssYUFBYSxFQUFFO1lBQ3JDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDbEIsUUFBUSxHQUFHLFlBQVksQ0FBQztTQUN6QjthQUFNLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUM5QixLQUFLLEdBQUcseUJBQXlCLENBQUM7WUFDbEMsUUFBUSxHQUFHLGNBQWMsQ0FBQztTQUMzQjthQUFNLElBQUksUUFBUSxLQUFLLFlBQVksRUFBRTtZQUNwQyxLQUFLLEdBQUcseUJBQXlCLENBQUM7WUFDbEMsUUFBUSxHQUFHLGNBQWMsQ0FBQztTQUMzQjtRQUVELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNuQixJQUFJLFFBQVEsS0FBSyxVQUFVLEVBQUU7Z0JBQzNCLFdBQVcsR0FBRyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZDLFdBQVcsR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO2FBQ3RDO2lCQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRTtnQkFDL0IsV0FBVyxHQUFHLHNCQUFzQixHQUFHLEtBQUssQ0FBQztnQkFDN0MsV0FBVyxHQUFHLGlCQUFpQixHQUFHLEtBQUssQ0FBQzthQUN6QztpQkFBTTtnQkFDTCxXQUFXLEdBQUcsVUFBVSxHQUFHLHFCQUFxQixHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ25FLFdBQVcsR0FBRyxPQUFPLEdBQUcsa0JBQWtCLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQzthQUMvRDtTQUNGO2FBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQzlCLFdBQVc7Z0JBQ1QseUJBQXlCLEdBQUcsbUJBQW1CLEdBQUcsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwRSxXQUFXLEdBQUcsT0FBTyxHQUFHLG1CQUFtQixHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDN0QsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUNsQixRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ2Y7YUFBTSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDNUIsV0FBVztnQkFDVCxxQkFBcUIsR0FBRyxtQkFBbUIsR0FBRyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2hFLFdBQVcsR0FBRyxPQUFPLEdBQUcsbUJBQW1CLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUM3RCxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ2xCLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDZjthQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM1QixJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDdkIscUJBQXFCLEdBQUcsRUFBRSxDQUFDO29CQUMzQixxQkFBcUIsR0FBRyxFQUFFLENBQUM7b0JBQzNCLElBQUksR0FBRyxFQUFFLENBQUM7aUJBQ1g7Z0JBQ0QsV0FBVyxHQUFHLGtCQUFrQixHQUFHLElBQUksR0FBRyxxQkFBcUIsQ0FBQztnQkFDaEUsV0FBVztvQkFDVCxtQ0FBbUMsR0FBRyxJQUFJLEdBQUcscUJBQXFCLENBQUM7YUFDdEU7aUJBQU07Z0JBQ0wsV0FBVyxHQUFHLDJDQUEyQyxHQUFHLEtBQUssQ0FBQztnQkFDbEUsV0FBVyxHQUFHLDhDQUE4QyxHQUFHLEtBQUssQ0FBQztnQkFDckUsS0FBSyxHQUFHLFlBQVksQ0FBQztnQkFDckIsUUFBUSxHQUFHLEVBQUUsQ0FBQzthQUNmO1NBQ0Y7YUFBTSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDM0IsV0FBVyxHQUFHLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUN2QyxXQUFXLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUNyQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ2xCLFFBQVEsR0FBRyxZQUFZLENBQUM7U0FDekI7YUFBTSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDN0IsV0FBVyxHQUFHLCtCQUErQixHQUFHLHFCQUFxQixDQUFDO1lBQ3RFLFdBQVcsR0FBRyxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQztTQUN4RDthQUFNLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtZQUM5QixXQUFXLEdBQUcsZ0NBQWdDLEdBQUcscUJBQXFCLENBQUM7WUFDdkUsV0FBVyxHQUFHLFlBQVksR0FBRyxxQkFBcUIsQ0FBQztTQUNwRDthQUFNLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUMxQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNoQyxXQUFXLEdBQUcsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxXQUFXLEdBQUcsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2FBQzFDO2lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hDLFdBQVcsR0FBRyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7Z0JBQzlDLFdBQVcsR0FBRyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7YUFDM0M7aUJBQU07Z0JBQ0wsV0FBVyxHQUFHLGdCQUFnQixHQUFHLEtBQUssQ0FBQztnQkFDdkMsV0FBVyxHQUFHLGNBQWMsR0FBRyxLQUFLLENBQUM7YUFDdEM7U0FDRjthQUFNLElBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtZQUNqQyxXQUFXO2dCQUNULGdDQUFnQyxHQUFHLGtCQUFrQixHQUFHLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDMUUsV0FBVztnQkFDVCwrQkFBK0IsR0FBRyxrQkFBa0IsR0FBRyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQzNFO2FBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQzlCLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztZQUN4QyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7U0FDbkM7YUFBTSxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRTtZQUN0RCxXQUFXLEdBQUcsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQ3ZDLFdBQVcsR0FBRyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLEtBQUssR0FBRyxTQUFTLENBQUM7WUFDbEIsUUFBUSxHQUFHLFlBQVksQ0FBQztTQUN6QjthQUFNLElBQUksSUFBSSxLQUFLLFlBQVksRUFBRTtZQUNoQyxXQUFXLEdBQUcsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1lBQ2xELFdBQVcsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN2QyxXQUFXLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztZQUN2QyxXQUFXLEdBQUcsOEJBQThCLEdBQUcsSUFBSSxDQUFDO1lBQ3BELFdBQVcsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN4QyxXQUFXLElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLEtBQUssR0FBRyxhQUFhLENBQUM7WUFDdEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNmO2FBQU0sSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzVCLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQztZQUN0QyxXQUFXLEdBQUcsdUJBQXVCLENBQUM7WUFDdEMsS0FBSyxHQUFHLGFBQWEsQ0FBQztZQUN0QixRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ2Y7YUFBTSxJQUFJLElBQUksS0FBSyxpQkFBaUIsRUFBRTtZQUNyQyxXQUFXLEdBQUcsNEJBQTRCLENBQUM7WUFDM0MsV0FBVyxHQUFHLDBCQUEwQixDQUFDO1lBQ3pDLEtBQUssR0FBRyxhQUFhLENBQUM7WUFDdEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNmO2FBQU0sSUFBSSxJQUFJLEtBQUssaUJBQWlCLEVBQUU7WUFDckMsV0FBVyxHQUFHLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUN6QyxXQUFXLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUNyQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ2xCLFFBQVEsR0FBRyxZQUFZLENBQUM7U0FDekI7YUFBTSxJQUFJLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDbEMsV0FBVyxHQUFHLG1CQUFtQixDQUFDO1lBQ2xDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztTQUNuQzthQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRTtZQUMvQixXQUFXO2dCQUNULDRDQUE0QztvQkFDNUMsbUJBQW1CO29CQUNuQixPQUFPO29CQUNQLEtBQUssQ0FBQztZQUNSLFdBQVc7Z0JBQ1QsdUJBQXVCLEdBQUcsbUJBQW1CLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNsRTthQUFNO1lBQ0wsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUNwQixXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxRQUFRLEVBQUU7WUFDWixLQUFLLEdBQUcsY0FBYyxDQUFDO1lBQ3ZCLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDZjtRQUNELElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtZQUN0QixLQUFLLEdBQUcsU0FBUyxDQUFDO1lBQ2xCLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FDZjtRQUVELElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtZQUNqQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1NBQ3pCO2FBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtZQUN4QyxTQUFTLEdBQUcsV0FBVyxDQUFDO1NBQ3pCO1FBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxRQUFRO1FBQ3hCLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQzNFO2FBQU0sSUFBSSxRQUFRLEtBQUssYUFBYSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxnQ0FBZ0MsQ0FDakMsQ0FBQztTQUNIO2FBQU0sSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDM0U7YUFBTSxJQUFJLFFBQVEsS0FBSyxjQUFjLEVBQUU7WUFDdEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQzNDLGlDQUFpQyxDQUNsQyxDQUFDO1NBQ0g7YUFBTSxJQUFJLFFBQVEsS0FBSyxZQUFZLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQzNDLCtCQUErQixDQUNoQyxDQUFDO1NBQ0g7YUFBTSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztTQUMxRTthQUFNLElBQUksUUFBUSxLQUFLLGFBQWEsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsZ0NBQWdDLENBQ2pDLENBQUM7U0FDSDthQUFNLElBQUksUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsNkJBQTZCLENBQzlCLENBQUM7U0FDSDthQUFNO1lBQ0wsT0FBTyxRQUFRLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBTztRQUN0QixJQUFJLE9BQU8sSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQzNFO2FBQU0sSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQywyQkFBMkIsQ0FDNUIsQ0FBQztTQUNIO2FBQU0sSUFBSSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDM0U7YUFBTSxJQUFJLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQzNDLDJCQUEyQixDQUM1QixDQUFDO1NBQ0g7YUFBTSxJQUFJLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUMzRTthQUFNLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsMkJBQTJCLENBQzVCLENBQUM7U0FDSDthQUFNLElBQUksT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQzNFO2FBQU0sSUFBSSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQywyQkFBMkIsQ0FDNUIsQ0FBQztTQUNIO2FBQU07WUFDTCxPQUFPO1NBQ1I7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQVE7UUFDckIsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUNELElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRTtZQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUM1QztRQUNELElBQUksUUFBUSxJQUFJLEtBQUssRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7U0FDaEQ7UUFDRCxJQUFJLFFBQVEsSUFBSSxHQUFHLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBZ0IsRUFBRSxPQUFPLEdBQUcsS0FBSztRQUM5QyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBSSxNQUFNLEtBQUssRUFBRSxFQUFFO2dCQUNqQixPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1lBQ0QsT0FBTyxJQUFJLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdkM7UUFFRCxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7U0FDM0M7UUFDRCxPQUFPLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDeEQsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxTQUFTLENBQ2xELFdBQVcsRUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDcEIsQ0FBQztRQUNGLE1BQU0sdUJBQXVCLEdBQUkscUJBQTZCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEYsTUFBTSxTQUFTLEdBQUcsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUU1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRTtZQUNoRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFDdEMsY0FBYyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtTQUNwQyxDQUFvQixDQUFDO1FBRXRCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sc0JBQXNCLEdBQUcsY0FBYztZQUMzQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQzlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTixNQUFNLGFBQWEsR0FBWTtZQUM3QixJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFDL0IsVUFBVSxFQUFFO2dCQUNWLEVBQUUsRUFBRSxRQUFRO2dCQUNaLElBQUksRUFBRSxRQUFRO2FBQ2Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osRUFBRSxFQUFFLFFBQVE7Z0JBQ1osUUFBUSxFQUFFLHNCQUFzQixHQUFHLENBQUM7YUFDckM7WUFDRCxFQUFFLEVBQUUsT0FBTztTQUNaLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBc0MsQ0FBQyxDQUFDO1NBQzdHO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFPO1FBQ2YsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7cUJBQzFDLFNBQVMsRUFBRTtxQkFDWCxXQUFXLEVBQUU7cUJBQ2IsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFlBQVksRUFBRTtvQkFDaEIsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBK0MsQ0FBQyxDQUFDO2lCQUN2RjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU0saUJBQWlCLENBQUMsWUFBWSxHQUFHLEtBQUs7UUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQyxTQUFTLENBQ2xELFdBQVcsRUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDcEIsQ0FBQztRQUNGLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUNuRDtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQ3JELHFCQUFxQixFQUNyQjtZQUNFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUN0QyxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVO1NBQ3BDLENBQ2lCLENBQUM7UUFFckIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsTUFBTSxxQkFBcUIsR0FBRyxhQUFhO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDN0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVOLE1BQU0sWUFBWSxHQUFZO1lBQzVCLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLFdBQVc7WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUMvQixVQUFVLEVBQUU7Z0JBQ1YsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsSUFBSSxFQUFFLE9BQU87YUFDZDtZQUNELElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsT0FBTztnQkFDWCxRQUFRLEVBQUUscUJBQXFCLEdBQUcsQ0FBQzthQUNwQztZQUNELEVBQUUsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1NBQ3ZELENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsU0FBUyxDQUNQLGVBQXdCLEtBQUssRUFDN0Isb0JBQXVDLEVBQUU7UUFFekMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUNoRCxNQUFNLEVBQ04saUJBQWlCLENBQ2xCLENBQUM7UUFDRixJQUFJLGFBQWEsRUFBRTtZQUNqQixhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN2QixHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBZSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFpQixFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQztZQUNqRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUM3Qix5Q0FBeUMsQ0FDMUMsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzNCLDJDQUEyQyxDQUM1QyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQUksVUFBVSxFQUFFO1lBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7WUFDakQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDN0IseUNBQXlDLENBQzFDLENBQUM7WUFDRixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxvQkFBb0IsR0FDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNwQyxxQ0FBcUMsQ0FDdEMsR0FBRyxLQUFLLENBQUM7UUFDWixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxPQUFPLEdBQ1gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO1lBQ3hFLE1BQU07WUFDTixNQUFNO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ3RCLElBQUk7WUFDSixNQUFNO1lBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUM5QyxJQUFJO1lBQ0osTUFBTTtZQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDOUMsTUFBTTtZQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEMsa0NBQWtDLENBQ25DO1lBQ0QsS0FBSyxDQUFDO1FBRVIsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDO1lBQ3JFLEtBQUs7WUFDTCxNQUFNO1lBQ04sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWhCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUIsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUMzQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsS0FBSztvQkFDSCxJQUFJO3dCQUNKLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzt3QkFDNUQsR0FBRyxDQUFDO2FBQ1A7aUJBQU07Z0JBQ0wsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNqRSxHQUFHLENBQ0osQ0FBQzthQUNIO1lBRUQsWUFBWTtnQkFDVixZQUFZO29CQUNaLE1BQU07b0JBQ04sWUFBWSxDQUFDLGNBQWMsRUFBRTtvQkFDN0IsSUFBSTtvQkFDSixTQUFTO29CQUNULEtBQUs7b0JBQ0wsSUFBSSxDQUFDO1lBQ1AsWUFBWSxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxhQUFhO1FBQ2IsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUztnQkFDOUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDdEQsb0JBQW9CO2dCQUNsQixvQkFBb0I7b0JBQ3BCLE1BQU07b0JBQ04sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFO29CQUMvQixJQUFJO29CQUNKLFdBQVc7b0JBQ1gsUUFBUTtvQkFDUixJQUFJLENBQUM7WUFDUCxRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sR0FBRyxZQUFZLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsb0JBQW9CLENBQUM7UUFFdEUsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQVk7UUFDcEMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDN0I7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQztZQUM1RSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ25CLElBQUksQ0FBQyxRQUFRO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUM5QixPQUFPO3lCQUNKLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3lCQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ2pCLElBQ0UsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQzs2QkFDckQsTUFBTSxLQUFLLENBQUMsRUFDZjs0QkFDQSxlQUFlLENBQUMsSUFBSSxDQUFDO2dDQUNuQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0NBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQ0FDbEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzZCQUNsQyxDQUFDLENBQUM7eUJBQ0o7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUNkLElBQUksQ0FBQyxLQUFLOzZCQUNQLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7NkJBQ3pCLFVBQVUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO3FCQUNuRDtvQkFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsSUFBWTtRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUNFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ3JCLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQ2pEO1lBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUFDLEdBQVc7UUFDNUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUM7SUFDckUsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBb0I7UUFDM0IsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQTJCLENBQUMsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsU0FBUztRQUNqQixzRUFBc0U7UUFDdEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ2YsU0FBUyxFQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FDN0QsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDMUIsSUFBSSxTQUFTLENBQUM7WUFDZCxNQUFNLElBQUksR0FBSSxRQUFnQixDQUFDLFFBQVEsQ0FBQztZQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO2dCQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUM5QjtpQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkQsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFDO2lCQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQztvQkFDekQsU0FBUyxHQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztvQkFDNUUsU0FBUyxHQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzlFLFNBQVMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQztZQUVELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsQzs7O2lDQUdpQjtnQkFFakI7O21CQUVHO2FBQ0o7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVM7UUFDckMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7U0FDbEQ7YUFBTTtZQUNMLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7U0FDbEM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ3ZDLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUNuQixJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUs7YUFDUCxFQUFFLENBQUMsUUFBUSxDQUFDO2FBQ1osVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBb0MsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFvQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLGtFQUFrRTtRQUM5RixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWE7UUFDekIsZ0JBQWdCLENBQ2QsSUFBSSxDQUFDLEdBQUcsRUFDUixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFDN0IsYUFBYSxDQUFDLElBQUksQ0FDbkIsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUM1RCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQTZCLEVBQUUsS0FBYTtRQUNoRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksU0FBUyxDQUFDO1FBQ2QsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJLGNBQWMsS0FBSyxPQUFPLEVBQUU7WUFDOUIsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN0QixRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMvQyw4QkFBOEIsQ0FDL0IsQ0FBQztTQUNIO2FBQU0sSUFBSSxjQUFjLEtBQUssS0FBSyxFQUFFO1lBQ25DLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDdEIsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDL0MsNEJBQTRCLENBQzdCLENBQUM7U0FDSDthQUFNO1lBQ0wsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUN0QixRQUFRO2dCQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEMscUNBQXFDLENBQ3RDO29CQUNELElBQUk7b0JBQ0osS0FBSyxDQUFDO1NBQ1Q7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQy9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FDcEUsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRTtZQUNoRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFDdEMsY0FBYyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtTQUNwQyxDQUFvQixDQUFDO1FBRXRCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sb0JBQW9CLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sV0FBVyxHQUFZO1lBQzNCLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFLFdBQVc7WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUMvQixVQUFVLEVBQUU7Z0JBQ1YsRUFBRSxFQUFFLE1BQU07Z0JBQ1YsSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUTtnQkFDUixTQUFTO2dCQUNULFdBQVcsRUFBRSxDQUFDO2FBQ2Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osRUFBRSxFQUFFLE1BQU07Z0JBQ1YsUUFBUSxFQUFFLG9CQUFvQixHQUFHLENBQUM7YUFDbkM7WUFDRCxFQUFFLEVBQUUsSUFBSSxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztTQUNoQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxLQUFhO1FBQ25DLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ2YsR0FBRyxHQUFHLE9BQU8sQ0FBQztTQUNmO2FBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLEdBQUcsR0FBRyxLQUFLLENBQUM7U0FDYjthQUFNO1lBQ0wsR0FBRyxHQUFHLEtBQUssQ0FBQztTQUNiO1FBQ0QsT0FBTyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDakMsQ0FBQztJQUVNLHNCQUFzQixDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLEVBQUU7WUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVPLE1BQU07UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLE9BQU87U0FDUjtRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQ0UsSUFBSSxDQUFDLHFCQUFxQjtZQUMxQixJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLEVBQUU7WUFDaEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDN0Q7WUFDQSxJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9ELGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDaEMsYUFBYSxHQUFHLEdBQUcsYUFBYSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1NBQ2xFO1FBRUQsT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsOEJBQThCLGFBQWEsRUFBRSxDQUFDO0lBQzdGLENBQUM7OzhGQTcyQ1UsdUJBQXVCOzBFQUF2Qix1QkFBdUI7UUNoRXBDLCtCQUErQztRQUk3Qyx5RUFpRE07UUFDTiw4QkFBbUM7UUFDakMsaUNBQ2tHO1FBQXBCLG9HQUFTLGFBQVMsSUFBQzs7UUFDL0YsOEJBQStDO1FBQ2pELGlCQUFTO1FBQ1QsOEVBSVM7UUFDVCw4RUFJUztRQUNULDhFQUdTO1FBQ1QsOEVBR1M7UUFDWCxpQkFBTTtRQUVSLGlCQUFPO1FBRVAsMkVBK0JNOztRQWhIaUIseUNBQXVCO1FBSVEsZUFBbUI7UUFBbkIsNENBQW1CO1FBb0RuRSxlQUEyRDtRQUEzRCxtRkFBMkQ7UUFJSSxlQUFtQjtRQUFuQix3Q0FBbUI7UUFLVixlQUFtQjtRQUFuQix3Q0FBbUI7UUFJcEUsZUFBbUI7UUFBbkIsd0NBQW1CO1FBSW5CLGVBQW1CO1FBQW5CLHdDQUFtQjtRQVFkLGVBQW1CO1FBQW5CLHdDQUFtQjs7dUZEakJ4Qyx1QkFBdUI7Y0FMbkMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxxQkFBcUI7Z0JBQy9CLFdBQVcsRUFBRSxrQ0FBa0M7Z0JBQy9DLFNBQVMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDO2FBQ2hEOztzQkFvRkksUUFBUTt3QkEvQ0YsSUFBSTtrQkFBWixLQUFLO1lBRUcsUUFBUTtrQkFBaEIsS0FBSztZQUVHLE1BQU07a0JBQWQsS0FBSztZQUVHLEdBQUc7a0JBQVgsS0FBSztZQU1GLFVBQVU7a0JBRGIsS0FBSztZQWFGLHNCQUFzQjtrQkFEekIsS0FBSztZQVlHLFVBQVU7a0JBQWxCLEtBQUs7WUFFSSxzQkFBc0I7a0JBQS9CLE1BQU07O0FBdXlDVDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsT0FBOEIsRUFDOUIsVUFBa0I7SUFFbEIsTUFBTSxXQUFXLEdBQUc7UUFDbEIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hCLFFBQVEsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQy9CLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3hCLE1BQU0sRUFBRSxDQUFDO2dCQUNULE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUMzRCxDQUFDO1NBQ0gsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLFNBQVMsR0FBRyx3QkFBd0IsQ0FBQztRQUN6QyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDN0IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQ25DLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxrQkFBa0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0tBQUMsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNoQixNQUFNLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUM5RSxDQUFDO1FBQ0YsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQzVFLENBQUM7S0FDSCxDQUFDO0lBRUYsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUNsQyxPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDcEMsT0FBTyxXQUFXLENBQUM7S0FDcEI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxFQUFFO1FBQ25DLE9BQU8sVUFBVSxDQUFDO0tBQ25CO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCBvbEZlYXR1cmUgZnJvbSAnb2wvRmVhdHVyZSc7XG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcbmltcG9ydCAqIGFzIG9sZ2VvbSBmcm9tICdvbC9nZW9tJztcbmltcG9ydCAqIGFzIG9scHJvaiBmcm9tICdvbC9wcm9qJztcbmltcG9ydCAqIGFzIG9sc3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xuaW1wb3J0ICogYXMgb2xjb25kaXRpb24gZnJvbSAnb2wvZXZlbnRzL2NvbmRpdGlvbic7XG5pbXBvcnQgKiBhcyBvbGludGVyYWN0aW9uIGZyb20gJ29sL2ludGVyYWN0aW9uJztcbmltcG9ydCAqIGFzIG9sb2JzZXJ2YWJsZSBmcm9tICdvbC9PYnNlcnZhYmxlJztcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPbEdlb21ldHJ5IH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XG5cbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BpZ28yL3V0aWxzJztcbmltcG9ydCB7XG4gIE1lc3NhZ2UsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTWVzc2FnZVNlcnZpY2UsXG4gIFJvdXRlU2VydmljZVxufSBmcm9tICdAaWdvMi9jb3JlJztcbmltcG9ydCB7IGdldEVudGl0eVRpdGxlIH0gZnJvbSAnQGlnbzIvY29tbW9uJztcblxuaW1wb3J0IHsgSWdvTWFwIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAnO1xuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zaGFyZWQvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmVjdG9yTGF5ZXIgfSBmcm9tICcuLi8uLi9sYXllci9zaGFyZWQvbGF5ZXJzL3ZlY3Rvci1sYXllcic7XG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2ZlYXR1cmUtZGF0YXNvdXJjZSc7XG5pbXBvcnQgeyBGZWF0dXJlTW90aW9uLCBGRUFUVVJFIH0gZnJvbSAnLi4vLi4vZmVhdHVyZS9zaGFyZWQvZmVhdHVyZS5lbnVtcyc7XG5pbXBvcnQge1xuICBtb3ZlVG9PbEZlYXR1cmVzLFxuICB0cnlCaW5kU3RvcmVMYXllclxufSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9mZWF0dXJlLnV0aWxzJztcbmltcG9ydCB7IHRyeUFkZExvYWRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0cmF0ZWdpZXMudXRpbHMnO1xuXG5pbXBvcnQgeyBEaXJlY3Rpb25zLCBEaXJlY3Rpb25zT3B0aW9ucywgU3RvcCB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25zU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9kaXJlY3Rpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlyZWN0aW9uc0Zvcm1TZXJ2aWNlIH0gZnJvbSAnLi9kaXJlY3Rpb25zLWZvcm0uc2VydmljZSc7XG5cbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3F1ZXJ5L3NoYXJlZC9xdWVyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEZlYXR1cmVTdG9yZSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL3N0b3JlJztcbmltcG9ydCB7IEZlYXR1cmUsIEZlYXR1cmVHZW9tZXRyeSB9IGZyb20gJy4uLy4uL2ZlYXR1cmUvc2hhcmVkL2ZlYXR1cmUuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9mZWF0dXJlL3NoYXJlZC9zdHJhdGVnaWVzL2xvYWRpbmcnO1xuaW1wb3J0IHsgcm91bmRDb29yZFRvIH0gZnJvbSAnLi4vLi4vbWFwL3NoYXJlZC9tYXAudXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlIH0gZnJvbSAnLi4vLi4vb3ZlcmxheS9zaGFyZWQvb3ZlcmxheS1tYXJrZXItc3R5bGUudXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZ28tZGlyZWN0aW9ucy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RpcmVjdGlvbnMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RpcmVjdGlvbnMtZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERpcmVjdGlvbnNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRLZXlzID0gWydDb250cm9sJywgJ1NoaWZ0JywgJ0FsdCddO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyQkOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBzdG9wc0Zvcm06IEZvcm1Hcm91cDtcbiAgcHVibGljIHByb2plY3Rpb24gPSAnRVBTRzo0MzI2JztcbiAgcHVibGljIGN1cnJlbnRTdG9wSW5kZXg6IG51bWJlcjtcbiAgcHVibGljIHJvdXRlc1F1ZXJpZXMkJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWFyY2gkJDogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHNlbGVjdFN0b3A7XG4gIHByaXZhdGUgdHJhbnNsYXRlU3RvcDtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJvdXRlO1xuXG4gIHByaXZhdGUgc3RyZWFtJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwdWJsaWMgcm91dGVzUmVzdWx0czogRGlyZWN0aW9uc1tdIHwgTWVzc2FnZVtdO1xuICBnZXQgYWN0aXZlUm91dGUoKTogRGlyZWN0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVJvdXRlO1xuICB9XG4gIHNldCBhY3RpdmVSb3V0ZSh2YWx1ZTogRGlyZWN0aW9ucykge1xuICAgIHRoaXMuX2FjdGl2ZVJvdXRlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuYWN0aXZlUm91dGUkLmdldFZhbHVlKCkgJiYgdmFsdWUuaWQgIT09IHRoaXMuYWN0aXZlUm91dGUkLmdldFZhbHVlKCkuaWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlUm91dGUkLm5leHQodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVJvdXRlRGVzY3JpcHRpb24uZW1pdCh0aGlzLmRpcmVjdGlvbnNUb1RleHQoKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWN0aXZlUm91dGU6IERpcmVjdGlvbnM7XG4gIHB1YmxpYyBhY3RpdmVSb3V0ZSQ6IEJlaGF2aW9yU3ViamVjdDxEaXJlY3Rpb25zPiA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBsYXN0VGltZW91dFJlcXVlc3Q7XG5cbiAgcHJpdmF0ZSBmb2N1c09uU3RvcCA9IGZhbHNlO1xuICBwcml2YXRlIGZvY3VzS2V5ID0gW107XG4gIHB1YmxpYyBpbml0aWFsU3RvcHNDb29yZHM7XG4gIHByaXZhdGUgYnJvd3Nlckxhbmd1YWdlO1xuXG4gIEBJbnB1dCgpIHRlcm06IHN0cmluZztcblxuICBASW5wdXQoKSBkZWJvdW5jZTogbnVtYmVyID0gMjAwO1xuXG4gIEBJbnB1dCgpIGxlbmd0aDogbnVtYmVyID0gMjtcblxuICBASW5wdXQoKSBtYXA6IElnb01hcDtcblxuICAvKipcbiAgICogVGhlIHN0b3BzIHN0b3JlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc3RvcHNTdG9yZSgpOiBGZWF0dXJlU3RvcmUge1xuICAgIHJldHVybiB0aGlzLl9zdG9wc1N0b3JlO1xuICB9XG4gIHNldCBzdG9wc1N0b3JlKHZhbHVlOiBGZWF0dXJlU3RvcmUpIHtcbiAgICB0aGlzLl9zdG9wc1N0b3JlID0gdmFsdWU7XG4gICAgdGhpcy5zdG9wc1N0b3JlJC5uZXh0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9zdG9wc1N0b3JlOiBGZWF0dXJlU3RvcmU7XG5cbiAgc3RvcHNTdG9yZSQ6IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlU3RvcmU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGZWF0dXJlU3RvcmU+KHVuZGVmaW5lZCk7XG5cbiAgQElucHV0KClcbiAgZ2V0IHJvdXRlRnJvbUZlYXR1cmVEZXRhaWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlRnJvbUZlYXR1cmVEZXRhaWw7XG4gIH1cbiAgc2V0IHJvdXRlRnJvbUZlYXR1cmVEZXRhaWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yb3V0ZUZyb21GZWF0dXJlRGV0YWlsID0gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBfcm91dGVGcm9tRmVhdHVyZURldGFpbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJvdXRlIGFuZCB2ZXJ0ZXggc3RvcmVcbiAgICovXG4gIEBJbnB1dCgpIHJvdXRlU3RvcmU6IEZlYXR1cmVTdG9yZTtcblxuICBAT3V0cHV0KCkgYWN0aXZlUm91dGVEZXNjcmlwdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGRpcmVjdGlvbnNTZXJ2aWNlOiBEaXJlY3Rpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlyZWN0aW9uc0Zvcm1TZXJ2aWNlOiBEaXJlY3Rpb25zRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZnM6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGU6IFJvdXRlU2VydmljZVxuICApIHt9XG5cbiAgY2hhbmdlUm91dGUoKSB7XG4gICAgdGhpcy5zaG93Um91dGVHZW9tZXRyeSh0cnVlKTtcbiAgfVxuXG4gIHByZXZlbnQoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UucXVlcnlFbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5mb2N1c09uU3RvcCA9IGZhbHNlO1xuICAgIHRoaXMuYnJvd3Nlckxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UuZ2V0TGFuZ3VhZ2UoKTtcbiAgICB0aGlzLnN0b3BzRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZGlyZWN0aW9uc1R5cGU6ICdjYXInLFxuICAgICAgZGlyZWN0aW9uc01vZGU6ICdkcml2aW5nJywgLy8gbG9vcFxuICAgICAgc3RvcE9yZGVyUHJpb3JpdHk6IHRydWUsXG4gICAgICBkaXJlY3Rpb25zRml4ZWRTdGFydEVuZDogZmFsc2UsXG4gICAgICBzdG9wczogdGhpcy5mb3JtQnVpbGRlci5hcnJheShbXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvcCgnc3RhcnQnKSxcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9wKCdlbmQnKVxuICAgICAgXSlcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbml0U3RvcmVzKCk7XG4gICAgICB0aGlzLmluaXRPbEludGVyYWN0aW9uKCk7XG4gICAgfSwgMSk7XG5cbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybUNoYW5nZSgpO1xuICAgIHRoaXMucm91dGVzUXVlcmllcyQkLnB1c2goXG4gICAgICB0aGlzLnN0cmVhbSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh0ZXJtOiBzdHJpbmcpID0+IHRoaXMuaGFuZGxlVGVybUNoYW5nZWQodGVybSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3RvcHNTdG9yZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJvdXRlRnJvbUZlYXR1cmVEZXRhaWwgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5kaXJlY3Rpb25zRm9ybVNlcnZpY2Uuc2V0U3RvcHMoW10pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2V0Rm9ybShmYWxzZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIHRoaXMuc3RvcHNTdG9yZS5hbGwoKSkge1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcy5pZCAmJiBmZWF0dXJlLnByb3BlcnRpZXMuaWQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCdkaXJlY3Rpb25zU3RvcCcpKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcHNTdG9yZS5kZWxldGUoZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc3RvcHNTdG9yZS5hbGwoKS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLnN0b3BzU3RvcmUuYWxsKCkpIHtcbiAgICAgICAgICAgICAgY29vcmRpbmF0ZXMucHVzaChmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVMb2NhdGlvblByb3Bvc2FscyhmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzLCBpKTtcbiAgICAgICAgICAgICAgdGhpcy5jaG9vc2VQcm9wb3NhbChmZWF0dXJlLCBpKTtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53cml0ZVN0b3BzVG9Gb3JtU2VydmljZShjb29yZGluYXRlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUmVzcG9uc2UgPSB0aGlzLmRpcmVjdGlvbnNTZXJ2aWNlLnJvdXRlKGNvb3JkaW5hdGVzLCB7fSk7XG4gICAgICAgICAgICBpZiAocm91dGVSZXNwb25zZSkge1xuICAgICAgICAgICAgICByb3V0ZVJlc3BvbnNlLm1hcChyZXMgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnJvdXRlc1F1ZXJpZXMkJC5wdXNoKFxuICAgICAgICAgICAgICAgICAgcmVzLnN1YnNjcmliZShyb3V0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVzUmVzdWx0cyA9IHJvdXRlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJvdXRlID0gdGhpcy5yb3V0ZXNSZXN1bHRzWzBdIGFzIERpcmVjdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1JvdXRlR2VvbWV0cnkodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWZzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0b3BzU3RvcmUuYWxsKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uUHJvcG9zYWxzKHRoaXMuc3RvcHNTdG9yZS5hbGwoKVswXS5nZW9tZXRyeS5jb29yZGluYXRlcywgMSk7XG4gICAgICAgICAgICB0aGlzLmNob29zZVByb3Bvc2FsKHRoaXMuc3RvcHNTdG9yZS5hbGwoKVswXSwgMSk7XG4gICAgICAgICAgICB0aGlzLndyaXRlU3RvcHNUb0Zvcm1TZXJ2aWNlKHRoaXMuc3RvcHNTdG9yZS5hbGwoKVswXS5nZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxKTtcbiAgICAgICAgdGhpcy5yb3V0ZUZyb21GZWF0dXJlRGV0YWlsID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlUm91dGVzUXVlcmllcygpO1xuICAgIHRoaXMudW5saXN0ZW5TaW5nbGVDbGljaygpO1xuICAgIHRoaXMucXVlcnlTZXJ2aWNlLnF1ZXJ5RW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5mcmVlemVTdG9yZXMoKTtcbiAgICB0aGlzLndyaXRlU3RvcHNUb0Zvcm1TZXJ2aWNlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zJCQubWFwKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFN0b3JlcygpIHtcbiAgICBjb25zdCBsb2FkaW5nU3RyYXRlZ3kgPSBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcbiAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lXG4gICAgfSk7XG5cbiAgICAvLyBTVE9QIFNUT1JFXG4gICAgY29uc3Qgc3RvcHNTdG9yZSA9IHRoaXMuc3RvcHNTdG9yZTtcbiAgICBjb25zdCBzdG9wc0xheWVyID0gbmV3IFZlY3RvckxheWVyKHtcbiAgICAgIGlkOiAnaWdvLWRpcmVjdGlvbi1zdG9wcy1sYXllcicsXG4gICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uc3RvcExheWVyJyksXG4gICAgICB6SW5kZXg6IDkxMSxcbiAgICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXG4gICAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXG4gICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgbGlua2VkTGF5ZXJzOiB7XG4gICAgICAgIGxpbmtJZDogJ2lnby1kaXJlY3Rpb24tc3RvcHMtbGF5ZXInLFxuICAgICAgICBsaW5rczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJpZGlyZWN0aW9ubmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHN5bmNlZERlbGV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGxpbmtlZElkczogWydpZ28tZGlyZWN0aW9uLXJvdXRlLWxheWVyJ10sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIGV4cG9ydGFibGU6IHRydWUsXG4gICAgICBicm93c2FibGU6IGZhbHNlLFxuICAgICAgc3R5bGU6IHN0b3BNYXJrZXJcbiAgICB9KTtcbiAgICB0cnlCaW5kU3RvcmVMYXllcihzdG9wc1N0b3JlLCBzdG9wc0xheWVyKTtcbiAgICBzdG9wc1N0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xuICAgIHRyeUFkZExvYWRpbmdTdHJhdGVneShzdG9wc1N0b3JlLCBsb2FkaW5nU3RyYXRlZ3kpO1xuXG4gICAgLy8gUk9VVEUgQU5EIFZFUlRFWCBTVE9SRVxuICAgIGNvbnN0IHJvdXRlU3RvcmUgPSB0aGlzLnJvdXRlU3RvcmU7XG4gICAgY29uc3Qgcm91dGVMYXllciA9IG5ldyBWZWN0b3JMYXllcih7XG4gICAgICBpZDogJ2lnby1kaXJlY3Rpb24tcm91dGUtbGF5ZXInLFxuICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnJvdXRlTGF5ZXInKSxcbiAgICAgIHpJbmRleDogOTEwLFxuICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcbiAgICAgIHNob3dJbkxheWVyTGlzdDogdHJ1ZSxcbiAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBsaW5rZWRMYXllcnM6IHtcbiAgICAgICAgbGlua0lkOiAnaWdvLWRpcmVjdGlvbi1yb3V0ZS1sYXllcidcbiAgICAgIH0sXG4gICAgICBleHBvcnRhYmxlOiB0cnVlLFxuICAgICAgYnJvd3NhYmxlOiBmYWxzZSxcbiAgICAgIHN0eWxlOiBzdG9wTWFya2VyXG4gICAgfSk7XG4gICAgdHJ5QmluZFN0b3JlTGF5ZXIocm91dGVTdG9yZSwgcm91dGVMYXllcik7XG4gICAgcm91dGVTdG9yZS5sYXllci52aXNpYmxlID0gdHJ1ZTtcbiAgICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3kocm91dGVTdG9yZSwgbG9hZGluZ1N0cmF0ZWd5KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2godGhpcy5zdG9wc1N0b3JlLmNvdW50JC5zdWJzY3JpYmUoY250ID0+IHtcbiAgICAgIGNudCA+PSAxID9cbiAgICAgICAgdGhpcy5zdG9wc1N0b3JlLmxheWVyLm9wdGlvbnMuc2hvd0luTGF5ZXJMaXN0ID0gdHJ1ZSA6XG4gICAgICAgIHRoaXMuc3RvcHNTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlO1xuICAgIH0pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2godGhpcy5yb3V0ZVN0b3JlLmNvdW50JC5zdWJzY3JpYmUoY250ID0+IHtcbiAgICAgIGNudCA+PSAxID9cbiAgICAgICAgdGhpcy5yb3V0ZVN0b3JlLmxheWVyLm9wdGlvbnMuc2hvd0luTGF5ZXJMaXN0ID0gdHJ1ZSA6XG4gICAgICAgIHRoaXMucm91dGVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9sSW50ZXJhY3Rpb24oKSB7XG4gICAgbGV0IHNlbGVjdGVkU3RvcEZlYXR1cmU7XG4gICAgdGhpcy5zZWxlY3RTdG9wID0gbmV3IG9saW50ZXJhY3Rpb24uU2VsZWN0KHtcbiAgICAgIGxheWVyczogW3RoaXMuc3RvcHNTdG9yZS5sYXllci5vbF0sXG4gICAgICBjb25kaXRpb246IG9sY29uZGl0aW9uLnBvaW50ZXJNb3ZlLFxuICAgICAgaGl0VG9sZXJhbmNlOiA3LFxuICAgICAgZmlsdGVyOiBmZWF0dXJlID0+IHtcbiAgICAgICAgcmV0dXJuIGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09ICdzdG9wJztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0U3RvcC5vbignc2VsZWN0JywgZXZ0ID0+IHtcbiAgICAgIHNlbGVjdGVkU3RvcEZlYXR1cmUgPSBldnQudGFyZ2V0LmdldEZlYXR1cmVzKClbMF07XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zbGF0ZVN0b3AgPSBuZXcgb2xpbnRlcmFjdGlvbi5UcmFuc2xhdGUoe1xuICAgICAgbGF5ZXJzOiBbdGhpcy5zdG9wc1N0b3JlLmxheWVyLm9sXSxcbiAgICAgIGZlYXR1cmVzOiBzZWxlY3RlZFN0b3BGZWF0dXJlXG4gICAgICAvLyBUT0RPIEluIE9wZW5sYXllcnMgPj0gNi54LCBmaWx0ZXIgaXMgbm93IGFsbG93ZWQuXG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zbGF0ZVN0b3Aub24oJ3RyYW5zbGF0aW5nJywgZXZ0ID0+IHtcbiAgICAgIGNvbnN0IGZlYXR1cmVzID0gZXZ0LmZlYXR1cmVzO1xuICAgICAgaWYgKGZlYXR1cmVzLmdldExlbmd0aCgpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0ZVRyYW5zbGF0aW9uKGZlYXR1cmVzLCBmYWxzZSwgNTAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50cmFuc2xhdGVTdG9wLm9uKCd0cmFuc2xhdGVlbmQnLCBldnQgPT4ge1xuICAgICAgY29uc3QgZmVhdHVyZXMgPSBldnQuZmVhdHVyZXM7XG4gICAgICBpZiAoZmVhdHVyZXMuZ2V0TGVuZ3RoKCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5leGVjdXRlVHJhbnNsYXRpb24oZmVhdHVyZXMsIHRydWUsIDAsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZSA9IG5ldyBvbGludGVyYWN0aW9uLlNlbGVjdCh7XG4gICAgICBsYXllcnM6IFt0aGlzLnJvdXRlU3RvcmUubGF5ZXIub2xdLFxuICAgICAgY29uZGl0aW9uOiBvbGNvbmRpdGlvbi5jbGljayxcbiAgICAgIGhpdFRvbGVyYW5jZTogNyxcbiAgICAgIGZpbHRlcjogZmVhdHVyZSA9PiB7XG4gICAgICAgIHJldHVybiBmZWF0dXJlLmdldElkKCkgPT09ICdyb3V0ZSc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdXRlLm9uKCdzZWxlY3QnLCBldnQgPT4ge1xuICAgICAgaWYgKHRoaXMuZm9jdXNPblN0b3AgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdENvb3JkaW5hdGVzID0gb2xwcm9qLnRyYW5zZm9ybShcbiAgICAgICAgICAoZXZ0IGFzIGFueSkubWFwQnJvd3NlckV2ZW50LmNvb3JkaW5hdGUsXG4gICAgICAgICAgdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgICAgICB0aGlzLnByb2plY3Rpb25cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRTdG9wKCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuc3RvcHMubGVuZ3RoIC0gMjtcbiAgICAgICAgdGhpcy5zdG9wcy5hdChwb3MpLnBhdGNoVmFsdWUoeyBzdG9wQ29vcmRpbmF0ZXM6IHNlbGVjdENvb3JkaW5hdGVzIH0pO1xuICAgICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uUHJvcG9zYWxzKHNlbGVjdENvb3JkaW5hdGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIHBvcyk7XG4gICAgICAgIHRoaXMuYWRkU3RvcE92ZXJsYXkoc2VsZWN0Q29vcmRpbmF0ZXMgYXMgW251bWJlciwgbnVtYmVyXSwgcG9zKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRlLmdldEZlYXR1cmVzKCkuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZS5nZXRGZWF0dXJlcygpLmNsZWFyKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5vbC5hZGRJbnRlcmFjdGlvbih0aGlzLnNlbGVjdFN0b3ApO1xuICAgIHRoaXMubWFwLm9sLmFkZEludGVyYWN0aW9uKHRoaXMudHJhbnNsYXRlU3RvcCk7XG4gICAgdGhpcy5tYXAub2wuYWRkSW50ZXJhY3Rpb24odGhpcy5zZWxlY3RlZFJvdXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Gb3JtQ2hhbmdlKCkge1xuICAgIHRoaXMucm91dGVzUXVlcmllcyQkLnB1c2goXG4gICAgICB0aGlzLnN0b3BzRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKVxuICAgICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgICAgdGhpcy53cml0ZVN0b3BzVG9Gb3JtU2VydmljZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGFueSBzdG9yZSwgbWVhbmluZyB0aGUgbGF5ZXIgaXMgcmVtb3ZlZCwgc3RyYXRlZ2llcyBhcmUgZGVhY3RpdmF0ZWRcbiAgICogYW5kIHNvbWUgbGlzdGVuZXIgcmVtb3ZlZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgZnJlZXplU3RvcmVzKCkge1xuICAgIGNvbnN0IHN0b3BzU3RvcmUgPSB0aGlzLnN0b3BzU3RvcmU7XG4gICAgY29uc3Qgcm91dGVTdG9yZSA9IHRoaXMucm91dGVTdG9yZTtcblxuICAgIHRoaXMubWFwLm9sLnJlbW92ZUludGVyYWN0aW9uKHRoaXMuc2VsZWN0U3RvcCk7XG4gICAgdGhpcy5tYXAub2wucmVtb3ZlSW50ZXJhY3Rpb24odGhpcy50cmFuc2xhdGVTdG9wKTtcbiAgICB0aGlzLm1hcC5vbC5yZW1vdmVJbnRlcmFjdGlvbih0aGlzLnNlbGVjdGVkUm91dGUpO1xuICAgIHN0b3BzU3RvcmUuZGVhY3RpdmF0ZVN0cmF0ZWd5T2ZUeXBlKEZlYXR1cmVTdG9yZUxvYWRpbmdTdHJhdGVneSk7XG4gICAgcm91dGVTdG9yZS5kZWFjdGl2YXRlU3RyYXRlZ3lPZlR5cGUoRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVRyYW5zbGF0aW9uKFxuICAgIGZlYXR1cmVzLFxuICAgIHJldmVyc2VTZWFyY2hQcm9wb3NhbCA9IGZhbHNlLFxuICAgIGRlbGF5OiBudW1iZXIgPSAwLFxuICAgIG92ZXJ2aWV3OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5yb3V0ZVN0b3JlLmNsZWFyKCk7XG4gICAgY29uc3QgZmlyc3RGZWF0dXJlID0gZmVhdHVyZXMuZ2V0QXJyYXkoKVswXTtcbiAgICBjb25zdCB0cmFuc2xhdGVkSUQgPSBmaXJzdEZlYXR1cmUuZ2V0SWQoKTtcbiAgICBjb25zdCB0cmFuc2xhdGVkUG9zID0gdHJhbnNsYXRlZElELnNwbGl0KCdfJyk7XG4gICAgbGV0IHA7XG4gICAgc3dpdGNoICh0cmFuc2xhdGVkUG9zWzFdKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIHAgPSAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgIHAgPSB0aGlzLnN0b3BzLmxlbmd0aCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcCA9IE51bWJlcih0cmFuc2xhdGVkUG9zWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zbGF0aW9uQ29vcmRpbmF0ZXMgPSBvbHByb2oudHJhbnNmb3JtKFxuICAgICAgZmlyc3RGZWF0dXJlLmdldEdlb21ldHJ5KCkuZ2V0Q29vcmRpbmF0ZXMoKSxcbiAgICAgIHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICB0aGlzLnByb2plY3Rpb25cbiAgICApO1xuICAgIHRoaXMuc3RvcHNcbiAgICAgIC5hdChwKVxuICAgICAgLnBhdGNoVmFsdWUoe1xuICAgICAgICBzdG9wQ29vcmRpbmF0ZXM6IHRyYW5zbGF0aW9uQ29vcmRpbmF0ZXMsXG4gICAgICAgIHN0b3BQcm9wb3NhbHM6IFtdXG4gICAgICB9KTtcbiAgICBpZiAocmV2ZXJzZVNlYXJjaFByb3Bvc2FsKSB7XG4gICAgICB0aGlzLmhhbmRsZUxvY2F0aW9uUHJvcG9zYWxzKHRyYW5zbGF0aW9uQ29vcmRpbmF0ZXMgYXMgW251bWJlciwgbnVtYmVyXSwgcCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uc09wdGlvbnMgPSB7XG4gICAgICBzdGVwczogdHJ1ZSxcbiAgICAgIG92ZXJ2aWV3OiBmYWxzZSxcbiAgICAgIGFsdGVybmF0aXZlczogdHJ1ZVxuICAgIH0gYXMgRGlyZWN0aW9uc09wdGlvbnM7XG5cbiAgICBpZiAob3ZlcnZpZXcpIHtcbiAgICAgIGRpcmVjdGlvbnNPcHRpb25zLm92ZXJ2aWV3ID0gdHJ1ZTtcbiAgICAgIGRpcmVjdGlvbnNPcHRpb25zLnN0ZXBzID0gZmFsc2U7XG4gICAgICBkaXJlY3Rpb25zT3B0aW9ucy5hbHRlcm5hdGl2ZXMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMubGFzdFRpbWVvdXRSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBjYW5jZWwgdGltZW91dCB3aGVuIHRoZSBtb3VzZSBtb3Zlc1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sYXN0VGltZW91dFJlcXVlc3QpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VGltZW91dFJlcXVlc3QgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRSb3V0ZXModW5kZWZpbmVkLCBkaXJlY3Rpb25zT3B0aW9ucyk7XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxhc3RUaW1lb3V0UmVxdWVzdCk7XG4gICAgICB0aGlzLmdldFJvdXRlcyh1bmRlZmluZWQsIGRpcmVjdGlvbnNPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVMb2NhdGlvblByb3Bvc2Fscyhjb29yZGluYXRlczogW251bWJlciwgbnVtYmVyXSwgc3RvcEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBncm91cGVkTG9jYXRpb25zID0gW107XG4gICAgY29uc3Qgcm91bmRlZENvb3JkaW5hdGVzID0gW1xuICAgICAgY29vcmRpbmF0ZXNbMF0udG9GaXhlZCg1KSxcbiAgICAgIGNvb3JkaW5hdGVzWzFdLnRvRml4ZWQoNSlcbiAgICBdO1xuICAgIHRoaXMuc3RvcHNcbiAgICAgIC5hdChzdG9wSW5kZXgpXG4gICAgICAucGF0Y2hWYWx1ZSh7IHN0b3BQb2ludDogcm91bmRlZENvb3JkaW5hdGVzLmpvaW4oJywnKSB9KTtcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2VcbiAgICAgIC5yZXZlcnNlU2VhcmNoKGNvb3JkaW5hdGVzLCB7IHpvb206IHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldFpvb20oKSB9KVxuICAgICAgLm1hcChyZXMgPT5cbiAgICAgICAgdGhpcy5yb3V0ZXNRdWVyaWVzJCQucHVzaChcbiAgICAgICAgICByZXMucmVxdWVzdC5waXBlKG1hcChmID0+IGYpKS5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdyb3VwZWRMb2NhdGlvbnMuZmlsdGVyKGYgPT4gZi5zb3VyY2UgPT09IHJlc3VsdC5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGdyb3VwZWRMb2NhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzLm1hcChyID0+IHIuZGF0YSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnN0b3BzXG4gICAgICAgICAgICAgIC5hdChzdG9wSW5kZXgpXG4gICAgICAgICAgICAgIC5wYXRjaFZhbHVlKHsgc3RvcFByb3Bvc2FsczogZ3JvdXBlZExvY2F0aW9ucyB9KTtcbiAgICAgICAgICAgIC8vIFRPRE86IFByZWZlciBhbm90aGVyIHNvdXJjZT9cbiAgICAgICAgICAgIGlmIChyZXN1bHRzWzBdKSB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHRzWzBdLnNvdXJjZS5nZXRJZCgpID09PSAnaWNoZXJjaGVyZXZlcnNlJykge1xuICAgICAgICAgICAgICAgIC8vIHByZWZlciBhZGRyZXNzIHR5cGUuXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlOiBhbnkgPSByZXN1bHRzW2ldLmRhdGE7XG4gICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnR5cGUgPT09ICdhZHJlc3NlcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0UG9zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcHMuYXQoc3RvcEluZGV4KS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgIHN0b3BQb2ludDogZ2V0RW50aXR5VGl0bGUocmVzdWx0c1tyZXN1bHRQb3NdKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW3Jlc3VsdFBvc10uZGF0YS5nZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0b3BzLmF0KHN0b3BJbmRleCkucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BDb29yZGluYXRlczpcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3Jlc3VsdFBvc10uZGF0YS5nZW9tZXRyeS5jb29yZGluYXRlc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIE5vdCBtb3ZpbmcgdGhlIHRyYW5zbGF0ZWQgcG9pbnQgT25seSB0byBzdWdnZXN0IHZhbHVlIGludG8gdGhlIFVJLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRzWzBdLnNvdXJjZS5nZXRJZCgpID09PSAnY29vcmRpbmF0ZXNyZXZlcnNlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcHMuYXQoc3RvcEluZGV4KS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgIHN0b3BQb2ludDogW1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzWzBdLmRhdGEuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0udG9GaXhlZCg1KSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1swXS5kYXRhLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLnRvRml4ZWQoNSlcbiAgICAgICAgICAgICAgICAgIF0uam9pbignLCcpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMF0uZGF0YS5nZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnN0b3BzLmF0KHN0b3BJbmRleCkucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgIHN0b3BDb29yZGluYXRlczogcmVzdWx0c1swXS5kYXRhLmdlb21ldHJ5LmNvb3JkaW5hdGVzXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gTm90IG1vdmluZyB0aGUgdHJhbnNsYXRlZCBwb2ludCBPbmx5IHRvIHN1Z2dlc3QgdmFsdWUgaW50byB0aGUgVUkuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnN0b3BzXG4gICAgICAgICAgICAgICAgLmF0KHN0b3BJbmRleClcbiAgICAgICAgICAgICAgICAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICBzdG9wUG9pbnQ6IHJvdW5kZWRDb29yZGluYXRlcy5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgICBzdG9wUHJvcG9zYWxzOiBbXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZnMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICBkaXJlY3Rpb25zVGV4dChpbmRleDogbnVtYmVyLCBzdG9wc0NvdW50cyA9IHRoaXMuc3RvcHMubGVuZ3RoKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHN0b3BzQ291bnRzIC0gMSB8fCBzdG9wc0NvdW50cyA9PT0gMSkge1xuICAgICAgcmV0dXJuICdlbmQnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2ludGVybWVkaWF0ZSc7XG4gICAgfVxuICB9XG5cbiAgcmFpc2VTdG9wKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICB0aGlzLm1vdmVTdG9wKGluZGV4LCAtMSk7XG4gICAgfVxuICB9XG5cbiAgbG93ZXJTdG9wKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPCB0aGlzLnN0b3BzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMubW92ZVN0b3AoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW92ZVN0b3AoaW5kZXgsIGRpZmYpIHtcbiAgICBjb25zdCBmcm9tVmFsdWUgPSB0aGlzLnN0b3BzLmF0KGluZGV4KTtcbiAgICB0aGlzLnJlbW92ZVN0b3AoaW5kZXgpO1xuICAgIHRoaXMuc3RvcHMuaW5zZXJ0KGluZGV4ICsgZGlmZiwgZnJvbVZhbHVlKTtcbiAgICB0aGlzLnN0b3BzXG4gICAgICAuYXQoaW5kZXgpXG4gICAgICAucGF0Y2hWYWx1ZSh7IGRpcmVjdGlvbnNUZXh0OiB0aGlzLmRpcmVjdGlvbnNUZXh0KGluZGV4KSB9KTtcbiAgICB0aGlzLnN0b3BzXG4gICAgICAuYXQoaW5kZXggKyBkaWZmKVxuICAgICAgLnBhdGNoVmFsdWUoeyBkaXJlY3Rpb25zVGV4dDogdGhpcy5kaXJlY3Rpb25zVGV4dChpbmRleCArIGRpZmYpIH0pO1xuICAgIGlmICh0aGlzLnN0b3BzLmF0KGluZGV4KS52YWx1ZS5zdG9wQ29vcmRpbmF0ZXMpIHtcbiAgICAgIHRoaXMuYWRkU3RvcE92ZXJsYXkodGhpcy5zdG9wcy5hdChpbmRleCkudmFsdWUuc3RvcENvb3JkaW5hdGVzLCBpbmRleCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3BzLmF0KGluZGV4ICsgZGlmZikudmFsdWUuc3RvcENvb3JkaW5hdGVzKSB7XG4gICAgICB0aGlzLmFkZFN0b3BPdmVybGF5KFxuICAgICAgICB0aGlzLnN0b3BzLmF0KGluZGV4ICsgZGlmZikudmFsdWUuc3RvcENvb3JkaW5hdGVzLFxuICAgICAgICBpbmRleCArIGRpZmZcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0b3BzKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcHNGb3JtLmdldCgnc3RvcHMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVTdG9wc1RvRm9ybVNlcnZpY2Uoc3RvcHNBcnJheT8pIHtcbiAgICBpZiAoc3RvcHNBcnJheSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb25zRm9ybVNlcnZpY2Uuc2V0U3RvcHMoc3RvcHNBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0b3BzID0gW107XG4gICAgICB0aGlzLnN0b3BzLnZhbHVlLmZvckVhY2goc3RvcCA9PiB7XG4gICAgICAgIGlmIChzdG9wLnN0b3BDb29yZGluYXRlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgc3RvcHMucHVzaChzdG9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZS5zZXRTdG9wcyhzdG9wcyk7XG4gICAgfVxuICB9XG5cbiAgYWRkU3RvcCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnNlcnRJbmRleCA9IHRoaXMuc3RvcHMubGVuZ3RoIC0gMTtcbiAgICB0aGlzLnN0b3BzLmluc2VydChpbnNlcnRJbmRleCwgdGhpcy5jcmVhdGVTdG9wKCkpO1xuICB9XG5cbiAgY3JlYXRlU3RvcChkaXJlY3Rpb25zUG9zID0gJ2ludGVybWVkaWF0ZScpOiBGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHN0b3BQb2ludDogWycnXSxcbiAgICAgIHN0b3BQcm9wb3NhbHM6IFtbXV0sXG4gICAgICBkaXJlY3Rpb25zVGV4dDogZGlyZWN0aW9uc1BvcyxcbiAgICAgIHN0b3BDb29yZGluYXRlczogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVTdG9wKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0U3RvcE92ZXJsYXlJRChpbmRleCk7XG4gICAgdGhpcy5kZWxldGVTdG9yZUZlYXR1cmVCeUlEKHRoaXMuc3RvcHNTdG9yZSwgaWQpO1xuICAgIHRoaXMuc3RvcHMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGxldCBjbnQgPSAwO1xuICAgIHRoaXMuc3RvcHMudmFsdWUuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgIHRoaXMuc3RvcHNcbiAgICAgICAgLmF0KGNudClcbiAgICAgICAgLnBhdGNoVmFsdWUoeyBkaXJlY3Rpb25zVGV4dDogdGhpcy5kaXJlY3Rpb25zVGV4dChjbnQpIH0pO1xuICAgICAgdGhpcy5hZGRTdG9wT3ZlcmxheSh0aGlzLnN0b3BzLmF0KGNudCkudmFsdWUuc3RvcENvb3JkaW5hdGVzLCBjbnQpO1xuICAgICAgY250Kys7XG4gICAgfSk7XG4gIH1cblxuICByZXNldEZvcm0oc3RvcDogYm9vbGVhbikge1xuICAgIHRoaXMucm91dGVzUmVzdWx0cyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBuYlN0b3BzID0gdGhpcy5zdG9wcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYlN0b3BzOyBpKyspIHtcbiAgICAgIHRoaXMuc3RvcHMucmVtb3ZlQXQoMCk7XG4gICAgfVxuICAgIHRoaXMuc3RvcHMuaW5zZXJ0KDAsIHRoaXMuY3JlYXRlU3RvcCgnc3RhcnQnKSk7XG4gICAgdGhpcy5zdG9wcy5pbnNlcnQoMSwgdGhpcy5jcmVhdGVTdG9wKCdlbmQnKSk7XG5cbiAgICBpZiAoc3RvcCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdG9wc1N0b3JlLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMucm91dGVTdG9yZS5jbGVhcigpO1xuICB9XG5cbiAgZm9ybWF0U3RlcChzdGVwLCBjbnQpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRJbnN0cnVjdGlvbihcbiAgICAgIHN0ZXAubWFuZXV2ZXIudHlwZSxcbiAgICAgIHN0ZXAubWFuZXV2ZXIubW9kaWZpZXIsXG4gICAgICBzdGVwLm5hbWUsXG4gICAgICBzdGVwLm1hbmV1dmVyLmJlYXJpbmdfYWZ0ZXIsXG4gICAgICBjbnQsXG4gICAgICBzdGVwLm1hbmV1dmVyLmV4aXQsXG4gICAgICBjbnQgPT09IHRoaXMuYWN0aXZlUm91dGUuc3RlcHMubGVuZ3RoIC0gMVxuICAgICk7XG4gIH1cblxuICBmb3JtYXRJbnN0cnVjdGlvbihcbiAgICB0eXBlLFxuICAgIG1vZGlmaWVyLFxuICAgIHJvdXRlLFxuICAgIGRpcmVjdGlvbixcbiAgICBzdGVwUG9zaXRpb24sXG4gICAgZXhpdCxcbiAgICBsYXN0U3RlcCA9IGZhbHNlXG4gICkge1xuICAgIGxldCBkaXJlY3RpdmVGcjtcbiAgICBsZXQgZGlyZWN0aXZlRW47XG4gICAgbGV0IGltYWdlID0gJ2ZvcndhcmQnO1xuICAgIGxldCBjc3NDbGFzcyA9ICdyb3RhdGUtMjcwJztcbiAgICBjb25zdCB0cmFuc2xhdGVkRGlyZWN0aW9uID0gdGhpcy50cmFuc2xhdGVCZWFyaW5nKGRpcmVjdGlvbik7XG4gICAgY29uc3QgdHJhbnNsYXRlZE1vZGlmaWVyID0gdGhpcy50cmFuc2xhdGVNb2RpZmllcihtb2RpZmllcik7XG4gICAgY29uc3QgZW5QcmVmaXggPSBtb2RpZmllciA9PT0gJ3N0cmFpZ2h0JyA/ICcnIDogJ29uIHRoZSAnO1xuICAgIGNvbnN0IGZyUHJlZml4ID0gbW9kaWZpZXIgPT09ICdzdHJhaWdodCcgPyAnJyA6ICfDoCAnO1xuXG4gICAgbGV0IGZyQWdncmVnYXRlZERpcmVjdGlvbiA9IGZyUHJlZml4ICsgdHJhbnNsYXRlZE1vZGlmaWVyO1xuICAgIGxldCBlbkFnZ3JlZ2F0ZWREaXJlY3Rpb24gPSBlblByZWZpeCArIHRyYW5zbGF0ZWRNb2RpZmllcjtcblxuICAgIGlmIChtb2RpZmllciAmJiBtb2RpZmllci5zZWFyY2goJ3NsaWdodCcpID49IDApIHtcbiAgICAgIGVuQWdncmVnYXRlZERpcmVjdGlvbiA9IHRyYW5zbGF0ZWRNb2RpZmllcjtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXIgPT09ICd1dHVybicpIHtcbiAgICAgIGltYWdlID0gJ2ZvcndhcmQnO1xuICAgICAgY3NzQ2xhc3MgPSAncm90YXRlLTkwJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgcmlnaHQnKSB7XG4gICAgICBpbWFnZSA9ICdzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQnO1xuICAgICAgY3NzQ2xhc3MgPSAnaWNvbi1mbGlwcGVkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAncmlnaHQnKSB7XG4gICAgICBpbWFnZSA9ICdzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQnO1xuICAgICAgY3NzQ2xhc3MgPSAnaWNvbi1mbGlwcGVkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IHJpZ2h0Jykge1xuICAgICAgaW1hZ2UgPSAnZm9yd2FyZCc7XG4gICAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjkwJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICBpbWFnZSA9ICdmb3J3YXJkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IGxlZnQnKSB7XG4gICAgICBpbWFnZSA9ICdmb3J3YXJkJztcbiAgICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNTAnO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdsZWZ0Jykge1xuICAgICAgaW1hZ2UgPSAnc3ViZGlyZWN0b3J5LWFycm93LWxlZnQnO1xuICAgICAgY3NzQ2xhc3MgPSAnaWNvbi1mbGlwcGVkJztcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgbGVmdCcpIHtcbiAgICAgIGltYWdlID0gJ3N1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0JztcbiAgICAgIGNzc0NsYXNzID0gJ2ljb24tZmxpcHBlZCc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICd0dXJuJykge1xuICAgICAgaWYgKG1vZGlmaWVyID09PSAnc3RyYWlnaHQnKSB7XG4gICAgICAgIGRpcmVjdGl2ZUZyID0gJ0NvbnRpbnVlciBzdXIgJyArIHJvdXRlO1xuICAgICAgICBkaXJlY3RpdmVFbiA9ICdDb250aW51ZSBvbiAnICsgcm91dGU7XG4gICAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAndXR1cm4nKSB7XG4gICAgICAgIGRpcmVjdGl2ZUZyID0gJ0ZhaXJlIGRlbWktdG91ciBzdXIgJyArIHJvdXRlO1xuICAgICAgICBkaXJlY3RpdmVFbiA9ICdNYWtlIHUtdHVybiBvbiAnICsgcm91dGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXJlY3RpdmVGciA9ICdUb3VybmVyICcgKyBmckFnZ3JlZ2F0ZWREaXJlY3Rpb24gKyAnIHN1ciAnICsgcm91dGU7XG4gICAgICAgIGRpcmVjdGl2ZUVuID0gJ1R1cm4gJyArIHRyYW5zbGF0ZWRNb2RpZmllciArICcgb250byAnICsgcm91dGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmV3IG5hbWUnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9XG4gICAgICAgICdDb250aW51ZXIgZW4gZGlyZWN0aW9uICcgKyB0cmFuc2xhdGVkRGlyZWN0aW9uICsgJyBzdXIgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnSGVhZCAnICsgdHJhbnNsYXRlZERpcmVjdGlvbiArICcgb24gJyArIHJvdXRlO1xuICAgICAgaW1hZ2UgPSAnY29tcGFzcyc7XG4gICAgICBjc3NDbGFzcyA9ICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RlcGFydCcpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID1cbiAgICAgICAgJ0FsbGVyIGVuIGRpcmVjdGlvbiAnICsgdHJhbnNsYXRlZERpcmVjdGlvbiArICcgc3VyICcgKyByb3V0ZTtcbiAgICAgIGRpcmVjdGl2ZUVuID0gJ0hlYWQgJyArIHRyYW5zbGF0ZWREaXJlY3Rpb24gKyAnIG9uICcgKyByb3V0ZTtcbiAgICAgIGltYWdlID0gJ2NvbXBhc3MnO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhcnJpdmUnKSB7XG4gICAgICBpZiAobGFzdFN0ZXApIHtcbiAgICAgICAgbGV0IGNvbWEgPSAnLCAnO1xuICAgICAgICBpZiAoIXRyYW5zbGF0ZWRNb2RpZmllcikge1xuICAgICAgICAgIGZyQWdncmVnYXRlZERpcmVjdGlvbiA9ICcnO1xuICAgICAgICAgIGVuQWdncmVnYXRlZERpcmVjdGlvbiA9ICcnO1xuICAgICAgICAgIGNvbWEgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBkaXJlY3RpdmVGciA9ICdWb3VzIMOqdGVzIGFycml2w6knICsgY29tYSArIGZyQWdncmVnYXRlZERpcmVjdGlvbjtcbiAgICAgICAgZGlyZWN0aXZlRW4gPVxuICAgICAgICAgICdZb3UgaGF2ZSByZWFjaGVkIHlvdXIgZGVzdGluYXRpb24nICsgY29tYSArIGVuQWdncmVnYXRlZERpcmVjdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGl2ZUZyID0gJ1ZvdXMgYXR0ZWlnbmV6IGxlIHBvaW50IGludGVybcOpZGlhcmUgc3VyICcgKyByb3V0ZTtcbiAgICAgICAgZGlyZWN0aXZlRW4gPSAnWW91IGhhdmUgcmVhY2hlZCB0aGUgaW50ZXJtZWRpYXRlIHN0b3Agb250byAnICsgcm91dGU7XG4gICAgICAgIGltYWdlID0gJ21hcC1tYXJrZXInO1xuICAgICAgICBjc3NDbGFzcyA9ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21lcmdlJykge1xuICAgICAgZGlyZWN0aXZlRnIgPSAnQ29udGludWVyIHN1ciAnICsgcm91dGU7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdDb250aW51ZSBvbiAnICsgcm91dGU7XG4gICAgICBpbWFnZSA9ICdmb3J3YXJkJztcbiAgICAgIGNzc0NsYXNzID0gJ3JvdGF0ZS0yNzAnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29uIHJhbXAnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9IFwiUHJlbmRyZSBsJ2VudHLDqWUgZCdhdXRvcm91dGUgXCIgKyBmckFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgICBkaXJlY3RpdmVFbiA9ICdUYWtlIHRoZSByYW1wICcgKyBlbkFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2ZmIHJhbXAnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9IFwiUHJlbmRyZSBsYSBzb3J0aWUgZCdhdXRvcm91dGUgXCIgKyBmckFnZ3JlZ2F0ZWREaXJlY3Rpb247XG4gICAgICBkaXJlY3RpdmVFbiA9ICdUYWtlIGV4aXQgJyArIGVuQWdncmVnYXRlZERpcmVjdGlvbjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdmb3JrJykge1xuICAgICAgaWYgKG1vZGlmaWVyLnNlYXJjaCgnbGVmdCcpID49IDApIHtcbiAgICAgICAgZGlyZWN0aXZlRnIgPSAnR2FyZGVyIGxhIGdhdWNoZSBzdXIgJyArIHJvdXRlO1xuICAgICAgICBkaXJlY3RpdmVFbiA9ICdNZXJnZSBsZWZ0IG9udG8gJyArIHJvdXRlO1xuICAgICAgfSBlbHNlIGlmIChtb2RpZmllci5zZWFyY2goJ3JpZ2h0JykgPj0gMCkge1xuICAgICAgICBkaXJlY3RpdmVGciA9ICdHYXJkZXIgbGEgZHJvaXRlIHN1ciAnICsgcm91dGU7XG4gICAgICAgIGRpcmVjdGl2ZUVuID0gJ01lcmdlIHJpZ2h0IG9udG8gJyArIHJvdXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyZWN0aXZlRnIgPSAnQ29udGludWVyIHN1ciAnICsgcm91dGU7XG4gICAgICAgIGRpcmVjdGl2ZUVuID0gJ0NvbnRpbnVlIG9uICcgKyByb3V0ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlbmQgb2Ygcm9hZCcpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID1cbiAgICAgICAgJ8OAIGxhIGZpbiBkZSBsYSByb3V0ZSwgdG91cm5lciAnICsgdHJhbnNsYXRlZE1vZGlmaWVyICsgJyBzdXIgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPVxuICAgICAgICAnQXQgdGhlIGVuZCBvZiB0aGUgcm9hZCwgdHVybiAnICsgdHJhbnNsYXRlZE1vZGlmaWVyICsgJyBvbnRvICcgKyByb3V0ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd1c2UgbGFuZScpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID0gJ1ByZW5kcmUgbGEgdm9pZSBkZSAuLi4gJztcbiAgICAgIGRpcmVjdGl2ZUVuID0gJ1Rha2UgdGhlIGxhbmUgLi4uJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb250aW51ZScgJiYgbW9kaWZpZXIgIT09ICd1dHVybicpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID0gJ0NvbnRpbnVlciBzdXIgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnQ29udGludWUgb24gJyArIHJvdXRlO1xuICAgICAgaW1hZ2UgPSAnZm9yd2FyZCc7XG4gICAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjcwJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyb3VuZGFib3V0Jykge1xuICAgICAgZGlyZWN0aXZlRnIgPSAnQXUgcm9uZC1wb2ludCwgcHJlbmRyZSBsYSAnICsgZXhpdDtcbiAgICAgIGRpcmVjdGl2ZUZyICs9IGV4aXQgPT09IDEgPyAncmUnIDogJ2UnO1xuICAgICAgZGlyZWN0aXZlRnIgKz0gJyBzb3J0aWUgdmVycyAnICsgcm91dGU7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdBdCB0aGUgcm91bmRhYm91dCwgdGFrZSB0aGUgJyArIGV4aXQ7XG4gICAgICBkaXJlY3RpdmVFbiArPSBleGl0ID09PSAxID8gJ3N0JyA6ICdyZCc7XG4gICAgICBkaXJlY3RpdmVFbiArPSAnIGV4aXQgdG93YXJkcyAnICsgcm91dGU7XG4gICAgICBpbWFnZSA9ICdjaGFydC1kb251dCc7XG4gICAgICBjc3NDbGFzcyA9ICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3JvdGFyeScpIHtcbiAgICAgIGRpcmVjdGl2ZUZyID0gJ1JvbmQtcG9pbnQgcm90YXJ5Li4uLic7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdSb3VuZGFib3V0IHJvdGFyeS4uLi4nO1xuICAgICAgaW1hZ2UgPSAnY2hhcnQtZG9udXQnO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyb3VuZGFib3V0IHR1cm4nKSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICdSb25kLXBvaW50LCBwcmVuZHJlIGxhIC4uLic7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdSb3VuZGFib3V0LCB0YWtlIHRoZSAuLi4nO1xuICAgICAgaW1hZ2UgPSAnY2hhcnQtZG9udXQnO1xuICAgICAgY3NzQ2xhc3MgPSAnJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdleGl0IHJvdW5kYWJvdXQnKSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICdQb3Vyc3VpdnJlIHZlcnMgJyArIHJvdXRlO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnQ29udGludWUgdG8gJyArIHJvdXRlO1xuICAgICAgaW1hZ2UgPSAnZm9yd2FyZCc7XG4gICAgICBjc3NDbGFzcyA9ICdyb3RhdGUtMjcwJztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdub3RpZmljYXRpb24nKSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICdub3RpZmljYXRpb24gLi4uLic7XG4gICAgICBkaXJlY3RpdmVFbiA9ICdub3RpZmljYXRpb24gLi4uLic7XG4gICAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3V0dXJuJykge1xuICAgICAgZGlyZWN0aXZlRnIgPVxuICAgICAgICAnRmFpcmUgZGVtaS10b3VyIGV0IGNvbnRpbnVlciBlbiBkaXJlY3Rpb24gJyArXG4gICAgICAgIHRyYW5zbGF0ZWREaXJlY3Rpb24gK1xuICAgICAgICAnIHN1ciAnICtcbiAgICAgICAgcm91dGU7XG4gICAgICBkaXJlY3RpdmVFbiA9XG4gICAgICAgICdNYWtlIHUtdHVybiBhbmQgaGVhZCAnICsgdHJhbnNsYXRlZERpcmVjdGlvbiArICcgb24gJyArIHJvdXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RpdmVGciA9ICc/Pz8nO1xuICAgICAgZGlyZWN0aXZlRW4gPSAnPz8/JztcbiAgICB9XG5cbiAgICBpZiAobGFzdFN0ZXApIHtcbiAgICAgIGltYWdlID0gJ2ZsYWctdmFyaWFudCc7XG4gICAgICBjc3NDbGFzcyA9ICcnO1xuICAgIH1cbiAgICBpZiAoc3RlcFBvc2l0aW9uID09PSAwKSB7XG4gICAgICBpbWFnZSA9ICdjb21wYXNzJztcbiAgICAgIGNzc0NsYXNzID0gJyc7XG4gICAgfVxuXG4gICAgbGV0IGRpcmVjdGl2ZTtcbiAgICBpZiAodGhpcy5icm93c2VyTGFuZ3VhZ2UgPT09ICdmcicpIHtcbiAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZUZyO1xuICAgIH0gZWxzZSBpZiAodGhpcy5icm93c2VyTGFuZ3VhZ2UgPT09ICdlbicpIHtcbiAgICAgIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZUVuO1xuICAgIH1cblxuICAgIHJldHVybiB7IGluc3RydWN0aW9uOiBkaXJlY3RpdmUsIGltYWdlLCBjc3NDbGFzcyB9O1xuICB9XG5cbiAgdHJhbnNsYXRlTW9kaWZpZXIobW9kaWZpZXIpIHtcbiAgICBpZiAobW9kaWZpZXIgPT09ICd1dHVybicpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLnV0dXJuJyk7XG4gICAgfSBlbHNlIGlmIChtb2RpZmllciA9PT0gJ3NoYXJwIHJpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zLnNoYXJwIHJpZ2h0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAncmlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9ucy5yaWdodCcpO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzbGlnaHQgcmlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuc2xpZ2h0IHJpZ2h0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2hhcnAgbGVmdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5zaGFycCBsZWZ0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnbGVmdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zLmxlZnQnKTtcbiAgICB9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnc2xpZ2h0IGxlZnQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnMuc2xpZ2h0IGxlZnQnXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICdzdHJhaWdodCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9ucy5zdHJhaWdodCdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb2RpZmllcjtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVCZWFyaW5nKGJlYXJpbmcpIHtcbiAgICBpZiAoYmVhcmluZyA+PSAzMzcgfHwgYmVhcmluZyA8IDIzKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uY2FyZGluYWxQb2ludHMubicpO1xuICAgIH0gZWxzZSBpZiAoYmVhcmluZyA8IDY3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLm5lJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAxMTMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5lJyk7XG4gICAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMTU3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLnNlJ1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAyMDMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy5zJyk7XG4gICAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMjQ3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLnN3J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJlYXJpbmcgPCAyOTMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5jYXJkaW5hbFBvaW50cy53Jyk7XG4gICAgfSBlbHNlIGlmIChiZWFyaW5nIDwgMzM3KSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmNhcmRpbmFsUG9pbnRzLm53J1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdERpc3RhbmNlKGRpc3RhbmNlKSB7XG4gICAgaWYgKGRpc3RhbmNlID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkaXN0YW5jZSA+PSAxMDAwMDApIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGRpc3RhbmNlIC8gMTAwMCkgKyAnIGttJztcbiAgICB9XG4gICAgaWYgKGRpc3RhbmNlID49IDEwMDAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChkaXN0YW5jZSAvIDEwMCkgLyAxMCArICcga20nO1xuICAgIH1cbiAgICBpZiAoZGlzdGFuY2UgPj0gMTAwKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChkaXN0YW5jZSAvIDEwMCkgLyAxMCArICcga20nO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2UgKyAnIG0nO1xuICB9XG5cbiAgZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlciwgc3VtbWFyeSA9IGZhbHNlKSB7XG4gICAgaWYgKGR1cmF0aW9uID49IDM2MDApIHtcbiAgICAgIGNvbnN0IGhvdXIgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gMzYwMCk7XG4gICAgICBjb25zdCBtaW51dGUgPSBNYXRoLnJvdW5kKChkdXJhdGlvbiAvIDM2MDAgLSBob3VyKSAqIDYwKTtcbiAgICAgIGlmIChtaW51dGUgPT09IDYwKSB7XG4gICAgICAgIHJldHVybiBob3VyICsgMSArICcgaCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gaG91ciArICcgaCAnICsgbWludXRlICsgJyBtaW4nO1xuICAgIH1cblxuICAgIGlmIChkdXJhdGlvbiA+PSA2MCkge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoZHVyYXRpb24gLyA2MCkgKyAnIG1pbic7XG4gICAgfVxuICAgIHJldHVybiBkdXJhdGlvbiArICcgcyc7XG4gIH1cblxuICBzaG93U2VnbWVudChzdGVwLCB6b29tVG9FeHRlbnQgPSBmYWxzZSkge1xuICAgIHRoaXMuc2hvd1JvdXRlU2VnbWVudEdlb21ldHJ5KHN0ZXAuZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHpvb21Ub0V4dGVudCk7XG4gIH1cblxuICBzaG93Um91dGVTZWdtZW50R2VvbWV0cnkoY29vcmRpbmF0ZXMsIHpvb21Ub0V4dGVudCA9IGZhbHNlKSB7XG4gICAgY29uc3QgdmVydGV4SWQgPSAndmVydGV4JztcbiAgICBjb25zdCBnZW9tZXRyeTQzMjYgPSBuZXcgb2xnZW9tLkxpbmVTdHJpbmcoY29vcmRpbmF0ZXMpO1xuICAgIGNvbnN0IGdlb21ldHJ5TWFwUHJvamVjdGlvbiA9IGdlb21ldHJ5NDMyNi50cmFuc2Zvcm0oXG4gICAgICAnRVBTRzo0MzI2JyxcbiAgICAgIHRoaXMubWFwLnByb2plY3Rpb25cbiAgICApO1xuICAgIGNvbnN0IHJvdXRlU2VnbWVudENvb3JkaW5hdGVzID0gKGdlb21ldHJ5TWFwUHJvamVjdGlvbiBhcyBhbnkpLmdldENvb3JkaW5hdGVzKCk7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gcm91dGVTZWdtZW50Q29vcmRpbmF0ZXNbMF07XG5cbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBvbGdlb20uUG9pbnQobGFzdFBvaW50KTtcbiAgICBjb25zdCBmZWF0dXJlID0gbmV3IG9sRmVhdHVyZSh7IGdlb21ldHJ5IH0pO1xuXG4gICAgY29uc3QgZ2VvanNvbkdlb20gPSBuZXcgT2xHZW9KU09OKCkud3JpdGVHZW9tZXRyeU9iamVjdChnZW9tZXRyeSwge1xuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICBkYXRhUHJvamVjdGlvbjogdGhpcy5tYXAucHJvamVjdGlvblxuICAgIH0pIGFzIEZlYXR1cmVHZW9tZXRyeTtcblxuICAgIGNvbnN0IHByZXZpb3VzVmVydGV4ID0gdGhpcy5yb3V0ZVN0b3JlLmdldCh2ZXJ0ZXhJZCk7XG4gICAgY29uc3QgcHJldmlvdXNWZXJ0ZXhSZXZpc2lvbiA9IHByZXZpb3VzVmVydGV4XG4gICAgICA/IHByZXZpb3VzVmVydGV4Lm1ldGEucmV2aXNpb25cbiAgICAgIDogMDtcblxuICAgIGNvbnN0IHZlcnRleEZlYXR1cmU6IEZlYXR1cmUgPSB7XG4gICAgICB0eXBlOiBGRUFUVVJFLFxuICAgICAgZ2VvbWV0cnk6IGdlb2pzb25HZW9tLFxuICAgICAgcHJvamVjdGlvbjogdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaWQ6IHZlcnRleElkLFxuICAgICAgICB0eXBlOiAndmVydGV4J1xuICAgICAgfSxcbiAgICAgIG1ldGE6IHtcbiAgICAgICAgaWQ6IHZlcnRleElkLFxuICAgICAgICByZXZpc2lvbjogcHJldmlvdXNWZXJ0ZXhSZXZpc2lvbiArIDFcbiAgICAgIH0sXG4gICAgICBvbDogZmVhdHVyZVxuICAgIH07XG4gICAgdGhpcy5yb3V0ZVN0b3JlLnVwZGF0ZSh2ZXJ0ZXhGZWF0dXJlKTtcbiAgICBpZiAoem9vbVRvRXh0ZW50KSB7XG4gICAgICB0aGlzLm1hcC52aWV3Q29udHJvbGxlci56b29tVG9FeHRlbnQoZmVhdHVyZS5nZXRHZW9tZXRyeSgpLmdldEV4dGVudCgpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKTtcbiAgICB9XG4gIH1cblxuICB6b29tUm91dGUoZXh0ZW50Pykge1xuICAgIGlmIChleHRlbnQpIHtcbiAgICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLnpvb21Ub0V4dGVudChleHRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5yb3V0ZVN0b3JlLmxheWVyKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlRmVhdHVyZSA9IHRoaXMucm91dGVTdG9yZS5sYXllci5vbFxuICAgICAgICAgIC5nZXRTb3VyY2UoKVxuICAgICAgICAgIC5nZXRGZWF0dXJlcygpXG4gICAgICAgICAgLmZpbmQoZiA9PiBmLmdldElkKCkgPT09ICdyb3V0ZScpO1xuICAgICAgICBpZiAocm91dGVGZWF0dXJlKSB7XG4gICAgICAgICAgY29uc3Qgcm91dGVFeHRlbnQgPSByb3V0ZUZlYXR1cmUuZ2V0R2VvbWV0cnkoKS5nZXRFeHRlbnQoKTtcbiAgICAgICAgICB0aGlzLm1hcC52aWV3Q29udHJvbGxlci56b29tVG9FeHRlbnQocm91dGVFeHRlbnQgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dSb3V0ZUdlb21ldHJ5KG1vdmVUb0V4dGVudCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2VvbSA9IHRoaXMuYWN0aXZlUm91dGUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgZ2VvbWV0cnk0MzI2ID0gbmV3IG9sZ2VvbS5MaW5lU3RyaW5nKGdlb20pO1xuICAgIGNvbnN0IGdlb21ldHJ5TWFwUHJvamVjdGlvbiA9IGdlb21ldHJ5NDMyNi50cmFuc2Zvcm0oXG4gICAgICAnRVBTRzo0MzI2JyxcbiAgICAgIHRoaXMubWFwLnByb2plY3Rpb25cbiAgICApO1xuICAgIGlmIChtb3ZlVG9FeHRlbnQpIHtcbiAgICAgIHRoaXMuem9vbVJvdXRlKGdlb21ldHJ5TWFwUHJvamVjdGlvbi5nZXRFeHRlbnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvanNvbkdlb20gPSBuZXcgT2xHZW9KU09OKCkud3JpdGVHZW9tZXRyeU9iamVjdChcbiAgICAgIGdlb21ldHJ5TWFwUHJvamVjdGlvbixcbiAgICAgIHtcbiAgICAgICAgZmVhdHVyZVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICAgIGRhdGFQcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uXG4gICAgICB9XG4gICAgKSBhcyBGZWF0dXJlR2VvbWV0cnk7XG5cbiAgICBjb25zdCBwcmV2aW91c1JvdXRlID0gdGhpcy5yb3V0ZVN0b3JlLmdldCgncm91dGUnKTtcbiAgICBjb25zdCBwcmV2aW91c1JvdXRlUmV2aXNpb24gPSBwcmV2aW91c1JvdXRlXG4gICAgICA/IHByZXZpb3VzUm91dGUubWV0YS5yZXZpc2lvblxuICAgICAgOiAwO1xuXG4gICAgY29uc3Qgcm91dGVGZWF0dXJlOiBGZWF0dXJlID0ge1xuICAgICAgdHlwZTogRkVBVFVSRSxcbiAgICAgIGdlb21ldHJ5OiBnZW9qc29uR2VvbSxcbiAgICAgIHByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb24sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGlkOiAncm91dGUnLFxuICAgICAgICB0eXBlOiAncm91dGUnXG4gICAgICB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBpZDogJ3JvdXRlJyxcbiAgICAgICAgcmV2aXNpb246IHByZXZpb3VzUm91dGVSZXZpc2lvbiArIDFcbiAgICAgIH0sXG4gICAgICBvbDogbmV3IG9sRmVhdHVyZSh7IGdlb21ldHJ5OiBnZW9tZXRyeU1hcFByb2plY3Rpb24gfSlcbiAgICB9O1xuICAgIHRoaXMucm91dGVTdG9yZS51cGRhdGUocm91dGVGZWF0dXJlKTtcbiAgfVxuXG4gIGdldFJvdXRlcyhcbiAgICBtb3ZlVG9FeHRlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBkaXJlY3Rpb25zT3B0aW9uczogRGlyZWN0aW9uc09wdGlvbnMgPSB7fVxuICApIHtcbiAgICB0aGlzLmRlbGV0ZVN0b3JlRmVhdHVyZUJ5SUQodGhpcy5yb3V0ZVN0b3JlLCAndmVydGV4Jyk7XG4gICAgdGhpcy53cml0ZVN0b3BzVG9Gb3JtU2VydmljZSgpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZGlyZWN0aW9uc0Zvcm1TZXJ2aWNlLmdldFN0b3BzQ29vcmRpbmF0ZXMoKTtcbiAgICBpZiAoY29vcmRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm91dGVSZXNwb25zZSA9IHRoaXMuZGlyZWN0aW9uc1NlcnZpY2Uucm91dGUoXG4gICAgICBjb29yZHMsXG4gICAgICBkaXJlY3Rpb25zT3B0aW9uc1xuICAgICk7XG4gICAgaWYgKHJvdXRlUmVzcG9uc2UpIHtcbiAgICAgIHJvdXRlUmVzcG9uc2UubWFwKHJlcyA9PlxuICAgICAgICB0aGlzLnJvdXRlc1F1ZXJpZXMkJC5wdXNoKFxuICAgICAgICAgIHJlcy5zdWJzY3JpYmUocm91dGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXNSZXN1bHRzID0gcm91dGU7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVJvdXRlID0gdGhpcy5yb3V0ZXNSZXN1bHRzWzBdIGFzIERpcmVjdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnNob3dSb3V0ZUdlb21ldHJ5KG1vdmVUb0V4dGVudCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmcy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVubGlzdGVuU2luZ2xlQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNLZXkubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzS2V5LmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgb2xvYnNlcnZhYmxlLnVuQnlLZXkoa2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVSb3V0ZXNRdWVyaWVzKCkge1xuICAgIHRoaXMucm91dGVzUXVlcmllcyQkLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5yb3V0ZXNRdWVyaWVzJCQgPSBbXTtcbiAgfVxuXG4gIGNvcHlMaW5rVG9DbGlwYm9hcmQoKSB7XG4gICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IENsaXBib2FyZC5jb3B5KHRoaXMuZ2V0VXJsKCkpO1xuICAgIGlmIChzdWNjZXNzZnVsKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5kaWFsb2cuY29weVRpdGxlJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG1zZyA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5kaWFsb2cuY29weU1zZ0xpbmsnXG4gICAgICApO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5zdWNjZXNzKG1zZywgdGl0bGUpO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlEaXJlY3Rpb25zVG9DbGlwYm9hcmQoKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uc0JvZHkgPSB0aGlzLmRpcmVjdGlvbnNUb1RleHQoKTtcbiAgICBjb25zdCBzdWNjZXNzZnVsID0gQ2xpcGJvYXJkLmNvcHkoZGlyZWN0aW9uc0JvZHkpO1xuICAgIGlmIChzdWNjZXNzZnVsKSB7XG4gICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5kaWFsb2cuY29weVRpdGxlJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IG1zZyA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmRpYWxvZy5jb3B5TXNnJyk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MobXNnLCB0aXRsZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXJlY3Rpb25zVG9UZXh0KCkge1xuICAgIGNvbnN0IGluZGVudCA9ICdcXHQnO1xuICAgIGxldCBhY3RpdmVSb3V0ZURpcmVjdGl2ZSA9XG4gICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uaW5zdHJ1Y3Rpb25zJ1xuICAgICAgKSArICc6XFxuJztcbiAgICBsZXQgd2F5UG9pbnRMaXN0ID0gJyc7XG4gICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5zdW1tYXJ5JykgK1xuICAgICAgJzogXFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5hY3RpdmVSb3V0ZS50aXRsZSArXG4gICAgICAnXFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5mb3JtYXREaXN0YW5jZSh0aGlzLmFjdGl2ZVJvdXRlLmRpc3RhbmNlKSArXG4gICAgICAnXFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5mb3JtYXREdXJhdGlvbih0aGlzLmFjdGl2ZVJvdXRlLmR1cmF0aW9uKSArXG4gICAgICAnXFxuXFxuJyArXG4gICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uc3RvcHNMaXN0J1xuICAgICAgKSArXG4gICAgICAnOlxcbic7XG5cbiAgICBjb25zdCB1cmwgPVxuICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ubGluaycpICtcbiAgICAgICc6XFxuJyArXG4gICAgICBpbmRlbnQgK1xuICAgICAgdGhpcy5nZXRVcmwoKTtcblxuICAgIGxldCB3YXlQb2ludHNDbnQgPSAxO1xuICAgIHRoaXMuc3RvcHMudmFsdWUuZm9yRWFjaChzdG9wID0+IHtcbiAgICAgIGxldCBjb29yZCA9ICcnO1xuICAgICAgbGV0IHN0b3BQb2ludCA9ICcnO1xuICAgICAgaWYgKHN0b3Auc3RvcFBvaW50ICE9PSBzdG9wLnN0b3BDb29yZGluYXRlcykge1xuICAgICAgICBzdG9wUG9pbnQgPSBzdG9wLnN0b3BQb2ludDtcbiAgICAgICAgY29vcmQgPVxuICAgICAgICAgICcgKCcgK1xuICAgICAgICAgIFtzdG9wLnN0b3BDb29yZGluYXRlc1sxXSwgc3RvcC5zdG9wQ29vcmRpbmF0ZXNbMF1dLmpvaW4oJywnKSArXG4gICAgICAgICAgJyknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RvcFBvaW50ID0gW3N0b3Auc3RvcENvb3JkaW5hdGVzWzFdLCBzdG9wLnN0b3BDb29yZGluYXRlc1swXV0uam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgd2F5UG9pbnRMaXN0ID1cbiAgICAgICAgd2F5UG9pbnRMaXN0ICtcbiAgICAgICAgaW5kZW50ICtcbiAgICAgICAgd2F5UG9pbnRzQ250LnRvTG9jYWxlU3RyaW5nKCkgK1xuICAgICAgICAnLiAnICtcbiAgICAgICAgc3RvcFBvaW50ICtcbiAgICAgICAgY29vcmQgK1xuICAgICAgICAnXFxuJztcbiAgICAgIHdheVBvaW50c0NudCsrO1xuICAgIH0pO1xuXG4gICAgLy8gRGlyZWN0aW9uc1xuICAgIGxldCBsb2NhbENudCA9IDA7XG4gICAgdGhpcy5hY3RpdmVSb3V0ZS5zdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSB0aGlzLmZvcm1hdFN0ZXAoc3RlcCwgbG9jYWxDbnQpLmluc3RydWN0aW9uO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPVxuICAgICAgICB0aGlzLmZvcm1hdERpc3RhbmNlKHN0ZXAuZGlzdGFuY2UpID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnICgnICsgdGhpcy5mb3JtYXREaXN0YW5jZShzdGVwLmRpc3RhbmNlKSArICcpJztcbiAgICAgIGFjdGl2ZVJvdXRlRGlyZWN0aXZlID1cbiAgICAgICAgYWN0aXZlUm91dGVEaXJlY3RpdmUgK1xuICAgICAgICBpbmRlbnQgK1xuICAgICAgICAobG9jYWxDbnQgKyAxKS50b0xvY2FsZVN0cmluZygpICtcbiAgICAgICAgJy4gJyArXG4gICAgICAgIGluc3RydWN0aW9uICtcbiAgICAgICAgZGlzdGFuY2UgK1xuICAgICAgICAnXFxuJztcbiAgICAgIGxvY2FsQ250Kys7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaXJlY3Rpb25zQm9keSA9XG4gICAgICBzdW1tYXJ5ICsgd2F5UG9pbnRMaXN0ICsgJ1xcbicgKyB1cmwgKyAnXFxuXFxuJyArIGFjdGl2ZVJvdXRlRGlyZWN0aXZlO1xuXG4gICAgcmV0dXJuIGRpcmVjdGlvbnNCb2R5O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXJtQ2hhbmdlZCh0ZXJtOiBzdHJpbmcpIHtcbiAgICBpZiAodGVybSAhPT0gdW5kZWZpbmVkIHx8IHRlcm0ubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hQcm9wb3NhbHMgPSBbXTtcbiAgICAgIGlmICh0aGlzLnNlYXJjaCQkKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoJCQudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc2VhcmNoZXMgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoKHRlcm0sIHtzZWFyY2hUeXBlOiAnRmVhdHVyZSd9KTtcbiAgICAgIHJlc2VhcmNoZXMubWFwKHJlcyA9PlxuICAgICAgICB0aGlzLnNlYXJjaCQkID1cbiAgICAgICAgcmVzLnJlcXVlc3Quc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIHJlc3VsdHNcbiAgICAgICAgICAgIC5maWx0ZXIociA9PiByLmRhdGEuZ2VvbWV0cnkpXG4gICAgICAgICAgICAuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNlYXJjaFByb3Bvc2Fscy5maWx0ZXIociA9PiByLnNvdXJjZSA9PT0gZWxlbWVudC5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFByb3Bvc2Fscy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogZWxlbWVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICBtZXRhOiBlbGVtZW50Lm1ldGEsXG4gICAgICAgICAgICAgICAgICByZXN1bHRzOiByZXN1bHRzLm1hcChyID0+IHIuZGF0YSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHNcbiAgICAgICAgICAgICAgLmF0KHRoaXMuY3VycmVudFN0b3BJbmRleClcbiAgICAgICAgICAgICAgLnBhdGNoVmFsdWUoeyBzdG9wUHJvcG9zYWxzOiBzZWFyY2hQcm9wb3NhbHMgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWZzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0VGVybSh0ZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlcm0gPSB0ZXJtO1xuICAgIGlmIChcbiAgICAgIHRoaXMua2V5SXNWYWxpZCh0ZXJtKSAmJlxuICAgICAgKHRlcm0ubGVuZ3RoID49IHRoaXMubGVuZ3RoIHx8IHRlcm0ubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgdGhpcy5zdHJlYW0kLm5leHQodGVybSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBrZXlJc1ZhbGlkKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZEtleXMuZmluZCh2YWx1ZSA9PiB2YWx1ZSA9PT0ga2V5KSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAga2V5dXAoaSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCB0ZXJtID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLnNldFRlcm0odGVybSk7XG4gICAgdGhpcy5tYXAub2wudW4oJ3NpbmdsZWNsaWNrJywgZXZ0ID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlTWFwQ2xpY2soZXZ0LCBpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyU3RvcChzdG9wSW5kZXgpIHtcbiAgICAvLyB0aGlzLmRlbGV0ZURpcmVjdGlvbnNPdmVybGF5YnlJRCh0aGlzLmdldFN0b3BPdmVybGF5SUQoc3RvcEluZGV4KSk7XG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFN0b3BPdmVybGF5SUQoc3RvcEluZGV4KTtcbiAgICB0aGlzLmRlbGV0ZVN0b3JlRmVhdHVyZUJ5SUQodGhpcy5zdG9wc1N0b3JlLCBpZCk7XG4gICAgdGhpcy5yb3V0ZVN0b3JlLmNsZWFyKCk7XG4gICAgY29uc3Qgc3RvcHNDb3VudHMgPSB0aGlzLnN0b3BzLmxlbmd0aDtcbiAgICB0aGlzLnN0b3BzLnJlbW92ZUF0KHN0b3BJbmRleCk7XG4gICAgdGhpcy5zdG9wcy5pbnNlcnQoXG4gICAgICBzdG9wSW5kZXgsXG4gICAgICB0aGlzLmNyZWF0ZVN0b3AodGhpcy5kaXJlY3Rpb25zVGV4dChzdG9wSW5kZXgsIHN0b3BzQ291bnRzKSlcbiAgICApO1xuICAgIHRoaXMucm91dGVzUmVzdWx0cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmdldFJvdXRlcyhmYWxzZSk7XG4gIH1cblxuICBjaG9vc2VQcm9wb3NhbChwcm9wb3NhbCwgaSkge1xuICAgIGlmIChwcm9wb3NhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgZ2VvbUNvb3JkO1xuICAgICAgY29uc3QgZ2VvbSA9IChwcm9wb3NhbCBhcyBhbnkpLmdlb21ldHJ5O1xuICAgICAgaWYgKGdlb20udHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBnZW9tQ29vcmQgPSBnZW9tLmNvb3JkaW5hdGVzO1xuICAgICAgfSBlbHNlIGlmIChnZW9tLnR5cGUuc2VhcmNoKCdMaW5lJykgPj0gMCkge1xuICAgICAgICBjb25zdCBsaW5lID0gbmV3IE9sR2VvSlNPTigpLnJlYWRGZWF0dXJlcyhnZW9tKTtcbiAgICAgICAgZ2VvbUNvb3JkID0gbGluZVswXS5nZXRHZW9tZXRyeSgpLmdldEZpcnN0Q29vcmRpbmF0ZSgpO1xuICAgICAgICBnZW9tQ29vcmQgPSBbZ2VvbUNvb3JkWzBdLCBnZW9tQ29vcmRbMV1dO1xuICAgICAgfSBlbHNlIGlmIChnZW9tLnR5cGUuc2VhcmNoKCdQb2x5Z29uJykgPj0gMCkge1xuICAgICAgICBjb25zdCBwb2x5ID0gbmV3IE9sR2VvSlNPTigpLnJlYWRGZWF0dXJlcyhnZW9tKTtcbiAgICAgICAgZ2VvbUNvb3JkID0gcG9seVswXS5nZXRHZW9tZXRyeSgpLmdldFR5cGUoKSA9PT0gJ1BvbHlnb24nID9cbiAgICAgICAgICBnZW9tQ29vcmQgPSAgcG9seVswXS5nZXRHZW9tZXRyeSgpLmdldEludGVyaW9yUG9pbnQoKS5nZXRGaXJzdENvb3JkaW5hdGUoKSA6XG4gICAgICAgICAgZ2VvbUNvb3JkID0gIHBvbHlbMF0uZ2V0R2VvbWV0cnkoKS5nZXRJbnRlcmlvclBvaW50cygpLmdldEZpcnN0Q29vcmRpbmF0ZSgpO1xuICAgICAgICBnZW9tQ29vcmQgPSBbZ2VvbUNvb3JkWzBdLCBnZW9tQ29vcmRbMV1dO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2VvbUNvb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zdG9wcy5hdChpKS5wYXRjaFZhbHVlKHsgc3RvcENvb3JkaW5hdGVzOiBnZW9tQ29vcmQgfSk7XG4gICAgICAgIHRoaXMuYWRkU3RvcE92ZXJsYXkoZ2VvbUNvb3JkLCBpKTtcbiAgICAgICAgLyogIGNvbnN0IHByb3Bvc2FsRXh0ZW50ID0gdGhpcy5kaXJlY3Rpb25zU3RvcHNPdmVybGF5RGF0YVNvdXJjZS5vbFxuICAgICAgICAgIC5nZXRGZWF0dXJlQnlJZCh0aGlzLmdldFN0b3BPdmVybGF5SUQoaSkpXG4gICAgICAgICAgLmdldEdlb21ldHJ5KClcbiAgICAgICAgICAuZ2V0RXh0ZW50KCk7Ki9cblxuICAgICAgICAvKiBpZiAoIW9sZXh0ZW50LmludGVyc2VjdHMocHJvcG9zYWxFeHRlbnQsIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpKSkge1xuICAgICAgICAgIHRoaXMubWFwLnZpZXdDb250cm9sbGVyLm1vdmVUb0V4dGVudChwcm9wb3NhbEV4dGVudCk7XG4gICAgICAgIH0qL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvY3VzKGkpIHtcbiAgICB0aGlzLnVubGlzdGVuU2luZ2xlQ2xpY2soKTtcbiAgICB0aGlzLmN1cnJlbnRTdG9wSW5kZXggPSBpO1xuICAgIHRoaXMuZm9jdXNPblN0b3AgPSB0cnVlO1xuICAgIHRoaXMuZm9jdXNLZXkucHVzaChcbiAgICAgIHRoaXMubWFwLm9sLm9uY2UoJ3NpbmdsZWNsaWNrJywgZXZ0ID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVNYXBDbGljayhldnQsIGkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNYXBDbGljayhldmVudCwgaW5kZXhQb3M/KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0b3BJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFN0b3AoKTtcbiAgICAgIGluZGV4UG9zID0gdGhpcy5zdG9wcy5sZW5ndGggLSAyO1xuICAgICAgdGhpcy5zdG9wcy5hdChpbmRleFBvcykudmFsdWUuc3RvcFByb3Bvc2FscyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleFBvcyA9IHRoaXMuY3VycmVudFN0b3BJbmRleDtcbiAgICB9XG4gICAgY29uc3QgY2xpY2tDb29yZGluYXRlcyA9IG9scHJvai50cmFuc2Zvcm0oXG4gICAgICBldmVudC5jb29yZGluYXRlLFxuICAgICAgdGhpcy5tYXAucHJvamVjdGlvbixcbiAgICAgIHRoaXMucHJvamVjdGlvblxuICAgICk7XG4gICAgdGhpcy5zdG9wc1xuICAgICAgLmF0KGluZGV4UG9zKVxuICAgICAgLnBhdGNoVmFsdWUoeyBzdG9wUHJvcG9zYWxzOiBbXSwgc3RvcENvb3JkaW5hdGVzOiBjbGlja0Nvb3JkaW5hdGVzIH0pO1xuXG4gICAgdGhpcy5oYW5kbGVMb2NhdGlvblByb3Bvc2FscyhjbGlja0Nvb3JkaW5hdGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIGluZGV4UG9zKTtcbiAgICB0aGlzLmFkZFN0b3BPdmVybGF5KGNsaWNrQ29vcmRpbmF0ZXMgYXMgW251bWJlciwgbnVtYmVyXSwgaW5kZXhQb3MpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c09uU3RvcCA9IGZhbHNlOyAvLyBwcmV2ZW50IHRvIHRyaWdnZXIgbWFwIGNsaWNrIGFuZCBTZWxlY3Qgb24gcm91dGVzIGF0IHNhbWUgdGltZS5cbiAgICB9LCA1MDApO1xuICB9XG5cbiAgZ2VvbG9jYXRlU3RvcChpbmRleDogbnVtYmVyKSB7XG4gICAgbW92ZVRvT2xGZWF0dXJlcyhcbiAgICAgIHRoaXMubWFwLFxuICAgICAgW3RoaXMubWFwLmdlb2xvY2F0aW9uRmVhdHVyZV0sXG4gICAgICBGZWF0dXJlTW90aW9uLk1vdmVcbiAgICApO1xuICAgIGNvbnN0IGdlb2xvY2F0ZUNvb3JkaW5hdGVzID0gdGhpcy5tYXAudmlld0NvbnRyb2xsZXIuZ2V0Q2VudGVyKFxuICAgICAgdGhpcy5wcm9qZWN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnN0b3BzLmF0KGluZGV4KS5wYXRjaFZhbHVlKHsgc3RvcENvb3JkaW5hdGVzOiBnZW9sb2NhdGVDb29yZGluYXRlcyB9KTtcbiAgICB0aGlzLmFkZFN0b3BPdmVybGF5KGdlb2xvY2F0ZUNvb3JkaW5hdGVzLCBpbmRleCk7XG4gICAgdGhpcy5oYW5kbGVMb2NhdGlvblByb3Bvc2FscyhnZW9sb2NhdGVDb29yZGluYXRlcywgaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGFkZFN0b3BPdmVybGF5KGNvb3JkaW5hdGVzOiBbbnVtYmVyLCBudW1iZXJdLCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uc1RleHQgPSB0aGlzLmRpcmVjdGlvbnNUZXh0KGluZGV4KTtcbiAgICBsZXQgc3RvcENvbG9yO1xuICAgIGxldCBzdG9wVGV4dDtcbiAgICBpZiAoZGlyZWN0aW9uc1RleHQgPT09ICdzdGFydCcpIHtcbiAgICAgIHN0b3BDb2xvciA9ICcjMDA4MDAwJztcbiAgICAgIHN0b3BUZXh0ID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICdpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnN0YXJ0J1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbnNUZXh0ID09PSAnZW5kJykge1xuICAgICAgc3RvcENvbG9yID0gJyNmNjQxMzknO1xuICAgICAgc3RvcFRleHQgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uZW5kJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcENvbG9yID0gJyNmZmQ3MDAnO1xuICAgICAgc3RvcFRleHQgPVxuICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5pbnRlcm1lZGlhdGUnXG4gICAgICAgICkgK1xuICAgICAgICAnICMnICtcbiAgICAgICAgaW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgb2xnZW9tLlBvaW50KFxuICAgICAgb2xwcm9qLnRyYW5zZm9ybShjb29yZGluYXRlcywgdGhpcy5wcm9qZWN0aW9uLCB0aGlzLm1hcC5wcm9qZWN0aW9uKVxuICAgICk7XG5cbiAgICBjb25zdCBzdG9wSUQgPSB0aGlzLmdldFN0b3BPdmVybGF5SUQoaW5kZXgpO1xuICAgIGNvbnN0IGdlb2pzb25HZW9tID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3QoZ2VvbWV0cnksIHtcbiAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uLFxuICAgICAgZGF0YVByb2plY3Rpb246IHRoaXMubWFwLnByb2plY3Rpb25cbiAgICB9KSBhcyBGZWF0dXJlR2VvbWV0cnk7XG5cbiAgICBjb25zdCBwcmV2aW91c1N0b3AgPSB0aGlzLnN0b3BzU3RvcmUuZ2V0KHN0b3BJRCk7XG4gICAgY29uc3QgcHJldmlvdXNTdG9wUmV2aXNpb24gPSBwcmV2aW91c1N0b3AgPyBwcmV2aW91c1N0b3AubWV0YS5yZXZpc2lvbiA6IDA7XG5cbiAgICBjb25zdCBzdG9wRmVhdHVyZTogRmVhdHVyZSA9IHtcbiAgICAgIHR5cGU6IEZFQVRVUkUsXG4gICAgICBnZW9tZXRyeTogZ2VvanNvbkdlb20sXG4gICAgICBwcm9qZWN0aW9uOiB0aGlzLm1hcC5wcm9qZWN0aW9uLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDogc3RvcElELFxuICAgICAgICB0eXBlOiAnc3RvcCcsXG4gICAgICAgIHN0b3BUZXh0LFxuICAgICAgICBzdG9wQ29sb3IsXG4gICAgICAgIHN0b3BPcGFjaXR5OiAxXG4gICAgICB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBpZDogc3RvcElELFxuICAgICAgICByZXZpc2lvbjogcHJldmlvdXNTdG9wUmV2aXNpb24gKyAxXG4gICAgICB9LFxuICAgICAgb2w6IG5ldyBvbEZlYXR1cmUoeyBnZW9tZXRyeSB9KVxuICAgIH07XG4gICAgdGhpcy5zdG9wc1N0b3JlLnVwZGF0ZShzdG9wRmVhdHVyZSk7XG4gICAgdGhpcy5nZXRSb3V0ZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9wT3ZlcmxheUlEKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCB0eHQ7XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0eHQgPSAnc3RhcnQnO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuc3RvcHMubGVuZ3RoIC0gMSkge1xuICAgICAgdHh0ID0gJ2VuZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4dCA9IGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gJ2RpcmVjdGlvbnNTdG9wXycgKyB0eHQ7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlU3RvcmVGZWF0dXJlQnlJRChzdG9yZSwgaWQpIHtcbiAgICBjb25zdCBlbnRpdHkgPSBzdG9yZS5nZXQoaWQpO1xuICAgIGlmIChlbnRpdHkpIHtcbiAgICAgIHN0b3JlLmRlbGV0ZShlbnRpdHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXJsKCkge1xuICAgIGlmICghdGhpcy5yb3V0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbnNLZXkgPSB0aGlzLnJvdXRlLm9wdGlvbnMuZGlyZWN0aW9uc0Nvb3JkS2V5O1xuICAgIGNvbnN0IHN0b3BzQ29vcmRpbmF0ZXMgPSBbXTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZSAmJlxuICAgICAgdGhpcy5kaXJlY3Rpb25zRm9ybVNlcnZpY2UuZ2V0U3RvcHNDb29yZGluYXRlcygpICYmXG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZS5nZXRTdG9wc0Nvb3JkaW5hdGVzKCkubGVuZ3RoICE9PSAwXG4gICAgKSB7XG4gICAgICB0aGlzLmRpcmVjdGlvbnNGb3JtU2VydmljZS5nZXRTdG9wc0Nvb3JkaW5hdGVzKCkuZm9yRWFjaChjb29yZCA9PiB7XG4gICAgICAgIHN0b3BzQ29vcmRpbmF0ZXMucHVzaChyb3VuZENvb3JkVG8oY29vcmQsIDYpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgZGlyZWN0aW9uc1VybCA9ICcnO1xuICAgIGlmIChzdG9wc0Nvb3JkaW5hdGVzLmxlbmd0aCA+PSAyKSB7XG4gICAgICBkaXJlY3Rpb25zVXJsID0gYCR7ZGlyZWN0aW9uc0tleX09JHtzdG9wc0Nvb3JkaW5hdGVzLmpvaW4oJzsnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtsb2NhdGlvbi5vcmlnaW59JHtsb2NhdGlvbi5wYXRobmFtZX0/dG9vbD1kaXJlY3Rpb25zJnNpZGVuYXY9MSYke2RpcmVjdGlvbnNVcmx9YDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0eWxlIGZvciB0aGUgZGlyZWN0aW9ucyBzdG9wcyBhbmQgcm91dGVzXG4gKiBAcGFyYW0gZmVhdHVyZSBPbEZlYXR1cmVcbiAqIEByZXR1cm5zIE9MIHN0eWxlIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9wTWFya2VyKFxuICBmZWF0dXJlOiBvbEZlYXR1cmU8T2xHZW9tZXRyeT4sXG4gIHJlc29sdXRpb246IG51bWJlclxuKTogb2xzdHlsZS5TdHlsZSB8IG9sc3R5bGUuU3R5bGVbXSB7XG4gIGNvbnN0IHZlcnRleFN0eWxlID0gW1xuICAgIG5ldyBvbHN0eWxlLlN0eWxlKHtcbiAgICAgIGdlb21ldHJ5OiBmZWF0dXJlLmdldEdlb21ldHJ5KCksXG4gICAgICBpbWFnZTogbmV3IG9sc3R5bGUuQ2lyY2xlKHtcbiAgICAgICAgcmFkaXVzOiA3LFxuICAgICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7IGNvbG9yOiAnI0ZGMDAwMCcsIHdpZHRoOiAzIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIF07XG5cbiAgY29uc3Qgc3RvcFN0eWxlID0gY3JlYXRlT3ZlcmxheU1hcmtlclN0eWxlKHtcbiAgICB0ZXh0OiBmZWF0dXJlLmdldCgnc3RvcFRleHQnKSxcbiAgICBvcGFjaXR5OiBmZWF0dXJlLmdldCgnc3RvcE9wYWNpdHknKSxcbiAgICBtYXJrZXJDb2xvcjogZmVhdHVyZS5nZXQoJ3N0b3BDb2xvcicpLFxuICAgIG1hcmtlck91dGxpbmVDb2xvcjogWzI1NSwgMjU1LCAyNTVdfSk7XG5cbiAgY29uc3Qgcm91dGVTdHlsZSA9IFtcbiAgICBuZXcgb2xzdHlsZS5TdHlsZSh7XG4gICAgICBzdHJva2U6IG5ldyBvbHN0eWxlLlN0cm9rZSh7IGNvbG9yOiAncmdiYSgxMDYsIDEyMSwgMTMwLCAwLjc1KScsIHdpZHRoOiAxMCB9KVxuICAgIH0pLFxuICAgIG5ldyBvbHN0eWxlLlN0eWxlKHtcbiAgICAgIHN0cm9rZTogbmV3IG9sc3R5bGUuU3Ryb2tlKHsgY29sb3I6ICdyZ2JhKDc5LCAxNjksIDIyMSwgMC43NSknLCB3aWR0aDogNiB9KVxuICAgIH0pXG4gIF07XG5cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09ICdzdG9wJykge1xuICAgIHJldHVybiBzdG9wU3R5bGU7XG4gIH1cbiAgaWYgKGZlYXR1cmUuZ2V0KCd0eXBlJykgPT09ICd2ZXJ0ZXgnKSB7XG4gICAgcmV0dXJuIHZlcnRleFN0eWxlO1xuICB9XG4gIGlmIChmZWF0dXJlLmdldCgndHlwZScpID09PSAncm91dGUnKSB7XG4gICAgcmV0dXJuIHJvdXRlU3R5bGU7XG4gIH1cbn1cbiIsIjxmb3JtIGNsYXNzPVwiaWdvLWZvcm1cIiBbZm9ybUdyb3VwXT1cInN0b3BzRm9ybVwiPlxyXG4gIDwhLS0gPGRpdiBjbGFzcz1cImlnby1mb3JtLWJ1dHRvbi1ncm91cFwiPlxyXG5cclxuICA8L2Rpdj4gLS0+XHJcbiAgPGRpdiAjaW5wdXRzIGZvcm1BcnJheU5hbWU9XCJzdG9wc1wiICpuZ0Zvcj1cImxldCBzdG9wIG9mIHN0b3BzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwibWFwLmdlb2xvY2F0aW9uRmVhdHVyZVwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uZ2VvbG9jYXRlJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJnZW9sb2NhdGVTdG9wKGkpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNyb3NzaGFpcnMtZ3BzXCI+PC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwic3RvcFBvaW50XCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eydpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLicrc3RvcC52YWx1ZS5kaXJlY3Rpb25zVGV4dCB8IHRyYW5zbGF0ZX19XCIgKGZvY3VzKT1cImZvY3VzKGkpXCJcclxuICAgICAgICAgICAgKGtleXVwKT1cImtleXVwKGksJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cInByZXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgIG1hdC1idXR0b24gXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzdG9wLnZhbHVlICYmIChzdG9wLnZhbHVlLnN0b3BQb2ludC5sZW5ndGggPiAwIHx8IHN0b3AudmFsdWUuc3RvcFByb3Bvc2Fscy5sZW5ndGggPiAwKVwiXHJcbiAgICAgICAgICAgICAgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiBhcmlhLWxhYmVsPVwiQ2xlYXJcIiAoY2xpY2spPVwiY2xlYXJTdG9wKGkpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXAgKm5nRm9yPVwibGV0IHNvdXJjZSBvZiBzdG9wLnZhbHVlLnN0b3BQcm9wb3NhbHNcIiBbbGFiZWxdPVwic291cmNlLnNvdXJjZS50aXRsZVwiIFtkaXNhYmxlZF09XCJzb3VyY2Uuc291cmNlLmVuYWJsZWQgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHJlc3VsdCBvZiBzb3VyY2UucmVzdWx0c1wiIFt2YWx1ZV09XCJyZXN1bHQubWV0YSA/IHJlc3VsdC5tZXRhLnRpdGxlIDogJydcIiBcclxuICAgICAgICAgICAgICAob25TZWxlY3Rpb25DaGFuZ2UpPVwiY2hvb3NlUHJvcG9zYWwocmVzdWx0LGkpXCJcclxuICAgICAgICAgICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwicmVzdWx0Lm1ldGEgPyByZXN1bHQubWV0YS50aXRsZSA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZXN1bHQubWV0YSA/IHJlc3VsdC5tZXRhLnRpdGxlIDogJycgfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxyXG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImlnby1mb3JtLWJ1dHRvbi1ncm91cFwiPiAtLT5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gMFwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ucmFpc2VTdG9wJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiIChjbGljayk9XCJyYWlzZVN0b3AoaSlcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhcnJvdy11cHdhcmRcIj48L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gc3RvcHMubGVuZ3RoIC0gMVwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ubG93ZXJTdG9wJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJjb2xvclwiIChjbGljayk9XCJsb3dlclN0b3AoaSlcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhcnJvdy1kb3dud2FyZFwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDAgJiYgaSAhPT0gc3RvcHMubGVuZ3RoIC0gMVwiIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCIgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0ucmVtb3ZlU3RvcCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwicmVtb3ZlU3RvcChpKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9tYXQtbGlzdC1pdGVtPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJpZ28tZm9ybS1idXR0b24tZ3JvdXBcIj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5hZGRTdG9wJyB8IHRyYW5zbGF0ZVwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJhZGRTdG9wKClcIj5cclxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJtYXAtbWFya2VyLXBsdXNcIj48L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIiBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZGlyZWN0aW9uc0Zvcm0uem9vbVJvdXRlJyB8IHRyYW5zbGF0ZVwiICpuZ0lmPVwicm91dGVzUmVzdWx0c1wiIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIChjbGljayk9XCJ6b29tUm91dGUoKVwiPlxyXG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cIm1hZ25pZnktcGx1cy1vdXRsaW5lXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLnJlc2V0RGlyZWN0aW9uc0J0bicgfCB0cmFuc2xhdGVcIiAqbmdJZj1cInJvdXRlc1Jlc3VsdHNcIiBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAoY2xpY2spPVwicmVzZXRGb3JtKHRydWUpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZmlsZS1yZXN0b3JlXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJyb3V0ZXNSZXN1bHRzXCIgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCIgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cIidpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmNvcHknIHwgdHJhbnNsYXRlXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNvcHlEaXJlY3Rpb25zVG9DbGlwYm9hcmQoKVwiPlxyXG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvbnRlbnQtY29weVwiPjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwicm91dGVzUmVzdWx0c1wiIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kaXJlY3Rpb25zRm9ybS5saW5rJyB8IHRyYW5zbGF0ZVwiIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjb3B5TGlua1RvQ2xpcGJvYXJkKClcIj5cclxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJsaW5rXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuPC9mb3JtPlxyXG5cclxuPGRpdiBjbGFzcz1cImlnby1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cInJvdXRlc1Jlc3VsdHNcIj5cclxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJyb3V0ZXNSZXN1bHRzICYmIHJvdXRlc1Jlc3VsdHMubGVuZ3RoID4gMVwiPlxyXG4gICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJ7eydpZ28uZ2VvLmRpcmVjdGlvbnNGb3JtLmRyaXZpbmdPcHRpb25zJyB8IHRyYW5zbGF0ZX19XCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VSb3V0ZSgpXCIgWyhuZ01vZGVsKV09XCJhY3RpdmVSb3V0ZVwiPlxyXG4gICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgcGF0aERpcmVjdGlvbnMgb2Ygcm91dGVzUmVzdWx0czsgbGV0IGNudCA9IGluZGV4O1wiIFt2YWx1ZV09XCJwYXRoRGlyZWN0aW9uc1wiPlxyXG4gICAgICAgIE9wdGlvbiB7e2NudCArIDF9fSA6IHt7Zm9ybWF0RGlzdGFuY2UocGF0aERpcmVjdGlvbnMuZGlzdGFuY2UpfX0gKHt7Zm9ybWF0RHVyYXRpb24ocGF0aERpcmVjdGlvbnMuZHVyYXRpb24pfX0pXHJcbiAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgIDwvbWF0LXNlbGVjdD5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJyb3V0ZXNSZXN1bHRzICYmIHJvdXRlc1Jlc3VsdHMubGVuZ3RoID09PSAwXCI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgPG1hdC1saXN0PlxyXG4gICAgPGgyIG1hdC1oZWFkZXIgY2xhc3M9XCJpZ28tcm91dGUtdGl0bGUgbWF0LXR5cG9ncmFwaHlcIj57e2FjdGl2ZVJvdXRlLnRpdGxlfX08L2gyPlxyXG4gICAgPGgyIG1hdC1zdWJoZWFkZXI+e3tmb3JtYXREaXN0YW5jZShhY3RpdmVSb3V0ZS5kaXN0YW5jZSl9fSwge3tmb3JtYXREdXJhdGlvbihhY3RpdmVSb3V0ZS5kdXJhdGlvbil9fTwvaDI+XHJcblxyXG4gICAgPG1hdC1saXN0LWl0ZW0gXHJcbiAgICBjbGFzcz1cImlnby1zdGVwc1wiXHJcbiAgICAobW91c2VlbnRlcik9XCJzaG93U2VnbWVudChzdGVwKVwiIFxyXG4gICAgKGNsaWNrKT1cInNob3dTZWdtZW50KHN0ZXAsdHJ1ZSlcIiBcclxuICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIGFjdGl2ZVJvdXRlLnN0ZXBzOyBsZXQgY250ID0gaW5kZXg7XCJcclxuICAgICAgaWdvTGlzdEl0ZW0+XHJcbiAgICAgIDxtYXQtaWNvbiBbbmdDbGFzc109XCJmb3JtYXRTdGVwKHN0ZXAsY250KS5jc3NDbGFzc1wiIG1hdC1saXN0LWljb24gc3ZnSWNvbj1cInt7Zm9ybWF0U3RlcChzdGVwLGNudCkuaW1hZ2V9fVwiPjwvbWF0LWljb24+XHJcblxyXG4gICAgICA8aDQgbWF0LWxpbmU+e3tjbnQgKzF9fS4ge3tmb3JtYXRTdGVwKHN0ZXAsY250KS5pbnN0cnVjdGlvbn19PC9oND5cclxuICAgICAgPGg0IG1hdC1saW5lIGNsYXNzPVwicmlnaHRcIj57e2Zvcm1hdERpc3RhbmNlKHN0ZXAuZGlzdGFuY2UpfX08L2g0PlxyXG4gICAgPC9tYXQtbGlzdC1pdGVtPlxyXG5cclxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG5cclxuICA8L21hdC1saXN0PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
|