@tomtom-org/maps-sdk 0.58.1 → 0.60.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.
@@ -1,2 +1,2 @@
1
- import{TomTomConfig as e,areaAnalyticsMetricKeys as t,avoidableTypes as n,bboxFromCoordsArray as r,bboxFromGeoJSON as o,bboxOnlyIfWithArea as a,currentTypes as i,generateId as s,generateTomTomHeaders as c,geographyTypes as l,getPosition as u,getPositionStrict as d,getRoutePlanningLocationType as p,inputSectionTypesWithGuidance as m,isProxyCredentialsMode as g,mergeFromGlobal as h,plugTypes as y,poiCategories as f,poiCategoriesToID as T,poiIDsToCategories as R,toPointGeometry as b,trafficIncidentRequestCategories as I,views as S}from"@tomtom-org/maps-sdk/core";import{z as C}from"zod";import{countBy as v,isNil as A,maxBy as P,minBy as L,omit as M,partition as E,pick as w,uniqBy as D}from"lodash-es";import{bbox as x,booleanIntersects as O}from"@turf/turf";var N=/* @__PURE__ */function(e){return e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e}({}),B=class e extends Error{constructor(t,n,r){super(t),this.service=n,this.issues=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},H={[N.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[N.FORBIDDEN]:"Request failed with status code 403"},_=class extends B{constructor(e,t,n){super(e,t),this.status=n,this.status&&H[this.status]&&(this.message=H[this.status])}},F=class extends B{constructor(e,t){super("The operation was aborted.",e),this.name="AbortError",this.cause=t}},U=(e,t)=>{const{data:n,message:r,status:o}=e;return new _(n?.error||n?.errorText||r,t,o)},G=(e,t,n,r)=>{if(r?.aborted&&e===r.reason)return new F(t,r.reason);if(r?.aborted&&"AbortError"===e?.name)return new F(t,r.reason);if(e.status){const r=e;return n?n(r,t):U(r,t)}return new B(e.message,t)},k=(e,t)=>new B(e.message,t,e.issues),K=C.object({apiKey:C.string().optional(),commonBaseURL:C.string().optional(),customServiceBaseURL:C.string().optional(),language:C.string().optional()}),W=(e,t=0)=>{const n=e.path.length>0?`${e.path.join(".")}: `:"";if("invalid_union"===e.code){const r=e.unionErrors;if(r?.length)return`${n}no matching union member (${r.map((e,n)=>`option[${n}]: { ${e.issues.map(e=>W(e,t+1)).join(", ")} }`).join(" | ")})`}return`${n}${e.message}`},j=class extends Error{constructor(e){super(`${e.issues.map(e=>W(e)).join("; ")}\nIssues: ${JSON.stringify(e.issues,null,2)}`),this.issues=e.issues}},V=async(e,t,n)=>{if(e.signal?.aborted)throw new F(n,e.signal.reason);const r=t.getAPIVersion?.(e),o=h({...e,...r&&{apiVersion:r}});if(void 0===e.validateRequest||e.validateRequest)try{((e,t)=>{const n=(t?.schema?K.extend(t.schema.shape):K).superRefine((e,n)=>{if("commonBaseURL"in e||"customServiceBaseURL"in e||n.addIssue({code:"custom",message:"commonBaseURL or customServiceBaseURL is required"}),t?.refinements?.length)for(const r of t.refinements)r.check(e)||n.addIssue({code:"custom",message:r.message})}).safeParse(e);if(!n.success)throw new j(n.error)})(o,t.requestValidation)}catch(s){throw k(s,n)}const a=t.buildRequest(o),i=c(o);e.onAPIRequest?.(a);try{const n=await t.sendRequest(a,i,{signal:e.signal});return e.onAPIResponse?.(a,n),t.parseResponse(await n.data,o)}catch(s){throw e.onAPIResponse?.(a,s),G(s,n,t.parseResponseError,e.signal)}},q=class e extends Error{constructor(t,n,r){super(n??`HTTP Error ${t}`),this.name="FetchError",this.status=t,this.data=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},Y=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,n;const r=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:r?.includes("application/json")?(n=await e.json(),t=n?.errorText??n?.message??n?.detailedError?.message):r?.includes("text/xml")&&(n=await e.text(),t=e.statusText),new q(e.status,t,n)},$=(e,t)=>new Promise((n,r)=>{if(t?.aborted)return void r(t.reason);const o=()=>{clearTimeout(a),r(t?.reason)},a=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})}),Z=async(t,n)=>{const r=e.instance.get().retry;if(!r)return t();const{initialWaitMs:o,backoffFactor:a,timeoutMs:i}=r,s=Date.now();let c=o,l=await t();for(;429===l.status;){const e=Number.parseInt(l.headers.get("retry-after")??"",10),r=Number.isFinite(e)?1e3*e:c;if(Date.now()-s+r>i)break;await l.text().catch(()=>{}),await $(r,n),c*=a,l=await t()}return l},z=()=>g()?"include":void 0,J=async(e,t,n)=>Y(await Z(()=>{const r=z(),{url:o,headers:a}=e instanceof URL?{url:e,headers:void 0}:e,i={headers:{...t,...a}};return r&&(i.credentials=r),n?.signal&&(i.signal=n.signal),fetch(o,i)},n?.signal)),Q=async(e,t,n)=>Y(await Z(()=>{const r=z(),o={method:"POST",body:JSON.stringify(e.data),headers:{...t,...e.headers,"Content-Type":"application/json"}};return r&&(o.credentials=r),n?.signal&&(o.signal=n.signal),fetch(e.url,o)},n?.signal)),X=async(e,t,n)=>{if("GET"===e.method)return J(e,t,n);if("POST"===e.method)return Q(e,t,n);throw new Error(`Unsupported HTTP method received: ${e.method}`)},ee=C.array(C.array(C.number())),te=C.object({type:C.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]),coordinates:C.union([C.array(C.number()),ee,C.array(C.array(C.array(C.number()))),C.array(C.array(C.array(C.array(C.number()))))]),radius:C.optional(C.number()),radiusMeters:C.optional(C.number()),bbox:C.optional(C.array(C.number()))}).check(C.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),ne=C.object({type:C.literal("Feature"),geometry:te,id:C.optional(C.union([C.string(),C.number()])),properties:C.unknown().optional(),bbox:C.optional(C.array(C.number()))}),re=C.object({type:C.literal("FeatureCollection"),features:C.array(ne),id:C.optional(C.union([C.string(),C.number()])),properties:C.unknown().optional(),bbox:C.optional(C.array(C.number()))}),oe=C.union([C.tuple([C.number().min(-180).max(180),C.number().min(-90).max(90)]),C.tuple([C.number().min(-180).max(180),C.number().min(-90).max(90),C.number()]),C.object({type:C.literal("Point"),coordinates:C.array(C.number())}),ne]),ae=C.union([C.array(C.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),C.array(C.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]),ie=C.union([te,ne,re]),se=C.union([ae,ie,C.array(ie)]),ce=C.object({query:C.string().optional(),position:oe.optional(),limit:C.number().max(100).optional(),extendedPostalCodesFor:C.array(C.string()).optional(),mapcodes:C.array(C.string()).optional(),view:C.enum(S).optional(),geographyTypes:C.array(C.string()).optional()}),le=C.object({indexes:C.array(C.string()).optional(),poiCategories:C.array(C.enum(f)).optional(),poiBrands:C.array(C.string()).optional(),connectors:C.array(C.string()).optional(),fuelTypes:C.array(C.string()).optional(),openingHours:C.string().optional(),timeZone:C.string().optional(),relatedPois:C.string().optional(),minPowerKW:C.number().optional(),maxPowerKW:C.number().optional(),minFuzzyLevel:C.number().optional(),maxFuzzyLevel:C.number().optional()}),ue=ce.extend(le.shape),de=C.object({type:C.literal("LineString"),coordinates:ee}),pe=C.object({type:C.literal("Feature"),geometry:de}),me=ee,ge=C.union([de,pe,me]),he=C.object({route:ge,maxDetourTimeSeconds:C.number().int().positive()}),ye=C.object({sortBy:C.enum(["detourTime","detourOffset"]).optional()}),fe=ue.extend({...he.shape,...ye.shape}),Te=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",Re=(e,t)=>{const n=e.length;if(n<=t)return e;const r=[];let o;const a=Math.ceil(n/t);for(o=0;o<n;o+=a)r.push(e[o]);return t>1&&o>=n-a&&(r.length<t?r.push(e[n-1]):r[r.length-1]=e[n-1]),r},be=e=>({...e.apiKey&&{"TomTom-Api-Key":e.apiKey},...!A(e.apiVersion)&&{"TomTom-Api-Version":String(e.apiVersion)}}),Ie=e=>({...be(e),...e.language&&{"Accept-Language":e.language}}),Se=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),t.apiKey&&e.append("key",t.apiKey),t.language&&e.append("language",t.language)},Ce=e=>be(e),ve=(e,t)=>{t.language&&e.append("language",t.language)},Ae=(e,t,n)=>{Array.isArray(n)&&n.length>0&&e.append(t,n.join(","))},Pe=(e,t,n)=>{!A(n)&&e.append(t,String(n))},Le=(e,t)=>{if(!t)return;if(void 0!==t.position)return((e,t)=>{const n=u(t);n&&(e.append("lat",String(n[1])),e.append("lon",String(n[0])))})(e,t.position),void Pe(e,"radius",t.radiusMeters);const n=o(t.boundingBox);n&&(e.append("topLeft",Te([n[3],n[0]])),e.append("btmRight",Te([n[1],n[2]])))},Me=(e,t)=>{const n=e.searchParams;ve(n,t),Pe(n,"limit",t.limit),Ae(n,"fuelSet",t.fuelTypes),Ae(n,"idxSet",t.indexes),Ae(n,"brandSet",t.poiBrands),t.poiCategories&&Ae(n,"categorySet",t.poiCategories.map(e=>T[e])),Ae(n,"connectorSet",t.connectors),Ae(n,"mapcodes",t.mapcodes),Ae(n,"extendedPostalCodesFor",t.extendedPostalCodesFor),Pe(n,"minPowerKW",t.minPowerKW),Pe(n,"maxPowerKW",t.maxPowerKW),Pe(n,"view",t.view),Pe(n,"openingHours",t.openingHours),Pe(n,"timeZone",t.timeZone),Pe(n,"relatedPois",t.relatedPois),Ae(n,"entityTypeSet",t.geographyTypes)},Ee=(e,t)=>e.customServiceBaseURL||`${e.commonBaseURL}/maps/orbis/places/${t}`,we=e=>{const t={count:0,statusCounts:{}};for(const n of e)for(const e of n.chargingPoints)t.count++,t.statusCounts[e.status]=(t.statusCounts[e.status]||0)+1;return t},De=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,xe=(e,t,n)=>{if(e)for(const r of e){const e=n.find(e=>De(r,e.connector));if(e){if(e.count++,t){const n=e.statusCounts;e.statusCounts[t]=(n[t]||0)+1}}else n.push({connector:r,count:1,statusCounts:t?{[t]:1}:{}})}},Oe=e=>{const t=[];return((e,t)=>{if(e)for(const n of e){const e=t.find(e=>De(n,e.connector));e?e.count++:t.push({connector:n,count:1})}})(e,t),t},Ne=e=>{const t=[];for(const n of e)for(const e of n.chargingPoints)xe(e.connectors,e.status,t);return t},Be=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",He=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},_e=e=>`${e[1]},${e[0]}`,Fe=e=>{let t,n;return(e=>void 0!==e.topLeftPoint)(e)?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],n=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=He(e.southWest),n=He(e.northEast)),[t[0],t[1],n[0],n[1]]},Ue=e=>[e.lon,e.lat],Ge=e=>{const{year:t,month:n,day:r}=(e=>{const t=e.split("-");return{year:Number.parseInt(t[0]),month:Number.parseInt(t[1]),day:Number.parseInt(t[2])}})(e.date);return{dateYYYYMMDD:e.date,year:t,month:n,day:r,hour:e.hour,minute:e.minute,date:new Date(t,n-1,r,e.hour,e.minute)}},ke=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,Ke=e=>{const t=e.timeRanges.map(e=>({start:Ge(e.startTime),end:Ge(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:ke(t)}},We=e=>{const{position:t,entryPoints:n,poi:r,id:o,dist:a,boundingBox:i,chargingPark:s,...c}=e,l=s?.connectors?.map(e=>({...M(e,"connectorType"),type:e.connectorType,chargingSpeed:Be(e.ratedPowerKW)}));return{type:"Feature",geometry:b(Ue(t)),...i&&{bbox:Fe(i)},id:o,properties:{...M(c,"viewport"),...a&&{distance:a},...n?.length&&{entryPoints:n.map(e=>({...e,position:Ue(e.position)}))},...l?.length&&{chargingPark:{...s,connectors:Oe(l)}},...r&&{poi:{name:r.name,categories:(r.categorySet?.map(e=>R[e.id])??[]).filter(e=>!!e),localizedCategories:r.categories??[],...r.phone&&{phone:r.phone},...r.brands&&{brands:r.brands.map(e=>e.name)},...r.url&&{url:r.url},...r.openingHours&&{openingHours:Ke(r.openingHours)},...r.timeZone&&{timeZone:r.timeZone}}}}}},je=e=>{const{geoBias:t,...n}=e;return{...t&&{geoBias:Ue(t)},...n}},Ve={requestValidation:{schema:fe},buildRequest:e=>{const t=new URL((e=>Ee(e,`searchAlongRoute/${encodeURIComponent(e.query??"")}.json`))(e));Me(t,e);const n=t.searchParams;return n.append("maxDetourTime",String(e.maxDetourTimeSeconds)),Pe(n,"sortBy",e.sortBy),Pe(n,"spreadingMode","plan"),{url:t,headers:Ce(e),data:{route:{points:(r=e.route,Array.isArray(r)?{type:"LineString",coordinates:r}:"Feature"===r.type?r.geometry:r).coordinates.map(e=>({lat:e[1],lon:e[0]}))}}};var r},sendRequest:Q,parseResponse:e=>{const t=e.results.map(We),n=a(o(t));return{type:"FeatureCollection",properties:{...je(e.summary)},features:t,...n&&{bbox:n}}}},qe=async e=>V(e,Ve,"AlongRouteSearch"),Ye=K.extend({id:C.string()}),$e=["fast","short","efficient","thrilling"],Ze=["all","unknown","none"],ze={requestValidation:{schema:Ye},buildRequest:e=>{const t=new URL((e=>Ee(e,"ev/id"))(e)),n=t.searchParams;return Se(n,e),n.append("id",e.id),t},sendRequest:J,parseResponse:e=>{const t=e.results?.[0];return t?{id:t.id,accessType:t.accessType,chargingStations:(n=t.chargingStations,n.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,connectors:e.connectors?.map(e=>({...e,chargingSpeed:Be(e.ratedPowerKW)}))}))}))),chargingPointAvailability:we(t.chargingStations),connectorAvailabilities:Ne(t.chargingStations),...t.openingHours&&{openingHours:Ke(t.openingHours)}}:void 0;var n},parseResponseError:(e,t)=>{const n=e.data?.detailedError?.message??e.message;return new _(n,t,e.status)}},Je=async e=>V(e,ze,"EVChargingStationsAvailability"),Qe=async(e,t)=>{const n=e.properties.dataSources?.chargingAvailability?.id;if(n)try{const r=await Je({...t,id:n}),o=e.properties.poi;return r?{...e,properties:{...e.properties,...o&&{poi:{...o,openingHours:r.openingHours}},chargingPark:{...e.properties.chargingPark,availability:r}}}:void 0}catch(r){return void console.error(r)}};async function Xe(e,t){const{excludeIfAvailabilityUnknown:n,...r}=t??{},a=[];for(const o of e.features){const e=await Qe(o,r);e?a.push(e):n||a.push(o)}return{...e,features:a,bbox:o(a)}}var et=e=>Boolean(e&&"availability"in e&&e.availability),tt=async(e,t,n)=>{const r="string"==typeof t?{query:t}:t,[o]=(await n({...r,limit:1})).features;if(!o)throw new Error(`${e}: no results found for "${r.query}"`);return o},nt=C.object({position:oe,radiusMeters:C.number().optional()}),rt=C.union([nt,C.object({boundingBox:se})]),ot=C.object({typeahead:C.boolean().optional(),offset:C.number().max(1900).optional(),geoBias:rt.optional(),countries:C.array(C.string()).optional()}),at=K.extend(ce.shape).extend(ot.shape).extend({query:C.string()}),it=e=>{const{position:t,boundingBox:n,dist:r,entryPoints:o,addressRanges:a,entityType:i,id:s,...c}=e;return{type:"Feature",geometry:b(Ue(t)),...n&&{bbox:Fe(n)},id:s,properties:{...M(c,"viewport"),...r&&{distance:r},...i&&{geographyType:i.split(",")},...o&&{entryPoints:o.map(e=>({...e,position:Ue(e.position)}))},...a&&{addressRanges:{...a,from:Ue(a.from),to:Ue(a.to)}}}}},st={requestValidation:{schema:at},buildRequest:e=>{const t=new URL(`${(e=>Ee(e,"geocode"))(e)}/${encodeURIComponent(e.query)}.json`),n=t.searchParams;return ve(n,e),e.typeahead&&n.append("typeahead",String(e.typeahead)),!A(e.limit)&&n.append("limit",String(e.limit)),!A(e.offset)&&n.append("ofs",String(e.offset)),Le(n,e.geoBias),e.countries&&n.append("countrySet",Te(e.countries)),e.extendedPostalCodesFor&&n.append("extendedPostalCodesFor",Te(e.extendedPostalCodesFor)),e.mapcodes&&n.append("mapcodes",Te(e.mapcodes)),e.view&&n.append("view",e.view),e.geographyTypes&&n.append("entityTypeSet",Te(e.geographyTypes)),{url:t,headers:Ce(e)}},sendRequest:J,parseResponse:e=>{const t=e.results.map(it),n=a(o(t));return{type:"FeatureCollection",features:t,...n&&{bbox:n}}}},ct=async e=>V(e,st,"Geocode"),lt=async e=>tt("geocodeOne",e,ct),ut=C.object({geometries:C.union([re,C.array(C.union([C.string(),ne])).min(1).max(20)])}),dt=C.object({zoom:C.number().min(0).max(22).optional()}),pt=ut.extend(dt.shape),mt=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),gt={requestValidation:{schema:pt},buildRequest:e=>{const t=new URL((e=>Ee(e,"additionalData.json"))(e)),n=t.searchParams;return((e,t)=>{let n;n=Array.isArray(t)?"string"==typeof t[0]?t:mt(t):mt(t.features),e.append("geometries",Te(n))})(n,e.geometries),Pe(n,"geometriesZoom",e.zoom),{url:t,headers:Ce(e)}},sendRequest:J,parseResponse:e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??s(),bbox:o(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:o(t),features:t}}};async function ht(e){const t=await V(e,gt,"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?t:((e,t)=>{const n=e.features.reduce((e,t)=>{const n=t.properties.dataSources?.geometry?.id;return n&&(e[n]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),r=t.features.map(e=>e.id&&n[e.id]?{...e,properties:n[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:r}})(e.geometries,t)}var yt=C.object({entityId:C.string()}),ft=C.object({mapcodes:C.array(C.string()).optional(),view:C.enum(S).optional(),openingHours:C.string().optional(),timeZone:C.string().optional(),relatedPois:C.string().optional()}),Tt=yt.extend(ft.shape),Rt={requestValidation:{schema:Tt},buildRequest:e=>{const t=new URL(`${(e=>Ee(e,"place.json"))(e)}`),n=t.searchParams;return ve(n,e),Pe(n,"entityId",e.entityId),Ae(n,"mapcodes",e.mapcodes),Pe(n,"view",e.view),Pe(n,"openingHours",e.openingHours),Pe(n,"timeZone",e.timeZone),Pe(n,"relatedPois",e.relatedPois),{url:t,headers:Ce(e)}},sendRequest:J,parseResponse:e=>e.results?.length?We(e.results[0]):void 0},bt=async e=>V(e,Rt,"PlaceDetails"),It=/* @__PURE__ */new Map,St=/* @__PURE__ */new Map,Ct="en-GB",vt=e=>e??Ct,At=e=>e.toLowerCase().replaceAll(/[\s\-_,]+/g,""),Pt=e=>{const t={};for(const n of e){const e=[n.name,...n.synonyms].map(At);for(const r of e)t[r]=n}return t},Lt=K.extend({filters:C.array(C.string()).optional()}),Mt=e=>{const t=R[e.id];return t?{code:t,name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>R[e]).filter(e=>!!e),synonyms:e.synonyms}:(console.error(`Received unknown POI category ID ${e.id} (${e.name}). This category will be skipped and unavailable for filtering.`),null)},Et={requestValidation:{schema:Lt},buildRequest:e=>{const t=Ee(e,"poiCategories.json"),n=new URL(t);return ve(n.searchParams,e),{url:n,headers:Ce(e)}},getAPIVersion:()=>1,sendRequest:J,parseResponse:e=>({poiCategories:e.poiCategories.map(Mt).filter(e=>null!==e)})},wt=(e,t)=>{const n=(e=>St.get(e??Ct)??{})(e),r=/* @__PURE__ */new Map;for(const o of t){const e=At(o);for(const[t,o]of Object.entries(n))t.includes(e)&&o&&r.set(o.code,o)}for(const o of r.values())for(const e of o.childCategoryCodes)r.delete(e);return[...r.values()]},Dt=async(e={})=>{const{language:t}=h(e);let n=(e=>It.get(vt(e)))(t);return n||(n=(await V(e,Et,"POICategories")).poiCategories,((e,t)=>{const n=vt(e);It.set(n,t),St.set(n,Pt(t))})(t,n)),e.filters?.length?{poiCategories:wt(t,e.filters)}:{poiCategories:n}},xt=async(e={})=>{const{poiCategories:t}=await Dt(e);return t.map(e=>e.code)},Ot=(e,t)=>{const{data:n,message:r,status:o}=e;return new _(n?.error?.description??n?.detailedError?.message??r,t,o)},Nt=(e,t)=>e*t/100,Bt=e=>"engineType"in e&&"electric"===e.engineType,Ht=e=>{if(Bt(e)&&e.model&&!("variantId"in e.model))return e.model.engine},_t=(e,t,n)=>{A(n)||(e[t]=String(n))},Ft=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),Ut=e=>{const t={};return e?(_t(t,"accelerationEfficiency",e.acceleration),_t(t,"decelerationEfficiency",e.deceleration),_t(t,"uphillEfficiency",e.uphill),_t(t,"downhillEfficiency",e.downhill),t):t},Gt=e=>{const t={};return e.speedsToConsumptionsKWH?.length&&(t.constantSpeedConsumptionInkWhPerHundredkm=Ft(e.speedsToConsumptionsKWH)),_t(t,"auxiliaryPowerInkW",e.auxiliaryPowerInkW),_t(t,"consumptionInkWhPerkmAltitudeGain",e.consumptionInKWHPerKMAltitudeGain),_t(t,"recuperationInkWhPerkmAltitudeLoss",e.recuperationInKWHPerKMAltitudeLoss),{...t,...Ut(e.efficiency)}},kt=e=>{const t=e.consumption,n={};return t.speedsToConsumptionsLiters?.length&&(n.constantSpeedConsumptionInLitersPerHundredkm=Ft(t.speedsToConsumptionsLiters)),_t(n,"auxiliaryPowerInLitersPerHour",t.auxiliaryPowerInLitersPerHour),_t(n,"fuelEnergyDensityInMJoulesPerLiter",t.fuelEnergyDensityInMJoulesPerLiter),{...n,...Ut(t.efficiency)}},Kt=e=>Ht(e)?.charging?.maxChargeKWH,Wt=e=>{const t={};return e.charging?.maxChargeKWH&&(t.maxChargeInkWh=String(e.charging.maxChargeKWH)),t},jt=e=>{const t=e.state?.currentChargeInkWh;if(!A(t))return t;const n=e.state?.currentChargePCT,r=Kt(e);return!A(n)&&r?Nt(r,n):void 0},Vt=e=>{const t={};return _t(t,"currentChargeInkWh",jt(e)),t},qt=e=>{const t={};return _t(t,"currentFuelInLiters",e.state?.currentFuelInLiters),t},Yt=e=>Bt(e)?e.preferences?.chargingPreferences:void 0,$t=(e,t)=>{for(const[n,r]of Object.entries(t))e.set(n,r)},Zt=C.number().positive(),zt=C.number().min(0),Jt=C.number().min(0).max(100),Qt=Zt.optional(),Xt=zt.optional(),en=C.number().min(0).max(1).optional(),tn=C.object({speedKMH:C.number(),consumptionUnitsPer100KM:C.number()}),nn={efficiency:C.object({acceleration:en,deceleration:en,uphill:en,downhill:en}).optional()},rn=C.array(tn).min(1).max(25),on=C.object({...nn,speedsToConsumptionsLiters:rn,auxiliaryPowerInLitersPerHour:Xt,fuelEnergyDensityInMJoulesPerLiter:C.number().min(1).optional()}),an=C.object({...nn,speedsToConsumptionsKWH:rn,auxiliaryPowerInkW:Xt,consumptionInKWHPerKMAltitudeGain:C.number().max(500).optional(),recuperationInKWHPerKMAltitudeLoss:Xt}),sn=C.object({currentType:C.enum(i),plugTypes:C.array(C.enum(y)).min(1),efficiency:en,baseLoadInkW:Xt,maxPowerInkW:Xt,maxVoltageInV:Xt,maxCurrentInA:Xt,voltageRange:C.object({minVoltageInV:Xt,maxVoltageInV:C.number().optional()}).optional()}),cn=C.object({stateOfChargeInkWh:zt,maxPowerInkW:Zt}),ln=C.object({maxChargeKWH:Zt,batteryCurve:C.array(cn).max(20).optional(),chargingConnectors:C.array(sn).min(1).optional(),chargingTimeOffsetInSec:Xt}),un=C.object({consumption:on}),dn=C.object({consumption:an,charging:ln.optional()}),pn=C.object({weightKG:Qt}).optional(),mn=C.object({variantId:C.string()}),gn=C.object({dimensions:pn,engine:C.union([un,dn]).optional()}),hn=C.union([mn,gn]).optional(),yn=C.object({heading:C.number().min(0).max(360).optional()}),fn=yn.extend({currentFuelInLiters:zt}),Tn=yn.extend({currentChargePCT:Jt}),Rn=yn.extend({currentChargeInkWh:zt}),bn=C.union([Tn,Rn]),In=C.object({minChargeAtDestinationPCT:Jt,minChargeAtChargingStopsPCT:C.number().min(0).max(50)}),Sn=C.object({minChargeAtDestinationInkWh:zt,minChargeAtChargingStopsInkWh:zt}),Cn=C.union([In,Sn]),vn=C.object({chargingPreferences:Cn.optional()}),An={model:hn,restrictions:C.object({maxSpeedKMH:C.number().min(0).max(250).optional(),tollTransponder:C.enum(Ze).optional()}).optional()},Pn=C.object({...An,engineType:C.undefined().optional(),state:yn.optional()}),Ln=C.object({...An,engineType:C.literal("combustion"),state:fn.optional()}),Mn=C.object({...An,engineType:C.literal("electric"),state:bn.optional(),preferences:vn.optional()}),En=C.union([C.discriminatedUnion("engineType",[Ln,Mn]),Pn]),wn=C.object({avoid:C.array(C.enum(n)).optional(),traffic:C.enum(["live","historical"]).optional(),routeType:C.enum($e).optional(),avoidAreas:C.array(se).max(10).optional()}),Dn=C.object({option:C.enum(["departAt","arriveBy"]),date:C.date()}),xn=C.object({costModel:wn.optional(),travelMode:C.string().optional(),vehicle:En.optional(),when:Dn.optional()}),On=["timeMinutes","remainingChargePCT","spentChargePCT","spentFuelLiters","distanceKM"],Nn=C.object({origin:oe,budget:C.object({type:C.enum(On),value:C.number().min(0)})}),Bn=C.enum(n).exclude(["alreadyUsedRoads"]),Hn=En.check(C.refine(e=>!(e.state&&"heading"in e.state),"vehicle.state.heading: calculateReachableRange has no vehicle heading parameter. Remove it, or use calculateRoute, which accepts it."),C.refine(e=>!("electric"===e.engineType&&e.preferences&&"chargingPreferences"in e.preferences),"vehicle.preferences.chargingPreferences: calculateReachableRange plans no charging stops. Remove them, or use calculateRoute, which plans stops for them.")),_n=Dn.check(C.refine(e=>"arriveBy"!==e.option,"when.arriveBy: calculateReachableRange has no arrival-time parameter. Use when.departAt instead, or omit when entirely.")),Fn=wn.extend({avoid:C.array(Bn).optional(),avoidAreas:C.unknown().optional()}).check(C.refine(e=>void 0===e.avoidAreas,"costModel.avoidAreas: calculateReachableRange has no avoid-areas parameter. Remove it — the other cost-model options are accepted.")),Un=C.object({when:_n.optional(),vehicle:Hn.optional(),costModel:Fn.optional(),maxFerryLengthMeters:C.number().min(0).optional(),smoothing:C.enum(["none","weak","strong"]).optional()}),Gn=xn.extend(Nn.extend(Un.shape).shape),kn=/* @__PURE__ */new Set(["spentChargePCT","remainingChargePCT"]),Kn={check:e=>!kn.has(e.budget.type)||!!e.vehicle&&void 0!==Kt(e.vehicle),message:"budget: a charge budget is a percentage of the battery, so it needs a capacity to convert against. Set vehicle.engineType to 'electric' and vehicle.model.engine.charging.maxChargeKWH, or budget by time or distance instead."},Wn={check:e=>"remainingChargePCT"!==e.budget.type||!!e.vehicle&&void 0!==jt(e.vehicle),message:"budget.remainingChargePCT: a range down to a remaining charge is measured from the charge the vehicle sets off with. Set vehicle.state.currentChargeInkWh or vehicle.state.currentChargePCT, or use spentChargePCT to budget a share of the battery instead."},jn={schema:Gn,refinements:[Kn,Wn]},Vn=e=>({...e.costModel?.routeType&&{routeType:e.costModel.routeType},...e.costModel?.traffic&&{traffic:e.costModel.traffic},...e.costModel?.avoid?.length&&{avoids:e.costModel.avoid},...e.travelMode&&{travelMode:e.travelMode},..."departAt"===e.when?.option&&e.when.date&&{departureDateTime:e.when.date.toISOString()}}),qn=e=>e.model&&"variantId"in e.model?e.model.variantId:void 0,Yn=e=>{const t={};return Bt(e)&&(t.vehicleEngineType="electric"),e.model&&!("variantId"in e.model)&&e.model.dimensions?.weightKG&&(t.vehicleWeightInKilograms=e.model.dimensions.weightKG),e.restrictions?.maxSpeedKMH&&(t.vehicleMaxSpeedInKilometersPerHour=e.restrictions.maxSpeedKMH),e.restrictions?.tollTransponder&&(t.vehicleHasElectronicTollCollectionTransponder=e.restrictions.tollTransponder),t},$n=(e,t)=>{const n=Ht(t),r=(e=>"engineType"in e&&"combustion"===e.engineType?e.model?.engine:void 0)(t);var o;$t(e.searchParams,Bt(t)?{...n&&(o=n,{...Gt(o.consumption),...Wt(o)}),...Vt(t)}:{...r&&kt(r),...qt(t)})},Zn=(e,t)=>{const n=qn(t);n&&e.searchParams.set("vehicleModelId",n),$n(e,t)},zn=e=>({origin:{type:"Point",coordinates:d(e.origin)},...Vn(e),...e.vehicle&&Yn(e.vehicle)}),Jn=e=>({...Ie(e),Attributes:"reachableRange(boundary)"}),Qn=Object.keys({origin:!0,budget:!0,costModel:!0,vehicle:!0,travelMode:!0,when:!0,maxFerryLengthMeters:!0,smoothing:!0}),Xn={requestValidation:jn,buildRequest:e=>{const t=(e=>new URL(e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`))(e);return((e,t)=>{const n=t.budget,r=t.vehicle&&Kt(t.vehicle);switch(n.type){case"timeMinutes":e.append("timeBudgetInSec",(60*n.value).toString());break;case"distanceKM":e.append("distanceBudgetInMeters",(1e3*n.value).toString());break;case"spentFuelLiters":e.append("fuelBudgetInLiters",n.value.toString());break;case"spentChargePCT":r&&e.append("energyBudgetInkWh",Nt(r,n.value).toString());break;case"remainingChargePCT":{const o=t.vehicle&&jt(t.vehicle);if(r&&void 0!==o){const t=Nt(r,n.value);e.append("energyBudgetInkWh",Math.max(0,o-t).toString())}break}}})(t.searchParams,e),Pe(t.searchParams,"maxFerryLengthInMeters",e.maxFerryLengthMeters),Pe(t.searchParams,"smoothing",e.smoothing??"strong"),e.vehicle&&Zn(t,e.vehicle),{method:"POST",url:t,data:zn(e),headers:Jn(e)}},sendRequest:X,parseResponse:(e,t)=>{const n={type:"Polygon",coordinates:[e.reachableRange.boundary.map(e=>[e.longitude,e.latitude])]};return{type:"Feature",geometry:n,bbox:o(n),properties:w(t,Qn)}},parseResponseError:Ot,getAPIVersion:()=>3},er=async e=>V(e,Xn,"Reachable Range"),tr=(...e)=>{const t=e.filter(e=>!!e);return t.length<2?t[0]:AbortSignal.any(t)},nr=async(e,t)=>{const n=[];for(const o of e){const e=tr(o.signal,t?.signal);try{n.push(await er({...o,...e&&{signal:e}}))}catch(a){if(!(a instanceof _)||403===a.status||429===a.status)throw a}}const r=o(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},rr={Country:"country",CountrySubdivision:"countrySubdivision",CountrySecondarySubdivision:"countrySecondarySubdivision",CountryTertiarySubdivision:"countryTertiarySubdivision",Municipality:"municipality",MunicipalitySubdivision:"municipalitySubdivision",MunicipalitySecondarySubdivision:"municipalitySecondarySubdivision",Neighbourhood:"neighborhood",PostalCodeArea:"postalCode"},or={AF:"AFG",AX:"ALA",AL:"ALB",DZ:"DZA",AS:"ASM",AD:"AND",AO:"AGO",AI:"AIA",AQ:"ATA",AG:"ATG",AR:"ARG",AM:"ARM",AW:"ABW",AU:"AUS",AT:"AUT",AZ:"AZE",BS:"BHS",BH:"BHR",BD:"BGD",BB:"BRB",BY:"BLR",BE:"BEL",BZ:"BLZ",BJ:"BEN",BM:"BMU",BT:"BTN",BO:"BOL",BQ:"BES",BA:"BIH",BW:"BWA",BV:"BVT",BR:"BRA",IO:"IOT",BN:"BRN",BG:"BGR",BF:"BFA",BI:"BDI",CV:"CPV",KH:"KHM",CM:"CMR",CA:"CAN",KY:"CYM",CF:"CAF",TD:"TCD",CL:"CHL",CN:"CHN",CX:"CXR",CC:"CCK",CO:"COL",KM:"COM",CG:"COG",CD:"COD",CK:"COK",CR:"CRI",CI:"CIV",HR:"HRV",CU:"CUB",CW:"CUW",CY:"CYP",CZ:"CZE",DK:"DNK",DJ:"DJI",DM:"DMA",DO:"DOM",EC:"ECU",EG:"EGY",SV:"SLV",GQ:"GNQ",ER:"ERI",EE:"EST",SZ:"SWZ",ET:"ETH",FK:"FLK",FO:"FRO",FJ:"FJI",FI:"FIN",FR:"FRA",GF:"GUF",PF:"PYF",TF:"ATF",GA:"GAB",GM:"GMB",GE:"GEO",DE:"DEU",GH:"GHA",GI:"GIB",GR:"GRC",GL:"GRL",GD:"GRD",GP:"GLP",GU:"GUM",GT:"GTM",GG:"GGY",GN:"GIN",GW:"GNB",GY:"GUY",HT:"HTI",HM:"HMD",VA:"VAT",HN:"HND",HK:"HKG",HU:"HUN",IS:"ISL",IN:"IND",ID:"IDN",IR:"IRN",IQ:"IRQ",IE:"IRL",IM:"IMN",IL:"ISR",IT:"ITA",JM:"JAM",JP:"JPN",JE:"JEY",JO:"JOR",KZ:"KAZ",KE:"KEN",KI:"KIR",KP:"PRK",KR:"KOR",KW:"KWT",KG:"KGZ",LA:"LAO",LV:"LVA",LB:"LBN",LS:"LSO",LR:"LBR",LY:"LBY",LI:"LIE",LT:"LTU",LU:"LUX",MO:"MAC",MG:"MDG",MW:"MWI",MY:"MYS",MV:"MDV",ML:"MLI",MT:"MLT",MH:"MHL",MQ:"MTQ",MR:"MRT",MU:"MUS",YT:"MYT",MX:"MEX",FM:"FSM",MD:"MDA",MC:"MCO",MN:"MNG",ME:"MNE",MS:"MSR",MA:"MAR",MZ:"MOZ",MM:"MMR",NA:"NAM",NR:"NRU",NP:"NPL",NL:"NLD",NC:"NCL",NZ:"NZL",NI:"NIC",NE:"NER",NG:"NGA",NU:"NIU",NF:"NFK",MK:"MKD",MP:"MNP",NO:"NOR",OM:"OMN",PK:"PAK",PW:"PLW",PS:"PSE",PA:"PAN",PG:"PNG",PY:"PRY",PE:"PER",PH:"PHL",PN:"PCN",PL:"POL",PT:"PRT",PR:"PRI",QA:"QAT",RE:"REU",RO:"ROU",RU:"RUS",RW:"RWA",BL:"BLM",SH:"SHN",KN:"KNA",LC:"LCA",MF:"MAF",PM:"SPM",VC:"VCT",WS:"WSM",SM:"SMR",ST:"STP",SA:"SAU",SN:"SEN",RS:"SRB",SC:"SYC",SL:"SLE",SG:"SGP",SX:"SXM",SK:"SVK",SI:"SVN",SB:"SLB",SO:"SOM",ZA:"ZAF",GS:"SGS",SS:"SSD",ES:"ESP",LK:"LKA",SD:"SDN",SR:"SUR",SJ:"SJM",SE:"SWE",CH:"CHE",SY:"SYR",TW:"TWN",TJ:"TJK",TZ:"TZA",TH:"THA",TL:"TLS",TG:"TGO",TK:"TKL",TO:"TON",TT:"TTO",TN:"TUN",TR:"TUR",TM:"TKM",TC:"TCA",TV:"TUV",UG:"UGA",UA:"UKR",AE:"ARE",GB:"GBR",US:"USA",UM:"UMI",UY:"URY",UZ:"UZB",VU:"VUT",VE:"VEN",VN:"VNM",VG:"VGB",VI:"VIR",WF:"WLF",EH:"ESH",YE:"YEM",ZM:"ZMB",ZW:"ZWE"},ar=e=>or[e]??e,ir={street:"Street",area:"Geography",address:"Point Address"},sr=Object.fromEntries(Object.entries(rr).map(([e,t])=>[t,e])),cr=e=>{const{street:t,houseNumber:n,countryCodeIso2:r,...o}=e;return{...o,...t&&{streetName:t},...n&&{streetNumber:n},...r&&{countryCode:r,countryCodeISO3:ar(r)}}},lr=C.object({position:oe}),ur=C.object({geographyTypes:C.array(C.enum(l)).optional(),heading:C.number().min(-360).max(360).optional(),radiusMeters:C.number().positive().max(5e6).optional(),view:C.enum(S).optional()}),dr=lr.extend(ur.shape),pr={requestValidation:{schema:dr},buildRequest:e=>{const[t,n]=d(e.position),r=new URL((e=>Ee(e,"reverseGeocode"))(e)),o=r.searchParams;return o.append("position",`${t},${n}`),!A(e.radiusMeters)&&o.append("radiusInMeters",String(e.radiusMeters)),e.geographyTypes&&o.append("areaTypes",e.geographyTypes.map(e=>rr[e]).join(",")),!A(e.heading)&&o.append("vehicleHeadingInDegrees",String(e.heading)),e.view&&o.append("geopoliticalView",e.view),{url:r,headers:{...Ie(e),Attributes:"results(*)"}}},getAPIVersion:()=>2,sendRequest:J,parseResponse:(e,t)=>{const n=e.results[0];return{type:"Feature",geometry:b(d(t.position)),id:n?.id??s(),...n&&{properties:{type:ir[n.type],address:{freeformAddress:n.title,...cr(n.address)},...n.areaType&&{geographyType:[sr[n.areaType]],dataSources:{geometry:{id:n.id}}},...n.accessPoints?.length&&{entryPoints:n.accessPoints.map(e=>({position:e.position.coordinates}))},originalPosition:n.position.coordinates}}}}},mr=async e=>V(e,pr,"ReverseGeocode"),gr=["tollVignette","tollRoad","roadShields","importantRoadStretch"],hr=e=>{const t=["summary","legs(summary,path)"],n=e.sectionTypes;if(!n||n.length>0){t.push("sections");const r=!n;for(const e of gr)(r||n.includes(e))&&t.push(`sections.${e}`);e.guidance&&(r||n.includes("lanes"))&&t.push("sections.lanes")}0!==e.extendedRouteRepresentations?.length&&t.push("progressPoints"),e.guidance&&t.push("instructions(*,nextRoadInformation.roadShields.iconReference,previousRoadInformation.roadShields.iconReference,signpost.exitIconReference,distanceToPreviousTrafficLightInMeters)");const r=`routes(${t.join(",")})`;return e.guidance?`roadShieldAtlasReference,${r}`:r},yr=e=>{const t=e.state?.heading;return{...Yn(e),...!A(t)&&{vehicleHeadingInDegrees:t}}},fr=(e,t)=>{Zn(e,t),$t(e.searchParams,(e=>{const t=Yt(e),n={};if(!t)return n;const r=t;if(!A(r.minChargeAtDestinationInkWh)||!A(r.minChargeAtChargingStopsInkWh))return _t(n,"minChargeAtDestinationInkWh",r.minChargeAtDestinationInkWh),_t(n,"minChargeAtChargingStopsInkWh",r.minChargeAtChargingStopsInkWh),n;const o=Kt(e);if(!o)return n;const a=t;return A(a.minChargeAtDestinationPCT)||(n.minChargeAtDestinationInkWh=String(Nt(o,a.minChargeAtDestinationPCT))),A(a.minChargeAtChargingStopsPCT)||(n.minChargeAtChargingStopsInkWh=String(Nt(o,a.minChargeAtChargingStopsPCT))),n})(t))},Tr=e=>!!e.vehicle&&!!Yt(e.vehicle),Rr="vehicle.model.variantId is only supported for EV routes with charging stops: set vehicle.preferences.chargingPreferences, or describe the vehicle with vehicle.model.dimensions and vehicle.model.engine instead.",br=e=>{const t=(e=>Array.isArray(e)?e:e.geometry.coordinates)(e),n=(e=>{if(!Array.isArray(e))return e.properties?.sections?.leg})(e);if(n&&n.length>1&&n.every(e=>null!=e.startPointIndex&&null!=e.endPointIndex)){const e=n.map(e=>{const n=e.startPointIndex??0,r=e.endPointIndex??0;return{coordinate:t[n],legToNext:{path:{type:"LineString",coordinates:t.slice(n,r+1)}}}});return e.push({coordinate:t[n.at(-1)?.endPointIndex??t.length-1]}),e}return[{coordinate:t[0],legToNext:{path:{type:"LineString",coordinates:t}}},{coordinate:t.at(-1)??t[0]}]},Ir=e=>{if(!Array.isArray(e)&&"properties"in e)return e.properties??void 0},Sr=e=>{const t=e.options;if(!t)return{};const n={...t.pauseDurationSeconds&&{pauseDurationInSeconds:t.pauseDurationSeconds},...t.candidateEntryPoints?.length&&{entryPoints:(r=t.candidateEntryPoints,{type:"MultiPoint",coordinates:r.map(e=>d(e))}),...!A(t.preferredEntryPointIndex)&&{preferredEntryPointIndex:t.preferredEntryPointIndex}}};var r;return{...t.legCostModel?.routeType&&{routeType:t.legCostModel.routeType},...t.legCostModel?.avoid?.length&&{avoids:t.legCostModel.avoid.map(e=>({name:e}))},...Object.keys(n).length>0&&{routeStop:n}}},Cr=(e,t)=>{t.computeTravelTimeFor&&e.searchParams.set("computeTravelTimeFor",t.computeTravelTimeFor)},vr=C.union([oe,te]),Ar=C.union([ee,ne]),Pr=C.object({locations:C.array(C.union([vr,Ar])).min(1)}),Lr=C.object({arrivalSide:C.enum(["any","curb"]).optional(),chargingStopsStrategy:C.enum(["automaticFastest","manualFastest","automaticFastestWithFallbackToManual"]).optional(),computeTravelTimeFor:C.enum(["none","all"]).optional(),maxAlternatives:C.number().min(0).max(5).optional(),sectionTypes:C.array(C.enum(m)).optional()}),Mr={schema:xn.extend(Pr.extend(Lr.shape).shape),refinements:[{check:e=>{const t=e.locations.map(p),n=t.filter(e=>"waypoint"===e).length,r=t.filter(e=>"path"===e).length;return n>=2||r>=1},message:"At least 2 waypoints or 1 path (route reconstruction) is required."},{check:e=>!e.chargingStopsStrategy||Tr(e),message:"chargingStopsStrategy: set vehicle.preferences.chargingPreferences as well — an EV route needs a minimum charge at the destination, which only the charging preferences provide."},{check:e=>!(e.vehicle&&qn(e.vehicle))||Tr(e),message:Rr},{check:e=>{const t=e.locations.at(-1);return!t||"waypoint"!==p(t)||!t.properties?.pauseDurationSeconds},message:"pauseDurationSeconds is not supported on the destination: the routing API requires the wait on the last leg to be 0."}]},Er={other:"unknown",accident:"accident",fog:"fog",danger:"dangerousConditions",rain:"rain",frost:"ice",jam:"jam","lane-closed":"laneClosed","road-closed":"roadClosed",roadworks:"roadWorks",wind:"wind",flooding:"flooding","broken-down-vehicle":"brokenDownVehicle"},wr=new Map(Object.entries(Er)),Dr=new Map(I.map(e=>[Er[e],e])),xr=new Map(Object.entries({unknown:"unknown",minor:"minor",moderate:"moderate",major:"major",undefined:"indefinite"})),Or=e=>wr.get(e)??e,Nr=e=>Dr.get(e)??"other",Br=e=>xr.get(e)??"unknown",Hr=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},_r=(e,t)=>{const n=e.chargingConnectionInfo,r=e.chargingParkLocation,o=[r.coordinate.longitude,r.coordinate.latitude],a=[r.street,r.houseNumber].filter(Boolean),i=a.length>0?a.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:o},properties:{...M(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",address:{freeformAddress:i,...r.street&&{streetName:r.street},...r.houseNumber&&{streetNumber:r.houseNumber},...r.city&&{municipality:r.city},...r.region&&{countrySubdivision:r.region},...r.postalCode&&{postalCode:r.postalCode},...r.country&&{country:r.country}},...n&&{chargingConnectionInfo:{plugType:n.chargingPlugType,currentInA:n.chargingCurrentInA,voltageInV:n.chargingVoltageInV,chargingPowerInkW:n.chargingPowerInkW,currentType:Hr(n.chargingCurrentType),chargingSpeed:Be(n.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:Be(e.chargingParkPowerInkW)}}}},Fr=(e,t)=>{const n=t?.vehicle&&Kt(t.vehicle);return{lengthInMeters:e.lengthInMeters,travelTimeInSeconds:e.travelDurationInSeconds,trafficDelayInSeconds:e.trafficDelayDurationInSeconds??0,trafficLengthInMeters:e.trafficLengthInMeters??0,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,departureTime:new Date(e.departureDateTime),arrivalTime:new Date(e.arrivalDateTime),deviationDistanceInMeters:e.deviationDistanceInMeters,deviationTimeInSeconds:e.deviationDurationInSeconds,...e.deviationPoint&&{deviationPoint:e.deviationPoint.coordinates},fuelConsumptionInLiters:e.fuelConsumptionInLiters,totalChargingTimeInSeconds:e.totalChargingTimeInSeconds,batteryConsumptionInkWh:e.batteryConsumptionInKilowattHours??e.batteryConsumptionInkWh,...n&&(()=>{const t=e.batteryConsumptionInKilowattHours??e.batteryConsumptionInkWh;return t?{batteryConsumptionInPCT:100*t/n}:void 0})(),remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...n&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/n},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:_r(e.chargingInformationAtEndOfLeg,n)}}},Ur=(e,t)=>e.reduce((n,r,o)=>{const a=r.path.coordinates.length,i=0===o?0:n[o-1]?.endPointIndex;let c;A(i)||(c=0===i?Math.max(a-1,0):i+a);const l=((e,t)=>{if(!t)return;const n=new Date(e.summary.arrivalDateTime).getTime(),r=new Date(t.summary.departureDateTime).getTime();if(Number.isNaN(n)||Number.isNaN(r))return;const o=Math.round((r-n)/1e3);return o>0?o:void 0})(r,e[o+1]),{originalWaypointIndexAtEndOfLeg:u}=r.summary;return n.push({...!A(i)&&{startPointIndex:i},...void 0!==c&&{endPointIndex:c},...!A(u)&&{originalWaypointIndex:u},summary:{...Fr(r.summary,t),...void 0!==l&&{stopTimeInSeconds:l}},id:s()}),n},[]),Gr=e=>({id:s(),startPointIndex:e.startPathIndex,endPointIndex:e.endPathIndex}),kr=(e,t)=>{const n={leg:Ur(e.legs,t)},r=e.sections;if(!r)return n;const o=(e,t)=>{t?.length&&(n[e]=t.map(Gr))};return o("carTrain",r.carTrain),o("ferry",r.ferry),o("tunnel",r.tunnel),o("motorway",r.motorway),o("pedestrian",r.pedestrian),o("toll",r.toll),o("tollRoad",r.tollRoad),o("carpool",r.carpool),o("urban",r.urban),o("unpaved",r.unpaved),o("lowEmissionZone",r.lowEmissionZone),r.country?.length&&(n.country=r.country.map(e=>({...Gr(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:ar(e.countryCodeIso2??"")}))),r.travelMode?.length&&(n.vehicleRestricted=r.travelMode.filter(e=>"other"===e.travelMode).map(Gr)),r.traffic?.length&&(n.traffic=r.traffic.map(e=>{return{...Gr(e),delayInSeconds:e.delayDurationInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKilometersPerHour,categories:(t=e,t.tec?.causes?.length?t.tec.causes.map(e=>{switch(e.mainCauseCode){case 1:return"jam";case 2:return"accident";case 3:return"roadworks";case 4:return"narrow-lanes";case 5:return"road-closed";case 9:return"danger";case 11:return"animals-on-road";case 13:return"broken-down-vehicle";case 16:return"lane-closed";case 17:return"wind";case 18:return"fog";case 19:return"rain";case 22:return"frost";case 23:return"flooding";default:return"other"}}):[Nr(t.iconCategory)]),magnitudeOfDelay:Br(e.delayMagnitude),tec:e.tec,...e.eventId&&{eventId:e.eventId}};var t})),r.speedLimit?.length&&(n.speedLimit=r.speedLimit.map(e=>{const t=e.speedRestrictions?.find(e=>"maximum"===e.type)?.inKilometersPerHour;return A(t)?void 0:{...Gr(e),maxSpeedLimitInKmh:t}}).filter(e=>!!e)),r.lanes?.length&&(n.lanes=r.lanes.map(e=>({...Gr(e),lanes:(e.lanes??[]).map(e=>({directions:e.directions.map(e=>$r[e]??e),...e.follow&&{follow:$r[e.follow]??e.follow}})),laneSeparators:(e.laneSeparators??[]).map(e=>Zr[e]??e),properties:e.properties}))),r.roadShields?.length&&(n.roadShields=r.roadShields.map(e=>({...Gr(e),roadShieldReferences:e.roadShieldReferences}))),r.tollVignette?.length&&(n.tollVignette=r.tollVignette.map(e=>({...Gr(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:ar(e.countryCodeIso2??"")}))),r.importantRoadStretch?.length&&(n.importantRoadStretch=r.importantRoadStretch.map(e=>({...Gr(e),index:e.importantRoadStretchIndex,...e.streetName&&{streetName:e.streetName.text},...e.roadNumbers?.length&&{roadNumbers:e.roadNumbers.map(e=>e.text)}}))),((e,t)=>{if(!t)return;const n=new Set(t);for(const r of Object.keys(e))"leg"===r||n.has(r)||delete e[r]})(n,t.sectionTypes),n},Kr=1e-4,Wr=(e,t)=>Math.abs(e[0]-t[0])<Kr&&Math.abs(e[1]-t[1])<Kr,jr={depart:"DEPART",waypointLeft:"WAYPOINT_LEFT",waypointRight:"WAYPOINT_RIGHT",waypointReached:"WAYPOINT_REACHED",waypointAhead:"WAYPOINT_AHEAD",arrive:"ARRIVE",arriveLeft:"ARRIVE_LEFT",arriveRight:"ARRIVE_RIGHT",arriveAhead:"ARRIVE_AHEAD",continueStraight:"STRAIGHT",keepLeft:"KEEP_LEFT",keepRight:"KEEP_RIGHT",turnSlightRight:"SLIGHT_RIGHT",turnRight:"TURN_RIGHT",turnSharpRight:"SHARP_RIGHT",turnSlightLeft:"SLIGHT_LEFT",turnLeft:"TURN_LEFT",turnSharpLeft:"SHARP_LEFT",makeUTurn:"MAKE_UTURN",roundaboutStraight:"ROUNDABOUT_STRAIGHT",roundaboutSharpRight:"ROUNDABOUT_SHARP_RIGHT",roundaboutRight:"ROUNDABOUT_RIGHT",roundaboutSlightRight:"ROUNDABOUT_SLIGHT_RIGHT",roundaboutSlightLeft:"ROUNDABOUT_SLIGHT_LEFT",roundaboutLeft:"ROUNDABOUT_LEFT",roundaboutSharpLeft:"ROUNDABOUT_SHARP_LEFT",roundaboutBack:"ROUNDABOUT_BACK",exitRoundabout:"EXIT_ROUNDABOUT",exitMotorwayLeft:"EXIT_MOTORWAY_LEFT",exitMotorwayRight:"EXIT_MOTORWAY_RIGHT",switchMotorwayLeft:"SWITCH_MOTORWAY_LEFT",switchMotorwayRight:"SWITCH_MOTORWAY_RIGHT",enterCarpoolLaneLeft:"ENTER_CARPOOL_LANE_LEFT",enterCarpoolLaneRight:"ENTER_CARPOOL_LANE_RIGHT",exitCarpoolLaneLeft:"EXIT_CARPOOL_LANE_LEFT",exitCarpoolLaneRight:"EXIT_CARPOOL_LANE_RIGHT",mergeLeftLane:"MERGE_LEFT_LANE",mergeRightLane:"MERGE_RIGHT_LANE",takeShipFerry:"TAKE_SHIP_FERRY",takeCarTrain:"TAKE_CAR_TRAIN",leaveShipFerry:"LEAVE_SHIP_FERRY",leaveCarTrain:"LEAVE_CAR_TRAIN",crossBorder:"CROSS_BORDER",passTollgate:"TOLLGATE"},Vr={urban:"URBAN",motorway:"MOTORWAY",controlledAccess:"CONTROLLED_ACCESS"},qr={endOfRoad:"END_OF_ROAD",atTrafficLight:"AT_TRAFFIC_LIGHT",onToBridge:"ON_TO_BRIDGE",onBridge:"ON_BRIDGE",afterBridge:"AFTER_BRIDGE",intoTunnel:"INTO_TUNNEL",insideTunnel:"INSIDE_TUNNEL",afterTunnel:"AFTER_TUNNEL"},Yr={cashCoinsAndBills:"CASH_COINS_AND_BILLS",cashBillsOnly:"CASH_BILLS_ONLY",cashCoinsOnly:"CASH_COINS_ONLY",cashExactChange:"CASH_EXACT_CHANGE",creditCard:"CREDIT_CARD",debitCard:"DEBIT_CARD",travelCard:"TRAVEL_CARD",etc:"ETC",etcTransponder:"ETC_TRANSPONDER",etcVideoCamera:"ETC_VIDEO_CAMERA",subscription:"SUBSCRIPTION"},$r={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",rightUTurn:"RIGHT_U_TURN",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",leftUTurn:"LEFT_U_TURN"},Zr={unknown:"UNKNOWN",noMarking:"NO_MARKING",longDashed:"LONG_DASHED",doubleSolid:"DOUBLE_SOLID",singleSolid:"SINGLE_SOLID",solidDashed:"SOLID_DASHED",dashedSolid:"DASHED_SOLID",shortDashed:"SHORT_DASHED",shadedAreaMarking:"SHADED_AREA_MARKING",dashedBlocks:"DASHED_BLOCKS",doubleDashed:"DOUBLE_DASHED",crossingAlert:"CROSSING_ALERT",physicalDivider:"PHYSICAL_DIVIDER",physicalDividerLessThan3m:"PHYSICAL_DIVIDER_LESS_THAN_3M",physicalDividerGuardrail:"PHYSICAL_DIVIDER_GUARDRAIL",curb:"CURB"},zr={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",back:"BACK"},Jr={regular:"REGULAR",small:"SMALL"},Qr={left:"LEFT",right:"RIGHT",leftAndRight:"LEFT_AND_RIGHT"},Xr={properties:[]},eo=e=>({text:e.text}),to=e=>({properties:(e.properties??[]).map(e=>Vr[e]??e.toUpperCase()),...e.roadNames?.length&&{streetName:eo(e.roadNames[0].identifier)},...e.countryCodeIso2&&{countryCode:ar(e.countryCodeIso2)},...e.roadShields?.length&&{roadShields:e.roadShields.map(e=>({roadNumber:e.roadNumber?eo(e.roadNumber):{text:""},countryCode:ar(e.countryCodeIso2??""),...e.countrySubdivisionCodeIso&&{stateCode:e.countrySubdivisionCodeIso},...e.iconReference&&{roadShieldReference:e.iconReference}}))}}),no=e=>({...e.tollgateName&&{tollgateName:eo(e.tollgateName)},...e.tollPaymentTypes?.length&&{tollPaymentTypes:e.tollPaymentTypes.map(e=>Yr[e]??e)},...e.countryCrossingFromName&&{countryCrossingFromName:eo(e.countryCrossingFromName)},...e.countryCrossingFromCodeIso2&&{countryCrossingFromCode:ar(e.countryCrossingFromCodeIso2)},...e.countryCrossingToName&&{countryCrossingToName:eo(e.countryCrossingToName)},...e.countryCrossingToCodeIso2&&{countryCrossingToCode:ar(e.countryCrossingToCodeIso2)}}),ro=e=>zr[e]??e,oo=e=>{return{...e.message&&{message:e.message},...e.intersectionName&&{intersectionName:eo(e.intersectionName)},...e.drivingSide&&{drivingSide:e.drivingSide.toUpperCase()},...e.landmark&&{landmark:qr[e.landmark]??e.landmark},...!A(e.distanceToPreviousTrafficLightInMeters)&&{trafficLightOffsetInMeters:e.distanceToPreviousTrafficLightInMeters},...e.sideRoads&&{sideRoads:(n=e.sideRoads,n.map(e=>({side:Qr[e.side]??e.side,offsetFromManeuverInMeters:e.offsetFromManeuverInMeters,...!A(e.isDrivable)&&{isDrivable:e.isDrivable}})))},...e.maneuverView&&{maneuverView:(t=e.maneuverView,{...t.onRouteAngle&&{onRouteAngle:ro(t.onRouteAngle)},offRouteAngles:(t.offRouteAngles??[]).map(ro)})},...e.roundaboutType&&{roundaboutType:Jr[e.roundaboutType]??e.roundaboutType},...!A(e.isManeuverObligatory)&&{isManeuverObligatory:e.isManeuverObligatory},...!A(e.changeOfAngleInDegrees)&&{changeOfAngleInDegrees:e.changeOfAngleInDegrees},...!A(e.ambiguousExitOffsetFromManeuverInMeters)&&{offsetOfAmbiguousExitFromManeuverInMeters:e.ambiguousExitOffsetFromManeuverInMeters},...!A(e.roundaboutExitNumber)&&{roundaboutExitNumber:e.roundaboutExitNumber}};var t,n},ao=(e,t)=>{const n=e.signpost?(e=>{if(e.exitName||e.exitNumber||e.towardName)return{...e.exitName&&{exitName:eo(e.exitName)},...e.exitNumber&&{exitNumber:eo(e.exitNumber)},towardName:e.towardName?eo(e.towardName):{text:""}}})(e.signpost):void 0,r=(e.nextRoadInformation?.roadShields??[]).map(e=>e.iconReference).filter(e=>!!e);return{...n&&{signpost:n},...t&&{roadShieldAtlasReference:t},...r.length&&{roadShieldReferences:r},...e.signpost?.exitIconReference&&{signpostRoadShieldReferences:[e.signpost.exitIconReference]}}},io=(e,t,n,r)=>({maneuverPoint:t,pathPointIndex:n,routeOffsetInMeters:e.routeOffsetInMeters,maneuver:e.maneuver?jr[e.maneuver]??e.maneuver:e.maneuver,routePath:(e.routePath??[]).map(e=>({point:e.point.coordinates,distanceInMeters:e.distanceFromRouteStartInMeters,travelTimeInSeconds:e.travelTimeFromRouteStartInSeconds})),nextRoadInfo:e.nextRoadInformation?to(e.nextRoadInformation):Xr,previousRoadInfo:e.previousRoadInformation?to(e.previousRoadInformation):Xr,...oo(e),...ao(e,r),...no(e)}),so=(e,t,n)=>{const r=[];let o=0;for(const a of e){const e=a.maneuverPoint.coordinates;for(let n=o;n<t.length;n++)if(Wr(t[n],e)){o=n;break}r.push(io(a,e,o,n))}return{instructions:r}},co={requestValidation:Mr,buildRequest:e=>{const t=e.locations.map(p).includes("path"),n=((e,t)=>{const n=[];for(const r of e)if("waypoint"===p(r)){const e=Ir(r),o=e?.candidateEntryPoints?.length?"ignore":t,[a,i]=d(r,{useEntryPoint:o});n.push({coordinate:[a,i],...e&&{options:e}})}else n.push(...br(r));return n})(e.locations,e.useEntryPoints),r=(e=>{const t={type:"Point",coordinates:e[0].coordinate},n={type:"Point",coordinates:(e.at(-1)??e[0]).coordinate},r=e.slice(1,-1);return{origin:t,destination:n,...r.length&&{waypoints:{type:"MultiPoint",coordinates:r.map(e=>e.coordinate)}}}})(n),a=(e=>{return{...Vn(e),...e.maxAlternatives&&{maxPathAlternativeRoutes:e.maxAlternatives},..."arriveBy"===e.when?.option&&e.when.date&&{arrivalDateTime:e.when.date.toISOString()},...e.guidance&&{guidance:"instructions",instructionPhonetics:"ipa"},...e.costModel?.avoidAreas?.length&&{avoidAreas:(t=e.costModel.avoidAreas,{rectangles:t.map(e=>{const t=o(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");const[n,r,a,i]=t;return{type:"Feature",bbox:[n,r,a,i],geometry:null}})})},...e.arrivalSide&&{arrivalSidePreference:"curb"===e.arrivalSide?"curbSide":"anySide"}};var t})(e),i=(e=>({...Ie(e),Attributes:hr(e)}))(e),s=((e,t)=>{const n=e.slice(1).map((t,n)=>({...e[n].legToNext,...Sr(t)}));if(t||!n.every(e=>0===Object.keys(e).length))return n})(n,t),c={routePlanningLocations:r,...a,...s&&{legs:s},...e.vehicle&&yr(e.vehicle)};if(Tr(e)){const t=((e,t,n)=>{const r=e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/calculateLongDistanceEVRoute`,o=new URL(r);fr(o,e.vehicle),e.chargingStopsStrategy&&o.searchParams.set("chargingStopsStrategy",e.chargingStopsStrategy);const a=Ht(e.vehicle)?.charging;if(!qn(e.vehicle)&&!a?.chargingConnectors?.length)throw new Error("Charging preferences require a charging model: set vehicle.model.engine.charging.chargingConnectors (or a predefined vehicle.model.variantId) to plan charging stops.");return{method:"POST",url:o,data:{...t,...a&&{chargingParameters:{...a.batteryCurve?.length&&{batteryCurve:a.batteryCurve},...a.chargingConnectors?.length&&{chargingConnectors:[...a.chargingConnectors]},...!A(a.chargingTimeOffsetInSec)&&{chargingTimeOffsetInSec:a.chargingTimeOffsetInSec}}},vehicleEngineType:"electric"},headers:n}})(e,c,i);return Cr(t.url,e),t}if(e.vehicle&&qn(e.vehicle))throw new Error(Rr);const l=e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/routing/routes/calculate`,u=new URL(l);return e.vehicle&&$n(u,e.vehicle),Cr(u,e),{method:"POST",url:u,data:c,headers:i}},sendRequest:X,parseResponse:(e,t)=>{const n=e.routes.map((n,r)=>((e,t,n,r)=>{const a={type:"LineString",coordinates:e.legs.flatMap(e=>e.path.coordinates)};return{type:"Feature",geometry:a,id:s(),bbox:o(a),properties:{index:t,summary:Fr(e.summary,n),sections:kr(e,n),...e.instructions?.length&&{guidance:so(e.instructions,a.coordinates,r)},...e.progressPoints&&{progress:e.progressPoints.map(e=>({pointIndex:e.pathIndex,distanceInMeters:e.distanceInMeters,travelTimeInSeconds:e.travelDurationInSeconds}))}}}})(n,r,t,e.roadShieldAtlasReference)),r=o(n);return{type:"FeatureCollection",...r&&{bbox:r},features:n}},parseResponseError:Ot,getAPIVersion:()=>3},lo=async e=>V(e,co,"Routing"),uo=C.object({minFuzzyLevel:C.number().min(1).max(4).optional(),maxFuzzyLevel:C.number().min(1).max(4).optional()}),po=ue.extend(ot.extend(uo.shape).shape),mo=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:Ue(e.details)}};break;case"NEARBY":t={...e,details:{position:Ue({lon:e.details.lon,lat:e.details.lat}),text:e.details.text,query:e.details.query}};break;case"BOOKMARK":case"W3W":t=e}return t},go={requestValidation:{schema:po},buildRequest:e=>{const t=new URL(`${(e=>Ee(e,`search/${encodeURIComponent(e.query??"")}.json`))(e)}`);Me(t,e);const n=t.searchParams;return Pe(n,"typeahead",e.typeahead),Pe(n,"ofs",e.offset),Ae(n,"countrySet",e.countries),Le(n,e.geoBias),Pe(n,"minFuzzyLevel",e.minFuzzyLevel),Pe(n,"maxFuzzyLevel",e.maxFuzzyLevel),{url:t,headers:Ce(e)}},sendRequest:J,parseResponse:e=>{const t=e.results.map(We),n=a(o(t)),r=e.summary.queryIntent?.map(mo);return{type:"FeatureCollection",properties:{...je(e.summary),...r&&{queryIntent:r}},features:t,...n&&{bbox:n}}}},ho=C.object({geometries:C.array(C.union([re,te]))}),yo=ue.extend(ho.shape),fo=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:_e(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:Re(e.coordinates[0],50).map(e=>_e(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const n=r(e[0]);if(n){const r=Math.abs((n[2]-n[0])*(n[3]-n[1]));t.set(e,r)}}),t=new Map([...t.entries()].sort((e,t)=>t[1]-e[1]).splice(0,50)),[...t.keys()]})(e).flatMap(e=>fo({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>fo({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>fo(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},To={requestValidation:{schema:yo},buildRequest:e=>{const t=new URL(`${n=e,Ee(n,`geometrySearch/${encodeURIComponent(n.query??"")}.json`)}`);var n;return Me(t,e),{url:t,headers:Ce(e),data:{geometryList:e.geometries.flatMap(fo)}}},sendRequest:Q,parseResponse:e=>{const t=e.results.map(We),n=a(o(t));return{type:"FeatureCollection",properties:{...je(e.summary)},features:t,...n&&{bbox:n}}}},Ro=async e=>"route"in e?qe(e):"geometries"in e?(async e=>V(e,To,"GeometrySearch"))(e):(async e=>V(e,go,"FuzzySearch"))(e),bo=async e=>tt("discoverOnePlace",e,Ro),Io=C.object({query:C.string()}),So=C.object({geoBias:nt.optional(),limit:C.number().max(100).optional(),countries:C.array(C.string()).optional(),resultTypes:C.array(C.string()).optional()}),Co=Io.extend(So.shape),vo={requestValidation:{schema:Co},buildRequest:e=>{const t=new URL(`${n=e,Ee(n,`autocomplete/${encodeURIComponent(n.query)}.json`)}`);var n;const r=t.searchParams;return e.language=e.language??"en-GB",ve(r,e),Pe(r,"limit",e.limit),Le(r,e.geoBias),Ae(r,"countrySet",e.countries),Ae(r,"resultSet",e.resultTypes),{url:t,headers:Ce(e)}},sendRequest:J,parseResponse:e=>{const{position:t,...n}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:Ue(t)},radiusMeters:n.radius}},results:(r=e.results,r.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...n}=e;return{...n,category:R[Number(t)]}}return e})})))};var r}},Ao=async e=>V(e,vo,"Autocomplete"),Po=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"").toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean),Lo=e=>"category"===e.type&&e.matchedAlternativeName?[e.value,e.matchedAlternativeName]:[e.value],Mo=(e,t)=>{const n=t.flatMap(({segments:t})=>{const[n]=t;return 1===t.length&&"plaintext"!==n.type&&Lo(n).some(t=>((e,t)=>{const n=Po(t).join(""),r=Po(e);return""!==n&&r.some((e,t)=>r.slice(t).join("").startsWith(n))})(t,e))?[n]:[]});return n.find(t=>Lo(t).some(t=>((e,t)=>{const[n,...r]=Po(t);return 0===r.length&&Po(e).some(e=>e.startsWith(n)&&2*n.length>=e.length)})(t,e)))??n[0]},Eo=({query:e,concept:t,places:n,maxResults:r})=>{const o=D(n,e=>e.id),a="none"===t.status?o:E(o,t=>((e,t)=>{const n=Po(e);return Po(t).every(e=>n.some(t=>t.startsWith(e)))})(t.title,e)).flat();return[..."shown"===t.status?[t.suggestion]:[],...a].slice(0,r)},wo="SearchSuggestions",Do={brand:!0,category:!0},xo=e=>e in Do,Oo={place:["POI"],address:["PAD","Addr","XStr"],street:["Str"],area:["Geo"]},No={POI:"place",Street:"street",Geography:"area","Point Address":"address","Address Range":"address","Cross Street":"address"},Bo=e=>e*Math.PI/180,Ho=(e,t)=>e.properties.distance??(t&&(([e,t],[n,r])=>{const o=Math.sin(Bo(r-t)/2)**2+Math.cos(Bo(t))*Math.cos(Bo(r))*Math.sin(Bo(n-e)/2)**2;return 12742017.6*Math.asin(Math.sqrt(o))})(t,e.geometry.coordinates)),_o=(e,t)=>{const n=u(t)??void 0,r=((e,t)=>{if(t)return L(e,e=>Ho(e,t))?.properties.address.countryCode;const n=v(e,e=>e.properties.address.countryCode);return P(Object.keys(n),e=>n[e])})(e,n);return e.map(e=>((e,t,n)=>{const{type:r,address:o,poi:a}=e.properties,i=o.freeformAddress.split(", ").filter(Boolean),[s="",...c]=a?.name?[a.name,...i]:i,l=o.countryCode!==t?o.country:void 0;return{kind:No[r],id:String(e.id),title:s,subtitles:l?[...c,l]:c,distanceInMeters:Ho(e,n),resolve:async()=>({...e,properties:M(e.properties,["distance","score"])})}})(e,r,n))},Fo=e=>{if(e instanceof F)throw new F(wo,e.cause);if(e instanceof _)throw new _(e.message,wo,e.status);if(e instanceof B)throw new B(e.message,wo,e.issues);throw e},Uo=(e,t)=>{const n={...t,..."brand"===e.type?{poiBrands:[e.value]}:{poiCategories:[e.category]}},r={title:e.value,refineParams:n,refine:e=>Ro({...n,...e&&{signal:e}})};return"brand"===e.type?{...r,kind:"brand"}:{...r,kind:"category",category:e.category}},Go=(e,t)=>D(e.flatMap(e=>e.segments.flatMap(e=>"plaintext"===e.type?[]:[Uo(e,t)])),e=>`${e.kind}:${e.title}`),ko=(e,t,n,r)=>{const o=Mo(e,t);return o?"brand"!==o.type||((e,t)=>{const n=Po(e).join("");return t.slice(0,5).some(e=>e.properties.poi?.brands?.some(e=>Po(e).join("")===n))})(o.value,n)?{status:"shown",suggestion:Uo(o,r)}:{status:"withheld"}:{status:"none"}},Ko=async e=>{const{query:t,maxResults:n,filters:r,origin:o,view:a,signal:i,...s}=e,c=r?.countries,l=Math.max(1,Math.min(n??5,10)),{placeKinds:u,refinementKinds:d,wantsPlaces:p,wantsRefinements:m}=(e=>{const t=e?.filter(e=>!xo(e)),n=e?.filter(xo);return{placeKinds:t,refinementKinds:n,wantsPlaces:!e||Boolean(t?.length),wantsRefinements:!e||Boolean(n?.length)}})(r?.kinds),g=o&&{position:o},h=(r?.boundingBox&&{boundingBox:r.boundingBox})??g,y={...M(s,["onAPIRequest","onAPIResponse","apiVersion"]),query:"",countries:c,geoBias:h,view:a},f={...s,signal:i,query:t,limit:10,countries:c,view:a,typeahead:!0,geoBias:h,indexes:u?.flatMap(e=>Oo[e]),poiCategories:r?.poiTypes,geographyTypes:r?.areaTypes},[T,R]=await Promise.all([p?Ro(f):void 0,m?Ao({...s,signal:i,query:t,limit:l,countries:c,geoBias:g,resultTypes:d??["brand","category"]}):void 0]).catch(Fo),b=R?.results??[];if(!p)return{suggestions:Go(b,y).slice(0,l)};const I=(T?.features??[]).filter(e=>!u||u.includes(No[e.properties.type]));return{suggestions:Eo({query:t,concept:ko(t,b,I,y),places:_o(I,o),maxResults:l})}},Wo=864e5,jo=(e,t)=>{const n=new Date(e);return n.setUTCDate(n.getUTCDate()+t),n},Vo=e=>jo(/* @__PURE__ */new Date,-e),qo=e=>e instanceof Date?e.toISOString().slice(0,10):e,Yo=e=>Date.parse(qo(e)),$o=/(?:Z|[+-]\d{2}:\d{2})$/,Zo=e=>new Date($o.test(e)?e:`${e}Z`),zo=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],Jo={speed:{dataType:"SPEED",field:"v"},freeFlowSpeed:{dataType:"FREE_FLOW_SPEED",field:"fv"},congestionLevel:{dataType:"CONGESTION_LEVEL",field:"c"},travelTime:{dataType:"TRAVEL_TIME",field:"t"},networkLength:{dataType:"NETWORK_LENGTH",field:"l"}},Qo=Array.from({length:24},(e,t)=>t),Xo=e=>zo.indexOf(e),ea=(e,n)=>{const r={};for(const o of t){const t=e[Jo[o].field];void 0!==t&&(r[o]=n(t))}return r},ta=e=>ea(e,e=>e),na=e=>t.find(t=>Jo[t].dataType===e),ra=e=>{const t=Zo(e);return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,date:new Date(Yo(t)),hour:t.getUTCHours()}},oa={yearly:({year:e})=>({year:e}),monthly:({year:e,month:t})=>({year:e,month:t}),weekly:({date:e})=>(e=>{const t=jo(e,4-(e.getUTCDay()||7)),n=t.getUTCFullYear(),r=(t.getTime()-Date.UTC(n,0,1))/Wo;return{year:n,week:Math.floor(r/7)+1}})(e),daily:({date:e})=>({date:e}),hourly:({date:e,hour:t})=>({date:e,hour:t})},aa=(e,t)=>e.map(e=>({...oa[t](ra(e.time)),...ta(e)})),ia={MONDAY:1,TUESDAY:2,WEDNESDAY:3,THURSDAY:4,FRIDAY:5,SATURDAY:6,SUNDAY:7},sa=e=>{const[t,n]=e.time.split("-"),r=Object.hasOwn(ia,t)?ia[t]:void 0;return void 0===r?void 0:{day:r,hour:Number(n),...ta(e)}},ca=({day:e,hour:t})=>24*(e-1)+t,la=e=>({tileCentre:[e.lon,e.lat],...ta(e)}),ua=e=>({startDate:Zo(e.startDate),endDate:Zo(e.endDate),labels:e.labels.map(({name:e})=>e)}),da=e=>{return{...e.yearly&&{yearly:aa(e.yearly,"yearly")},...e.monthly&&{monthly:aa(e.monthly,"monthly")},...e.weekly&&{weekly:aa(e.weekly,"weekly")},...e.daily&&{daily:aa(e.daily,"daily")},...e.hourly&&{hourly:aa(e.hourly,"hourly")},...e.average&&{average:(t=e.average,t.map(sa).filter(e=>void 0!==e).sort((e,t)=>ca(e)-ca(t)))}};var t},pa=e=>ea(e,e=>e.map(ua)),ma=e=>{return{type:e.type,id:e.id,geometry:e.geometry,properties:(t=e.properties,{name:t.name,...void 0!==t.timezone&&{timezone:t.timezone},level:t.level,baseData:ta(t.baseData),timedData:da(t.timedData),...t.tiledData&&{tiledData:{tiles:t.tiledData.tiles.map(la)}},...t.anomalies&&{anomalies:pa(t.anomalies)}}),bbox:o(e.geometry)};var t},ga=e=>{const n=e.flatMap(e=>e.properties.tiledData?.tiles??[]),r={};for(const o of t){const e=n.map(e=>e[o]).filter(e=>null!=e);e.length>0&&(r[o]={min:Math.min(...e),max:Math.max(...e)})}return r},ha=e=>{const t=e.map(Yo);return{startDate:new Date(Math.min(...t)),endDate:new Date(Math.max(...t))}},ya=C.union([C.date(),C.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]),fa=C.union([C.object({type:C.literal("Polygon"),coordinates:C.array(C.array(C.array(C.number()))).min(1)}),C.object({type:C.literal("MultiPolygon"),coordinates:C.array(C.array(C.array(C.array(C.number())))).min(1)})]),Ta=e=>Yo(e)<=Yo(Vo(2)),Ra={requestValidation:{schema:K.extend({name:C.string().optional(),startDate:ya.optional(),endDate:ya.optional(),days:C.array(ya).min(1).optional(),metrics:C.union([C.array(C.enum(t)).min(1),C.literal("all")]),functionalRoadClasses:C.union([C.array(C.enum(zo)).min(1),C.literal("all")]),hours:C.union([C.array(C.number().int().min(0).max(23)).min(1),C.literal("all")]),geometry:fa}).refine(e=>{const t=void 0!==e.days,n=void 0!==e.startDate;if(t&&n)return!1;if(!t&&!n)return!1;if(void 0!==e.startDate){const t=e.endDate??Vo(3),n=(Yo(t)-Yo(e.startDate))/Wo;return n>=1&&n<=31}return!0},{message:"Provide either startDate (with optional endDate, at least 1 day apart and within 31 days) or days — but not both"}).refine(e=>void 0!==e.days?e.days.every(Ta):void 0===e.endDate||Ta(e.endDate),{message:"Dates must be at least 2 days before today"})},buildRequest:e=>{const n=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));Se(n.searchParams,e);const r=Array.isArray(e.days)?{days:e.days.map(qo)}:{startDate:qo(e.startDate??Vo(4)),endDate:qo(e.endDate??Vo(3))};return{method:"POST",url:n,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...r,dataTypes:("all"===e.metrics?t:e.metrics).map(e=>Jo[e].dataType),frcs:"all"===e.functionalRoadClasses?zo.map((e,t)=>t):e.functionalRoadClasses.map(Xo),hours:"all"===e.hours?Qo:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},sendRequest:X,parseResponse:e=>{const t=e.features.map(ma);return{type:"FeatureCollection",properties:{...ha(e.properties.days),metrics:e.properties.dataTypes.map(na).filter(e=>void 0!==e),heatmap:e.properties.heatmap,frcs:e.properties.frcs,ranges:ga(t)},features:t}}},ba=async e=>V(e,Ra,"TrafficAreaAnalytics"),Ia=["incidents.type","incidents.geometry.type","incidents.geometry.coordinates",...Object.keys({id:!0,iconCategory:!0,magnitudeOfDelay:!0,"events.description":!0,"events.code":!0,"events.iconCategory":!0,startTime:!0,endTime:!0,from:!0,to:!0,lengthInMeters:!0,delayInSeconds:!0,roadNumbers:!0,timeValidity:!0,probabilityOfOccurrence:!0,numberOfReports:!0,lastReportTime:!0}).map(e=>`incidents.properties.${e}`)].join(","),Sa=e=>({description:e.description,code:e.code,category:Nr(e.iconCategory)}),Ca=e=>{const t=e.properties;return{type:"Feature",id:t.id,geometry:e.geometry,properties:{id:t.id,category:Nr(t.iconCategory),magnitudeOfDelay:Br(t.magnitudeOfDelay),events:(t.events??[]).map(Sa),...t.startTime&&{startTime:new Date(t.startTime)},...t.endTime&&{endTime:new Date(t.endTime)},...t.from&&{from:t.from},...t.to&&{to:t.to},...null!=t.lengthInMeters&&{lengthInMeters:t.lengthInMeters},...null!=t.delayInSeconds&&{delayInSeconds:t.delayInSeconds},...t.roadNumbers&&{roadNumbers:t.roadNumbers},timeValidity:t.timeValidity,...t.probabilityOfOccurrence&&{probabilityOfOccurrence:t.probabilityOfOccurrence},...null!=t.numberOfReports&&{numberOfReports:t.numberOfReports},...t.lastReportTime&&{lastReportTime:new Date(t.lastReportTime)}}}},va=e=>"Polygon"===e.type?{type:"Polygon",coordinates:e.coordinates}:{type:"MultiPolygon",coordinates:e.coordinates},Aa=(e,t)=>{const n=(e=>"FeatureCollection"===e.type?e.features.map(e=>e.geometry):["Feature"===e.type?e.geometry:e])(t).map(va).map(e=>({geometry:e,bbox:x(e)}));return e.filter(e=>{const t=x(e.geometry);return n.some(n=>{return r=t,o=n.bbox,r[0]<=o[2]&&o[0]<=r[2]&&r[1]<=o[3]&&o[1]<=r[3]&&O(e.geometry,n.geometry);var r,o})})},Pa=C.array(C.number()).min(2,"a position needs at least two coordinates"),La=C.array(Pa).min(4,"a linear ring needs at least four positions"),Ma=C.array(La).min(1,"a Polygon needs at least one ring"),Ea=C.discriminatedUnion("type",[C.object({type:C.literal("Polygon"),coordinates:Ma}),C.object({type:C.literal("MultiPolygon"),coordinates:C.array(Ma).min(1,"a MultiPolygon needs at least one polygon")})]),wa=C.object({type:C.literal("Feature"),geometry:Ea,id:C.union([C.string(),C.number()]).optional(),properties:C.unknown().optional()}),Da=C.union([Ea,wa,C.object({type:C.literal("FeatureCollection"),features:C.array(wa).min(1,"a FeatureCollection polygon needs at least one feature")})]),xa={requestValidation:{schema:K.extend({bbox:se.optional(),polygon:Da.optional(),ids:C.array(C.string()).min(1,"ids must contain at least one id").optional(),categoryFilter:C.array(C.enum(I)).optional(),timeValidityFilter:C.array(C.enum(["present","future"])).optional()}),refinements:[{check:e=>1===[e.bbox,e.polygon,e.ids].filter(Boolean).length,message:"Provide exactly one of bbox, polygon or ids"}]},getAPIVersion:()=>2,buildRequest:e=>{const t=new URL((e=>e.customServiceBaseURL??`${e.commonBaseURL}/maps/orbis/traffic/incidents/details`)(e)),n=t.searchParams;((e,t)=>{Ae(e,"iconCategories",t.categoryFilter?.map(Or)),Ae(e,"timeValidity",t.timeValidityFilter)})(n,e);const r=(e=>({...Ie(e),Attributes:Ia}))(e);if(e.ids){const{ids:o}=e;return o.length>5?{method:"POST",url:t,headers:r,data:{ids:o}}:(n.append("ids",o.join(",")),{method:"GET",url:t,headers:r})}const a=e.polygon?x(e.polygon,{recompute:!0}):o(e.bbox);return a&&n.append("bbox",a.join(",")),{method:"GET",url:t,headers:r}},sendRequest:X,parseResponse:(e,t)=>{const n=(e.incidents??[]).filter(e=>null!==e).map(Ca);return{type:"FeatureCollection",features:t?.polygon?Aa(n,t.polygon):n}}},Oa=async e=>V(e,xa,"TrafficIncidentDetails");export{H as APIErrorCode,F as SDKAbortError,B as SDKError,_ as SDKServiceError,qe as alongRouteSearch,On as budgetTypes,G as buildResponseError,k as buildValidationError,er as calculateReachableRange,nr as calculateReachableRanges,lo as calculateRoute,bo as discoverOnePlace,Ro as discoverPlaces,Je as evChargingStationsAvailability,ct as geocode,lt as geocodeOne,ht as geometryData,Dt as getPOICategories,xt as getPOICategoryCodes,bt as getPlaceDetails,Qe as getPlaceWithEVAvailability,Xe as getPlacesWithEVAvailability,Ko as getSearchSuggestions,et as hasChargingAvailability,U as parseDefaultResponseError,mr as reverseGeocode,$e as routeTypes,Ze as tollTransponderOptions,ba as trafficAreaAnalytics,Oa as trafficIncidentDetails};
1
+ import{TomTomConfig,areaAnalyticsMetricKeys,avoidableTypes,bboxFromCoordsArray,bboxFromGeoJSON,bboxOnlyIfWithArea,connectorTypes,currentTypes,generateId,generateTomTomHeaders,geographyTypes,getPosition,getPositionStrict,getRoutePlanningLocationType,inputSectionTypesWithGuidance,isProxyCredentialsMode,mergeFromGlobal,plugTypes,poiCategories,poiCategoriesToID,poiIDsToCategories,toPointGeometry,trafficIncidentRequestCategories,views}from"@tomtom-org/maps-sdk/core";import{z}from"zod";import{countBy,isNil,maxBy,minBy,omit,partition,pick,uniqBy}from"lodash-es";import{bbox,booleanIntersects}from"@turf/turf";var APICode=/* @__PURE__ */function(e){return e[e.TOO_MANY_REQUESTS=429]="TOO_MANY_REQUESTS",e[e.FORBIDDEN=403]="FORBIDDEN",e}({}),SDKError=class e extends Error{constructor(t,a,r){super(t),this.service=a,this.issues=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},APIErrorCode={[APICode.TOO_MANY_REQUESTS]:"Too Many Requests: The API Key is over QPS (Queries per second)",[APICode.FORBIDDEN]:"Request failed with status code 403"},SDKServiceError=class extends SDKError{constructor(e,t,a){super(e,t),this.status=a,this.status&&APIErrorCode[this.status]&&(this.message=APIErrorCode[this.status])}},SDKAbortError=class extends SDKError{constructor(e,t){super("The operation was aborted.",e),this.name="AbortError",this.cause=t}},parseDefaultResponseError=(e,t)=>{const{data:a,message:r,status:o}=e;return new SDKServiceError(a?.error||a?.errorText||r,t,o)},buildResponseError=(e,t,a,r)=>{if(r?.aborted&&e===r.reason)return new SDKAbortError(t,r.reason);if(r?.aborted&&"AbortError"===e?.name)return new SDKAbortError(t,r.reason);if(e.status){const r=e;return a?a(r,t):parseDefaultResponseError(r,t)}return new SDKError(e.message,t)},buildValidationError=(e,t)=>new SDKError(e.message,t,e.issues),commonServiceRequestSchema=z.object({apiKey:z.string().optional(),commonBaseURL:z.string().optional(),language:z.string().optional()}),formatZodIssue=(e,t=0)=>{const a=e.path.length>0?`${e.path.join(".")}: `:"";if("invalid_union"===e.code){const r=e.unionErrors;if(r?.length)return`${a}no matching union member (${r.map((e,a)=>`option[${a}]: { ${e.issues.map(e=>formatZodIssue(e,t+1)).join(", ")} }`).join(" | ")})`}return`${a}${e.message}`},ValidationError=class extends Error{constructor(e){super(`${e.issues.map(e=>formatZodIssue(e)).join("; ")}\nIssues: ${JSON.stringify(e.issues,null,2)}`),this.issues=e.issues}},callService=async(e,t,a)=>{if(e.signal?.aborted)throw new SDKAbortError(a,e.signal.reason);const r={...mergeFromGlobal(e),apiVersion:t.apiVersion??1};if(void 0===e.validateRequest||e.validateRequest)try{((e,t)=>{const a=(t?.schema?commonServiceRequestSchema.extend(t.schema.shape):commonServiceRequestSchema).superRefine((e,a)=>{if("commonBaseURL"in e||a.addIssue({code:"custom",message:"commonBaseURL is required"}),t?.refinements?.length)for(const r of t.refinements)r.check(e)||a.addIssue({code:"custom",message:r.message})}).safeParse(e);if(!a.success)throw new ValidationError(a.error)})(r,t.requestValidation)}catch(i){throw buildValidationError(i,a)}const o=t.buildRequest(r),n=generateTomTomHeaders(r);e.onAPIRequest?.(o);try{const a=await t.sendRequest(o,n,{signal:e.signal});return e.onAPIResponse?.(o,a),t.parseResponse(await a.data,r)}catch(i){throw e.onAPIResponse?.(o,i),buildResponseError(i,a,t.parseResponseError,e.signal)}},FetchError=class e extends Error{constructor(t,a,r){super(a??`HTTP Error ${t}`),this.name="FetchError",this.status=t,this.data=r,Error.captureStackTrace&&Error.captureStackTrace(this,e)}},returnOrThrow=async e=>{if(e.ok)return{data:await e.json(),status:e.status};let t,a;const r=e.headers.get("content-type");throw e.bodyUsed?t=e.statusText:r?.includes("application/json")?(a=await e.json(),t=a?.errorText??a?.message??a?.detailedError?.message):r?.includes("text/xml")&&(a=await e.text(),t=e.statusText),new FetchError(e.status,t,a)},sleep=(e,t)=>new Promise((a,r)=>{if(t?.aborted)return void r(t.reason);const o=()=>{clearTimeout(n),r(t?.reason)},n=setTimeout(()=>{t?.removeEventListener("abort",o),a()},e);t?.addEventListener("abort",o,{once:!0})}),fetchWithRetry=async(e,t)=>{const a=TomTomConfig.instance.get().retry;if(!a)return e();const{initialWaitMs:r,backoffFactor:o,timeoutMs:n}=a,i=Date.now();let s=r,c=await e();for(;429===c.status;){const a=Number.parseInt(c.headers.get("retry-after")??"",10),r=Number.isFinite(a)?1e3*a:s;if(Date.now()-i+r>n)break;await c.text().catch(()=>{}),await sleep(r,t),s*=o,c=await e()}return c},proxyModeCredentials=()=>isProxyCredentialsMode()?"include":void 0,get=async(e,t,a)=>returnOrThrow(await fetchWithRetry(()=>{const r=proxyModeCredentials(),{url:o,headers:n}=e instanceof URL?{url:e,headers:void 0}:e,i={headers:{...t,...n}};return r&&(i.credentials=r),a?.signal&&(i.signal=a.signal),fetch(o,i)},a?.signal)),post=async(e,t,a)=>returnOrThrow(await fetchWithRetry(()=>{const r=proxyModeCredentials(),o={method:"POST",body:JSON.stringify(e.data),headers:{...t,...e.headers,"Content-Type":"application/json"}};return r&&(o.credentials=r),a?.signal&&(o.signal=a.signal),fetch(e.url,o)},a?.signal)),fetchWith=async(e,t,a)=>{if("GET"===e.method)return get(e,t,a);if("POST"===e.method)return post(e,t,a);throw new Error(`Unsupported HTTP method received: ${e.method}`)},lineStringCoordsSchema=z.array(z.array(z.number())),geometrySchema$1=z.object({type:z.enum(["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection","Circle"]),coordinates:z.union([z.array(z.number()),lineStringCoordsSchema,z.array(z.array(z.array(z.number()))),z.array(z.array(z.array(z.array(z.number()))))]),radius:z.optional(z.number()),radiusMeters:z.optional(z.number()),bbox:z.optional(z.array(z.number()))}).check(z.refine(e=>"Circle"!==e.type||Boolean(e.radius),'type: "Circle" must have radius property')),featureSchema=z.object({type:z.literal("Feature"),geometry:geometrySchema$1,id:z.optional(z.union([z.string(),z.number()])),properties:z.unknown().optional(),bbox:z.optional(z.array(z.number()))}),featureCollectionSchema=z.object({type:z.literal("FeatureCollection"),features:z.array(featureSchema),id:z.optional(z.union([z.string(),z.number()])),properties:z.unknown().optional(),bbox:z.optional(z.array(z.number()))}),hasLngLatSchema=z.union([z.tuple([z.number().min(-180).max(180),z.number().min(-90).max(90)]),z.tuple([z.number().min(-180).max(180),z.number().min(-90).max(90),z.number()]),z.object({type:z.literal("Point"),coordinates:z.array(z.number())}),featureSchema]),geoJsonbBoxSchema=z.union([z.array(z.number()).refine(e=>4===e.length,{message:"BBox must have 4 elements"}),z.array(z.number()).refine(e=>6===e.length,{message:"BBox must have 6 elements"})]),GeoJSONSchema=z.union([geometrySchema$1,featureSchema,featureCollectionSchema]),hasBBoxSchema=z.union([geoJsonbBoxSchema,GeoJSONSchema,z.array(GeoJSONSchema)]),commonPlacesParamsSchema=z.object({query:z.string().optional(),position:hasLngLatSchema.optional(),limit:z.number().max(100).optional(),extendedPostalCodesFor:z.array(z.string()).optional(),mapcodes:z.array(z.string()).optional(),view:z.enum(views).optional()}),geographicFiltersSchema=z.object({countries:z.array(z.string()).optional()}),placeFiltersSchema=z.object({poiCategories:z.array(z.enum(poiCategories)).optional(),poiBrands:z.array(z.string()).optional(),indexes:z.array(z.string()).optional(),geographyTypes:z.array(z.enum(geographyTypes)).optional(),connectors:z.array(z.enum(connectorTypes)).optional(),fuelTypes:z.array(z.string()).optional(),minPowerKW:z.number().optional(),maxPowerKW:z.number().optional()}),searchFiltersSchema=geographicFiltersSchema.extend(placeFiltersSchema.shape),searchExtraParamsOptional=z.object({filters:placeFiltersSchema.optional(),openingHours:z.string().optional(),timeZone:z.string().optional(),relatedPois:z.string().optional(),minFuzzyLevel:z.number().optional(),maxFuzzyLevel:z.number().optional()}),commonSearchParamsSchema=commonPlacesParamsSchema.extend(searchExtraParamsOptional.shape),lineStringSchema=z.object({type:z.literal("LineString"),coordinates:lineStringCoordsSchema}),routeFeatureSchema=z.object({type:z.literal("Feature"),geometry:lineStringSchema}),positionsArraySchema=lineStringCoordsSchema,routeSchema=z.union([lineStringSchema,routeFeatureSchema,positionsArraySchema]),alongRouteSearchRequestMandatory=z.object({route:routeSchema,maxDetourTimeSeconds:z.number().int().positive()}),alongRouteSearchRequestOptional=z.object({sortBy:z.enum(["detourTime","detourOffset"]).optional()}),alongRouteSearchRequestSchema=commonSearchParamsSchema.extend({...alongRouteSearchRequestMandatory.shape,...alongRouteSearchRequestOptional.shape}),arrayToCSV=e=>e?Array.isArray(e)?e.join(","):"string"==typeof e?e:String(e):"",sampleWithinMaxLength=(e,t)=>{const a=e.length;if(a<=t)return e;const r=[];let o;const n=Math.ceil(a/t);for(o=0;o<a;o+=n)r.push(e[o]);return t>1&&o>=a-n&&(r.length<t?r.push(e[a-1]):r[r.length-1]=e[a-1]),r},buildCredentialHeaders=e=>({...e.apiKey&&{"TomTom-Api-Key":e.apiKey},...!isNil(e.apiVersion)&&{"TomTom-Api-Version":String(e.apiVersion)}}),buildCommonServiceRequestHeaders=e=>({...buildCredentialHeaders(e),...e.language&&{"Accept-Language":e.language}}),appendCommonParams=(e,t)=>{e.append("apiVersion",String(t.apiVersion)),t.apiKey&&e.append("key",t.apiKey),t.language&&e.append("language",t.language)},buildPlacesRequestHeaders=e=>buildCredentialHeaders(e),appendPlacesLanguageParam=(e,t)=>{t.language&&e.append("language",t.language)},appendEVModelVersionParam=e=>{e.append("evModelVersion","3")},appendByJoiningParamValue=(e,t,a)=>{Array.isArray(a)&&a.length>0&&e.append(t,a.join(","))},appendOptionalParam=(e,t,a)=>{!isNil(a)&&e.append(t,String(a))},appendGeoBiasParams=(e,t)=>{if(!t)return;if(void 0!==t.position)return((e,t)=>{const a=getPosition(t);a&&(e.append("lat",String(a[1])),e.append("lon",String(a[0])))})(e,t.position),void appendOptionalParam(e,"radius",t.radiusMeters);const a=bboxFromGeoJSON(t.boundingBox);a&&(e.append("topLeft",arrayToCSV([a[3],a[0]])),e.append("btmRight",arrayToCSV([a[1],a[2]])))},appendCommonSearchParams=(e,t)=>{const a=e.searchParams,{filters:r}=t;appendPlacesLanguageParam(a,t),appendOptionalParam(a,"limit",t.limit),appendByJoiningParamValue(a,"fuelSet",r?.fuelTypes),appendByJoiningParamValue(a,"idxSet",r?.indexes),appendByJoiningParamValue(a,"brandSet",r?.poiBrands),r?.poiCategories&&appendByJoiningParamValue(a,"categorySet",r.poiCategories.map(e=>poiCategoriesToID[e])),appendByJoiningParamValue(a,"connectorSet",r?.connectors),appendByJoiningParamValue(a,"mapcodes",t.mapcodes),appendByJoiningParamValue(a,"extendedPostalCodesFor",t.extendedPostalCodesFor),appendOptionalParam(a,"minPowerKW",r?.minPowerKW),appendOptionalParam(a,"maxPowerKW",r?.maxPowerKW),appendOptionalParam(a,"view",t.view),appendOptionalParam(a,"openingHours",t.openingHours),appendOptionalParam(a,"timeZone",t.timeZone),appendOptionalParam(a,"relatedPois",t.relatedPois),appendByJoiningParamValue(a,"entityTypeSet",r?.geographyTypes),appendEVModelVersionParam(a)},resolvePlacesEndpointUrl=(e,t)=>`${e.commonBaseURL}/maps/orbis/places/${t}`,toChargingPointAvailability=e=>{const t={count:0,statusCounts:{}};for(const a of e)for(const e of a.chargingPoints)t.count++,t.statusCounts[e.status]=(t.statusCounts[e.status]||0)+1;return t},areEqual=(e,t)=>e.type===t.type&&e.ratedPowerKW===t.ratedPowerKW,addConnectorCount=(e,t)=>{if(e)for(const a of e){const e=t.find(e=>areEqual(a,e.connector));e?e.count++:t.push({connector:a,count:1})}},addConnectorCountAndStatus=(e,t,a)=>{if(e)for(const r of e){const e=a.find(e=>areEqual(r,e.connector));if(e){if(e.count++,t){const a=e.statusCounts;e.statusCounts[t]=(a[t]||0)+1}}else a.push({connector:r,count:1,statusCounts:t?{[t]:1}:{}})}},toConnectorCounts=e=>{const t=[];for(const a of e)for(const e of a.chargingPoints)addConnectorCount(e.connectors,t);return t},toConnectorBasedAvailabilities=e=>{const t=[];for(const a of e)for(const e of a.chargingPoints)addConnectorCountAndStatus(e.connectors,e.status,t);return t},toChargingSpeed=e=>e<12?"slow":e<50?"regular":e<150?"fast":"ultra-fast",toChargingStations=e=>e.map(e=>({...e,chargingPoints:e.chargingPoints.map(e=>({...e,capabilities:e.capabilities??[],restrictions:e.restrictions??[],connectors:e.connectors?.map(e=>({...e,chargingSpeed:toChargingSpeed(e.ratedPowerKW)}))}))})),csvLatLngToPosition=e=>{const t=e.split(",");return[Number(t[1]),Number(t[0])]},positionToCSVLatLon=e=>`${e[1]},${e[0]}`,apiToGeoJSONBBox=e=>{let t,a;return(e=>void 0!==e.topLeftPoint)(e)?(t=[e.topLeftPoint.lon,e.btmRightPoint.lat],a=[e.btmRightPoint.lon,e.topLeftPoint.lat]):(t=csvLatLngToPosition(e.southWest),a=csvLatLngToPosition(e.northEast)),[t[0],t[1],a[0],a[1]]},latLonAPIToPosition=e=>[e.lon,e.lat],searchCursorStateSchema=z.object({ofs:z.number().int().nonnegative()}),CURSOR_ERROR_MESSAGE="The `cursor` is not one this SDK can read. Pass back the `nextCursor` from a previous response rather than constructing one.",readCursorState=e=>searchCursorStateSchema.safeParse((e=>{try{return JSON.parse(atob(e))}catch{return}})(e)).data,searchCursorSchema=z.string().refine(e=>!!readCursorState(e),CURSOR_ERROR_MESSAGE),appendSearchCursorParam=(e,t,a)=>{void 0!==t&&e.append("ofs",String(((e,t)=>{const a=readCursorState(e);if(!a)throw new SDKError(CURSOR_ERROR_MESSAGE,t);return a.ofs})(t,a)))},parseMoment=e=>{const{year:t,month:a,day:r}=(e=>{const t=e.split("-");return{year:Number.parseInt(t[0]),month:Number.parseInt(t[1]),day:Number.parseInt(t[2])}})(e.date);return{dateYYYYMMDD:e.date,year:t,month:a,day:r,hour:e.hour,minute:e.minute,date:new Date(t,a-1,r,e.hour,e.minute)}},alwaysOpenInThisPeriod=e=>1===e.length&&0===e[0].start.hour&&0===e[0].end.hour,parseOpeningHours=e=>{const t=e.timeRanges.map(e=>({start:parseMoment(e.startTime),end:parseMoment(e.endTime)}));return{mode:e.mode,timeRanges:t,alwaysOpenThisPeriod:alwaysOpenInThisPeriod(t)}},parseSearchAPIResult=e=>{const{position:t,entryPoints:a,poi:r,id:o,dist:n,boundingBox:i,chargingStations:s,...c}=e,l=s&&toChargingStations(s);return{type:"Feature",geometry:toPointGeometry(latLonAPIToPosition(t)),...i&&{bbox:apiToGeoJSONBBox(i)},id:o,properties:{...omit(c,"viewport"),...n&&{distance:n},...a?.length&&{entryPoints:a.map(e=>({...e,position:latLonAPIToPosition(e.position)}))},...l?.length&&{chargingPark:{connectors:toConnectorCounts(l),chargingStations:l}},...r&&{poi:{name:r.name,categories:(r.categorySet?.map(e=>poiIDsToCategories[e.id])??[]).filter(e=>!!e),localizedCategories:r.categories??[],...r.phone&&{phone:r.phone},...r.brands&&{brands:r.brands.map(e=>e.name)},...r.url&&{url:r.url},...r.openingHours&&{openingHours:parseOpeningHours(r.openingHours)},...r.timeZone&&{timeZone:r.timeZone}}}}}},parseSummaryAPI=(e,t)=>{const a=t?.paginated?(({offset:e,numResults:t,totalResults:a})=>{if(0===t)return;const r=e+t;return r>=a||r>1900?void 0:btoa(JSON.stringify({ofs:r}))})(e):void 0;return{...e.geoBias&&{geoBias:latLonAPIToPosition(e.geoBias)},...a&&{nextCursor:a},...omit(e,["geoBias","offset"])}},alongRouteSearchTemplate={requestValidation:{schema:alongRouteSearchRequestSchema},buildRequest:e=>{const t=new URL((e=>resolvePlacesEndpointUrl(e,`searchAlongRoute/${encodeURIComponent(e.query??"")}.json`))(e));appendCommonSearchParams(t,e);const a=t.searchParams;return a.append("maxDetourTime",String(e.maxDetourTimeSeconds)),appendOptionalParam(a,"sortBy",e.sortBy),appendOptionalParam(a,"spreadingMode","plan"),{url:t,headers:buildPlacesRequestHeaders(e),data:{route:{points:(r=e.route,Array.isArray(r)?{type:"LineString",coordinates:r}:"Feature"===r.type?r.geometry:r).coordinates.map(e=>({lat:e[1],lon:e[0]}))}}};var r},sendRequest:post,parseResponse:e=>{const t=e.results.map(parseSearchAPIResult),a=bboxOnlyIfWithArea(bboxFromGeoJSON(t));return{type:"FeatureCollection",properties:{...parseSummaryAPI(e.summary)},features:t,...a&&{bbox:a}}}},alongRouteSearch=async e=>callService(e,alongRouteSearchTemplate,"AlongRouteSearch"),evChargingStationsAvailabilityRequestSchema=commonServiceRequestSchema.extend({id:z.string()}),notCurrent={current:!1},createLatestRequest=()=>{let e;const t=()=>{e?.abort(),e=void 0};return{run:async a=>{t();const r=new AbortController;e=r;const{signal:o}=r;try{const e=await a(o);return o.aborted?notCurrent:{current:!0,value:e}}catch(n){if(o.aborted)return notCurrent;throw n}finally{e===r&&(e=void 0)}},cancel:t,isRunning:()=>void 0!==e}},routeTypes=["fast","short","efficient","thrilling"],tollTransponderOptions=["all","unknown","none"],evChargingStationsAvailabilityTemplate={requestValidation:{schema:evChargingStationsAvailabilityRequestSchema},buildRequest:e=>{const t=new URL((e=>resolvePlacesEndpointUrl(e,"ev/id"))(e)),a=t.searchParams;return appendCommonParams(a,e),a.append("id",e.id),t},sendRequest:get,parseResponse:e=>{const t=e.results?.[0];if(!t)return;const a=toChargingStations(t.chargingStations);return{id:t.id,accessType:t.accessType,chargingStations:a,chargingPointAvailability:toChargingPointAvailability(a),connectorAvailabilities:toConnectorBasedAvailabilities(a),...t.openingHours&&{openingHours:parseOpeningHours(t.openingHours)}}},parseResponseError:(e,t)=>{const a=e.data?.detailedError?.message??e.message;return new SDKServiceError(a,t,e.status)}},evChargingStationsAvailability=async e=>callService(e,evChargingStationsAvailabilityTemplate,"EVChargingStationsAvailability"),getPlaceWithEVAvailability=async(e,t)=>{const{signal:a}=t??{};if(a?.aborted)throw new SDKAbortError("EVChargingStationsAvailability",a.reason);const r=e.properties.dataSources?.chargingAvailability?.id;if(r)try{const a=await evChargingStationsAvailability({...t,id:r}),o=e.properties.poi;return a?{...e,properties:{...e.properties,...o&&{poi:{...o,openingHours:a.openingHours}},chargingPark:{connectors:toConnectorCounts(a.chargingStations),...e.properties.chargingPark,availability:a}}}:void 0}catch(o){if(o instanceof SDKAbortError)throw o;return void console.error(o)}};async function getPlacesWithEVAvailability(e,t){const{excludeIfAvailabilityUnknown:a,...r}=t??{},o=[];for(const n of e.features){const e=await getPlaceWithEVAvailability(n,r);e?o.push(e):a||o.push(n)}return{...e,features:o,bbox:bboxFromGeoJSON(o)}}var hasChargingAvailability=e=>Boolean(e&&"availability"in e&&e.availability),fetchFirstPlace=async(e,t,a)=>{const r="string"==typeof t?{query:t}:t,[o]=(await a({...r,limit:1})).features;if(!o)throw new Error(`${e}: no results found for "${r.query}"`);return o},pointGeoBiasSchema=z.object({position:hasLngLatSchema,radiusMeters:z.number().optional()}),geoBiasSchema=z.union([pointGeoBiasSchema,z.object({boundingBox:hasBBoxSchema})]),commonGeocodeAndFuzzySearchParamsSchema=z.object({typeahead:z.boolean().optional(),cursor:searchCursorSchema.optional(),geoBias:geoBiasSchema.optional(),filters:geographicFiltersSchema.optional()}),geocodingFiltersSchema=geographicFiltersSchema.extend(placeFiltersSchema.pick({geographyTypes:!0}).shape),geocodingRequestSchema=commonServiceRequestSchema.extend(commonPlacesParamsSchema.shape).extend(commonGeocodeAndFuzzySearchParamsSchema.shape).extend({query:z.string(),filters:geocodingFiltersSchema.optional()}),parseApiResult=e=>{const{position:t,boundingBox:a,dist:r,entryPoints:o,addressRanges:n,entityType:i,id:s,...c}=e;return{type:"Feature",geometry:toPointGeometry(latLonAPIToPosition(t)),...a&&{bbox:apiToGeoJSONBBox(a)},id:s,properties:{...omit(c,"viewport"),...r&&{distance:r},...i&&{geographyType:i.split(",")},...o&&{entryPoints:o.map(e=>({...e,position:latLonAPIToPosition(e.position)}))},...n&&{addressRanges:{...n,from:latLonAPIToPosition(n.from),to:latLonAPIToPosition(n.to)}}}}},geocodingTemplate={requestValidation:{schema:geocodingRequestSchema},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,"geocode"))(e)}/${encodeURIComponent(e.query)}.json`),a=t.searchParams;return appendPlacesLanguageParam(a,e),e.typeahead&&a.append("typeahead",String(e.typeahead)),!isNil(e.limit)&&a.append("limit",String(e.limit)),appendSearchCursorParam(a,e.cursor,"Geocode"),appendGeoBiasParams(a,e.geoBias),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),e.extendedPostalCodesFor&&a.append("extendedPostalCodesFor",arrayToCSV(e.extendedPostalCodesFor)),e.mapcodes&&a.append("mapcodes",arrayToCSV(e.mapcodes)),e.view&&a.append("view",e.view),appendByJoiningParamValue(a,"entityTypeSet",e.filters?.geographyTypes),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.results.map(parseApiResult),a=bboxOnlyIfWithArea(bboxFromGeoJSON(t));return{type:"FeatureCollection",properties:parseSummaryAPI(e.summary,{paginated:!0}),features:t,...a&&{bbox:a}}}},geocode=async e=>callService(e,geocodingTemplate,"Geocode"),geocodeOne=async e=>fetchFirstPlace("geocodeOne",e,geocode),geometryDataRequestMandatory=z.object({geometries:z.union([featureCollectionSchema,z.array(z.union([z.string(),featureSchema])).min(1).max(20)])}),geometryDataRequestOptional=z.object({zoom:z.number().min(0).max(22).optional()}),geometryDataRequestSchema=geometryDataRequestMandatory.extend(geometryDataRequestOptional.shape),getGeometryIDs=e=>e.map(e=>e.properties.dataSources?.geometry?.id).filter(e=>e),geometryDataTemplate={requestValidation:{schema:geometryDataRequestSchema},buildRequest:e=>{const t=new URL((e=>resolvePlacesEndpointUrl(e,"additionalData.json"))(e)),a=t.searchParams;return((e,t)=>{let a;a=Array.isArray(t)?"string"==typeof t[0]?t:getGeometryIDs(t):getGeometryIDs(t.features),e.append("geometries",arrayToCSV(a))})(a,e.geometries),appendOptionalParam(a,"geometriesZoom",e.zoom),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.additionalData.flatMap(e=>e.geometryData?.features.map(e=>({...e,id:e.id??generateId(),bbox:bboxFromGeoJSON(e.geometry)}))).filter(e=>e);return{type:"FeatureCollection",bbox:bboxFromGeoJSON(t),features:t}}};async function geometryData(e){const t=await callService(e,geometryDataTemplate,"GeometryData");return Array.isArray(e.geometries)||"FeatureCollection"!==e.geometries.type?t:((e,t)=>{const a=e.features.reduce((e,t)=>{const a=t.properties.dataSources?.geometry?.id;return a&&(e[a]={...t.properties,placeCoordinates:t.geometry.coordinates}),e},{}),r=t.features.map(e=>e.id&&a[e.id]?{...e,properties:a[e.id]}:e);return{type:"FeatureCollection",bbox:t.bbox,features:r}})(e.geometries,t)}var placeDetailsRequestMandatory=z.object({entityId:z.string()}),placeDetailsRequestOptional=z.object({mapcodes:z.array(z.string()).optional(),view:z.enum(views).optional(),openingHours:z.string().optional(),timeZone:z.string().optional(),relatedPois:z.string().optional()}),placeDetailsRequestSchema=placeDetailsRequestMandatory.extend(placeDetailsRequestOptional.shape),placeDetailsTemplate={requestValidation:{schema:placeDetailsRequestSchema},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,"place.json"))(e)}`),a=t.searchParams;return appendPlacesLanguageParam(a,e),appendOptionalParam(a,"entityId",e.entityId),appendByJoiningParamValue(a,"mapcodes",e.mapcodes),appendOptionalParam(a,"view",e.view),appendOptionalParam(a,"openingHours",e.openingHours),appendOptionalParam(a,"timeZone",e.timeZone),appendOptionalParam(a,"relatedPois",e.relatedPois),appendEVModelVersionParam(a),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>e.results?.length?parseSearchAPIResult(e.results[0]):void 0},getPlaceDetails=async e=>callService(e,placeDetailsTemplate,"PlaceDetails"),cache=/* @__PURE__ */new Map,textCache=/* @__PURE__ */new Map,getWithDefault=e=>e??"en-GB",normalizeText=e=>e.toLowerCase().replaceAll(/[\s\-_,]+/g,""),buildTextCache=e=>{const t={};for(const a of e){const e=[a.name,...a.synonyms].map(normalizeText);for(const r of e)t[r]=a}return t},poiCategoriesRequestSchema=commonServiceRequestSchema.extend({filters:z.array(z.string()).optional()}),parsePoiCategory=e=>{const t=poiIDsToCategories[e.id];return t?{code:t,name:e.name,childCategoryCodes:e.childCategoryIds.map(e=>poiIDsToCategories[e]).filter(e=>!!e),synonyms:e.synonyms}:(console.error(`Received unknown POI category ID ${e.id} (${e.name}). This category will be skipped and unavailable for filtering.`),null)},poiCategoriesTemplate={requestValidation:{schema:poiCategoriesRequestSchema},buildRequest:e=>{const t=resolvePlacesEndpointUrl(e,"poiCategories.json"),a=new URL(t);return appendPlacesLanguageParam(a.searchParams,e),{url:a,headers:buildPlacesRequestHeaders(e)}},apiVersion:1,sendRequest:get,parseResponse:e=>({poiCategories:e.poiCategories.map(parsePoiCategory).filter(e=>null!==e)})},filterCategories=(e,t)=>{const a=(e=>textCache.get(e??"en-GB")??{})(e),r=/* @__PURE__ */new Map;for(const o of t){const e=normalizeText(o);for(const[t,o]of Object.entries(a))t.includes(e)&&o&&r.set(o.code,o)}for(const o of r.values())for(const e of o.childCategoryCodes)r.delete(e);return[...r.values()]},getPOICategories=async(e={})=>{const{language:t}=mergeFromGlobal(e);let a=(e=>cache.get(getWithDefault(e)))(t);return a||(a=(await callService(e,poiCategoriesTemplate,"POICategories")).poiCategories,((e,t)=>{const a=getWithDefault(e);cache.set(a,t),textCache.set(a,buildTextCache(t))})(t,a)),e.filters?.length?{poiCategories:filterCategories(t,e.filters)}:{poiCategories:a}},getPOICategoryCodes=async(e={})=>{const{poiCategories:t}=await getPOICategories(e);return t.map(e=>e.code)},parseRoutingResponseError=(e,t)=>{const{data:a,message:r,status:o}=e;return new SDKServiceError(a?.error?.description??a?.detailedError?.message??r,t,o)},kWhFromPercentage=(e,t)=>e*t/100,isElectricVehicle=e=>"engineType"in e&&"electric"===e.engineType,electricEngineOf=e=>{if(isElectricVehicle(e)&&e.model&&!("variantId"in e.model))return e.model.engine},withParameter=(e,t,a)=>{isNil(a)||(e[t]=String(a))},speedToConsumptionString=e=>e.map(e=>`${e.speedKMH},${e.consumptionUnitsPer100KM}`).join(":"),efficiencyParams=e=>{const t={};return e?(withParameter(t,"accelerationEfficiency",e.acceleration),withParameter(t,"decelerationEfficiency",e.deceleration),withParameter(t,"uphillEfficiency",e.uphill),withParameter(t,"downhillEfficiency",e.downhill),t):t},electricConsumptionParams=e=>{const t={};return e.speedsToConsumptionsKWH?.length&&(t.constantSpeedConsumptionInkWhPerHundredkm=speedToConsumptionString(e.speedsToConsumptionsKWH)),withParameter(t,"auxiliaryPowerInkW",e.auxiliaryPowerInkW),withParameter(t,"consumptionInkWhPerkmAltitudeGain",e.consumptionInKWHPerKMAltitudeGain),withParameter(t,"recuperationInkWhPerkmAltitudeLoss",e.recuperationInKWHPerKMAltitudeLoss),{...t,...efficiencyParams(e.efficiency)}},combustionConsumptionParams=e=>{const t=e.consumption,a={};return t.speedsToConsumptionsLiters?.length&&(a.constantSpeedConsumptionInLitersPerHundredkm=speedToConsumptionString(t.speedsToConsumptionsLiters)),withParameter(a,"auxiliaryPowerInLitersPerHour",t.auxiliaryPowerInLitersPerHour),withParameter(a,"fuelEnergyDensityInMJoulesPerLiter",t.fuelEnergyDensityInMJoulesPerLiter),{...a,...efficiencyParams(t.efficiency)}},maxChargeKWHOf=e=>electricEngineOf(e)?.charging?.maxChargeKWH,maxChargeParams=e=>{const t={};return e.charging?.maxChargeKWH&&(t.maxChargeInkWh=String(e.charging.maxChargeKWH)),t},currentChargeKWHOf=e=>{const t=e.state?.currentChargeInkWh;if(!isNil(t))return t;const a=e.state?.currentChargePCT,r=maxChargeKWHOf(e);return!isNil(a)&&r?kWhFromPercentage(r,a):void 0},currentChargeParams=e=>{const t={};return withParameter(t,"currentChargeInkWh",currentChargeKWHOf(e)),t},currentFuelParams=e=>{const t={};return withParameter(t,"currentFuelInLiters",e.state?.currentFuelInLiters),t},chargingPreferencesOf=e=>isElectricVehicle(e)?e.preferences?.chargingPreferences:void 0,setEnergyParams=(e,t)=>{for(const[a,r]of Object.entries(t))e.set(a,r)},positiveNumber=z.number().positive(),nonNegativeNumber=z.number().min(0),percentageNumber=z.number().min(0).max(100),optionalPositiveNumber=positiveNumber.optional(),optionalNonNegativeNumber=nonNegativeNumber.optional(),optionalNormalizedNumber=z.number().min(0).max(1).optional(),speedToConsumptionRateSchema=z.object({speedKMH:z.number(),consumptionUnitsPer100KM:z.number()}),baseConsumptionModelSchema={efficiency:z.object({acceleration:optionalNormalizedNumber,deceleration:optionalNormalizedNumber,uphill:optionalNormalizedNumber,downhill:optionalNormalizedNumber}).optional()},speedConsumptionArray=z.array(speedToConsumptionRateSchema).min(1).max(25),combustionConsumptionModelSchema=z.object({...baseConsumptionModelSchema,speedsToConsumptionsLiters:speedConsumptionArray,auxiliaryPowerInLitersPerHour:optionalNonNegativeNumber,fuelEnergyDensityInMJoulesPerLiter:z.number().min(1).optional()}),electricConsumptionModelSchema=z.object({...baseConsumptionModelSchema,speedsToConsumptionsKWH:speedConsumptionArray,auxiliaryPowerInkW:optionalNonNegativeNumber,consumptionInKWHPerKMAltitudeGain:z.number().max(500).optional(),recuperationInKWHPerKMAltitudeLoss:optionalNonNegativeNumber}),chargingConnectorSchema=z.object({currentType:z.enum(currentTypes),plugTypes:z.array(z.enum(plugTypes)).min(1),efficiency:optionalNormalizedNumber,baseLoadInkW:optionalNonNegativeNumber,maxPowerInkW:optionalNonNegativeNumber,maxVoltageInV:optionalNonNegativeNumber,maxCurrentInA:optionalNonNegativeNumber,voltageRange:z.object({minVoltageInV:optionalNonNegativeNumber,maxVoltageInV:z.number().optional()}).optional()}),batteryCurveSchema=z.object({stateOfChargeInkWh:nonNegativeNumber,maxPowerInkW:positiveNumber}),chargingModelSchema=z.object({maxChargeKWH:positiveNumber,batteryCurve:z.array(batteryCurveSchema).max(20).optional(),chargingConnectors:z.array(chargingConnectorSchema).min(1).optional(),chargingTimeOffsetInSec:optionalNonNegativeNumber}),combustionEngineModelSchema=z.object({consumption:combustionConsumptionModelSchema}),electricEngineModelSchema=z.object({consumption:electricConsumptionModelSchema,charging:chargingModelSchema.optional()}),vehicleDimensionsSchema=z.object({weightKG:optionalPositiveNumber}).optional(),predefinedVehicleModelSchema=z.object({variantId:z.string()}),explicitVehicleModelSchema=z.object({dimensions:vehicleDimensionsSchema,engine:z.union([combustionEngineModelSchema,electricEngineModelSchema]).optional()}),vehicleModelSchema=z.union([predefinedVehicleModelSchema,explicitVehicleModelSchema]).optional(),genericVehicleStateSchema=z.object({heading:z.number().min(0).max(360).optional()}),combustionVehicleStateSchema=genericVehicleStateSchema.extend({currentFuelInLiters:nonNegativeNumber}),electricVehicleStateByPercentageSchema=genericVehicleStateSchema.extend({currentChargePCT:percentageNumber}),electricVehicleStateByKwhSchema=genericVehicleStateSchema.extend({currentChargeInkWh:nonNegativeNumber}),electricVehicleStateSchema=z.union([electricVehicleStateByPercentageSchema,electricVehicleStateByKwhSchema]),chargingPreferencesPCTSchema=z.object({minChargeAtDestinationPCT:percentageNumber,minChargeAtChargingStopsPCT:z.number().min(0).max(50)}),chargingPreferencesKWHSchema=z.object({minChargeAtDestinationInkWh:nonNegativeNumber,minChargeAtChargingStopsInkWh:nonNegativeNumber}),chargingPreferencesSchema=z.union([chargingPreferencesPCTSchema,chargingPreferencesKWHSchema]),electricVehiclePreferencesSchema=z.object({chargingPreferences:chargingPreferencesSchema.optional()}),baseVehicleParamsSchema={model:vehicleModelSchema,restrictions:z.object({maxSpeedKMH:z.number().min(0).max(250).optional(),tollTransponder:z.enum(tollTransponderOptions).optional()}).optional()},genericVehicleParamsSchema=z.object({...baseVehicleParamsSchema,engineType:z.undefined().optional(),state:genericVehicleStateSchema.optional()}),combustionVehicleParamsSchema=z.object({...baseVehicleParamsSchema,engineType:z.literal("combustion"),state:combustionVehicleStateSchema.optional()}),electricVehicleParamsSchema=z.object({...baseVehicleParamsSchema,engineType:z.literal("electric"),state:electricVehicleStateSchema.optional(),preferences:electricVehiclePreferencesSchema.optional()}),vehicleParametersSchema=z.union([z.discriminatedUnion("engineType",[combustionVehicleParamsSchema,electricVehicleParamsSchema]),genericVehicleParamsSchema]),costModelSchema=z.object({avoid:z.array(z.enum(avoidableTypes)).optional(),traffic:z.enum(["live","historical"]).optional(),routeType:z.enum(routeTypes).optional(),avoidAreas:z.array(hasBBoxSchema).max(10).optional()}),departArriveSchema=z.object({option:z.enum(["departAt","arriveBy"]),date:z.date()}),commonRoutingRequestSchema=z.object({costModel:costModelSchema.optional(),travelMode:z.string().optional(),vehicle:vehicleParametersSchema.optional(),when:departArriveSchema.optional()}),budgetTypes=["timeMinutes","remainingChargePCT","spentChargePCT","spentFuelLiters","distanceKM"],reachableRangeRequestSchemaMandatory=z.object({origin:hasLngLatSchema,budget:z.object({type:z.enum(budgetTypes),value:z.number().min(0)})}),reachableRangeAvoidableSchema=z.enum(avoidableTypes).exclude(["alreadyUsedRoads"]),reachableRangeVehicleSchema=vehicleParametersSchema.check(z.refine(e=>!(e.state&&"heading"in e.state),"vehicle.state.heading: calculateReachableRange has no vehicle heading parameter. Remove it, or use calculateRoute, which accepts it."),z.refine(e=>!("electric"===e.engineType&&e.preferences&&"chargingPreferences"in e.preferences),"vehicle.preferences.chargingPreferences: calculateReachableRange plans no charging stops. Remove them, or use calculateRoute, which plans stops for them.")),reachableRangeWhenSchema=departArriveSchema.check(z.refine(e=>"arriveBy"!==e.option,"when.arriveBy: calculateReachableRange has no arrival-time parameter. Use when.departAt instead, or omit when entirely.")),reachableRangeCostModelSchema=costModelSchema.extend({avoid:z.array(reachableRangeAvoidableSchema).optional(),avoidAreas:z.unknown().optional()}).check(z.refine(e=>void 0===e.avoidAreas,"costModel.avoidAreas: calculateReachableRange has no avoid-areas parameter. Remove it — the other cost-model options are accepted.")),reachableRangeRequestSchemaOptional=z.object({when:reachableRangeWhenSchema.optional(),vehicle:reachableRangeVehicleSchema.optional(),costModel:reachableRangeCostModelSchema.optional(),maxFerryLengthMeters:z.number().min(0).optional(),smoothing:z.enum(["none","weak","strong"]).optional()}),reachableRangeRequestSchema=commonRoutingRequestSchema.extend(reachableRangeRequestSchemaMandatory.extend(reachableRangeRequestSchemaOptional.shape).shape),chargeBudgetTypes=/* @__PURE__ */new Set(["spentChargePCT","remainingChargePCT"]),batteryCapacityRefinement={check:e=>!chargeBudgetTypes.has(e.budget.type)||!!e.vehicle&&void 0!==maxChargeKWHOf(e.vehicle),message:"budget: a charge budget is a percentage of the battery, so it needs a capacity to convert against. Set vehicle.engineType to 'electric' and vehicle.model.engine.charging.maxChargeKWH, or budget by time or distance instead."},currentChargeRefinement={check:e=>"remainingChargePCT"!==e.budget.type||!!e.vehicle&&void 0!==currentChargeKWHOf(e.vehicle),message:"budget.remainingChargePCT: a range down to a remaining charge is measured from the charge the vehicle sets off with. Set vehicle.state.currentChargeInkWh or vehicle.state.currentChargePCT, or use spentChargePCT to budget a share of the battery instead."},reachableRangeRequestValidationConfig={schema:reachableRangeRequestSchema,refinements:[batteryCapacityRefinement,currentChargeRefinement]},buildCommonRoutingBody=e=>({...e.costModel?.routeType&&{routeType:e.costModel.routeType},...e.costModel?.traffic&&{traffic:e.costModel.traffic},...e.costModel?.avoid?.length&&{avoids:e.costModel.avoid},...e.travelMode&&{travelMode:e.travelMode},..."departAt"===e.when?.option&&e.when.date&&{departureDateTime:e.when.date.toISOString()}}),predefinedModelIdOf=e=>e.model&&"variantId"in e.model?e.model.variantId:void 0,buildCommonVehicleBody=e=>{const t={};return isElectricVehicle(e)&&(t.vehicleEngineType="electric"),e.model&&!("variantId"in e.model)&&e.model.dimensions?.weightKG&&(t.vehicleWeightInKilograms=e.model.dimensions.weightKG),e.restrictions?.maxSpeedKMH&&(t.vehicleMaxSpeedInKilometersPerHour=e.restrictions.maxSpeedKMH),e.restrictions?.tollTransponder&&(t.vehicleHasElectronicTollCollectionTransponder=e.restrictions.tollTransponder),t},appendVehicleEnergyParams=(e,t)=>{const a=electricEngineOf(t),r=(e=>"engineType"in e&&"combustion"===e.engineType?e.model?.engine:void 0)(t);var o;setEnergyParams(e.searchParams,isElectricVehicle(t)?{...a&&(o=a,{...electricConsumptionParams(o.consumption),...maxChargeParams(o)}),...currentChargeParams(t)}:{...r&&combustionConsumptionParams(r),...currentFuelParams(t)})},appendVehicleQueryParams=(e,t)=>{const a=predefinedModelIdOf(t);a&&e.searchParams.set("vehicleModelId",a),appendVehicleEnergyParams(e,t)},buildPostData=e=>({origin:{type:"Point",coordinates:getPositionStrict(e.origin)},...buildCommonRoutingBody(e),...e.vehicle&&buildCommonVehicleBody(e.vehicle)}),buildRequestHeaders$1=e=>({...buildCommonServiceRequestHeaders(e),Attributes:"reachableRange(boundary)"}),propertyKeys=Object.keys({origin:!0,budget:!0,costModel:!0,vehicle:!0,travelMode:!0,when:!0,maxFerryLengthMeters:!0,smoothing:!0}),reachableRangeTemplate={requestValidation:reachableRangeRequestValidationConfig,buildRequest:e=>{const t=(e=>new URL(`${e.commonBaseURL}/maps/orbis/routing/calculateReachableRange`))(e);return((e,t)=>{const a=t.budget,r=t.vehicle&&maxChargeKWHOf(t.vehicle);switch(a.type){case"timeMinutes":e.append("timeBudgetInSec",(60*a.value).toString());break;case"distanceKM":e.append("distanceBudgetInMeters",(1e3*a.value).toString());break;case"spentFuelLiters":e.append("fuelBudgetInLiters",a.value.toString());break;case"spentChargePCT":r&&e.append("energyBudgetInkWh",kWhFromPercentage(r,a.value).toString());break;case"remainingChargePCT":{const o=t.vehicle&&currentChargeKWHOf(t.vehicle);if(r&&void 0!==o){const t=kWhFromPercentage(r,a.value);e.append("energyBudgetInkWh",Math.max(0,o-t).toString())}break}}})(t.searchParams,e),appendOptionalParam(t.searchParams,"maxFerryLengthInMeters",e.maxFerryLengthMeters),appendOptionalParam(t.searchParams,"smoothing",e.smoothing??"strong"),e.vehicle&&appendVehicleQueryParams(t,e.vehicle),{method:"POST",url:t,data:buildPostData(e),headers:buildRequestHeaders$1(e)}},sendRequest:fetchWith,parseResponse:(e,t)=>{const a={type:"Polygon",coordinates:[e.reachableRange.boundary.map(e=>[e.longitude,e.latitude])]};return{type:"Feature",geometry:a,bbox:bboxFromGeoJSON(a),properties:pick(t,propertyKeys)}},parseResponseError:parseRoutingResponseError,apiVersion:3},calculateReachableRange=async e=>callService(e,reachableRangeTemplate,"Reachable Range"),combineSignals=(...e)=>{const t=e.filter(e=>!!e);return t.length<2?t[0]:AbortSignal.any(t)},calculateReachableRanges=async(e,t)=>{const a=[];for(const n of e){const e=combineSignals(n.signal,t?.signal);try{a.push(await calculateReachableRange({...n,...e&&{signal:e}}))}catch(o){if(!(o instanceof SDKServiceError)||403===o.status||429===o.status)throw o}}const r=bboxFromGeoJSON(a);return{type:"FeatureCollection",...r&&{bbox:r},features:a}},AREA_TYPE_BY_GEOGRAPHY_TYPE={Country:"country",CountrySubdivision:"countrySubdivision",CountrySecondarySubdivision:"countrySecondarySubdivision",CountryTertiarySubdivision:"countryTertiarySubdivision",Municipality:"municipality",MunicipalitySubdivision:"municipalitySubdivision",MunicipalitySecondarySubdivision:"municipalitySecondarySubdivision",Neighbourhood:"neighborhood",PostalCodeArea:"postalCode"},ISO2_TO_ISO3={AF:"AFG",AX:"ALA",AL:"ALB",DZ:"DZA",AS:"ASM",AD:"AND",AO:"AGO",AI:"AIA",AQ:"ATA",AG:"ATG",AR:"ARG",AM:"ARM",AW:"ABW",AU:"AUS",AT:"AUT",AZ:"AZE",BS:"BHS",BH:"BHR",BD:"BGD",BB:"BRB",BY:"BLR",BE:"BEL",BZ:"BLZ",BJ:"BEN",BM:"BMU",BT:"BTN",BO:"BOL",BQ:"BES",BA:"BIH",BW:"BWA",BV:"BVT",BR:"BRA",IO:"IOT",BN:"BRN",BG:"BGR",BF:"BFA",BI:"BDI",CV:"CPV",KH:"KHM",CM:"CMR",CA:"CAN",KY:"CYM",CF:"CAF",TD:"TCD",CL:"CHL",CN:"CHN",CX:"CXR",CC:"CCK",CO:"COL",KM:"COM",CG:"COG",CD:"COD",CK:"COK",CR:"CRI",CI:"CIV",HR:"HRV",CU:"CUB",CW:"CUW",CY:"CYP",CZ:"CZE",DK:"DNK",DJ:"DJI",DM:"DMA",DO:"DOM",EC:"ECU",EG:"EGY",SV:"SLV",GQ:"GNQ",ER:"ERI",EE:"EST",SZ:"SWZ",ET:"ETH",FK:"FLK",FO:"FRO",FJ:"FJI",FI:"FIN",FR:"FRA",GF:"GUF",PF:"PYF",TF:"ATF",GA:"GAB",GM:"GMB",GE:"GEO",DE:"DEU",GH:"GHA",GI:"GIB",GR:"GRC",GL:"GRL",GD:"GRD",GP:"GLP",GU:"GUM",GT:"GTM",GG:"GGY",GN:"GIN",GW:"GNB",GY:"GUY",HT:"HTI",HM:"HMD",VA:"VAT",HN:"HND",HK:"HKG",HU:"HUN",IS:"ISL",IN:"IND",ID:"IDN",IR:"IRN",IQ:"IRQ",IE:"IRL",IM:"IMN",IL:"ISR",IT:"ITA",JM:"JAM",JP:"JPN",JE:"JEY",JO:"JOR",KZ:"KAZ",KE:"KEN",KI:"KIR",KP:"PRK",KR:"KOR",KW:"KWT",KG:"KGZ",LA:"LAO",LV:"LVA",LB:"LBN",LS:"LSO",LR:"LBR",LY:"LBY",LI:"LIE",LT:"LTU",LU:"LUX",MO:"MAC",MG:"MDG",MW:"MWI",MY:"MYS",MV:"MDV",ML:"MLI",MT:"MLT",MH:"MHL",MQ:"MTQ",MR:"MRT",MU:"MUS",YT:"MYT",MX:"MEX",FM:"FSM",MD:"MDA",MC:"MCO",MN:"MNG",ME:"MNE",MS:"MSR",MA:"MAR",MZ:"MOZ",MM:"MMR",NA:"NAM",NR:"NRU",NP:"NPL",NL:"NLD",NC:"NCL",NZ:"NZL",NI:"NIC",NE:"NER",NG:"NGA",NU:"NIU",NF:"NFK",MK:"MKD",MP:"MNP",NO:"NOR",OM:"OMN",PK:"PAK",PW:"PLW",PS:"PSE",PA:"PAN",PG:"PNG",PY:"PRY",PE:"PER",PH:"PHL",PN:"PCN",PL:"POL",PT:"PRT",PR:"PRI",QA:"QAT",RE:"REU",RO:"ROU",RU:"RUS",RW:"RWA",BL:"BLM",SH:"SHN",KN:"KNA",LC:"LCA",MF:"MAF",PM:"SPM",VC:"VCT",WS:"WSM",SM:"SMR",ST:"STP",SA:"SAU",SN:"SEN",RS:"SRB",SC:"SYC",SL:"SLE",SG:"SGP",SX:"SXM",SK:"SVK",SI:"SVN",SB:"SLB",SO:"SOM",ZA:"ZAF",GS:"SGS",SS:"SSD",ES:"ESP",LK:"LKA",SD:"SDN",SR:"SUR",SJ:"SJM",SE:"SWE",CH:"CHE",SY:"SYR",TW:"TWN",TJ:"TJK",TZ:"TZA",TH:"THA",TL:"TLS",TG:"TGO",TK:"TKL",TO:"TON",TT:"TTO",TN:"TUN",TR:"TUR",TM:"TKM",TC:"TCA",TV:"TUV",UG:"UGA",UA:"UKR",AE:"ARE",GB:"GBR",US:"USA",UM:"UMI",UY:"URY",UZ:"UZB",VU:"VUT",VE:"VEN",VN:"VNM",VG:"VGB",VI:"VIR",WF:"WLF",EH:"ESH",YE:"YEM",ZM:"ZMB",ZW:"ZWE"},toIso3=e=>ISO2_TO_ISO3[e]??e,PLACE_TYPE_BY_RESULT_TYPE={street:"Street",area:"Geography",address:"Point Address"},GEOGRAPHY_TYPE_BY_AREA_TYPE=Object.fromEntries(Object.entries(AREA_TYPE_BY_GEOGRAPHY_TYPE).map(([e,t])=>[t,e])),mapAddress=e=>{const{street:t,houseNumber:a,countryCodeIso2:r,...o}=e;return{...o,...t&&{streetName:t},...a&&{streetNumber:a},...r&&{countryCode:r,countryCodeISO3:toIso3(r)}}},revGeocodeRequestMandatory=z.object({position:hasLngLatSchema}),revGeocodeRequestOptional=z.object({geographyTypes:z.array(z.enum(geographyTypes)).optional(),heading:z.number().min(-360).max(360).optional(),radiusMeters:z.number().positive().max(5e6).optional(),view:z.enum(views).optional()}),revGeocodeRequestSchema=revGeocodeRequestMandatory.extend(revGeocodeRequestOptional.shape),reverseGeocodingTemplate={requestValidation:{schema:revGeocodeRequestSchema},buildRequest:e=>{const[t,a]=getPositionStrict(e.position),r=new URL((e=>resolvePlacesEndpointUrl(e,"reverseGeocode"))(e)),o=r.searchParams;return o.append("position",`${t},${a}`),!isNil(e.radiusMeters)&&o.append("radiusInMeters",String(e.radiusMeters)),e.geographyTypes&&o.append("areaTypes",e.geographyTypes.map(e=>AREA_TYPE_BY_GEOGRAPHY_TYPE[e]).join(",")),!isNil(e.heading)&&o.append("vehicleHeadingInDegrees",String(e.heading)),e.view&&o.append("geopoliticalView",e.view),{url:r,headers:{...buildCommonServiceRequestHeaders(e),Attributes:"results(*)"}}},apiVersion:2,sendRequest:get,parseResponse:(e,t)=>{const a=e.results[0];return{type:"Feature",geometry:toPointGeometry(getPositionStrict(t.position)),id:a?.id??generateId(),...a&&{properties:{type:PLACE_TYPE_BY_RESULT_TYPE[a.type],address:{freeformAddress:a.title,...mapAddress(a.address)},...a.areaType&&{geographyType:[GEOGRAPHY_TYPE_BY_AREA_TYPE[a.areaType]]},...a.accessPoints?.length&&{entryPoints:a.accessPoints.map(e=>({position:e.position.coordinates}))},originalPosition:a.position.coordinates}}}}},reverseGeocode=async e=>callService(e,reverseGeocodingTemplate,"ReverseGeocode"),EXPLICIT_SECTION_TYPES=["tollVignette","tollRoad","roadShields","importantRoadStretch"],buildAttributesHeader=e=>{const t=["summary","legs(summary,path)"],a=e.sectionTypes;if(!a||a.length>0){t.push("sections");const r=!a;for(const e of EXPLICIT_SECTION_TYPES)(r||a.includes(e))&&t.push(`sections.${e}`);e.guidance&&(r||a.includes("lanes"))&&t.push("sections.lanes")}0!==e.extendedRouteRepresentations?.length&&t.push("progressPoints"),e.guidance&&t.push("instructions(*,nextRoadInformation.roadShields.iconReference,previousRoadInformation.roadShields.iconReference,signpost.exitIconReference,distanceToPreviousTrafficLightInMeters)");const r=`routes(${t.join(",")})`;return e.guidance?`roadShieldAtlasReference,${r}`:r},buildVehicleBody=e=>{const t=e.state?.heading;return{...buildCommonVehicleBody(e),...!isNil(t)&&{vehicleHeadingInDegrees:t}}},appendLDEVRVehicleParams=(e,t)=>{appendVehicleQueryParams(e,t),setEnergyParams(e.searchParams,(e=>{const t=chargingPreferencesOf(e),a={};if(!t)return a;const r=t;if(!isNil(r.minChargeAtDestinationInkWh)||!isNil(r.minChargeAtChargingStopsInkWh))return withParameter(a,"minChargeAtDestinationInkWh",r.minChargeAtDestinationInkWh),withParameter(a,"minChargeAtChargingStopsInkWh",r.minChargeAtChargingStopsInkWh),a;const o=maxChargeKWHOf(e);if(!o)return a;const n=t;return isNil(n.minChargeAtDestinationPCT)||(a.minChargeAtDestinationInkWh=String(kWhFromPercentage(o,n.minChargeAtDestinationPCT))),isNil(n.minChargeAtChargingStopsPCT)||(a.minChargeAtChargingStopsInkWh=String(kWhFromPercentage(o,n.minChargeAtChargingStopsPCT))),a})(t))},isLDEVRRequest=e=>!!e.vehicle&&!!chargingPreferencesOf(e.vehicle),PREDEFINED_MODEL_WITHOUT_LDEVR_MESSAGE="vehicle.model.variantId is only supported for EV routes with charging stops: set vehicle.preferences.chargingPreferences, or describe the vehicle with vehicle.model.dimensions and vehicle.model.engine instead.",expandPathToStops=e=>{const t=(e=>Array.isArray(e)?e:e.geometry.coordinates)(e),a=(e=>{if(!Array.isArray(e))return e.properties?.sections?.leg})(e);if(a&&a.length>1&&a.every(e=>null!=e.startPointIndex&&null!=e.endPointIndex)){const e=a.map(e=>{const a=e.startPointIndex??0,r=e.endPointIndex??0;return{coordinate:t[a],legToNext:{path:{type:"LineString",coordinates:t.slice(a,r+1)}}}});return e.push({coordinate:t[a.at(-1)?.endPointIndex??t.length-1]}),e}return[{coordinate:t[0],legToNext:{path:{type:"LineString",coordinates:t}}},{coordinate:t.at(-1)??t[0]}]},getRouteStopOptions=e=>{if(!Array.isArray(e)&&"properties"in e)return e.properties??void 0},toLegRequest=e=>{const t=e.options;if(!t)return{};const a={...t.pauseDurationSeconds&&{pauseDurationInSeconds:t.pauseDurationSeconds},...t.candidateEntryPoints?.length&&{entryPoints:(r=t.candidateEntryPoints,{type:"MultiPoint",coordinates:r.map(e=>getPositionStrict(e))}),...!isNil(t.preferredEntryPointIndex)&&{preferredEntryPointIndex:t.preferredEntryPointIndex}}};var r;return{...t.legCostModel?.routeType&&{routeType:t.legCostModel.routeType},...t.legCostModel?.avoid?.length&&{avoids:t.legCostModel.avoid.map(e=>({name:e}))},...Object.keys(a).length>0&&{routeStop:a}}},appendTravelTimeParam=(e,t)=>{t.computeTravelTimeFor&&e.searchParams.set("computeTravelTimeFor",t.computeTravelTimeFor)},waypointLikeSchema=z.union([hasLngLatSchema,geometrySchema$1]),pathLikeSchema=z.union([lineStringCoordsSchema,featureSchema]),mandatorySchema=z.object({locations:z.array(z.union([waypointLikeSchema,pathLikeSchema])).min(1)}),optionalSchema=z.object({arrivalSide:z.enum(["any","curb"]).optional(),chargingStopsStrategy:z.enum(["automaticFastest","manualFastest","automaticFastestWithFallbackToManual"]).optional(),computeTravelTimeFor:z.enum(["none","all"]).optional(),maxAlternatives:z.number().min(0).max(5).optional(),sectionTypes:z.array(z.enum(inputSectionTypesWithGuidance)).optional()}),routeRequestValidationConfig={schema:commonRoutingRequestSchema.extend(mandatorySchema.extend(optionalSchema.shape).shape),refinements:[{check:e=>{const t=e.locations.map(getRoutePlanningLocationType),a=t.filter(e=>"waypoint"===e).length,r=t.filter(e=>"path"===e).length;return a>=2||r>=1},message:"At least 2 waypoints or 1 path (route reconstruction) is required."},{check:e=>!e.chargingStopsStrategy||isLDEVRRequest(e),message:"chargingStopsStrategy: set vehicle.preferences.chargingPreferences as well — an EV route needs a minimum charge at the destination, which only the charging preferences provide."},{check:e=>!(e.vehicle&&predefinedModelIdOf(e.vehicle))||isLDEVRRequest(e),message:PREDEFINED_MODEL_WITHOUT_LDEVR_MESSAGE},{check:e=>{const t=e.locations.at(-1);return!t||"waypoint"!==getRoutePlanningLocationType(t)||!t.properties?.pauseDurationSeconds},message:"pauseDurationSeconds is not supported on the destination: the routing API requires the wait on the last leg to be 0."}]},iconCategoryByCategory={other:"unknown",accident:"accident",fog:"fog",danger:"dangerousConditions",rain:"rain",frost:"ice",jam:"jam","lane-closed":"laneClosed","road-closed":"roadClosed",roadworks:"roadWorks",wind:"wind",flooding:"flooding","broken-down-vehicle":"brokenDownVehicle"},iconCategoryLookup=new Map(Object.entries(iconCategoryByCategory)),categoryByIconCategory=new Map(trafficIncidentRequestCategories.map(e=>[iconCategoryByCategory[e],e])),delayMagnitudeLookup=new Map(Object.entries({unknown:"unknown",minor:"minor",moderate:"moderate",major:"major",undefined:"indefinite"})),toIconCategory=e=>iconCategoryLookup.get(e)??e,toTrafficIncidentCategory=e=>categoryByIconCategory.get(e)??"other",toDelayMagnitude=e=>delayMagnitudeLookup.get(e)??"unknown",toCurrentType=e=>{switch(e){case"Direct_Current":return"DC";case"Alternating_Current_1_Phase":return"AC1";case"Alternating_Current_3_Phase":return"AC3";default:return}},toChargingStop=(e,t)=>{const a=e.chargingConnectionInfo,r=e.chargingParkLocation,o=[r.coordinate.longitude,r.coordinate.latitude],n=[r.street,r.houseNumber].filter(Boolean),i=n.length>0?n.join(", "):"";return{type:"Feature",id:e.chargingParkId,geometry:{type:"Point",coordinates:o},properties:{...omit(e,["chargingConnectionInfo","chargingParkLocation"]),type:"POI",dataSources:{chargingAvailability:{id:e.chargingParkUuid}},address:{freeformAddress:i,...r.street&&{streetName:r.street},...r.houseNumber&&{streetNumber:r.houseNumber},...r.city&&{municipality:r.city},...r.region&&{countrySubdivision:r.region},...r.postalCode&&{postalCode:r.postalCode},...r.country&&{country:r.country}},...a&&{chargingConnectionInfo:{plugType:a.chargingPlugType,currentInA:a.chargingCurrentInA,voltageInV:a.chargingVoltageInV,chargingPowerInkW:a.chargingPowerInkW,currentType:toCurrentType(a.chargingCurrentType),chargingSpeed:toChargingSpeed(a.chargingPowerInkW)}},...t&&{targetChargeInPCT:100*e.targetChargeInkWh/t},...e.chargingParkPowerInkW&&{chargingParkSpeed:toChargingSpeed(e.chargingParkPowerInkW)}}}},parseSummary=(e,t)=>{const a=t?.vehicle&&maxChargeKWHOf(t.vehicle);return{lengthInMeters:e.lengthInMeters,travelTimeInSeconds:e.travelDurationInSeconds,trafficDelayInSeconds:e.trafficDelayDurationInSeconds??0,trafficLengthInMeters:e.trafficLengthInMeters??0,historicTrafficTravelTimeInSeconds:e.historicTrafficTravelTimeInSeconds,liveTrafficIncidentsTravelTimeInSeconds:e.liveTrafficIncidentsTravelTimeInSeconds,noTrafficTravelTimeInSeconds:e.noTrafficTravelTimeInSeconds,departureTime:new Date(e.departureDateTime),arrivalTime:new Date(e.arrivalDateTime),deviationDistanceInMeters:e.deviationDistanceInMeters,deviationTimeInSeconds:e.deviationDurationInSeconds,...e.deviationPoint&&{deviationPoint:e.deviationPoint.coordinates},fuelConsumptionInLiters:e.fuelConsumptionInLiters,totalChargingTimeInSeconds:e.totalChargingTimeInSeconds,batteryConsumptionInkWh:e.batteryConsumptionInKilowattHours??e.batteryConsumptionInkWh,...a&&(()=>{const t=e.batteryConsumptionInKilowattHours??e.batteryConsumptionInkWh;return t?{batteryConsumptionInPCT:100*t/a}:void 0})(),remainingChargeAtArrivalInkWh:e.remainingChargeAtArrivalInkWh,...a&&e.remainingChargeAtArrivalInkWh&&{remainingChargeAtArrivalInPCT:100*e.remainingChargeAtArrivalInkWh/a},...e.chargingInformationAtEndOfLeg&&{chargingInformationAtEndOfLeg:toChargingStop(e.chargingInformationAtEndOfLeg,a)}}},parseLegSectionProps=(e,t)=>e.reduce((a,r,o)=>{const n=r.path.coordinates.length,i=0===o?0:a[o-1]?.endPointIndex;let s;isNil(i)||(s=0===i?Math.max(n-1,0):i+n);const c=((e,t)=>{if(!t)return;const a=new Date(e.summary.arrivalDateTime).getTime(),r=new Date(t.summary.departureDateTime).getTime();if(Number.isNaN(a)||Number.isNaN(r))return;const o=Math.round((r-a)/1e3);return o>0?o:void 0})(r,e[o+1]),{originalWaypointIndexAtEndOfLeg:l}=r.summary;return a.push({...!isNil(i)&&{startPointIndex:i},...void 0!==s&&{endPointIndex:s},...!isNil(l)&&{originalWaypointIndex:l},summary:{...parseSummary(r.summary,t),...void 0!==c&&{stopTimeInSeconds:c}},id:generateId()}),a},[]),toSectionProps=e=>({id:generateId(),startPointIndex:e.startPathIndex,endPointIndex:e.endPathIndex}),parseSections=(e,t)=>{const a={leg:parseLegSectionProps(e.legs,t)},r=e.sections;if(!r)return a;const o=(e,t)=>{t?.length&&(a[e]=t.map(toSectionProps))};return o("carTrain",r.carTrain),o("ferry",r.ferry),o("tunnel",r.tunnel),o("motorway",r.motorway),o("pedestrian",r.pedestrian),o("toll",r.toll),o("tollRoad",r.tollRoad),o("carpool",r.carpool),o("urban",r.urban),o("unpaved",r.unpaved),o("lowEmissionZone",r.lowEmissionZone),r.country?.length&&(a.country=r.country.map(e=>({...toSectionProps(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:toIso3(e.countryCodeIso2??"")}))),r.travelMode?.length&&(a.vehicleRestricted=r.travelMode.filter(e=>"other"===e.travelMode).map(toSectionProps)),r.traffic?.length&&(a.traffic=r.traffic.map(e=>{return{...toSectionProps(e),delayInSeconds:e.delayDurationInSeconds,effectiveSpeedInKmh:e.effectiveSpeedInKilometersPerHour,categories:(t=e,t.tec?.causes?.length?t.tec.causes.map(e=>{switch(e.mainCauseCode){case 1:return"jam";case 2:return"accident";case 3:return"roadworks";case 4:return"narrow-lanes";case 5:return"road-closed";case 9:return"danger";case 11:return"animals-on-road";case 13:return"broken-down-vehicle";case 16:return"lane-closed";case 17:return"wind";case 18:return"fog";case 19:return"rain";case 22:return"frost";case 23:return"flooding";default:return"other"}}):[toTrafficIncidentCategory(t.iconCategory)]),magnitudeOfDelay:toDelayMagnitude(e.delayMagnitude),tec:e.tec,...e.eventId&&{eventId:e.eventId}};var t})),r.speedLimit?.length&&(a.speedLimit=r.speedLimit.map(e=>{const t=e.speedRestrictions?.find(e=>"maximum"===e.type)?.inKilometersPerHour;return isNil(t)?void 0:{...toSectionProps(e),maxSpeedLimitInKmh:t}}).filter(e=>!!e)),r.lanes?.length&&(a.lanes=r.lanes.map(e=>({...toSectionProps(e),lanes:(e.lanes??[]).map(e=>({directions:e.directions.map(e=>LANE_DIRECTION_MAP[e]??e),...e.follow&&{follow:LANE_DIRECTION_MAP[e.follow]??e.follow}})),laneSeparators:(e.laneSeparators??[]).map(e=>LANE_SEPARATOR_MAP[e]??e),properties:e.properties}))),r.roadShields?.length&&(a.roadShields=r.roadShields.map(e=>({...toSectionProps(e),roadShieldReferences:e.roadShieldReferences}))),r.tollVignette?.length&&(a.tollVignette=r.tollVignette.map(e=>({...toSectionProps(e),countryCodeISO2:e.countryCodeIso2??"",countryCodeISO3:toIso3(e.countryCodeIso2??"")}))),r.importantRoadStretch?.length&&(a.importantRoadStretch=r.importantRoadStretch.map(e=>({...toSectionProps(e),index:e.importantRoadStretchIndex,...e.streetName&&{streetName:e.streetName.text},...e.roadNumbers?.length&&{roadNumbers:e.roadNumbers.map(e=>e.text)}}))),((e,t)=>{if(!t)return;const a=new Set(t);for(const r of Object.keys(e))"leg"===r||a.has(r)||delete e[r]})(a,t.sectionTypes),a},similar=(e,t)=>Math.abs(e[0]-t[0])<1e-4&&Math.abs(e[1]-t[1])<1e-4,MANEUVER_MAP={depart:"DEPART",waypointLeft:"WAYPOINT_LEFT",waypointRight:"WAYPOINT_RIGHT",waypointReached:"WAYPOINT_REACHED",waypointAhead:"WAYPOINT_AHEAD",arrive:"ARRIVE",arriveLeft:"ARRIVE_LEFT",arriveRight:"ARRIVE_RIGHT",arriveAhead:"ARRIVE_AHEAD",continueStraight:"STRAIGHT",keepLeft:"KEEP_LEFT",keepRight:"KEEP_RIGHT",turnSlightRight:"SLIGHT_RIGHT",turnRight:"TURN_RIGHT",turnSharpRight:"SHARP_RIGHT",turnSlightLeft:"SLIGHT_LEFT",turnLeft:"TURN_LEFT",turnSharpLeft:"SHARP_LEFT",makeUTurn:"MAKE_UTURN",roundaboutStraight:"ROUNDABOUT_STRAIGHT",roundaboutSharpRight:"ROUNDABOUT_SHARP_RIGHT",roundaboutRight:"ROUNDABOUT_RIGHT",roundaboutSlightRight:"ROUNDABOUT_SLIGHT_RIGHT",roundaboutSlightLeft:"ROUNDABOUT_SLIGHT_LEFT",roundaboutLeft:"ROUNDABOUT_LEFT",roundaboutSharpLeft:"ROUNDABOUT_SHARP_LEFT",roundaboutBack:"ROUNDABOUT_BACK",exitRoundabout:"EXIT_ROUNDABOUT",exitMotorwayLeft:"EXIT_MOTORWAY_LEFT",exitMotorwayRight:"EXIT_MOTORWAY_RIGHT",switchMotorwayLeft:"SWITCH_MOTORWAY_LEFT",switchMotorwayRight:"SWITCH_MOTORWAY_RIGHT",enterCarpoolLaneLeft:"ENTER_CARPOOL_LANE_LEFT",enterCarpoolLaneRight:"ENTER_CARPOOL_LANE_RIGHT",exitCarpoolLaneLeft:"EXIT_CARPOOL_LANE_LEFT",exitCarpoolLaneRight:"EXIT_CARPOOL_LANE_RIGHT",mergeLeftLane:"MERGE_LEFT_LANE",mergeRightLane:"MERGE_RIGHT_LANE",takeShipFerry:"TAKE_SHIP_FERRY",takeCarTrain:"TAKE_CAR_TRAIN",leaveShipFerry:"LEAVE_SHIP_FERRY",leaveCarTrain:"LEAVE_CAR_TRAIN",crossBorder:"CROSS_BORDER",passTollgate:"TOLLGATE"},ROAD_PROPERTY_MAP={urban:"URBAN",motorway:"MOTORWAY",controlledAccess:"CONTROLLED_ACCESS"},LANDMARK_MAP={endOfRoad:"END_OF_ROAD",atTrafficLight:"AT_TRAFFIC_LIGHT",onToBridge:"ON_TO_BRIDGE",onBridge:"ON_BRIDGE",afterBridge:"AFTER_BRIDGE",intoTunnel:"INTO_TUNNEL",insideTunnel:"INSIDE_TUNNEL",afterTunnel:"AFTER_TUNNEL"},TOLL_PAYMENT_MAP={cashCoinsAndBills:"CASH_COINS_AND_BILLS",cashBillsOnly:"CASH_BILLS_ONLY",cashCoinsOnly:"CASH_COINS_ONLY",cashExactChange:"CASH_EXACT_CHANGE",creditCard:"CREDIT_CARD",debitCard:"DEBIT_CARD",travelCard:"TRAVEL_CARD",etc:"ETC",etcTransponder:"ETC_TRANSPONDER",etcVideoCamera:"ETC_VIDEO_CAMERA",subscription:"SUBSCRIPTION"},LANE_DIRECTION_MAP={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",rightUTurn:"RIGHT_U_TURN",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",leftUTurn:"LEFT_U_TURN"},LANE_SEPARATOR_MAP={unknown:"UNKNOWN",noMarking:"NO_MARKING",longDashed:"LONG_DASHED",doubleSolid:"DOUBLE_SOLID",singleSolid:"SINGLE_SOLID",solidDashed:"SOLID_DASHED",dashedSolid:"DASHED_SOLID",shortDashed:"SHORT_DASHED",shadedAreaMarking:"SHADED_AREA_MARKING",dashedBlocks:"DASHED_BLOCKS",doubleDashed:"DOUBLE_DASHED",crossingAlert:"CROSSING_ALERT",physicalDivider:"PHYSICAL_DIVIDER",physicalDividerLessThan3m:"PHYSICAL_DIVIDER_LESS_THAN_3M",physicalDividerGuardrail:"PHYSICAL_DIVIDER_GUARDRAIL",curb:"CURB"},MANEUVER_ANGLE_MAP={straight:"STRAIGHT",slightRight:"SLIGHT_RIGHT",right:"RIGHT",sharpRight:"SHARP_RIGHT",slightLeft:"SLIGHT_LEFT",left:"LEFT",sharpLeft:"SHARP_LEFT",back:"BACK"},ROUNDABOUT_TYPE_MAP={regular:"REGULAR",small:"SMALL"},SIDE_ROAD_SIDE_MAP={left:"LEFT",right:"RIGHT",leftAndRight:"LEFT_AND_RIGHT"},EMPTY_ROAD_INFO={properties:[]},toInstructionText=e=>({text:e.text}),parseInstructionRoadInformation=e=>({properties:(e.properties??[]).map(e=>ROAD_PROPERTY_MAP[e]??e.toUpperCase()),...e.roadNames?.length&&{streetName:toInstructionText(e.roadNames[0].identifier)},...e.countryCodeIso2&&{countryCode:toIso3(e.countryCodeIso2)},...e.roadShields?.length&&{roadShields:e.roadShields.map(e=>({roadNumber:e.roadNumber?toInstructionText(e.roadNumber):{text:""},countryCode:toIso3(e.countryCodeIso2??""),...e.countrySubdivisionCodeIso&&{stateCode:e.countrySubdivisionCodeIso},...e.iconReference&&{roadShieldReference:e.iconReference}}))}}),parseTollAndCrossing=e=>({...e.tollgateName&&{tollgateName:toInstructionText(e.tollgateName)},...e.tollPaymentTypes?.length&&{tollPaymentTypes:e.tollPaymentTypes.map(e=>TOLL_PAYMENT_MAP[e]??e)},...e.countryCrossingFromName&&{countryCrossingFromName:toInstructionText(e.countryCrossingFromName)},...e.countryCrossingFromCodeIso2&&{countryCrossingFromCode:toIso3(e.countryCrossingFromCodeIso2)},...e.countryCrossingToName&&{countryCrossingToName:toInstructionText(e.countryCrossingToName)},...e.countryCrossingToCodeIso2&&{countryCrossingToCode:toIso3(e.countryCrossingToCodeIso2)}}),toManeuverAngle=e=>MANEUVER_ANGLE_MAP[e]??e,parseManeuverExtras=e=>{return{...e.message&&{message:e.message},...e.intersectionName&&{intersectionName:toInstructionText(e.intersectionName)},...e.drivingSide&&{drivingSide:e.drivingSide.toUpperCase()},...e.landmark&&{landmark:LANDMARK_MAP[e.landmark]??e.landmark},...!isNil(e.distanceToPreviousTrafficLightInMeters)&&{trafficLightOffsetInMeters:e.distanceToPreviousTrafficLightInMeters},...e.sideRoads&&{sideRoads:(a=e.sideRoads,a.map(e=>({side:SIDE_ROAD_SIDE_MAP[e.side]??e.side,offsetFromManeuverInMeters:e.offsetFromManeuverInMeters,...!isNil(e.isDrivable)&&{isDrivable:e.isDrivable}})))},...e.maneuverView&&{maneuverView:(t=e.maneuverView,{...t.onRouteAngle&&{onRouteAngle:toManeuverAngle(t.onRouteAngle)},offRouteAngles:(t.offRouteAngles??[]).map(toManeuverAngle)})},...e.roundaboutType&&{roundaboutType:ROUNDABOUT_TYPE_MAP[e.roundaboutType]??e.roundaboutType},...!isNil(e.isManeuverObligatory)&&{isManeuverObligatory:e.isManeuverObligatory},...!isNil(e.changeOfAngleInDegrees)&&{changeOfAngleInDegrees:e.changeOfAngleInDegrees},...!isNil(e.ambiguousExitOffsetFromManeuverInMeters)&&{offsetOfAmbiguousExitFromManeuverInMeters:e.ambiguousExitOffsetFromManeuverInMeters},...!isNil(e.roundaboutExitNumber)&&{roundaboutExitNumber:e.roundaboutExitNumber}};var t,a},parseRoadShieldFields=(e,t)=>{const a=e.signpost?(e=>{if(e.exitName||e.exitNumber||e.towardName)return{...e.exitName&&{exitName:toInstructionText(e.exitName)},...e.exitNumber&&{exitNumber:toInstructionText(e.exitNumber)},towardName:e.towardName?toInstructionText(e.towardName):{text:""}}})(e.signpost):void 0,r=(e.nextRoadInformation?.roadShields??[]).map(e=>e.iconReference).filter(e=>!!e);return{...a&&{signpost:a},...t&&{roadShieldAtlasReference:t},...r.length&&{roadShieldReferences:r},...e.signpost?.exitIconReference&&{signpostRoadShieldReferences:[e.signpost.exitIconReference]}}},parseInstruction=(e,t,a,r)=>({maneuverPoint:t,pathPointIndex:a,routeOffsetInMeters:e.routeOffsetInMeters,maneuver:e.maneuver?MANEUVER_MAP[e.maneuver]??e.maneuver:e.maneuver,routePath:(e.routePath??[]).map(e=>({point:e.point.coordinates,distanceInMeters:e.distanceFromRouteStartInMeters,travelTimeInSeconds:e.travelTimeFromRouteStartInSeconds})),nextRoadInfo:e.nextRoadInformation?parseInstructionRoadInformation(e.nextRoadInformation):EMPTY_ROAD_INFO,previousRoadInfo:e.previousRoadInformation?parseInstructionRoadInformation(e.previousRoadInformation):EMPTY_ROAD_INFO,...parseManeuverExtras(e),...parseRoadShieldFields(e,r),...parseTollAndCrossing(e)}),parseGuidance=(e,t,a)=>{const r=[];let o=0;for(const n of e){const e=n.maneuverPoint.coordinates;for(let a=o;a<t.length;a++)if(similar(t[a],e)){o=a;break}r.push(parseInstruction(n,e,o,a))}return{instructions:r}},calculateRouteTemplate={requestValidation:routeRequestValidationConfig,buildRequest:e=>{const t=e.locations.map(getRoutePlanningLocationType).includes("path"),a=((e,t)=>{const a=[];for(const r of e)if("waypoint"===getRoutePlanningLocationType(r)){const e=getRouteStopOptions(r),o=e?.candidateEntryPoints?.length?"ignore":t,[n,i]=getPositionStrict(r,{useEntryPoint:o});a.push({coordinate:[n,i],...e&&{options:e}})}else a.push(...expandPathToStops(r));return a})(e.locations,e.useEntryPoints),r=(e=>{const t={type:"Point",coordinates:e[0].coordinate},a={type:"Point",coordinates:(e.at(-1)??e[0]).coordinate},r=e.slice(1,-1);return{origin:t,destination:a,...r.length&&{waypoints:{type:"MultiPoint",coordinates:r.map(e=>e.coordinate)}}}})(a),o=(e=>{return{...buildCommonRoutingBody(e),...e.maxAlternatives&&{maxPathAlternativeRoutes:e.maxAlternatives},..."arriveBy"===e.when?.option&&e.when.date&&{arrivalDateTime:e.when.date.toISOString()},...e.guidance&&{guidance:"instructions",instructionPhonetics:"ipa"},...e.costModel?.avoidAreas?.length&&{avoidAreas:(t=e.costModel.avoidAreas,{rectangles:t.map(e=>{const t=bboxFromGeoJSON(e);if(!t)throw new Error("Could not derive a bounding box from an avoidAreas rectangle");const[a,r,o,n]=t;return{type:"Feature",bbox:[a,r,o,n],geometry:null}})})},...e.arrivalSide&&{arrivalSidePreference:"curb"===e.arrivalSide?"curbSide":"anySide"}};var t})(e),n=(e=>({...buildCommonServiceRequestHeaders(e),Attributes:buildAttributesHeader(e)}))(e),i=((e,t)=>{const a=e.slice(1).map((t,a)=>({...e[a].legToNext,...toLegRequest(t)}));if(t||!a.every(e=>0===Object.keys(e).length))return a})(a,t),s={routePlanningLocations:r,...o,...i&&{legs:i},...e.vehicle&&buildVehicleBody(e.vehicle)};if(isLDEVRRequest(e)){const t=((e,t,a)=>{const r=new URL(`${e.commonBaseURL}/maps/orbis/routing/calculateLongDistanceEVRoute`);appendLDEVRVehicleParams(r,e.vehicle),e.chargingStopsStrategy&&r.searchParams.set("chargingStopsStrategy",e.chargingStopsStrategy);const o=electricEngineOf(e.vehicle)?.charging;if(!predefinedModelIdOf(e.vehicle)&&!o?.chargingConnectors?.length)throw new Error("Charging preferences require a charging model: set vehicle.model.engine.charging.chargingConnectors (or a predefined vehicle.model.variantId) to plan charging stops.");return{method:"POST",url:r,data:{...t,...o&&{chargingParameters:{...o.batteryCurve?.length&&{batteryCurve:o.batteryCurve},...o.chargingConnectors?.length&&{chargingConnectors:[...o.chargingConnectors]},...!isNil(o.chargingTimeOffsetInSec)&&{chargingTimeOffsetInSec:o.chargingTimeOffsetInSec}}},vehicleEngineType:"electric"},headers:a}})(e,s,n);return appendTravelTimeParam(t.url,e),t}if(e.vehicle&&predefinedModelIdOf(e.vehicle))throw new Error(PREDEFINED_MODEL_WITHOUT_LDEVR_MESSAGE);const c=new URL(`${e.commonBaseURL}/maps/orbis/routing/routes/calculate`);return e.vehicle&&appendVehicleEnergyParams(c,e.vehicle),appendTravelTimeParam(c,e),{method:"POST",url:c,data:s,headers:n}},sendRequest:fetchWith,parseResponse:(e,t)=>{const a=e.routes.map((a,r)=>((e,t,a,r)=>{const o={type:"LineString",coordinates:e.legs.flatMap(e=>e.path.coordinates)};return{type:"Feature",geometry:o,id:generateId(),bbox:bboxFromGeoJSON(o),properties:{index:t,summary:parseSummary(e.summary,a),sections:parseSections(e,a),...e.instructions?.length&&{guidance:parseGuidance(e.instructions,o.coordinates,r)},...e.progressPoints&&{progress:e.progressPoints.map(e=>({pointIndex:e.pathIndex,distanceInMeters:e.distanceInMeters,travelTimeInSeconds:e.travelDurationInSeconds}))}}}})(a,r,t,e.roadShieldAtlasReference)),r=bboxFromGeoJSON(a);return{type:"FeatureCollection",...r&&{bbox:r},features:a}},parseResponseError:parseRoutingResponseError,apiVersion:3},calculateRoute=async e=>callService(e,calculateRouteTemplate,"Routing"),fuzzySearchRequestOptional=z.object({minFuzzyLevel:z.number().min(1).max(4).optional(),maxFuzzyLevel:z.number().min(1).max(4).optional(),filters:searchFiltersSchema.optional()}),fuzzySearchRequestSchema=commonSearchParamsSchema.extend(commonGeocodeAndFuzzySearchParamsSchema.extend(fuzzySearchRequestOptional.shape).shape),queryIntentApiToSdk=e=>{let t;switch(e.type){case"COORDINATE":t={...e,details:{position:latLonAPIToPosition(e.details)}};break;case"NEARBY":t={...e,details:{position:latLonAPIToPosition({lon:e.details.lon,lat:e.details.lat}),text:e.details.text,query:e.details.query}};break;case"BOOKMARK":case"W3W":t=e}return t},fuzzySearchTemplate={requestValidation:{schema:fuzzySearchRequestSchema},buildRequest:e=>{const t=new URL(`${(e=>resolvePlacesEndpointUrl(e,`search/${encodeURIComponent(e.query??"")}.json`))(e)}`);appendCommonSearchParams(t,e);const a=t.searchParams;return appendOptionalParam(a,"typeahead",e.typeahead),appendSearchCursorParam(a,e.cursor,"FuzzySearch"),appendByJoiningParamValue(a,"countrySet",e.filters?.countries),appendGeoBiasParams(a,e.geoBias),appendOptionalParam(a,"minFuzzyLevel",e.minFuzzyLevel),appendOptionalParam(a,"maxFuzzyLevel",e.maxFuzzyLevel),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const t=e.results.map(parseSearchAPIResult),a=bboxOnlyIfWithArea(bboxFromGeoJSON(t)),r=e.summary.queryIntent?.map(queryIntentApiToSdk);return{type:"FeatureCollection",properties:{...parseSummaryAPI(e.summary,{paginated:!0}),...r&&{queryIntent:r}},features:t,...a&&{bbox:a}}}},geometrySearchRequestMandatory=z.object({geometries:z.array(z.union([featureCollectionSchema,geometrySchema$1]))}),geometrySearchRequestSchema=commonSearchParamsSchema.extend(geometrySearchRequestMandatory.shape),sdkGeometryToApiGeometries=e=>{switch(e.type){case"Circle":return[{type:"CIRCLE",radius:e.radius,position:positionToCSVLatLon(e.coordinates)}];case"Polygon":return[{type:"POLYGON",vertices:sampleWithinMaxLength(e.coordinates[0],50).map(e=>positionToCSVLatLon(e))}];case"MultiPolygon":return e.coordinates.length>50?(e=>{let t=/* @__PURE__ */new Map;return e.coordinates.forEach(e=>{const a=bboxFromCoordsArray(e[0]);if(a){const r=Math.abs((a[2]-a[0])*(a[3]-a[1]));t.set(e,r)}}),t=new Map([...t.entries()].sort((e,t)=>t[1]-e[1]).splice(0,50)),[...t.keys()]})(e).flatMap(e=>sdkGeometryToApiGeometries({type:"Polygon",coordinates:e})):e.coordinates.flatMap(e=>sdkGeometryToApiGeometries({type:"Polygon",coordinates:e}));case"FeatureCollection":return e.features.flatMap(e=>sdkGeometryToApiGeometries(e.geometry));default:throw new Error(`Type ${e.type} is not supported`)}},geometrySearchTemplate={requestValidation:{schema:geometrySearchRequestSchema},buildRequest:e=>{const t=new URL(`${a=e,resolvePlacesEndpointUrl(a,`geometrySearch/${encodeURIComponent(a.query??"")}.json`)}`);var a;return appendCommonSearchParams(t,e),{url:t,headers:buildPlacesRequestHeaders(e),data:{geometryList:e.geometries.flatMap(sdkGeometryToApiGeometries)}}},sendRequest:post,parseResponse:e=>{const t=e.results.map(parseSearchAPIResult),a=bboxOnlyIfWithArea(bboxFromGeoJSON(t));return{type:"FeatureCollection",properties:{...parseSummaryAPI(e.summary)},features:t,...a&&{bbox:a}}}},discoverPlaces=async e=>e.route?alongRouteSearch(e):e.geometries?(async e=>callService(e,geometrySearchTemplate,"GeometrySearch"))(e):(async e=>callService(e,fuzzySearchTemplate,"FuzzySearch"))(e),discoverOnePlace=async e=>fetchFirstPlace("discoverOnePlace",e,discoverPlaces),autocompleteSearchRequestMandatory=z.object({query:z.string()}),autocompleteSearchRequestOptional=z.object({geoBias:pointGeoBiasSchema.optional(),limit:z.number().max(100).optional(),filters:geographicFiltersSchema.optional(),resultTypes:z.array(z.string()).optional()}),autocompleteSearchRequestSchema=autocompleteSearchRequestMandatory.extend(autocompleteSearchRequestOptional.shape),autocompleteSearchTemplate={requestValidation:{schema:autocompleteSearchRequestSchema},buildRequest:e=>{const t=new URL(`${a=e,resolvePlacesEndpointUrl(a,`autocomplete/${encodeURIComponent(a.query)}.json`)}`);var a;const r=t.searchParams;return e.language=e.language??"en-GB",appendPlacesLanguageParam(r,e),appendOptionalParam(r,"limit",e.limit),appendGeoBiasParams(r,e.geoBias),appendByJoiningParamValue(r,"countrySet",e.filters?.countries),appendByJoiningParamValue(r,"resultSet",e.resultTypes),{url:t,headers:buildPlacesRequestHeaders(e)}},sendRequest:get,parseResponse:e=>{const{position:t,...a}=e.context.geoBias||{};return{context:{...e.context,geoBias:{...t&&{position:latLonAPIToPosition(t)},radiusMeters:a.radius}},results:(r=e.results,r.map(e=>({segments:e.segments.map(e=>{if((e=>"category"===e.type)(e)){const{id:t,...a}=e;return{...a,category:poiIDsToCategories[Number(t)]}}return e})})))};var r}},autocompleteSearch=async e=>callService(e,autocompleteSearchTemplate,"Autocomplete"),words=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"").toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean),namesOf=e=>"category"===e.type&&e.matchedAlternativeName?[e.value,e.matchedAlternativeName]:[e.value],findConceptSegment=(e,t)=>{const a=t.flatMap(({segments:t})=>{const[a]=t;return 1===t.length&&"plaintext"!==a.type&&namesOf(a).some(t=>((e,t)=>{const a=words(t).join(""),r=words(e);return""!==a&&r.some((e,t)=>r.slice(t).join("").startsWith(a))})(t,e))?[a]:[]});return a.find(t=>namesOf(t).some(t=>((e,t)=>{const[a,...r]=words(t);return 0===r.length&&words(e).some(e=>e.startsWith(a)&&2*a.length>=e.length)})(t,e)))??a[0]},blendSuggestions=({query:e,concept:t,places:a,maxResults:r})=>{const o=uniqBy(a,e=>e.id),n="none"===t.status?o:partition(o,t=>((e,t)=>{const a=words(e);return words(t).every(e=>a.some(t=>t.startsWith(e)))})(t.title,e)).flat();return[..."shown"===t.status?[t.suggestion]:[],...n].slice(0,r)},REFINEMENT_KINDS={brand:!0,category:!0},isRefinementKind=e=>e in REFINEMENT_KINDS,INDEXES_BY_PLACE_KIND={place:["POI"],address:["PAD","Addr","XStr"],street:["Str"],area:["Geo"]},KIND_BY_PLACE_TYPE={POI:"place",Street:"street",Geography:"area","Point Address":"address","Address Range":"address","Cross Street":"address"},toRadians=e=>e*Math.PI/180,distanceFrom=(e,t)=>e.properties.distance??(t&&(([e,t],[a,r])=>{const o=Math.sin(toRadians(r-t)/2)**2+Math.cos(toRadians(t))*Math.cos(toRadians(r))*Math.sin(toRadians(a-e)/2)**2;return 12742017.6*Math.asin(Math.sqrt(o))})(t,e.geometry.coordinates)),toPlaceSuggestions=(e,t)=>{const a=getPosition(t)??void 0,r=((e,t)=>{if(t)return minBy(e,e=>distanceFrom(e,t))?.properties.address.countryCode;const a=countBy(e,e=>e.properties.address.countryCode);return maxBy(Object.keys(a),e=>a[e])})(e,a);return e.map(e=>((e,t,a)=>{const{type:r,address:o,poi:n}=e.properties,i=o.freeformAddress.split(", ").filter(Boolean),[s="",...c]=n?.name?[n.name,...i]:i,l=o.countryCode!==t?o.country:void 0;return{kind:KIND_BY_PLACE_TYPE[r],id:String(e.id),title:s,subtitles:l?[...c,l]:c,distanceInMeters:distanceFrom(e,a),resolve:async()=>({...e,properties:omit(e.properties,["distance","score"])})}})(e,r,a))},throwAsSearchSuggestionsError=e=>{if(e instanceof SDKAbortError)throw new SDKAbortError("SearchSuggestions",e.cause);if(e instanceof SDKServiceError)throw new SDKServiceError(e.message,"SearchSuggestions",e.status);if(e instanceof SDKError)throw new SDKError(e.message,"SearchSuggestions",e.issues);throw e},toRefinement=(e,t)=>{const a="brand"===e.type?{poiBrands:[e.value]}:{poiCategories:[e.category]},r={...t,filters:{...t.filters,...a}},o={title:e.value,refineParams:r,refine:e=>discoverPlaces({...r,...e&&{signal:e}})};return"brand"===e.type?{...o,kind:"brand"}:{...o,kind:"category",category:e.category}},toRefinementSuggestions=(e,t)=>uniqBy(e.flatMap(e=>e.segments.flatMap(e=>"plaintext"===e.type?[]:[toRefinement(e,t)])),e=>`${e.kind}:${e.title}`),pickConcept=(e,t,a,r)=>{const o=findConceptSegment(e,t);return o?"brand"!==o.type||((e,t)=>{const a=words(e).join("");return t.slice(0,5).some(e=>e.properties.poi?.brands?.some(e=>words(e).join("")===a))})(o.value,a)?{status:"shown",suggestion:toRefinement(o,r)}:{status:"withheld"}:{status:"none"}},getSearchSuggestions=async e=>{const{query:t,maxResults:a,filters:r,origin:o,view:n,signal:i,...s}=e,c=r?.countries,l=Math.max(1,Math.min(a??5,10)),{placeKinds:u,refinementKinds:d,wantsPlaces:m,wantsRefinements:p}=(e=>{const t=e?.filter(e=>!isRefinementKind(e)),a=e?.filter(isRefinementKind);return{placeKinds:t,refinementKinds:a,wantsPlaces:!e||Boolean(t?.length),wantsRefinements:!e||Boolean(a?.length)}})(r?.kinds),g=o&&{position:o},h=(r?.boundingBox&&{boundingBox:r.boundingBox})??g,y={...omit(s,["onAPIRequest","onAPIResponse"]),query:"",...c&&{filters:{countries:c}},geoBias:h,view:n},S={...s,signal:i,query:t,limit:10,view:n,typeahead:!0,geoBias:h,filters:{countries:c,indexes:u?.flatMap(e=>INDEXES_BY_PLACE_KIND[e]),poiCategories:r?.poiTypes,geographyTypes:r?.areaTypes}},[R,f]=await Promise.all([m?discoverPlaces(S):void 0,p?autocompleteSearch({...s,signal:i,query:t,limit:l,...c&&{filters:{countries:c}},geoBias:g,resultTypes:d??["brand","category"]}):void 0]).catch(throwAsSearchSuggestionsError),T=f?.results??[];if(!m)return{suggestions:toRefinementSuggestions(T,y).slice(0,l)};const P=(R?.features??[]).filter(e=>!u||u.includes(KIND_BY_PLACE_TYPE[e.properties.type]));return{suggestions:blendSuggestions({query:t,concept:pickConcept(t,T,P,y),places:toPlaceSuggestions(P,o),maxResults:l})}},addDays=(e,t)=>{const a=new Date(e);return a.setUTCDate(a.getUTCDate()+t),a},daysAgo=e=>addDays(/* @__PURE__ */new Date,-e),toDateString=e=>e instanceof Date?e.toISOString().slice(0,10):e,startOfDayUTC=e=>Date.parse(toDateString(e)),OFFSET=/(?:Z|[+-]\d{2}:\d{2})$/,parseDateTime=e=>new Date(OFFSET.test(e)?e:`${e}Z`),functionalRoadClasses=["MOTORWAY","MAJOR_ROAD","OTHER_MAJOR_ROAD","SECONDARY_ROAD","LOCAL_CONNECTING_ROAD","LOCAL_ROAD_HIGH_IMPORTANCE","LOCAL_ROAD","LOCAL_ROAD_MINOR_IMPORTANCE","OTHER_ROAD"],API_NAMES_BY_METRIC_KEY={speed:{dataType:"SPEED",field:"v"},freeFlowSpeed:{dataType:"FREE_FLOW_SPEED",field:"fv"},congestionLevel:{dataType:"CONGESTION_LEVEL",field:"c"},travelTime:{dataType:"TRAVEL_TIME",field:"t"},networkLength:{dataType:"NETWORK_LENGTH",field:"l"}},ALL_HOURS=Array.from({length:24},(e,t)=>t),frcToNumber=e=>functionalRoadClasses.indexOf(e),parseMetricFields=(e,t)=>{const a={};return areaAnalyticsMetricKeys.forEach(r=>{const o=e[API_NAMES_BY_METRIC_KEY[r].field];void 0!==o&&(a[r]=t(o))}),a},parseMetrics=e=>parseMetricFields(e,e=>e),parseMetricKey=e=>areaAnalyticsMetricKeys.find(t=>API_NAMES_BY_METRIC_KEY[t].dataType===e),parsePeriodStart=e=>{const t=parseDateTime(e);return{year:t.getUTCFullYear(),month:t.getUTCMonth()+1,date:new Date(startOfDayUTC(t)),hour:t.getUTCHours()}},IDENTIFIERS_BY_GRANULARITY={yearly:({year:e})=>({year:e}),monthly:({year:e,month:t})=>({year:e,month:t}),weekly:({date:e})=>(e=>{const t=addDays(e,4-(e.getUTCDay()||7)),a=t.getUTCFullYear(),r=(t.getTime()-Date.UTC(a,0,1))/864e5;return{year:a,week:Math.floor(r/7)+1}})(e),daily:({date:e})=>({date:e}),hourly:({date:e,hour:t})=>({date:e,hour:t})},parseCalendarEntries=(e,t)=>e.map(e=>({...IDENTIFIERS_BY_GRANULARITY[t](parsePeriodStart(e.time)),...parseMetrics(e)})),DAY_BY_API_DAY_OF_WEEK={MONDAY:1,TUESDAY:2,WEDNESDAY:3,THURSDAY:4,FRIDAY:5,SATURDAY:6,SUNDAY:7},parseAverageEntry=e=>{const[t,a]=e.time.split("-"),r=Object.hasOwn(DAY_BY_API_DAY_OF_WEEK,t)?DAY_BY_API_DAY_OF_WEEK[t]:void 0;return void 0===r?void 0:{day:r,hour:Number(a),...parseMetrics(e)}},hourOfWeek=({day:e,hour:t})=>24*(e-1)+t,parseTileEntry=e=>({tileCentre:[e.lon,e.lat],...parseMetrics(e)}),parseAnomaly=e=>({startDate:parseDateTime(e.startDate),endDate:parseDateTime(e.endDate),labels:e.labels.map(({name:e})=>e)}),parseTimedData=e=>{return{...e.yearly&&{yearly:parseCalendarEntries(e.yearly,"yearly")},...e.monthly&&{monthly:parseCalendarEntries(e.monthly,"monthly")},...e.weekly&&{weekly:parseCalendarEntries(e.weekly,"weekly")},...e.daily&&{daily:parseCalendarEntries(e.daily,"daily")},...e.hourly&&{hourly:parseCalendarEntries(e.hourly,"hourly")},...e.average&&{average:(t=e.average,t.map(parseAverageEntry).filter(e=>void 0!==e).sort((e,t)=>hourOfWeek(e)-hourOfWeek(t)))}};var t},parseAnomalies=e=>parseMetricFields(e,e=>e.map(parseAnomaly)),parseFeature=e=>{return{type:e.type,id:e.id,geometry:e.geometry,properties:(t=e.properties,{...void 0!==t.name&&{name:t.name},...void 0!==t.timezone&&{timezone:t.timezone},level:t.level,baseData:parseMetrics(t.baseData),timedData:parseTimedData(t.timedData),...t.tiledData&&{tiledData:{tiles:t.tiledData.tiles.map(parseTileEntry)}},...t.anomalies&&{anomalies:parseAnomalies(t.anomalies)}}),bbox:bboxFromGeoJSON(e.geometry)};var t},computeTileRanges=e=>{const t=e.flatMap(e=>e.properties.tiledData?.tiles??[]),a={};for(const r of areaAnalyticsMetricKeys){const e=t.map(e=>e[r]).filter(e=>null!=e);e.length>0&&(a[r]={min:Math.min(...e),max:Math.max(...e)})}return a},parseAnalysisPeriod=e=>{const t=e.map(startOfDayUTC);return{startDate:new Date(Math.min(...t)),endDate:new Date(Math.max(...t))}},dateInputSchema=z.union([z.date(),z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Date must be in 'YYYY-MM-DD' format")]),geometrySchema=z.union([z.object({type:z.literal("Polygon"),coordinates:z.array(z.array(z.array(z.number()))).min(1)}),z.object({type:z.literal("MultiPolygon"),coordinates:z.array(z.array(z.array(z.array(z.number())))).min(1)})]),isAccepted=e=>startOfDayUTC(e)<=startOfDayUTC(daysAgo(2)),trafficAreaAnalyticsTemplate={requestValidation:{schema:commonServiceRequestSchema.extend({name:z.string().optional(),startDate:dateInputSchema.optional(),endDate:dateInputSchema.optional(),days:z.array(dateInputSchema).min(1).optional(),metrics:z.union([z.array(z.enum(areaAnalyticsMetricKeys)).min(1),z.literal("all")]),functionalRoadClasses:z.union([z.array(z.enum(functionalRoadClasses)).min(1),z.literal("all")]),hours:z.union([z.array(z.number().int().min(0).max(23)).min(1),z.literal("all")]),geometry:geometrySchema}).refine(e=>{const t=void 0!==e.days,a=void 0!==e.startDate;if(t&&a)return!1;if(!t&&!a)return!1;if(void 0!==e.startDate){const t=e.endDate??daysAgo(3),a=(startOfDayUTC(t)-startOfDayUTC(e.startDate))/864e5;return a>=1&&a<=31}return!0},{message:"Provide either startDate (with optional endDate, at least 1 day apart and within 31 days) or days — but not both"}).refine(e=>void 0!==e.days?e.days.every(isAccepted):void 0===e.endDate||isAccepted(e.endDate),{message:"Dates must be at least 2 days before today"})},buildRequest:e=>{const t=new URL((e=>`${e.commonBaseURL}/areaanalytics/reports/lite`)(e));appendCommonParams(t.searchParams,e);const a=Array.isArray(e.days)?{days:e.days.map(toDateString)}:{startDate:toDateString(e.startDate??daysAgo(4)),endDate:toDateString(e.endDate??daysAgo(3))};return{method:"POST",url:t,data:{name:e.name??`Maps SDK JS Area Analytics Report ${/* @__PURE__ */(new Date).toISOString()}`,...a,dataTypes:("all"===e.metrics?areaAnalyticsMetricKeys:e.metrics).map(e=>API_NAMES_BY_METRIC_KEY[e].dataType),frcs:"all"===e.functionalRoadClasses?functionalRoadClasses.map((e,t)=>t):e.functionalRoadClasses.map(frcToNumber),hours:"all"===e.hours?ALL_HOURS:e.hours,features:[{type:"Feature",geometry:e.geometry}]}}},sendRequest:fetchWith,parseResponse:e=>{const t=e.features.map(parseFeature);return{type:"FeatureCollection",properties:{...parseAnalysisPeriod(e.properties.days),metrics:e.properties.dataTypes.map(parseMetricKey).filter(e=>void 0!==e),heatmap:e.properties.heatmap,frcs:e.properties.frcs,ranges:computeTileRanges(t)},features:t}}},trafficAreaAnalytics=async e=>callService(e,trafficAreaAnalyticsTemplate,"TrafficAreaAnalytics"),DEFAULT_ATTRIBUTES=["incidents.type","incidents.geometry.type","incidents.geometry.coordinates",...Object.keys({id:!0,iconCategory:!0,magnitudeOfDelay:!0,"events.description":!0,"events.code":!0,"events.iconCategory":!0,startTime:!0,endTime:!0,from:!0,to:!0,lengthInMeters:!0,delayInSeconds:!0,roadNumbers:!0,timeValidity:!0,probabilityOfOccurrence:!0,numberOfReports:!0,lastReportTime:!0}).map(e=>`incidents.properties.${e}`)].join(","),parseEvent=e=>({description:e.description,code:e.code,category:toTrafficIncidentCategory(e.iconCategory)}),parseIncident=e=>{const t=e.properties;return{type:"Feature",id:t.id,geometry:e.geometry,properties:{id:t.id,category:toTrafficIncidentCategory(t.iconCategory),magnitudeOfDelay:toDelayMagnitude(t.magnitudeOfDelay),events:(t.events??[]).map(parseEvent),...t.startTime&&{startTime:new Date(t.startTime)},...t.endTime&&{endTime:new Date(t.endTime)},...t.from&&{from:t.from},...t.to&&{to:t.to},...null!=t.lengthInMeters&&{lengthInMeters:t.lengthInMeters},...null!=t.delayInSeconds&&{delayInSeconds:t.delayInSeconds},...t.roadNumbers&&{roadNumbers:t.roadNumbers},timeValidity:t.timeValidity,...t.probabilityOfOccurrence&&{probabilityOfOccurrence:t.probabilityOfOccurrence},...null!=t.numberOfReports&&{numberOfReports:t.numberOfReports},...t.lastReportTime&&{lastReportTime:new Date(t.lastReportTime)}}}},withoutBBox=e=>"Polygon"===e.type?{type:"Polygon",coordinates:e.coordinates}:{type:"MultiPolygon",coordinates:e.coordinates},incidentsIntersecting=(e,t)=>{const a=(e=>"FeatureCollection"===e.type?e.features.map(e=>e.geometry):["Feature"===e.type?e.geometry:e])(t).map(withoutBBox).map(e=>({geometry:e,bbox:bbox(e)}));return e.filter(e=>{const t=bbox(e.geometry);return a.some(a=>{return r=t,o=a.bbox,r[0]<=o[2]&&o[0]<=r[2]&&r[1]<=o[3]&&o[1]<=r[3]&&booleanIntersects(e.geometry,a.geometry);var r,o})})},positionSchema=z.array(z.number()).min(2,"a position needs at least two coordinates"),linearRingSchema=z.array(positionSchema).min(4,"a linear ring needs at least four positions"),polygonCoordinatesSchema=z.array(linearRingSchema).min(1,"a Polygon needs at least one ring"),polygonGeometrySchema=z.discriminatedUnion("type",[z.object({type:z.literal("Polygon"),coordinates:polygonCoordinatesSchema}),z.object({type:z.literal("MultiPolygon"),coordinates:z.array(polygonCoordinatesSchema).min(1,"a MultiPolygon needs at least one polygon")})]),polygonFeatureSchema=z.object({type:z.literal("Feature"),geometry:polygonGeometrySchema,id:z.union([z.string(),z.number()]).optional(),properties:z.unknown().optional()}),polygonSchema=z.union([polygonGeometrySchema,polygonFeatureSchema,z.object({type:z.literal("FeatureCollection"),features:z.array(polygonFeatureSchema).min(1,"a FeatureCollection polygon needs at least one feature")})]),trafficIncidentDetailsTemplate={requestValidation:{schema:commonServiceRequestSchema.extend({bbox:hasBBoxSchema.optional(),polygon:polygonSchema.optional(),ids:z.array(z.string()).min(1,"ids must contain at least one id").optional(),categoryFilter:z.array(z.enum(trafficIncidentRequestCategories)).optional(),timeValidityFilter:z.array(z.enum(["present","future"])).optional()}),refinements:[{check:e=>1===[e.bbox,e.polygon,e.ids].filter(Boolean).length,message:"Provide exactly one of bbox, polygon or ids"}]},apiVersion:2,buildRequest:e=>{const t=new URL((e=>`${e.commonBaseURL}/maps/orbis/traffic/incidents/details`)(e)),a=t.searchParams;((e,t)=>{appendByJoiningParamValue(e,"iconCategories",t.categoryFilter?.map(toIconCategory)),appendByJoiningParamValue(e,"timeValidity",t.timeValidityFilter)})(a,e);const r=(e=>({...buildCommonServiceRequestHeaders(e),Attributes:DEFAULT_ATTRIBUTES}))(e);if(e.ids){const{ids:o}=e;return o.length>5?{method:"POST",url:t,headers:r,data:{ids:o}}:(a.append("ids",o.join(",")),{method:"GET",url:t,headers:r})}const o=e.polygon?bbox(e.polygon,{recompute:!0}):bboxFromGeoJSON(e.bbox);return o&&a.append("bbox",o.join(",")),{method:"GET",url:t,headers:r}},sendRequest:fetchWith,parseResponse:(e,t)=>{const a=(e.incidents??[]).filter(e=>null!==e).map(parseIncident);return{type:"FeatureCollection",features:t?.polygon?incidentsIntersecting(a,t.polygon):a}}},trafficIncidentDetails=async e=>callService(e,trafficIncidentDetailsTemplate,"TrafficIncidentDetails");export{APIErrorCode,SDKAbortError,SDKError,SDKServiceError,alongRouteSearch,budgetTypes,buildResponseError,buildValidationError,calculateReachableRange,calculateReachableRanges,calculateRoute,createLatestRequest,discoverOnePlace,discoverPlaces,evChargingStationsAvailability,geocode,geocodeOne,geometryData,getPOICategories,getPOICategoryCodes,getPlaceDetails,getPlaceWithEVAvailability,getPlacesWithEVAvailability,getSearchSuggestions,hasChargingAvailability,parseDefaultResponseError,reverseGeocode,routeTypes,tollTransponderOptions,trafficAreaAnalytics,trafficIncidentDetails};
2
2
  //# sourceMappingURL=services.es.js.map