@tomtom-org/maps-sdk 0.62.3 → 0.63.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/CHANGELOG.md +84 -0
- package/core/dist/core.es.js +1 -1
- package/core/dist/core.es.js.map +1 -1
- package/core/dist/index.d.ts +3 -3
- package/core/package.json +0 -1
- package/map/dist/index.d.ts +8162 -8129
- package/map/dist/map.es.js +1 -1
- package/map/dist/map.es.js.map +1 -1
- package/map/package.json +0 -1
- package/package.json +4 -5
- package/services/package.json +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,89 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.63.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: TrafficAreaAnalyticsModule names its settings as the other modules do, so its config and knob ids change
|
|
8
|
+
- `metricConfig` is `metrics`, and its knob ids `metrics.<metric>.*`
|
|
9
|
+
- a colour stops' `valueType` is `scaleMode`, taking the height's values: `'predefinedRange'`, `'currentRange'` and `'raw'`; `AreaAnalyticsValueType` is `AreaAnalyticsScaleMode`
|
|
10
|
+
- `regionPolygon` takes `fill: { opacity }`, `line: { opacity, width }` and `fillStyle: 'filled' | 'inverted'` in place of `fillOpacity`, `outlineOpacity`, `outlineWidth` and `inverted`
|
|
11
|
+
|
|
12
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: whole base-map layer groups are `BaseMapModule`'s alone; the StylingModule knobs `basemap.<group>`, `buildings.footprints`, `buildings.3d` and `roads.shields` are gone
|
|
13
|
+
- map: show or hide a group with `baseMap.setVisible(visible, { layerGroups: { show: 'only', values: ['buildings3D'] } })`, or `setKnob(baseMap, baseMapKnobCatalogue, 'groups.buildings3D.visible', true)`
|
|
14
|
+
- map: the `data-viz`, `night-driving` and `minimal` presets no longer show or hide the building groups and the road shields
|
|
15
|
+
- agent-toolkit: the `toggleTilesBaseMapLayerGroups` tool shows and hides whole groups, or the whole base map, and reports which groups are hidden; `setMapStyling` no longer takes the group knobs
|
|
16
|
+
|
|
17
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: TrafficFlowModule and TrafficIncidentsModule `filters` is one filter, its fields set directly, and `any` adds the further filters a feature may match instead: `filters: { any: [{ roadCategories }] }` becomes `filters: { roadCategories }`, and the knob ids drop `any.0` (`filters.roadCategories.values`). Flow's `showRoadClosures` is `roadClosures`. `TrafficFlowFilters` and `TrafficIncidentsFilters` are `FiltersWithAlternatives` of their one filter. BaseMapModule `layerGroups` take the `{ show: 'only' | 'all-except', values }` filter POIs and traffic use, instead of `{ mode: 'include' | 'exclude', names }`.
|
|
18
|
+
|
|
19
|
+
- [#2465](https://github.com/tomtom-internal/maps-sdk-js/pull/2465) [`9d7d46c`](https://github.com/tomtom-internal/maps-sdk-js/commit/9d7d46c719b29f67fda64069a819129291063e34) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: **Breaking:** `GeometriesModule` takes MapLibre border overrides only through `layers.line`
|
|
20
|
+
- **Breaking:** `line.layer` is removed; move its `paint` and `layout` to `layers: { line }`, which takes precedence over the curated `line` fields where `line.layer` sat under them
|
|
21
|
+
|
|
22
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: the TrafficIncidentDetailsModule `focus` setting is `highlight`, the look of a focused, hovered or clicked incident; `setFocus` and the `focused` state keep their names
|
|
23
|
+
- map: `IncidentFocusStyle` is `IncidentHighlightConfig`, the knob ids `focus.outlineColor` and `focus.widthFactor` are `highlight.outlineColor` and `highlight.widthFactor`
|
|
24
|
+
- map: the `layers.focusHalo` override is `layers.highlightHalo`, and the layer id suffix `-focus-halo` is `-highlight-halo`
|
|
25
|
+
|
|
26
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `setKnob`, `getKnob` and `resetKnob` set, read and reset a knob by id on every module, `StylingFoundationsModule` included, which loses its own `set`, `get` and `reset`
|
|
27
|
+
- `styling.set(id, value)` is `setKnob(styling, stylingFoundationsKnobCatalogue, id, value)`, `styling.get(id)` is `getKnob(styling, stylingFoundationsKnobCatalogue, id)`, `styling.reset(id)` is `resetKnob(styling, stylingFoundationsKnobCatalogue, id)`, and `styling.reset()` is `styling.resetConfig()`
|
|
28
|
+
- `getKnob(module, catalogue, id)` returns the value in force, or the catalogue default where the configuration sets none
|
|
29
|
+
- `resetKnob(module, catalogue, id)` drops the knob from the configuration, so a `setKnob` then a `resetKnob` leaves `getConfig()` as it was
|
|
30
|
+
- `KnobTarget` types what the three functions take, for a control panel written once for any module
|
|
31
|
+
|
|
32
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: a knob's range is read from its catalogue with `knobEntryOf(catalogue, id)`, and the `*_RANGE` constants that repeated it are no longer exported
|
|
33
|
+
- `ROUTE_WIDTH_FACTOR_RANGE`, `ROUTE_WAYPOINT_SIZE_FACTOR_RANGE`, `ROUTE_WAYPOINT_HIGHLIGHT_SIZE_FACTOR_RANGE`, `SECTION_ICON_SIZE_FACTOR_RANGE` and `ROUTE_HIGHLIGHT_OUTLINE_WIDTH_FACTOR_RANGE` are `knobEntryOf(routingKnobCatalogue, id).range`
|
|
34
|
+
- `INCIDENT_FOCUS_WIDTH_FACTOR_RANGE` is `knobEntryOf(trafficIncidentDetailsKnobCatalogue, 'highlight.widthFactor').range`
|
|
35
|
+
- **Breaking:** the undocumented route layer colours, widths and size helpers, such as `ROUTE_LINE_FOREGROUND_COLOR` and `getWaypointIconSize`, are no longer exported; `SELECTED_ROUTE_FILTER` and `DESELECTED_ROUTE_FILTER` stay
|
|
36
|
+
- `knobEntryOf` throws an `Error` naming an id its catalogue lacks
|
|
37
|
+
|
|
38
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: every label names its content `title` and its look with the shared label fields, in a `label` object. PlacesModule `connections.label` takes `{ title, color, haloColor }` instead of a function beside `textColor` and `haloColor`, and the cluster badge's `textColor` and `textSize` move to `badge.label.color` and `badge.label.size`. RoutingModule `countryCrossings.textColor` is `countryCrossings.label.color`. GeometriesModule `label.text` and `lineLabel.text` are `title`. ReachableRangesModule `title` moves to `label.title`, and `palette` to `fill.palette`. The knob ids follow.
|
|
39
|
+
|
|
40
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `StylingFoundationsModule` keeps the foundations of the look (label, symbol and road sizes, the map colours and the accent, projection and sky), and every other look knob moves to the module drawing those layers
|
|
41
|
+
- map: the POI knobs are `POIsModule`'s: `pois.sizeFactor`, `pois.minZoom` and `pois.zoomShift` are `sizeFactor`, `minZoom` and `zoomShift`; `pois.labelColor` and `pois.labelOutlineColor` are `label.color` and `label.haloColor`; `pois.microMarkers` is `microMarkers.visible`, in `poisKnobCatalogue` and `POIsModuleConfig`
|
|
42
|
+
- map: the traffic knobs are `TrafficFlowModule`'s and `TrafficIncidentsModule`'s: `traffic.flow.<level>Color` is `colors.<level>` (`colors.slow`, …), `traffic.incidents.<magnitude>Color` is `colors.<magnitude>`, and each module has its own `widthFactor`
|
|
43
|
+
- map: the hillshade knobs are `TerrainModule`'s, under the same `hillshade.*` ids in `terrainKnobCatalogue` and `TerrainModuleConfig`
|
|
44
|
+
- map: the road markings are `BaseMapModule`'s: `roads.exitNumbers`, `roads.arrows`, `roads.restricted` and `roads.underConstruction` are `roads.<part>.visible` in `baseMapKnobCatalogue`, set in `BaseMapModuleConfig` as `roads: { exitNumbers: { visible: false } }`
|
|
45
|
+
- map: the knobs still compose across modules on one layer (`labels.sizeFactor` and the POIs' `sizeFactor` multiply on the POI labels) and survive a style switch
|
|
46
|
+
- map: `getStyleColor(map, id)` reads the colour a style colour knob is at by its map-wide id (`'traffic.incidents.colors.major'`, `'pois.label.color'`, `'colors.water'`), with `styleColorKnobIds` listing them; `StylingColorKnobId` is `StyleColorKnobId`, joined by `StyleKnobId` and `StyleKnobValueOf`
|
|
47
|
+
|
|
48
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: the undocumented internals `mapDisplayPoiCategoryMappings`, `toBaseMapPOICategory`, `toBaseMapPOIGroup`, `baseMapPOICategoryValues`, `sharedInstanceIfCreated` and `SymbolLayerSpecWithoutSource` are no longer exported; `MapStylePOICategory` stays
|
|
49
|
+
|
|
50
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: presets are the map's, not `StylingFoundationsModule`'s: `styling.applyPreset(id)` is `await applyMapPreset(map, id)`, which sets the StylingFoundations, BaseMap and POIs knobs each preset names
|
|
51
|
+
- map: `stylingPresetIds`, `stylingPresetCatalogue`, `StylingPresetId` and `StylingPreset` are `mapPresetIds`, `mapPresetCatalogue`, `MapPresetId` and `MapPreset`, with `MapPresetSettings` giving each module's values by its own catalogue ids
|
|
52
|
+
- map: `applyMapPreset` creates the modules the map lacks, takes `{ merge: true }` as before, and throws an `Error` for an unknown id
|
|
53
|
+
|
|
54
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: RoutingModule's `waypointSize` and `waypointSizeFactor` move into `waypoints` as `size` and `sizeFactor`, beside every other waypoint setting; the knob ids are `waypoints.size` and `waypoints.sizeFactor`
|
|
55
|
+
|
|
56
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `StylingModule` is `StylingFoundationsModule`, the name of what it holds now that every other module styles its own layers
|
|
57
|
+
- map: its types and catalogue follow: `StylingFoundationsModuleConfig`, `StylingFoundationsEvents`, `StylingFoundationsKnob`, `StylingFoundationsKnobId`, `StylingFoundationsKnobKind`, `StylingFoundationsKnobRange`, `StylingFoundationsKnobValue`, `StylingFoundationsKnobValueOf`, `StylingFoundationsKnobAppliesTo`, `stylingFoundationsKnobCatalogue`, `stylingFoundationsKnobIds`, `stylingFoundationsKnobKinds` and `stylingFoundationsKnobAppliesTo`
|
|
58
|
+
- agent-toolkit: the base-map state's `getStylingModule()` is `getStylingFoundationsModule()`
|
|
59
|
+
|
|
60
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: `StylingSettings` is `StylingFoundationsModuleConfig`, the name every other module gives its configuration
|
|
61
|
+
|
|
62
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - **Breaking:** map: every show-or-hide setting is a `visible` flag, so TerrainModule nests its settings and Places' EV availability drops `enabled`
|
|
63
|
+
- `TerrainModule` takes `{ hillshade: { visible }, elevation: { visible, exaggeration } }`; its knob ids are `hillshade.visible`, `elevation.visible` and `elevation.exaggeration`
|
|
64
|
+
- `terrain.setElevationEnabled` and `isElevationEnabled` are `setElevationVisible` and `isElevationVisible`
|
|
65
|
+
- `PlacesModule`'s `evAvailability.enabled` is `evAvailability.visible`, in the config and as a knob id
|
|
66
|
+
|
|
67
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `routingKnobCatalogue` publishes the rest of the waypoint label: `waypoints.label.size`, `waypoints.label.haloWidth`, `waypoints.label.opacity` and `waypoints.label.font`, so `RoutingKnob` takes the `enums` kind. Every module's label size and halo width knobs share one range, 6 to 48 and 0 to 10 pixels, widening the places ones.
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- [#2461](https://github.com/tomtom-internal/maps-sdk-js/pull/2461) [`cc853be`](https://github.com/tomtom-internal/maps-sdk-js/commit/cc853bec8b80ea9a49ea729e05b0897e14ff4e0a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `TrafficAreaAnalyticsModule` colour stops given out of order or sharing a value still paint the cells
|
|
72
|
+
- Each such ramp made MapLibre reject the layer's colour, as did any ramp under `relativeToActualRangePCT` once the loaded data had one value only
|
|
73
|
+
- Stops are sorted, and of stops sharing a value the last given wins
|
|
74
|
+
|
|
75
|
+
- [#2472](https://github.com/tomtom-internal/maps-sdk-js/pull/2472) [`40f759a`](https://github.com/tomtom-internal/maps-sdk-js/commit/40f759a77fecb015c15dcab06925c334170fda7d) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - Built on the refreshed toolchain (`vite` 8.3.2, `rolldown` 1.2.12, Biome 2.5.15); the runtime and peer dependencies are unchanged
|
|
76
|
+
|
|
77
|
+
- [#2471](https://github.com/tomtom-internal/maps-sdk-js/pull/2471) [`c91f4bb`](https://github.com/tomtom-internal/maps-sdk-js/commit/c91f4bb2f60fb2830dfe7933b748ebcc1f969367) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: every route section icon now wins its space over the map's labels by default, and the speed limit signs give way to all of them
|
|
78
|
+
- map: the tunnel sign and the icons a generated section type asks for (`sections.<type>.icon`) sit above the map's labels, just under the other route icons, instead of under the labels
|
|
79
|
+
- map: under the default `sign.priority`, `belowRouteIcons`, the speed limit signs give way to every route icon, section icons included, and still take precedence over the map's labels
|
|
80
|
+
- map: the speed limit signs draw a tenth smaller, 0.45 to 0.63 from zoom 10 to 16, with their number scaled to match
|
|
81
|
+
|
|
82
|
+
- [#2466](https://github.com/tomtom-internal/maps-sdk-js/pull/2466) [`9959fff`](https://github.com/tomtom-internal/maps-sdk-js/commit/9959fffc945a70012a8f8c6b2cbd69ce46cbf274) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: `sectionSupportsKnob(type, knob)` narrows `type` to `SectionTypeWithKnob<KNOB>`, the section types that take that knob, so a `` `sections.${type}.sign.minZoom` `` id built from it type-checks as a `RoutingKnobId`
|
|
83
|
+
|
|
84
|
+
- [#2461](https://github.com/tomtom-internal/maps-sdk-js/pull/2461) [`cc853be`](https://github.com/tomtom-internal/maps-sdk-js/commit/cc853bec8b80ea9a49ea729e05b0897e14ff4e0a) Thanks [@DanielForniessoria-TomTom](https://github.com/DanielForniessoria-TomTom)! - map: two `get()` calls at once on a style-owned module whose part the style lacks, such as `TrafficIncidentsModule`, add that part to the style once
|
|
85
|
+
- Each call found the part missing while the first one's style was still loading, so the second asked for the part twice, which the style service rejects
|
|
86
|
+
|
|
3
87
|
## 0.62.3
|
|
4
88
|
|
|
5
89
|
### Patch Changes
|
package/core/dist/core.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{distance,nearestPointOnLine}from"@turf/turf";import{clamp,isNil,sortedIndex}from"lodash-es";var DEFAULT_COMMON_BASE_URL="https://api.tomtom.com",defaultConfig={commonBaseURL:"https://api.tomtom.com",apiKey:"",retry:{initialWaitMs:.447,backoffFactor:1.618,timeoutMs:4e4}},TomTomConfig=class A{static{this.instance=new A}constructor(){this.config={...defaultConfig}}put(A){this.config={...this.config,...A}}reset(){this.config={...defaultConfig}}get(){return this.config}},mergeFromGlobal=(A={})=>({...TomTomConfig.instance.get(),...A}),isProxyCredentialsMode=(A=TomTomConfig.instance.get())=>!A.apiKey&&"https://api.tomtom.com"!==(A.commonBaseURL??"https://api.tomtom.com"),geopoliticalViews=["Unified","AE","AR","BN","CL","CN","DZ","IL","IN","KR","MA","MY","PH","PK","RS","RU","TR","TW","US","VN"],chargingStationAccessTypes=["Public","Authorized","Restricted","Private","Unknown"],chargingPointStatus=["Available","Reserved","Occupied","OutOfService","Unknown"],chargingPointCapabilities=["ChargingProfileCapable","ChargingPreferencesCapable","ChipCardSupport","ContactlessCardSupport","CreditCardPayable","DebitCardPayable","PedTerminal","RemoteStartStopCapable","Reservable","RfidReader","StartSessionConnectorRequired","TokenGroupCapable","UnlockCapable","PlugAndCharge","Unknown"],chargingPointRestrictions=["EvOnly","Plugged","Disabled","Customers","Motorcycles"],connectorTypes=["StandardHouseholdCountrySpecific","IEC62196Type1","IEC62196Type1CCS","IEC62196Type2CableAttached","IEC62196Type2Outlet","IEC62196Type2CCS","IEC62196Type3","Chademo","GBT20234Part2","GBT20234Part3","IEC60309AC3PhaseRed","IEC60309AC1PhaseBlue","IEC60309DCWhite","Tesla"],currentTypes=["AC1","AC3","DC"],geographyTypes=["Country","CountrySubdivision","CountrySecondarySubdivision","CountryTertiarySubdivision","Municipality","MunicipalitySubdivision","MunicipalitySecondarySubdivision","Neighbourhood","PostalCodeArea"],placeTypes=["POI","Street","Geography","Point Address","Address Range","Cross Street"],poiCategories=["ABORIGINAL_LAND","ADVENTURE_SPORTS_FACILITY","ADVENTURE_VEHICLE_TRAIL","ADVERTISING_COMPANY","AFGHAN_RESTAURANT","AFRICAN_RESTAURANT","AGRICULTURAL_SUPPLIES","AGRICULTURAL_TECHNOLOGY","AGRICULTURE","AIRFIELD","AIRLINE_ACCESS","AIRLINE_COMPANY","AIRPORT","AMBULANCE_UNIT","AMERICAN_RESTAURANT","AMPHITHEATER","AMUSEMENT_PARK","AMUSEMENT_PLACE","ANIMAL_SERVICE","ANIMAL_SHELTER","ANTIQUE_ART_SHOP","APARTMENT_RENTAL","AQUATIC_ZOO","ARABIAN_RESTAURANT","ARBORETA_AND_BOTANICAL_GARDENS","ARCH","ARMENIAN_RESTAURANT","ART_SCHOOL","ASIAN_RESTAURANT","ATHLETICS_TRACK","ATM","ATV_DEALER","AUSTRALIAN_RESTAURANT","AUSTRIAN_RESTAURANT","AUTOMOBILE_COMPANY","AUTOMOBILE_MANUFACTURING","BAGS_LEATHERWEAR","BAKERY","BANDB_OR_GUEST_HOUSE","BANK","BANQUET_ROOMS","BAR","BARBECUE_RESTAURANT","BASEBALL_PARK","BASKETBALL_ARENA","BASQUE_RESTAURANT","BATTLEFIELD","BAY","BEACH","BEACH_CLUB","BEAUTY_SALON","BEAUTY_SUPPLIES","BELGIAN_RESTAURANT","BETTING_STATION","BISTRO","BLOOD_BANK","BOATING_EQUIPMENT_AND_ACCESSORIES","BOAT_DEALER","BOAT_LAUNCHING_RAMP","BODYSHOP","BOLIVIAN_RESTAURANT","BOOK_SHOP","BORDER_CONTROL","BOWLING_CENTER","BRAZILIAN_RESTAURANT","BRIDGE","BRITISH_RESTAURANT","BUFFET_RESTAURANT","BUILDING","BULGARIAN_RESTAURANT","BUNGALOW_RENTAL","BURMESE_RESTAURANT","BUSINESS_PARK","BUSINESS_SERVICES","BUS_CHARTER_COMPANY","BUS_DEALER","BUS_LINES","BUS_STOP","BUTCHER","CABARET_THEATER","CABINS_LODGES","CABLE_AND_TELEPHONE_COMPANY","CAFE","CAFETERIA","CAFE_PUB","CALIFORNIAN_RESTAURANT","CAMBODIAN_RESTAURANT","CAMERAS_AND_PHOTOGRAPHY","CAMPING_GROUND","CANADIAN_RESTAURANT","CANNABIS_SHOP","CAPE","CARAVAN_SITE","CARIBBEAN_RESTAURANT","CARPET_FLOOR_COVERINGS","CAR_DEALER","CAR_GLASS_REPLACEMENT_SHOP","CAR_RENTAL","CAR_REPAIR_AND_SERVICE","CAR_WASH","CASINO_AND_GAMBLING","CATERING_SERVICES","CAVE","CEMETERY","CHALET_RENTAL","CHARGING_LOCATION","CHEMICAL_COMPANY","CHICKEN_RESTAURANT","CHILDCARE","CHILDREN_S_CLOTHES","CHILEAN_RESTAURANT","CHINESE_RESTAURANT","CHRISTMAS_OR_HOLIDAY_SHOP","CHURCH","CINEMA","CLEANING_SERVICES","CLOTHING_SHOP","CLUB_AND_ASSOCIATION","COCKTAIL_BAR","COFFEE_SHOP","COLLEGE_OR_UNIVERSITY","COLOMBIAN_RESTAURANT","COMEDY_CLUB","COMMERCIAL_BUILDING","COMMUNITY_CENTER","COMPANY","COMPUTER_AND_COMPUTER_SUPPLIES","COMPUTER_AND_DATA_SERVICES","CONCERT_HALL","CONSTRUCTION_COMPANY","CONSTRUCTION_MATERIAL_AND_EQUIPMENT","CONSUMER_ELECTRONICS","CONVENIENCE_STORE","CORSICAN_RESTAURANT","COTTAGE_RENTAL","COURIER_DROP_BOX","COURTHOUSE","COVE","CREOLE_RESTAURANT","CREPERIE","CRICKET_GROUND","CUBAN_RESTAURANT","CULTURAL_CENTER","CURTAINS_TEXTILES","CZECH_RESTAURANT","C_DS_DVD_VIDEOS","DAM","DANCE_STUDIO_AND_SCHOOL","DANISH_RESTAURANT","DELICATESSEN","DELIVERY_SERVICE","DENTIST","DEPARTMENT_STORE","DINNER_THEATER","DISCO_CLUB","DIVERSIFIED_FINANCIALS","DOCTOR","DONGBEI_RESTAURANT","DOUGHNUT_RESTAURANT","DO_IT_YOURSELF_CENTERS","DRIVE_IN_MOVIES","DRIVE_THROUGH_BOTTLE_SHOP","DRIVING_SCHOOL","DRUG_STORE","DRY_CLEANER","DUNE","DUTCH_RESTAURANT","EGYPTIAN_RESTAURANT","ELECTRICAL_APPLIANCES_SHOP","ELECTRONICS_COMPANY","EMBASSY","EMERGENCY_MEDICAL_SERVICE","EMERGENCY_ROOM","ENGLISH_RESTAURANT","ENTERTAINMENT","EQUIPMENT_RENTAL","ETHIOPIAN_RESTAURANT","EXCHANGE","EXHIBITION_CONVENTION_CENTER","FACTORY_OUTLET","FAIRGROUND","FARM","FARMERS_MARKET","FAST_FOOD","FERRY_TERMINAL","FINNISH_RESTAURANT","FIRE_STATION","FISHING_AND_HUNTING_AREA","FISHMONGER","FITNESS_CLUB_AND_CENTER","FLATS_OR_APARTMENT_COMPLEX","FLORISTS","FLYING_CLUB","FONDUE_RESTAURANT","FOOD_AND_DRINKS_SHOP","FOOD_MARKET","FOOTBALL_STADIUM","FOOTWEAR_SHOE_REPAIRS","FOREIGN_EXCHANGE","FOREST_AREA","FRENCH_RESTAURANT","FUEL_STATION","FUNERAL_SERVICE_AND_MORTUARIES","FURNITURE_HOME_FURNISHINGS","FUSION_RESTAURANT","GARDEN_CENTERS_SERVICES","GENERAL_HOSPITAL_AND_POLYCLINIC","GENERAL_PRACTITIONER","GERMAN_RESTAURANT","GIFTS_CARDS_NOVELTIES_SOUVENIRS","GLASSWARE_CERAMIC_SHOP","GLASS_WINDOWS_STORE","GOLD_EXCHANGE","GOLF_COURSE","GOVERNMENT_OFFICE","GREEK_RESTAURANT","GREENGROCER","GRILL_RESTAURANT","GROCERY_STORE","GURUDWARA","HAIRDRESSER","HAMBURGER_RESTAURANT","HARBOR","HARDWARE_STORE","HAWAIIAN_RESTAURANT","HEALTHCARE_SERVICE","HELIPORT_OR_HELIPAD","HIGH_SCHOOL","HIKING_TRAIL","HILL","HISTORICAL_PARK","HISTORIC_SITE","HOBBY_SHOP","HOCKEY_CLUB","HOLIDAY_RENTAL","HOME_APPLIANCE_REPAIR","HORSE_RACING_TRACK","HORSE_RIDING","HORSE_RIDING_TRAIL","HORTICULTURE","HOSPITAL","HOSPITAL_FOR_WOMEN_AND_CHILDREN","HOSPITAL_OF_CHINESE_MEDICINE","HOSTEL","HOTEL","HOTEL_OR_MOTEL","HOT_POT_RESTAURANT","HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS","HUNAN_RESTAURANT","HUNGARIAN_RESTAURANT","ICE_CREAM_PARLOR","ICE_HOCKEY_ARENA","ICE_RINK","IMPORT_OR_EXPORT_AND_DISTRIBUTION","INDIAN_RESTAURANT","INDONESIAN_RESTAURANT","INDUSTRIAL_BUILDING","INFORMAL_MARKET","INSURANCE_COMPANY","INTERNATIONAL_RAILROAD_STATION","INTERNATIONAL_RESTAURANT","INTERNET_CAFE","INVESTMENT_ADVISOR","IRANIAN_RESTAURANT","IRISH_RESTAURANT","ISLAND","ISRAELI_RESTAURANT","ITALIAN_RESTAURANT","JAMAICAN_RESTAURANT","JAPANESE_RESTAURANT","JAZZ_CLUB","JEWELRY_CLOCKS_WATCHES","JEWISH_RESTAURANT","JUICE_BAR","JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE","KARAOKE_CLUB","KITCHENS_BATHROOMS","KOREAN_RESTAURANT","KOSHER_RESTAURANT","LANGUAGE_SCHOOL","LATIN_AMERICAN_RESTAURANT","LAUNDRY","LEBANESE_RESTAURANT","LEGAL_SERVICES","LEISURE_CENTER","LIGHTING_SHOPS","LOCALE","LOCAL_SPECIALITIES_SHOP","LOTTERY_SHOP","MALL","MANUFACTURING_COMPANY","MANUFACTURING_FACILITY","MARINA","MARKETPLACE","MARSH","MAUSOLEUM_OR_GRAVE","MECHANICAL_ENGINEERING","MEDIA_FACILITY","MEDICAL_SUPPLIES_EQUIPMENT","MEDICINAL_AND_RECREATIONAL_DISPENSARY","MEDICINAL_MARIJUANA_DISPENSARY","MEDITERRANEAN_RESTAURANT","MEMORIAL","MEN_S_CLOTHING","MEXICAN_RESTAURANT","MICROBREWERY","MIDDLE_EASTERN_RESTAURANT","MIDDLE_SCHOOL","MILITARY_AIRPORT","MINERAL_OR_HOT_SPRINGS","MINING_COMPANY","MOBILE_PHONE_SHOP","MONGOLIAN_RESTAURANT","MONUMENT","MOROCCAN_RESTAURANT","MOSQUE","MOTEL","MOTORCYCLE_DEALER","MOTORCYCLE_REPAIR","MOTORING_ORGANIZATION_OFFICE","MOTOR_RACING_STADIUM","MOUNTAIN_BIKE_TRAIL","MOUNTAIN_PASS","MOUNTAIN_PEAK","MOVIE_THEATER","MOVING_AND_STORAGE_COMPANY","MULTI_PURPOSE_STADIUM","MUSEUM","MUSIC_CENTER","MUSIC_INSTRUMENTS_STORE","NAIL_SALON","NATIONAL_RAILROAD_STATION","NATURAL_FEATURE","NATURAL_TOURIST_ATTRACTION","NEPALESE_RESTAURANT","NETBALL_STADIUM","NEWSAGENTS_TOBACCONISTS","NIGHTLIFE","NON_GOVERNMENTAL_ORGANIZATION","NORWEGIAN_RESTAURANT","OASIS","OBSERVATORY","OFFICE_EQUIPMENT","OIL_AND_NATURAL_GAS","OPEN_CAR_PARKING_AREA","OPERA_HOUSE","OPTICIAN","ORGANIC_FOOD_RESTAURANT","ORIENTAL_RESTAURANT","PAGODA","PAINTING_DECORATING","PAKISTANI_RESTAURANT","PAN","PARK","PARKING_GARAGE","PARKWAY","PARK_AND_RECREATION_AREA","PASSENGER_TRANSPORT_TICKET_OFFICE","PAWN_SHOP","PEDESTRIAN_SUBWAY","PERSONAL_CARE_FACILITY","PERSONAL_SERVICE","PERUVIAN_RESTAURANT","PET_SUPPLIES","PHARMACEUTICAL_COMPANY","PHARMACY","PHILIPPINE_RESTAURANT","PHOTOCOPY_SHOP","PHOTO_LAB_OR_DEVELOPMENT","PICNIC_AREA","PIZZERIA","PLAIN_OR_FLAT","PLANETARIUM","PLATEAU","POLICE_STATION","POLISH_RESTAURANT","PORTUGUESE_RESTAURANT","PORT_WAREHOUSE_FACILITY","POST_OFFICE","PRE_SCHOOL","PRIMARY_PRODUCER","PRIMARY_RESOURCE_UTILITY","PRIMARY_SCHOOL","PRISON","PRIVATE_AIRPORT","PROTECTED_LAND","PUB","PUBLIC_AIRPORT","PUBLIC_AMENITY","PUBLIC_BATHROOM","PUBLIC_CALL_BOX","PUBLIC_LIBRARY","PUBLIC_MARKET","PUBLIC_TRANSPORT_STOP","PUBLISHING_TECHNOLOGIES","QUARRY","RACE_TRACK","RAILWAY_STATION","RAPIDS","REAL_ESTATE_AGENT","REAL_ESTATE_COMPANY","RECREATIONAL_CAMPING_GROUND","RECREATIONAL_MARIJUANA_DISPENSARY","RECREATIONAL_VEHICLE_DEALER","RECREATION_AREA","RECYCLING_SHOP","REEF","RELIGIOUS_SITE","RENTAL_CAR_PARKING","RESCUE_SERVICE","RESEARCH_FACILITY","RESERVOIR","RESIDENTIAL_ACCOMMODATION","RESIDENTIAL_ENTRANCE","RESORT","RESTAURANT","RESTAURANT_AREA","REST_AREA","REST_CAMP","RETAIL_OUTLET","RETIREMENT_COMMUNITY","RIDGE","RIVER_CROSSING","ROCKS","ROCK_CLIMBING_TRAIL","RUGBY_GROUND","RUSSIAN_RESTAURANT","SALAD_BAR","SANDWICH_RESTAURANT","SAUNA_SOLARIUM_MASSAGE","SCANDINAVIAN_RESTAURANT","SCHOOL","SCHOOL_BUS_COMPANY","SEAFOOD","SECURED_ENTRANCE","SECURITY_PRODUCTS","SENIOR_HIGH_SCHOOL","SERVICE_COMPANY","SHANDONG_RESTAURANT","SHOPPING_SERVICE","SHOP_OR_STORE","SICHUAN_RESTAURANT","SKI_RESORT","SNACKS_RESTAURANT","SOCCER_STADIUM","SOFTWARE_COMPANY","SOUL_FOOD","SOUP_RESTAURANT","SPANISH_RESTAURANT","SPECIALIST","SPECIALTY_CLOTHING_SHOP","SPECIALTY_FOODS","SPECIAL_HOSPITAL","SPORTS_CENTER","SPORTS_EQUIPMENT_AND_CLOTHING","SQUASH_COURT","STADIUM","STATION_ACCESS","STATUE","STEAK_HOUSE","STOCK_EXCHANGE","STREETCAR_STOP","SUBWAY_ENTRANCE","SUBWAY_STATION","SUPERMARKET","SUSHI_RESTAURANT","SWEDISH_RESTAURANT","SWIMMING_POOL","SWISS_RESTAURANT","SYNAGOG","SYRIAN_RESTAURANT","TAILOR_SHOP","TAIWANESE_RESTAURANT","TAKEOUT_FOOD","TAPAS_RESTAURANT","TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE","TAXI_STAND","TAX_SERVICES","TEA_HOUSE","TELECOMMUNICATIONS","TEMPLE","TENNIS_COURT","TEPPANYAKI_RESTAURANT","THAI_RESTAURANT","THEATER","THEMATIC_SPORT_CENTER","TIBETAN_RESTAURANT","TIRE_SERVICE","TOLL_GATE","TOURIST_ATTRACTION","TOURIST_INFORMATION","TOWER","TOYS_GAMES_SHOP","TRAFFIC_CONTROL_DEPARTMENT","TRAIL_SYSTEM","TRANSPORT_ACCESS","TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION","TRANSPORT_COMPANY","TRAVEL_AGENT","TRUCK_DEALER","TRUCK_REPAIR_AND_SERVICE","TRUCK_STOP","TUNISIAN_RESTAURANT","TUNNEL","TURKISH_RESTAURANT","URBAN_STATION","VALLEY","VAN_DEALER","VARIETY_STORE","VEGETARIAN_RESTAURANT","VEHICLE_DEALER","VEHICLE_REPAIR","VENEZUELAN_RESTAURANT","VETERINARY","VIDEO_RENTAL_SHOP","VIETNAMESE_RESTAURANT","VIEWPOINT","VILLA_RENTAL","VOCATIONAL_SCHOOL","WATER_HOLE","WATER_SPORT","WEDDING_SERVICES","WEIGH_STATION","WELFARE_ORGANIZATION","WELL","WESTERN_RESTAURANT","WHOLESALE_CLUB","WILDERNESS_AREA","WILDLIFE_PARK","WINERY","WINE_SPIRITS","WOMEN_S_CLOTHING","YACHT_BASIN","ZOO","ZOOS_ARBORETA_BOTANICAL_GARDEN"],budgetTypes=["timeMinutes","remainingChargePCT","spentChargePCT","spentFuelLiters","distanceKM"],budgetUnits={timeMinutes:"min",distanceKM:"km",remainingChargePCT:"% remaining",spentChargePCT:"% spent",spentFuelLiters:"L"},plugTypes=["Small_Paddle_Inductive","Large_Paddle_Inductive","IEC_60309_1_Phase","IEC_60309_3_Phase","IEC_62196_Type_1_Outlet","IEC_62196_Type_2_Outlet","IEC_62196_Type_3_Outlet","IEC_62196_Type_1_Connector_Cable_Attached","IEC_62196_Type_2_Connector_Cable_Attached","IEC_62196_Type_3_Connector_Cable_Attached","Combo_to_IEC_62196_Type_1_Base","Combo_to_IEC_62196_Type_2_Base","Type_E_French_Standard_CEE_7_5","Type_F_Schuko_CEE_7_4","Type_G_British_Standard_BS_1363","Type_J_Swiss_Standard_SEV_1011","China_GB_Part_2","China_GB_Part_3","IEC_309_DC_Plug","AVCON_Connector","Tesla_Connector","NEMA_5_20","CHAdeMO","SAE_J1772","TEPCO","Better_Place_Socket","Marechal_Socket","Standard_Household_Country_Specific"],paymentMethods=["No_Payment","Subscription","Direct"],avoidableTypes=["tollRoads","motorways","ferries","unpavedRoads","carpools","alreadyUsedRoads","borderCrossings","tunnels","carTrains","lowEmissionZones"],inputSectionTypes=["carpool","carTrain","country","ferry","importantRoadStretch","lowEmissionZone","motorway","pedestrian","roadShields","speedLimit","toll","tollRoad","tollVignette","traffic","tunnel","unpaved","urban","vehicleRestricted"],inputSectionTypesWithGuidance=[...inputSectionTypes,"lanes"],sectionTypes=[...inputSectionTypesWithGuidance,"leg"],areaAnalyticsMetricKeys=["speed","freeFlowSpeed","congestionLevel","travelTime","networkLength"],trafficIncidentRequestCategories=["accident","broken-down-vehicle","danger","flooding","fog","frost","jam","lane-closed","other","rain","road-closed","roadworks","wind"],fullTrafficIncidentCategories=[...trafficIncidentRequestCategories,"animals-on-road","narrow-lanes"],isBBoxWithArea=A=>!!A&&(A.length>=4&&A[3]!==A[1]&&A[2]!==A[0]),bboxOnlyIfWithArea=A=>isBBoxWithArea(A)?A:void 0,bboxExpandedWithPosition=(A,E)=>{if(A&&!(A.length<2))return E?[E[0]>A[0]?A[0]:E[0],E[1]>A[1]?A[1]:E[1],E[2]<A[0]?A[0]:E[2],E[3]<A[1]?A[1]:E[3]]:[A[0],A[1],A[0],A[1]]},bboxExpandedWithBBox=(A,E)=>E&&A?[E[0]>A[0]?A[0]:E[0],E[1]>A[1]?A[1]:E[1],E[2]<A[2]?A[2]:E[2],E[3]<A[3]?A[3]:E[3]]:A||E,bboxFromBBoxes=A=>A?.length?A.reduce((A,E)=>bboxExpandedWithBBox(E,A)):void 0,bboxFromCoordsArray=A=>{const E=A?.length;if(!E)return;let R;const T=Math.ceil(E/1e3);for(let _=0;_<E;_+=T)R=bboxExpandedWithPosition(A[_],R);return 1===T?R:bboxExpandedWithPosition(A[E-1],R)},bboxFromGeoJSON=A=>{if(A){if(Array.isArray(A))return"number"==typeof A[0]?A.length>=4?A:void 0:bboxFromBBoxes(A.map(A=>bboxFromGeoJSON(A)));if(A.bbox)return A.bbox;switch(A.type){case"Feature":return bboxFromGeoJSON(A.geometry);case"FeatureCollection":return bboxFromBBoxes(A.features.map(bboxFromGeoJSON));case"GeometryCollection":return bboxFromBBoxes(A.geometries.map(bboxFromGeoJSON));case"Point":return bboxExpandedWithPosition(A.coordinates);case"LineString":case"MultiPoint":return bboxFromCoordsArray(A.coordinates);case"MultiLineString":case"Polygon":return bboxFromBBoxes(A.coordinates.map(bboxFromCoordsArray));case"MultiPolygon":return bboxFromBBoxes(A.coordinates.flatMap(A=>A.map(bboxFromCoordsArray)));default:return}}},bboxExpandedWithGeoJSON=(A,E)=>bboxExpandedWithBBox(bboxFromGeoJSON(A),E),bboxCenter=A=>[(A[0]+A[2])/2,(A[1]+A[3])/2],polygonFromBBox=A=>{const[E,R,T,_]=A;return{type:"Feature",geometry:{type:"Polygon",coordinates:[[[E,R],[T,R],[T,_],[E,_],[E,R]]]},properties:{}}},generateId=()=>Date.now().toString(36)+Math.random().toString(36).substring(2),TOMTOM_USER_AGENT_SDK_NAME="MapsSDKJS",generateTomTomHeaders=A=>({"tomtom-user-agent":A["tomtom-user-agent"]??"MapsSDKJS/0.62.3"}),getPosition=(A,E)=>{if(A){if(Array.isArray(A))return A;if(A.coordinates)return A.coordinates;if(A.geometry)return"main-when-available"===E?.useEntryPoint?(R=A,R?.properties?.entryPoints?.find(A=>"main"===A.type))?.position??A.geometry.coordinates:A.geometry.coordinates}var R;return null},getPositionStrict=(A,E)=>{const R=getPosition(A,E);if(!R)throw new Error(`The received object does not have lng-lat coordinates: ${JSON.stringify(A)}`);return R},toPointGeometry=A=>({type:"Point",coordinates:A}),toPointFeature=A=>({type:"Feature",geometry:toPointGeometry(A),properties:{}}),poiCategoriesToIDs={TRAFFIC_CONTROL_DEPARTMENT:[7301,7301002],TRAIL_SYSTEM:[7302],MOUNTAIN_BIKE_TRAIL:[7302002],ADVENTURE_VEHICLE_TRAIL:[7302003],HIKING_TRAIL:[7302004],HORSE_RIDING_TRAIL:[7302005],ROCK_CLIMBING_TRAIL:[7302006],RESIDENTIAL_ACCOMMODATION:[7303],RETIREMENT_COMMUNITY:[7303002],FLATS_OR_APARTMENT_COMPLEX:[7303003],HOLIDAY_RENTAL:[7304],COTTAGE_RENTAL:[7304002],VILLA_RENTAL:[7304003],BUNGALOW_RENTAL:[7304004],CHALET_RENTAL:[7304005],APARTMENT_RENTAL:[7304006],ADVENTURE_SPORTS_FACILITY:[7305],HELIPORT_OR_HELIPAD:[7308],CHARGING_LOCATION:[7309],VEHICLE_REPAIR:[7310],BODYSHOP:[7310002],CAR_GLASS_REPLACEMENT_SHOP:[7310003],CAR_REPAIR_AND_SERVICE:[7310004],TIRE_SERVICE:[7310007],MOTORCYCLE_REPAIR:[7310008],TRUCK_REPAIR_AND_SERVICE:[7310009],FUEL_STATION:[7311],CAR_RENTAL:[7312],PARKING_GARAGE:[7313],HOTEL_OR_MOTEL:[7314],BANDB_OR_GUEST_HOUSE:[7314002],HOTEL:[7314003],HOSTEL:[7314004],RESORT:[7314005],MOTEL:[7314006],CABINS_LODGES:[7314007],REST_CAMP:[7314008],RESTAURANT:[7315],AFRICAN_RESTAURANT:[7315002],AMERICAN_RESTAURANT:[7315003],AUSTRIAN_RESTAURANT:[7315004],BARBECUE_RESTAURANT:[7315005],BELGIAN_RESTAURANT:[7315006],BISTRO:[7315007],BRITISH_RESTAURANT:[7315008],CALIFORNIAN_RESTAURANT:[7315009],CANADIAN_RESTAURANT:[7315010],CARIBBEAN_RESTAURANT:[7315011],CHINESE_RESTAURANT:[7315012],CREPERIE:[7315013],DUTCH_RESTAURANT:[7315014],FAST_FOOD:[7315015],PHILIPPINE_RESTAURANT:[7315016],FRENCH_RESTAURANT:[7315017],GERMAN_RESTAURANT:[7315018],GREEK_RESTAURANT:[7315019],GRILL_RESTAURANT:[7315020],HAWAIIAN_RESTAURANT:[7315021],HUNGARIAN_RESTAURANT:[7315022],INDIAN_RESTAURANT:[7315023],INDONESIAN_RESTAURANT:[7315024],ITALIAN_RESTAURANT:[7315025],JAPANESE_RESTAURANT:[7315026],JEWISH_RESTAURANT:[7315027],KOREAN_RESTAURANT:[7315028],LATIN_AMERICAN_RESTAURANT:[7315029],LEBANESE_RESTAURANT:[7315030],MEDITERRANEAN_RESTAURANT:[7315032],MEXICAN_RESTAURANT:[7315033],MIDDLE_EASTERN_RESTAURANT:[7315034],ORIENTAL_RESTAURANT:[7315035],PIZZERIA:[7315036],POLISH_RESTAURANT:[7315037],PORTUGUESE_RESTAURANT:[7315038],RUSSIAN_RESTAURANT:[7315040],SANDWICH_RESTAURANT:[7315042],SEAFOOD:[7315043],SPANISH_RESTAURANT:[7315044],STEAK_HOUSE:[7315045],SWISS_RESTAURANT:[7315047],THAI_RESTAURANT:[7315048],TURKISH_RESTAURANT:[7315049],VEGETARIAN_RESTAURANT:[7315050],VIETNAMESE_RESTAURANT:[7315051],HUNAN_RESTAURANT:[7315052],SHANDONG_RESTAURANT:[7315053],SICHUAN_RESTAURANT:[7315056],DONGBEI_RESTAURANT:[7315057],HOT_POT_RESTAURANT:[7315058],TAIWANESE_RESTAURANT:[7315059],WESTERN_RESTAURANT:[7315060],PERUVIAN_RESTAURANT:[7315061],ASIAN_RESTAURANT:[7315062],CREOLE_RESTAURANT:[7315063],SOUL_FOOD:[7315064],IRISH_RESTAURANT:[7315065],JAMAICAN_RESTAURANT:[7315066],KOSHER_RESTAURANT:[7315067],CZECH_RESTAURANT:[7315068],HAMBURGER_RESTAURANT:[7315069],CHICKEN_RESTAURANT:[7315070],FUSION_RESTAURANT:[7315071],BRAZILIAN_RESTAURANT:[7315072],INTERNATIONAL_RESTAURANT:[7315073],MOROCCAN_RESTAURANT:[7315074],ORGANIC_FOOD_RESTAURANT:[7315075],TAPAS_RESTAURANT:[7315076],ICE_CREAM_PARLOR:[7315078],DOUGHNUT_RESTAURANT:[7315079],AFGHAN_RESTAURANT:[7315081],ARABIAN_RESTAURANT:[7315083],ARMENIAN_RESTAURANT:[7315085],AUSTRALIAN_RESTAURANT:[7315086],BASQUE_RESTAURANT:[7315087],BOLIVIAN_RESTAURANT:[7315088],BULGARIAN_RESTAURANT:[7315090],BURMESE_RESTAURANT:[7315091],CAMBODIAN_RESTAURANT:[7315092],CHILEAN_RESTAURANT:[7315093],COLOMBIAN_RESTAURANT:[7315094],CORSICAN_RESTAURANT:[7315095],CUBAN_RESTAURANT:[7315096],DANISH_RESTAURANT:[7315098],EGYPTIAN_RESTAURANT:[7315100],ENGLISH_RESTAURANT:[7315101],ETHIOPIAN_RESTAURANT:[7315102],FINNISH_RESTAURANT:[7315104],IRANIAN_RESTAURANT:[7315105],ISRAELI_RESTAURANT:[7315106],MONGOLIAN_RESTAURANT:[7315110],NEPALESE_RESTAURANT:[7315111],NORWEGIAN_RESTAURANT:[7315112],SCANDINAVIAN_RESTAURANT:[7315114],SWEDISH_RESTAURANT:[7315119],SYRIAN_RESTAURANT:[7315120],TEPPANYAKI_RESTAURANT:[7315121],TIBETAN_RESTAURANT:[7315122],TUNISIAN_RESTAURANT:[7315123],VENEZUELAN_RESTAURANT:[7315125],PAKISTANI_RESTAURANT:[7315127],FONDUE_RESTAURANT:[7315134],SNACKS_RESTAURANT:[7315139],SOUP_RESTAURANT:[7315140],BUFFET_RESTAURANT:[7315142],SALAD_BAR:[7315143],TAKEOUT_FOOD:[7315145],BANQUET_ROOMS:[7315146],CAFETERIA:[7315147],SUSHI_RESTAURANT:[7315148],JUICE_BAR:[7315149],TOURIST_INFORMATION:[7316],MUSEUM:[7317],THEATER:[7318,7318005],CONCERT_HALL:[7318002],MUSIC_CENTER:[7318003],OPERA_HOUSE:[7318004],CABARET_THEATER:[7318006],AMPHITHEATER:[7318007],DINNER_THEATER:[7318008],CULTURAL_CENTER:[7319],SPORTS_CENTER:[7320,7320004],FITNESS_CLUB_AND_CENTER:[7320002],HORSE_RIDING:[7320003],THEMATIC_SPORT_CENTER:[7320005],SQUASH_COURT:[7320006],HOSPITAL:[7321],GENERAL_HOSPITAL_AND_POLYCLINIC:[7321002],SPECIAL_HOSPITAL:[7321003],HOSPITAL_OF_CHINESE_MEDICINE:[7321004],HOSPITAL_FOR_WOMEN_AND_CHILDREN:[7321005],POLICE_STATION:[7322],POST_OFFICE:[7324],PHARMACY:[7326],DEPARTMENT_STORE:[7327],BANK:[7328],MARKETPLACE:[7332],INFORMAL_MARKET:[7332002],PUBLIC_MARKET:[7332003],FARMERS_MARKET:[7332004],SUPERMARKET:[7332005],AGRICULTURE:[7335],HORTICULTURE:[7335002],PRIMARY_PRODUCER:[7335003],FARM:[7335004],VIEWPOINT:[7337],SWIMMING_POOL:[7338],RELIGIOUS_SITE:[7339],CHURCH:[7339002],MOSQUE:[7339003],SYNAGOG:[7339004],TEMPLE:[7339005],GURUDWARA:[7339006],PAGODA:[7339008],CASINO_AND_GAMBLING:[7341],CINEMA:[7342],MOVIE_THEATER:[7342002],DRIVE_IN_MOVIES:[7342003],MARINA:[7347,7347002],YACHT_BASIN:[7347003],WINERY:[7349],FERRY_TERMINAL:[7352],TRUCK_STOP:[7358],WEIGH_STATION:[7359,7359002],CAMPING_GROUND:[7360],RECREATIONAL_CAMPING_GROUND:[7360002],CARAVAN_SITE:[7360003],COMMUNITY_CENTER:[7363],EMBASSY:[7365],BORDER_CONTROL:[7366],GOVERNMENT_OFFICE:[7367],MOTORING_ORGANIZATION_OFFICE:[7368],OPEN_CAR_PARKING_AREA:[7369,7369002],SCHOOL:[7372,7372002],CHILDCARE:[7372003],PRE_SCHOOL:[7372004],PRIMARY_SCHOOL:[7372005],HIGH_SCHOOL:[7372006],SENIOR_HIGH_SCHOOL:[7372007],VOCATIONAL_SCHOOL:[7372008],LANGUAGE_SCHOOL:[7372010],ART_SCHOOL:[7372012],MIDDLE_SCHOOL:[7372014],DRIVING_SCHOOL:[7372016],MALL:[7373],STADIUM:[7374],ATHLETICS_TRACK:[7374002],CRICKET_GROUND:[7374003],SOCCER_STADIUM:[7374004],HORSE_RACING_TRACK:[7374005],MULTI_PURPOSE_STADIUM:[7374006],RUGBY_GROUND:[7374007],ICE_HOCKEY_ARENA:[7374008],BASEBALL_PARK:[7374009],FOOTBALL_STADIUM:[7374010],MOTOR_RACING_STADIUM:[7374011],BASKETBALL_ARENA:[7374012],RACE_TRACK:[7374013],NETBALL_STADIUM:[7374014],TOLL_GATE:[7375],TOURIST_ATTRACTION:[7376],BUILDING:[7376002],MONUMENT:[7376003],NATURAL_TOURIST_ATTRACTION:[7376004],OBSERVATORY:[7376005],PLANETARIUM:[7376006],DAM:[7376007],TUNNEL:[7376008],TOWER:[7376009],BRIDGE:[7376010],MAUSOLEUM_OR_GRAVE:[7376011],ARCH:[7376012],STATUE:[7376013],WATER_HOLE:[7376014],COLLEGE_OR_UNIVERSITY:[7377,7377002],JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE:[7377003],BUSINESS_PARK:[7378],RAILWAY_STATION:[7380],INTERNATIONAL_RAILROAD_STATION:[7380002],NATIONAL_RAILROAD_STATION:[7380003],URBAN_STATION:[7380004],SUBWAY_STATION:[7380005],AIRPORT:[7383],PUBLIC_AIRPORT:[7383002],PRIVATE_AIRPORT:[7383003],MILITARY_AIRPORT:[7383004],AIRFIELD:[7383005],COURIER_DROP_BOX:[7388],TRANSPORT_ACCESS:[7389],AIRLINE_ACCESS:[7389002],STATION_ACCESS:[7389003],SECURED_ENTRANCE:[7389004],SUBWAY_ENTRANCE:[7389999],EMERGENCY_MEDICAL_SERVICE:[7391],FIRE_STATION:[7392],REST_AREA:[7395],ATM:[7397],NATURAL_FEATURE:[8099],MOUNTAIN_PEAK:[8099002],CAVE:[8099003],RIDGE:[8099004],DUNE:[8099005],VALLEY:[8099006],PLAIN_OR_FLAT:[8099007],PLATEAU:[8099008],PAN:[8099009],WELL:[8099010],OASIS:[8099011],ROCKS:[8099012],RESERVOIR:[8099013],REEF:[8099014],RAPIDS:[8099015],BAY:[8099016],COVE:[8099017],HARBOR:[8099018],CAPE:[8099020],MINERAL_OR_HOT_SPRINGS:[8099021],ISLAND:[8099022],MARSH:[8099023],RIVER_CROSSING:[8099024],HILL:[8099025],QUARRY:[8099026],LOCALE:[8099027],PRIMARY_RESOURCE_UTILITY:[9150],TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION:[9151],NON_GOVERNMENTAL_ORGANIZATION:[9152],WELFARE_ORGANIZATION:[9153],PRISON:[9154],CAR_WASH:[9155,9155002],MANUFACTURING_FACILITY:[9156],RESEARCH_FACILITY:[9157],MEDIA_FACILITY:[9158],PORT_WAREHOUSE_FACILITY:[9159],EXCHANGE:[9160],STOCK_EXCHANGE:[9160002],GOLD_EXCHANGE:[9160003],FOREIGN_EXCHANGE:[9160004],COMPANY:[9352],SERVICE_COMPANY:[9352002],ADVERTISING_COMPANY:[9352003],COMPUTER_AND_DATA_SERVICES:[9352004],SOFTWARE_COMPANY:[9352005],DIVERSIFIED_FINANCIALS:[9352006],INSURANCE_COMPANY:[9352007],DELIVERY_SERVICE:[9352008],REAL_ESTATE_COMPANY:[9352009],MANUFACTURING_COMPANY:[9352011],AGRICULTURAL_TECHNOLOGY:[9352012],AUTOMOBILE_COMPANY:[9352013],CHEMICAL_COMPANY:[9352014],ELECTRONICS_COMPANY:[9352015],MECHANICAL_ENGINEERING:[9352016],PHARMACEUTICAL_COMPANY:[9352018],PUBLISHING_TECHNOLOGIES:[9352019],TELECOMMUNICATIONS:[9352020],TAX_SERVICES:[9352022],LEGAL_SERVICES:[9352023],TRANSPORT_COMPANY:[9352024],BUS_CHARTER_COMPANY:[9352025],TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE:[9352026],BUS_LINES:[9352027],SCHOOL_BUS_COMPANY:[9352028],CLEANING_SERVICES:[9352029],OIL_AND_NATURAL_GAS:[9352030],MINING_COMPANY:[9352031],CONSTRUCTION_COMPANY:[9352032],MOVING_AND_STORAGE_COMPANY:[9352033],AIRLINE_COMPANY:[9352034],FUNERAL_SERVICE_AND_MORTUARIES:[9352036],INVESTMENT_ADVISOR:[9352037],EQUIPMENT_RENTAL:[9352038],BUSINESS_SERVICES:[9352039],CABLE_AND_TELEPHONE_COMPANY:[9352040],AUTOMOBILE_MANUFACTURING:[9352041],IMPORT_OR_EXPORT_AND_DISTRIBUTION:[9352042],CATERING_SERVICES:[9352043],HOME_APPLIANCE_REPAIR:[9352044],ANIMAL_SHELTER:[9352045],WEDDING_SERVICES:[9352046],BEACH:[9357],RESTAURANT_AREA:[9359],ICE_RINK:[9360],SHOP_OR_STORE:[9361],BOOK_SHOP:[9361002],C_DS_DVD_VIDEOS:[9361003],CHILDREN_S_CLOTHES:[9361004],FOOTWEAR_SHOE_REPAIRS:[9361005],CLOTHING_SHOP:[9361006],MEN_S_CLOTHING:[9361007],WOMEN_S_CLOTHING:[9361008],CONVENIENCE_STORE:[9361009],DRY_CLEANER:[9361010],CAMERAS_AND_PHOTOGRAPHY:[9361011],COMPUTER_AND_COMPUTER_SUPPLIES:[9361012],CONSUMER_ELECTRONICS:[9361013],OFFICE_EQUIPMENT:[9361014],REAL_ESTATE_AGENT:[9361015],FACTORY_OUTLET:[9361016],FLORISTS:[9361017],BAKERY:[9361018],BUTCHER:[9361019],FISHMONGER:[9361020],FOOD_MARKET:[9361021],GREENGROCER:[9361022],GROCERY_STORE:[9361023],FOOD_AND_DRINKS_SHOP:[9361024],WINE_SPIRITS:[9361025],GIFTS_CARDS_NOVELTIES_SOUVENIRS:[9361026],HAIRDRESSER:[9361027],CARPET_FLOOR_COVERINGS:[9361028],CURTAINS_TEXTILES:[9361029],DO_IT_YOURSELF_CENTERS:[9361030],HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS:[9361031],GARDEN_CENTERS_SERVICES:[9361032],KITCHENS_BATHROOMS:[9361033],LIGHTING_SHOPS:[9361034],PAINTING_DECORATING:[9361035],JEWELRY_CLOCKS_WATCHES:[9361036],NEWSAGENTS_TOBACCONISTS:[9361037],OPTICIAN:[9361038],SPORTS_EQUIPMENT_AND_CLOTHING:[9361039],TOYS_GAMES_SHOP:[9361040],TRAVEL_AGENT:[9361041],CONSTRUCTION_MATERIAL_AND_EQUIPMENT:[9361042],MEDICAL_SUPPLIES_EQUIPMENT:[9361043],VIDEO_RENTAL_SHOP:[9361044],LAUNDRY:[9361045],PHOTO_LAB_OR_DEVELOPMENT:[9361046],PHOTOCOPY_SHOP:[9361047],ANIMAL_SERVICE:[9361048],ANTIQUE_ART_SHOP:[9361049],BEAUTY_SUPPLIES:[9361050],DRUG_STORE:[9361051],ELECTRICAL_APPLIANCES_SHOP:[9361052],HOBBY_SHOP:[9361053],FURNITURE_HOME_FURNISHINGS:[9361054],GLASSWARE_CERAMIC_SHOP:[9361055],LOCAL_SPECIALITIES_SHOP:[9361056],RECYCLING_SHOP:[9361057],BAGS_LEATHERWEAR:[9361058],MUSIC_INSTRUMENTS_STORE:[9361059],DELICATESSEN:[9361060],SPECIALTY_FOODS:[9361061],SHOPPING_SERVICE:[9361062],RETAIL_OUTLET:[9361063],PET_SUPPLIES:[9361064],WHOLESALE_CLUB:[9361066],BEAUTY_SALON:[9361067],NAIL_SALON:[9361068],HARDWARE_STORE:[9361069],PAWN_SHOP:[9361070],LOTTERY_SHOP:[9361071],BETTING_STATION:[9361072],AGRICULTURAL_SUPPLIES:[9361073],MOBILE_PHONE_SHOP:[9361075],DRIVE_THROUGH_BOTTLE_SHOP:[9361076],TAILOR_SHOP:[9361077],SECURITY_PRODUCTS:[9361078],SPECIALTY_CLOTHING_SHOP:[9361079],GLASS_WINDOWS_STORE:[9361080],VARIETY_STORE:[9361081],CHRISTMAS_OR_HOLIDAY_SHOP:[9361082],BOATING_EQUIPMENT_AND_ACCESSORIES:[9361083],PARK_AND_RECREATION_AREA:[9362],BATTLEFIELD:[9362002],CEMETERY:[9362003],HISTORIC_SITE:[9362004],HISTORICAL_PARK:[9362005],MEMORIAL:[9362007],PARK:[9362008],PARKWAY:[9362009],RECREATION_AREA:[9362011],WILDERNESS_AREA:[9362014],FOREST_AREA:[9362015],FISHING_AND_HUNTING_AREA:[9362016],FAIRGROUND:[9362017],SKI_RESORT:[9362026],BOAT_LAUNCHING_RAMP:[9362032],PICNIC_AREA:[9362033],PROTECTED_LAND:[9362037],COURTHOUSE:[9363],CANNABIS_SHOP:[9364],MEDICINAL_MARIJUANA_DISPENSARY:[9364002],RECREATIONAL_MARIJUANA_DISPENSARY:[9364003],MEDICINAL_AND_RECREATIONAL_DISPENSARY:[9364004],TENNIS_COURT:[9369],WATER_SPORT:[9371],DOCTOR:[9373],GENERAL_PRACTITIONER:[9373002],SPECIALIST:[9373003],DENTIST:[9374],VETERINARY:[9375],CAFE_PUB:[9376],CAFE:[9376002],PUB:[9376003],INTERNET_CAFE:[9376004],TEA_HOUSE:[9376005],COFFEE_SHOP:[9376006],MICROBREWERY:[9376007],EXHIBITION_CONVENTION_CENTER:[9377],LEISURE_CENTER:[9378],BOWLING_CENTER:[9378002],DANCE_STUDIO_AND_SCHOOL:[9378003],FLYING_CLUB:[9378004],SAUNA_SOLARIUM_MASSAGE:[9378005],NIGHTLIFE:[9379],DISCO_CLUB:[9379002],BAR:[9379004],COCKTAIL_BAR:[9379006],JAZZ_CLUB:[9379008],COMEDY_CLUB:[9379009],KARAOKE_CLUB:[9379010],COMMERCIAL_BUILDING:[9382],INDUSTRIAL_BUILDING:[9383],ABORIGINAL_LAND:[9389],HEALTHCARE_SERVICE:[9663],PERSONAL_SERVICE:[9663002],PERSONAL_CARE_FACILITY:[9663003],BLOOD_BANK:[9663004],AMBULANCE_UNIT:[9663005],ENTERTAINMENT:[9900],AMUSEMENT_PARK:[9902,9902003],AMUSEMENT_PLACE:[9902004],VEHICLE_DEALER:[9910],CAR_DEALER:[9910002],MOTORCYCLE_DEALER:[9910003],BOAT_DEALER:[9910004],RECREATIONAL_VEHICLE_DEALER:[9910005],TRUCK_DEALER:[9910006],VAN_DEALER:[9910007],BUS_DEALER:[9910008],ATV_DEALER:[9910009],GOLF_COURSE:[9911],PUBLIC_LIBRARY:[9913],ZOOS_ARBORETA_BOTANICAL_GARDEN:[9927],ARBORETA_AND_BOTANICAL_GARDENS:[9927002],ZOO:[9927003],AQUATIC_ZOO:[9927004],WILDLIFE_PARK:[9927005],RENTAL_CAR_PARKING:[9930],PUBLIC_AMENITY:[9932],PASSENGER_TRANSPORT_TICKET_OFFICE:[9932002],PEDESTRIAN_SUBWAY:[9932003],PUBLIC_CALL_BOX:[9932004],PUBLIC_BATHROOM:[9932005],RESCUE_SERVICE:[9932006],MOUNTAIN_PASS:[9935],CLUB_AND_ASSOCIATION:[9937],BEACH_CLUB:[9937002],HOCKEY_CLUB:[9937003],PUBLIC_TRANSPORT_STOP:[9942],BUS_STOP:[9942002],TAXI_STAND:[9942003],STREETCAR_STOP:[9942004],EMERGENCY_ROOM:[9956],RESIDENTIAL_ENTRANCE:[9999]},poiCategoriesToID=Object.fromEntries(Object.entries(poiCategoriesToIDs).map(([A,E])=>[A,E[0]])),poiIDsToCategories=Object.fromEntries(Object.entries(poiCategoriesToIDs).flatMap(([A,E])=>E.map(E=>[E,A]))),projectAlongRouteLocation=(A,E)=>nearestPointOnLine(A,getPositionStrict(E)).properties.location,findInsertionSlot=(A,E)=>{for(let R=0;R<A.length-1;R++)if(E>=A[R]&&E<=A[R+1])return R+1;return E<A[0]?0:A.length},findBestWaypointInsertionIndex=(A,E,R)=>findBestWaypointInsertionIndices(A,E,[R])[0],findBestWaypointInsertionIndices=(A,E,R)=>{if(0===R.length)return[];if(0===A.geometry.coordinates.length||E.length<2)return R.map(()=>0);const T=E.map(E=>projectAlongRouteLocation(A,E)??0);return R.map(E=>{const R=projectAlongRouteLocation(A,E);return void 0===R?0:findInsertionSlot(T,R)})},withInsertedWaypoint=(A,E,R)=>withInsertedWaypoints(A,E,[R]),withInsertedWaypoints=(A,E,R)=>{if(0===R.length)return E.slice();if(0===A.geometry.coordinates.length||E.length<2)return[...R,...E];const T=E.map(E=>projectAlongRouteLocation(A,E)??0),_=Array.from({length:E.length+1},()=>[]);for(let N=0;N<R.length;N++){const E=R[N],I=projectAlongRouteLocation(A,E);_[void 0===I?0:findInsertionSlot(T,I)].push({waypoint:E,location:I??0,inputIndex:N})}for(const N of _)N.sort((A,E)=>A.location-E.location||A.inputIndex-E.inputIndex);const I=[];for(let N=0;N<E.length;N++){for(const A of _[N])I.push(A.waypoint);I.push(E[N])}for(const N of _[E.length])I.push(N.waypoint);return I},calculateProgressAtRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R||0===R.length)return;const T=A.geometry.coordinates.length;if(E<0||E>=T)return;const _=findBracketingProgressPoints(R,"pointIndex",E);if(!_)return;const{lower:I,lowerVal:N,upper:e,upperVal:S}=_,t=I.distanceInMeters,O=e.distanceInMeters,C=I.travelTimeInSeconds,o=e.travelTimeInSeconds;if(void 0===t||void 0===O||void 0===C||void 0===o)return;if(N===S)return{distanceInMeters:t,travelTimeInSeconds:C};const n=lengthShareOfBracket(A.geometry.coordinates,N,E,S);return{distanceInMeters:t+n*(O-t),travelTimeInSeconds:C+n*(o-C)}},getRouteProgressBetween=(A,E,R)=>{const T=calculateProgressAtRoutePoint(A,E),_=calculateProgressAtRoutePoint(A,R);if(T&&_)return{start:T,end:_,delta:{distanceInMeters:_.distanceInMeters-T.distanceInMeters,travelTimeInSeconds:_.travelTimeInSeconds-T.travelTimeInSeconds}}},getRouteProgressForSection=(A,E)=>getRouteProgressBetween(A,E.startPointIndex,E.endPointIndex),getSectionBBox=(A,E)=>{const R=A.geometry.coordinates;if(!R||0===R.length||E.startPointIndex<0||E.endPointIndex>=R.length||E.startPointIndex>E.endPointIndex)return;const T=R[E.startPointIndex],_=R[E.endPointIndex],I=R[Math.floor((E.startPointIndex+E.endPointIndex)/2)];let N=bboxExpandedWithPosition(T);return N=bboxExpandedWithPosition(I,N),N=bboxExpandedWithPosition(_,N),N},firstProgressIndexPast=(A,E,R)=>{let T=A.length,_=0,I=A.length;for(;_<I;){const N=_+I>>>1;let e=N;for(;e<I&&void 0===A[e][E];)e++;const S=e<I?A[e][E]:void 0;void 0===S?I=N:R(S)?(T=e,I=N):_=e+1}return T},findBracketingProgressPoints=(A,E,R)=>{const T=A[firstProgressIndexPast(A,E,A=>A>=R)];let _=firstProgressIndexPast(A,E,A=>A>R)-1;for(;_>=0&&void 0===A[_][E];)_--;const I=A[_],N=I?.[E],e=T?.[E];return void 0!==N&&void 0!==e?{lower:I,lowerVal:N,upper:T,upperVal:e}:void 0},metersAlongLineCache=/* @__PURE__ */new WeakMap,metersAlongLine=A=>{const E=metersAlongLineCache.get(A);if(E?.length===A.length)return E;const R=new Float64Array(A.length);for(let T=1;T<A.length;T++)R[T]=R[T-1]+distance(A[T-1],A[T],{units:"meters"});return metersAlongLineCache.set(A,R),R},lengthShareOfBracket=(A,E,R,T)=>{const _=metersAlongLine(A),I=_[T]-_[E];return I>0?(_[R]-_[E])/I:(R-E)/(T-E)},interpolateProgressAtPathIndex=(A,E,R)=>{const T=A.geometry.coordinates,_=Math.min(E+1,T.length-1),I=T[E],N=T[_],e=calculateProgressAtRoutePoint(A,E),S=calculateProgressAtRoutePoint(A,_);if(e&&S)return{position:[I[0]+R*(N[0]-I[0]),I[1]+R*(N[1]-I[1])],travelTimeInSeconds:e.travelTimeInSeconds+R*(S.travelTimeInSeconds-e.travelTimeInSeconds),distanceInMeters:e.distanceInMeters+R*(S.distanceInMeters-e.distanceInMeters)}},resolveCoordinateAtProgress=(A,E,R)=>{const{progress:T}=A.properties;if(!T||0===T.length)return;const _=A.geometry.coordinates,I=T[0],N=T.at(-1),e=I[E],S=N[E];if(void 0===e||void 0===S)return;if(R<=e)return{position:_[I.pointIndex],travelTimeInSeconds:I.travelTimeInSeconds??0,distanceInMeters:I.distanceInMeters??0};if(R>=S)return{position:_[N.pointIndex],travelTimeInSeconds:N.travelTimeInSeconds??0,distanceInMeters:N.distanceInMeters??0};const t=((A,E,R,T)=>{const _=findBracketingProgressPoints(A,R,T);if(!_)return;const{lower:I,lowerVal:N,upper:e,upperVal:S}=_,t=N===S?0:(T-N)/(S-N),O=metersAlongLine(E),C=O[e.pointIndex]-O[I.pointIndex];if(0===C){const A=I.pointIndex+t*(e.pointIndex-I.pointIndex),E=Math.floor(A);return{pathIndex:E,progressRatioTowardsNextPathPoint:A-E}}const o=O[I.pointIndex]+t*C,n=clamp(sortedIndex(O,o)-1,I.pointIndex,e.pointIndex-1),r=O[n+1]-O[n];return{pathIndex:n,progressRatioTowardsNextPathPoint:r>0?(o-O[n])/r:0}})(T,_,E,R);return void 0!==t?interpolateProgressAtPathIndex(A,t.pathIndex,t.progressRatioTowardsNextPathPoint):void 0},getCoordinateAtRouteProgress=(A,E)=>{if("traveledTimeInSeconds"in E)return resolveCoordinateAtProgress(A,"travelTimeInSeconds",E.traveledTimeInSeconds);if("traveledDistanceInMeters"in E)return resolveCoordinateAtProgress(A,"distanceInMeters",E.traveledDistanceInMeters);const R=A.properties.summary.departureTime;if(!R)return;const T=(E.clockTime.getTime()-R.getTime())/1e3;return T<0?void 0:resolveCoordinateAtProgress(A,"travelTimeInSeconds",T)},getProgressAtNearestRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R?.length)return;const T=A.geometry.coordinates,_=nearestPointOnLine(A,getPositionStrict(E)),I=_.properties.index??0,N=Math.min(I+1,T.length-1),e=T[I],S=T[N],t=((A,E,R)=>{const T=R[0]-A[0],_=R[1]-A[1],I=T*T+_*_;if(0===I)return 0;const N=((E[0]-A[0])*T+(E[1]-A[1])*_)/I;return clamp(N,0,1)})(e,_.geometry.coordinates,S);return interpolateProgressAtPathIndex(A,I,t)},getRoutePlanningLocationType=A=>Array.isArray(A)?Array.isArray(A[0])?"path":"waypoint":"Feature"===A.type&&"LineString"===A.geometry.type?"path":"waypoint",indexedMagnitudes=["unknown","minor","moderate","major","indefinite"],iconCategoryMap={1:"accident",2:"fog",3:"danger",4:"rain",5:"frost",6:"jam",7:"lane-closed",8:"road-closed",9:"roadworks",10:"wind",11:"flooding",12:"animals-on-road",13:"narrow-lanes",14:"broken-down-vehicle"},categoryToIconMap=Object.fromEntries(Object.entries(iconCategoryMap).map(([A,E])=>[E,Number(A)])),iconToTrafficIncidentCategory=A=>iconCategoryMap[A]??"other",trafficIncidentToIconCategory=A=>categoryToIconMap[A]??0,minuteUnits=A=>A?.minutes??"min",formatDuration=(A,E)=>{if(A){const T=Math.abs(A)/3600;let _=Math.floor(T),I=Math.round(T%1*60);60===I&&(I=0,_++);const N={...TomTomConfig.instance.get().displayUnits?.time,...E};if(_)return`${_} ${R=N,R?.hours??"hr"} ${I.toString().padStart(2,"0")} ${minuteUnits(N)}`;if(I)return`${I.toString()} ${minuteUnits(N)}`}var R},MILE_IN_METERS=1609.344,meterUnits=A=>A?.meters??"m",kmUnits=A=>A?.kilometers??"km",formatMiles=(A,E,R)=>E<3?((A,E,R)=>{const T=Number.parseInt(E.toString()),_=E-T,I=A<0?"-":"";if(_<.125)return`${I}${T} ${R}`;const N=T>0?T:"";return _<.375?`${I}${N}¼ ${R}`:_<.625?`${I}${N}½ ${R}`:_<.875?`${I}${N}¾ ${R}`:`${I}${T+1} ${R}`})(A,E,R):E<10?((A,E,R)=>{const T=Number.parseInt(E.toString()),_=E-T,I=A<0?"-":"";return _<.25?`${I}${T} ${R}`:_<.75?`${I}${T}½ ${R}`:`${I}${T+1} ${R}`})(A,E,R):`${Math.round(A)} ${R}`,mileUnitsWithDefault=A=>A.miles??"mi",formatUs=(A,E)=>{const R=A/1609.344,T=Math.abs(R);return T<.125?((A,E)=>{const R=Math.round(A/.3048),T=Math.abs(R);return T<30?`${R} ${E}`:T<500?`${10*Math.round(R/10)} ${E}`:`${100*Math.round(R/100)} ${E}`})(A,E.feet??"ft"):formatMiles(R,T,mileUnitsWithDefault(E))},formatUk=(A,E)=>{const R=A/1609.344,T=Math.abs(R);return T<.125?((A,E)=>{const R=Math.round(A/.9144);return Math.abs(R)<10?`${Math.round(R)} ${E}`:`${10*Math.round(R/10)} ${E}`})(A,E.yards??"yd"):formatMiles(R,T,mileUnitsWithDefault(E))},formatDistance=(A,E)=>{if(isNil(A))return"";const R={...TomTomConfig.instance.get().displayUnits?.distance,...E};switch(R?.type??"metric"){case"metric":return((A,E)=>{const R=Math.abs(A);if(R<10)return`${A} ${meterUnits(E)}`;if(R<500)return`${10*Math.round(A/10)} ${meterUnits(E)}`;if(R<1e3){const R=100*Math.round(A/100);return 1e3===R||-1e3===R?`${A<0?"-":""}1 ${kmUnits(E)}`:`${R} ${meterUnits(E)}`}return R<1e4?`${100*Math.round(A/100)/1e3} ${kmUnits(E)}`:`${Math.round(A/1e3)} ${kmUnits(E)}`})(A,R);case"imperial_us":return formatUs(A,R);case"imperial_uk":return formatUk(A,R)}};export{DEFAULT_COMMON_BASE_URL,MILE_IN_METERS,TOMTOM_USER_AGENT_SDK_NAME,TomTomConfig,areaAnalyticsMetricKeys,avoidableTypes,bboxCenter,bboxExpandedWithBBox,bboxExpandedWithGeoJSON,bboxExpandedWithPosition,bboxFromBBoxes,bboxFromCoordsArray,bboxFromGeoJSON,bboxOnlyIfWithArea,budgetTypes,budgetUnits,calculateProgressAtRoutePoint,chargingPointCapabilities,chargingPointRestrictions,chargingPointStatus,chargingStationAccessTypes,connectorTypes,currentTypes,defaultConfig,findBestWaypointInsertionIndex,findBestWaypointInsertionIndices,formatDistance,formatDuration,fullTrafficIncidentCategories,generateId,generateTomTomHeaders,geographyTypes,geopoliticalViews,getCoordinateAtRouteProgress,getPosition,getPositionStrict,getProgressAtNearestRoutePoint,getRoutePlanningLocationType,getRouteProgressBetween,getRouteProgressForSection,getSectionBBox,iconToTrafficIncidentCategory,indexedMagnitudes,inputSectionTypes,inputSectionTypesWithGuidance,isBBoxWithArea,isProxyCredentialsMode,mergeFromGlobal,paymentMethods,placeTypes,plugTypes,poiCategories,poiCategoriesToID,poiCategoriesToIDs,poiIDsToCategories,polygonFromBBox,sectionTypes,toPointFeature,toPointGeometry,trafficIncidentRequestCategories,trafficIncidentToIconCategory,withInsertedWaypoint,withInsertedWaypoints};
|
|
1
|
+
import{distance,nearestPointOnLine}from"@turf/turf";import{clamp,isNil,sortedIndex}from"lodash-es";var DEFAULT_COMMON_BASE_URL="https://api.tomtom.com",defaultConfig={commonBaseURL:"https://api.tomtom.com",apiKey:"",retry:{initialWaitMs:.447,backoffFactor:1.618,timeoutMs:4e4}},TomTomConfig=class A{static{this.instance=new A}constructor(){this.config={...defaultConfig}}put(A){this.config={...this.config,...A}}reset(){this.config={...defaultConfig}}get(){return this.config}},mergeFromGlobal=(A={})=>({...TomTomConfig.instance.get(),...A}),isProxyCredentialsMode=(A=TomTomConfig.instance.get())=>!A.apiKey&&"https://api.tomtom.com"!==(A.commonBaseURL??"https://api.tomtom.com"),geopoliticalViews=["Unified","AE","AR","BN","CL","CN","DZ","IL","IN","KR","MA","MY","PH","PK","RS","RU","TR","TW","US","VN"],chargingStationAccessTypes=["Public","Authorized","Restricted","Private","Unknown"],chargingPointStatus=["Available","Reserved","Occupied","OutOfService","Unknown"],chargingPointCapabilities=["ChargingProfileCapable","ChargingPreferencesCapable","ChipCardSupport","ContactlessCardSupport","CreditCardPayable","DebitCardPayable","PedTerminal","RemoteStartStopCapable","Reservable","RfidReader","StartSessionConnectorRequired","TokenGroupCapable","UnlockCapable","PlugAndCharge","Unknown"],chargingPointRestrictions=["EvOnly","Plugged","Disabled","Customers","Motorcycles"],connectorTypes=["StandardHouseholdCountrySpecific","IEC62196Type1","IEC62196Type1CCS","IEC62196Type2CableAttached","IEC62196Type2Outlet","IEC62196Type2CCS","IEC62196Type3","Chademo","GBT20234Part2","GBT20234Part3","IEC60309AC3PhaseRed","IEC60309AC1PhaseBlue","IEC60309DCWhite","Tesla"],currentTypes=["AC1","AC3","DC"],geographyTypes=["Country","CountrySubdivision","CountrySecondarySubdivision","CountryTertiarySubdivision","Municipality","MunicipalitySubdivision","MunicipalitySecondarySubdivision","Neighbourhood","PostalCodeArea"],placeTypes=["POI","Street","Geography","Point Address","Address Range","Cross Street"],poiCategories=["ABORIGINAL_LAND","ADVENTURE_SPORTS_FACILITY","ADVENTURE_VEHICLE_TRAIL","ADVERTISING_COMPANY","AFGHAN_RESTAURANT","AFRICAN_RESTAURANT","AGRICULTURAL_SUPPLIES","AGRICULTURAL_TECHNOLOGY","AGRICULTURE","AIRFIELD","AIRLINE_ACCESS","AIRLINE_COMPANY","AIRPORT","AMBULANCE_UNIT","AMERICAN_RESTAURANT","AMPHITHEATER","AMUSEMENT_PARK","AMUSEMENT_PLACE","ANIMAL_SERVICE","ANIMAL_SHELTER","ANTIQUE_ART_SHOP","APARTMENT_RENTAL","AQUATIC_ZOO","ARABIAN_RESTAURANT","ARBORETA_AND_BOTANICAL_GARDENS","ARCH","ARMENIAN_RESTAURANT","ART_SCHOOL","ASIAN_RESTAURANT","ATHLETICS_TRACK","ATM","ATV_DEALER","AUSTRALIAN_RESTAURANT","AUSTRIAN_RESTAURANT","AUTOMOBILE_COMPANY","AUTOMOBILE_MANUFACTURING","BAGS_LEATHERWEAR","BAKERY","BANDB_OR_GUEST_HOUSE","BANK","BANQUET_ROOMS","BAR","BARBECUE_RESTAURANT","BASEBALL_PARK","BASKETBALL_ARENA","BASQUE_RESTAURANT","BATTLEFIELD","BAY","BEACH","BEACH_CLUB","BEAUTY_SALON","BEAUTY_SUPPLIES","BELGIAN_RESTAURANT","BETTING_STATION","BISTRO","BLOOD_BANK","BOATING_EQUIPMENT_AND_ACCESSORIES","BOAT_DEALER","BOAT_LAUNCHING_RAMP","BODYSHOP","BOLIVIAN_RESTAURANT","BOOK_SHOP","BORDER_CONTROL","BOWLING_CENTER","BRAZILIAN_RESTAURANT","BRIDGE","BRITISH_RESTAURANT","BUFFET_RESTAURANT","BUILDING","BULGARIAN_RESTAURANT","BUNGALOW_RENTAL","BURMESE_RESTAURANT","BUSINESS_PARK","BUSINESS_SERVICES","BUS_CHARTER_COMPANY","BUS_DEALER","BUS_LINES","BUS_STOP","BUTCHER","CABARET_THEATER","CABINS_LODGES","CABLE_AND_TELEPHONE_COMPANY","CAFE","CAFETERIA","CAFE_PUB","CALIFORNIAN_RESTAURANT","CAMBODIAN_RESTAURANT","CAMERAS_AND_PHOTOGRAPHY","CAMPING_GROUND","CANADIAN_RESTAURANT","CANNABIS_SHOP","CAPE","CARAVAN_SITE","CARIBBEAN_RESTAURANT","CARPET_FLOOR_COVERINGS","CAR_DEALER","CAR_GLASS_REPLACEMENT_SHOP","CAR_RENTAL","CAR_REPAIR_AND_SERVICE","CAR_WASH","CASINO_AND_GAMBLING","CATERING_SERVICES","CAVE","CEMETERY","CHALET_RENTAL","CHARGING_LOCATION","CHEMICAL_COMPANY","CHICKEN_RESTAURANT","CHILDCARE","CHILDREN_S_CLOTHES","CHILEAN_RESTAURANT","CHINESE_RESTAURANT","CHRISTMAS_OR_HOLIDAY_SHOP","CHURCH","CINEMA","CLEANING_SERVICES","CLOTHING_SHOP","CLUB_AND_ASSOCIATION","COCKTAIL_BAR","COFFEE_SHOP","COLLEGE_OR_UNIVERSITY","COLOMBIAN_RESTAURANT","COMEDY_CLUB","COMMERCIAL_BUILDING","COMMUNITY_CENTER","COMPANY","COMPUTER_AND_COMPUTER_SUPPLIES","COMPUTER_AND_DATA_SERVICES","CONCERT_HALL","CONSTRUCTION_COMPANY","CONSTRUCTION_MATERIAL_AND_EQUIPMENT","CONSUMER_ELECTRONICS","CONVENIENCE_STORE","CORSICAN_RESTAURANT","COTTAGE_RENTAL","COURIER_DROP_BOX","COURTHOUSE","COVE","CREOLE_RESTAURANT","CREPERIE","CRICKET_GROUND","CUBAN_RESTAURANT","CULTURAL_CENTER","CURTAINS_TEXTILES","CZECH_RESTAURANT","C_DS_DVD_VIDEOS","DAM","DANCE_STUDIO_AND_SCHOOL","DANISH_RESTAURANT","DELICATESSEN","DELIVERY_SERVICE","DENTIST","DEPARTMENT_STORE","DINNER_THEATER","DISCO_CLUB","DIVERSIFIED_FINANCIALS","DOCTOR","DONGBEI_RESTAURANT","DOUGHNUT_RESTAURANT","DO_IT_YOURSELF_CENTERS","DRIVE_IN_MOVIES","DRIVE_THROUGH_BOTTLE_SHOP","DRIVING_SCHOOL","DRUG_STORE","DRY_CLEANER","DUNE","DUTCH_RESTAURANT","EGYPTIAN_RESTAURANT","ELECTRICAL_APPLIANCES_SHOP","ELECTRONICS_COMPANY","EMBASSY","EMERGENCY_MEDICAL_SERVICE","EMERGENCY_ROOM","ENGLISH_RESTAURANT","ENTERTAINMENT","EQUIPMENT_RENTAL","ETHIOPIAN_RESTAURANT","EXCHANGE","EXHIBITION_CONVENTION_CENTER","FACTORY_OUTLET","FAIRGROUND","FARM","FARMERS_MARKET","FAST_FOOD","FERRY_TERMINAL","FINNISH_RESTAURANT","FIRE_STATION","FISHING_AND_HUNTING_AREA","FISHMONGER","FITNESS_CLUB_AND_CENTER","FLATS_OR_APARTMENT_COMPLEX","FLORISTS","FLYING_CLUB","FONDUE_RESTAURANT","FOOD_AND_DRINKS_SHOP","FOOD_MARKET","FOOTBALL_STADIUM","FOOTWEAR_SHOE_REPAIRS","FOREIGN_EXCHANGE","FOREST_AREA","FRENCH_RESTAURANT","FUEL_STATION","FUNERAL_SERVICE_AND_MORTUARIES","FURNITURE_HOME_FURNISHINGS","FUSION_RESTAURANT","GARDEN_CENTERS_SERVICES","GENERAL_HOSPITAL_AND_POLYCLINIC","GENERAL_PRACTITIONER","GERMAN_RESTAURANT","GIFTS_CARDS_NOVELTIES_SOUVENIRS","GLASSWARE_CERAMIC_SHOP","GLASS_WINDOWS_STORE","GOLD_EXCHANGE","GOLF_COURSE","GOVERNMENT_OFFICE","GREEK_RESTAURANT","GREENGROCER","GRILL_RESTAURANT","GROCERY_STORE","GURUDWARA","HAIRDRESSER","HAMBURGER_RESTAURANT","HARBOR","HARDWARE_STORE","HAWAIIAN_RESTAURANT","HEALTHCARE_SERVICE","HELIPORT_OR_HELIPAD","HIGH_SCHOOL","HIKING_TRAIL","HILL","HISTORICAL_PARK","HISTORIC_SITE","HOBBY_SHOP","HOCKEY_CLUB","HOLIDAY_RENTAL","HOME_APPLIANCE_REPAIR","HORSE_RACING_TRACK","HORSE_RIDING","HORSE_RIDING_TRAIL","HORTICULTURE","HOSPITAL","HOSPITAL_FOR_WOMEN_AND_CHILDREN","HOSPITAL_OF_CHINESE_MEDICINE","HOSTEL","HOTEL","HOTEL_OR_MOTEL","HOT_POT_RESTAURANT","HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS","HUNAN_RESTAURANT","HUNGARIAN_RESTAURANT","ICE_CREAM_PARLOR","ICE_HOCKEY_ARENA","ICE_RINK","IMPORT_OR_EXPORT_AND_DISTRIBUTION","INDIAN_RESTAURANT","INDONESIAN_RESTAURANT","INDUSTRIAL_BUILDING","INFORMAL_MARKET","INSURANCE_COMPANY","INTERNATIONAL_RAILROAD_STATION","INTERNATIONAL_RESTAURANT","INTERNET_CAFE","INVESTMENT_ADVISOR","IRANIAN_RESTAURANT","IRISH_RESTAURANT","ISLAND","ISRAELI_RESTAURANT","ITALIAN_RESTAURANT","JAMAICAN_RESTAURANT","JAPANESE_RESTAURANT","JAZZ_CLUB","JEWELRY_CLOCKS_WATCHES","JEWISH_RESTAURANT","JUICE_BAR","JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE","KARAOKE_CLUB","KITCHENS_BATHROOMS","KOREAN_RESTAURANT","KOSHER_RESTAURANT","LANGUAGE_SCHOOL","LATIN_AMERICAN_RESTAURANT","LAUNDRY","LEBANESE_RESTAURANT","LEGAL_SERVICES","LEISURE_CENTER","LIGHTING_SHOPS","LOCALE","LOCAL_SPECIALITIES_SHOP","LOTTERY_SHOP","MALL","MANUFACTURING_COMPANY","MANUFACTURING_FACILITY","MARINA","MARKETPLACE","MARSH","MAUSOLEUM_OR_GRAVE","MECHANICAL_ENGINEERING","MEDIA_FACILITY","MEDICAL_SUPPLIES_EQUIPMENT","MEDICINAL_AND_RECREATIONAL_DISPENSARY","MEDICINAL_MARIJUANA_DISPENSARY","MEDITERRANEAN_RESTAURANT","MEMORIAL","MEN_S_CLOTHING","MEXICAN_RESTAURANT","MICROBREWERY","MIDDLE_EASTERN_RESTAURANT","MIDDLE_SCHOOL","MILITARY_AIRPORT","MINERAL_OR_HOT_SPRINGS","MINING_COMPANY","MOBILE_PHONE_SHOP","MONGOLIAN_RESTAURANT","MONUMENT","MOROCCAN_RESTAURANT","MOSQUE","MOTEL","MOTORCYCLE_DEALER","MOTORCYCLE_REPAIR","MOTORING_ORGANIZATION_OFFICE","MOTOR_RACING_STADIUM","MOUNTAIN_BIKE_TRAIL","MOUNTAIN_PASS","MOUNTAIN_PEAK","MOVIE_THEATER","MOVING_AND_STORAGE_COMPANY","MULTI_PURPOSE_STADIUM","MUSEUM","MUSIC_CENTER","MUSIC_INSTRUMENTS_STORE","NAIL_SALON","NATIONAL_RAILROAD_STATION","NATURAL_FEATURE","NATURAL_TOURIST_ATTRACTION","NEPALESE_RESTAURANT","NETBALL_STADIUM","NEWSAGENTS_TOBACCONISTS","NIGHTLIFE","NON_GOVERNMENTAL_ORGANIZATION","NORWEGIAN_RESTAURANT","OASIS","OBSERVATORY","OFFICE_EQUIPMENT","OIL_AND_NATURAL_GAS","OPEN_CAR_PARKING_AREA","OPERA_HOUSE","OPTICIAN","ORGANIC_FOOD_RESTAURANT","ORIENTAL_RESTAURANT","PAGODA","PAINTING_DECORATING","PAKISTANI_RESTAURANT","PAN","PARK","PARKING_GARAGE","PARKWAY","PARK_AND_RECREATION_AREA","PASSENGER_TRANSPORT_TICKET_OFFICE","PAWN_SHOP","PEDESTRIAN_SUBWAY","PERSONAL_CARE_FACILITY","PERSONAL_SERVICE","PERUVIAN_RESTAURANT","PET_SUPPLIES","PHARMACEUTICAL_COMPANY","PHARMACY","PHILIPPINE_RESTAURANT","PHOTOCOPY_SHOP","PHOTO_LAB_OR_DEVELOPMENT","PICNIC_AREA","PIZZERIA","PLAIN_OR_FLAT","PLANETARIUM","PLATEAU","POLICE_STATION","POLISH_RESTAURANT","PORTUGUESE_RESTAURANT","PORT_WAREHOUSE_FACILITY","POST_OFFICE","PRE_SCHOOL","PRIMARY_PRODUCER","PRIMARY_RESOURCE_UTILITY","PRIMARY_SCHOOL","PRISON","PRIVATE_AIRPORT","PROTECTED_LAND","PUB","PUBLIC_AIRPORT","PUBLIC_AMENITY","PUBLIC_BATHROOM","PUBLIC_CALL_BOX","PUBLIC_LIBRARY","PUBLIC_MARKET","PUBLIC_TRANSPORT_STOP","PUBLISHING_TECHNOLOGIES","QUARRY","RACE_TRACK","RAILWAY_STATION","RAPIDS","REAL_ESTATE_AGENT","REAL_ESTATE_COMPANY","RECREATIONAL_CAMPING_GROUND","RECREATIONAL_MARIJUANA_DISPENSARY","RECREATIONAL_VEHICLE_DEALER","RECREATION_AREA","RECYCLING_SHOP","REEF","RELIGIOUS_SITE","RENTAL_CAR_PARKING","RESCUE_SERVICE","RESEARCH_FACILITY","RESERVOIR","RESIDENTIAL_ACCOMMODATION","RESIDENTIAL_ENTRANCE","RESORT","RESTAURANT","RESTAURANT_AREA","REST_AREA","REST_CAMP","RETAIL_OUTLET","RETIREMENT_COMMUNITY","RIDGE","RIVER_CROSSING","ROCKS","ROCK_CLIMBING_TRAIL","RUGBY_GROUND","RUSSIAN_RESTAURANT","SALAD_BAR","SANDWICH_RESTAURANT","SAUNA_SOLARIUM_MASSAGE","SCANDINAVIAN_RESTAURANT","SCHOOL","SCHOOL_BUS_COMPANY","SEAFOOD","SECURED_ENTRANCE","SECURITY_PRODUCTS","SENIOR_HIGH_SCHOOL","SERVICE_COMPANY","SHANDONG_RESTAURANT","SHOPPING_SERVICE","SHOP_OR_STORE","SICHUAN_RESTAURANT","SKI_RESORT","SNACKS_RESTAURANT","SOCCER_STADIUM","SOFTWARE_COMPANY","SOUL_FOOD","SOUP_RESTAURANT","SPANISH_RESTAURANT","SPECIALIST","SPECIALTY_CLOTHING_SHOP","SPECIALTY_FOODS","SPECIAL_HOSPITAL","SPORTS_CENTER","SPORTS_EQUIPMENT_AND_CLOTHING","SQUASH_COURT","STADIUM","STATION_ACCESS","STATUE","STEAK_HOUSE","STOCK_EXCHANGE","STREETCAR_STOP","SUBWAY_ENTRANCE","SUBWAY_STATION","SUPERMARKET","SUSHI_RESTAURANT","SWEDISH_RESTAURANT","SWIMMING_POOL","SWISS_RESTAURANT","SYNAGOG","SYRIAN_RESTAURANT","TAILOR_SHOP","TAIWANESE_RESTAURANT","TAKEOUT_FOOD","TAPAS_RESTAURANT","TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE","TAXI_STAND","TAX_SERVICES","TEA_HOUSE","TELECOMMUNICATIONS","TEMPLE","TENNIS_COURT","TEPPANYAKI_RESTAURANT","THAI_RESTAURANT","THEATER","THEMATIC_SPORT_CENTER","TIBETAN_RESTAURANT","TIRE_SERVICE","TOLL_GATE","TOURIST_ATTRACTION","TOURIST_INFORMATION","TOWER","TOYS_GAMES_SHOP","TRAFFIC_CONTROL_DEPARTMENT","TRAIL_SYSTEM","TRANSPORT_ACCESS","TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION","TRANSPORT_COMPANY","TRAVEL_AGENT","TRUCK_DEALER","TRUCK_REPAIR_AND_SERVICE","TRUCK_STOP","TUNISIAN_RESTAURANT","TUNNEL","TURKISH_RESTAURANT","URBAN_STATION","VALLEY","VAN_DEALER","VARIETY_STORE","VEGETARIAN_RESTAURANT","VEHICLE_DEALER","VEHICLE_REPAIR","VENEZUELAN_RESTAURANT","VETERINARY","VIDEO_RENTAL_SHOP","VIETNAMESE_RESTAURANT","VIEWPOINT","VILLA_RENTAL","VOCATIONAL_SCHOOL","WATER_HOLE","WATER_SPORT","WEDDING_SERVICES","WEIGH_STATION","WELFARE_ORGANIZATION","WELL","WESTERN_RESTAURANT","WHOLESALE_CLUB","WILDERNESS_AREA","WILDLIFE_PARK","WINERY","WINE_SPIRITS","WOMEN_S_CLOTHING","YACHT_BASIN","ZOO","ZOOS_ARBORETA_BOTANICAL_GARDEN"],budgetTypes=["timeMinutes","remainingChargePCT","spentChargePCT","spentFuelLiters","distanceKM"],budgetUnits={timeMinutes:"min",distanceKM:"km",remainingChargePCT:"% remaining",spentChargePCT:"% spent",spentFuelLiters:"L"},plugTypes=["Small_Paddle_Inductive","Large_Paddle_Inductive","IEC_60309_1_Phase","IEC_60309_3_Phase","IEC_62196_Type_1_Outlet","IEC_62196_Type_2_Outlet","IEC_62196_Type_3_Outlet","IEC_62196_Type_1_Connector_Cable_Attached","IEC_62196_Type_2_Connector_Cable_Attached","IEC_62196_Type_3_Connector_Cable_Attached","Combo_to_IEC_62196_Type_1_Base","Combo_to_IEC_62196_Type_2_Base","Type_E_French_Standard_CEE_7_5","Type_F_Schuko_CEE_7_4","Type_G_British_Standard_BS_1363","Type_J_Swiss_Standard_SEV_1011","China_GB_Part_2","China_GB_Part_3","IEC_309_DC_Plug","AVCON_Connector","Tesla_Connector","NEMA_5_20","CHAdeMO","SAE_J1772","TEPCO","Better_Place_Socket","Marechal_Socket","Standard_Household_Country_Specific"],paymentMethods=["No_Payment","Subscription","Direct"],avoidableTypes=["tollRoads","motorways","ferries","unpavedRoads","carpools","alreadyUsedRoads","borderCrossings","tunnels","carTrains","lowEmissionZones"],inputSectionTypes=["carpool","carTrain","country","ferry","importantRoadStretch","lowEmissionZone","motorway","pedestrian","roadShields","speedLimit","toll","tollRoad","tollVignette","traffic","tunnel","unpaved","urban","vehicleRestricted"],inputSectionTypesWithGuidance=[...inputSectionTypes,"lanes"],sectionTypes=[...inputSectionTypesWithGuidance,"leg"],areaAnalyticsMetricKeys=["speed","freeFlowSpeed","congestionLevel","travelTime","networkLength"],trafficIncidentRequestCategories=["accident","broken-down-vehicle","danger","flooding","fog","frost","jam","lane-closed","other","rain","road-closed","roadworks","wind"],fullTrafficIncidentCategories=[...trafficIncidentRequestCategories,"animals-on-road","narrow-lanes"],isBBoxWithArea=A=>!!A&&(A.length>=4&&A[3]!==A[1]&&A[2]!==A[0]),bboxOnlyIfWithArea=A=>isBBoxWithArea(A)?A:void 0,bboxExpandedWithPosition=(A,E)=>{if(A&&!(A.length<2))return E?[E[0]>A[0]?A[0]:E[0],E[1]>A[1]?A[1]:E[1],E[2]<A[0]?A[0]:E[2],E[3]<A[1]?A[1]:E[3]]:[A[0],A[1],A[0],A[1]]},bboxExpandedWithBBox=(A,E)=>E&&A?[E[0]>A[0]?A[0]:E[0],E[1]>A[1]?A[1]:E[1],E[2]<A[2]?A[2]:E[2],E[3]<A[3]?A[3]:E[3]]:A||E,bboxFromBBoxes=A=>A?.length?A.reduce((A,E)=>bboxExpandedWithBBox(E,A)):void 0,bboxFromCoordsArray=A=>{const E=A?.length;if(!E)return;let R;const T=Math.ceil(E/1e3);for(let _=0;_<E;_+=T)R=bboxExpandedWithPosition(A[_],R);return 1===T?R:bboxExpandedWithPosition(A[E-1],R)},bboxFromGeoJSON=A=>{if(A){if(Array.isArray(A))return"number"==typeof A[0]?A.length>=4?A:void 0:bboxFromBBoxes(A.map(A=>bboxFromGeoJSON(A)));if(A.bbox)return A.bbox;switch(A.type){case"Feature":return bboxFromGeoJSON(A.geometry);case"FeatureCollection":return bboxFromBBoxes(A.features.map(bboxFromGeoJSON));case"GeometryCollection":return bboxFromBBoxes(A.geometries.map(bboxFromGeoJSON));case"Point":return bboxExpandedWithPosition(A.coordinates);case"LineString":case"MultiPoint":return bboxFromCoordsArray(A.coordinates);case"MultiLineString":case"Polygon":return bboxFromBBoxes(A.coordinates.map(bboxFromCoordsArray));case"MultiPolygon":return bboxFromBBoxes(A.coordinates.flatMap(A=>A.map(bboxFromCoordsArray)));default:return}}},bboxExpandedWithGeoJSON=(A,E)=>bboxExpandedWithBBox(bboxFromGeoJSON(A),E),bboxCenter=A=>[(A[0]+A[2])/2,(A[1]+A[3])/2],polygonFromBBox=A=>{const[E,R,T,_]=A;return{type:"Feature",geometry:{type:"Polygon",coordinates:[[[E,R],[T,R],[T,_],[E,_],[E,R]]]},properties:{}}},generateId=()=>Date.now().toString(36)+Math.random().toString(36).substring(2),TOMTOM_USER_AGENT_SDK_NAME="MapsSDKJS",generateTomTomHeaders=A=>({"tomtom-user-agent":A["tomtom-user-agent"]??"MapsSDKJS/0.63.0"}),getPosition=(A,E)=>{if(A){if(Array.isArray(A))return A;if(A.coordinates)return A.coordinates;if(A.geometry)return"main-when-available"===E?.useEntryPoint?(R=A,R?.properties?.entryPoints?.find(A=>"main"===A.type))?.position??A.geometry.coordinates:A.geometry.coordinates}var R;return null},getPositionStrict=(A,E)=>{const R=getPosition(A,E);if(!R)throw new Error(`The received object does not have lng-lat coordinates: ${JSON.stringify(A)}`);return R},toPointGeometry=A=>({type:"Point",coordinates:A}),toPointFeature=A=>({type:"Feature",geometry:toPointGeometry(A),properties:{}}),poiCategoriesToIDs={TRAFFIC_CONTROL_DEPARTMENT:[7301,7301002],TRAIL_SYSTEM:[7302],MOUNTAIN_BIKE_TRAIL:[7302002],ADVENTURE_VEHICLE_TRAIL:[7302003],HIKING_TRAIL:[7302004],HORSE_RIDING_TRAIL:[7302005],ROCK_CLIMBING_TRAIL:[7302006],RESIDENTIAL_ACCOMMODATION:[7303],RETIREMENT_COMMUNITY:[7303002],FLATS_OR_APARTMENT_COMPLEX:[7303003],HOLIDAY_RENTAL:[7304],COTTAGE_RENTAL:[7304002],VILLA_RENTAL:[7304003],BUNGALOW_RENTAL:[7304004],CHALET_RENTAL:[7304005],APARTMENT_RENTAL:[7304006],ADVENTURE_SPORTS_FACILITY:[7305],HELIPORT_OR_HELIPAD:[7308],CHARGING_LOCATION:[7309],VEHICLE_REPAIR:[7310],BODYSHOP:[7310002],CAR_GLASS_REPLACEMENT_SHOP:[7310003],CAR_REPAIR_AND_SERVICE:[7310004],TIRE_SERVICE:[7310007],MOTORCYCLE_REPAIR:[7310008],TRUCK_REPAIR_AND_SERVICE:[7310009],FUEL_STATION:[7311],CAR_RENTAL:[7312],PARKING_GARAGE:[7313],HOTEL_OR_MOTEL:[7314],BANDB_OR_GUEST_HOUSE:[7314002],HOTEL:[7314003],HOSTEL:[7314004],RESORT:[7314005],MOTEL:[7314006],CABINS_LODGES:[7314007],REST_CAMP:[7314008],RESTAURANT:[7315],AFRICAN_RESTAURANT:[7315002],AMERICAN_RESTAURANT:[7315003],AUSTRIAN_RESTAURANT:[7315004],BARBECUE_RESTAURANT:[7315005],BELGIAN_RESTAURANT:[7315006],BISTRO:[7315007],BRITISH_RESTAURANT:[7315008],CALIFORNIAN_RESTAURANT:[7315009],CANADIAN_RESTAURANT:[7315010],CARIBBEAN_RESTAURANT:[7315011],CHINESE_RESTAURANT:[7315012],CREPERIE:[7315013],DUTCH_RESTAURANT:[7315014],FAST_FOOD:[7315015],PHILIPPINE_RESTAURANT:[7315016],FRENCH_RESTAURANT:[7315017],GERMAN_RESTAURANT:[7315018],GREEK_RESTAURANT:[7315019],GRILL_RESTAURANT:[7315020],HAWAIIAN_RESTAURANT:[7315021],HUNGARIAN_RESTAURANT:[7315022],INDIAN_RESTAURANT:[7315023],INDONESIAN_RESTAURANT:[7315024],ITALIAN_RESTAURANT:[7315025],JAPANESE_RESTAURANT:[7315026],JEWISH_RESTAURANT:[7315027],KOREAN_RESTAURANT:[7315028],LATIN_AMERICAN_RESTAURANT:[7315029],LEBANESE_RESTAURANT:[7315030],MEDITERRANEAN_RESTAURANT:[7315032],MEXICAN_RESTAURANT:[7315033],MIDDLE_EASTERN_RESTAURANT:[7315034],ORIENTAL_RESTAURANT:[7315035],PIZZERIA:[7315036],POLISH_RESTAURANT:[7315037],PORTUGUESE_RESTAURANT:[7315038],RUSSIAN_RESTAURANT:[7315040],SANDWICH_RESTAURANT:[7315042],SEAFOOD:[7315043],SPANISH_RESTAURANT:[7315044],STEAK_HOUSE:[7315045],SWISS_RESTAURANT:[7315047],THAI_RESTAURANT:[7315048],TURKISH_RESTAURANT:[7315049],VEGETARIAN_RESTAURANT:[7315050],VIETNAMESE_RESTAURANT:[7315051],HUNAN_RESTAURANT:[7315052],SHANDONG_RESTAURANT:[7315053],SICHUAN_RESTAURANT:[7315056],DONGBEI_RESTAURANT:[7315057],HOT_POT_RESTAURANT:[7315058],TAIWANESE_RESTAURANT:[7315059],WESTERN_RESTAURANT:[7315060],PERUVIAN_RESTAURANT:[7315061],ASIAN_RESTAURANT:[7315062],CREOLE_RESTAURANT:[7315063],SOUL_FOOD:[7315064],IRISH_RESTAURANT:[7315065],JAMAICAN_RESTAURANT:[7315066],KOSHER_RESTAURANT:[7315067],CZECH_RESTAURANT:[7315068],HAMBURGER_RESTAURANT:[7315069],CHICKEN_RESTAURANT:[7315070],FUSION_RESTAURANT:[7315071],BRAZILIAN_RESTAURANT:[7315072],INTERNATIONAL_RESTAURANT:[7315073],MOROCCAN_RESTAURANT:[7315074],ORGANIC_FOOD_RESTAURANT:[7315075],TAPAS_RESTAURANT:[7315076],ICE_CREAM_PARLOR:[7315078],DOUGHNUT_RESTAURANT:[7315079],AFGHAN_RESTAURANT:[7315081],ARABIAN_RESTAURANT:[7315083],ARMENIAN_RESTAURANT:[7315085],AUSTRALIAN_RESTAURANT:[7315086],BASQUE_RESTAURANT:[7315087],BOLIVIAN_RESTAURANT:[7315088],BULGARIAN_RESTAURANT:[7315090],BURMESE_RESTAURANT:[7315091],CAMBODIAN_RESTAURANT:[7315092],CHILEAN_RESTAURANT:[7315093],COLOMBIAN_RESTAURANT:[7315094],CORSICAN_RESTAURANT:[7315095],CUBAN_RESTAURANT:[7315096],DANISH_RESTAURANT:[7315098],EGYPTIAN_RESTAURANT:[7315100],ENGLISH_RESTAURANT:[7315101],ETHIOPIAN_RESTAURANT:[7315102],FINNISH_RESTAURANT:[7315104],IRANIAN_RESTAURANT:[7315105],ISRAELI_RESTAURANT:[7315106],MONGOLIAN_RESTAURANT:[7315110],NEPALESE_RESTAURANT:[7315111],NORWEGIAN_RESTAURANT:[7315112],SCANDINAVIAN_RESTAURANT:[7315114],SWEDISH_RESTAURANT:[7315119],SYRIAN_RESTAURANT:[7315120],TEPPANYAKI_RESTAURANT:[7315121],TIBETAN_RESTAURANT:[7315122],TUNISIAN_RESTAURANT:[7315123],VENEZUELAN_RESTAURANT:[7315125],PAKISTANI_RESTAURANT:[7315127],FONDUE_RESTAURANT:[7315134],SNACKS_RESTAURANT:[7315139],SOUP_RESTAURANT:[7315140],BUFFET_RESTAURANT:[7315142],SALAD_BAR:[7315143],TAKEOUT_FOOD:[7315145],BANQUET_ROOMS:[7315146],CAFETERIA:[7315147],SUSHI_RESTAURANT:[7315148],JUICE_BAR:[7315149],TOURIST_INFORMATION:[7316],MUSEUM:[7317],THEATER:[7318,7318005],CONCERT_HALL:[7318002],MUSIC_CENTER:[7318003],OPERA_HOUSE:[7318004],CABARET_THEATER:[7318006],AMPHITHEATER:[7318007],DINNER_THEATER:[7318008],CULTURAL_CENTER:[7319],SPORTS_CENTER:[7320,7320004],FITNESS_CLUB_AND_CENTER:[7320002],HORSE_RIDING:[7320003],THEMATIC_SPORT_CENTER:[7320005],SQUASH_COURT:[7320006],HOSPITAL:[7321],GENERAL_HOSPITAL_AND_POLYCLINIC:[7321002],SPECIAL_HOSPITAL:[7321003],HOSPITAL_OF_CHINESE_MEDICINE:[7321004],HOSPITAL_FOR_WOMEN_AND_CHILDREN:[7321005],POLICE_STATION:[7322],POST_OFFICE:[7324],PHARMACY:[7326],DEPARTMENT_STORE:[7327],BANK:[7328],MARKETPLACE:[7332],INFORMAL_MARKET:[7332002],PUBLIC_MARKET:[7332003],FARMERS_MARKET:[7332004],SUPERMARKET:[7332005],AGRICULTURE:[7335],HORTICULTURE:[7335002],PRIMARY_PRODUCER:[7335003],FARM:[7335004],VIEWPOINT:[7337],SWIMMING_POOL:[7338],RELIGIOUS_SITE:[7339],CHURCH:[7339002],MOSQUE:[7339003],SYNAGOG:[7339004],TEMPLE:[7339005],GURUDWARA:[7339006],PAGODA:[7339008],CASINO_AND_GAMBLING:[7341],CINEMA:[7342],MOVIE_THEATER:[7342002],DRIVE_IN_MOVIES:[7342003],MARINA:[7347,7347002],YACHT_BASIN:[7347003],WINERY:[7349],FERRY_TERMINAL:[7352],TRUCK_STOP:[7358],WEIGH_STATION:[7359,7359002],CAMPING_GROUND:[7360],RECREATIONAL_CAMPING_GROUND:[7360002],CARAVAN_SITE:[7360003],COMMUNITY_CENTER:[7363],EMBASSY:[7365],BORDER_CONTROL:[7366],GOVERNMENT_OFFICE:[7367],MOTORING_ORGANIZATION_OFFICE:[7368],OPEN_CAR_PARKING_AREA:[7369,7369002],SCHOOL:[7372,7372002],CHILDCARE:[7372003],PRE_SCHOOL:[7372004],PRIMARY_SCHOOL:[7372005],HIGH_SCHOOL:[7372006],SENIOR_HIGH_SCHOOL:[7372007],VOCATIONAL_SCHOOL:[7372008],LANGUAGE_SCHOOL:[7372010],ART_SCHOOL:[7372012],MIDDLE_SCHOOL:[7372014],DRIVING_SCHOOL:[7372016],MALL:[7373],STADIUM:[7374],ATHLETICS_TRACK:[7374002],CRICKET_GROUND:[7374003],SOCCER_STADIUM:[7374004],HORSE_RACING_TRACK:[7374005],MULTI_PURPOSE_STADIUM:[7374006],RUGBY_GROUND:[7374007],ICE_HOCKEY_ARENA:[7374008],BASEBALL_PARK:[7374009],FOOTBALL_STADIUM:[7374010],MOTOR_RACING_STADIUM:[7374011],BASKETBALL_ARENA:[7374012],RACE_TRACK:[7374013],NETBALL_STADIUM:[7374014],TOLL_GATE:[7375],TOURIST_ATTRACTION:[7376],BUILDING:[7376002],MONUMENT:[7376003],NATURAL_TOURIST_ATTRACTION:[7376004],OBSERVATORY:[7376005],PLANETARIUM:[7376006],DAM:[7376007],TUNNEL:[7376008],TOWER:[7376009],BRIDGE:[7376010],MAUSOLEUM_OR_GRAVE:[7376011],ARCH:[7376012],STATUE:[7376013],WATER_HOLE:[7376014],COLLEGE_OR_UNIVERSITY:[7377,7377002],JUNIOR_COLLEGE_OR_COMMUNITY_COLLEGE:[7377003],BUSINESS_PARK:[7378],RAILWAY_STATION:[7380],INTERNATIONAL_RAILROAD_STATION:[7380002],NATIONAL_RAILROAD_STATION:[7380003],URBAN_STATION:[7380004],SUBWAY_STATION:[7380005],AIRPORT:[7383],PUBLIC_AIRPORT:[7383002],PRIVATE_AIRPORT:[7383003],MILITARY_AIRPORT:[7383004],AIRFIELD:[7383005],COURIER_DROP_BOX:[7388],TRANSPORT_ACCESS:[7389],AIRLINE_ACCESS:[7389002],STATION_ACCESS:[7389003],SECURED_ENTRANCE:[7389004],SUBWAY_ENTRANCE:[7389999],EMERGENCY_MEDICAL_SERVICE:[7391],FIRE_STATION:[7392],REST_AREA:[7395],ATM:[7397],NATURAL_FEATURE:[8099],MOUNTAIN_PEAK:[8099002],CAVE:[8099003],RIDGE:[8099004],DUNE:[8099005],VALLEY:[8099006],PLAIN_OR_FLAT:[8099007],PLATEAU:[8099008],PAN:[8099009],WELL:[8099010],OASIS:[8099011],ROCKS:[8099012],RESERVOIR:[8099013],REEF:[8099014],RAPIDS:[8099015],BAY:[8099016],COVE:[8099017],HARBOR:[8099018],CAPE:[8099020],MINERAL_OR_HOT_SPRINGS:[8099021],ISLAND:[8099022],MARSH:[8099023],RIVER_CROSSING:[8099024],HILL:[8099025],QUARRY:[8099026],LOCALE:[8099027],PRIMARY_RESOURCE_UTILITY:[9150],TRANSPORT_AUTHORITY_VEHICLE_REGISTRATION:[9151],NON_GOVERNMENTAL_ORGANIZATION:[9152],WELFARE_ORGANIZATION:[9153],PRISON:[9154],CAR_WASH:[9155,9155002],MANUFACTURING_FACILITY:[9156],RESEARCH_FACILITY:[9157],MEDIA_FACILITY:[9158],PORT_WAREHOUSE_FACILITY:[9159],EXCHANGE:[9160],STOCK_EXCHANGE:[9160002],GOLD_EXCHANGE:[9160003],FOREIGN_EXCHANGE:[9160004],COMPANY:[9352],SERVICE_COMPANY:[9352002],ADVERTISING_COMPANY:[9352003],COMPUTER_AND_DATA_SERVICES:[9352004],SOFTWARE_COMPANY:[9352005],DIVERSIFIED_FINANCIALS:[9352006],INSURANCE_COMPANY:[9352007],DELIVERY_SERVICE:[9352008],REAL_ESTATE_COMPANY:[9352009],MANUFACTURING_COMPANY:[9352011],AGRICULTURAL_TECHNOLOGY:[9352012],AUTOMOBILE_COMPANY:[9352013],CHEMICAL_COMPANY:[9352014],ELECTRONICS_COMPANY:[9352015],MECHANICAL_ENGINEERING:[9352016],PHARMACEUTICAL_COMPANY:[9352018],PUBLISHING_TECHNOLOGIES:[9352019],TELECOMMUNICATIONS:[9352020],TAX_SERVICES:[9352022],LEGAL_SERVICES:[9352023],TRANSPORT_COMPANY:[9352024],BUS_CHARTER_COMPANY:[9352025],TAXI_LIMOUSINE_AND_SHUTTLE_SERVICE:[9352026],BUS_LINES:[9352027],SCHOOL_BUS_COMPANY:[9352028],CLEANING_SERVICES:[9352029],OIL_AND_NATURAL_GAS:[9352030],MINING_COMPANY:[9352031],CONSTRUCTION_COMPANY:[9352032],MOVING_AND_STORAGE_COMPANY:[9352033],AIRLINE_COMPANY:[9352034],FUNERAL_SERVICE_AND_MORTUARIES:[9352036],INVESTMENT_ADVISOR:[9352037],EQUIPMENT_RENTAL:[9352038],BUSINESS_SERVICES:[9352039],CABLE_AND_TELEPHONE_COMPANY:[9352040],AUTOMOBILE_MANUFACTURING:[9352041],IMPORT_OR_EXPORT_AND_DISTRIBUTION:[9352042],CATERING_SERVICES:[9352043],HOME_APPLIANCE_REPAIR:[9352044],ANIMAL_SHELTER:[9352045],WEDDING_SERVICES:[9352046],BEACH:[9357],RESTAURANT_AREA:[9359],ICE_RINK:[9360],SHOP_OR_STORE:[9361],BOOK_SHOP:[9361002],C_DS_DVD_VIDEOS:[9361003],CHILDREN_S_CLOTHES:[9361004],FOOTWEAR_SHOE_REPAIRS:[9361005],CLOTHING_SHOP:[9361006],MEN_S_CLOTHING:[9361007],WOMEN_S_CLOTHING:[9361008],CONVENIENCE_STORE:[9361009],DRY_CLEANER:[9361010],CAMERAS_AND_PHOTOGRAPHY:[9361011],COMPUTER_AND_COMPUTER_SUPPLIES:[9361012],CONSUMER_ELECTRONICS:[9361013],OFFICE_EQUIPMENT:[9361014],REAL_ESTATE_AGENT:[9361015],FACTORY_OUTLET:[9361016],FLORISTS:[9361017],BAKERY:[9361018],BUTCHER:[9361019],FISHMONGER:[9361020],FOOD_MARKET:[9361021],GREENGROCER:[9361022],GROCERY_STORE:[9361023],FOOD_AND_DRINKS_SHOP:[9361024],WINE_SPIRITS:[9361025],GIFTS_CARDS_NOVELTIES_SOUVENIRS:[9361026],HAIRDRESSER:[9361027],CARPET_FLOOR_COVERINGS:[9361028],CURTAINS_TEXTILES:[9361029],DO_IT_YOURSELF_CENTERS:[9361030],HOUSE_AND_GARDEN_FURNITURE_AND_FITTINGS:[9361031],GARDEN_CENTERS_SERVICES:[9361032],KITCHENS_BATHROOMS:[9361033],LIGHTING_SHOPS:[9361034],PAINTING_DECORATING:[9361035],JEWELRY_CLOCKS_WATCHES:[9361036],NEWSAGENTS_TOBACCONISTS:[9361037],OPTICIAN:[9361038],SPORTS_EQUIPMENT_AND_CLOTHING:[9361039],TOYS_GAMES_SHOP:[9361040],TRAVEL_AGENT:[9361041],CONSTRUCTION_MATERIAL_AND_EQUIPMENT:[9361042],MEDICAL_SUPPLIES_EQUIPMENT:[9361043],VIDEO_RENTAL_SHOP:[9361044],LAUNDRY:[9361045],PHOTO_LAB_OR_DEVELOPMENT:[9361046],PHOTOCOPY_SHOP:[9361047],ANIMAL_SERVICE:[9361048],ANTIQUE_ART_SHOP:[9361049],BEAUTY_SUPPLIES:[9361050],DRUG_STORE:[9361051],ELECTRICAL_APPLIANCES_SHOP:[9361052],HOBBY_SHOP:[9361053],FURNITURE_HOME_FURNISHINGS:[9361054],GLASSWARE_CERAMIC_SHOP:[9361055],LOCAL_SPECIALITIES_SHOP:[9361056],RECYCLING_SHOP:[9361057],BAGS_LEATHERWEAR:[9361058],MUSIC_INSTRUMENTS_STORE:[9361059],DELICATESSEN:[9361060],SPECIALTY_FOODS:[9361061],SHOPPING_SERVICE:[9361062],RETAIL_OUTLET:[9361063],PET_SUPPLIES:[9361064],WHOLESALE_CLUB:[9361066],BEAUTY_SALON:[9361067],NAIL_SALON:[9361068],HARDWARE_STORE:[9361069],PAWN_SHOP:[9361070],LOTTERY_SHOP:[9361071],BETTING_STATION:[9361072],AGRICULTURAL_SUPPLIES:[9361073],MOBILE_PHONE_SHOP:[9361075],DRIVE_THROUGH_BOTTLE_SHOP:[9361076],TAILOR_SHOP:[9361077],SECURITY_PRODUCTS:[9361078],SPECIALTY_CLOTHING_SHOP:[9361079],GLASS_WINDOWS_STORE:[9361080],VARIETY_STORE:[9361081],CHRISTMAS_OR_HOLIDAY_SHOP:[9361082],BOATING_EQUIPMENT_AND_ACCESSORIES:[9361083],PARK_AND_RECREATION_AREA:[9362],BATTLEFIELD:[9362002],CEMETERY:[9362003],HISTORIC_SITE:[9362004],HISTORICAL_PARK:[9362005],MEMORIAL:[9362007],PARK:[9362008],PARKWAY:[9362009],RECREATION_AREA:[9362011],WILDERNESS_AREA:[9362014],FOREST_AREA:[9362015],FISHING_AND_HUNTING_AREA:[9362016],FAIRGROUND:[9362017],SKI_RESORT:[9362026],BOAT_LAUNCHING_RAMP:[9362032],PICNIC_AREA:[9362033],PROTECTED_LAND:[9362037],COURTHOUSE:[9363],CANNABIS_SHOP:[9364],MEDICINAL_MARIJUANA_DISPENSARY:[9364002],RECREATIONAL_MARIJUANA_DISPENSARY:[9364003],MEDICINAL_AND_RECREATIONAL_DISPENSARY:[9364004],TENNIS_COURT:[9369],WATER_SPORT:[9371],DOCTOR:[9373],GENERAL_PRACTITIONER:[9373002],SPECIALIST:[9373003],DENTIST:[9374],VETERINARY:[9375],CAFE_PUB:[9376],CAFE:[9376002],PUB:[9376003],INTERNET_CAFE:[9376004],TEA_HOUSE:[9376005],COFFEE_SHOP:[9376006],MICROBREWERY:[9376007],EXHIBITION_CONVENTION_CENTER:[9377],LEISURE_CENTER:[9378],BOWLING_CENTER:[9378002],DANCE_STUDIO_AND_SCHOOL:[9378003],FLYING_CLUB:[9378004],SAUNA_SOLARIUM_MASSAGE:[9378005],NIGHTLIFE:[9379],DISCO_CLUB:[9379002],BAR:[9379004],COCKTAIL_BAR:[9379006],JAZZ_CLUB:[9379008],COMEDY_CLUB:[9379009],KARAOKE_CLUB:[9379010],COMMERCIAL_BUILDING:[9382],INDUSTRIAL_BUILDING:[9383],ABORIGINAL_LAND:[9389],HEALTHCARE_SERVICE:[9663],PERSONAL_SERVICE:[9663002],PERSONAL_CARE_FACILITY:[9663003],BLOOD_BANK:[9663004],AMBULANCE_UNIT:[9663005],ENTERTAINMENT:[9900],AMUSEMENT_PARK:[9902,9902003],AMUSEMENT_PLACE:[9902004],VEHICLE_DEALER:[9910],CAR_DEALER:[9910002],MOTORCYCLE_DEALER:[9910003],BOAT_DEALER:[9910004],RECREATIONAL_VEHICLE_DEALER:[9910005],TRUCK_DEALER:[9910006],VAN_DEALER:[9910007],BUS_DEALER:[9910008],ATV_DEALER:[9910009],GOLF_COURSE:[9911],PUBLIC_LIBRARY:[9913],ZOOS_ARBORETA_BOTANICAL_GARDEN:[9927],ARBORETA_AND_BOTANICAL_GARDENS:[9927002],ZOO:[9927003],AQUATIC_ZOO:[9927004],WILDLIFE_PARK:[9927005],RENTAL_CAR_PARKING:[9930],PUBLIC_AMENITY:[9932],PASSENGER_TRANSPORT_TICKET_OFFICE:[9932002],PEDESTRIAN_SUBWAY:[9932003],PUBLIC_CALL_BOX:[9932004],PUBLIC_BATHROOM:[9932005],RESCUE_SERVICE:[9932006],MOUNTAIN_PASS:[9935],CLUB_AND_ASSOCIATION:[9937],BEACH_CLUB:[9937002],HOCKEY_CLUB:[9937003],PUBLIC_TRANSPORT_STOP:[9942],BUS_STOP:[9942002],TAXI_STAND:[9942003],STREETCAR_STOP:[9942004],EMERGENCY_ROOM:[9956],RESIDENTIAL_ENTRANCE:[9999]},poiCategoriesToID=Object.fromEntries(Object.entries(poiCategoriesToIDs).map(([A,E])=>[A,E[0]])),poiIDsToCategories=Object.fromEntries(Object.entries(poiCategoriesToIDs).flatMap(([A,E])=>E.map(E=>[E,A]))),projectAlongRouteLocation=(A,E)=>nearestPointOnLine(A,getPositionStrict(E)).properties.location,findInsertionSlot=(A,E)=>{for(let R=0;R<A.length-1;R++)if(E>=A[R]&&E<=A[R+1])return R+1;return E<A[0]?0:A.length},findBestWaypointInsertionIndex=(A,E,R)=>findBestWaypointInsertionIndices(A,E,[R])[0],findBestWaypointInsertionIndices=(A,E,R)=>{if(0===R.length)return[];if(0===A.geometry.coordinates.length||E.length<2)return R.map(()=>0);const T=E.map(E=>projectAlongRouteLocation(A,E)??0);return R.map(E=>{const R=projectAlongRouteLocation(A,E);return void 0===R?0:findInsertionSlot(T,R)})},withInsertedWaypoint=(A,E,R)=>withInsertedWaypoints(A,E,[R]),withInsertedWaypoints=(A,E,R)=>{if(0===R.length)return E.slice();if(0===A.geometry.coordinates.length||E.length<2)return[...R,...E];const T=E.map(E=>projectAlongRouteLocation(A,E)??0),_=Array.from({length:E.length+1},()=>[]);for(let N=0;N<R.length;N++){const E=R[N],I=projectAlongRouteLocation(A,E);_[void 0===I?0:findInsertionSlot(T,I)].push({waypoint:E,location:I??0,inputIndex:N})}for(const N of _)N.sort((A,E)=>A.location-E.location||A.inputIndex-E.inputIndex);const I=[];for(let N=0;N<E.length;N++){for(const A of _[N])I.push(A.waypoint);I.push(E[N])}for(const N of _[E.length])I.push(N.waypoint);return I},calculateProgressAtRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R||0===R.length)return;const T=A.geometry.coordinates.length;if(E<0||E>=T)return;const _=findBracketingProgressPoints(R,"pointIndex",E);if(!_)return;const{lower:I,lowerVal:N,upper:e,upperVal:S}=_,t=I.distanceInMeters,O=e.distanceInMeters,C=I.travelTimeInSeconds,o=e.travelTimeInSeconds;if(void 0===t||void 0===O||void 0===C||void 0===o)return;if(N===S)return{distanceInMeters:t,travelTimeInSeconds:C};const n=lengthShareOfBracket(A.geometry.coordinates,N,E,S);return{distanceInMeters:t+n*(O-t),travelTimeInSeconds:C+n*(o-C)}},getRouteProgressBetween=(A,E,R)=>{const T=calculateProgressAtRoutePoint(A,E),_=calculateProgressAtRoutePoint(A,R);if(T&&_)return{start:T,end:_,delta:{distanceInMeters:_.distanceInMeters-T.distanceInMeters,travelTimeInSeconds:_.travelTimeInSeconds-T.travelTimeInSeconds}}},getRouteProgressForSection=(A,E)=>getRouteProgressBetween(A,E.startPointIndex,E.endPointIndex),getSectionBBox=(A,E)=>{const R=A.geometry.coordinates;if(!R||0===R.length||E.startPointIndex<0||E.endPointIndex>=R.length||E.startPointIndex>E.endPointIndex)return;const T=R[E.startPointIndex],_=R[E.endPointIndex],I=R[Math.floor((E.startPointIndex+E.endPointIndex)/2)];let N=bboxExpandedWithPosition(T);return N=bboxExpandedWithPosition(I,N),N=bboxExpandedWithPosition(_,N),N},firstProgressIndexPast=(A,E,R)=>{let T=A.length,_=0,I=A.length;for(;_<I;){const N=_+I>>>1;let e=N;for(;e<I&&void 0===A[e][E];)e++;const S=e<I?A[e][E]:void 0;void 0===S?I=N:R(S)?(T=e,I=N):_=e+1}return T},findBracketingProgressPoints=(A,E,R)=>{const T=A[firstProgressIndexPast(A,E,A=>A>=R)];let _=firstProgressIndexPast(A,E,A=>A>R)-1;for(;_>=0&&void 0===A[_][E];)_--;const I=A[_],N=I?.[E],e=T?.[E];return void 0!==N&&void 0!==e?{lower:I,lowerVal:N,upper:T,upperVal:e}:void 0},metersAlongLineCache=/* @__PURE__ */new WeakMap,metersAlongLine=A=>{const E=metersAlongLineCache.get(A);if(E?.length===A.length)return E;const R=new Float64Array(A.length);for(let T=1;T<A.length;T++)R[T]=R[T-1]+distance(A[T-1],A[T],{units:"meters"});return metersAlongLineCache.set(A,R),R},lengthShareOfBracket=(A,E,R,T)=>{const _=metersAlongLine(A),I=_[T]-_[E];return I>0?(_[R]-_[E])/I:(R-E)/(T-E)},interpolateProgressAtPathIndex=(A,E,R)=>{const T=A.geometry.coordinates,_=Math.min(E+1,T.length-1),I=T[E],N=T[_],e=calculateProgressAtRoutePoint(A,E),S=calculateProgressAtRoutePoint(A,_);if(e&&S)return{position:[I[0]+R*(N[0]-I[0]),I[1]+R*(N[1]-I[1])],travelTimeInSeconds:e.travelTimeInSeconds+R*(S.travelTimeInSeconds-e.travelTimeInSeconds),distanceInMeters:e.distanceInMeters+R*(S.distanceInMeters-e.distanceInMeters)}},resolveCoordinateAtProgress=(A,E,R)=>{const{progress:T}=A.properties;if(!T||0===T.length)return;const _=A.geometry.coordinates,I=T[0],N=T.at(-1),e=I[E],S=N[E];if(void 0===e||void 0===S)return;if(R<=e)return{position:_[I.pointIndex],travelTimeInSeconds:I.travelTimeInSeconds??0,distanceInMeters:I.distanceInMeters??0};if(R>=S)return{position:_[N.pointIndex],travelTimeInSeconds:N.travelTimeInSeconds??0,distanceInMeters:N.distanceInMeters??0};const t=((A,E,R,T)=>{const _=findBracketingProgressPoints(A,R,T);if(!_)return;const{lower:I,lowerVal:N,upper:e,upperVal:S}=_,t=N===S?0:(T-N)/(S-N),O=metersAlongLine(E),C=O[e.pointIndex]-O[I.pointIndex];if(0===C){const A=I.pointIndex+t*(e.pointIndex-I.pointIndex),E=Math.floor(A);return{pathIndex:E,progressRatioTowardsNextPathPoint:A-E}}const o=O[I.pointIndex]+t*C,n=clamp(sortedIndex(O,o)-1,I.pointIndex,e.pointIndex-1),r=O[n+1]-O[n];return{pathIndex:n,progressRatioTowardsNextPathPoint:r>0?(o-O[n])/r:0}})(T,_,E,R);return void 0!==t?interpolateProgressAtPathIndex(A,t.pathIndex,t.progressRatioTowardsNextPathPoint):void 0},getCoordinateAtRouteProgress=(A,E)=>{if("traveledTimeInSeconds"in E)return resolveCoordinateAtProgress(A,"travelTimeInSeconds",E.traveledTimeInSeconds);if("traveledDistanceInMeters"in E)return resolveCoordinateAtProgress(A,"distanceInMeters",E.traveledDistanceInMeters);const R=A.properties.summary.departureTime;if(!R)return;const T=(E.clockTime.getTime()-R.getTime())/1e3;return T<0?void 0:resolveCoordinateAtProgress(A,"travelTimeInSeconds",T)},getProgressAtNearestRoutePoint=(A,E)=>{const{progress:R}=A.properties;if(!R?.length)return;const T=A.geometry.coordinates,_=nearestPointOnLine(A,getPositionStrict(E)),I=_.properties.index??0,N=Math.min(I+1,T.length-1),e=T[I],S=T[N],t=((A,E,R)=>{const T=R[0]-A[0],_=R[1]-A[1],I=T*T+_*_;if(0===I)return 0;const N=((E[0]-A[0])*T+(E[1]-A[1])*_)/I;return clamp(N,0,1)})(e,_.geometry.coordinates,S);return interpolateProgressAtPathIndex(A,I,t)},getRoutePlanningLocationType=A=>Array.isArray(A)?Array.isArray(A[0])?"path":"waypoint":"Feature"===A.type&&"LineString"===A.geometry.type?"path":"waypoint",indexedMagnitudes=["unknown","minor","moderate","major","indefinite"],iconCategoryMap={1:"accident",2:"fog",3:"danger",4:"rain",5:"frost",6:"jam",7:"lane-closed",8:"road-closed",9:"roadworks",10:"wind",11:"flooding",12:"animals-on-road",13:"narrow-lanes",14:"broken-down-vehicle"},categoryToIconMap=Object.fromEntries(Object.entries(iconCategoryMap).map(([A,E])=>[E,Number(A)])),iconToTrafficIncidentCategory=A=>iconCategoryMap[A]??"other",trafficIncidentToIconCategory=A=>categoryToIconMap[A]??0,minuteUnits=A=>A?.minutes??"min",formatDuration=(A,E)=>{if(A){const T=Math.abs(A)/3600;let _=Math.floor(T),I=Math.round(T%1*60);60===I&&(I=0,_++);const N={...TomTomConfig.instance.get().displayUnits?.time,...E};if(_)return`${_} ${R=N,R?.hours??"hr"} ${I.toString().padStart(2,"0")} ${minuteUnits(N)}`;if(I)return`${I.toString()} ${minuteUnits(N)}`}var R},MILE_IN_METERS=1609.344,meterUnits=A=>A?.meters??"m",kmUnits=A=>A?.kilometers??"km",formatMiles=(A,E,R)=>E<3?((A,E,R)=>{const T=Number.parseInt(E.toString()),_=E-T,I=A<0?"-":"";if(_<.125)return`${I}${T} ${R}`;const N=T>0?T:"";return _<.375?`${I}${N}¼ ${R}`:_<.625?`${I}${N}½ ${R}`:_<.875?`${I}${N}¾ ${R}`:`${I}${T+1} ${R}`})(A,E,R):E<10?((A,E,R)=>{const T=Number.parseInt(E.toString()),_=E-T,I=A<0?"-":"";return _<.25?`${I}${T} ${R}`:_<.75?`${I}${T}½ ${R}`:`${I}${T+1} ${R}`})(A,E,R):`${Math.round(A)} ${R}`,mileUnitsWithDefault=A=>A.miles??"mi",formatUs=(A,E)=>{const R=A/1609.344,T=Math.abs(R);return T<.125?((A,E)=>{const R=Math.round(A/.3048),T=Math.abs(R);return T<30?`${R} ${E}`:T<500?`${10*Math.round(R/10)} ${E}`:`${100*Math.round(R/100)} ${E}`})(A,E.feet??"ft"):formatMiles(R,T,mileUnitsWithDefault(E))},formatUk=(A,E)=>{const R=A/1609.344,T=Math.abs(R);return T<.125?((A,E)=>{const R=Math.round(A/.9144);return Math.abs(R)<10?`${Math.round(R)} ${E}`:`${10*Math.round(R/10)} ${E}`})(A,E.yards??"yd"):formatMiles(R,T,mileUnitsWithDefault(E))},formatDistance=(A,E)=>{if(isNil(A))return"";const R={...TomTomConfig.instance.get().displayUnits?.distance,...E};switch(R?.type??"metric"){case"metric":return((A,E)=>{const R=Math.abs(A);if(R<10)return`${A} ${meterUnits(E)}`;if(R<500)return`${10*Math.round(A/10)} ${meterUnits(E)}`;if(R<1e3){const R=100*Math.round(A/100);return 1e3===R||-1e3===R?`${A<0?"-":""}1 ${kmUnits(E)}`:`${R} ${meterUnits(E)}`}return R<1e4?`${100*Math.round(A/100)/1e3} ${kmUnits(E)}`:`${Math.round(A/1e3)} ${kmUnits(E)}`})(A,R);case"imperial_us":return formatUs(A,R);case"imperial_uk":return formatUk(A,R)}};export{DEFAULT_COMMON_BASE_URL,MILE_IN_METERS,TOMTOM_USER_AGENT_SDK_NAME,TomTomConfig,areaAnalyticsMetricKeys,avoidableTypes,bboxCenter,bboxExpandedWithBBox,bboxExpandedWithGeoJSON,bboxExpandedWithPosition,bboxFromBBoxes,bboxFromCoordsArray,bboxFromGeoJSON,bboxOnlyIfWithArea,budgetTypes,budgetUnits,calculateProgressAtRoutePoint,chargingPointCapabilities,chargingPointRestrictions,chargingPointStatus,chargingStationAccessTypes,connectorTypes,currentTypes,defaultConfig,findBestWaypointInsertionIndex,findBestWaypointInsertionIndices,formatDistance,formatDuration,fullTrafficIncidentCategories,generateId,generateTomTomHeaders,geographyTypes,geopoliticalViews,getCoordinateAtRouteProgress,getPosition,getPositionStrict,getProgressAtNearestRoutePoint,getRoutePlanningLocationType,getRouteProgressBetween,getRouteProgressForSection,getSectionBBox,iconToTrafficIncidentCategory,indexedMagnitudes,inputSectionTypes,inputSectionTypesWithGuidance,isBBoxWithArea,isProxyCredentialsMode,mergeFromGlobal,paymentMethods,placeTypes,plugTypes,poiCategories,poiCategoriesToID,poiCategoriesToIDs,poiIDsToCategories,polygonFromBBox,sectionTypes,toPointFeature,toPointGeometry,trafficIncidentRequestCategories,trafficIncidentToIconCategory,withInsertedWaypoint,withInsertedWaypoints};
|
|
2
2
|
//# sourceMappingURL=core.es.js.map
|