diff --git a/docs/index.html b/docs/index.html index 85c14ee..dd7a974 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,10 +3,10 @@ OSRM Documentation - - + + -

Redirecting to latest documentation

+

Redirecting to latest documentation

diff --git a/docs/v26.5.0/404.html b/docs/v26.5.0/404.html new file mode 100644 index 0000000..9958e04 --- /dev/null +++ b/docs/v26.5.0/404.html @@ -0,0 +1,22 @@ + + + + + + 404 | OSRM API Documentation + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/assets/app.C5ektlIn.js b/docs/v26.5.0/assets/app.C5ektlIn.js new file mode 100644 index 0000000..cb2fbed --- /dev/null +++ b/docs/v26.5.0/assets/app.C5ektlIn.js @@ -0,0 +1 @@ +import{t as p}from"./chunks/theme.CRHW4GoY.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.C2NLiVii.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/docs/v26.5.0/assets/chunks/@localSearchIndexroot.D9qikBrG.js b/docs/v26.5.0/assets/chunks/@localSearchIndexroot.D9qikBrG.js new file mode 100644 index 0000000..46a8f27 --- /dev/null +++ b/docs/v26.5.0/assets/chunks/@localSearchIndexroot.D9qikBrG.js @@ -0,0 +1 @@ +const e='{"documentCount":235,"nextId":235,"documentIds":{"0":"/cucumber#cucumber","1":"/cucumber#tl-dr","2":"/cucumber#single-osrm-configuration","3":"/cucumber#profiles","4":"/cucumber#arguments","5":"/cucumber#all-osrm-configurations","6":"/cucumber#cache","7":"/cucumber#configuration","8":"/cucumber#other-environment-variables","9":"/cucumber#tags","10":"/developing#developing-debugging-guidance-code","11":"/developing#how-to-use-geojson-debugging","12":"/developing#outputting-into-a-single-file","13":"/developing#possible-scopeguard-location","14":"/developing#limitations","15":"/#getting-started","16":"/#documentation","17":"/#resources","18":"/http#osrm-http-server","19":"/http#general-options","20":"/http#requests","21":"/http#example-requests","22":"/http#responses","23":"/http#code","24":"/http#data-version","25":"/http#example-response","26":"/http#services","27":"/http#nearest-service","28":"/http#example-requests-1","29":"/http#example-response-1","30":"/http#route-service","31":"/http#example-request","32":"/http#table-service","33":"/http#example-request-1","34":"/http#example-response-2","35":"/http#match-service","36":"/http#trip-service","37":"/http#example-requests-2","38":"/http#response","39":"/http#tile-service","40":"/http#example-request-2","41":"/http#example-response-3","42":"/http#result-objects","43":"/http#route-object","44":"/http#example","45":"/http#routeleg-object","46":"/http#example-1","47":"/http#annotation-object","48":"/http#example-2","49":"/http#routestep-object","50":"/http#example-3","51":"/http#stepmaneuver-object","52":"/http#lane-object","53":"/http#example-4","54":"/http#intersection-object","55":"/http#example-5","56":"/http#waypoint-object","57":"/http#example-6","58":"/http#flatbuffers-format","59":"/http#root-object","60":"/http#error-object","61":"/http#waypoint-object-1","62":"/http#routeobject-object","63":"/http#leg-object","64":"/http#step-object","65":"/http#intersection-object-1","66":"/http#lane-object-1","67":"/http#stepmaneuver-object-1","68":"/http#annotation-object-1","69":"/http#position-object","70":"/http#uint64pair","71":"/http#table-object","72":"/libosrm#introduction","73":"/libosrm#important-interface-objects","74":"/libosrm#example","75":"/libosrm#workflow","76":"/nodejs/api#osrm","77":"/nodejs/api#parameters","78":"/nodejs/api#route","79":"/nodejs/api#parameters-1","80":"/nodejs/api#examples","81":"/nodejs/api#nearest","82":"/nodejs/api#parameters-2","83":"/nodejs/api#examples-1","84":"/nodejs/api#table","85":"/nodejs/api#parameters-3","86":"/nodejs/api#examples-2","87":"/nodejs/api#tile","88":"/nodejs/api#parameters-4","89":"/nodejs/api#examples-3","90":"/nodejs/api#match","91":"/nodejs/api#parameters-5","92":"/nodejs/api#examples-4","93":"/nodejs/api#trip","94":"/nodejs/api#parameters-6","95":"/nodejs/api#examples-5","96":"/nodejs/api#configuration","97":"/nodejs/api#parameters-7","98":"/nodejs/api#examples-6","99":"/nodejs/api#responses","100":"/nodejs/api#route-1","101":"/nodejs/api#parameters-8","102":"/nodejs/api#routeleg","103":"/nodejs/api#parameters-9","104":"/nodejs/api#routestep","105":"/nodejs/api#parameters-10","106":"/nodejs/api#stepmaneuver","107":"/nodejs/api#parameters-11","108":"/nodejs/api#waypoint","109":"/nodejs/api#parameters-12","110":"/python/api#python-api","111":"/python/api#osrm","112":"/python/api#parameters","113":"/python/api#services","114":"/python/api#route","115":"/python/api#routeparameters","116":"/python/api#table","117":"/python/api#tableparameters","118":"/python/api#nearest","119":"/python/api#nearestparameters","120":"/python/api#match","121":"/python/api#matchparameters","122":"/python/api#trip","123":"/python/api#tripparameters","124":"/python/api#tile","125":"/python/api#tileparameters","126":"/python/api#baseparameters","127":"/python/api#types","128":"/python/api#coordinate","129":"/python/api#bearing","130":"/python/api#object-array","131":"/python/api#cli","132":"/python/development#python-bindings-development-guide","133":"/python/development#installing-for-production","134":"/python/development#installing-for-development","135":"/python/development#platform-specific-build-requirements","136":"/python/development#linux","137":"/python/development#macos","138":"/python/development#windows","139":"/python/development#building-locally","140":"/python/development#editable-install-recommended-for-development","141":"/python/development#building-a-wheel","142":"/python/development#wheel-repair","143":"/python/development#compiler-cache","144":"/python/development#running-tests","145":"/python/development#running-cibuildwheel-locally","146":"/python/development#type-stubs","147":"/python/development#releasing","148":"/python/development#scheduled-monthly-release","149":"/python/development#manual-release","150":"/python/development#verification","151":"/python/development#version-mechanics","152":"/profiles#osrm-profiles","153":"/profiles#available-profiles","154":"/profiles#using-multiple-profiles-with-the-same-input","155":"/profiles#processing-flow","156":"/profiles#profiles-are-written-in-lua","157":"/profiles#basic-structure-of-profiles","158":"/profiles#understanding-speed-weight-and-rate","159":"/profiles#elements","160":"/profiles#api-version","161":"/profiles#library-files","162":"/profiles#setup","163":"/profiles#process-node-profile-node-result-relations","164":"/profiles#obstacle","165":"/profiles#obstacle-type","166":"/profiles#obstacle-direction","167":"/profiles#obstacle-map","168":"/profiles#obstacle-map-add-node-obstacle","169":"/profiles#obstacle-map-any-from-to-type","170":"/profiles#obstacle-map-get-from-to-type","171":"/profiles#process-way-profile-way-result-relations","172":"/profiles#way-names","173":"/profiles#process-segment-profile-segment","174":"/profiles#process-turn-profile-turn","175":"/profiles#from-via-and-to","176":"/profiles#source-road-target-road-roads-on-the-right-and-roads-on-the-left","177":"/profiles#highway-turn-classification-and-access-turn-classification","178":"/profiles#guidance","179":"/profiles#using-raster-data","180":"/profiles#helper-functions","181":"/releasing#releasing-a-new-osrm-version","182":"/releasing#version-history","183":"/releasing#versioning-scheme","184":"/releasing#format","185":"/releasing#examples","186":"/releasing#release-compatibility-guarantees","187":"/releasing#patch-version-change-new-patchlevel-in-same-month","188":"/releasing#month-change-new-yyyy-mm","189":"/releasing#conventional-commits","190":"/releasing#release-management","191":"/releasing#automated-release-process","192":"/releasing#manual-release-trigger","193":"/releasing#release-checklist","194":"/releasing#after-release","195":"/routed#environment-variables","196":"/routed#shm-lock-dir","197":"/routed#signal-parent-when-ready","198":"/routed#disable-access-logging","199":"/testing#testsuite","200":"/testing#unit-tests","201":"/testing#separate-test-binaries","202":"/testing#using-boost-test-primitives","203":"/testing#test-fixture","204":"/testing#running-tests","205":"/testing#cucumber","206":"/testing#test-the-feature","207":"/testing#write-tests-to-scale","208":"/testing#use-names","209":"/testing#test-all-directions","210":"/testing#prevent-randomness","211":"/testing#use-waypoints","212":"/testing#allow-for-small-offsets","213":"/testing#don-t-rely-on-alternatives","214":"/testing#understanding-turn-restrictions","215":"/testing#my-guidance-tests-are-failing-understanding-what-you-can-change","216":"/testing#don-t-change-the-test-change-the-expected-behaviour","217":"/testing#consider-post-processing-impacts","218":"/testing#use-caution","219":"/tools#command-line-tools","220":"/tools#common-options","221":"/tools#list-inputs","222":"/tools#osrm-extract","223":"/tools#osrm-partition","224":"/tools#osrm-customize","225":"/tools#osrm-contract","226":"/tools#osrm-routed","227":"/tools#server","228":"/tools#data-loading","229":"/tools#query-limits","230":"/tools#osrm-datastore","231":"/windows-deps#building-osrm-for-windows","232":"/windows-deps#dependencies","233":"/windows-deps#prerequisites","234":"/windows-deps#building"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,25],"1":[2,1,9],"2":[3,1,53],"3":[1,4,84],"4":[1,4,42],"5":[3,1,30],"6":[1,1,36],"7":[1,1,111],"8":[3,2,29],"9":[1,1,80],"10":[4,1,46],"11":[5,4,20],"12":[5,4,120],"13":[3,9,84],"14":[1,4,73],"15":[2,1,25],"16":[1,1,14],"17":[1,1,7],"18":[3,1,33],"19":[2,3,19],"20":[1,5,218],"21":[2,6,39],"22":[1,5,1],"23":[1,6,88],"24":[2,6,38],"25":[2,6,14],"26":[1,3,1],"27":[2,4,104],"28":[2,6,32],"29":[2,6,33],"30":[2,4,168],"31":[2,6,31],"32":[2,4,133],"33":[2,6,139],"34":[2,6,57],"35":[2,4,282],"36":[2,4,169],"37":[2,6,38],"38":[1,6,71],"39":[2,4,78],"40":[2,6,23],"41":[2,6,204],"42":[2,3,1],"43":[2,5,72],"44":[1,7,28],"45":[2,5,76],"46":[1,7,35],"47":[2,5,85],"48":[1,7,25],"49":[2,5,121],"50":[1,7,50],"51":[2,5,224],"52":[2,5,77],"53":[1,7,7],"54":[2,5,136],"55":[1,7,27],"56":[2,5,67],"57":[1,7,15],"58":[2,3,71],"59":[2,5,82],"60":[2,5,10],"61":[2,5,21],"62":[2,5,34],"63":[2,5,23],"64":[2,5,166],"65":[2,5,26],"66":[2,5,54],"67":[2,5,155],"68":[2,5,8],"69":[2,5,11],"70":[1,5,18],"71":[2,5,60],"72":[1,1,65],"73":[3,1,207],"74":[1,1,8],"75":[1,1,25],"76":[1,1,81],"77":[1,1,121],"78":[1,1,15],"79":[1,2,223],"80":[1,2,44],"81":[1,1,24],"82":[1,2,126],"83":[1,2,52],"84":[1,1,17],"85":[1,2,165],"86":[1,2,78],"87":[1,1,53],"88":[1,2,33],"89":[1,2,29],"90":[1,1,53],"91":[1,2,187],"92":[1,2,110],"93":[1,1,71],"94":[1,2,153],"95":[1,2,66],"96":[1,1,17],"97":[1,1,79],"98":[1,1,29],"99":[1,1,1],"100":[1,1,8],"101":[1,2,6],"102":[1,1,7],"103":[1,2,6],"104":[1,1,22],"105":[1,2,6],"106":[1,1,1],"107":[1,2,6],"108":[1,1,9],"109":[1,2,6],"110":[2,1,19],"111":[1,2,55],"112":[1,3,64],"113":[1,3,23],"114":[1,2,34],"115":[1,3,63],"116":[1,2,30],"117":[1,3,41],"118":[1,2,25],"119":[1,3,15],"120":[1,2,37],"121":[1,3,34],"122":[1,2,35],"123":[1,3,21],"124":[1,2,22],"125":[1,3,9],"126":[1,2,65],"127":[1,2,1],"128":[1,3,13],"129":[1,3,10],"130":[2,3,36],"131":[1,2,28],"132":[4,1,1],"133":[3,4,71],"134":[3,4,29],"135":[4,4,1],"136":[1,8,116],"137":[1,8,49],"138":[1,8,43],"139":[2,4,1],"140":[6,6,133],"141":[3,6,41],"142":[2,6,111],"143":[2,6,47],"144":[2,4,37],"145":[3,4,130],"146":[2,4,53],"147":[1,4,35],"148":[3,5,98],"149":[2,5,38],"150":[1,5,40],"151":[2,5,38],"152":[2,1,66],"153":[2,2,51],"154":[7,3,35],"155":[2,2,45],"156":[5,2,43],"157":[4,2,134],"158":[5,2,146],"159":[1,2,1],"160":[2,3,35],"161":[2,3,77],"162":[2,3,179],"163":[6,3,70],"164":[1,3,83],"165":[2,4,23],"166":[2,4,12],"167":[2,3,53],"168":[5,5,70],"169":[7,5,75],"170":[7,5,78],"171":[6,3,219],"172":[2,3,91],"173":[4,3,116],"174":[4,3,143],"175":[4,7,12],"176":[9,7,124],"177":[5,7,66],"178":[1,2,83],"179":[3,3,112],"180":[2,3,21],"181":[5,1,46],"182":[2,5,57],"183":[2,5,1],"184":[1,7,42],"185":[1,7,26],"186":[3,5,1],"187":[9,8,18],"188":[6,8,37],"189":[2,5,52],"190":[2,5,47],"191":[3,5,67],"192":[3,5,60],"193":[2,5,51],"194":[2,5,43],"195":[2,1,1],"196":[3,2,42],"197":[4,2,44],"198":[3,2,29],"199":[1,1,21],"200":[2,1,13],"201":[3,3,33],"202":[4,3,78],"203":[2,3,66],"204":[2,3,23],"205":[1,1,31],"206":[3,2,39],"207":[4,2,106],"208":[2,2,92],"209":[3,2,97],"210":[2,2,21],"211":[2,4,78],"212":[4,4,39],"213":[5,4,25],"214":[3,2,111],"215":[10,1,90],"216":[7,11,126],"217":[4,11,96],"218":[2,11,34],"219":[3,1,35],"220":[2,3,58],"221":[3,5,40],"222":[2,3,124],"223":[2,3,93],"224":[2,3,84],"225":[2,3,84],"226":[2,3,19],"227":[1,5,44],"228":[2,5,59],"229":[2,5,49],"230":[2,3,102],"231":[4,1,10],"232":[1,4,43],"233":[1,4,29],"234":[1,4,42]},"averageFieldLength":[2.153191489361703,3.574468085106383,58.50212765957448],"storedFields":{"0":{"title":"Cucumber","titles":[]},"1":{"title":"tl;dr","titles":["Cucumber"]},"2":{"title":"Single OSRM Configuration","titles":["Cucumber"]},"3":{"title":"Profiles","titles":["Cucumber","Single OSRM Configuration"]},"4":{"title":"Arguments","titles":["Cucumber","Single OSRM Configuration"]},"5":{"title":"All OSRM Configurations","titles":["Cucumber"]},"6":{"title":"Cache","titles":["Cucumber"]},"7":{"title":"Configuration","titles":["Cucumber"]},"8":{"title":"Other environment variables","titles":["Cucumber","Configuration"]},"9":{"title":"Tags","titles":["Cucumber"]},"10":{"title":"Developing / Debugging guidance code","titles":[]},"11":{"title":"How to use GeoJson-Debugging","titles":["Developing / Debugging guidance code"]},"12":{"title":"Outputting into a single file","titles":["Developing / Debugging guidance code"]},"13":{"title":"Possible Scopeguard Location","titles":["Developing / Debugging guidance code","Outputting into a single file"]},"14":{"title":"Limitations","titles":["Developing / Debugging guidance code"]},"15":{"title":"Getting Started","titles":[]},"16":{"title":"Documentation","titles":[]},"17":{"title":"Resources","titles":[]},"18":{"title":"OSRM HTTP server","titles":[]},"19":{"title":"General options","titles":["OSRM HTTP server"]},"20":{"title":"Requests","titles":["OSRM HTTP server","General options"]},"21":{"title":"Example Requests","titles":["OSRM HTTP server","General options","Requests"]},"22":{"title":"Responses","titles":["OSRM HTTP server","General options"]},"23":{"title":"Code","titles":["OSRM HTTP server","General options","Responses"]},"24":{"title":"Data version","titles":["OSRM HTTP server","General options","Responses"]},"25":{"title":"Example response","titles":["OSRM HTTP server","General options","Responses"]},"26":{"title":"Services","titles":["OSRM HTTP server"]},"27":{"title":"Nearest service","titles":["OSRM HTTP server","Services"]},"28":{"title":"Example Requests","titles":["OSRM HTTP server","Services","Nearest service"]},"29":{"title":"Example Response","titles":["OSRM HTTP server","Services","Nearest service"]},"30":{"title":"Route service","titles":["OSRM HTTP server","Services"]},"31":{"title":"Example Request","titles":["OSRM HTTP server","Services","Route service"]},"32":{"title":"Table service","titles":["OSRM HTTP server","Services"]},"33":{"title":"Example Request","titles":["OSRM HTTP server","Services","Table service"]},"34":{"title":"Example Response","titles":["OSRM HTTP server","Services","Table service"]},"35":{"title":"Match service","titles":["OSRM HTTP server","Services"]},"36":{"title":"Trip service","titles":["OSRM HTTP server","Services"]},"37":{"title":"Example Requests","titles":["OSRM HTTP server","Services","Trip service"]},"38":{"title":"Response","titles":["OSRM HTTP server","Services","Trip service"]},"39":{"title":"Tile service","titles":["OSRM HTTP server","Services"]},"40":{"title":"Example request","titles":["OSRM HTTP server","Services","Tile service"]},"41":{"title":"Example response","titles":["OSRM HTTP server","Services","Tile service"]},"42":{"title":"Result objects","titles":["OSRM HTTP server"]},"43":{"title":"Route object","titles":["OSRM HTTP server","Result objects"]},"44":{"title":"Example","titles":["OSRM HTTP server","Result objects","Route object"]},"45":{"title":"RouteLeg object","titles":["OSRM HTTP server","Result objects"]},"46":{"title":"Example","titles":["OSRM HTTP server","Result objects","RouteLeg object"]},"47":{"title":"Annotation object","titles":["OSRM HTTP server","Result objects"]},"48":{"title":"Example","titles":["OSRM HTTP server","Result objects","Annotation object"]},"49":{"title":"RouteStep object","titles":["OSRM HTTP server","Result objects"]},"50":{"title":"Example","titles":["OSRM HTTP server","Result objects","RouteStep object"]},"51":{"title":"StepManeuver object","titles":["OSRM HTTP server","Result objects"]},"52":{"title":"Lane object","titles":["OSRM HTTP server","Result objects"]},"53":{"title":"Example","titles":["OSRM HTTP server","Result objects","Lane object"]},"54":{"title":"Intersection object","titles":["OSRM HTTP server","Result objects"]},"55":{"title":"Example","titles":["OSRM HTTP server","Result objects","Intersection object"]},"56":{"title":"Waypoint object","titles":["OSRM HTTP server","Result objects"]},"57":{"title":"Example","titles":["OSRM HTTP server","Result objects","Waypoint object"]},"58":{"title":"Flatbuffers format","titles":["OSRM HTTP server"]},"59":{"title":"Root object","titles":["OSRM HTTP server","Flatbuffers format"]},"60":{"title":"Error object","titles":["OSRM HTTP server","Flatbuffers format"]},"61":{"title":"Waypoint object","titles":["OSRM HTTP server","Flatbuffers format"]},"62":{"title":"RouteObject object","titles":["OSRM HTTP server","Flatbuffers format"]},"63":{"title":"Leg object","titles":["OSRM HTTP server","Flatbuffers format"]},"64":{"title":"Step object","titles":["OSRM HTTP server","Flatbuffers format"]},"65":{"title":"Intersection object","titles":["OSRM HTTP server","Flatbuffers format"]},"66":{"title":"Lane object","titles":["OSRM HTTP server","Flatbuffers format"]},"67":{"title":"StepManeuver object","titles":["OSRM HTTP server","Flatbuffers format"]},"68":{"title":"Annotation object","titles":["OSRM HTTP server","Flatbuffers format"]},"69":{"title":"Position object","titles":["OSRM HTTP server","Flatbuffers format"]},"70":{"title":"Uint64Pair","titles":["OSRM HTTP server","Flatbuffers format"]},"71":{"title":"Table object","titles":["OSRM HTTP server","Flatbuffers format"]},"72":{"title":"Introduction","titles":[]},"73":{"title":"Important interface objects","titles":[]},"74":{"title":"Example","titles":[]},"75":{"title":"Workflow","titles":[]},"76":{"title":"OSRM","titles":[]},"77":{"title":"Parameters","titles":["OSRM"]},"78":{"title":"route","titles":["OSRM"]},"79":{"title":"Parameters","titles":["OSRM","route"]},"80":{"title":"Examples","titles":["OSRM","route"]},"81":{"title":"nearest","titles":["OSRM"]},"82":{"title":"Parameters","titles":["OSRM","nearest"]},"83":{"title":"Examples","titles":["OSRM","nearest"]},"84":{"title":"table","titles":["OSRM"]},"85":{"title":"Parameters","titles":["OSRM","table"]},"86":{"title":"Examples","titles":["OSRM","table"]},"87":{"title":"tile","titles":["OSRM"]},"88":{"title":"Parameters","titles":["OSRM","tile"]},"89":{"title":"Examples","titles":["OSRM","tile"]},"90":{"title":"match","titles":["OSRM"]},"91":{"title":"Parameters","titles":["OSRM","match"]},"92":{"title":"Examples","titles":["OSRM","match"]},"93":{"title":"trip","titles":["OSRM"]},"94":{"title":"Parameters","titles":["OSRM","trip"]},"95":{"title":"Examples","titles":["OSRM","trip"]},"96":{"title":"Configuration","titles":[]},"97":{"title":"Parameters","titles":["Configuration"]},"98":{"title":"Examples","titles":["Configuration"]},"99":{"title":"Responses","titles":[]},"100":{"title":"Route","titles":["Responses"]},"101":{"title":"Parameters","titles":["Responses","Route"]},"102":{"title":"RouteLeg","titles":["Responses"]},"103":{"title":"Parameters","titles":["Responses","RouteLeg"]},"104":{"title":"RouteStep","titles":["Responses"]},"105":{"title":"Parameters","titles":["Responses","RouteStep"]},"106":{"title":"StepManeuver","titles":["Responses"]},"107":{"title":"Parameters","titles":["Responses","StepManeuver"]},"108":{"title":"Waypoint","titles":["Responses"]},"109":{"title":"Parameters","titles":["Responses","Waypoint"]},"110":{"title":"Python API","titles":[]},"111":{"title":"OSRM","titles":["Python API"]},"112":{"title":"Parameters","titles":["Python API","OSRM"]},"113":{"title":"Services","titles":["Python API","OSRM"]},"114":{"title":"Route","titles":["Python API"]},"115":{"title":"RouteParameters","titles":["Python API","Route"]},"116":{"title":"Table","titles":["Python API"]},"117":{"title":"TableParameters","titles":["Python API","Table"]},"118":{"title":"Nearest","titles":["Python API"]},"119":{"title":"NearestParameters","titles":["Python API","Nearest"]},"120":{"title":"Match","titles":["Python API"]},"121":{"title":"MatchParameters","titles":["Python API","Match"]},"122":{"title":"Trip","titles":["Python API"]},"123":{"title":"TripParameters","titles":["Python API","Trip"]},"124":{"title":"Tile","titles":["Python API"]},"125":{"title":"TileParameters","titles":["Python API","Tile"]},"126":{"title":"BaseParameters","titles":["Python API"]},"127":{"title":"Types","titles":["Python API"]},"128":{"title":"Coordinate","titles":["Python API","Types"]},"129":{"title":"Bearing","titles":["Python API","Types"]},"130":{"title":"Object / Array","titles":["Python API","Types"]},"131":{"title":"CLI","titles":["Python API"]},"132":{"title":"Python Bindings Development Guide","titles":[]},"133":{"title":"Installing for production","titles":["Python Bindings Development Guide"]},"134":{"title":"Installing for development","titles":["Python Bindings Development Guide"]},"135":{"title":"Platform-specific build requirements","titles":["Python Bindings Development Guide"]},"136":{"title":"Linux","titles":["Python Bindings Development Guide","Platform-specific build requirements"]},"137":{"title":"macOS","titles":["Python Bindings Development Guide","Platform-specific build requirements"]},"138":{"title":"Windows","titles":["Python Bindings Development Guide","Platform-specific build requirements"]},"139":{"title":"Building locally","titles":["Python Bindings Development Guide"]},"140":{"title":"Editable install (recommended for development)","titles":["Python Bindings Development Guide","Building locally"]},"141":{"title":"Building a wheel","titles":["Python Bindings Development Guide","Building locally"]},"142":{"title":"Wheel repair","titles":["Python Bindings Development Guide","Building locally"]},"143":{"title":"Compiler cache","titles":["Python Bindings Development Guide","Building locally"]},"144":{"title":"Running tests","titles":["Python Bindings Development Guide"]},"145":{"title":"Running cibuildwheel locally","titles":["Python Bindings Development Guide"]},"146":{"title":"Type stubs","titles":["Python Bindings Development Guide"]},"147":{"title":"Releasing","titles":["Python Bindings Development Guide"]},"148":{"title":"Scheduled monthly release","titles":["Python Bindings Development Guide","Releasing"]},"149":{"title":"Manual release","titles":["Python Bindings Development Guide","Releasing"]},"150":{"title":"Verification","titles":["Python Bindings Development Guide","Releasing"]},"151":{"title":"Version mechanics","titles":["Python Bindings Development Guide","Releasing"]},"152":{"title":"OSRM profiles","titles":[]},"153":{"title":"Available profiles","titles":["OSRM profiles"]},"154":{"title":"Using Multiple Profiles with the Same Input","titles":["OSRM profiles","Available profiles"]},"155":{"title":"Processing flow","titles":["OSRM profiles"]},"156":{"title":"Profiles are written in Lua","titles":["OSRM profiles"]},"157":{"title":"Basic structure of profiles","titles":["OSRM profiles"]},"158":{"title":"Understanding speed, weight and rate","titles":["OSRM profiles"]},"159":{"title":"Elements","titles":["OSRM profiles"]},"160":{"title":"api_version","titles":["OSRM profiles","Elements"]},"161":{"title":"Library files","titles":["OSRM profiles","Elements"]},"162":{"title":"setup()","titles":["OSRM profiles","Elements"]},"163":{"title":"process_node(profile, node, result, relations)","titles":["OSRM profiles","Elements"]},"164":{"title":"Obstacle","titles":["OSRM profiles","Elements"]},"165":{"title":"obstacle_type","titles":["OSRM profiles","Elements","Obstacle"]},"166":{"title":"obstacle_direction","titles":["OSRM profiles","Elements","Obstacle"]},"167":{"title":"obstacle_map","titles":["OSRM profiles","Elements"]},"168":{"title":"obstacle_map:add(node, obstacle)","titles":["OSRM profiles","Elements","obstacle_map"]},"169":{"title":"obstacle_map:any(from, to, type)","titles":["OSRM profiles","Elements","obstacle_map"]},"170":{"title":"obstacle_map:get(from, to, type)","titles":["OSRM profiles","Elements","obstacle_map"]},"171":{"title":"process_way(profile, way, result, relations)","titles":["OSRM profiles","Elements"]},"172":{"title":"Way names","titles":["OSRM profiles","Elements"]},"173":{"title":"process_segment(profile, segment)","titles":["OSRM profiles","Elements"]},"174":{"title":"process_turn(profile, turn)","titles":["OSRM profiles","Elements"]},"175":{"title":"from, via, and to","titles":["OSRM profiles","Elements","process_turn(profile, turn)"]},"176":{"title":"source_road, target_road, roads_on_the_right, and roads_on_the_left","titles":["OSRM profiles","Elements","process_turn(profile, turn)"]},"177":{"title":"highway_turn_classification and access_turn_classification","titles":["OSRM profiles","Elements","process_turn(profile, turn)"]},"178":{"title":"Guidance","titles":["OSRM profiles"]},"179":{"title":"Using raster data","titles":["OSRM profiles","Guidance"]},"180":{"title":"Helper functions","titles":["OSRM profiles","Guidance"]},"181":{"title":"Releasing a new OSRM version","titles":[]},"182":{"title":"Version History","titles":["Releasing a new OSRM version"]},"183":{"title":"Versioning Scheme","titles":["Releasing a new OSRM version"]},"184":{"title":"Format","titles":["Releasing a new OSRM version","Versioning Scheme"]},"185":{"title":"Examples","titles":["Releasing a new OSRM version","Versioning Scheme"]},"186":{"title":"Release Compatibility Guarantees","titles":["Releasing a new OSRM version"]},"187":{"title":"Patch version change (new patchlevel in same month)","titles":["Releasing a new OSRM version","Release Compatibility Guarantees"]},"188":{"title":"Month change (new YYYY-MM)","titles":["Releasing a new OSRM version","Release Compatibility Guarantees"]},"189":{"title":"Conventional Commits","titles":["Releasing a new OSRM version"]},"190":{"title":"Release Management","titles":["Releasing a new OSRM version"]},"191":{"title":"Automated Release Process","titles":["Releasing a new OSRM version"]},"192":{"title":"Manual Release Trigger","titles":["Releasing a new OSRM version"]},"193":{"title":"Release Checklist","titles":["Releasing a new OSRM version"]},"194":{"title":"After Release","titles":["Releasing a new OSRM version"]},"195":{"title":"Environment Variables","titles":[]},"196":{"title":"SHM_LOCK_DIR","titles":["Environment Variables"]},"197":{"title":"SIGNAL_PARENT_WHEN_READY","titles":["Environment Variables"]},"198":{"title":"DISABLE_ACCESS_LOGGING","titles":["Environment Variables"]},"199":{"title":"Testsuite","titles":[]},"200":{"title":"Unit Tests","titles":["Testsuite"]},"201":{"title":"Separate Test Binaries","titles":["Testsuite","Unit Tests"]},"202":{"title":"Using Boost.Test Primitives","titles":["Testsuite","Unit Tests"]},"203":{"title":"Test Fixture","titles":["Testsuite","Unit Tests"]},"204":{"title":"Running Tests","titles":["Testsuite","Unit Tests"]},"205":{"title":"Cucumber","titles":["Testsuite"]},"206":{"title":"Test the feature","titles":["Testsuite","Cucumber"]},"207":{"title":"Write Tests to Scale","titles":["Testsuite","Cucumber"]},"208":{"title":"Use names","titles":["Testsuite","Cucumber"]},"209":{"title":"Test all directions","titles":["Testsuite","Cucumber"]},"210":{"title":"Prevent Randomness","titles":["Testsuite","Cucumber"]},"211":{"title":"Use Waypoints","titles":["Testsuite","Cucumber","Prevent Randomness"]},"212":{"title":"Allow For Small Offsets","titles":["Testsuite","Cucumber","Prevent Randomness"]},"213":{"title":"Don\'t Rely on Alternatives","titles":["Testsuite","Cucumber","Prevent Randomness"]},"214":{"title":"Understanding Turn Restrictions","titles":["Testsuite","Cucumber"]},"215":{"title":"My Guidance Tests are Failing - Understanding what you can change","titles":["Testsuite"]},"216":{"title":"Don\'t change the test, change the expected behaviour","titles":["Testsuite","My Guidance Tests are Failing - Understanding what you can change"]},"217":{"title":"Consider Post-Processing Impacts","titles":["Testsuite","My Guidance Tests are Failing - Understanding what you can change"]},"218":{"title":"Use Caution","titles":["Testsuite","My Guidance Tests are Failing - Understanding what you can change"]},"219":{"title":"Command-Line Tools","titles":[]},"220":{"title":"Common Options","titles":["Command-Line Tools"]},"221":{"title":"--list-inputs","titles":["Command-Line Tools","Common Options"]},"222":{"title":"osrm-extract","titles":["Command-Line Tools"]},"223":{"title":"osrm-partition","titles":["Command-Line Tools"]},"224":{"title":"osrm-customize","titles":["Command-Line Tools"]},"225":{"title":"osrm-contract","titles":["Command-Line Tools"]},"226":{"title":"osrm-routed","titles":["Command-Line Tools"]},"227":{"title":"Server","titles":["Command-Line Tools","osrm-routed"]},"228":{"title":"Data loading","titles":["Command-Line Tools","osrm-routed"]},"229":{"title":"Query limits","titles":["Command-Line Tools","osrm-routed"]},"230":{"title":"osrm-datastore","titles":["Command-Line Tools"]},"231":{"title":"Building OSRM for Windows","titles":[]},"232":{"title":"Dependencies","titles":["Building OSRM for Windows"]},"233":{"title":"Prerequisites","titles":["Building OSRM for Windows"]},"234":{"title":"Building","titles":["Building OSRM for Windows"]}},"dirtCount":0,"index":[["✅",{"2":{"193":4}}],["→",{"2":{"182":2,"192":1}}],["~=",{"2":{"179":2}}],["~dpxkkhz`",{"2":{"33":1}}],["$base$line",{"2":{"221":1}}],["$",{"2":{"145":1,"148":1,"221":2}}],["$vcpkg",{"2":{"145":1}}],["$pwd",{"2":{"138":1}}],["$env",{"2":{"138":1,"140":1}}],["ẁaypoint",{"2":{"83":1,"86":2,"92":1}}],["|",{"2":{"77":1,"79":1,"91":1,"94":1,"112":1,"115":1,"126":4,"176":4,"207":20,"208":82,"209":57,"211":40,"214":63,"216":14}}],["+x=x",{"2":{"174":1}}],["+",{"2":{"71":2,"148":2,"169":1,"170":2,"209":5,"225":1}}],["+180",{"2":{"41":2}}],["year",{"2":{"181":1,"182":1,"184":2}}],["yes",{"2":{"36":7,"93":5,"211":8,"214":6}}],["yyyy",{"0":{"188":1},"2":{"148":1,"149":1,"181":1,"191":1}}],["yml",{"2":{"147":1,"148":1,"149":1,"151":1}}],["y=11948",{"2":{"124":1}}],["y",{"2":{"39":2,"88":1,"125":2}}],["yourself",{"2":{"73":1,"136":1}}],["your",{"2":{"8":1,"10":1,"12":2,"73":2,"145":1,"158":1,"160":1,"168":1,"179":3,"192":1,"202":1,"216":1,"217":3,"218":1}}],["you",{"0":{"215":1},"1":{"216":1,"217":1,"218":1},"2":{"3":3,"4":1,"5":1,"7":1,"10":1,"12":1,"13":4,"20":3,"36":1,"39":1,"41":1,"56":1,"72":1,"73":10,"76":3,"77":3,"79":3,"87":1,"140":1,"142":1,"145":1,"152":1,"153":3,"154":1,"155":1,"157":3,"158":9,"161":4,"162":4,"163":2,"164":2,"167":3,"168":3,"169":1,"170":1,"171":4,"173":3,"174":1,"179":2,"192":1,"201":1,"202":3,"203":2,"204":2,"207":3,"208":2,"212":2,"215":5,"216":8,"217":8,"225":1,"232":1}}],["95",{"2":{"172":1}}],["92",{"2":{"50":1}}],["90",{"2":{"41":3,"44":1,"54":1,"137":2}}],["99",{"2":{"35":1}}],["9",{"2":{"34":1,"35":1}}],["qx8aaabraaaajgaaafmaaadmaaaasufmaodwiqnl58wa03ahawmavxbs52d3",{"2":{"34":2}}],["queries",{"2":{"77":1,"112":5,"229":1}}],["querying",{"2":{"28":1}}],["query",{"0":{"229":1},"2":{"21":2,"23":2,"31":1,"56":2,"77":7,"79":1,"82":1,"85":1,"91":1,"94":1,"97":1,"155":1,"162":1,"179":4,"187":1,"188":1,"229":5}}],["quickly",{"2":{"152":1}}],["quick",{"2":{"72":1}}],["quite",{"2":{"27":1}}],["quality",{"2":{"35":1,"91":1,"190":1}}],["quot",{"2":{"12":2,"13":2,"14":8,"41":4,"112":8,"115":32,"117":12,"121":6,"123":12,"126":12,"151":2,"152":2,"162":10,"171":14,"172":8,"173":4,"222":2,"233":2}}],["72956",{"2":{"114":1,"116":1,"118":1,"120":1,"122":1,"128":1}}],["73216",{"2":{"116":1,"120":1,"122":1}}],["73077",{"2":{"114":1,"116":1,"120":1,"122":1}}],["73",{"2":{"34":1}}],["7ucagp",{"2":{"34":2}}],["7",{"2":{"32":1,"34":1,"114":2,"116":3,"118":1,"120":3,"122":3,"128":1}}],["zone",{"2":{"224":2,"225":2}}],["zoom",{"2":{"30":1,"35":1,"36":1,"39":2,"41":1,"43":1,"79":1,"91":1,"125":1}}],["z=15",{"2":{"124":1}}],["z=13",{"2":{"40":1}}],["z",{"2":{"88":1,"125":1}}],["zxy",{"2":{"88":1}}],["zeros",{"2":{"181":1,"182":1,"184":1,"191":1}}],["zero",{"2":{"3":1,"35":1,"92":1,"230":1}}],["`",{"2":{"142":3}}],["`qikdcb",{"2":{"33":1}}],["`20°",{"2":{"28":1}}],["`13",{"2":{"28":1}}],["45",{"2":{"209":1}}],["4516",{"2":{"8":1}}],["41862",{"2":{"116":1,"120":1,"122":1}}],["418555",{"2":{"37":1}}],["41546",{"2":{"114":1,"116":1,"120":1,"122":1}}],["415852",{"2":{"80":1}}],["41337",{"2":{"114":1,"116":1,"118":1,"120":1,"122":1,"128":1}}],["42324",{"2":{"73":1}}],["428554",{"2":{"34":2}}],["428555",{"2":{"21":1,"31":1,"33":5,"37":2,"86":1}}],["49786802",{"2":{"46":1,"48":1}}],["49786801",{"2":{"46":1,"48":1}}],["49786800",{"2":{"46":1,"48":1}}],["49786799",{"2":{"46":1,"48":1}}],["49772552",{"2":{"46":1,"48":1}}],["49772551",{"2":{"46":1,"48":1}}],["4096",{"2":{"223":1}}],["40",{"2":{"46":1,"48":2}}],["404",{"2":{"41":1}}],["400",{"2":{"23":1}}],["4ghawaaxwvs52d3",{"2":{"34":2}}],["4",{"2":{"29":1,"32":1,"33":1,"57":1,"148":1,"149":1,"151":2,"160":1,"179":1,"181":3,"185":4,"191":2,"192":1,"193":1,"209":1,"211":3}}],["438640",{"2":{"80":1}}],["43",{"2":{"25":1,"114":2,"116":3,"118":1,"120":3,"122":3,"128":1}}],["37",{"2":{"209":1}}],["374481201171875",{"2":{"95":1,"98":1}}],["3791",{"2":{"34":1}}],["359",{"2":{"51":2,"54":1}}],["30",{"2":{"44":1,"46":1}}],["300",{"2":{"44":2}}],["397389",{"2":{"92":1}}],["397631",{"2":{"34":2}}],["397634",{"2":{"21":2,"31":1,"33":5,"37":2,"86":1}}],["39478",{"2":{"92":1}}],["394718",{"2":{"50":1,"55":1}}],["393252",{"2":{"92":1}}],["39677",{"2":{"50":1}}],["3919",{"2":{"41":1}}],["330",{"2":{"50":1,"55":1}}],["33",{"2":{"41":1}}],["3166",{"2":{"40":1}}],["36761474609375",{"2":{"95":1,"98":1}}],["36",{"2":{"34":1}}],["360",{"2":{"20":1,"79":1,"82":1,"85":1,"91":1,"94":1}}],["3275",{"2":{"34":1}}],["344",{"2":{"34":1}}],["340°`",{"2":{"28":1}}],["382",{"2":{"34":1}}],["38faaaauqaaacyaaabtaaaahsqkqrxq5kkrbizcwjo",{"2":{"34":2}}],["3888",{"2":{"34":2}}],["388860",{"2":{"21":2,"28":2,"31":1,"33":5,"37":2,"83":1,"86":1}}],["388775",{"2":{"29":1}}],["388782",{"2":{"29":1}}],["388799",{"2":{"29":1,"57":1}}],["3x2",{"2":{"33":1}}],["3x3",{"2":{"33":5}}],["3",{"2":{"32":1,"33":1,"34":2,"44":1,"46":5,"50":2,"77":1,"83":1,"92":1,"133":5,"171":1,"211":3,"229":1}}],["==",{"2":{"164":1,"170":1,"177":4,"202":1}}],["=",{"2":{"20":3,"27":1,"32":3,"35":1,"41":4,"59":1,"76":1,"79":1,"80":1,"82":1,"83":2,"85":3,"86":2,"89":1,"91":1,"92":2,"94":1,"95":2,"98":2,"111":3,"113":1,"114":2,"116":2,"118":2,"120":2,"122":2,"124":2,"128":1,"129":1,"130":1,"138":1,"140":1,"151":1,"158":1,"164":1,"169":1,"170":2,"171":2,"177":5,"179":4,"181":2,"184":4,"191":1,"192":1}}],["x3c",{"2":{"222":1,"223":1,"224":1,"225":1,"226":1,"230":1}}],["xc",{"2":{"176":1}}],["xe",{"2":{"176":1}}],["xd",{"2":{"176":1}}],["xf",{"2":{"176":1}}],["x=",{"2":{"174":1}}],["x=17059",{"2":{"124":1}}],["x64",{"2":{"142":2,"234":1}}],["x86",{"2":{"133":2,"142":1,"150":2}}],["x20",{"2":{"79":1,"82":1,"85":1,"88":1,"91":1,"94":1}}],["x26",{"2":{"28":1,"32":1,"33":1,"37":1,"144":4}}],["x",{"2":{"20":1,"39":2,"41":1,"88":1,"125":2,"174":1,"176":2,"181":2,"184":3,"192":1,"193":1,"224":2,"225":2}}],["k",{"2":{"227":1}}],["kubernetes",{"2":{"196":1}}],["keys",{"2":{"165":2,"166":2}}],["keyword",{"2":{"111":1}}],["keepalive",{"2":{"227":1}}],["keep",{"2":{"18":1,"30":1,"79":1,"140":1,"227":1}}],["know",{"2":{"72":1}}],["kotlin",{"2":{"58":1}}],["km",{"2":{"41":1,"171":1,"174":2,"176":1}}],["kiokgdbbdgcubaeaaaaaaboaaaaaaaaapaaaablncqcltwaa50vmadjziqm8tmwarvghawaaaqh1a66g",{"2":{"29":1}}],["kills",{"2":{"9":1}}],["ksokadryroqubaeabgaaaaaaaaaaaaaakqaaabhncqcltwaa7kvmaaxziqm8tmwarvghawaaaqh1a66g",{"2":{"29":1}}],["ksokadryroqubaeaeaaaabkaaaagaaaaaaaaabhncqcltwaa",{"2":{"29":1,"57":1}}],["25",{"2":{"223":1}}],["250",{"2":{"179":3}}],["27",{"2":{"182":1,"184":1,"185":1}}],["270",{"2":{"50":1,"54":1}}],["26",{"2":{"148":1,"149":1,"151":1,"181":2,"182":1,"184":1,"185":3,"191":1,"192":1,"193":1}}],["240",{"2":{"50":1,"55":1}}],["2361",{"2":{"34":1}}],["222",{"2":{"34":1}}],["2264199819",{"2":{"29":1}}],["2838",{"2":{"34":1}}],["283",{"2":{"34":1}}],["21487242",{"2":{"29":1}}],["2097152",{"2":{"223":1}}],["2022",{"2":{"233":1,"234":1}}],["2027",{"2":{"182":1,"184":1,"185":1}}],["2025",{"2":{"182":2,"232":1}}],["2026",{"2":{"181":1,"182":3,"184":1,"185":3}}],["2045820592",{"2":{"29":1}}],["20",{"2":{"28":1,"83":1,"171":1,"209":1,"216":1}}],["2017",{"2":{"25":1}}],["200",{"2":{"23":1,"44":1,"129":1}}],["2000",{"2":{"7":1,"148":1,"149":1,"181":2,"184":1,"191":1,"217":1}}],["2nd",{"2":{"20":1,"185":1}}],["2",{"2":{"14":3,"32":1,"44":1,"50":1,"55":1,"92":1,"95":1,"116":1,"164":2,"168":1,"169":1,"176":2,"177":3,"182":1,"184":1,"211":3,"223":1}}],["v27",{"2":{"185":1}}],["v26",{"2":{"151":1,"181":1,"182":1,"185":3,"191":1}}],["vx",{"2":{"184":1}}],["v6",{"2":{"182":4}}],["v",{"2":{"148":1,"150":1,"181":1,"184":1,"191":1,"220":1}}],["volume",{"2":{"145":1}}],["vcpkg",{"2":{"136":15,"138":7,"140":3,"142":3,"145":5,"232":3,"233":7,"234":1}}],["v8",{"2":{"76":3}}],["vs",{"2":{"73":1,"202":1,"234":1}}],["visible",{"2":{"148":1}}],["visiting",{"2":{"78":1}}],["visit",{"2":{"73":1}}],["visitation",{"2":{"73":1}}],["visitor",{"2":{"73":1}}],["visual",{"2":{"143":1,"232":1,"233":1}}],["virtual",{"2":{"77":1}}],["violate",{"2":{"54":1}}],["violates",{"2":{"23":1}}],["viewers",{"2":{"39":1,"88":1}}],["viewer",{"2":{"39":1,"87":1}}],["viewed",{"2":{"39":1,"87":1}}],["viaroute=3",{"2":{"111":1}}],["viaroute",{"2":{"77":2,"112":1,"229":1}}],["via",{"0":{"175":1},"2":{"15":1,"47":2,"72":1,"131":1,"137":1,"138":1,"142":1,"143":1,"148":2,"162":1,"169":2,"170":2,"174":1,"176":1,"214":3,"224":1,"225":1,"232":1}}],["vpailayu",{"2":{"21":1}}],["v1",{"2":{"20":1,"21":3,"27":1,"28":1,"30":1,"31":1,"32":1,"33":6,"35":1,"36":1,"37":2,"39":1,"40":1}}],["vehicle",{"2":{"162":1}}],["vehicles",{"2":{"162":1}}],["verbosity",{"2":{"220":2}}],["verbatim",{"2":{"145":1}}],["verify",{"2":{"193":1,"194":1}}],["verification",{"0":{"150":1}}],["very",{"2":{"35":1,"49":1,"51":1,"54":1,"64":1,"67":1,"92":1,"207":1,"214":1,"216":1,"217":1}}],["vereinten",{"2":{"34":2}}],["versions",{"2":{"185":1,"190":1,"191":1,"192":1}}],["versioning",{"0":{"183":1},"1":{"184":1,"185":1},"2":{"181":1,"182":2}}],["version",{"0":{"24":1,"151":1,"160":1,"181":1,"182":1,"187":1},"1":{"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"20":3,"23":1,"24":2,"25":1,"51":2,"52":1,"64":1,"67":1,"72":1,"147":1,"148":2,"149":2,"150":3,"151":3,"157":2,"160":3,"191":1,"192":1,"193":1,"194":2,"220":2,"222":2}}],["vectors",{"2":{"73":1}}],["vector",{"2":{"12":1,"13":1,"39":3,"41":2,"87":2,"88":1,"89":2,"124":1,"174":4}}],["vary",{"2":{"158":1}}],["various",{"2":{"97":1,"157":2,"171":1}}],["variations",{"2":{"152":1}}],["variant",{"2":{"73":1}}],["variable",{"2":{"7":2,"196":1,"197":1,"198":1}}],["variables",{"0":{"8":1,"195":1},"1":{"196":1,"197":1,"198":1},"2":{"7":1}}],["var",{"2":{"83":1,"86":1,"92":1,"95":1,"98":1}}],["value",{"2":{"20":3,"30":1,"35":3,"41":7,"43":1,"52":1,"54":4,"56":1,"66":1,"70":2,"73":1,"77":1,"79":2,"82":1,"85":2,"91":2,"92":2,"94":1,"158":1,"162":1,"171":2,"173":1,"179":1,"202":1,"223":1}}],["values",{"2":{"20":3,"27":1,"30":1,"32":3,"33":3,"35":2,"36":1,"39":1,"41":1,"47":2,"51":1,"54":2,"56":1,"66":1,"79":1,"82":1,"85":2,"86":4,"88":1,"91":1,"94":1,"117":1,"161":2,"171":1,"174":4,"176":2,"179":1}}],["validate",{"2":{"227":1}}],["validated",{"2":{"189":1}}],["valid",{"2":{"13":1,"50":4,"52":2,"53":1,"54":1,"55":1,"97":1,"179":1}}],["500",{"2":{"179":1,"229":1}}],["5000+n",{"2":{"4":1}}],["5000",{"2":{"4":1,"7":2,"227":1}}],["506191342034576",{"2":{"95":1,"98":1}}],["542107",{"2":{"92":1}}],["542648",{"2":{"92":1}}],["543079",{"2":{"92":1}}],["543096",{"2":{"50":1,"55":1}}],["54366",{"2":{"50":1}}],["5m",{"2":{"35":1}}],["51663871100423",{"2":{"95":1,"98":1}}],["513191",{"2":{"80":1}}],["519930",{"2":{"80":1}}],["517",{"2":{"140":1}}],["51717",{"2":{"29":1}}],["517132",{"2":{"29":1}}],["517033",{"2":{"29":1,"34":2,"57":1}}],["517037`",{"2":{"28":1}}],["517037",{"2":{"21":2,"28":1,"31":1,"33":5,"37":2,"83":1,"86":1}}],["512",{"2":{"18":1}}],["5212",{"2":{"41":1}}],["523215",{"2":{"37":1}}],["523219",{"2":{"21":1,"31":1,"33":5,"37":2,"86":1}}],["523239",{"2":{"34":2}}],["529432",{"2":{"34":2}}],["529407",{"2":{"21":2,"31":1,"33":5,"37":2,"86":1}}],["52",{"2":{"21":5,"28":2,"29":3,"31":3,"33":15,"34":6,"37":7,"41":1,"50":2,"55":1,"57":1,"80":2,"83":1,"86":3,"92":3,"95":2,"98":2}}],["5",{"2":{"7":1,"18":1,"20":2,"32":1,"46":4,"48":4,"49":1,"77":1,"91":1,"120":3,"164":2,"177":2,"179":1,"185":2,"216":3,"227":1}}],["160",{"2":{"216":1}}],["17",{"2":{"232":1}}],["179",{"2":{"174":1}}],["17t21",{"2":{"25":1}}],["1st",{"2":{"148":1,"182":1,"185":3,"190":1,"191":1}}],["128",{"2":{"209":1,"223":1}}],["12+",{"2":{"133":1}}],["120",{"2":{"44":4}}],["12",{"2":{"41":1,"133":1,"181":1,"182":1,"184":2,"191":1,"192":1,"193":1}}],["127",{"2":{"7":1}}],["1424684620",{"2":{"92":1,"120":1}}],["1424684616",{"2":{"92":1,"120":1}}],["1424684612",{"2":{"92":1,"120":1}}],["14",{"2":{"41":1}}],["101",{"2":{"162":2}}],["10+",{"2":{"133":1}}],["100",{"2":{"44":1,"46":2,"216":1,"229":4}}],["1000",{"2":{"41":1,"222":1,"223":1}}],["10",{"2":{"36":2,"44":4,"46":1,"48":1,"50":1,"93":2,"133":1,"177":2,"207":3,"208":3,"209":1,"216":1,"223":1}}],["184",{"2":{"50":1}}],["1824",{"2":{"34":1}}],["1886",{"2":{"34":1}}],["180=u",{"2":{"174":1}}],["180",{"2":{"20":1,"41":2,"54":2,"79":1,"82":1,"85":1,"91":1,"94":1,"129":1,"174":1,"216":2}}],["199",{"2":{"34":1}}],["192",{"2":{"34":1}}],["1x3",{"2":{"33":1}}],["150",{"2":{"55":1}}],["152",{"2":{"50":1}}],["152629",{"2":{"29":1,"57":1}}],["15",{"2":{"29":1,"46":4,"48":8,"50":2,"174":4,"176":2}}],["11",{"2":{"25":1,"29":1,"133":1}}],["13423240",{"2":{"73":1}}],["1310",{"2":{"40":1}}],["13",{"2":{"21":5,"28":1,"29":3,"31":3,"33":15,"34":6,"37":7,"40":1,"41":1,"50":2,"55":1,"57":1,"73":1,"80":2,"83":1,"86":3,"92":3,"95":2,"98":2}}],["1",{"2":{"7":1,"14":2,"18":1,"27":2,"32":1,"33":1,"34":2,"35":2,"44":1,"46":2,"48":2,"50":1,"54":2,"82":2,"92":3,"95":1,"116":1,"117":1,"119":1,"137":2,"149":1,"162":1,"176":3,"177":3,"179":2,"181":1,"182":3,"184":3,"185":4,"191":1,"192":1,"193":1,"211":3,"215":2,"223":2,"229":2,"230":1}}],["0=straight",{"2":{"174":1}}],["0=true",{"2":{"54":1}}],["00",{"2":{"148":1,"182":1,"190":1,"191":1}}],["08",{"2":{"148":1,"182":1,"190":1,"191":1}}],["09",{"2":{"34":1}}],["0vmaklyiqm8tmwarvghaweaaqh1a66g",{"2":{"29":1,"57":1}}],["02z",{"2":{"25":1}}],["0",{"2":{"7":2,"14":2,"18":1,"20":3,"29":3,"32":3,"34":8,"35":2,"41":2,"44":12,"46":11,"47":1,"48":3,"50":1,"51":2,"54":3,"55":1,"79":4,"82":3,"83":1,"85":5,"89":3,"91":3,"92":1,"94":3,"115":1,"116":1,"117":1,"120":3,"148":1,"151":2,"160":1,"164":1,"168":1,"174":10,"176":5,"179":20,"181":3,"182":7,"184":2,"185":6,"191":2,"192":1,"193":1,"223":1,"224":2,"225":2,"227":4,"229":1}}],["gate",{"2":{"165":1,"190":1}}],["gap",{"2":{"121":1}}],["gaps",{"2":{"35":2,"91":2,"121":1}}],["gh",{"2":{"149":1}}],["glance",{"2":{"214":1}}],["globals",{"2":{"162":1}}],["global",{"2":{"162":3,"167":1,"180":1}}],["gl",{"2":{"39":1,"88":1}}],["grid",{"2":{"207":4,"208":3,"209":1,"211":2,"216":5,"217":2}}],["green",{"2":{"158":1,"190":1}}],["greenest",{"2":{"152":1}}],["greedy",{"2":{"36":1,"93":1}}],["greater",{"2":{"82":1}}],["grained",{"2":{"47":1}}],["graph",{"2":{"13":3,"20":1,"39":1,"79":1,"82":1,"85":1,"87":1,"91":1,"94":1,"124":1,"152":1,"211":1,"222":3,"223":1,"224":1,"225":1}}],["gps",{"2":{"35":3,"90":1,"91":2,"120":1}}],["go",{"2":{"58":1,"192":1}}],["going",{"2":{"30":1,"79":1,"171":1}}],["google",{"2":{"20":1}}],["good",{"2":{"13":1,"164":1}}],["g`e",{"2":{"21":1}}],["gt",{"2":{"12":2,"13":2,"14":6,"20":1,"27":1,"32":2,"35":2,"79":1,"82":1,"85":1,"90":1,"91":2,"94":1,"142":1,"148":1,"150":1,"174":2,"216":1,"220":2,"221":1,"222":5,"223":5,"224":5,"225":5,"227":3,"228":3,"229":9,"230":3}}],["guard",{"2":{"12":6,"13":2,"14":6}}],["guarantees",{"0":{"186":1},"1":{"187":1,"188":1},"2":{"162":1,"208":1}}],["guaranteed",{"2":{"30":1,"51":1,"79":1}}],["guarantee",{"2":{"11":1,"211":1}}],["guideline",{"2":{"205":1,"217":1}}],["guidelines",{"2":{"16":1,"210":1}}],["guide",{"0":{"132":1},"1":{"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"11":1,"15":1,"16":1,"215":1}}],["guidance",{"0":{"10":1,"178":1,"215":1},"1":{"11":1,"12":1,"13":1,"14":1,"179":1,"180":1,"216":1,"217":1,"218":1},"2":{"9":3,"10":1,"13":1,"161":2,"162":1,"171":5,"178":3,"206":2,"208":1,"209":1,"215":2,"217":1}}],["g",{"2":{"10":1,"51":1,"52":2,"54":1,"56":1,"64":1,"67":1,"73":2,"76":1,"126":1,"148":1,"149":1,"151":1,"162":1,"171":5,"172":2,"179":2,"181":2,"189":1,"191":1,"192":1,"193":1,"202":1,"214":1,"215":1,"216":1,"218":1,"222":1,"232":1}}],["geographical",{"2":{"173":1}}],["geometries",{"2":{"30":1,"35":1,"36":1,"39":1,"43":1,"49":1,"79":1,"87":1,"91":1,"94":1,"115":1}}],["geometries=",{"2":{"30":1,"35":1,"36":1,"114":1,"120":1,"122":1}}],["geometry=geojson",{"2":{"44":1}}],["geometry",{"2":{"30":3,"31":1,"35":3,"36":3,"43":6,"44":1,"45":1,"49":3,"50":1,"62":3,"64":3,"77":1,"79":2,"91":2,"94":2,"115":2,"208":1,"228":1,"230":1}}],["geojsonguard",{"2":{"14":1}}],["geojson",{"0":{"11":1},"2":{"10":1,"11":1,"12":6,"13":2,"14":9,"30":1,"35":1,"36":1,"49":2,"79":1,"91":1,"94":1,"114":1,"115":1,"120":1,"122":1,"222":1,"224":1,"225":1}}],["general",{"0":{"19":1},"1":{"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"2":{"27":2,"30":3,"32":1,"33":2,"35":3,"36":1,"38":2,"81":1,"161":1,"200":1,"205":1,"217":1}}],["generator",{"2":{"140":3,"143":1}}],["generation",{"2":{"97":1}}],["generating",{"2":{"10":1}}],["generates",{"2":{"39":1,"87":1,"124":1}}],["generate",{"2":{"20":2,"79":1,"82":1,"85":1,"91":1,"94":1,"126":1}}],["generated",{"2":{"6":1,"20":1,"39":1,"87":1,"146":1,"191":1,"193":1,"222":1}}],["getfbresult",{"2":{"59":1}}],["getaccuracy",{"2":{"35":1}}],["getting",{"0":{"15":1},"2":{"51":1,"64":1,"67":1}}],["gets",{"2":{"12":1,"73":1}}],["get",{"0":{"170":1},"2":{"10":1,"20":1,"27":1,"30":1,"32":1,"35":1,"36":1,"39":1,"41":2,"54":1,"73":2,"170":5,"175":1,"207":2,"208":3,"209":1,"216":2}}],["getenv",{"2":{"8":1}}],["git",{"2":{"146":1,"181":1,"184":2,"185":5,"191":1,"193":1,"194":1,"233":1}}],["github",{"2":{"3":2,"17":1,"134":1,"136":1,"138":1,"147":1,"150":1,"191":2,"193":2,"194":2,"232":1,"233":1}}],["gives",{"2":{"33":2,"54":1,"86":2}}],["give",{"2":{"12":1,"165":1}}],["given",{"2":{"8":1,"20":2,"30":1,"32":2,"33":2,"35":2,"43":1,"49":1,"51":3,"52":1,"54":1,"64":2,"67":2,"79":2,"82":2,"84":1,"85":4,"86":2,"90":1,"91":1,"94":2,"122":1,"168":2,"169":1,"171":1,"207":3,"208":9,"209":3,"211":2,"214":2,"216":4}}],["u",{"2":{"162":1,"174":3,"176":1}}],["ui",{"2":{"149":1}}],["uint64",{"2":{"70":2}}],["uint64pair",{"0":{"70":1},"2":{"61":1}}],["utc",{"2":{"148":1,"182":1,"190":1,"191":1,"224":2,"225":2}}],["utf",{"2":{"98":1}}],["uturn",{"2":{"51":1,"52":1,"66":1,"79":1}}],["uturns",{"2":{"30":1}}],["utilities",{"2":{"217":1}}],["utility",{"2":{"201":2}}],["util",{"2":{"12":6,"13":4,"14":12,"217":1}}],["url",{"2":{"23":1}}],["un",{"2":{"218":1}}],["unexpected",{"2":{"217":1}}],["unprocessed",{"2":{"217":1}}],["unprefixed",{"2":{"181":1}}],["unrelated",{"2":{"217":1}}],["unrestricted",{"2":{"20":1,"79":1,"82":1,"85":1,"94":1,"126":2}}],["unwanted",{"2":{"211":1}}],["unnamed",{"2":{"172":1}}],["unsigned",{"2":{"162":1,"171":1}}],["unsimplified",{"2":{"49":1}}],["unconnected",{"2":{"162":1}}],["undef",{"2":{"202":1}}],["undefined",{"2":{"30":1,"33":1,"35":1,"38":1,"45":1,"49":2,"51":1}}],["understanding",{"0":{"158":1,"214":1,"215":1},"1":{"216":1,"217":1,"218":1}}],["understand",{"2":{"155":1,"217":1}}],["under",{"2":{"136":1,"142":1,"162":1}}],["until",{"2":{"54":1}}],["unknown",{"2":{"51":1}}],["unavailable",{"2":{"49":1}}],["unambiguously",{"2":{"35":1,"92":1}}],["unit",{"0":{"200":1},"1":{"201":1,"202":1,"203":1,"204":1},"2":{"199":1,"201":3,"204":2}}],["units",{"2":{"41":1}}],["unified",{"2":{"181":1}}],["uniquely",{"2":{"214":1}}],["unique",{"2":{"56":1}}],["unix",{"2":{"35":2,"91":1,"121":1,"224":1,"225":1}}],["unlike",{"2":{"32":1}}],["unlimited",{"2":{"20":1,"77":6,"79":1,"82":1,"85":1,"94":1,"111":1,"112":1,"126":1,"229":2,"230":1}}],["unless",{"2":{"9":3,"41":1,"59":1,"214":1}}],["upgrade",{"2":{"197":1}}],["uploads",{"2":{"148":1}}],["updated",{"2":{"146":1,"191":1}}],["updates",{"2":{"56":1,"224":1,"225":2,"230":2}}],["update",{"2":{"41":1,"230":1}}],["up",{"2":{"6":1,"30":1,"56":1,"73":1,"79":1,"171":1,"173":1,"203":1,"227":1}}],["usr1",{"2":{"197":1}}],["usr",{"2":{"145":1}}],["ushort",{"2":{"71":2}}],["usually",{"2":{"51":1,"64":1,"67":1}}],["usage",{"2":{"11":1,"21":1,"73":1,"168":1,"169":1,"170":1}}],["using",{"0":{"154":1,"179":1,"202":1},"2":{"4":1,"20":3,"21":1,"27":1,"32":1,"36":1,"41":2,"72":1,"73":1,"77":1,"85":1,"93":1,"111":1,"149":1,"162":1,"167":2,"171":1,"178":1,"179":1,"199":1,"206":1,"208":1,"211":1}}],["user",{"2":{"32":1,"47":1,"85":1,"158":1,"164":1,"167":1,"174":4,"176":2,"222":1}}],["useless",{"2":{"27":1}}],["uses",{"2":{"20":1,"36":1,"41":2,"93":1,"137":1,"138":1,"140":1,"141":1,"151":1,"158":1,"178":2}}],["useful",{"2":{"20":1,"79":1,"192":1,"196":1,"198":1,"220":1,"227":1}}],["used",{"2":{"9":2,"12":1,"20":2,"33":1,"35":2,"36":3,"39":1,"41":1,"43":1,"45":1,"47":1,"54":2,"56":2,"70":1,"71":1,"72":1,"79":1,"82":1,"85":1,"86":1,"87":1,"91":2,"94":1,"97":1,"108":1,"140":1,"143":1,"155":1,"157":2,"158":1,"162":4,"171":1,"177":1,"179":1,"190":1,"197":1,"206":1,"214":1,"222":1,"223":1,"228":1}}],["use",{"0":{"11":1,"208":1,"211":1,"218":1},"2":{"2":2,"3":3,"7":1,"12":1,"14":2,"15":1,"19":1,"20":1,"32":5,"35":2,"51":1,"56":1,"72":1,"73":2,"75":1,"77":1,"79":3,"82":2,"85":6,"91":2,"94":1,"111":2,"112":3,"133":1,"136":1,"140":1,"142":1,"157":1,"161":1,"162":1,"163":1,"173":1,"175":1,"177":1,"179":3,"180":1,"181":1,"196":1,"202":2,"207":2,"211":2,"212":1,"217":1,"218":1,"220":1,"222":1,"223":1,"225":1,"230":1}}],["65536",{"2":{"223":1}}],["64",{"2":{"133":2,"142":1,"150":2}}],["60",{"2":{"44":1,"50":1,"55":1}}],["60s",{"2":{"35":1,"90":1}}],["6",{"2":{"5":1,"32":1,"34":1,"49":1,"50":2,"171":1}}],["evaluating",{"2":{"225":1}}],["evaluate",{"2":{"224":1}}],["evaluated",{"2":{"222":1,"223":1}}],["ever",{"2":{"72":1,"140":1,"213":1}}],["everything",{"2":{"25":1,"140":1,"141":1}}],["every",{"2":{"23":1,"24":1,"54":2,"59":1,"140":1,"148":1,"157":2,"173":1,"174":1,"191":1,"220":1,"234":1}}],["event",{"2":{"97":1}}],["even",{"2":{"30":2,"51":1,"79":2,"142":1,"158":1,"203":1}}],["echo",{"2":{"221":1}}],["ebg",{"2":{"221":1}}],["eb",{"2":{"214":1}}],["ebd",{"2":{"214":4}}],["effects",{"2":{"211":1}}],["efforts",{"2":{"12":1}}],["essentially",{"2":{"217":1}}],["essential",{"2":{"208":1}}],["es",{"2":{"162":1}}],["estimation",{"2":{"158":1}}],["estimates",{"2":{"85":1}}],["estimated",{"2":{"33":1,"43":1,"45":1,"49":1,"86":1,"158":1}}],["estimate",{"2":{"32":1,"158":1}}],["equivalent",{"2":{"112":1}}],["equals",{"2":{"217":1}}],["equality",{"2":{"202":1}}],["equal",{"2":{"32":1,"82":1,"171":1,"202":1}}],["err",{"2":{"80":3,"83":1,"86":1,"89":3,"92":3,"95":3,"98":3}}],["erroneous",{"2":{"59":2}}],["errors",{"2":{"209":1}}],["error",{"0":{"60":1},"2":{"23":2,"30":1,"33":1,"35":2,"38":1,"41":1,"59":4,"60":3,"73":3,"220":1}}],["ephemeral",{"2":{"56":1}}],["epoch",{"2":{"35":2}}],["elevation",{"2":{"157":2,"173":2,"179":1}}],["elem",{"2":{"32":2}}],["element",{"2":{"20":7,"32":1,"71":2}}],["elements",{"0":{"159":1},"1":{"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1},"2":{"20":2,"85":2}}],["else",{"2":{"51":1}}],["etc",{"2":{"41":2,"136":1,"157":1,"171":1,"182":2,"184":1,"202":1,"222":1}}],["eta",{"2":{"41":1}}],["emergency",{"2":{"192":1}}],["emitted",{"2":{"178":1}}],["emit",{"2":{"178":1}}],["empty",{"2":{"20":1,"45":3,"59":1,"73":1,"174":1}}],["embedded",{"2":{"15":1,"222":1}}],["earth",{"2":{"69":1}}],["easily",{"2":{"153":1,"215":1}}],["east",{"2":{"41":1,"207":1}}],["easy",{"2":{"10":1}}],["each",{"2":{"14":2,"20":1,"27":1,"30":2,"35":6,"36":2,"38":1,"45":1,"47":7,"52":1,"73":2,"79":2,"83":1,"91":1,"92":2,"94":1,"95":1,"115":1,"121":1,"140":1,"148":1,"157":1,"162":2,"171":2,"173":1,"182":1,"190":1,"191":1,"204":1}}],["ensure",{"2":{"160":1,"212":1}}],["env",{"2":{"145":1}}],["environments",{"2":{"145":1,"196":1}}],["environment",{"0":{"8":1,"195":1},"1":{"196":1,"197":1,"198":1},"2":{"7":3,"145":5,"196":1,"197":1,"198":1}}],["enabling",{"2":{"79":1,"91":1,"94":1}}],["enables",{"2":{"230":1}}],["enable",{"2":{"13":1,"171":1}}],["enum",{"2":{"66":1,"67":2,"165":1,"166":1,"171":3,"174":4,"176":2}}],["engine=",{"2":{"145":1}}],["engineconfig",{"2":{"73":2,"75":1}}],["engine",{"2":{"58":1,"59":1,"111":3,"113":1,"114":1,"116":1,"118":1,"120":1,"122":1,"124":1,"130":1,"204":1,"207":2,"217":1}}],["enough",{"2":{"51":1}}],["entries",{"2":{"51":1}}],["entry",{"2":{"27":1,"35":1,"50":2,"54":4,"55":1,"81":1,"92":1,"111":1}}],["entered",{"2":{"54":1}}],["entering",{"2":{"51":1,"64":1,"67":1}}],["enter",{"2":{"51":1,"64":1,"67":1,"209":6}}],["ended",{"2":{"182":1}}],["endofroad",{"2":{"64":1,"67":1}}],["endpoint",{"2":{"41":1}}],["ending",{"2":{"37":1}}],["end",{"2":{"36":2,"51":1,"157":1,"168":1,"169":3,"170":4,"171":1,"173":2,"177":3,"179":2,"212":1,"217":1}}],["ends",{"2":{"36":1,"51":1,"64":1,"67":1,"94":1}}],["encoded",{"2":{"32":1,"33":1,"41":1,"79":1,"82":1,"85":1,"89":1,"91":1,"94":1,"126":1}}],["encoding",{"2":{"20":1,"49":2}}],["edges",{"2":{"20":1,"79":2,"82":2,"85":2,"91":2,"94":2,"162":2,"221":1,"224":1,"225":1}}],["edge",{"2":{"13":3,"20":1,"79":1,"82":1,"85":1,"91":1,"94":1,"162":1,"176":1,"203":1,"211":1,"224":2,"225":2}}],["editable",{"0":{"140":1},"2":{"134":1,"141":2}}],["edit",{"2":{"7":1}}],["e",{"2":{"10":1,"51":1,"52":10,"54":1,"56":1,"64":1,"66":8,"67":1,"73":2,"76":1,"126":1,"134":1,"140":3,"146":1,"148":1,"149":1,"151":1,"162":1,"171":5,"172":2,"176":1,"179":2,"181":2,"189":1,"191":1,"192":1,"193":1,"202":1,"208":1,"211":4,"214":3,"215":1,"216":6,"218":1,"222":1,"232":1}}],["either",{"2":{"7":1,"30":1,"35":1,"36":1,"41":1,"49":1,"73":1,"79":3,"82":2,"85":3,"91":3,"94":2,"136":1,"161":1,"171":1,"214":1}}],["executables",{"2":{"144":1}}],["executed",{"2":{"9":6}}],["exes",{"2":{"142":1}}],["exist",{"2":{"207":1}}],["existing",{"2":{"141":1,"142":1,"188":1}}],["exists",{"2":{"51":1,"150":1}}],["existence",{"2":{"51":1}}],["exitrotary",{"2":{"64":1,"67":1}}],["exitroundabout",{"2":{"64":1,"67":1}}],["exiting",{"2":{"51":2,"54":1,"64":2,"67":2}}],["exit",{"2":{"49":2,"51":10,"64":4,"67":4,"171":1,"172":1,"209":6,"220":3,"227":1,"230":2}}],["exits",{"2":{"49":1,"171":1}}],["exact",{"2":{"215":1}}],["exactly",{"2":{"20":1,"58":1,"68":1}}],["examine",{"2":{"39":2,"87":2,"171":1}}],["examples",{"0":{"80":1,"83":1,"86":1,"89":1,"92":1,"95":1,"98":1,"185":1},"2":{"169":1,"170":1,"179":1}}],["example",{"0":{"21":1,"25":1,"28":1,"29":1,"31":1,"33":1,"34":1,"37":1,"40":1,"41":1,"44":1,"46":1,"48":1,"50":1,"53":1,"55":1,"57":1,"74":1},"2":{"13":2,"20":1,"32":1,"51":2,"64":2,"67":2,"72":2,"73":1,"74":1,"153":1,"157":2,"158":1,"168":1,"173":2,"176":1,"177":2,"179":1,"181":1,"207":1,"221":1}}],["exclusive",{"2":{"77":1}}],["excludable",{"2":{"162":1}}],["excluding",{"2":{"21":1,"47":1}}],["exclude=motorway",{"2":{"21":1}}],["exclude",{"2":{"20":2,"79":1,"126":1,"162":2}}],["except",{"2":{"19":1,"20":1}}],["ext",{"2":{"146":5}}],["external",{"2":{"101":1,"103":1,"105":1,"107":1,"109":1,"173":1}}],["extensions",{"2":{"220":1}}],["extension",{"2":{"18":1,"146":1,"153":1,"221":1}}],["extremely",{"2":{"41":1}}],["extractor",{"2":{"167":1,"171":2,"174":4,"176":2}}],["extracted",{"2":{"162":1,"225":1}}],["extracting",{"2":{"157":1}}],["extractionturnleg",{"2":{"174":4}}],["extraction",{"2":{"6":1,"43":1,"172":1,"222":1}}],["extract",{"0":{"222":1},"2":{"20":1,"24":1,"54":1,"76":1,"131":1,"153":1,"154":4,"155":1,"157":1,"203":1,"222":1}}],["expressed",{"2":{"171":1,"214":1}}],["expanded",{"2":{"145":1}}],["exposed",{"2":{"171":1}}],["exposes",{"2":{"41":1}}],["export",{"2":{"136":2,"138":1}}],["explicitly",{"2":{"36":1,"149":1}}],["explanations",{"2":{"2":1}}],["experimental",{"2":{"231":1}}],["experiences",{"2":{"210":1}}],["experience",{"2":{"10":1}}],["expects",{"2":{"73":1,"220":1}}],["expect",{"2":{"73":1,"216":1}}],["expected",{"0":{"216":1},"2":{"23":1,"164":1,"216":3}}],["egs",{"2":{"33":1}}],["eg",{"2":{"4":1,"9":1,"164":2}}],["blocks",{"2":{"230":2}}],["blob",{"2":{"41":1}}],["bz2",{"2":{"222":1}}],["bde",{"2":{"216":4}}],["bd",{"2":{"214":3}}],["bc",{"2":{"207":3,"208":3,"209":1,"214":1}}],["b",{"2":{"158":1,"176":2,"207":1,"208":3,"209":1,"211":4,"214":4,"216":4}}],["broad",{"2":{"215":1}}],["breaking",{"2":{"189":1}}],["brew",{"2":{"137":1}}],["branches",{"2":{"192":1}}],["branch",{"2":{"136":1,"148":1,"149":2,"190":2,"192":2,"193":1}}],["brute",{"2":{"36":1,"93":1}}],["boundaries",{"2":{"224":1,"225":1}}],["boundary",{"2":{"223":2}}],["bound",{"2":{"215":1}}],["box",{"2":{"153":1}}],["bootstrap",{"2":{"136":1,"138":2,"233":2}}],["bootstrapped",{"2":{"136":1}}],["boost",{"0":{"202":1},"2":{"136":1,"137":2,"199":1,"200":1,"202":7}}],["bool",{"2":{"59":1,"64":1,"112":2,"115":2,"121":1,"123":1,"126":1,"169":3}}],["boolean",{"2":{"41":2,"52":1,"77":2,"79":7,"82":1,"85":1,"91":5,"94":5,"162":4,"163":2,"171":8,"174":9,"176":5}}],["bonus",{"2":{"41":2}}],["both",{"2":{"14":1,"15":1,"32":2,"62":1,"64":1,"73":1,"84":1,"85":1,"147":1,"158":1,"164":1,"166":1,"167":1,"171":2,"199":1}}],["bisection",{"2":{"223":3}}],["bitwise",{"2":{"169":1,"170":1}}],["bit",{"2":{"158":1}}],["big",{"2":{"157":1}}],["bicycle",{"2":{"153":1,"154":2,"158":1}}],["bicycles",{"2":{"152":1}}],["biasing",{"2":{"41":1}}],["bike",{"2":{"20":1,"152":1}}],["bin",{"2":{"142":2}}],["binding",{"2":{"76":3,"140":1}}],["bindings=on",{"2":{"234":1}}],["bindings",{"0":{"132":1},"1":{"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"15":2,"110":2,"133":3,"146":1,"150":1}}],["binary",{"2":{"41":1,"58":1,"133":1,"136":1,"145":1,"197":1,"201":1,"234":1}}],["binaries",{"0":{"201":1},"2":{"7":1,"76":1,"204":1,"232":1}}],["bumping",{"2":{"194":1}}],["bump",{"2":{"148":1}}],["bumps",{"2":{"147":1}}],["bundle",{"2":{"142":3}}],["buffer",{"2":{"59":2,"89":3,"97":4,"98":1}}],["built",{"2":{"18":1,"133":3,"142":1,"147":1,"179":1,"232":1}}],["building",{"0":{"139":1,"141":1,"231":1,"234":1},"1":{"140":1,"141":1,"142":1,"143":1,"232":1,"233":1,"234":1},"2":{"142":1,"231":1}}],["buildsystems",{"2":{"136":1,"140":1,"145":1}}],["builds",{"2":{"133":1,"136":2,"140":1,"145":1,"148":1,"225":1}}],["build",{"0":{"135":1},"1":{"136":1,"137":1,"138":1},"2":{"7":2,"136":3,"138":1,"140":11,"141":3,"142":2,"143":3,"144":2,"145":3,"146":2,"189":1,"204":3,"234":2}}],["buildpath",{"2":{"7":1}}],["but",{"2":{"14":1,"20":2,"27":1,"32":1,"41":1,"51":2,"58":1,"61":2,"62":1,"63":2,"64":5,"65":1,"67":3,"73":1,"79":1,"140":1,"158":1,"188":1,"208":1,"209":1,"216":1}}],["balance",{"2":{"223":1}}],["barrier",{"2":{"163":2,"164":2,"165":1,"170":1}}],["batcmake",{"2":{"234":1}}],["batgit",{"2":{"233":1}}],["bat",{"2":{"138":1,"144":1,"233":1}}],["background",{"2":{"207":1,"208":3}}],["backports",{"2":{"192":1}}],["backward",{"2":{"162":2,"166":1,"171":11}}],["backend",{"2":{"76":1,"101":1,"103":1,"105":1,"107":1,"109":1,"134":2,"148":1}}],["back",{"2":{"8":1}}],["basis",{"2":{"191":1}}],["basic",{"0":{"157":1},"2":{"18":1,"51":1,"64":1,"67":1,"73":1}}],["bashbase=map",{"2":{"221":1}}],["bashbrew",{"2":{"137":1}}],["bashosrm",{"2":{"154":1}}],["bashcibw",{"2":{"145":1}}],["bashcibuildwheel",{"2":{"145":1}}],["bashgit",{"2":{"134":1,"136":1}}],["bashpytest",{"2":{"144":1}}],["bashpython",{"2":{"131":1,"144":1}}],["bashpre",{"2":{"134":1}}],["bashpip",{"2":{"133":2,"142":3,"145":1,"146":2}}],["bash",{"2":{"21":1,"28":1,"31":1,"33":1,"37":2,"40":1,"140":1,"141":1,"144":1}}],["bash$",{"2":{"1":1,"2":1,"5":1,"6":1,"9":1}}],["baseline",{"2":{"136":1,"232":1}}],["baseparameters",{"0":{"126":1},"2":{"73":3,"115":1,"117":1,"119":1,"121":1,"123":1}}],["base64",{"2":{"20":1,"79":1,"82":1,"85":1,"91":1,"94":1,"126":1}}],["based",{"2":{"13":3,"33":1,"35":1,"85":1,"91":1,"158":1,"173":1,"174":5,"176":3,"179":1,"182":1,"211":1,"222":1}}],["base",{"2":{"3":3,"73":1,"222":1,"226":1,"230":1}}],["bytes",{"2":{"124":1,"229":2}}],["by",{"2":{"3":1,"6":3,"7":1,"8":2,"20":4,"27":2,"30":4,"32":1,"35":4,"36":3,"39":1,"43":1,"45":2,"49":1,"51":3,"54":2,"56":1,"64":1,"67":1,"70":1,"76":2,"77":1,"79":2,"80":2,"82":1,"83":1,"85":2,"88":1,"91":1,"92":1,"94":2,"97":1,"104":1,"111":1,"126":1,"140":1,"146":1,"147":3,"154":1,"157":1,"162":1,"174":4,"176":2,"215":1,"219":1,"220":1,"222":2,"223":1,"224":1,"225":1,"228":1}}],["behavior",{"2":{"152":1}}],["behaviours",{"2":{"96":1}}],["behaviour",{"0":{"216":1},"2":{"77":2,"215":1}}],["being",{"2":{"77":1,"171":1,"207":1}}],["bend",{"2":{"52":7,"66":7}}],["belonging",{"2":{"49":1}}],["belongs",{"2":{"41":2}}],["below",{"2":{"23":1,"138":1,"210":1,"219":1,"223":1}}],["berlin",{"2":{"21":2,"31":1,"37":2,"80":1}}],["bearing",{"0":{"129":1},"2":{"20":5,"28":1,"41":3,"51":2,"54":5,"79":1,"82":1,"85":1,"91":1,"94":1,"126":1,"129":4}}],["bearings=0",{"2":{"28":1}}],["bearings",{"2":{"20":1,"50":2,"54":6,"55":1,"79":1,"82":1,"83":1,"85":1,"91":1,"94":1,"126":1}}],["before",{"2":{"13":1,"51":2,"54":2,"137":1,"145":1,"171":1,"174":1,"176":1,"179":1,"216":1,"230":1}}],["better",{"2":{"10":1,"35":1,"91":1}}],["between",{"2":{"7":1,"18":1,"28":1,"30":1,"32":4,"33":2,"35":2,"43":1,"45":1,"47":5,"51":1,"54":1,"78":1,"85":1,"91":1,"92":1,"102":1,"114":1,"116":1,"140":1,"167":1,"173":1,"178":1,"188":1,"202":1,"216":1,"223":1}}],["best",{"2":{"9":1,"158":3,"218":1}}],["because",{"2":{"7":1,"35":1,"38":1,"76":1,"92":1,"158":1}}],["be",{"2":{"3":1,"6":1,"7":1,"8":1,"9":11,"12":1,"13":3,"20":3,"23":4,"24":1,"27":2,"30":4,"32":2,"33":6,"35":10,"36":5,"38":1,"39":2,"41":3,"43":1,"45":1,"49":2,"51":6,"52":1,"54":3,"56":1,"58":1,"59":4,"64":2,"67":2,"71":4,"72":1,"77":1,"79":10,"82":7,"85":6,"86":1,"87":2,"90":3,"91":6,"92":1,"93":2,"94":6,"97":2,"140":1,"144":1,"152":1,"157":1,"158":6,"160":1,"162":9,"163":2,"164":2,"169":1,"170":1,"171":4,"173":1,"174":3,"176":2,"177":2,"178":4,"179":2,"188":2,"189":1,"190":3,"197":3,"198":1,"201":1,"206":1,"207":1,"208":1,"211":1,"213":1,"214":3,"215":2,"216":2,"217":1,"222":2,"224":1}}],["nbg",{"2":{"222":1}}],["nw",{"2":{"162":1}}],["nilsnolde",{"2":{"136":1}}],["num",{"2":{"171":1}}],["numbers",{"2":{"49":2,"171":1}}],["number=3",{"2":{"28":1}}],["number=",{"2":{"27":1}}],["number",{"2":{"4":1,"20":2,"27":3,"30":2,"32":2,"35":1,"43":1,"45":1,"49":2,"51":2,"71":2,"73":1,"77":9,"79":1,"82":3,"83":1,"85":3,"91":1,"92":1,"115":1,"118":1,"119":2,"171":5,"172":2,"174":4,"176":1,"179":2,"220":2,"223":1,"229":6}}],["null",{"2":{"33":2,"35":1,"71":1,"79":4,"82":3,"85":4,"91":2,"92":1,"94":3}}],["navigation",{"2":{"207":2}}],["napi",{"2":{"76":3}}],["nationen",{"2":{"34":2}}],["native",{"2":{"15":1,"234":1}}],["nanobind",{"2":{"15":1,"146":3}}],["namely",{"2":{"54":2}}],["named",{"2":{"51":1,"64":1,"67":1,"112":1,"215":1}}],["names",{"0":{"172":1,"208":1},"2":{"9":1,"45":1,"46":1,"47":4,"48":1,"49":2,"171":1,"172":3,"221":1}}],["name",{"2":{"3":1,"12":1,"20":1,"23":1,"29":3,"34":6,"41":2,"43":2,"44":1,"49":8,"50":1,"51":5,"56":2,"57":1,"64":2,"67":2,"77":3,"112":2,"162":3,"171":3,"172":8,"207":2,"208":4,"209":1,"214":1,"228":5,"230":4}}],["neighbor",{"2":{"222":1}}],["nearby",{"2":{"179":1}}],["nearestparameters",{"0":{"119":1},"2":{"118":1}}],["nearest=1",{"2":{"111":1}}],["nearest",{"0":{"27":1,"81":1,"118":1},"1":{"28":1,"29":1,"82":1,"83":1,"119":1},"2":{"20":1,"27":3,"28":2,"41":1,"56":1,"77":2,"81":1,"82":2,"83":1,"112":2,"118":2,"119":1,"126":1,"179":1,"222":1,"229":2}}],["necessary",{"2":{"177":1,"215":1}}],["necessarily",{"2":{"51":1,"64":1,"67":1,"217":1}}],["next",{"2":{"54":1,"148":1}}],["newname",{"2":{"64":1,"67":1}}],["new",{"0":{"181":1,"187":1,"188":1},"1":{"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"51":4,"76":1,"80":1,"83":1,"86":1,"89":1,"92":1,"95":1,"98":1,"150":1,"153":1,"163":1,"164":1,"168":1,"182":1,"188":1,"194":1,"197":1,"201":1,"203":1,"205":1,"218":1}}],["never",{"2":{"41":1,"216":1}}],["negative",{"2":{"41":2}}],["nest",{"2":{"14":1}}],["needed",{"2":{"77":1,"133":1,"145":1,"162":1,"221":1}}],["need",{"2":{"12":1,"14":1,"35":1,"73":2,"142":1,"154":1,"155":1,"158":1,"161":1,"203":1,"214":1,"225":1,"232":1}}],["needs",{"2":{"12":2,"136":1,"157":1,"188":1}}],["network",{"2":{"10":1,"20":2,"27":1,"35":1,"76":2,"79":1,"81":1,"82":1,"83":1,"85":1,"86":1,"89":1,"90":1,"92":1,"94":1,"95":1,"97":1,"98":1,"120":1,"157":1,"174":1,"207":1,"223":1}}],["noise",{"2":{"173":1}}],["noisy",{"2":{"35":1,"91":1,"120":1}}],["non",{"2":{"145":1,"171":2,"194":1}}],["none",{"2":{"20":1,"52":1,"66":1,"115":2,"126":7,"165":1,"166":1,"220":1,"222":1}}],["nomatch",{"2":{"35":1}}],["normalized",{"2":{"171":1}}],["normal",{"2":{"51":3,"64":1,"67":1}}],["normally",{"2":{"41":1,"158":1}}],["noroute",{"2":{"30":1}}],["north",{"2":{"20":1,"41":1,"51":2,"54":3,"79":1,"82":1,"85":1,"91":1,"94":1}}],["nosegment",{"2":{"23":1}}],["now",{"2":{"13":1,"36":1,"73":1,"93":1,"216":1,"224":1,"225":1}}],["nodeb",{"2":{"224":1,"225":1}}],["nodea",{"2":{"224":1,"225":1}}],["nodejs",{"2":{"96":1,"97":2}}],["nodes",{"2":{"27":1,"29":3,"30":1,"35":1,"36":1,"46":1,"47":1,"48":1,"61":2,"79":1,"91":1,"94":1,"115":1,"156":1,"167":4,"168":1,"169":2,"170":2,"173":1,"207":1,"208":4,"209":1,"211":3,"214":2,"221":1,"223":1}}],["nodeid",{"2":{"12":1,"174":3}}],["nodeidvectortolinestring",{"2":{"12":3,"13":2,"14":6}}],["node",{"0":{"163":2,"168":1},"2":{"12":3,"13":2,"14":2,"15":3,"27":1,"41":1,"45":1,"47":2,"76":5,"152":1,"157":3,"163":5,"167":3,"168":10,"169":6,"170":6,"174":3,"175":1,"187":1,"188":1,"207":1,"208":3,"209":1,"211":2,"214":5,"216":2,"222":3,"223":1,"224":3,"225":3,"234":1}}],["no",{"2":{"9":4,"18":1,"30":1,"31":1,"32":1,"33":3,"35":1,"36":1,"38":1,"49":2,"51":3,"52":2,"54":1,"64":1,"66":2,"67":1,"93":3,"117":1,"133":1,"140":3,"141":2,"142":2,"143":1,"145":1,"146":1,"151":1,"181":1,"182":1,"184":1,"187":1,"188":1,"190":1,"191":1,"194":1,"197":1,"207":1,"214":2,"217":1}}],["notation",{"2":{"73":2}}],["notable",{"2":{"33":1}}],["nothing",{"2":{"51":1,"171":1}}],["notification",{"2":{"51":2,"64":1,"67":1}}],["notimplemented",{"2":{"33":1,"38":1}}],["notrips",{"2":{"38":1}}],["not",{"2":{"3":1,"9":3,"14":1,"20":3,"23":2,"24":2,"30":1,"32":1,"33":2,"35":4,"36":3,"38":2,"43":2,"47":2,"51":2,"54":3,"56":1,"59":1,"64":2,"67":2,"77":1,"79":6,"82":1,"85":1,"90":3,"91":3,"93":2,"94":1,"140":1,"142":1,"143":1,"145":1,"147":1,"152":1,"155":1,"156":2,"157":1,"158":1,"160":1,"169":1,"170":1,"171":1,"174":6,"176":3,"177":1,"188":1,"198":1,"202":1,"203":2,"207":1,"208":2,"209":2,"214":1,"215":3,"216":1,"217":1}}],["notes",{"2":{"133":1,"161":1,"162":2,"163":1,"164":1,"168":1,"169":1,"170":1,"171":1,"172":2,"173":1,"174":1,"176":1,"189":1,"191":1,"193":1}}],["noted",{"2":{"19":1}}],["note",{"2":{"3":1,"4":1,"30":1,"32":1,"35":1,"36":1,"41":1,"51":1,"79":1,"81":1,"90":1,"93":1,"97":1,"145":2,"162":1,"163":1,"167":1,"169":1,"170":1,"176":1}}],["n",{"2":{"4":2,"27":1,"30":1,"81":1,"182":1,"220":1,"222":1,"223":2,"227":1,"229":6}}],["np",{"2":{"36":1,"93":1}}],["npx",{"2":{"2":1}}],["npmjs",{"2":{"150":1}}],["npm",{"2":{"1":1,"5":1,"9":1,"147":1,"148":3,"181":1,"184":1,"185":5,"191":1,"193":1,"194":2}}],["january",{"2":{"182":1,"185":1}}],["java",{"2":{"58":1}}],["javascriptvar",{"2":{"76":1,"80":1,"83":1,"86":1,"89":1,"92":1,"95":1,"98":1}}],["javascript",{"2":{"58":1,"76":1,"97":1}}],["journey",{"2":{"171":1}}],["job",{"2":{"148":2}}],["judgement",{"2":{"218":1}}],["junction",{"2":{"171":1,"172":2}}],["jumps",{"2":{"35":1,"90":1}}],["justified",{"2":{"216":1,"218":1}}],["just",{"2":{"3":1,"54":2,"156":1,"157":1,"164":1,"167":1,"172":1}}],["j",{"2":{"33":7,"86":4}}],["json",{"2":{"20":2,"25":1,"27":1,"29":1,"34":1,"44":1,"46":1,"48":1,"50":1,"53":1,"55":1,"57":1,"58":3,"61":3,"62":3,"63":2,"64":5,"65":2,"66":1,"67":2,"68":1,"71":1,"73":5,"75":1,"79":1,"82":1,"97":3,"130":1,"136":4,"148":2,"151":1,"191":2,"194":1,"232":2}}],["js",{"2":{"2":1,"15":3,"39":1,"88":1,"199":1,"209":5}}],["immutable",{"2":{"164":1}}],["immediately",{"2":{"51":2,"54":2,"97":1,"227":1}}],["image",{"2":{"136":3,"143":1,"145":1}}],["impossible",{"2":{"207":1}}],["importantly",{"2":{"73":1,"171":1}}],["important",{"0":{"73":1},"2":{"155":1,"207":1,"214":1}}],["improving",{"2":{"206":1}}],["improbable",{"2":{"35":1,"90":1}}],["implied",{"2":{"209":1}}],["implies",{"2":{"167":1}}],["implication",{"2":{"207":1}}],["implement",{"2":{"202":1}}],["implemented",{"2":{"20":1,"73":1}}],["implementation",{"2":{"3":1}}],["impassable",{"2":{"163":1,"164":1}}],["impacts",{"0":{"217":1},"2":{"217":1}}],["impact",{"2":{"10":2,"217":1}}],["iypwpavravadi",{"2":{"50":1}}],["identical",{"2":{"140":1,"209":1}}],["identifier",{"2":{"56":1}}],["identifiers",{"2":{"51":1}}],["id",{"2":{"47":2}}],["ids",{"2":{"12":3,"13":1,"14":2,"27":1,"45":1,"167":1,"175":1}}],["ios",{"2":{"35":1}}],["ignored",{"2":{"97":1,"158":1,"171":1}}],["ignore",{"2":{"35":1,"73":1,"91":1,"121":1,"214":1}}],["i",{"2":{"33":7,"52":8,"66":8,"86":4,"172":1,"207":2,"208":6,"209":2,"216":4,"227":1}}],["iq",{"2":{"33":1}}],["ik",{"2":{"21":1}}],["item",{"2":{"140":1}}],["items",{"2":{"3":1,"215":1}}],["iteration",{"2":{"130":1}}],["its",{"2":{"73":2,"136":2,"140":1,"161":1,"162":1,"197":1,"200":1}}],["itself",{"2":{"12":1,"51":2,"58":1,"64":2,"67":2,"133":1,"178":1,"213":1,"216":1}}],["it",{"2":{"9":1,"10":1,"11":1,"12":4,"13":1,"24":1,"27":1,"30":2,"35":2,"36":3,"41":3,"43":1,"51":2,"59":1,"64":2,"67":2,"72":2,"73":5,"76":1,"79":2,"91":1,"92":1,"93":1,"97":1,"111":1,"138":1,"140":2,"142":1,"145":2,"152":1,"155":1,"156":1,"157":2,"158":2,"162":2,"163":4,"167":1,"168":1,"171":4,"172":1,"173":1,"174":1,"176":1,"179":1,"196":1,"197":1,"202":2,"206":1,"208":1,"209":1,"214":2,"216":2,"230":1,"233":1}}],["ipa",{"2":{"49":1}}],["ip",{"2":{"7":4,"227":2}}],["isolation",{"2":{"140":3,"141":2,"143":1,"146":1}}],["isolated",{"2":{"9":2,"140":1,"145":1}}],["issues",{"2":{"210":1,"212":1}}],["issue",{"2":{"17":1}}],["is",{"2":{"4":1,"5":1,"6":1,"7":3,"8":2,"9":2,"10":1,"11":2,"12":1,"13":1,"18":1,"20":5,"23":5,"24":1,"27":2,"30":1,"33":2,"35":7,"36":6,"38":1,"41":8,"43":3,"45":1,"47":2,"49":7,"51":7,"52":3,"54":3,"56":1,"58":4,"59":3,"64":1,"66":2,"67":1,"71":3,"72":3,"73":9,"76":2,"77":3,"79":1,"82":1,"83":1,"85":4,"86":1,"91":1,"92":5,"93":2,"94":2,"96":1,"97":5,"111":1,"140":2,"142":1,"143":2,"145":3,"146":1,"148":1,"150":1,"152":1,"156":2,"157":6,"158":4,"160":3,"162":3,"163":4,"164":1,"167":1,"168":1,"171":9,"172":4,"173":2,"174":18,"176":15,"177":2,"178":5,"179":1,"189":1,"190":2,"191":4,"192":1,"193":3,"194":1,"196":2,"197":1,"198":1,"202":1,"203":3,"206":1,"207":2,"208":1,"211":2,"213":1,"214":4,"215":3,"216":3,"217":3,"223":2,"231":1,"232":1}}],["iff",{"2":{"9":3}}],["if",{"2":{"3":1,"12":1,"13":2,"14":1,"20":2,"24":1,"27":1,"30":3,"32":1,"33":4,"35":5,"36":2,"38":1,"45":1,"49":6,"51":4,"54":1,"64":2,"67":2,"71":1,"73":1,"77":1,"79":4,"80":1,"85":1,"86":1,"89":1,"90":2,"91":2,"92":2,"95":1,"97":2,"98":1,"140":2,"145":1,"148":2,"153":1,"157":1,"158":5,"160":1,"161":1,"162":1,"163":1,"169":4,"170":1,"171":1,"174":1,"176":1,"177":4,"178":3,"179":1,"196":1,"197":1,"198":1,"201":1,"202":3,"203":1,"207":1,"208":2,"212":1,"215":2,"216":5,"217":2,"218":2}}],["involved",{"2":{"177":1}}],["invoking",{"2":{"145":1}}],["invocation",{"2":{"140":1}}],["invalidvalue",{"2":{"23":1}}],["invalidversion",{"2":{"23":1}}],["invalidquery",{"2":{"23":1}}],["invalidoptions",{"2":{"23":1}}],["invalidservice",{"2":{"23":1}}],["invalid",{"2":{"23":4,"179":4}}],["invalidurl",{"2":{"23":1}}],["inherited",{"2":{"126":1}}],["inherits",{"2":{"115":1,"117":1,"119":1,"121":1,"123":1}}],["inherit",{"2":{"73":1}}],["inheriting",{"2":{"73":1}}],["initialized",{"2":{"75":1}}],["initialize",{"2":{"73":1}}],["initializing",{"2":{"73":1}}],["initialisation",{"2":{"12":1}}],["info",{"2":{"220":1}}],["information",{"2":{"47":1,"54":1,"60":1,"171":1,"173":1,"174":2,"176":1,"177":1}}],["influence",{"2":{"212":1}}],["influences",{"2":{"30":1,"35":1,"36":1,"79":1,"91":1,"94":1,"152":1,"178":1}}],["incoming",{"2":{"174":1,"176":2,"197":1}}],["incurs",{"2":{"163":2}}],["included",{"2":{"49":3,"157":1}}],["include",{"2":{"47":2,"58":1,"59":1,"79":1,"91":1,"115":1,"126":1,"145":1,"171":2,"174":4,"176":2}}],["inclusion",{"2":{"12":1}}],["increase",{"2":{"158":1}}],["increasing",{"2":{"35":1}}],["incremental",{"2":{"35":1,"92":1,"184":1}}],["independent",{"2":{"203":1,"212":1}}],["index",{"2":{"30":3,"32":9,"35":7,"38":4,"47":1,"54":2,"79":1,"85":4,"91":1,"92":4,"95":4}}],["individually",{"2":{"204":1}}],["individual",{"2":{"171":1}}],["indication",{"2":{"52":10,"66":9}}],["indications",{"2":{"50":4,"52":4,"53":1,"55":1,"66":1}}],["indicating",{"2":{"33":1,"49":1,"51":3,"52":7,"66":6,"73":2,"86":1}}],["indicate",{"2":{"92":1,"171":1,"178":1,"208":1}}],["indicates",{"2":{"35":1,"51":6,"54":2,"64":3,"67":3}}],["indicated",{"2":{"30":1,"35":1,"189":1}}],["indices",{"2":{"30":1,"35":1,"73":1,"79":1,"91":1,"115":1,"117":2,"121":1,"176":1}}],["inputs",{"0":{"221":1},"2":{"56":1,"149":1,"220":1,"221":2}}],["input",{"0":{"154":1},"2":{"20":1,"23":1,"27":1,"30":2,"32":3,"35":5,"36":2,"38":2,"44":1,"56":1,"59":1,"79":1,"82":1,"83":2,"85":4,"91":3,"93":1,"94":1,"95":1,"117":1,"136":1,"154":1,"157":1,"163":1,"171":1,"179":1,"220":1,"222":2,"223":1,"224":1,"225":1}}],["insertion",{"2":{"36":1,"93":1}}],["inside",{"2":{"35":1,"92":1,"136":1,"145":2,"168":1,"169":1,"170":1}}],["instruction",{"2":{"51":2,"54":1,"64":2,"67":2,"217":1}}],["instructions",{"2":{"36":1,"45":1,"51":2,"172":2,"178":1,"206":4,"207":2,"208":1}}],["instead",{"2":{"20":1,"71":1,"72":1,"112":1,"136":1,"149":1,"158":1,"171":1,"172":1,"173":2,"196":1,"202":1,"216":2,"225":1,"228":1}}],["installed",{"2":{"142":2,"143":2,"144":1}}],["installing",{"0":{"133":1,"134":1}}],["installs",{"2":{"131":1}}],["install",{"0":{"140":1},"2":{"110":2,"133":3,"134":4,"136":2,"137":2,"140":3,"141":2,"142":3,"145":2,"146":2,"233":1}}],["installations",{"2":{"20":1}}],["instance",{"2":{"12":1,"73":1,"75":1,"76":2}}],["inspecting",{"2":{"216":1,"217":1}}],["inspect",{"2":{"10":2,"142":4,"218":1}}],["int",{"2":{"112":6,"115":2,"117":2,"119":1,"121":2,"125":3,"126":2}}],["introduction",{"0":{"72":1},"2":{"72":1,"200":1,"205":1}}],["introduced",{"2":{"51":2,"205":1}}],["introduce",{"2":{"10":1,"188":1}}],["intermediate",{"2":{"222":1}}],["interaction",{"2":{"217":1}}],["interpolate",{"2":{"179":2}}],["interpolating",{"2":{"179":1}}],["interpreter",{"2":{"162":1}}],["interpreters",{"2":{"162":1}}],["interface",{"0":{"73":1},"2":{"72":1}}],["internal",{"2":{"41":1,"56":1,"124":1,"130":1,"167":2,"169":1,"170":1,"222":1}}],["intersections",{"2":{"49":1,"50":1,"54":2,"64":2}}],["intersection",{"0":{"54":1,"65":1},"1":{"55":1},"2":{"41":1,"49":1,"51":2,"54":10,"64":2,"65":1,"67":1,"174":4,"176":2,"211":2}}],["interested",{"2":{"20":1,"79":1}}],["interesting",{"2":{"4":1}}],["integers",{"2":{"70":1,"73":1,"91":1,"179":1}}],["integer",{"2":{"20":2,"27":1,"32":1,"35":1,"41":5,"51":1,"79":2,"82":3,"85":4,"91":2,"94":2,"171":1,"174":9,"176":4}}],["into",{"0":{"12":1},"1":{"13":1},"2":{"2":1,"3":1,"12":2,"14":1,"51":1,"54":2,"64":1,"67":1,"72":1,"73":1,"77":2,"85":1,"112":1,"148":1,"152":1,"173":1,"205":1,"207":1,"211":1,"214":1,"215":1,"223":1,"228":1,"230":1}}],["in",{"0":{"156":1,"187":1},"2":{"0":1,"3":2,"6":2,"7":4,"8":1,"9":1,"10":1,"12":1,"13":2,"18":1,"20":8,"23":1,"27":2,"30":6,"32":5,"33":8,"35":11,"36":4,"37":2,"38":4,"39":2,"41":8,"43":3,"45":2,"47":3,"49":5,"50":2,"51":11,"52":2,"54":4,"55":1,"56":1,"58":4,"59":1,"64":6,"65":1,"67":7,"71":2,"72":2,"73":3,"74":1,"76":3,"77":7,"78":1,"79":9,"80":2,"81":1,"82":7,"83":1,"85":11,"86":8,"87":2,"90":2,"91":5,"92":2,"94":7,"95":2,"101":1,"103":1,"105":1,"107":1,"109":1,"112":6,"126":3,"130":2,"134":1,"136":2,"137":1,"138":1,"140":1,"141":2,"142":2,"143":1,"145":5,"147":1,"153":1,"155":1,"156":2,"157":6,"158":2,"162":10,"163":2,"164":3,"167":4,"168":2,"170":2,"171":15,"172":1,"173":3,"174":12,"176":7,"177":3,"178":3,"179":6,"180":1,"182":1,"188":1,"189":3,"190":1,"193":1,"194":1,"196":1,"198":1,"201":2,"203":3,"204":1,"205":1,"206":1,"207":5,"208":1,"209":1,"210":2,"211":2,"212":1,"213":1,"214":1,"215":5,"216":3,"217":3,"218":1,"221":2,"222":1,"227":1,"229":7,"230":3,"232":2}}],["f",{"2":{"176":1}}],["fmt",{"2":{"137":1}}],["fst",{"2":{"202":1}}],["fs",{"2":{"89":1}}],["fbresult",{"2":{"59":1}}],["fundamentally",{"2":{"216":1}}],["function",{"2":{"73":3,"75":1,"79":1,"80":1,"82":1,"83":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"94":1,"95":1,"98":1,"157":5,"161":5,"162":5,"168":2,"169":1,"170":2,"171":2,"172":2,"173":2,"174":1,"177":3,"179":2,"202":1}}],["functions",{"0":{"180":1},"2":{"73":3,"157":6,"161":4,"171":1,"180":1,"201":1}}],["furthermore",{"2":{"203":1}}],["further",{"2":{"52":1,"54":1,"76":1}}],["future",{"2":{"51":1}}],["fully",{"2":{"52":1,"66":1,"227":1}}],["full",{"2":{"30":2,"35":2,"36":2,"43":2,"54":1,"79":1,"91":1,"94":1,"114":1,"115":1,"133":1,"140":1,"146":1,"219":1,"230":1}}],["full|simplified|false",{"2":{"30":1}}],["fly",{"2":{"197":1}}],["flow",{"0":{"155":1},"2":{"155":1}}],["floating",{"2":{"73":2}}],["float",{"2":{"35":1,"41":4,"43":2,"45":2,"49":2,"69":2,"71":2,"92":1,"112":1,"117":2,"126":3,"162":2,"164":2,"171":6,"173":7,"174":3}}],["flat",{"2":{"71":2}}],["flatbuffers",{"0":{"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"20":1,"58":3,"59":1,"79":1,"82":1,"97":3,"137":1}}],["flags",{"2":{"54":1,"140":2,"178":2,"220":1}}],["flag",{"2":{"52":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1}}],["flies",{"2":{"32":1,"85":2,"117":1}}],["fixture",{"0":{"203":1}}],["fix",{"2":{"189":1}}],["fixed",{"2":{"73":1,"158":1,"203":1}}],["fixing",{"2":{"36":1}}],["fill",{"2":{"73":1}}],["filled",{"2":{"73":1}}],["file=$env",{"2":{"140":1}}],["file=$vcpkg",{"2":{"136":1,"145":1}}],["filenames",{"2":{"47":1}}],["filename",{"2":{"41":1,"222":1}}],["file",{"0":{"12":1},"1":{"13":1},"2":{"12":1,"14":1,"24":2,"47":2,"77":3,"89":1,"111":1,"112":1,"136":1,"137":1,"145":1,"154":2,"157":2,"161":1,"179":2,"196":1,"220":1,"221":1,"222":4,"224":8,"225":7}}],["files",{"0":{"161":1},"2":{"2":2,"3":1,"6":1,"9":1,"14":2,"73":1,"76":1,"77":2,"112":1,"137":1,"140":1,"156":1,"157":2,"161":1,"196":1,"221":1,"222":3,"224":1,"228":1}}],["finishes",{"2":{"150":1}}],["finish",{"2":{"148":1,"230":1}}],["finding",{"2":{"161":2}}],["find",{"2":{"72":1,"137":1,"179":1,"215":1,"217":1}}],["finds",{"2":{"30":1,"114":1,"118":1,"141":1}}],["fine",{"2":{"47":1,"72":1,"214":1}}],["first",{"2":{"36":11,"37":1,"47":1,"49":1,"54":1,"70":2,"79":1,"91":1,"93":4,"94":1,"95":1,"115":1,"122":1,"123":2,"140":1,"172":1,"181":1,"182":1,"214":1,"223":1,"234":1}}],["fields",{"2":{"59":1,"62":1,"64":1}}],["fieldset",{"2":{"59":1}}],["field",{"2":{"12":1,"24":1,"27":1,"41":1,"47":1,"61":2,"62":2,"63":2,"64":4,"71":2,"217":1}}],["frequent",{"2":{"230":1}}],["free",{"2":{"4":1}}],["fraction",{"2":{"223":2}}],["france",{"2":{"73":2}}],["francisco",{"2":{"40":1}}],["friedrichstraße",{"2":{"29":3,"34":2,"57":1}}],["from",{"0":{"169":1,"170":1,"175":1},"2":{"12":1,"20":2,"24":1,"33":3,"35":1,"39":1,"41":2,"49":1,"51":3,"54":2,"56":1,"59":1,"64":1,"67":1,"73":5,"77":1,"79":1,"86":2,"87":1,"111":1,"126":1,"133":1,"136":1,"140":3,"143":1,"145":3,"149":2,"158":1,"167":1,"169":6,"170":6,"173":1,"174":2,"176":1,"192":1,"196":1,"207":1,"208":3,"209":4,"214":3,"215":1,"216":1,"219":1,"222":1,"223":1,"224":3,"225":3,"228":1,"234":2}}],["feat",{"2":{"189":2}}],["features",{"2":{"12":1,"14":1,"203":1,"205":1,"206":2,"209":6,"210":1}}],["feature",{"0":{"206":1},"2":{"9":2,"12":1,"41":1,"77":2,"206":1,"209":1,"213":1,"228":1,"230":1}}],["ferries",{"2":{"162":1}}],["ferry",{"2":{"162":1,"171":2}}],["feel",{"2":{"216":1}}],["feeling",{"2":{"10":1}}],["feeds",{"2":{"152":1}}],["fetches",{"2":{"40":1}}],["few",{"2":{"10":1,"12":1,"73":2,"180":1}}],["folder",{"2":{"74":1,"161":1}}],["follows",{"2":{"20":1,"157":1,"172":1,"176":1}}],["followed",{"2":{"3":1,"49":1,"104":1,"162":1,"219":1}}],["following",{"2":{"3":1,"9":1,"19":1,"20":2,"27":2,"30":2,"32":1,"33":1,"35":4,"36":2,"38":2,"51":1,"52":1,"59":1,"61":1,"62":1,"63":1,"64":2,"65":1,"66":1,"67":2,"92":1,"93":1,"95":1,"162":2,"163":1,"165":1,"166":1,"168":1,"171":1,"172":1,"173":1,"174":1,"177":1,"178":1,"208":1,"209":1,"214":1}}],["follow",{"2":{"2":1,"20":1,"51":1,"64":1,"67":1,"71":1,"158":1,"178":1,"189":1,"210":1,"214":1}}],["four",{"2":{"37":1,"211":1}}],["found",{"2":{"23":1,"30":1,"32":1,"33":3,"35":2,"38":1,"90":1,"117":1,"156":1,"211":1}}],["footway=sidewalk",{"2":{"172":1}}],["foot",{"2":{"20":1,"152":1,"153":1,"154":2}}],["forcibly",{"2":{"230":1}}],["force",{"2":{"36":1,"93":1,"115":1,"140":1,"162":1}}],["forces",{"2":{"30":1,"79":1,"162":1}}],["forbidding",{"2":{"214":1}}],["forbidden",{"2":{"214":2}}],["forward",{"2":{"162":2,"164":2,"166":1,"168":1,"171":13,"188":4}}],["forwarding",{"2":{"145":1}}],["forks",{"2":{"178":1}}],["fork",{"2":{"51":2,"64":2,"67":2,"178":1}}],["for",{"0":{"133":1,"134":1,"140":1,"212":1,"231":1},"1":{"232":1,"233":1,"234":1},"2":{"7":2,"10":1,"12":4,"13":2,"14":8,"15":2,"20":3,"27":1,"30":5,"32":2,"33":2,"35":10,"36":6,"40":1,"41":4,"43":1,"47":3,"49":5,"51":4,"54":5,"56":1,"58":1,"59":2,"62":1,"64":5,"67":3,"72":1,"73":9,"76":3,"77":3,"79":7,"82":2,"84":2,"85":4,"91":7,"92":2,"93":3,"94":4,"97":2,"115":2,"117":1,"118":1,"121":1,"122":1,"126":2,"130":1,"133":3,"136":2,"138":1,"142":1,"143":2,"145":1,"148":1,"152":2,"153":2,"155":1,"156":1,"157":3,"158":2,"161":9,"162":7,"163":1,"170":2,"171":6,"172":5,"173":5,"174":3,"178":2,"179":3,"181":1,"185":1,"190":1,"192":1,"193":1,"194":1,"196":1,"197":1,"199":1,"200":1,"201":2,"202":2,"203":2,"205":1,"207":1,"209":1,"212":2,"215":3,"216":2,"220":1,"221":1,"222":4,"224":1,"225":2,"229":2,"230":3,"231":1,"234":1}}],["formats",{"2":{"62":1,"64":1,"187":1}}],["format",{"0":{"58":1,"184":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"4":1,"20":5,"30":1,"35":1,"36":1,"43":1,"58":5,"61":2,"62":1,"63":2,"64":3,"65":1,"67":1,"79":3,"82":2,"91":1,"94":1,"97":6,"98":1,"115":1,"146":1,"179":1,"181":1,"189":1,"191":1,"192":1,"193":1,"214":2,"221":1}}],["farthest",{"2":{"36":1,"93":1}}],["far",{"2":{"35":1}}],["factoring",{"2":{"179":1}}],["factors",{"2":{"158":1}}],["factor",{"2":{"32":1,"85":1,"117":1,"223":1,"224":2,"225":2}}],["factory",{"2":{"13":3}}],["fallback",{"2":{"32":3,"33":3,"34":1,"51":1,"85":4,"86":2,"117":3,"172":2}}],["false",{"2":{"20":2,"30":5,"35":4,"36":8,"43":1,"45":3,"50":4,"53":1,"54":1,"55":2,"79":6,"91":4,"93":4,"94":3,"95":1,"115":2,"121":1,"162":3,"171":1}}],["faster",{"2":{"30":1,"58":1,"79":1}}],["fastest",{"2":{"30":1,"32":2,"36":1,"78":1,"114":1,"152":2,"158":2,"171":1}}],["fast",{"2":{"2":1,"4":1}}],["failure",{"2":{"216":1}}],["failing",{"0":{"215":1},"1":{"216":1,"217":1,"218":1}}],["failed",{"2":{"148":1,"202":2}}],["fails",{"2":{"136":1,"148":1}}],["fail",{"2":{"2":1,"4":1}}],["89",{"2":{"34":1}}],["872438",{"2":{"29":1}}],["811961",{"2":{"29":1}}],["8",{"2":{"2":1,"34":1,"98":1,"209":1}}],["pinned",{"2":{"136":1,"232":1}}],["pipeline",{"2":{"219":1}}],["pip",{"2":{"110":1,"134":1,"140":4,"141":2}}],["pyi",{"2":{"146":5}}],["pyproject",{"2":{"145":2,"151":1}}],["pypi",{"2":{"133":1,"147":1,"148":3,"150":1}}],["pythonbearing",{"2":{"129":1}}],["pythoncoord",{"2":{"128":1}}],["pythonparams",{"2":{"114":1,"116":1,"118":1,"120":1,"122":1,"124":1}}],["pythonresult",{"2":{"113":1,"130":1}}],["pythonimport",{"2":{"111":1}}],["python",{"0":{"110":1,"132":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"15":2,"58":1,"110":1,"131":6,"133":2,"136":1,"144":1,"146":5,"151":1}}],["pbf>",{"2":{"222":1}}],["pbf",{"2":{"76":1,"89":1,"131":1,"153":1,"154":3,"222":1}}],["php",{"2":{"58":1}}],["phonetic",{"2":{"49":1}}],["phase",{"2":{"43":1}}],["penalty",{"2":{"157":1,"162":1,"171":1,"174":2,"224":3,"225":2}}],["penalized",{"2":{"35":1}}],["pep",{"2":{"140":1}}],["person",{"2":{"218":1}}],["persist",{"2":{"196":1}}],["persistent",{"2":{"18":1,"77":2,"140":1}}],["perceived",{"2":{"215":1}}],["performance",{"2":{"222":1}}],["performed",{"2":{"97":1}}],["perfectly",{"2":{"214":1}}],["perf",{"2":{"189":1}}],["per",{"2":{"12":1,"18":1,"30":1,"35":1,"36":1,"79":1,"91":1,"94":1,"126":1,"182":1,"184":1,"219":1,"221":1,"223":1}}],["periodically",{"2":{"6":1}}],["plus",{"2":{"136":1}}],["plugins",{"2":{"96":1}}],["plugin",{"2":{"36":1,"93":1,"97":4}}],["planet",{"2":{"153":1,"154":3}}],["platform",{"0":{"135":1},"1":{"136":1,"137":1,"138":1},"2":{"133":2,"140":1,"142":1,"145":5,"150":1}}],["platz",{"2":{"34":2}}],["placed",{"2":{"153":1}}],["place",{"2":{"47":1,"164":1}}],["plausible",{"2":{"35":1,"90":1}}],["please",{"2":{"30":1,"35":1,"51":1,"79":1,"90":1,"178":1}}],["plenty",{"2":{"7":1}}],["publication",{"2":{"193":1,"194":1}}],["publishing",{"2":{"194":1}}],["publish",{"2":{"148":4}}],["publisher",{"2":{"148":1}}],["publishes",{"2":{"147":1}}],["published",{"2":{"133":1,"150":1,"191":2,"194":1,"232":1}}],["pure",{"2":{"211":1}}],["purely",{"2":{"178":1}}],["purpose",{"2":{"136":1}}],["pushed",{"2":{"191":1}}],["push",{"2":{"148":1}}],["pushing",{"2":{"147":1}}],["put",{"2":{"13":1,"59":1}}],["pull",{"2":{"8":1,"189":1}}],["pr",{"2":{"189":1}}],["primitives",{"0":{"202":1},"2":{"202":1}}],["primary",{"2":{"172":1,"177":2,"207":3,"208":10,"211":8}}],["private",{"2":{"171":1}}],["priority",{"2":{"171":2,"174":4,"176":2,"178":5}}],["prioritize",{"2":{"158":1}}],["prior",{"2":{"77":2}}],["prints",{"2":{"221":1}}],["print",{"2":{"13":1,"113":2,"128":1,"129":1,"130":1,"202":2,"217":1,"218":1,"220":1}}],["printing",{"2":{"12":1}}],["preset",{"2":{"234":2}}],["presence",{"2":{"212":1}}],["present",{"2":{"54":1,"59":5,"164":1,"174":1,"208":1}}],["prefix",{"2":{"184":1,"191":1}}],["prefixed",{"2":{"181":1}}],["preferable",{"2":{"158":1}}],["prefer",{"2":{"158":4,"203":1}}],["preferences",{"2":{"158":1}}],["prevent",{"0":{"210":1},"1":{"211":1,"212":1,"213":1},"2":{"207":1,"210":1}}],["prevents",{"2":{"171":1}}],["previously",{"2":{"140":1}}],["previous",{"2":{"20":1,"126":1,"182":1}}],["preparation",{"2":{"222":1}}],["prepared",{"2":{"76":1,"77":1,"111":1,"226":1,"230":1}}],["prepare",{"2":{"20":1,"203":1}}],["preprocessing",{"2":{"153":1,"155":1}}],["prerequisites",{"0":{"233":1},"2":{"133":1}}],["precompiled",{"2":{"58":1}}],["preceded",{"2":{"51":1,"64":1,"67":1}}],["precision",{"2":{"20":1,"35":1,"49":2,"91":1,"162":2}}],["pre",{"2":{"13":1,"133":2,"134":1,"136":2,"143":1}}],["prompt",{"2":{"234":1}}],["progress",{"2":{"178":1}}],["production",{"0":{"133":1}}],["produces",{"2":{"222":1}}],["produce",{"2":{"14":1,"141":1}}],["providing",{"2":{"75":1}}],["provides",{"2":{"15":1,"58":1}}],["provide",{"2":{"5":1,"12":2,"14":1,"58":1,"73":1,"110":1}}],["pronounce",{"2":{"49":1}}],["pronunciation",{"2":{"49":5,"51":1,"64":1,"67":1,"171":2,"172":2}}],["proceeds",{"2":{"49":1}}],["processes",{"2":{"157":1,"172":1,"230":1}}],["processed",{"2":{"23":1}}],["processing",{"0":{"155":1,"217":1},"2":{"13":1,"155":1,"157":3,"161":3,"162":3,"167":1,"173":1,"188":1,"217":2}}],["process",{"0":{"163":1,"171":1,"173":1,"174":1,"191":1},"1":{"175":1,"176":1,"177":1},"2":{"12":1,"157":6,"162":2,"163":3,"167":5,"168":4,"169":2,"170":2,"171":6,"173":3,"174":4,"176":1,"177":3,"179":1,"182":1}}],["protozero",{"2":{"137":1}}],["protobuf",{"2":{"41":1}}],["protocol",{"2":{"20":1,"58":2,"89":1}}],["properties",{"2":{"27":1,"30":1,"33":1,"35":3,"38":2,"43":1,"45":1,"47":1,"49":1,"51":2,"52":1,"54":1,"56":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"69":1,"70":1,"73":2,"92":1,"95":1,"162":3,"188":2}}],["property",{"2":{"23":1,"24":1,"41":2,"43":1,"49":2,"51":4,"54":1,"64":1,"65":1,"67":2,"83":1,"92":1,"162":1}}],["project",{"2":{"17":1,"21":3,"28":1,"31":1,"33":6,"37":2,"40":1,"41":1,"134":1,"150":2,"201":1}}],["probable",{"2":{"7":1,"35":1,"92":1}}],["probably",{"2":{"4":1}}],["problems",{"2":{"10":1}}],["problem",{"2":{"7":1,"36":1,"93":1,"122":1,"148":1}}],["profile",{"0":{"163":1,"171":1,"173":1,"174":1},"1":{"175":1,"176":1,"177":1},"2":{"3":12,"8":2,"16":1,"20":5,"27":1,"30":2,"32":1,"35":1,"36":1,"39":1,"41":1,"43":1,"46":3,"47":3,"48":3,"54":1,"79":2,"82":1,"85":1,"91":1,"94":1,"152":3,"153":3,"154":3,"155":1,"157":6,"160":2,"162":3,"163":1,"168":1,"169":1,"170":1,"171":2,"177":1,"179":3,"207":1,"208":3,"209":1,"222":3}}],["profilespath",{"2":{"7":1}}],["profiles",{"0":{"3":1,"152":1,"153":1,"154":1,"156":1,"157":1},"1":{"153":1,"154":2,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1},"2":{"3":9,"7":3,"8":1,"16":1,"20":1,"41":1,"76":3,"131":1,"152":3,"153":4,"154":4,"155":1,"156":1,"157":1,"158":1,"160":1,"161":1,"178":1,"180":1,"222":1}}],["power",{"2":{"171":1}}],["powershelldelvewheel",{"2":{"142":1}}],["powershellremove",{"2":{"140":1}}],["powershell",{"2":{"140":1,"141":1}}],["powershellgit",{"2":{"138":1}}],["powerful",{"2":{"15":1,"156":1}}],["potentially",{"2":{"43":1,"51":1,"100":1,"217":1}}],["pointing",{"2":{"52":1}}],["point",{"2":{"35":2,"38":2,"51":2,"69":3,"92":3,"95":2,"111":1,"136":1,"162":1,"164":1,"171":1,"173":1,"179":1}}],["points",{"2":{"35":6,"36":1,"73":1,"85":1,"90":2,"91":1,"92":2,"179":1}}],["post",{"0":{"217":1},"2":{"217":2}}],["possibilities",{"2":{"178":1}}],["possibility",{"2":{"52":1,"66":1}}],["possible",{"0":{"13":1},"2":{"13":1,"27":1,"36":2,"51":1,"64":1,"67":1,"93":1,"152":1,"156":2,"157":1,"158":1,"173":1,"174":1,"211":1,"214":1,"218":1}}],["position",{"0":{"69":1},"2":{"20":1,"51":1,"61":1,"62":1,"64":1,"65":1,"67":1}}],["pollution",{"2":{"173":1}}],["polyline|polyline6|geojson",{"2":{"30":1,"35":1,"36":1}}],["polyline6",{"2":{"20":2,"30":1,"35":1,"36":1,"49":1,"62":1,"64":1,"115":1}}],["polyline",{"2":{"20":4,"21":2,"30":1,"33":2,"35":1,"36":1,"49":3,"62":2,"64":2,"79":1,"91":1,"94":1,"115":2}}],["policy",{"2":{"12":3,"14":1}}],["policies",{"2":{"12":1}}],["portable",{"2":{"142":1}}],["port",{"2":{"4":1,"7":3,"136":1,"227":2}}],["ports",{"2":{"4":2,"136":1}}],["patch",{"0":{"187":1},"2":{"182":1,"190":1,"192":1}}],["patchlevel",{"0":{"187":1},"2":{"148":1,"149":1,"181":2,"184":3,"191":1,"192":1,"193":1}}],["path=",{"2":{"145":1}}],["path",{"2":{"7":5,"36":1,"54":1,"73":1,"77":3,"93":2,"111":2,"112":1,"142":2,"145":2,"154":1,"158":2,"206":1,"222":4}}],["pamagevjaoauaaaaiaaaaacaaaaaaaaarss0qa7lnehivira4lseqaoaaaaqaaaabaaaaaaaaadmaaaaaezmaklyiqm8tmwarvghawea3wps52d3",{"2":{"34":2}}],["pair",{"2":{"32":1,"47":5,"51":1,"54":1,"56":1,"70":3,"73":1}}],["pairs",{"2":{"32":2,"33":1,"126":2,"170":2}}],["parent",{"0":{"197":1},"2":{"197":2}}],["parsing",{"2":{"161":1,"224":1,"225":1}}],["parse",{"2":{"222":2,"224":1,"225":1}}],["parser",{"2":{"58":1}}],["parsers",{"2":{"58":1}}],["parseduration",{"2":{"180":1}}],["parsed",{"2":{"23":1}}],["parks",{"2":{"158":1}}],["parts",{"2":{"173":2,"214":1}}],["particular",{"2":{"152":2,"158":1}}],["partitioning",{"2":{"224":1}}],["partitioned",{"2":{"224":1}}],["partitions",{"2":{"223":1}}],["partition",{"0":{"223":1},"2":{"131":1,"223":1,"225":1}}],["partial",{"2":{"41":1}}],["part",{"2":{"20":1,"79":1,"171":2,"216":1}}],["paradigm",{"2":{"215":1}}],["params",{"2":{"113":1,"114":1,"116":1,"118":1,"120":1,"122":1,"124":1,"130":1}}],["parameter",{"2":{"20":3,"24":1,"35":1,"43":3,"45":2,"49":1,"51":1,"64":1,"67":1,"73":2}}],["parameters",{"0":{"77":1,"79":1,"82":1,"85":1,"88":1,"91":1,"94":1,"97":1,"101":1,"103":1,"105":1,"107":1,"109":1,"112":1},"2":{"6":1,"12":2,"14":2,"20":1,"23":1,"51":1,"64":1,"67":1,"73":4,"75":1,"79":1,"82":1,"85":1,"91":1,"94":1,"97":1,"113":1,"126":1,"178":1,"187":1,"188":1}}],["parallelized",{"2":{"162":1}}],["parallel",{"2":{"2":1,"4":2,"9":1}}],["packages",{"2":{"181":1,"184":1}}],["package",{"2":{"20":1,"110":1,"131":1,"133":1,"137":1,"144":1,"148":2,"150":1,"151":1,"191":3,"194":2}}],["passes",{"2":{"54":1}}],["passed",{"2":{"49":1,"163":1,"168":1}}],["passing",{"2":{"20":1,"30":1,"54":2,"158":1,"163":1,"212":1}}],["pass",{"2":{"4":1,"5":1,"20":3,"138":1,"142":1,"152":1,"173":1,"193":1}}],["p",{"2":{"2":3,"3":1,"76":1,"131":1,"153":1,"222":1,"227":1}}],["l",{"2":{"220":1}}],["ll",{"2":{"152":1}}],["ld",{"2":{"145":3}}],["lu",{"2":{"50":1}}],["luaobstacle",{"2":{"170":1}}],["luabool",{"2":{"169":1}}],["luafunction",{"2":{"168":1,"169":1,"170":1,"179":2}}],["lualocal",{"2":{"164":1}}],["lua",{"0":{"156":1},"2":{"3":1,"8":1,"16":1,"20":1,"41":2,"46":3,"47":1,"48":3,"58":1,"76":1,"131":1,"137":1,"153":2,"154":3,"156":2,"157":1,"161":9,"162":2,"172":1,"173":1,"176":1,"177":1,"179":2,"222":3}}],["len",{"2":{"130":1}}],["lengths",{"2":{"207":1}}],["length",{"2":{"32":1,"41":1,"158":2,"173":1,"176":1}}],["left",{"0":{"176":1},"2":{"41":2,"49":1,"50":1,"51":8,"52":7,"53":1,"55":1,"64":3,"66":4,"67":2,"162":2,"174":5,"176":4}}],["lets",{"2":{"73":1}}],["let",{"2":{"39":1,"87":1}}],["less",{"2":{"35":1,"36":1,"72":1,"93":1,"202":1}}],["leaves",{"2":{"51":1,"64":1,"67":1}}],["leading",{"2":{"169":1,"170":1,"174":1,"181":1,"182":1,"184":1,"191":1}}],["lead",{"2":{"35":1,"90":1}}],["least",{"2":{"27":1}}],["legal",{"2":{"49":1}}],["legs",{"2":{"30":1,"35":1,"36":1,"43":2,"44":1,"62":1,"79":1,"94":1}}],["leg",{"0":{"63":1},"2":{"30":2,"35":1,"36":1,"45":2,"47":1,"51":2,"62":2,"63":1,"64":2,"67":2,"79":2,"115":1,"176":1}}],["level",{"2":{"2":1,"30":1,"35":1,"36":1,"41":1,"43":1,"79":1,"91":1,"125":1,"220":1,"223":3,"228":1}}],["launcher",{"2":{"143":1}}],["language",{"2":{"156":1,"171":1}}],["land",{"2":{"145":1}}],["lands",{"2":{"141":1}}],["lane",{"0":{"52":1,"66":1},"1":{"53":1},"2":{"51":1,"52":4,"54":2,"65":2,"66":1}}],["lanes",{"2":{"50":2,"51":1,"54":3,"55":1,"65":1,"171":6,"174":4,"176":2}}],["later",{"2":{"157":1,"161":1,"177":1}}],["latest",{"2":{"80":1,"153":1}}],["latter",{"2":{"97":1}}],["lat",{"2":{"73":2,"79":1,"82":1,"85":1,"91":1,"94":1,"128":1,"173":2,"179":2}}],["latitude",{"2":{"20":3,"27":1,"49":2,"51":1,"54":1,"56":1,"69":2,"73":2,"81":1,"126":1,"179":2}}],["layout",{"2":{"58":1}}],["layer",{"2":{"41":2}}],["layers",{"2":{"41":1}}],["last",{"2":{"36":9,"37":1,"47":1,"79":1,"91":1,"93":4,"94":1,"95":1,"115":1,"122":1,"123":1,"182":1}}],["larger",{"2":{"35":2,"51":1,"64":1,"67":1}}],["large",{"2":{"35":1,"41":1,"51":1,"64":1,"67":1,"90":1,"178":1,"217":1,"222":1}}],["labeled",{"2":{"9":1}}],["lt",{"2":{"12":2,"13":2,"14":6,"32":2,"41":1,"85":4,"91":1,"142":1,"148":1,"150":1,"174":2,"202":2,"220":2,"221":1,"222":5,"223":5,"224":5,"225":5,"227":3,"228":3,"229":9,"230":3}}],["light",{"2":{"163":1,"164":1,"174":2}}],["lights",{"2":{"163":1}}],["live",{"2":{"142":1,"224":1,"225":1,"230":1}}],["lives",{"2":{"12":1,"72":1,"145":1}}],["literal",{"2":{"79":1,"82":1,"85":1,"91":1,"94":1,"97":1}}],["lifting",{"2":{"73":1}}],["lifetime",{"2":{"12":2}}],["lib64",{"2":{"145":1}}],["libs",{"2":{"142":1}}],["libraries",{"2":{"142":1}}],["library",{"0":{"161":1},"2":{"72":1,"133":1,"142":1,"145":3,"157":2,"161":1,"187":1,"188":1,"199":1,"203":1}}],["libosmium",{"2":{"137":1}}],["libosrm",{"2":{"72":3}}],["lib",{"2":{"76":3,"161":1}}],["links",{"2":{"154":1}}],["link",{"2":{"137":1,"142":1,"171":2,"174":4,"176":2,"178":1}}],["linux=",{"2":{"145":1}}],["linux",{"0":{"136":1},"2":{"133":2,"136":1,"140":1,"141":1,"142":2,"143":1,"144":1,"145":7}}],["linux|darwin|win32",{"2":{"9":2}}],["line",{"0":{"219":1},"1":{"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1},"2":{"131":1,"145":1,"171":1,"173":1,"219":1,"221":2}}],["linestring",{"2":{"44":1,"49":1}}],["limits",{"0":{"229":1},"2":{"20":2,"79":2,"82":2,"85":2,"91":1,"94":2,"222":1}}],["limited",{"2":{"18":1,"51":1}}],["limitations",{"0":{"14":1}}],["listen",{"2":{"227":2}}],["listed",{"2":{"54":1}}],["listdeps",{"2":{"142":1}}],["list",{"0":{"221":1},"2":{"12":2,"13":1,"14":2,"20":1,"41":1,"49":1,"51":1,"54":2,"79":1,"115":2,"117":3,"121":2,"126":7,"130":1,"162":2,"171":1,"220":1,"221":2,"223":1,"230":4}}],["likely",{"2":{"35":1,"168":1,"169":1,"170":1}}],["like",{"2":{"12":1,"20":1,"39":1,"41":1,"47":1,"51":1,"88":2,"91":1,"113":1,"130":2,"152":2,"153":1,"157":2,"158":1,"162":1,"164":4,"173":2,"216":1,"217":1}}],["low",{"2":{"158":1}}],["locks",{"2":{"230":2}}],["lock",{"0":{"196":1},"2":{"148":1,"191":1,"196":3,"230":1}}],["locally",{"0":{"139":1,"145":1},"1":{"140":1,"141":1,"142":1,"143":1},"2":{"142":2}}],["local",{"2":{"136":1,"143":1,"145":1,"151":2,"157":1,"171":1,"179":3}}],["locations",{"2":{"20":1,"28":1,"32":2,"33":1,"35":1,"73":1,"77":8,"84":1,"111":4,"112":8,"211":1,"217":1,"229":3}}],["location",{"0":{"13":1},"2":{"12":1,"13":3,"20":2,"29":3,"32":3,"34":6,"35":3,"36":1,"49":1,"50":2,"51":4,"52":1,"54":3,"55":1,"56":1,"57":1,"61":2,"65":2,"67":2,"85":2,"91":1,"123":1,"173":1,"212":2,"217":1,"222":5}}],["located",{"2":{"6":1,"51":2,"58":1,"64":2,"67":2,"206":1}}],["loop",{"2":{"97":1,"164":1,"165":1}}],["lookups",{"2":{"222":1}}],["looking",{"2":{"157":1,"216":1}}],["look",{"2":{"72":1,"173":1,"200":1,"202":1,"205":1,"216":1,"217":1}}],["looks",{"2":{"12":1,"214":1,"216":1}}],["lon",{"2":{"73":2,"79":1,"82":1,"85":1,"91":1,"94":1,"128":1,"173":2,"179":2}}],["longer",{"2":{"158":1}}],["longitude",{"2":{"20":3,"27":1,"49":2,"51":1,"54":1,"56":1,"69":2,"73":2,"81":1,"126":1,"179":2}}],["long",{"2":{"12":1,"41":2,"70":2,"133":1,"173":1}}],["lobster",{"2":{"58":1}}],["lortzingstraße",{"2":{"50":1}}],["logical",{"2":{"220":1}}],["log",{"2":{"13":1,"80":2,"83":1,"86":4,"92":2,"95":2,"98":1,"198":1,"202":1,"220":1,"224":1,"225":1}}],["logger",{"2":{"12":1,"14":1}}],["logging",{"0":{"198":1},"2":{"11":2,"12":3,"13":2,"198":1}}],["logs",{"2":{"7":3}}],["logspath",{"2":{"7":1}}],["lost",{"2":{"7":1,"197":1}}],["loads",{"2":{"226":1,"230":1}}],["loaded",{"2":{"77":1,"157":1,"162":1,"230":1}}],["loading",{"0":{"228":1},"2":{"77":1,"112":1,"157":1,"162":1,"179":1,"196":1,"228":2,"230":1}}],["loadmethod",{"2":{"7":1}}],["load",{"2":{"2":3,"3":3,"7":2,"9":3,"73":1,"144":1,"161":1,"179":4,"228":1}}],["mm",{"0":{"188":1}}],["mmap=true",{"2":{"112":1}}],["mmap",{"2":{"2":2,"3":2,"77":4,"112":1,"228":1}}],["md",{"2":{"140":1,"142":3}}],["m",{"2":{"131":7,"144":1,"146":2,"148":1,"149":1,"162":1,"181":3,"184":4,"191":2,"192":2,"193":1,"216":4,"228":1,"229":2}}],["middle",{"2":{"215":1}}],["micro",{"2":{"214":1}}],["microsoft",{"2":{"136":1,"138":1,"233":1}}],["min",{"2":{"179":2}}],["minimum",{"2":{"222":1}}],["minimality",{"2":{"203":1}}],["minimize",{"2":{"58":1}}],["mini",{"2":{"164":1,"165":1,"209":7}}],["mismatches",{"2":{"202":1}}],["mismatch",{"2":{"140":1}}],["missing",{"2":{"136":1}}],["misses",{"2":{"136":1}}],["mix",{"2":{"73":1}}],["might",{"2":{"30":1,"33":1,"35":3,"38":1,"51":1,"52":1,"90":2,"158":1,"215":1,"217":1}}],["myst",{"2":{"209":10}}],["my",{"0":{"215":1},"1":{"216":1,"217":1,"218":1},"2":{"51":2,"64":2,"67":2}}],["mvt",{"2":{"39":1,"40":1}}],["movement",{"2":{"157":1,"174":1}}],["mount",{"2":{"145":1}}],["monitor",{"2":{"194":1}}],["month",{"0":{"187":1,"188":1},"2":{"148":1,"181":1,"182":3,"184":2,"190":2,"191":2,"192":1,"193":1}}],["monthly",{"0":{"148":1},"2":{"147":2,"149":1,"151":1,"181":1,"182":2,"190":2,"192":1}}],["monaco",{"2":{"144":1}}],["monotonically",{"2":{"35":1}}],["motorway",{"2":{"126":1,"162":2,"171":2,"174":4,"176":2,"177":1,"178":2}}],["motorways",{"2":{"21":1,"162":2}}],["modifying",{"2":{"155":1,"157":1}}],["modify",{"2":{"153":1,"163":1,"171":1,"208":1}}],["modifier",{"2":{"41":2,"50":1,"51":18,"64":11,"67":12,"215":1}}],["modification",{"2":{"35":1,"91":1}}],["modules",{"2":{"76":5}}],["modern",{"2":{"232":1}}],["modes",{"2":{"152":1}}],["modelling",{"2":{"209":1}}],["model",{"2":{"41":2,"214":1}}],["mode",{"2":{"20":1,"49":2,"50":1,"51":2,"64":1,"67":1,"134":1,"138":1,"164":1,"171":7,"174":6,"176":3,"232":1}}],["most",{"2":{"14":1,"35":1,"73":1,"90":1}}],["more",{"2":{"3":2,"18":1,"35":2,"36":1,"78":1,"85":1,"93":1,"114":1,"155":1,"224":1,"225":1,"230":1}}],["mutually",{"2":{"77":1}}],["much",{"2":{"58":1,"72":1,"218":1}}],["must",{"2":{"13":1,"20":1,"79":1,"82":1,"91":1,"115":1,"140":1,"162":2,"179":2,"189":1}}],["multiply",{"2":{"85":1}}],["multiple",{"0":{"154":1},"2":{"3":1,"14":1,"35":1,"43":1,"52":1,"56":1,"90":1,"100":1,"209":5,"230":1}}],["multi",{"2":{"2":1,"223":1,"228":1}}],["ms",{"2":{"7":2}}],["making",{"2":{"215":1}}],["makes",{"2":{"173":1}}],["make",{"2":{"4":1,"10":1,"12":1,"41":2,"77":1,"140":1,"142":1,"144":1,"145":1,"158":1,"203":1,"204":1,"209":1,"217":1}}],["master",{"2":{"148":1,"149":1,"190":3,"192":1}}],["macos",{"0":{"137":1},"2":{"133":2,"137":1,"140":1,"141":1,"142":1,"143":2,"144":1,"145":1,"150":1}}],["machine",{"2":{"3":1,"73":4}}],["managed",{"2":{"228":1,"232":1}}],["management",{"0":{"190":1}}],["mandatory",{"2":{"171":2}}],["manual",{"0":{"149":1,"192":1},"2":{"182":1,"193":2,"194":1}}],["manually",{"2":{"146":1,"190":1,"192":1,"202":1}}],["mangle",{"2":{"142":2}}],["manifest",{"2":{"138":1,"232":1}}],["manylinux",{"2":{"136":4,"142":2,"143":1,"145":1,"150":1}}],["many",{"2":{"79":1,"157":1,"158":1,"161":1,"168":1,"173":2,"174":2,"176":1,"208":1}}],["maneuvertype",{"2":{"67":1}}],["maneuvers",{"2":{"54":2,"208":1}}],["maneuver",{"2":{"49":4,"50":1,"51":6,"52":1,"54":2,"64":4,"67":4,"104":1}}],["maxspeed",{"2":{"161":1}}],["max",{"2":{"77":14,"111":6,"112":12,"162":2,"179":2,"223":1,"229":8,"230":1}}],["maximum",{"2":{"73":1,"161":1,"162":2,"223":2,"229":8}}],["main",{"2":{"71":1,"73":1,"76":1,"97":1,"111":1,"143":1,"172":1}}],["markers",{"2":{"172":1}}],["marked",{"2":{"79":1,"82":1,"85":1,"91":1,"94":1,"148":1,"172":1}}],["mark",{"2":{"171":1}}],["marks",{"2":{"59":1}}],["marking",{"2":{"52":1}}],["may",{"2":{"41":3,"51":1,"59":3,"164":2,"169":1,"170":1,"171":1,"178":1,"185":1,"188":3,"203":1,"222":1}}],["major",{"2":{"33":2,"45":1,"86":4,"178":1}}],["malformed",{"2":{"23":1}}],["matrices",{"2":{"71":2,"116":1}}],["matrix",{"2":{"33":9,"71":2,"73":1,"85":4,"86":4}}],["matter",{"2":{"20":1,"79":1}}],["matchparameters",{"0":{"121":1},"2":{"120":1}}],["matched",{"2":{"35":4,"38":1,"90":1,"92":3,"95":1}}],["matches",{"2":{"9":6,"27":1,"35":1,"81":1,"90":1}}],["matching=3",{"2":{"111":1}}],["matchings",{"2":{"35":5,"92":6}}],["matching",{"2":{"12":1,"35":8,"77":4,"90":2,"91":2,"92":4,"112":1,"150":1,"151":1,"162":2,"229":4}}],["match",{"0":{"35":1,"90":1,"120":1},"1":{"91":1,"92":1,"121":1},"2":{"12":1,"20":2,"30":1,"35":3,"59":1,"90":1,"91":1,"92":1,"112":1,"120":1,"126":1,"136":1,"140":1,"145":1}}],["maps",{"2":{"203":1}}],["mappings",{"2":{"156":1}}],["mapped",{"2":{"2":1,"172":1}}],["map",{"0":{"167":1,"168":1,"169":1,"170":1},"1":{"168":1,"169":1,"170":1},"2":{"35":4,"39":2,"41":1,"77":5,"87":1,"88":1,"90":1,"91":1,"92":2,"111":1,"112":2,"162":1,"163":1,"168":1,"169":5,"170":5,"175":1,"207":1,"208":3,"209":1,"211":2,"214":2,"216":2,"228":1,"229":2}}],["mapbox",{"2":{"10":1,"39":2,"87":1,"88":1}}],["mjs",{"2":{"3":1,"7":2}}],["mechanics",{"0":{"151":1}}],["mechanism",{"2":{"11":1}}],["member",{"2":{"73":2,"163":1,"164":1,"171":1}}],["memory=true",{"2":{"111":1}}],["memory=false",{"2":{"111":1}}],["memory",{"2":{"2":3,"39":1,"77":11,"87":1,"111":1,"112":5,"144":1,"196":2,"228":6,"230":6}}],["merges",{"2":{"145":1}}],["merge",{"2":{"49":1,"51":3,"64":3,"67":3,"104":1}}],["merged",{"2":{"3":1}}],["measure",{"2":{"158":1}}],["measures",{"2":{"158":1}}],["measured",{"2":{"35":1}}],["meaning",{"2":{"51":1,"171":1}}],["means",{"2":{"35":2,"73":2,"140":1,"155":1}}],["message",{"2":{"23":2,"25":1,"58":1,"60":2,"220":1}}],["metric",{"2":{"212":1,"230":2}}],["metres",{"2":{"85":1,"229":1}}],["metadata",{"2":{"30":1,"35":1,"36":1,"39":1,"46":1,"47":3,"48":1,"87":1,"115":1,"222":2}}],["meters",{"2":{"20":1,"32":1,"33":1,"35":1,"43":1,"45":1,"47":1,"49":1,"56":1,"79":1,"82":1,"83":1,"85":1,"86":1,"91":1,"94":1,"112":1,"126":1,"171":2,"207":3,"208":3,"209":1,"216":1,"217":1}}],["methods",{"2":{"2":1,"113":1}}],["method",{"2":{"2":1,"3":3,"7":2,"9":3,"76":1}}],["mentioned",{"2":{"5":1}}],["mld",{"2":{"2":2,"3":2,"77":1,"111":1,"112":1,"223":1,"224":1,"228":1,"229":1}}],["hsgr",{"2":{"221":1}}],["hwloc",{"2":{"142":3}}],["h",{"2":{"41":1,"171":1,"174":2,"176":1,"220":1}}],["huge",{"2":{"35":1,"91":1}}],["human",{"2":{"23":1}}],["having",{"2":{"169":1,"170":1}}],["have",{"2":{"36":2,"39":1,"52":1,"76":1,"87":1,"93":2,"148":1,"153":1,"162":1,"167":2,"173":3,"174":2,"176":1,"177":1,"200":1,"202":2,"205":1,"216":1}}],["hand",{"2":{"147":1,"162":1,"174":2}}],["handling",{"2":{"121":1,"161":3}}],["handles",{"2":{"172":1,"194":1}}],["handle",{"2":{"156":1,"157":2,"158":1}}],["handled",{"2":{"51":1}}],["handlers",{"2":{"161":1,"172":1}}],["handler",{"2":{"13":1}}],["hard",{"2":{"36":1,"41":1,"93":1}}],["hash",{"2":{"157":1,"162":2,"171":1,"179":1}}],["hashes",{"2":{"140":1}}],["has",{"2":{"23":1,"24":2,"27":1,"35":2,"38":1,"54":1,"72":1,"73":1,"83":1,"92":2,"95":1,"97":1,"141":1,"157":1,"172":1,"174":1,"179":1,"209":1}}],["history",{"0":{"182":1},"2":{"189":1}}],["hills",{"2":{"173":1}}],["hits",{"2":{"136":1}}],["high",{"2":{"158":1,"171":1,"198":1}}],["highway=path",{"2":{"172":1}}],["highway=cycleway",{"2":{"172":1}}],["highway=footway",{"2":{"172":1}}],["highway",{"0":{"177":1},"2":{"51":3,"64":3,"67":3,"162":2,"171":1,"174":4,"176":2,"177":9,"207":1,"208":3,"209":1,"211":2}}],["higher",{"2":{"41":1}}],["highest",{"2":{"30":1,"35":1,"36":1,"43":1,"79":1,"91":1,"158":1}}],["hint",{"2":{"20":6,"29":3,"34":6,"49":1,"56":3,"57":1,"79":1,"82":1,"85":1,"91":1,"94":1,"172":1}}],["hints",{"2":{"20":4,"79":3,"82":3,"85":3,"91":3,"94":3,"126":4}}],["hierarchy",{"2":{"2":1,"223":1,"225":1,"228":1}}],["hpp",{"2":{"12":2,"171":2,"174":4,"176":2,"217":2}}],["https",{"2":{"39":1,"134":1,"136":1,"138":1,"233":1}}],["http",{"0":{"18":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"7":2,"15":2,"16":1,"18":2,"19":1,"21":3,"23":2,"27":1,"28":1,"31":1,"33":6,"37":2,"40":1,"41":1,"72":1,"73":1,"187":1,"188":1,"198":1,"226":2,"227":1,"229":1}}],["httptimeout",{"2":{"7":1}}],["headers",{"2":{"217":1}}],["header",{"2":{"214":1,"229":2}}],["heavy",{"2":{"73":1}}],["help",{"2":{"220":2}}],["helpful",{"2":{"207":1}}],["helps",{"2":{"189":1}}],["helper",{"0":{"180":1},"2":{"161":2,"180":1}}],["held",{"2":{"6":1}}],["heuristic",{"2":{"36":1,"93":1}}],["here",{"2":{"4":1,"13":1,"59":1,"72":2,"73":1,"214":1}}],["hosted",{"2":{"232":1}}],["host",{"2":{"145":3}}],["hosts",{"2":{"145":1}}],["hooks",{"2":{"134":1}}],["holds",{"2":{"73":1}}],["horizontalaccuracy",{"2":{"35":1}}],["homebrew",{"2":{"137":1,"143":1}}],["home",{"2":{"2":1,"3":1}}],["however",{"2":{"36":1,"173":1,"177":1,"214":1,"216":1}}],["how",{"0":{"11":1},"2":{"0":1,"5":1,"10":1,"35":1,"41":4,"49":1,"72":1,"152":1,"174":2,"176":1,"201":1,"203":1,"205":1}}],["r",{"2":{"211":1,"230":1}}],["ruff",{"2":{"146":2}}],["rust",{"2":{"58":1}}],["rules",{"2":{"51":1,"64":1,"67":1}}],["runners",{"2":{"232":1}}],["running",{"0":{"144":1,"145":1,"204":1},"2":{"9":1,"76":1,"77":1,"153":1,"162":1,"197":1,"219":1,"230":1}}],["runs",{"2":{"6":1,"9":1,"140":4,"142":1,"148":2,"191":1}}],["run",{"2":{"1":1,"5":2,"9":4,"13":1,"77":2,"136":1,"140":1,"144":1,"148":3,"149":1,"150":1,"192":2,"203":1,"204":1,"207":1,"224":1}}],["root=c",{"2":{"233":1}}],["root=$pwd",{"2":{"136":1}}],["root",{"0":{"59":1},"2":{"59":1,"71":1,"136":1,"138":2,"140":2,"145":4,"232":1,"234":1}}],["rotated",{"2":{"54":1}}],["rotary",{"2":{"49":8,"51":6,"64":4,"67":4}}],["rounding",{"2":{"212":1}}],["roundabouts",{"2":{"209":5}}],["roundaboutturn",{"2":{"64":1,"67":1}}],["roundabout",{"2":{"51":16,"64":11,"67":11,"164":1,"165":1,"171":3,"209":4}}],["rounded",{"2":{"41":1,"47":1}}],["round",{"2":{"36":1,"37":2}}],["roundtrip",{"2":{"36":4,"93":2,"94":2,"95":1,"123":1}}],["roundtrip=true",{"2":{"122":1}}],["roundtrip=",{"2":{"36":1}}],["routable",{"2":{"39":1,"87":1,"157":1}}],["routeparameters",{"0":{"115":1},"2":{"73":1,"114":1,"121":1,"123":1}}],["routeobject",{"0":{"62":1},"2":{"59":2}}],["routeleg",{"0":{"45":1,"102":1},"1":{"46":1,"103":1},"2":{"43":1}}],["routestep",{"0":{"49":1,"104":1},"1":{"50":1,"105":1},"2":{"43":1,"45":1,"51":1,"64":1,"67":1,"171":1}}],["routes",{"2":{"30":4,"32":1,"41":1,"59":1,"76":1,"77":1,"79":3,"80":1,"112":1,"113":1,"115":1,"130":1,"152":1,"155":1,"179":1,"211":2,"213":1,"229":1}}],["router",{"2":{"21":3,"28":1,"31":1,"33":6,"37":2,"40":1}}],["route",{"0":{"30":1,"43":1,"78":1,"100":1,"114":1},"1":{"31":1,"44":1,"79":1,"80":1,"101":1,"115":1},"2":{"20":1,"21":3,"30":9,"31":1,"32":2,"33":3,"35":8,"36":7,"38":1,"41":1,"43":4,"45":6,"47":2,"49":1,"51":1,"54":1,"56":2,"59":1,"62":1,"64":1,"67":1,"73":2,"76":1,"77":2,"78":1,"79":5,"80":3,"85":1,"91":3,"92":5,"94":6,"95":2,"98":1,"100":1,"102":1,"108":1,"112":1,"113":2,"114":2,"115":2,"117":1,"126":1,"130":4,"152":1,"158":4,"162":1,"171":3,"178":1,"207":3,"208":6,"209":4,"213":1,"216":6,"228":2,"229":1,"230":2}}],["routed",{"0":{"226":1},"1":{"227":1,"228":1,"229":1},"2":{"7":2,"9":1,"16":1,"72":1,"131":1,"197":2,"198":1,"221":3,"226":1,"230":1}}],["routine",{"2":{"12":1}}],["routing",{"2":{"2":2,"7":1,"15":2,"39":2,"41":2,"73":4,"77":1,"79":1,"82":1,"85":1,"87":2,"91":1,"94":1,"110":1,"112":1,"124":1,"152":2,"155":1,"158":4,"162":1,"171":1,"172":2,"173":1,"174":1,"209":1,"219":1,"222":1,"228":1}}],["rows",{"2":{"71":2,"179":2}}],["row",{"2":{"33":2,"71":4,"86":5}}],["roads",{"0":{"176":2},"2":{"39":1,"45":1,"54":1,"87":1,"158":1,"174":5,"176":11,"177":1,"178":2,"207":1,"213":1}}],["road",{"0":{"176":2},"2":{"20":1,"35":1,"39":1,"41":2,"51":6,"52":2,"54":3,"64":5,"67":5,"76":1,"79":1,"82":1,"85":1,"87":1,"90":1,"94":1,"120":1,"126":1,"162":1,"164":1,"171":13,"172":1,"174":18,"176":18,"178":6,"207":5,"208":21,"209":1,"215":1,"223":1}}],["rapidjson",{"2":{"137":1}}],["ram",{"2":{"77":1,"112":1,"228":1}}],["ramps",{"2":{"178":2}}],["ramp",{"2":{"51":8,"64":3,"67":3,"171":1}}],["raw",{"2":{"59":1,"219":1,"222":1}}],["ratio",{"2":{"223":1}}],["rate",{"0":{"158":1},"2":{"41":1,"158":10,"171":2}}],["rather",{"2":{"32":1,"41":1,"77":1}}],["random",{"2":{"213":1}}],["randomness",{"0":{"210":1},"1":{"211":1,"212":1,"213":1}}],["rank",{"2":{"30":1,"80":2}}],["range",{"2":{"20":1,"51":2,"79":1,"82":1,"85":1,"91":1,"94":1,"126":1,"129":1}}],["radius=",{"2":{"111":1}}],["radius",{"2":{"20":5,"35":7,"77":4,"79":1,"82":1,"85":1,"94":1,"112":2,"126":1,"229":4}}],["radiuses=",{"2":{"120":1}}],["radiuses",{"2":{"20":1,"35":1,"79":1,"82":1,"85":1,"91":1,"94":1,"126":1}}],["rastersource",{"2":{"179":1}}],["rasterbotinterp",{"2":{"179":1}}],["rasterbot",{"2":{"173":1,"179":1}}],["raster",{"0":{"179":1},"2":{"8":3,"179":11}}],["right",{"0":{"176":1},"2":{"13":1,"36":1,"41":1,"49":1,"50":3,"51":8,"52":6,"64":2,"66":4,"67":2,"93":1,"172":2,"174":3,"176":5,"202":1,"208":1,"214":3,"215":2,"216":10}}],["reduce",{"2":{"206":1,"222":1}}],["regions",{"2":{"230":1}}],["region",{"2":{"222":1,"228":1}}],["registry",{"2":{"194":1}}],["registered",{"2":{"168":1,"170":1,"201":1}}],["register",{"2":{"168":3,"201":1}}],["regenerate",{"2":{"146":1}}],["regenerates",{"2":{"146":1}}],["remember",{"2":{"145":1,"217":1}}],["remove",{"2":{"121":1,"189":1,"230":3}}],["removed",{"2":{"35":1,"90":1,"188":1}}],["removes",{"2":{"20":1,"79":1}}],["retrieves",{"2":{"170":1}}],["retrieve",{"2":{"167":3,"168":1,"175":1}}],["retag",{"2":{"142":1}}],["returning",{"2":{"41":1}}],["return",{"2":{"32":1,"41":1,"73":1,"75":1,"79":1,"85":4,"91":1,"94":4,"97":1,"113":1,"115":1,"119":1,"123":1,"157":1,"161":1,"162":3,"169":1,"171":1,"177":1,"179":1}}],["returned",{"2":{"27":3,"30":3,"31":1,"35":3,"36":8,"41":1,"79":1,"82":1,"91":1,"93":1,"94":1,"130":1,"157":1,"163":1,"171":1}}],["returns",{"2":{"27":1,"30":1,"32":1,"33":6,"35":1,"36":3,"78":1,"80":1,"81":1,"83":1,"84":1,"86":1,"89":1,"92":1,"95":1,"97":1,"124":1,"157":1,"169":1,"170":1}}],["rebuild",{"2":{"140":1,"146":2}}],["rebuilding",{"2":{"136":1}}],["reuse",{"2":{"140":1,"143":1,"234":1}}],["reverse",{"2":{"52":1,"66":1}}],["reversal",{"2":{"51":1}}],["rely",{"0":{"213":1}}],["reload",{"2":{"155":1,"230":1}}],["releasable",{"2":{"193":1}}],["releasing",{"0":{"147":1,"181":1},"1":{"148":1,"149":1,"150":1,"151":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"193":1}}],["released",{"2":{"190":2}}],["releases",{"2":{"147":1,"181":1,"182":2,"190":1,"191":1,"192":2,"193":1,"194":1}}],["release",{"0":{"148":1,"149":1,"186":1,"190":1,"191":1,"192":1,"193":1,"194":1},"1":{"187":1,"188":1},"2":{"136":2,"145":1,"147":2,"149":2,"150":1,"151":1,"181":1,"182":3,"185":5,"189":1,"190":1,"191":2,"192":2,"193":3,"194":2}}],["relevant",{"2":{"51":1,"161":2}}],["relations",{"0":{"163":1,"171":1},"2":{"162":2,"163":3,"168":1,"171":3,"214":2}}],["relationship",{"2":{"54":1}}],["relation",{"2":{"51":1,"162":1}}],["relative",{"2":{"20":1,"41":1,"54":1,"79":1,"82":1,"85":1,"94":1}}],["related",{"2":{"9":1,"13":1,"47":1,"217":1}}],["refer",{"2":{"214":1}}],["referencing",{"2":{"171":1}}],["referenced",{"2":{"162":1}}],["references",{"2":{"157":1}}],["reference",{"2":{"13":1,"49":1,"73":1,"161":1,"172":2,"219":1}}],["refactor",{"2":{"189":1}}],["ref",{"2":{"49":2,"73":1,"171":5,"172":2}}],["re",{"2":{"41":1,"73":1,"145":1,"201":1,"224":1}}],["recurse",{"2":{"140":1}}],["records",{"2":{"140":1}}],["recompilation",{"2":{"141":1}}],["recompile",{"2":{"140":1}}],["recompiled",{"2":{"140":1}}],["recompiling",{"2":{"136":1,"141":1}}],["recommended",{"0":{"140":1}}],["recommendation",{"2":{"30":1,"80":2}}],["recent",{"2":{"14":1}}],["repeatedly",{"2":{"224":1}}],["repeatable",{"2":{"222":1,"224":2,"225":2}}],["reproducibility",{"2":{"203":1}}],["represent",{"2":{"152":1,"215":1}}],["representation",{"2":{"54":1,"71":2}}],["represents",{"2":{"43":1,"45":1,"52":1,"100":1,"102":1,"164":2,"181":1}}],["representing",{"2":{"30":1,"35":1,"38":1,"49":1,"80":2,"88":1,"92":1,"95":1,"171":1}}],["repair",{"0":{"142":1},"2":{"142":5}}],["repo",{"2":{"134":1,"136":3,"232":1,"234":1}}],["reported",{"2":{"217":1}}],["reports",{"2":{"216":2}}],["reporting",{"2":{"202":1}}],["report",{"2":{"51":1,"215":2,"216":1}}],["repository",{"2":{"17":1,"74":1,"146":1}}],["replacing",{"2":{"230":1}}],["replaces",{"2":{"145":1}}],["replace",{"2":{"85":1}}],["replaced",{"2":{"51":2}}],["replication",{"2":{"24":1}}],["resistance",{"2":{"158":1}}],["reside",{"2":{"3":1}}],["resolves",{"2":{"151":1}}],["resolve",{"2":{"137":1,"142":1}}],["resources",{"0":{"17":1}}],["resembling",{"2":{"73":1}}],["responsibility",{"2":{"168":1}}],["responses",{"0":{"22":1,"99":1},"1":{"23":1,"24":1,"25":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1},"2":{"85":1,"188":1}}],["response",{"0":{"25":1,"29":1,"34":1,"38":1,"41":1},"2":{"20":3,"23":1,"24":1,"27":1,"30":1,"32":1,"33":1,"35":1,"41":2,"58":1,"59":2,"79":3,"82":1,"83":2,"85":2,"86":5,"89":2,"91":1,"92":3,"94":1,"95":3,"98":2,"126":1,"187":1,"188":1}}],["respectively",{"2":{"73":1}}],["respective",{"2":{"54":2}}],["results=3",{"2":{"118":1}}],["results",{"2":{"39":1,"77":2,"87":1,"111":1,"112":2,"119":1,"130":1,"155":1,"211":1,"229":1}}],["result",{"0":{"42":1,"163":1,"171":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"30":1,"35":1,"73":2,"75":1,"79":1,"80":3,"85":1,"90":1,"97":1,"113":2,"114":1,"116":1,"118":1,"120":1,"122":1,"124":1,"130":1,"158":3,"163":2,"168":1,"171":11,"173":1,"174":1,"179":1,"207":1,"210":1,"215":1,"216":1,"218":1}}],["restarting",{"2":{"230":1}}],["restarts",{"2":{"196":1}}],["restricted",{"2":{"55":1,"171":3,"174":4,"176":2}}],["restriction",{"2":{"54":1,"214":7,"224":1,"225":1}}],["restrictions",{"0":{"214":1},"2":{"23":1,"162":4,"214":4,"222":2,"224":1,"225":1}}],["restrict",{"2":{"20":1,"79":1,"82":1,"85":1,"94":1}}],["restful",{"2":{"15":1}}],["require",{"2":{"157":1,"161":1,"202":1,"214":1}}],["requirements",{"0":{"135":1},"1":{"136":1,"137":1,"138":1},"2":{"140":1}}],["requires",{"2":{"12":2,"14":1,"76":1,"77":2,"111":2,"112":1,"144":1,"145":1,"214":1,"224":1}}],["required|optional",{"2":{"221":1}}],["required",{"2":{"12":2,"137":1,"157":5,"178":1,"194":1,"220":1,"221":3,"224":1,"225":1}}],["requested",{"2":{"30":1,"32":1,"79":1,"85":1}}],["requests",{"0":{"20":1,"21":1,"28":1,"37":1},"1":{"21":1},"2":{"18":2,"19":1,"20":1,"56":1,"79":1,"82":1,"85":1,"91":1,"94":1,"126":1,"197":2,"198":1}}],["request",{"0":{"31":1,"33":1,"40":1},"2":{"8":1,"20":2,"23":4,"27":1,"30":1,"33":2,"35":2,"38":2,"79":1,"82":1,"85":1,"90":1,"91":1,"94":1,"189":1}}],["real",{"2":{"203":1}}],["really",{"2":{"73":1}}],["reasonable",{"2":{"207":1,"216":1}}],["reason",{"2":{"156":1}}],["reasons",{"2":{"7":1}}],["ready",{"0":{"197":1},"2":{"197":1}}],["reads",{"2":{"145":1,"222":1}}],["readme",{"2":{"136":1}}],["readable",{"2":{"23":1}}],["read",{"2":{"8":1,"163":1,"164":4,"171":1,"173":9,"174":34,"176":14,"222":1}}],["rf",{"2":{"6":1}}],["rm",{"2":{"6":1}}],["csv",{"2":{"224":2,"225":2}}],["cb",{"2":{"214":1}}],["cycleway=sidepath",{"2":{"172":1}}],["cxx",{"2":{"143":1}}],["ccache",{"2":{"143":1,"145":5}}],["cmakecache",{"2":{"140":1}}],["cmakelists",{"2":{"137":1,"201":1}}],["cmake",{"2":{"136":3,"137":1,"138":2,"140":3,"141":2,"143":1,"145":4,"204":1,"234":1}}],["cd",{"2":{"134":1,"144":2,"203":1,"204":1,"207":6,"208":3,"209":1}}],["cpus",{"2":{"220":1}}],["cp312",{"2":{"133":1,"140":1,"142":1}}],["cpython",{"2":{"133":1}}],["cell",{"2":{"223":2}}],["cells",{"2":{"33":2,"34":1,"86":2,"221":1,"223":1}}],["certain",{"2":{"73":1,"158":2}}],["c++",{"2":{"58":1,"72":1,"133":1,"137":1,"138":1,"146":1,"187":1,"188":1,"233":1}}],["c",{"2":{"58":1,"176":1,"207":1,"208":3,"209":1,"211":4,"214":2,"216":2,"233":2}}],["criteria",{"2":{"169":1}}],["creation",{"2":{"194":1}}],["creating",{"2":{"76":1,"77":3,"151":1}}],["creates",{"2":{"140":1,"147":1}}],["created",{"2":{"12":1,"152":1,"191":2,"193":1}}],["create",{"2":{"12":1,"13":1,"75":1,"76":1,"145":1,"148":1,"152":1,"153":1,"154":1,"217":1}}],["cron",{"2":{"148":1}}],["crossing",{"2":{"165":1}}],["cross",{"2":{"54":2}}],["crow",{"2":{"32":1,"85":2,"117":1}}],["click",{"2":{"192":2}}],["cli",{"0":{"131":1}}],["client",{"2":{"51":1}}],["clone",{"2":{"134":2,"136":1,"138":2,"233":2}}],["closely",{"2":{"145":1}}],["close",{"2":{"51":1,"208":1}}],["clockwise",{"2":{"20":1,"51":2,"54":2,"79":1,"82":1,"85":1,"91":1,"94":1,"176":1}}],["cllocation",{"2":{"35":1}}],["classification",{"0":{"177":2},"2":{"171":6,"174":14,"176":7,"177":9,"178":1}}],["classes",{"2":{"20":1,"51":1,"54":2,"55":1,"64":1,"67":1,"79":1,"126":1,"162":3,"171":4,"178":1}}],["class",{"2":{"20":4,"111":1,"162":1,"171":4,"174":4,"176":2}}],["cleanly",{"2":{"151":1}}],["clean",{"2":{"9":1,"230":1}}],["cleaned",{"2":{"6":1}}],["caution",{"0":{"218":1}}],["category",{"2":{"178":3}}],["capable",{"2":{"39":1,"87":1}}],["calming",{"2":{"164":1,"165":1}}],["calculation",{"2":{"47":1,"149":1,"215":1,"216":1}}],["calculating",{"2":{"32":1,"85":1}}],["calculate",{"2":{"32":1,"41":1,"54":1,"76":1}}],["calculated",{"2":{"20":1,"43":1,"45":1,"49":1,"79":1,"158":1,"191":1}}],["calling",{"2":{"171":1}}],["callback",{"2":{"79":1,"82":1,"85":1,"88":1,"91":1,"94":1}}],["called",{"2":{"13":1,"157":2,"162":3,"173":1,"174":1,"189":1,"211":1}}],["call",{"2":{"12":2,"13":1,"59":4,"75":1,"168":1,"169":1,"170":1,"202":1}}],["calls",{"2":{"9":1,"13":1,"14":1,"97":1,"137":1}}],["care",{"2":{"73":1}}],["car",{"2":{"20":1,"40":1,"76":1,"131":1,"152":2,"153":2,"154":2,"157":2,"171":1,"207":1,"208":3,"209":1,"222":1}}],["cases",{"2":{"203":1}}],["case",{"2":{"12":1,"20":1,"23":1,"27":1,"30":1,"33":1,"35":1,"38":1,"41":1,"51":1,"59":1,"73":2,"79":1,"158":1,"209":1,"216":2,"217":1}}],["cached",{"2":{"162":1}}],["cachepath",{"2":{"7":1}}],["cache",{"0":{"6":1,"143":1},"2":{"6":4,"7":3,"136":4,"145":1,"222":2,"234":1}}],["canonicalizestringlist",{"2":{"180":1}}],["canonical",{"2":{"167":1}}],["cancelled",{"2":{"148":1}}],["candidate",{"2":{"35":2,"223":1}}],["candidates",{"2":{"35":3,"190":1}}],["cannot",{"2":{"14":1,"30":1,"79":1,"97":1,"167":1,"173":1,"213":1}}],["can",{"0":{"215":1},"1":{"216":1,"217":1,"218":1},"2":{"4":1,"5":1,"7":2,"9":3,"12":1,"13":1,"20":3,"24":1,"32":1,"33":4,"35":1,"36":1,"39":2,"41":1,"43":1,"45":1,"51":3,"52":1,"56":2,"59":1,"64":2,"67":2,"71":2,"72":1,"73":3,"76":2,"77":1,"79":7,"82":5,"85":6,"87":2,"90":1,"91":5,"94":6,"97":1,"142":1,"146":1,"152":2,"153":1,"154":1,"157":5,"158":4,"161":2,"162":4,"163":2,"164":1,"167":1,"168":2,"171":2,"173":1,"174":1,"176":1,"177":2,"178":3,"179":2,"180":1,"190":1,"192":1,"198":1,"202":1,"204":1,"206":1,"209":1,"210":1,"211":1,"212":1,"215":1,"216":2,"217":4,"222":1,"224":1,"230":1}}],["circular",{"2":{"171":2}}],["circle",{"2":{"51":1,"64":1,"67":1,"164":1,"165":1}}],["cibw",{"2":{"145":2}}],["cibuildwheel",{"0":{"145":1},"2":{"137":1,"142":1,"145":8,"148":1}}],["ci",{"2":{"3":1,"5":1,"136":1,"142":1,"143":1,"145":1,"147":1,"148":1,"189":2,"193":1,"234":2}}],["coexist",{"2":{"230":1}}],["cover",{"2":{"219":1}}],["copy",{"2":{"217":1,"230":1}}],["co",{"2":{"173":2}}],["core",{"2":{"140":2,"143":1}}],["correspond",{"2":{"207":1}}],["corresponds",{"2":{"54":1}}],["corresponding",{"2":{"52":1,"54":1,"202":1}}],["correctly",{"2":{"214":2}}],["correct",{"2":{"35":2,"51":1,"77":1,"92":1,"193":1,"215":1}}],["coord",{"2":{"128":2}}],["coordinate",{"0":{"128":1},"2":{"13":1,"20":1,"27":2,"30":1,"32":3,"35":1,"36":9,"45":1,"47":1,"56":4,"73":1,"79":4,"81":1,"82":3,"83":2,"85":6,"91":2,"94":5,"117":1,"118":1,"121":1,"125":2,"126":1,"128":1}}],["coordinates=",{"2":{"114":1,"116":1,"118":1,"120":1,"122":1}}],["coordinates",{"2":{"12":1,"20":2,"21":1,"23":1,"27":2,"30":4,"31":1,"32":3,"35":3,"36":3,"38":1,"44":2,"47":6,"62":2,"64":2,"73":4,"78":1,"79":5,"80":1,"81":1,"82":3,"83":1,"85":5,"86":1,"88":1,"91":5,"92":1,"93":1,"94":3,"95":1,"98":1,"114":1,"115":1,"116":1,"117":2,"121":1,"122":1,"126":1}}],["collect",{"2":{"221":1}}],["collection",{"2":{"12":1}}],["collapsed",{"2":{"218":1}}],["collapsing",{"2":{"217":1}}],["columns",{"2":{"179":1,"224":1,"225":1}}],["column",{"2":{"86":1}}],["cols",{"2":{"71":4}}],["col",{"2":{"71":4}}],["costs",{"2":{"47":1}}],["cost",{"2":{"41":1,"158":1}}],["course",{"2":{"167":1,"206":1,"216":2}}],["counter",{"2":{"176":1,"184":1}}],["counting",{"2":{"51":1,"64":1,"67":1}}],["count",{"2":{"35":1,"92":1,"222":1,"223":1}}],["could",{"2":{"20":1,"23":2,"30":1,"35":2,"36":1,"54":1,"58":1,"79":2,"90":1,"91":1,"197":1,"207":1,"214":2,"216":1,"217":2}}],["combination",{"2":{"169":1,"170":1}}],["combinations",{"2":{"36":2,"93":2,"156":1,"162":1}}],["coming",{"2":{"169":1,"170":1}}],["com",{"2":{"134":1,"136":1,"138":1,"150":1,"233":1}}],["comes",{"2":{"153":1,"199":1}}],["come",{"2":{"73":1,"157":1}}],["compensate",{"2":{"216":1}}],["compatible",{"2":{"187":4,"188":4}}],["compatibility",{"0":{"186":1},"1":{"187":1,"188":1},"2":{"188":1}}],["comparing",{"2":{"58":1}}],["computing",{"2":{"158":1,"179":1}}],["computed",{"2":{"155":1,"158":1}}],["compute",{"2":{"148":1}}],["computes",{"2":{"32":1,"84":1,"116":1}}],["complex",{"2":{"156":1}}],["completed",{"2":{"194":1}}],["completely",{"2":{"164":1,"217":1}}],["complete",{"2":{"35":1,"76":1,"90":1}}],["compiling",{"2":{"146":1}}],["compiler",{"0":{"143":1},"2":{"143":1}}],["compiles",{"2":{"140":1}}],["compile",{"2":{"133":1,"140":1}}],["compiled",{"2":{"58":1,"136":1,"141":1,"204":1}}],["component",{"2":{"41":1,"222":2,"223":2}}],["comma",{"2":{"223":1}}],["commands",{"2":{"142":1,"153":1}}],["command",{"0":{"219":1},"1":{"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1},"2":{"131":1,"219":1,"234":1}}],["commandline",{"2":{"3":2}}],["commits",{"0":{"189":1},"2":{"189":1}}],["committed",{"2":{"146":1,"151":1}}],["commit",{"2":{"134":2,"146":1,"148":1,"189":1,"194":1,"232":1}}],["common",{"0":{"220":1},"1":{"221":1},"2":{"19":1,"161":1,"219":1}}],["coded",{"2":{"41":1}}],["codes",{"2":{"27":1,"30":2,"33":2,"35":2,"38":2}}],["code",{"0":{"10":1,"23":1},"1":{"11":1,"12":1,"13":1,"14":1},"2":{"10":1,"23":5,"25":1,"27":2,"29":1,"30":1,"33":1,"34":1,"35":1,"38":1,"49":1,"59":2,"60":2,"72":1,"75":1,"163":1}}],["conditionals",{"2":{"224":1,"225":1}}],["conditional",{"2":{"222":2,"224":2,"225":2}}],["condition",{"2":{"202":2}}],["conditions",{"2":{"51":1,"64":1,"67":1}}],["concepts",{"2":{"158":1}}],["conclusion",{"2":{"148":1}}],["concurrently",{"2":{"9":1}}],["converts",{"2":{"211":1}}],["conversion",{"2":{"12":2,"14":4}}],["conventional",{"0":{"189":1},"2":{"189":1}}],["convenience",{"2":{"47":1}}],["connectivity",{"2":{"178":1}}],["connection",{"2":{"18":1,"215":1}}],["connections",{"2":{"18":1,"215":1}}],["connects",{"2":{"77":2}}],["connect",{"2":{"56":1,"112":1,"228":1}}],["connected",{"2":{"36":1,"38":1,"41":1,"93":1,"174":2,"176":1,"222":1}}],["conjunction",{"2":{"32":1}}],["consumed",{"2":{"222":1}}],["consult",{"2":{"76":1}}],["console",{"2":{"80":2,"83":1,"86":4,"92":2,"95":2,"98":1}}],["constant",{"2":{"56":1}}],["constraints",{"2":{"73":2}}],["constraining",{"2":{"30":1}}],["constructor",{"2":{"76":1}}],["construct",{"2":{"73":1}}],["constructed",{"2":{"41":2,"59":1,"164":1}}],["constructing",{"2":{"12":1}}],["considerations",{"2":{"178":1}}],["consider",{"0":{"217":1},"2":{"157":1,"207":2,"208":1,"214":1,"216":1,"217":1}}],["considered",{"2":{"35":2,"178":2}}],["consisting",{"2":{"88":1}}],["consists",{"2":{"2":1,"49":1,"104":1}}],["context",{"2":{"207":1}}],["content",{"2":{"41":1}}],["contribute",{"2":{"214":1}}],["controlled",{"2":{"85":1}}],["contract",{"0":{"225":1},"2":{"47":2,"76":1,"131":1,"155":1,"225":1}}],["contraction",{"2":{"2":1,"213":1,"222":1,"223":1,"225":1,"228":1}}],["continue",{"2":{"30":1,"41":1,"51":1,"64":1,"67":1,"79":1,"115":2,"162":2,"208":1}}],["contiguous",{"2":{"4":1}}],["containerized",{"2":{"196":1}}],["container",{"2":{"145":2,"196":1}}],["contains",{"2":{"41":1,"56":1,"60":1,"76":1,"89":1,"161":1,"162":1}}],["containing",{"2":{"23":1,"24":1,"33":1,"45":1,"49":1,"52":1,"79":1,"82":1,"83":1,"85":1,"86":1,"91":1,"92":1,"94":1,"95":1,"97":2,"199":1,"222":1}}],["contain",{"2":{"14":1,"33":1,"39":1,"41":1,"86":1,"87":1,"203":1}}],["confirm",{"2":{"194":1}}],["config=",{"2":{"111":1}}],["config",{"2":{"73":1,"97":3,"112":1,"137":2,"140":1}}],["configures",{"2":{"234":1}}],["configure",{"2":{"73":1,"96":1,"234":1}}],["configured",{"2":{"4":1}}],["configurations",{"0":{"5":1},"2":{"5":1,"157":2,"162":1}}],["configuration",{"0":{"2":1,"7":1,"96":1},"1":{"3":1,"4":1,"8":1,"97":1,"98":1},"2":{"2":2,"3":2,"7":1,"16":2,"136":2,"140":1,"156":1,"157":1,"163":1,"171":2,"178":1,"179":1,"232":1}}],["confident",{"2":{"35":1,"92":1}}],["confidence",{"2":{"35":2,"92":2}}],["conform",{"2":{"9":1}}],["confused",{"2":{"3":1}}],["checking",{"2":{"202":1}}],["checks",{"2":{"193":1}}],["checklist",{"0":{"193":1}}],["checked",{"2":{"172":1}}],["checkout",{"2":{"151":1}}],["check",{"2":{"75":1,"150":1,"179":1,"202":4,"209":1}}],["chore",{"2":{"189":1}}],["choose",{"2":{"158":1}}],["choices",{"2":{"178":1,"207":1}}],["choice",{"2":{"52":1,"178":1}}],["chosen",{"2":{"3":1,"35":1,"171":1,"212":1}}],["ch|mld",{"2":{"9":2}}],["chance",{"2":{"207":1,"211":2}}],["changing",{"2":{"10":1,"146":1,"215":1}}],["changes",{"2":{"10":3,"51":1,"64":1,"67":1,"136":1,"140":1,"155":1,"160":1,"188":1,"189":1,"190":1,"207":2,"216":1,"217":3}}],["changed",{"2":{"7":1,"140":1,"188":1,"224":1,"225":1}}],["change",{"0":{"187":1,"188":1,"215":1,"216":2},"1":{"216":1,"217":1,"218":1},"2":{"3":1,"51":7,"52":1,"64":1,"67":1,"173":1,"178":1,"187":1,"206":1,"208":1,"215":3,"216":6,"224":1}}],["chain",{"2":{"6":1}}],["ch",{"2":{"2":1,"3":2,"7":1,"33":2,"77":2,"111":1,"112":2,"144":1,"225":1,"228":2}}],["cuts",{"2":{"223":2}}],["custom",{"2":{"136":1}}],["customize",{"0":{"224":1},"2":{"47":2,"131":1,"224":1,"225":1}}],["current",{"2":{"51":1,"52":1,"72":1,"77":1,"145":1,"160":1}}],["currently",{"2":{"2":1,"36":1,"73":1,"93":1,"157":1,"178":1,"230":2}}],["curl",{"2":{"21":3,"28":1,"31":1,"33":6,"37":2,"40":1}}],["curb",{"2":{"20":1,"79":1,"82":1,"85":1,"94":1,"126":1}}],["cucumber",{"0":{"0":1,"205":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1},"2":{"0":4,"1":1,"2":1,"3":4,"4":1,"6":1,"7":10,"199":1,"203":1,"205":2}}],["w",{"2":{"141":2,"142":4}}],["writing",{"2":{"206":1}}],["written",{"0":{"156":1},"2":{"73":1,"156":1}}],["writefilesync",{"2":{"89":1}}],["write",{"0":{"207":1},"2":{"0":1,"12":3,"13":1,"14":3,"89":1,"173":3,"174":3,"176":1,"201":1,"205":1,"222":1}}],["wrappers",{"2":{"73":1,"130":1}}],["wrapper",{"2":{"73":1}}],["wrapping",{"2":{"73":2}}],["workload",{"2":{"233":1}}],["works",{"2":{"140":1,"168":1,"169":1,"170":1}}],["workflows",{"2":{"147":1}}],["workflow",{"0":{"75":1},"2":{"136":1,"147":2,"148":1,"149":2,"167":1,"191":1,"192":3,"194":1}}],["work",{"2":{"36":1,"73":1,"93":1,"146":1,"178":1}}],["worked",{"2":{"25":1}}],["worldparameters",{"2":{"7":2}}],["wouldn",{"2":{"171":1}}],["would",{"2":{"13":4,"30":1,"54":1,"79":1,"171":1,"173":1,"207":1,"215":1,"216":3,"217":1}}],["warning",{"2":{"220":1}}],["warmed",{"2":{"136":1}}],["waiting",{"2":{"197":1}}],["wait",{"2":{"148":1,"230":2}}],["wanted",{"2":{"72":1}}],["want",{"2":{"13":1,"14":1,"20":2,"73":1,"79":2,"157":1,"158":2,"171":1,"201":1,"202":1}}],["wayhandlers",{"2":{"172":1}}],["waypoints",{"0":{"211":1},"2":{"20":3,"27":3,"29":1,"30":6,"32":1,"35":3,"36":2,"38":2,"43":2,"45":1,"59":2,"71":2,"78":1,"79":7,"80":3,"83":3,"91":3,"93":2,"95":4,"100":1,"102":1,"113":1,"115":3,"121":2,"211":2,"212":1,"216":2,"229":1}}],["waypoint",{"0":{"56":1,"61":1,"108":1},"1":{"57":1,"109":1},"2":{"20":1,"27":1,"30":1,"33":2,"35":4,"38":3,"56":1,"59":2,"61":1,"70":1,"71":2,"79":1,"80":2,"82":1,"83":1,"85":1,"86":6,"92":4,"94":1,"95":4,"108":1,"162":1,"211":1,"212":1}}],["way",{"0":{"171":2,"172":1},"2":{"12":1,"14":1,"35":1,"49":6,"51":1,"54":2,"64":1,"67":1,"90":1,"104":1,"152":2,"156":1,"157":5,"158":4,"161":2,"162":2,"165":1,"171":25,"172":5,"173":6,"174":2,"176":1,"214":6,"215":1,"216":1}}],["ways",{"2":{"10":1,"73":1,"156":1,"157":2,"158":8,"162":1,"171":1,"173":4,"174":1,"207":1,"208":3,"209":1,"211":2,"214":2}}],["waste",{"2":{"20":1,"79":1}}],["was",{"2":{"7":1,"24":1,"27":1,"30":1,"33":1,"35":4,"38":2,"58":1,"92":3,"95":1}}],["whose",{"2":{"224":1,"225":1}}],["whole",{"2":{"7":1,"9":1,"43":1,"47":1,"171":2}}],["why",{"2":{"158":1}}],["whl",{"2":{"142":7}}],["what",{"0":{"215":1},"1":{"216":1,"217":1,"218":1},"2":{"39":1,"72":1,"87":1,"157":3,"158":1,"203":1,"217":1}}],["wheelhouse",{"2":{"145":1}}],["wheel",{"0":{"141":1,"142":1},"2":{"133":1,"136":3,"140":1,"141":4,"142":3,"145":1}}],["wheels",{"2":{"133":1,"142":2,"145":2,"147":1,"148":3,"150":1}}],["whether",{"2":{"41":2,"52":1,"79":1,"82":1,"85":1,"91":1,"94":1,"152":2,"163":2,"178":2,"179":1}}],["where",{"2":{"20":1,"27":1,"72":1,"73":1,"145":1,"157":1,"162":1,"163":1,"164":1,"171":1,"172":1,"181":1,"184":1,"196":1,"216":2}}],["whenever",{"2":{"212":1}}],["when",{"0":{"197":1},"2":{"4":1,"10":2,"32":1,"36":2,"41":1,"59":1,"77":1,"117":1,"133":1,"136":1,"142":1,"151":1,"152":1,"153":1,"155":2,"157":3,"158":2,"160":1,"161":1,"162":1,"169":1,"170":1,"172":2,"174":6,"176":4,"177":1,"178":3,"179":1,"193":1,"196":1,"197":2,"206":1,"207":1,"208":3,"209":1,"216":3,"223":1,"224":1,"225":1}}],["which",{"2":{"13":1,"20":1,"33":1,"35":1,"39":1,"41":1,"49":1,"58":2,"73":1,"76":1,"79":3,"82":3,"83":1,"85":2,"86":1,"87":1,"91":2,"92":1,"94":2,"97":2,"143":1,"157":3,"162":3,"178":3,"211":1,"215":1,"223":1,"224":1,"234":1}}],["while",{"2":{"9":2,"51":1,"64":1,"67":1,"78":1,"234":1}}],["were",{"2":{"209":1}}],["weighting",{"2":{"171":1}}],["weights",{"2":{"39":1,"45":1,"47":1,"87":1,"162":1,"177":1,"224":2,"225":2,"230":1}}],["weight",{"0":{"158":1},"2":{"30":1,"35":1,"36":1,"41":5,"43":4,"44":2,"45":2,"46":1,"47":1,"48":1,"49":2,"50":1,"79":1,"91":1,"94":1,"115":1,"158":5,"162":5,"164":2,"171":4,"173":3,"174":3,"177":3,"179":1,"224":2,"225":2}}],["website",{"2":{"17":1}}],["well",{"2":{"14":1,"171":1,"208":1,"214":1}}],["we",{"2":{"5":1,"7":1,"9":1,"10":1,"12":2,"13":1,"14":3,"41":2,"73":5,"76":1,"152":3,"171":1,"177":1,"181":1,"208":1,"209":1,"214":2,"215":1,"216":5}}],["wish",{"2":{"168":1}}],["wiring",{"2":{"145":1}}],["win",{"2":{"140":1,"142":1,"150":1}}],["windows",{"0":{"138":1,"231":1},"1":{"232":1,"233":1,"234":1},"2":{"133":1,"138":1,"140":2,"141":1,"142":4,"143":2,"144":2,"145":3,"231":1,"232":2,"234":2}}],["wipes",{"2":{"140":1}}],["wiqbgl6maoaeaaaabgaaaaaaaaa7aaaahu6pqhvhj0iaaaaaqbyyqgqaaaagaaaaaaaaadsaaadmaaaaf27mabijiqocbswa",{"2":{"34":2}}],["will",{"2":{"9":7,"14":3,"20":1,"23":3,"27":1,"32":1,"33":1,"35":1,"36":2,"49":2,"51":2,"54":1,"59":1,"64":1,"67":1,"71":2,"79":2,"82":2,"85":2,"86":1,"91":2,"92":1,"94":2,"97":1,"155":1,"157":2,"158":7,"160":1,"162":6,"163":1,"169":1,"170":1,"171":7,"176":1,"178":1,"190":1,"196":1,"197":3,"198":1,"206":1,"208":1,"214":1,"215":3,"216":1,"232":1,"234":1}}],["without",{"2":{"51":3,"52":1,"133":1,"137":1,"141":1,"146":2,"173":1,"184":1,"191":1,"197":1,"217":1,"224":1,"227":1,"230":2}}],["within",{"2":{"13":1,"171":1,"190":1,"192":1}}],["with",{"0":{"154":1},"2":{"1":1,"2":1,"3":3,"6":1,"7":1,"9":5,"10":1,"12":2,"20":2,"21":1,"27":1,"28":1,"31":1,"32":4,"33":1,"37":2,"39":2,"41":2,"45":1,"46":1,"47":1,"49":2,"58":2,"59":1,"73":4,"75":1,"76":1,"77":2,"79":3,"82":2,"85":5,"87":2,"91":3,"94":3,"97":1,"110":1,"111":1,"124":1,"134":1,"145":2,"148":1,"149":1,"150":1,"151":1,"153":2,"154":1,"157":2,"158":3,"165":1,"166":1,"168":1,"169":3,"170":3,"171":1,"174":2,"179":1,"181":1,"182":1,"189":2,"191":2,"192":1,"193":3,"199":1,"202":1,"203":1,"209":2,"214":1,"217":1,"222":2,"224":3,"225":3,"228":1,"230":1,"232":1,"233":2}}],["wiki",{"2":{"0":1,"39":2,"88":2,"205":1}}],["affects",{"2":{"222":1}}],["after",{"0":{"194":1},"2":{"51":2,"54":2,"141":1,"146":1,"150":1,"155":1,"174":1,"202":1}}],["ae",{"2":{"211":2}}],["aims",{"2":{"205":1}}],["aware",{"2":{"178":1}}],["away",{"2":{"35":1}}],["a1",{"2":{"172":1}}],["again",{"2":{"155":1}}],["against",{"2":{"136":1,"142":1,"148":1}}],["aarch64",{"2":{"133":1}}],["ambiguous",{"2":{"214":1}}],["amd64",{"2":{"133":1,"140":1,"142":1,"150":1}}],["amp",{"2":{"36":1}}],["ad",{"2":{"211":2}}],["adjust",{"2":{"158":2,"173":1,"179":1,"216":3}}],["adjustments",{"2":{"157":1}}],["advantage",{"2":{"97":1}}],["adding",{"2":{"214":1,"217":1}}],["addition",{"2":{"27":1,"30":2,"32":1,"33":1,"35":2,"36":1,"38":1,"51":1,"64":1,"67":1,"214":1}}],["additional",{"2":{"3":9,"27":1,"30":1,"35":3,"36":1,"38":1,"45":1,"51":1,"64":1,"67":1,"83":1,"92":2,"95":1,"96":1,"115":1,"162":1,"194":1}}],["additive",{"2":{"20":1}}],["added",{"2":{"43":1,"52":1,"188":1}}],["add",{"0":{"168":1},"2":{"30":1,"35":1,"36":1,"79":1,"91":1,"94":1,"142":3,"146":2,"168":1,"201":1,"203":1}}],["adds",{"2":{"20":1,"79":1,"82":1,"85":1,"91":1,"94":1}}],["addresses",{"2":{"77":1}}],["addressed",{"2":{"71":2}}],["address",{"2":{"7":1,"227":2}}],["auditwheel",{"2":{"142":4}}],["auxiliary",{"2":{"73":1}}],["automatic",{"2":{"182":1}}],["automatically",{"2":{"142":1,"143":1,"190":1,"191":1,"193":1}}],["automated",{"0":{"191":1},"2":{"182":1,"190":1,"193":1,"194":2}}],["auto",{"2":{"59":1,"146":1,"191":1,"193":1,"229":1}}],["availability",{"2":{"207":1}}],["available",{"0":{"153":1},"1":{"154":1},"2":{"49":3,"54":4,"59":1,"96":1,"144":1}}],["avoids",{"2":{"20":1,"154":1}}],["avoid",{"2":{"20":1,"41":1,"79":1,"126":1,"206":1}}],["ahead",{"2":{"41":1}}],["abc",{"2":{"214":4,"216":2}}],["ab",{"2":{"207":4,"208":3,"209":1,"211":2,"214":3}}],["abi3",{"2":{"133":1,"140":1,"142":1}}],["abi",{"2":{"133":1}}],["abstract",{"2":{"158":1}}],["absolute",{"2":{"41":1}}],["absent",{"2":{"33":1,"59":2,"71":1}}],["able",{"2":{"35":1,"90":1}}],["aborting",{"2":{"202":1}}],["above",{"2":{"5":1,"97":1,"141":1,"214":1}}],["about",{"2":{"0":1,"45":1,"47":1,"72":1,"73":2,"173":1,"174":2,"177":1,"203":1}}],["aqapphzbhulfzeme`euvkpncgla",{"2":{"33":1}}],["april",{"2":{"181":1,"185":2}}],["applyaccesstokens",{"2":{"180":1}}],["application",{"2":{"41":1}}],["applicable",{"2":{"35":1,"91":1}}],["applies",{"2":{"19":1,"224":1}}],["applied",{"2":{"9":1,"39":1,"41":1,"87":1,"172":1,"174":2}}],["appropriate",{"2":{"177":1}}],["approximation",{"2":{"36":1,"93":1}}],["approach",{"2":{"20":4}}],["approaches",{"2":{"20":1,"41":1,"79":1,"82":1,"85":1,"94":1,"126":1}}],["api",{"0":{"110":1,"160":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1},"2":{"15":4,"41":1,"51":2,"52":1,"58":1,"59":1,"73":1,"97":1,"157":2,"160":4,"171":1,"187":3,"188":3,"189":1,"226":1}}],["apis",{"2":{"15":1}}],["acquiring",{"2":{"230":1}}],["ac",{"2":{"211":2}}],["across",{"2":{"140":2,"196":1}}],["actions",{"2":{"149":1,"191":1,"192":1,"193":1,"194":1}}],["acts",{"2":{"73":1}}],["actual",{"2":{"39":1,"41":2,"51":1,"64":1,"67":1,"87":1,"158":1,"207":1,"215":2,"216":1}}],["actually",{"2":{"12":1,"14":2,"39":1,"87":1,"207":1,"214":1}}],["accompanying",{"2":{"206":1}}],["accomplished",{"2":{"51":1}}],["accordingly",{"2":{"73":1,"158":1,"173":1}}],["according",{"2":{"30":1,"35":1,"36":1,"43":1,"79":1,"91":1,"201":1}}],["accidentally",{"2":{"41":1,"73":1}}],["accuracy",{"2":{"35":1,"91":1}}],["accepted",{"2":{"220":1}}],["accepting",{"2":{"12":1}}],["accessible",{"2":{"131":1}}],["access",{"0":{"177":1,"198":1},"2":{"13":1,"23":1,"110":1,"161":2,"163":1,"171":2,"173":1,"174":6,"176":3,"177":3,"179":1,"198":1,"230":1}}],["asc",{"2":{"179":1}}],["ascii",{"2":{"179":2,"215":1}}],["associated",{"2":{"172":1,"209":1}}],["assembly",{"2":{"217":1}}],["assemblesteps",{"2":{"217":1}}],["assemble",{"2":{"35":1,"38":1,"92":1,"95":1,"217":1}}],["assert",{"2":{"164":1}}],["assumed",{"2":{"160":1,"162":2,"213":1}}],["assign",{"2":{"158":1,"174":1}}],["ask",{"2":{"73":1,"218":1}}],["asymmetric",{"2":{"33":1,"84":1}}],["as",{"2":{"5":1,"12":1,"13":2,"14":2,"19":1,"23":1,"27":1,"30":2,"32":3,"35":3,"36":4,"39":1,"41":1,"45":1,"49":1,"51":1,"54":1,"56":1,"58":1,"59":1,"61":3,"62":3,"63":3,"64":6,"65":2,"66":1,"67":3,"68":1,"71":3,"72":1,"73":6,"77":1,"79":3,"82":2,"85":6,"91":3,"93":1,"94":2,"97":1,"104":1,"115":1,"121":1,"130":1,"141":1,"142":2,"148":2,"157":2,"158":3,"162":1,"168":3,"171":7,"172":1,"176":1,"178":1,"184":1,"191":1,"196":1,"208":2,"209":1,"211":3,"212":1,"214":1,"218":2,"222":1,"223":2}}],["aspects",{"2":{"0":1}}],["attribute",{"2":{"162":2,"163":1,"171":1,"173":1,"174":1,"176":1}}],["attributes",{"2":{"73":2,"161":1,"163":1,"171":2,"173":1,"174":1}}],["at",{"2":{"4":2,"12":1,"13":1,"20":1,"27":1,"30":2,"35":2,"36":4,"37":2,"39":1,"49":1,"51":3,"52":1,"54":3,"58":1,"64":3,"67":3,"71":2,"72":1,"79":3,"82":1,"85":1,"91":1,"92":1,"94":3,"115":1,"136":2,"138":1,"145":1,"146":1,"148":1,"155":1,"157":4,"160":1,"162":4,"163":1,"168":1,"169":1,"170":1,"171":2,"174":4,"182":1,"184":1,"190":2,"191":1,"200":1,"202":2,"205":1,"206":1,"207":2,"214":1,"215":1,"216":3,"217":2,"232":1,"234":1}}],["art",{"2":{"215":1}}],["artifact",{"2":{"148":1}}],["artifacts",{"2":{"141":1,"148":1}}],["artificial",{"2":{"41":1}}],["args",{"2":{"138":1,"140":1,"141":1,"145":2}}],["args=",{"2":{"136":1,"145":1}}],["arguments",{"0":{"4":1},"2":{"4":1,"5":1,"111":1}}],["argument",{"2":{"3":2,"163":1,"168":1,"169":1,"170":1,"171":1}}],["arm64",{"2":{"133":1}}],["around",{"2":{"73":2,"130":1,"164":1,"216":1}}],["arrow",{"2":{"52":9,"66":8}}],["arriving",{"2":{"171":1}}],["arrival",{"2":{"51":1}}],["arrive|",{"2":{"216":2}}],["arrived",{"2":{"207":1}}],["arrive",{"2":{"51":4,"54":1,"64":1,"67":1,"207":1,"208":4,"209":4}}],["arrays",{"2":{"32":1,"33":3,"86":5,"176":1}}],["array",{"0":{"130":1},"2":{"20":1,"27":2,"30":2,"32":1,"33":5,"35":2,"38":2,"43":1,"45":2,"47":1,"52":1,"54":4,"56":1,"59":3,"62":1,"65":1,"66":1,"71":1,"77":1,"79":11,"80":4,"82":7,"83":2,"85":12,"86":9,"88":2,"91":10,"92":4,"94":9,"95":4,"130":1}}],["arbitrary",{"2":{"12":1}}],["arbitrarily",{"2":{"9":1}}],["area",{"2":{"35":1}}],["areas",{"2":{"10":1,"158":1}}],["are",{"0":{"156":1,"215":1},"1":{"216":1,"217":1,"218":1},"2":{"3":3,"4":2,"5":1,"6":1,"7":2,"18":1,"20":2,"23":3,"27":1,"30":3,"32":4,"33":3,"35":4,"36":3,"38":2,"39":5,"41":1,"47":3,"49":3,"51":1,"52":1,"54":4,"73":4,"79":4,"86":2,"87":3,"88":1,"90":1,"91":1,"93":2,"97":1,"130":1,"133":1,"142":1,"144":1,"147":1,"153":1,"155":2,"156":2,"157":5,"158":3,"160":1,"162":5,"169":2,"171":1,"173":1,"174":6,"176":5,"177":2,"178":1,"180":1,"189":1,"190":1,"191":2,"194":1,"208":1,"212":2,"215":1,"216":1,"220":1,"232":2}}],["alias",{"2":{"97":1}}],["alive",{"2":{"13":1,"18":1,"227":1}}],["almost",{"2":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"71":1}}],["along",{"2":{"30":1,"35":1,"36":1,"45":1,"47":1,"49":3,"104":1,"152":1,"157":1}}],["alter",{"2":{"216":1}}],["alternative",{"2":{"30":3,"35":1,"77":1,"79":3,"92":1,"112":1,"115":1,"171":2,"172":1,"213":1,"229":1}}],["alternatives",{"0":{"213":1},"2":{"30":1,"35":1,"77":2,"79":2,"92":1,"112":1,"115":1,"229":1}}],["alternatives=2",{"2":{"114":1}}],["alternatives=1",{"2":{"111":1}}],["alternatives=n",{"2":{"30":1}}],["alternatives=",{"2":{"30":1}}],["although",{"2":{"9":1}}],["already",{"2":{"9":1}}],["always",{"2":{"3":1,"190":1,"207":2,"208":1,"215":1}}],["allowed",{"2":{"73":1,"162":2,"174":4,"176":2,"209":1,"223":1}}],["allows",{"2":{"35":2,"72":1,"84":1,"91":2,"172":1,"230":1}}],["allow",{"0":{"212":1},"2":{"3":1,"18":1,"79":1,"82":1,"85":1,"91":1,"94":1,"162":1,"212":1}}],["all",{"0":{"5":1,"209":1},"2":{"2":1,"3":3,"4":1,"5":1,"12":2,"13":1,"19":2,"20":1,"23":1,"30":4,"32":3,"33":3,"35":5,"36":3,"38":2,"51":2,"54":1,"59":1,"71":1,"72":1,"73":3,"79":3,"80":2,"85":2,"86":2,"90":1,"91":3,"92":1,"93":2,"94":1,"95":1,"96":1,"113":1,"115":2,"117":4,"119":1,"121":1,"123":1,"137":2,"156":1,"158":2,"161":1,"162":1,"163":1,"168":1,"169":1,"170":2,"171":1,"176":1,"190":1,"193":1,"203":1,"206":2,"207":1,"208":1,"209":1,"211":1,"215":1,"219":1,"220":1,"221":1,"229":1,"230":3}}],["algorithm=",{"2":{"111":1}}],["algorithms",{"2":{"2":1}}],["algorithm",{"2":{"2":1,"3":2,"7":3,"9":2,"35":1,"36":1,"77":2,"90":1,"93":1,"112":2,"223":1,"228":2}}],["also",{"2":{"0":3,"9":1,"41":1,"73":1,"79":1,"91":1,"94":1,"97":1,"131":1,"152":1,"157":3,"158":1,"162":1,"164":1,"171":1,"172":1,"174":2,"178":1,"192":1,"223":1}}],["a",{"0":{"12":1,"141":1,"181":1},"1":{"13":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"2":3,"3":1,"4":1,"5":1,"6":1,"7":1,"9":3,"10":2,"11":1,"12":10,"13":3,"14":2,"18":2,"19":1,"20":5,"23":3,"24":2,"27":3,"28":1,"30":2,"32":2,"33":7,"35":2,"36":2,"39":1,"40":1,"41":8,"43":1,"45":1,"49":14,"51":32,"52":11,"54":9,"56":1,"58":1,"59":2,"64":22,"65":1,"66":6,"67":24,"69":1,"70":1,"71":2,"72":4,"73":14,"75":1,"76":3,"77":2,"79":4,"81":2,"82":2,"85":4,"87":1,"89":2,"90":1,"91":1,"92":1,"93":1,"94":3,"96":1,"97":3,"100":1,"102":1,"104":5,"108":1,"111":1,"113":2,"118":1,"133":2,"136":3,"137":1,"140":2,"141":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":4,"153":1,"155":1,"156":1,"157":7,"158":10,"160":1,"161":2,"162":3,"163":3,"164":10,"167":1,"168":2,"169":1,"170":2,"171":12,"172":1,"173":4,"174":9,"176":6,"177":2,"178":9,"179":1,"180":1,"181":1,"191":4,"192":1,"193":1,"197":1,"199":1,"200":2,"202":5,"203":3,"205":3,"206":2,"207":7,"208":11,"209":10,"211":9,"212":3,"213":1,"214":6,"215":1,"216":15,"217":7,"219":2,"222":3,"223":4,"224":1,"225":1,"226":1,"227":1,"228":2,"229":5,"230":2,"232":1,"234":2}}],["announce",{"2":{"207":1}}],["annotated",{"2":{"148":1}}],["annotation",{"0":{"47":1,"68":1},"1":{"48":1},"2":{"45":2,"46":1,"47":1,"63":3,"68":1}}],["annotations",{"2":{"30":1,"32":1,"35":1,"36":1,"45":1,"47":1,"63":1,"79":1,"85":1,"91":1,"94":1,"115":1,"117":1}}],["annotations=true",{"2":{"46":1}}],["annotations=distance",{"2":{"33":2}}],["annotations=duration",{"2":{"33":1}}],["annotations=durations",{"2":{"32":1}}],["annotations=",{"2":{"30":1,"32":1,"35":1,"36":1,"114":1,"116":1,"120":1,"122":1}}],["another",{"2":{"173":1,"218":1}}],["analyze",{"2":{"142":1}}],["analogous",{"2":{"41":1}}],["angles",{"2":{"215":5,"216":4,"218":1}}],["angle",{"2":{"41":2,"51":2,"54":2,"157":1,"174":3,"209":1,"215":2,"216":2}}],["anymore",{"2":{"177":1,"215":1}}],["any|last",{"2":{"36":1}}],["any|first",{"2":{"36":1}}],["anywhere",{"2":{"13":1}}],["any",{"0":{"169":1},"2":{"9":2,"13":2,"20":4,"36":14,"47":2,"54":1,"79":3,"82":3,"85":3,"91":3,"93":8,"94":7,"123":4,"126":1,"133":1,"136":1,"168":2,"169":7,"173":1,"190":1,"192":1,"197":1,"198":1}}],["android",{"2":{"35":1}}],["and",{"0":{"158":1,"175":1,"176":1,"177":1},"2":{"2":4,"4":1,"6":2,"7":1,"8":1,"9":1,"12":2,"13":1,"14":1,"15":1,"18":1,"20":4,"23":1,"27":2,"30":2,"31":1,"32":3,"33":4,"35":4,"36":4,"38":1,"39":5,"41":1,"45":1,"46":1,"49":2,"51":5,"52":1,"56":1,"64":1,"67":1,"71":1,"72":3,"73":11,"75":1,"76":2,"79":4,"80":1,"81":1,"84":1,"85":1,"86":1,"87":3,"88":2,"91":2,"92":2,"93":2,"94":1,"95":2,"97":2,"113":1,"115":1,"121":1,"123":1,"126":1,"130":2,"133":2,"134":1,"136":1,"138":1,"140":2,"141":1,"142":3,"143":1,"145":2,"146":2,"147":2,"148":3,"150":2,"152":3,"153":2,"155":2,"156":2,"157":7,"158":4,"161":1,"162":5,"163":1,"167":3,"169":1,"170":1,"171":4,"172":1,"173":4,"174":3,"176":2,"177":6,"178":5,"179":5,"185":1,"188":1,"189":1,"190":1,"191":2,"194":1,"197":1,"199":1,"202":2,"203":4,"206":2,"207":5,"208":4,"209":2,"211":6,"213":1,"214":6,"216":5,"217":1,"218":2,"220":3,"222":2,"224":1,"226":1,"230":2,"233":1}}],["an",{"2":{"2":1,"12":2,"13":1,"20":2,"23":2,"30":1,"35":2,"36":1,"38":1,"41":1,"43":1,"45":1,"49":1,"51":6,"52":11,"54":3,"59":1,"64":2,"66":7,"67":2,"73":2,"75":1,"76":2,"77":3,"79":2,"80":2,"82":2,"83":1,"85":3,"86":1,"88":1,"91":2,"92":3,"93":1,"94":2,"95":2,"136":1,"150":1,"154":1,"157":3,"158":1,"163":3,"164":3,"165":1,"166":1,"167":1,"168":1,"171":1,"173":3,"176":2,"179":2,"207":1,"209":1,"217":1,"222":1,"228":1,"230":1}}],["snd",{"2":{"202":1}}],["snapped",{"2":{"28":1,"32":3,"56":3,"79":1,"82":1,"85":4,"91":1,"94":1,"117":1}}],["snapping",{"2":{"20":2,"79":4,"82":4,"85":4,"91":3,"94":4,"126":1,"171":1,"212":1,"222":1}}],["snaps",{"2":{"27":1,"35":1,"79":1,"81":1,"82":1,"85":1,"91":1,"94":1,"120":1}}],["snap",{"2":{"20":1,"23":1,"229":1}}],["switches",{"2":{"167":1}}],["skewed",{"2":{"158":1}}],["skips",{"2":{"141":1}}],["skipped",{"2":{"32":1}}],["skip",{"2":{"20":1,"27":1,"32":1,"59":1,"71":1,"79":1,"228":1,"230":1}}],["sdist",{"2":{"148":1,"150":1}}],["src",{"2":{"146":4}}],["slows",{"2":{"164":1}}],["slow",{"2":{"136":1,"140":1}}],["slip",{"2":{"171":1}}],["slippy",{"2":{"39":2,"87":1,"88":1}}],["slightleft",{"2":{"66":1}}],["slightly",{"2":{"52":2,"58":1,"66":2}}],["slightright",{"2":{"66":1}}],["slight",{"2":{"51":4,"52":4,"66":2,"216":6}}],["symbolic",{"2":{"154":1}}],["symmetric",{"2":{"84":1}}],["system",{"2":{"142":1,"196":1}}],["syntactically",{"2":{"23":1}}],["syntax",{"2":{"19":1}}],["synchronized",{"2":{"11":1}}],["sync",{"2":{"7":1,"39":1,"87":1,"203":1}}],["smallest",{"2":{"214":1}}],["smaller",{"2":{"32":1,"173":1}}],["small",{"0":{"212":1},"2":{"41":2,"51":1,"64":1,"67":1,"203":1,"207":1,"215":1,"222":1,"223":2}}],["s",{"2":{"20":1,"43":1,"69":2,"71":1,"110":1,"130":1,"136":4,"137":1,"138":1,"142":1,"145":1,"152":1,"155":1,"156":1,"158":3,"162":2,"171":2,"227":1,"228":1,"230":2,"234":1}}],["scenic",{"2":{"173":1}}],["scenario",{"2":{"7":1,"9":2,"199":1,"207":1,"208":4,"209":1,"211":2,"214":2}}],["scenarios",{"2":{"2":1,"9":1,"207":1}}],["schedule",{"2":{"192":1}}],["scheduled",{"0":{"148":1},"2":{"191":1}}],["scheme",{"0":{"183":1},"1":{"184":1,"185":1},"2":{"151":1,"181":1,"182":2}}],["scm",{"2":{"151":1}}],["scikit",{"2":{"140":2,"143":1}}],["scripting",{"2":{"156":2,"171":1}}],["scripts",{"2":{"136":1,"140":1,"145":1,"156":1,"220":1}}],["scratch",{"2":{"140":3}}],["scales",{"2":{"32":1,"117":1}}],["scale",{"0":{"207":1},"2":{"32":1,"85":1,"117":1}}],["scope",{"2":{"180":1}}],["scopeguard",{"0":{"13":1},"2":{"13":2}}],["scopedgeojsonloggerguard",{"2":{"12":3,"13":2,"14":7}}],["scoped",{"2":{"12":1}}],["sol2",{"2":{"137":1}}],["solver",{"2":{"85":1}}],["solves",{"2":{"36":1,"93":1,"122":1}}],["sorted",{"2":{"27":1,"83":1}}],["something",{"2":{"171":1}}],["some",{"2":{"20":2,"41":2,"59":1,"79":1,"96":1,"157":1,"158":1,"210":2,"215":2,"217":1}}],["somewhere",{"2":{"10":1}}],["so",{"2":{"12":2,"39":1,"73":1,"87":1,"137":1,"142":1,"144":1,"145":1,"146":1,"148":1,"171":2,"189":1,"202":1,"208":1,"211":1,"218":1,"222":1,"230":1}}],["sourcedata",{"2":{"179":3}}],["source=first",{"2":{"37":1}}],["source=any",{"2":{"36":1}}],["source=",{"2":{"36":1,"122":1}}],["sources=",{"2":{"116":1}}],["sources=0",{"2":{"32":1,"33":2}}],["sources",{"2":{"32":4,"33":2,"34":1,"47":1,"59":1,"71":1,"73":3,"85":1,"86":4,"117":1,"162":1,"223":1}}],["source",{"0":{"176":1},"2":{"8":3,"32":2,"33":2,"36":4,"41":1,"47":1,"51":1,"85":1,"93":2,"94":1,"95":1,"117":1,"123":1,"133":2,"136":2,"157":1,"173":3,"174":15,"176":1,"177":2,"179":7,"234":1}}],["splitting",{"2":{"35":1,"91":1}}],["splits",{"2":{"35":1,"90":1}}],["split",{"2":{"30":1,"35":3,"36":1,"91":2,"92":1,"121":2,"162":2,"173":1,"214":1}}],["span",{"2":{"12":1}}],["spring",{"2":{"9":1,"230":1}}],["speech",{"2":{"172":1}}],["speeds",{"2":{"41":1,"76":1,"158":1,"173":1,"224":1}}],["speed",{"0":{"158":1},"2":{"6":1,"30":1,"32":3,"33":3,"34":1,"35":1,"36":1,"41":5,"46":1,"47":5,"56":1,"79":1,"85":3,"86":2,"91":1,"94":1,"114":1,"115":1,"117":2,"120":1,"143":1,"157":3,"158":6,"161":1,"162":2,"171":8,"174":4,"176":2,"222":1,"224":4,"225":2}}],["specified",{"2":{"54":1}}],["specifies",{"2":{"51":2,"64":2,"67":2}}],["specific",{"0":{"135":1},"1":{"136":1,"137":1,"138":1},"2":{"23":1,"73":2,"75":1,"96":1,"133":1,"140":1,"142":1,"171":1,"178":1,"208":1,"214":1}}],["specifying",{"2":{"52":1,"154":1,"157":1}}],["specify",{"2":{"36":1,"153":1,"208":1,"214":1}}],["special",{"2":{"9":1}}],["six",{"2":{"219":1}}],["signal",{"0":{"197":1},"2":{"168":1,"169":1,"170":1,"197":2}}],["signals",{"2":{"164":1,"165":1}}],["signaling",{"2":{"52":1,"66":1}}],["sign",{"2":{"164":1}}],["significantly",{"2":{"56":1}}],["signifying",{"2":{"49":1,"54":1}}],["similar",{"2":{"51":1,"64":1,"67":1,"178":1}}],["simplified|full|false",{"2":{"35":1,"36":1}}],["simplified",{"2":{"30":2,"35":2,"36":2,"43":3,"79":2,"91":2,"94":2,"115":2}}],["simply",{"2":{"12":2,"156":1,"158":1,"203":1,"207":1}}],["simple",{"2":{"12":1,"171":1}}],["sides",{"2":{"223":1}}],["sidestep",{"2":{"202":1}}],["sidepath=yes",{"2":{"172":1}}],["sidepath",{"2":{"172":4}}],["sidepaths",{"2":{"172":1}}],["sidewalks",{"2":{"172":2}}],["side",{"2":{"49":2,"51":1,"64":3,"67":1,"211":1}}],["sinks",{"2":{"223":1}}],["since",{"2":{"35":2,"207":1,"215":1,"216":1}}],["single",{"0":{"2":1,"12":1},"1":{"3":1,"4":1,"13":1},"2":{"2":1,"7":1,"9":1,"14":1,"27":2,"49":1,"81":1,"104":1,"161":1,"208":1,"223":2}}],["size",{"2":{"23":2,"58":1,"77":1,"207":3,"208":3,"209":1,"216":5,"222":1,"223":2,"229":7}}],["sizes",{"2":{"7":1,"207":1,"223":2}}],["save",{"2":{"222":1,"228":1}}],["sadly",{"2":{"217":1}}],["said",{"2":{"216":1}}],["satisfiying",{"2":{"169":1}}],["san",{"2":{"40":1}}],["salesman",{"2":{"36":1,"93":1,"122":1}}],["safest",{"2":{"152":1}}],["safe",{"2":{"11":1}}],["same",{"0":{"154":1,"187":1},"2":{"5":1,"6":1,"14":1,"39":1,"51":1,"58":1,"61":3,"62":3,"63":3,"64":6,"65":2,"66":1,"67":3,"68":1,"71":1,"77":1,"137":1,"141":1,"154":1,"158":1,"162":2,"168":2,"184":1,"185":1,"190":1,"192":1}}],["say",{"2":{"2":1,"207":1,"214":1}}],["style",{"2":{"189":1}}],["study",{"2":{"217":2}}],["studio",{"2":{"10":1,"143":1,"232":1,"233":1}}],["stuff",{"2":{"215":1}}],["stubgen",{"2":{"146":1}}],["stub",{"2":{"146":2}}],["stubs",{"0":{"146":1}}],["std",{"2":{"73":3}}],["stem",{"2":{"41":1}}],["stepmaneuver",{"0":{"51":1,"67":1,"106":1},"1":{"107":1},"2":{"41":1,"49":2,"51":1,"54":1,"64":2,"67":2}}],["step",{"0":{"64":1},"2":{"30":1,"35":1,"36":1,"49":8,"54":1,"63":2,"64":1,"79":1,"91":1,"94":1,"104":2,"168":1,"209":5,"217":1}}],["steps=true",{"2":{"114":1}}],["steps=false",{"2":{"44":1,"46":1}}],["steps=",{"2":{"30":1,"35":1,"36":1}}],["steps",{"2":{"12":1,"30":2,"35":2,"36":1,"44":2,"45":5,"46":1,"63":1,"77":1,"79":2,"91":2,"94":2,"115":2,"148":1,"194":1,"217":2,"218":1,"228":1,"230":1}}],["stored",{"2":{"167":1}}],["store",{"2":{"77":1,"161":2,"167":2,"179":1}}],["stores",{"2":{"33":2,"86":2,"167":1}}],["storage",{"2":{"73":1,"111":1,"112":1,"163":1,"171":1}}],["stop",{"2":{"37":1,"164":1,"165":1}}],["stops",{"2":{"37":2}}],["stock",{"2":{"3":1}}],["still",{"2":{"20":1,"27":1,"36":1,"43":1,"79":1,"148":1,"160":1,"212":1}}],["stack",{"2":{"232":1}}],["stale",{"2":{"230":1}}],["stable",{"2":{"133":1}}],["stands",{"2":{"64":1}}],["standard",{"2":{"35":2,"91":1,"97":1,"140":1,"198":1}}],["stays",{"2":{"148":1}}],["stay",{"2":{"51":1,"64":1,"67":1}}],["stage",{"2":{"24":1,"167":2}}],["state",{"2":{"193":1}}],["static",{"2":{"140":1,"142":3,"211":1}}],["statically",{"2":{"20":1}}],["status",{"2":{"23":3,"27":1,"30":1,"33":1,"35":1,"38":1,"73":2}}],["starting",{"2":{"37":1,"184":1,"211":2,"223":1}}],["start",{"2":{"36":4,"41":1,"171":3,"173":2,"212":2,"227":1}}],["starts",{"2":{"36":1,"94":1,"140":1}}],["startpoint",{"2":{"20":1,"41":1,"79":1,"82":1,"85":1,"91":1,"94":1,"171":1}}],["started",{"0":{"15":1},"2":{"182":1}}],["stronger",{"2":{"215":1}}],["strongly",{"2":{"41":1,"52":2,"66":2,"222":1}}],["strange",{"2":{"210":1}}],["straight",{"2":{"30":2,"41":1,"50":2,"51":1,"52":3,"53":1,"55":1,"66":2,"79":2,"115":2,"162":2,"173":1,"207":1,"208":3}}],["str",{"2":{"112":4,"115":3,"117":2,"121":1,"123":2,"126":4}}],["strictly",{"2":{"73":1}}],["strings",{"2":{"23":1,"54":1,"79":2,"82":1,"85":1,"91":2,"94":2}}],["string",{"2":{"20":2,"23":2,"41":4,"45":2,"47":1,"49":2,"51":2,"60":2,"62":1,"64":1,"77":6,"79":4,"82":2,"85":2,"91":4,"94":5,"97":3,"162":1,"171":9,"220":1,"222":2}}],["streets",{"2":{"79":1,"82":1,"85":1,"94":1,"158":1,"215":1}}],["street",{"2":{"20":1,"23":1,"27":1,"51":1,"56":1,"64":1,"67":1,"81":1,"118":1,"172":5}}],["stress",{"2":{"3":2}}],["structure",{"0":{"157":1},"2":{"19":1,"73":2}}],["shm",{"0":{"196":1},"2":{"196":1}}],["shell",{"2":{"145":1}}],["sh",{"2":{"136":1}}],["sha",{"2":{"136":2}}],["share",{"2":{"219":1}}],["shared",{"2":{"2":1,"77":5,"111":3,"112":3,"126":1,"142":4,"144":1,"196":2,"228":4,"230":6}}],["sharpleft",{"2":{"66":1}}],["sharpright",{"2":{"66":1}}],["sharp",{"2":{"41":1,"51":4,"52":4,"66":2,"209":1}}],["ships",{"2":{"136":1,"219":1}}],["ship",{"2":{"76":1,"137":1}}],["shot",{"2":{"147":1}}],["shows",{"2":{"150":2}}],["show",{"2":{"142":2,"172":1,"220":2}}],["shown",{"2":{"52":2,"66":2}}],["shorthand",{"2":{"153":1}}],["shortest",{"2":{"32":1,"93":1,"152":1,"158":2}}],["short",{"2":{"11":1,"45":1,"72":1,"216":1,"220":1,"222":1,"227":1,"228":1,"230":1}}],["shortcut",{"2":{"5":1}}],["should",{"2":{"3":2,"6":1,"9":4,"27":1,"35":3,"51":2,"59":4,"64":1,"67":1,"82":1,"158":1,"160":1,"162":1,"189":1,"190":1,"196":1,"201":1,"204":1,"206":2,"207":2,"208":3,"209":1,"216":5,"217":1}}],["separated",{"2":{"223":1}}],["separate",{"0":{"201":1}}],["separately",{"2":{"172":1}}],["send",{"2":{"197":1}}],["sent",{"2":{"97":1}}],["semantic",{"2":{"182":1}}],["semver",{"2":{"181":2}}],["sequences",{"2":{"161":1}}],["sequence",{"2":{"161":2,"162":5}}],["several",{"2":{"76":1,"162":1,"173":1}}],["second",{"2":{"70":2,"85":1,"96":1,"171":1}}],["seconds",{"2":{"7":1,"18":1,"32":1,"33":1,"35":2,"41":2,"43":1,"45":1,"47":1,"49":1,"86":1,"164":1,"227":1,"230":1}}],["sections",{"2":{"219":1}}],["section",{"2":{"24":1,"215":1}}],["segmentation",{"2":{"214":1}}],["segment",{"0":{"173":2},"2":{"23":1,"41":7,"47":3,"49":2,"56":1,"118":1,"157":1,"162":1,"173":12,"179":7,"208":1,"224":2,"225":1}}],["segments",{"2":{"20":1,"27":1,"79":1,"82":2,"85":1,"91":1,"94":1,"119":1,"162":1,"214":1}}],["series",{"2":{"217":1}}],["serialization",{"2":{"58":1}}],["serialized",{"2":{"20":1,"79":1,"97":1}}],["serving",{"2":{"227":1}}],["service",{"0":{"27":1,"30":1,"32":1,"35":1,"36":1,"39":1},"1":{"28":1,"29":1,"31":1,"33":1,"34":1,"37":1,"38":1,"40":1,"41":1},"2":{"16":1,"20":3,"23":4,"27":3,"30":2,"32":1,"33":1,"35":2,"36":2,"38":1,"39":1,"59":3,"73":2,"75":2,"93":1,"113":1,"130":1,"197":1}}],["services",{"0":{"26":1,"113":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1},"2":{"15":2,"19":1,"56":1,"59":1,"73":3,"110":1}}],["serve",{"2":{"230":1}}],["serves",{"2":{"226":1}}],["server",{"0":{"18":1,"227":1},"1":{"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"3":1,"5":1,"16":1,"18":2,"27":1,"203":1,"219":1,"226":1,"230":1,"232":1}}],["searches",{"2":{"30":1}}],["search",{"2":{"20":2,"30":1,"35":1,"79":3,"82":1,"85":1,"91":1,"94":1,"112":1,"115":1,"126":1,"229":1}}],["selecting",{"2":{"211":1}}],["select",{"2":{"192":1}}],["selected",{"2":{"9":1}}],["selects",{"2":{"3":8}}],["setter",{"2":{"171":2}}],["setting",{"2":{"7":1,"76":1,"77":3,"177":1,"214":1}}],["sets",{"2":{"157":1,"161":1,"162":1}}],["setup",{"0":{"162":1},"2":{"157":5,"162":5,"163":1,"171":1,"174":4,"176":2,"177":3,"179":2,"198":1}}],["setuptools",{"2":{"151":1}}],["set",{"2":{"3":1,"8":1,"12":1,"14":1,"24":1,"27":1,"32":1,"36":3,"59":1,"71":1,"73":1,"97":2,"137":1,"140":1,"145":1,"149":1,"158":4,"160":1,"161":2,"162":6,"163":1,"171":8,"173":1,"174":5,"176":2,"177":3,"196":1,"197":1,"198":1,"219":1,"233":1}}],["seems",{"2":{"218":1}}],["seen",{"2":{"178":1}}],["see",{"2":{"0":3,"8":1,"20":2,"27":1,"30":1,"33":1,"35":2,"38":1,"41":1,"43":1,"73":2,"74":1,"133":1,"136":1,"138":1,"140":2,"155":2,"157":1,"171":1,"173":1,"174":2,"175":1,"176":1,"179":1,"201":1,"203":2,"204":1,"208":1,"212":1,"215":2,"216":3,"217":4,"232":1}}],["superfluous",{"2":{"214":1}}],["suppress",{"2":{"209":5}}],["supply",{"2":{"205":1}}],["supplied",{"2":{"20":1,"23":1,"30":1,"32":2,"41":1,"47":3,"54":2,"58":1,"79":1,"83":1,"85":1,"91":1}}],["supported",{"2":{"27":1,"30":2,"32":1,"33":2,"35":2,"36":3,"38":2,"39":1,"77":7,"88":1,"93":2,"160":1,"162":1}}],["support",{"2":{"9":1,"20":1,"96":1,"130":1,"143":1,"179":1,"231":1}}],["supports",{"2":{"2":1,"18":1,"27":1,"58":1,"81":1,"133":1,"152":1,"172":1}}],["supposed",{"2":{"8":1,"215":1}}],["surprises",{"2":{"207":1}}],["sure",{"2":{"4":1,"10":1,"12":1,"73":1,"77":1,"145":1,"209":1}}],["suffixes",{"2":{"162":1}}],["suffix",{"2":{"162":1,"189":1}}],["sum",{"2":{"73":2}}],["summary",{"2":{"45":2}}],["succession",{"2":{"208":1}}],["success",{"2":{"73":2,"148":1}}],["successful",{"2":{"27":1,"30":1,"33":1,"35":1,"38":1,"213":1}}],["successfully",{"2":{"23":1,"35":1,"90":1,"194":1}}],["such",{"2":{"35":1,"49":1,"73":5,"76":1,"104":1,"207":1,"216":2,"217":1}}],["sub",{"2":{"35":2,"38":1,"90":1,"92":1,"95":1,"201":1}}],["subsequent",{"2":{"6":1,"20":1,"49":2,"56":1,"79":1,"82":1,"85":1,"91":1,"94":1,"104":1,"140":1,"234":1}}],["suite",{"2":{"0":1,"144":1,"204":1}}],["omit",{"2":{"214":1}}],["omitted",{"2":{"24":1,"35":1,"49":1,"92":1,"178":1,"207":1}}],["occur",{"2":{"190":1}}],["oidc",{"2":{"148":1}}],["o",{"2":{"146":1,"222":1}}],["older",{"2":{"160":1,"192":1}}],["old",{"2":{"77":1}}],["obviously",{"2":{"215":1,"216":1}}],["obvious",{"2":{"178":3,"208":1}}],["obs",{"2":{"164":2,"170":5}}],["obstacles",{"2":{"167":2,"168":2,"169":2,"170":2,"175":1}}],["obstacle",{"0":{"164":1,"165":1,"166":1,"167":1,"168":2,"169":1,"170":1},"1":{"165":1,"166":1,"168":1,"169":1,"170":1},"2":{"163":2,"164":12,"167":1,"168":9,"169":9,"170":9,"175":1}}],["obtained",{"2":{"56":1}}],["obtain",{"2":{"35":1,"91":1}}],["objects",{"0":{"42":1,"73":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"27":1,"30":2,"33":2,"35":2,"38":2,"43":1,"45":1,"49":1,"54":1,"59":2,"62":1,"65":1,"71":1,"80":4,"83":2,"86":4,"92":4,"95":4}}],["object",{"0":{"43":1,"45":1,"47":1,"49":1,"51":1,"52":1,"54":1,"56":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"71":1,"130":1},"1":{"44":1,"46":1,"48":1,"50":1,"53":1,"55":1,"57":1},"2":{"13":1,"23":1,"24":1,"27":1,"30":1,"35":4,"38":1,"41":1,"45":1,"49":1,"51":2,"56":1,"59":4,"61":1,"62":1,"63":1,"64":3,"65":1,"66":1,"67":3,"68":1,"70":1,"71":2,"75":1,"76":1,"77":4,"79":2,"80":1,"82":2,"83":2,"85":2,"86":1,"91":2,"92":4,"94":2,"95":2,"96":1,"97":8,"108":1,"113":2,"130":1,"164":1}}],["ok",{"2":{"23":2,"25":1,"27":1,"29":1,"30":1,"33":1,"34":1,"35":1,"38":1,"73":1}}],["overall",{"2":{"148":1}}],["overlay",{"2":{"136":1}}],["overhead",{"2":{"72":1}}],["over",{"2":{"56":1,"97":1,"171":1,"173":1,"206":1,"216":1,"224":1,"225":1}}],["overview",{"2":{"30":3,"31":1,"35":3,"36":3,"43":2,"79":4,"91":3,"94":3,"115":2}}],["overview=",{"2":{"30":1,"35":1,"36":1,"114":1}}],["overview=false",{"2":{"21":2,"31":1}}],["override",{"2":{"7":1,"145":1,"149":1,"192":1,"224":2,"225":2}}],["optimisation",{"2":{"143":1}}],["optimizing",{"2":{"223":2}}],["optimization",{"2":{"85":1}}],["optimized",{"2":{"58":1,"230":1}}],["option",{"2":{"20":4,"27":2,"30":1,"32":1,"35":1,"36":1,"77":1,"97":1,"153":1,"162":1}}],["optionally",{"2":{"49":3,"84":1,"192":1}}],["optional",{"2":{"20":2,"23":1,"24":1,"33":1,"51":2,"73":1,"77":1,"79":8,"82":2,"85":1,"86":1,"91":7,"94":8,"149":1,"157":1,"169":1,"170":1,"220":1,"221":2,"228":1,"230":1}}],["option=value",{"2":{"20":3}}],["options",{"0":{"19":1,"220":1},"1":{"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"221":1},"2":{"20":2,"23":1,"27":2,"30":2,"32":4,"35":2,"36":2,"77":19,"79":19,"81":1,"82":10,"83":2,"85":14,"86":2,"91":15,"92":2,"94":15,"95":2,"97":4,"98":2,"219":1,"222":1,"223":1,"224":1,"225":1,"226":1,"228":1,"230":2}}],["openstreetmap",{"2":{"24":1,"27":1,"39":1,"88":1,"156":2,"157":1,"171":1,"173":1}}],["operator",{"2":{"12":1,"202":1}}],["opposite",{"2":{"20":1,"79":1,"82":1,"85":1,"94":1}}],["own",{"2":{"12":1,"73":2,"136":1,"162":1}}],["osmnode",{"2":{"168":1}}],["osmosis",{"2":{"24":1,"222":1}}],["osm",{"2":{"24":1,"47":1,"73":2,"76":1,"131":1,"153":1,"154":4,"155":1,"157":3,"161":1,"163":1,"167":2,"168":1,"169":1,"170":1,"171":1,"172":1,"173":4,"177":1,"203":1,"215":1,"219":1,"222":6}}],["os",{"2":{"8":1,"9":2}}],["osrm>",{"2":{"223":1,"224":1,"225":1,"226":1,"230":1}}],["osrmref",{"2":{"136":1}}],["osrm",{"0":{"2":1,"5":1,"18":1,"76":1,"111":1,"152":1,"181":1,"222":1,"223":1,"224":1,"225":1,"226":1,"230":1,"231":1},"1":{"3":1,"4":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"112":1,"113":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"227":1,"228":1,"229":1,"232":1,"233":1,"234":1},"2":{"0":1,"2":3,"3":2,"6":1,"7":8,"8":3,"9":2,"10":1,"15":1,"19":1,"20":2,"21":3,"24":1,"28":1,"31":1,"33":6,"37":2,"40":1,"41":2,"47":4,"58":2,"59":2,"72":3,"73":4,"74":1,"75":2,"76":21,"77":8,"80":4,"83":4,"86":4,"89":4,"92":4,"95":4,"98":4,"101":1,"103":1,"105":1,"107":1,"109":1,"110":3,"111":13,"112":2,"114":1,"116":1,"118":1,"120":1,"122":1,"124":1,"128":1,"129":1,"130":1,"131":13,"133":4,"134":3,"136":1,"137":1,"138":1,"140":2,"144":2,"146":10,"148":1,"150":3,"152":1,"153":3,"154":2,"157":1,"158":1,"179":1,"187":2,"188":2,"196":1,"197":2,"198":1,"199":1,"205":1,"207":1,"208":1,"210":1,"211":1,"214":1,"219":1,"221":8,"222":3,"223":1,"224":1,"225":3,"226":2,"228":1,"230":3,"231":1}}],["others",{"2":{"158":1}}],["otherwise",{"2":{"23":1,"27":1,"30":1,"33":1,"35":1,"38":1,"136":1}}],["other",{"0":{"8":1},"2":{"9":2,"20":1,"23":1,"30":1,"32":1,"33":1,"35":1,"38":1,"47":3,"59":1,"71":1,"73":5,"79":1,"149":1,"157":1,"158":3,"162":1,"171":2,"174":2,"176":1,"192":1,"206":1,"207":1,"216":1,"217":1}}],["outgoing",{"2":{"174":1,"176":2}}],["outside",{"2":{"97":1,"136":1}}],["outlier",{"2":{"35":1,"92":1}}],["outliers",{"2":{"35":1,"90":1}}],["outputting",{"0":{"12":1},"1":{"13":1},"2":{"12":1}}],["output",{"2":{"10":1,"12":2,"14":2,"36":3,"79":1,"82":1,"152":1,"154":4,"162":1,"163":1,"171":1,"198":1,"222":2}}],["out",{"2":{"7":1,"12":1,"50":2,"54":1,"55":1,"73":2,"153":1,"189":1,"192":1}}],["our",{"2":{"0":1,"3":1,"11":1,"12":2,"205":1}}],["ordinates",{"2":{"173":2}}],["ordered",{"2":{"30":1,"80":2}}],["order",{"2":{"20":1,"30":2,"33":4,"35":1,"38":1,"78":1,"79":1,"80":2,"86":6,"92":1,"95":1,"171":1,"176":1,"211":1,"213":1}}],["original",{"2":{"24":1,"177":1}}],["organize",{"2":{"189":1}}],["org",{"2":{"21":3,"28":1,"31":1,"33":6,"37":2,"39":1,"40":1,"41":1,"88":1,"150":1}}],["or",{"2":{"3":1,"7":2,"9":2,"12":1,"20":7,"23":1,"24":1,"30":2,"32":9,"35":3,"36":6,"41":1,"47":3,"49":5,"51":2,"59":1,"62":1,"64":3,"67":2,"73":5,"77":2,"78":1,"79":8,"82":7,"85":9,"90":1,"91":7,"93":1,"94":9,"97":1,"104":1,"111":1,"112":1,"114":1,"117":1,"121":1,"123":2,"126":2,"133":1,"136":2,"142":1,"149":1,"152":2,"153":2,"158":3,"161":1,"162":2,"164":5,"169":1,"170":1,"171":3,"172":2,"173":1,"179":1,"187":1,"188":1,"193":1,"202":1,"203":2,"211":1,"214":1,"228":1,"230":1}}],["once",{"2":{"76":1,"157":1,"162":2,"164":1,"168":1}}],["onramp",{"2":{"64":1,"67":1}}],["onto",{"2":{"51":1,"54":1,"64":1,"67":1,"172":1}}],["only",{"2":{"3":2,"9":1,"14":2,"27":2,"36":1,"41":1,"51":1,"59":2,"70":1,"79":1,"81":1,"82":1,"85":1,"91":1,"93":1,"94":1,"136":1,"140":1,"142":1,"161":1,"162":1,"163":1,"164":5,"167":2,"168":1,"169":1,"170":1,"171":3,"172":1,"178":1,"202":1,"206":1,"208":1,"229":1,"230":2}}],["oneway",{"2":{"209":1,"211":2,"214":2}}],["ones",{"2":{"4":1,"30":1,"33":1,"35":1,"38":1,"153":1}}],["one",{"2":{"3":4,"20":2,"23":3,"36":1,"47":1,"52":1,"62":1,"64":1,"147":1,"164":1,"171":1,"172":1,"211":1,"221":1,"230":1}}],["on",{"0":{"176":2,"213":1},"2":{"0":1,"3":2,"5":1,"20":1,"21":2,"24":1,"30":2,"31":1,"33":1,"35":4,"36":1,"41":3,"43":2,"45":2,"49":1,"51":10,"52":2,"54":1,"56":2,"64":4,"67":4,"69":1,"72":1,"73":2,"75":1,"76":1,"77":2,"79":3,"82":1,"85":2,"91":2,"94":1,"108":1,"133":1,"136":1,"142":1,"143":2,"145":1,"148":2,"151":1,"157":1,"158":6,"162":3,"163":1,"164":1,"168":2,"171":6,"173":4,"174":12,"176":12,"177":2,"178":2,"179":1,"182":1,"190":1,"191":2,"192":1,"197":1,"200":1,"203":2,"205":2,"207":1,"211":1,"213":1,"217":1,"218":1,"227":2,"231":1}}],["often",{"2":{"206":1}}],["offsets",{"0":{"212":1}}],["offset",{"2":{"182":1,"184":1,"212":1,"216":2}}],["offramp",{"2":{"64":1,"67":1}}],["off",{"2":{"51":2,"178":1,"228":2}}],["offer",{"2":{"10":1,"51":2,"64":1,"67":1}}],["offers",{"2":{"3":1,"12":1,"156":1,"211":1}}],["ofp",{"2":{"21":1}}],["of",{"0":{"157":1},"2":{"0":1,"2":1,"4":1,"7":1,"10":3,"11":1,"12":9,"13":3,"14":3,"20":9,"21":1,"23":4,"27":3,"28":1,"30":3,"32":5,"33":6,"35":11,"36":5,"38":5,"41":7,"43":5,"45":5,"47":10,"49":12,"51":22,"52":1,"54":13,"56":3,"59":3,"62":1,"64":9,"65":1,"66":1,"67":10,"70":1,"71":5,"72":2,"73":3,"77":1,"79":5,"80":4,"82":3,"83":2,"85":4,"86":10,"88":1,"91":5,"92":9,"93":1,"94":3,"95":6,"97":2,"104":2,"112":1,"115":2,"117":2,"118":1,"119":2,"121":1,"126":1,"136":1,"148":1,"149":1,"152":1,"153":1,"157":4,"158":7,"160":1,"161":4,"162":8,"163":1,"164":1,"167":1,"169":1,"170":2,"171":12,"172":6,"173":10,"174":14,"176":9,"177":1,"178":2,"179":3,"182":1,"187":1,"190":1,"191":1,"192":1,"196":1,"202":1,"206":1,"207":3,"208":3,"209":1,"210":1,"211":2,"212":2,"213":2,"215":2,"216":8,"217":5,"218":1,"219":1,"220":2,"223":4,"225":1,"228":1,"229":6}}],["tcp",{"2":{"227":1}}],["twice",{"2":{"203":1}}],["two",{"2":{"14":1,"32":1,"41":1,"45":2,"73":2,"78":1,"85":1,"102":1,"114":1,"173":1,"223":1}}],["tmp",{"2":{"145":1}}],["txt",{"2":{"137":1,"140":1,"201":1}}],["tbb12",{"2":{"142":2}}],["tbb",{"2":{"136":1,"137":1,"142":1}}],["tuple",{"2":{"126":2}}],["tuning",{"2":{"72":1}}],["turning",{"2":{"164":3,"165":2,"176":1}}],["turns",{"2":{"41":3,"47":1,"51":1,"162":1,"208":4,"209":2,"215":1,"216":2,"217":2}}],["turn",{"0":{"174":2,"177":2,"214":1},"1":{"175":2,"176":2,"177":2},"2":{"13":1,"41":8,"45":2,"47":1,"49":1,"50":1,"51":23,"52":9,"54":6,"64":12,"66":8,"67":14,"104":1,"157":3,"162":5,"163":1,"164":1,"167":2,"168":1,"169":8,"170":10,"171":4,"172":2,"174":23,"176":5,"177":24,"208":1,"214":10,"215":4,"216":8,"217":3,"218":1,"222":1,"224":4,"225":3}}],["tsp",{"2":{"36":1,"93":1}}],["typed",{"2":{"73":1}}],["typescript",{"2":{"58":1}}],["types",{"0":{"127":1},"1":{"128":1,"129":1,"130":1},"2":{"23":1,"41":1,"51":1,"52":1,"72":1,"73":2,"76":1,"130":1,"157":1,"158":1,"162":2,"167":1,"169":2,"170":2,"189":1}}],["type",{"0":{"146":1,"165":1,"169":1,"170":1},"2":{"23":1,"30":1,"33":1,"35":1,"38":1,"41":5,"44":1,"50":1,"51":7,"64":1,"67":3,"73":6,"117":1,"152":1,"162":2,"163":1,"164":7,"167":1,"168":2,"169":8,"170":10,"171":1,"173":1,"174":4,"176":2,"178":1,"202":1,"214":3}}],["typically",{"2":{"20":1,"157":1,"158":1,"171":1}}],["t",{"0":{"213":1,"216":1},"2":{"20":1,"51":1,"64":1,"67":1,"73":3,"79":1,"158":1,"171":1,"173":1,"220":1,"225":1}}],["tiny",{"2":{"212":1}}],["title",{"2":{"189":1}}],["titles",{"2":{"189":1}}],["tip",{"2":{"142":1}}],["ticket",{"2":{"35":1}}],["tidy",{"2":{"35":1,"91":1,"121":1}}],["tileparameters",{"0":{"125":1},"2":{"124":1}}],["tilenames",{"2":{"39":1,"88":1}}],["tiles",{"2":{"39":3,"41":3,"87":3,"124":1}}],["tile",{"0":{"39":1,"87":1,"124":1},"1":{"40":1,"41":1,"88":1,"89":1,"125":1},"2":{"20":1,"39":4,"40":3,"87":1,"88":2,"89":3,"97":1,"124":1,"125":3}}],["times",{"2":{"158":1}}],["timestamps=",{"2":{"120":1}}],["timestamps",{"2":{"35":4,"90":1,"91":1,"92":1,"121":2}}],["timestamp",{"2":{"24":2,"35":5,"91":3,"222":2,"224":2,"225":2}}],["time",{"2":{"33":1,"35":1,"41":1,"43":1,"45":1,"49":1,"86":2,"133":1,"138":1,"140":1,"145":1,"146":1,"155":1,"158":1,"162":2,"190":1,"224":2,"225":2}}],["timeout",{"2":{"7":7,"227":2}}],["timing",{"2":{"7":1}}],["try",{"2":{"215":1,"216":1}}],["tree",{"2":{"211":1}}],["treated",{"2":{"51":1,"64":1,"67":1,"222":1,"223":1}}],["treat",{"2":{"30":1,"35":1,"79":1,"91":1,"115":1,"121":1}}],["treats",{"2":{"30":1,"35":1}}],["trusted",{"2":{"148":1}}],["true|false",{"2":{"30":2,"35":2,"36":3}}],["true|false|number",{"2":{"30":1}}],["true",{"2":{"20":3,"27":1,"30":4,"32":1,"35":4,"36":7,"45":3,"50":7,"51":2,"54":3,"55":3,"59":2,"64":1,"71":1,"77":3,"79":3,"82":2,"85":2,"91":2,"93":4,"94":3,"112":1,"123":1,"126":1,"162":2,"169":2,"171":1}}],["trial",{"2":{"227":1}}],["tries",{"2":{"215":1}}],["tried",{"2":{"23":1}}],["trimlanestring",{"2":{"180":1}}],["trigger",{"0":{"192":1},"2":{"149":1,"192":1}}],["triplet=x64",{"2":{"136":1,"140":1,"145":1}}],["triplet",{"2":{"136":1,"142":1,"145":1}}],["tripparameters",{"0":{"123":1},"2":{"122":1}}],["trip=3",{"2":{"111":1}}],["trips",{"2":{"38":4,"95":5}}],["trip",{"0":{"36":1,"93":1,"122":1},"1":{"37":1,"38":1,"94":1,"95":1,"123":1},"2":{"20":1,"36":8,"37":4,"38":2,"59":1,"77":2,"93":2,"94":1,"95":3,"97":1,"112":2,"122":1,"126":1,"229":2}}],["traditional",{"2":{"182":1}}],["trailing",{"2":{"174":1}}],["traversing",{"2":{"171":1}}],["traverse",{"2":{"41":2,"51":1,"64":1,"67":1}}],["traveled",{"2":{"43":1,"45":1}}],["traveling",{"2":{"36":1,"93":1,"122":1,"152":1}}],["travel",{"2":{"33":2,"43":1,"45":1,"49":4,"51":4,"54":2,"64":1,"67":1,"86":2,"104":1,"158":1,"171":3,"174":4,"176":2}}],["traffic",{"2":{"41":1,"46":2,"48":2,"51":1,"64":1,"67":1,"163":2,"164":3,"165":2,"168":1,"169":1,"170":1,"174":3,"198":1,"224":1,"225":1,"227":1,"230":2}}],["tracks",{"2":{"35":1,"91":1}}],["track",{"2":{"35":2,"91":2}}],["tracker",{"2":{"17":1}}],["tracepoint",{"2":{"35":2}}],["tracepoints",{"2":{"35":1,"92":3}}],["trace",{"2":{"35":5,"38":1,"90":1,"92":6,"95":1}}],["traces",{"2":{"35":1,"90":1,"120":1}}],["translated",{"2":{"215":1}}],["transport",{"2":{"152":1}}],["transportation",{"2":{"20":1,"49":1}}],["transcription",{"2":{"49":1}}],["transitions",{"2":{"35":1,"90":1}}],["transfer",{"2":{"20":1,"58":1,"79":1}}],["tasks",{"2":{"161":1}}],["targetdata",{"2":{"179":2}}],["target",{"0":{"176":1},"2":{"51":1,"136":1,"140":1,"145":2,"173":2,"174":16,"176":1,"177":2,"179":2,"193":1}}],["take",{"2":{"51":6,"64":4,"67":4,"72":1,"73":1,"113":1}}],["taken",{"2":{"45":1,"51":1,"64":1,"67":1}}],["takes",{"2":{"41":4,"51":1,"64":1,"67":1,"73":2,"133":1,"136":1,"234":1}}],["table=3",{"2":{"111":1}}],["tableparameters",{"0":{"117":1},"2":{"73":4,"116":1}}],["tables",{"2":{"32":1,"84":1,"85":1,"209":1}}],["table",{"0":{"32":1,"71":1,"84":1,"116":1},"1":{"33":1,"34":1,"85":1,"86":1,"117":1},"2":{"20":1,"32":3,"33":6,"59":5,"71":1,"73":3,"77":2,"84":2,"85":4,"86":1,"112":2,"116":1,"126":1,"157":4,"161":2,"162":1,"163":1,"170":2,"171":3,"214":1,"229":2}}],["tag",{"2":{"9":5,"140":1,"142":1,"147":2,"148":3,"150":1,"151":2,"156":2,"171":1,"172":3,"174":4,"176":2,"184":1,"185":4,"191":1,"193":1,"194":1,"209":1,"222":1}}],["tagged",{"2":{"9":2,"142":1,"174":2,"176":1}}],["tags",{"0":{"9":1},"2":{"4":1,"9":3,"161":5,"172":2,"173":3,"177":2,"181":1,"184":1,"185":1,"203":1}}],["tl",{"0":{"1":1}}],["top",{"2":{"157":1,"160":1}}],["toml",{"2":{"145":2,"151":1}}],["tostring",{"2":{"98":1}}],["toll",{"2":{"55":1,"171":1}}],["tool",{"2":{"145":2,"219":1,"220":2}}],["tools",{"0":{"219":1},"1":{"220":1,"221":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1},"2":{"131":1,"142":1,"146":1,"219":2,"222":1,"234":1}}],["toolchain",{"2":{"76":1,"77":1,"111":1,"136":2,"137":1,"138":1,"140":1,"145":4}}],["too",{"2":{"45":1}}],["toobig",{"2":{"23":1}}],["total",{"2":{"41":1,"171":1}}],["torstraße",{"2":{"34":2}}],["towards",{"2":{"20":1,"79":1,"82":1,"85":1,"91":1,"94":1}}],["todo",{"2":{"3":2}}],["to",{"0":{"11":1,"169":1,"170":1,"175":1,"207":1},"2":{"0":1,"2":1,"3":3,"4":1,"5":1,"6":1,"7":3,"8":1,"9":4,"10":4,"11":2,"12":7,"13":3,"14":3,"18":1,"19":1,"20":13,"23":2,"27":4,"30":6,"32":4,"33":3,"35":13,"36":9,"38":3,"39":1,"41":15,"43":1,"47":4,"49":4,"51":19,"52":1,"54":9,"56":5,"58":3,"59":1,"64":5,"66":1,"67":5,"71":1,"72":3,"73":6,"76":1,"77":13,"79":15,"81":1,"82":9,"83":2,"85":11,"86":2,"87":1,"89":1,"90":3,"91":9,"92":2,"93":3,"94":7,"95":2,"96":1,"97":4,"104":1,"108":1,"110":1,"111":2,"112":3,"115":3,"119":1,"120":1,"121":1,"123":1,"126":1,"133":1,"136":1,"138":1,"140":2,"142":3,"143":1,"144":1,"145":1,"146":2,"147":1,"148":2,"151":1,"152":1,"154":2,"155":3,"156":2,"157":6,"158":10,"160":1,"161":1,"162":3,"163":3,"167":2,"168":3,"169":6,"170":6,"171":10,"172":2,"173":3,"174":5,"175":1,"176":1,"177":4,"178":3,"179":6,"191":1,"192":3,"194":2,"197":3,"198":1,"201":4,"202":2,"203":4,"204":1,"205":2,"206":2,"207":6,"208":7,"209":6,"210":1,"211":1,"212":1,"214":11,"215":3,"216":5,"217":5,"219":1,"220":1,"221":1,"222":5,"223":1,"224":5,"225":3,"227":3,"228":3,"230":3}}],["termination",{"2":{"223":1}}],["tertiary",{"2":{"209":2}}],["text",{"2":{"172":1}}],["tempted",{"2":{"216":1}}],["tempting",{"2":{"206":1}}],["temporary",{"2":{"140":1,"164":1,"196":1}}],["template",{"2":{"14":2}}],["te",{"2":{"21":1}}],["testcases",{"2":{"210":1}}],["testbot",{"2":{"207":1,"208":3,"211":2}}],["testing",{"2":{"9":1,"16":2,"199":1,"212":1,"216":1}}],["testpath",{"2":{"7":1}}],["testsuite",{"0":{"199":1},"1":{"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1},"2":{"199":1,"205":1}}],["tests",{"0":{"144":1,"200":1,"204":1,"207":1,"215":1},"1":{"201":1,"202":1,"203":1,"204":1,"216":1,"217":1,"218":1},"2":{"0":1,"1":1,"3":3,"5":1,"9":1,"199":1,"201":3,"203":3,"204":4,"205":1,"207":2,"215":4,"216":1}}],["test",{"0":{"201":1,"202":1,"203":1,"206":1,"209":1,"216":1},"2":{"0":1,"1":1,"2":1,"5":1,"6":2,"7":6,"9":4,"144":7,"189":1,"200":1,"201":2,"202":4,"203":4,"205":1,"206":1,"212":1,"216":4,"217":3}}],["technical",{"2":{"0":1}}],["thought",{"2":{"158":1}}],["though",{"2":{"51":1,"158":1,"216":1}}],["those",{"2":{"9":1,"58":1,"209":1}}],["th",{"2":{"33":4,"86":4}}],["things",{"2":{"157":1}}],["thing",{"2":{"27":1}}],["think",{"2":{"13":1,"41":2,"203":1}}],["this",{"2":{"0":1,"5":1,"6":1,"7":1,"11":1,"12":2,"13":1,"20":2,"24":1,"27":1,"30":1,"32":3,"33":1,"35":5,"36":1,"38":1,"39":1,"40":1,"41":11,"45":1,"49":2,"56":1,"72":1,"73":9,"76":1,"77":4,"79":2,"82":1,"85":2,"87":1,"91":1,"92":2,"94":1,"97":1,"133":1,"136":2,"140":1,"152":1,"154":1,"155":1,"156":1,"157":2,"158":3,"160":1,"161":1,"162":2,"163":1,"164":3,"167":1,"168":2,"169":2,"170":3,"171":11,"172":1,"173":2,"174":6,"176":1,"178":1,"179":1,"189":1,"192":1,"196":1,"197":1,"198":1,"202":1,"203":3,"205":1,"207":1,"214":1,"215":2,"216":3,"225":1,"230":1}}],["throws",{"2":{"202":1}}],["throw",{"2":{"80":1,"89":1,"92":1,"95":1,"98":1}}],["through",{"2":{"12":1,"15":1,"43":1,"51":1,"72":1,"100":1,"110":1}}],["threshold",{"2":{"223":2}}],["three",{"2":{"21":1,"28":1,"31":1,"37":1,"44":1,"150":1,"178":1}}],["threads",{"2":{"220":2}}],["thread",{"2":{"11":1}}],["thus",{"2":{"9":3,"152":1}}],["that",{"2":{"3":8,"7":2,"9":2,"12":1,"13":1,"18":1,"20":1,"27":3,"30":1,"32":1,"33":2,"35":4,"36":1,"38":1,"39":2,"41":7,"49":1,"51":2,"54":4,"56":1,"64":1,"67":1,"71":1,"72":2,"73":5,"79":1,"82":1,"86":2,"87":2,"92":3,"93":1,"95":1,"96":1,"97":2,"136":3,"142":1,"145":1,"148":1,"151":1,"155":2,"156":1,"157":1,"158":4,"160":1,"161":1,"162":4,"163":1,"164":2,"167":1,"169":1,"170":1,"171":2,"174":2,"176":2,"177":1,"180":1,"202":1,"205":1,"207":1,"208":2,"214":3,"215":3,"216":2,"219":1,"230":1}}],["than",{"2":{"3":1,"18":1,"36":1,"41":1,"77":1,"82":1,"93":1,"149":1,"158":1,"202":1,"215":1,"224":1,"225":1}}],["their",{"2":{"142":1,"202":1,"203":1,"215":1}}],["them",{"2":{"73":2,"142":2,"148":1,"161":1,"167":1,"201":1,"214":2,"228":1}}],["these",{"2":{"14":1,"35":1,"73":2,"92":1,"142":1,"153":1,"158":1,"172":1,"175":1,"210":1,"220":1}}],["then",{"2":{"13":1,"32":1,"138":1,"140":1,"148":1,"157":3,"169":2,"170":1,"177":2,"179":2,"203":1,"204":1,"214":1,"215":1,"220":1,"227":1}}],["therefore",{"2":{"133":1}}],["there",{"2":{"4":1,"30":1,"49":2,"51":2,"64":1,"67":1,"73":1,"158":3,"169":2,"180":1,"202":1,"203":1,"217":1,"231":1}}],["they",{"2":{"3":1,"35":1,"39":1,"51":1,"87":1,"90":1,"130":1,"133":1,"156":1,"161":1,"178":1,"189":1,"201":1,"222":1}}],["the",{"0":{"154":1,"176":2,"206":1,"216":2},"2":{"0":3,"1":1,"2":3,"3":8,"4":2,"5":3,"6":4,"7":11,"8":1,"9":12,"10":4,"12":13,"13":5,"14":4,"18":1,"19":1,"20":23,"21":1,"23":10,"24":4,"27":10,"30":11,"32":16,"33":13,"35":35,"36":26,"37":2,"38":10,"39":6,"41":29,"43":15,"45":11,"47":18,"49":34,"51":69,"52":8,"54":40,"56":13,"58":3,"59":3,"61":2,"62":2,"63":2,"64":33,"65":2,"66":3,"67":33,"68":1,"71":4,"72":5,"73":15,"74":2,"75":4,"76":5,"77":10,"78":2,"79":16,"81":3,"82":12,"83":3,"84":1,"85":24,"86":8,"87":4,"89":1,"90":5,"91":10,"92":13,"93":6,"94":12,"95":6,"97":10,"104":1,"110":2,"111":3,"112":1,"114":1,"118":1,"120":1,"122":2,"131":1,"133":3,"134":1,"136":10,"137":3,"138":1,"140":7,"141":6,"142":2,"143":4,"144":5,"145":8,"146":4,"147":5,"148":10,"149":4,"150":4,"151":3,"152":3,"153":4,"154":3,"155":3,"156":3,"157":19,"158":25,"160":3,"161":3,"162":18,"163":5,"164":4,"165":1,"166":1,"167":5,"168":3,"169":6,"170":6,"171":23,"172":10,"173":9,"174":38,"176":29,"177":9,"178":7,"179":5,"180":1,"182":1,"184":1,"185":1,"189":3,"190":5,"191":2,"192":2,"193":3,"194":3,"196":4,"197":3,"198":1,"199":1,"201":3,"202":2,"203":3,"204":2,"205":1,"206":2,"207":10,"208":12,"209":4,"210":1,"211":10,"212":3,"213":2,"214":17,"215":13,"216":18,"217":7,"218":2,"219":1,"220":3,"221":1,"222":9,"223":5,"225":1,"226":2,"228":1,"230":4,"232":3,"233":1,"234":2}}],["d",{"2":{"176":1,"207":2,"208":6,"209":8,"211":4,"214":2,"216":3,"222":1}}],["dll",{"2":{"142":6}}],["dlls",{"2":{"142":1}}],["dylibs",{"2":{"142":1}}],["dvcpkg",{"2":{"136":1,"140":1,"145":1}}],["dcmake",{"2":{"136":1,"140":1,"145":1}}],["dump",{"2":{"222":1}}],["due",{"2":{"158":1}}],["duplicates",{"2":{"121":1}}],["durationisvalid",{"2":{"180":1}}],["duration|distance|duration",{"2":{"32":1}}],["durations",{"2":{"32":2,"33":2,"34":1,"45":1,"71":4,"86":4,"212":1,"230":1}}],["duration",{"2":{"30":1,"32":5,"33":6,"35":1,"36":1,"41":3,"43":1,"44":4,"45":1,"46":2,"47":4,"48":1,"49":1,"50":1,"79":1,"84":1,"85":5,"91":1,"94":1,"114":1,"115":1,"116":2,"117":3,"122":1,"130":1,"158":1,"162":1,"164":2,"169":2,"170":6,"171":2,"173":3,"174":3,"177":1,"179":1,"212":1}}],["during",{"2":{"13":1,"43":1,"162":1,"174":4,"176":2,"177":2,"210":1,"222":1,"223":1}}],["date",{"2":{"182":1,"203":1}}],["datum",{"2":{"179":2}}],["datasource",{"2":{"41":1,"46":1,"47":2,"48":1,"221":1}}],["datasources",{"2":{"30":1,"35":1,"36":1,"46":1,"47":1,"48":1,"79":1,"91":1,"94":1,"115":1}}],["datasets",{"2":{"187":1,"188":1,"230":2}}],["dataset",{"2":{"23":1,"76":3,"77":6,"111":1,"112":4,"203":6,"222":1,"226":1,"227":1,"228":4,"230":6}}],["datastructures",{"2":{"12":1}}],["datastore|directly|mmap",{"2":{"9":2}}],["datastore",{"0":{"230":1},"2":{"2":1,"3":2,"7":2,"9":3,"77":5,"111":1,"112":2,"131":1,"144":2,"228":1,"230":1}}],["data",{"0":{"24":1,"179":1,"228":1},"2":{"2":2,"3":3,"7":1,"12":4,"14":4,"20":2,"24":2,"25":1,"39":1,"41":2,"47":2,"49":2,"56":1,"58":1,"76":2,"79":1,"87":1,"111":2,"124":1,"131":6,"144":5,"154":3,"155":2,"156":1,"157":3,"162":2,"173":4,"179":6,"203":3,"209":4,"218":1,"219":2,"222":4,"224":1,"228":2}}],["dart",{"2":{"58":1}}],["doubt",{"2":{"218":1}}],["double",{"2":{"20":1,"32":2,"35":1,"79":1,"82":1,"85":1,"91":1,"94":1,"176":1}}],["downtime",{"2":{"197":1}}],["downtown",{"2":{"40":1}}],["download",{"2":{"148":1}}],["downloads",{"2":{"147":1}}],["down",{"2":{"73":1,"164":1}}],["dont",{"2":{"202":1}}],["don",{"0":{"213":1,"216":1},"2":{"20":1,"73":3,"79":1,"173":1,"225":1}}],["done",{"2":{"7":1,"157":1,"160":1,"221":1}}],["doesn",{"2":{"158":1}}],["does",{"2":{"20":1,"36":1,"47":2,"51":1,"64":1,"67":1,"73":1,"79":1,"93":1,"140":1,"143":1,"174":2,"176":1,"177":1,"208":1,"217":1}}],["do",{"2":{"10":1,"12":1,"13":1,"20":1,"72":1,"79":2,"152":1,"157":1,"162":1,"170":2,"202":2,"221":1}}],["docker",{"2":{"145":2,"196":1}}],["docs",{"2":{"0":1,"189":1,"200":1}}],["documentation",{"0":{"16":1},"2":{"0":1,"43":1,"72":1,"76":1,"101":1,"103":1,"105":1,"107":1,"109":1,"146":1,"205":1}}],["denable",{"2":{"234":1}}],["denote",{"2":{"54":1}}],["demo",{"2":{"203":1}}],["december",{"2":{"182":1}}],["decide",{"2":{"178":1}}],["decision",{"2":{"178":1}}],["decisions",{"2":{"13":2,"215":1}}],["deciseconds",{"2":{"174":1}}],["decimal",{"2":{"47":1,"79":1,"82":1,"85":1,"91":1,"94":1,"162":1}}],["deliveries",{"2":{"171":1}}],["delay",{"2":{"163":2,"164":1}}],["delvewheel",{"2":{"142":5}}],["delocate",{"2":{"142":4}}],["delete",{"2":{"140":1}}],["dedicated",{"2":{"52":2,"66":2}}],["deploy",{"2":{"221":1}}],["deployment",{"2":{"220":1}}],["deprecated",{"2":{"51":2,"77":1,"97":1,"112":1,"189":1}}],["departure",{"2":{"51":2,"64":1,"67":1}}],["depart",{"2":{"51":4,"54":1,"64":1,"67":1,"207":2,"208":4,"209":4,"216":2}}],["dependency",{"2":{"234":1}}],["dependencies",{"0":{"232":1},"2":{"134":1,"137":1,"138":1,"142":4,"232":1}}],["dependent",{"2":{"23":2,"27":1,"30":1,"33":1,"35":1,"38":1,"203":1,"222":3}}],["depending",{"2":{"41":2,"43":2,"49":1,"51":2,"64":1,"67":1,"157":1}}],["depends",{"2":{"30":1,"45":2,"51":1,"79":1,"211":1,"213":1}}],["detect",{"2":{"140":1}}],["determining",{"2":{"76":1,"161":1,"162":1}}],["determines",{"2":{"162":4}}],["determine",{"2":{"35":1,"157":1,"163":1}}],["determined",{"2":{"20":2}}],["detailed",{"2":{"60":1}}],["details",{"2":{"35":1,"45":1,"76":1}}],["dev",{"2":{"134":2}}],["deviation",{"2":{"35":1,"91":1}}],["development",{"0":{"132":1,"134":1,"140":1},"1":{"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1},"2":{"15":1,"16":1,"143":1,"190":1,"232":1,"233":1}}],["developing",{"0":{"10":1},"1":{"11":1,"12":1,"13":1,"14":1},"2":{"16":1}}],["developer",{"2":{"3":1}}],["der",{"2":{"34":2}}],["derived",{"2":{"222":1}}],["derive",{"2":{"20":1,"73":1}}],["degrees",{"2":{"20":1,"41":1,"79":2,"82":2,"85":2,"91":2,"94":2,"126":1,"174":3,"216":1}}],["desktop",{"2":{"233":1}}],["deserialization",{"2":{"58":1}}],["destination=last",{"2":{"37":1}}],["destination=any",{"2":{"36":1}}],["destination=",{"2":{"36":1,"122":1}}],["destination",{"2":{"32":2,"33":2,"36":5,"51":2,"64":1,"67":1,"85":1,"93":2,"94":1,"95":1,"117":1,"123":1,"161":2}}],["destinations=",{"2":{"116":1}}],["destinations=2",{"2":{"33":1}}],["destinations=5",{"2":{"32":1}}],["destinations",{"2":{"32":4,"33":2,"34":1,"49":3,"71":4,"73":3,"85":1,"86":4,"117":1,"171":2}}],["descending",{"2":{"30":1,"80":2}}],["descriptors",{"2":{"58":2}}],["description",{"2":{"4":1,"20":2,"23":1,"27":1,"30":2,"32":1,"33":1,"35":2,"36":1,"38":1,"41":2,"43":1,"51":3,"52":1,"59":1,"64":1,"66":1,"67":1,"72":1,"163":1,"171":1,"220":1,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":1,"230":1}}],["describing",{"2":{"33":2,"45":1,"51":1,"54":1,"86":2}}],["described",{"2":{"39":1,"58":1,"97":1,"219":1}}],["describe",{"2":{"11":1,"54":1,"56":1,"108":1}}],["describes",{"2":{"0":1,"51":4,"64":4,"67":4,"152":1}}],["desired",{"2":{"14":1}}],["debug",{"2":{"11":1,"12":4,"13":1,"14":5,"41":1,"217":1,"220":1}}],["debugging",{"0":{"10":1,"11":1},"1":{"11":1,"12":1,"13":1,"14":1},"2":{"12":1,"14":1,"217":1,"222":1}}],["dealing",{"2":{"7":1}}],["definitions",{"2":{"209":5}}],["definition",{"2":{"174":2,"176":1}}],["defines",{"2":{"161":2}}],["define",{"2":{"156":1,"157":5,"202":1}}],["defined",{"2":{"3":1,"77":1,"157":2,"160":1,"171":2,"174":8,"176":4,"180":1,"214":1}}],["defaults",{"2":{"7":2,"20":1,"143":1,"169":1,"170":1,"192":1}}],["default",{"2":{"6":1,"7":2,"12":1,"20":10,"27":1,"30":9,"32":4,"35":8,"36":8,"47":2,"58":1,"76":1,"77":12,"79":13,"82":6,"85":9,"91":10,"94":12,"97":2,"111":1,"112":4,"115":5,"117":4,"119":1,"121":2,"123":3,"126":4,"140":1,"145":1,"162":6,"174":6,"176":3,"220":2,"222":1,"223":1,"224":1,"225":1,"227":1,"228":1,"229":3,"230":1}}],["difficulty",{"2":{"215":1}}],["differences",{"2":{"71":1,"157":1}}],["difference",{"2":{"71":1,"178":1,"202":1}}],["different",{"2":{"14":1,"58":1,"61":2,"62":1,"63":2,"64":3,"65":1,"67":1,"152":1,"154":1,"157":1,"158":4,"167":1,"168":1,"173":4,"216":1}}],["differ",{"2":{"41":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"140":1}}],["dict",{"2":{"113":1,"130":1}}],["dispatched",{"2":{"148":1}}],["dispatch",{"2":{"148":1}}],["display",{"2":{"91":1}}],["displayed",{"2":{"30":1,"35":1,"36":1,"43":1,"79":1}}],["distinction",{"2":{"216":1}}],["distribution",{"2":{"142":1}}],["dist",{"2":{"141":3,"142":11,"148":1}}],["distances",{"2":{"32":5,"33":2,"34":1,"45":1,"71":1,"86":4,"212":1}}],["distance",{"2":{"27":1,"29":3,"30":1,"32":5,"33":3,"35":1,"36":1,"43":2,"44":3,"45":2,"46":2,"47":3,"48":1,"49":3,"50":1,"56":2,"57":1,"77":2,"79":1,"83":3,"84":1,"85":5,"91":1,"94":1,"104":1,"111":1,"112":1,"115":1,"116":2,"117":1,"130":1,"158":1,"173":1,"176":1}}],["discovered",{"2":{"211":1}}],["discovery",{"2":{"211":1,"213":2}}],["discover",{"2":{"178":1,"209":1}}],["discouraged",{"2":{"7":1}}],["discards",{"2":{"140":1}}],["disabling",{"2":{"79":1,"91":1,"94":1}}],["disables",{"2":{"77":1}}],["disable",{"0":{"198":1},"2":{"77":1,"198":1,"222":2,"228":1,"230":1}}],["disabled",{"2":{"23":1,"217":1,"224":2,"225":2}}],["disableddataset",{"2":{"23":1}}],["disk",{"2":{"77":2,"97":1,"222":1}}],["died",{"2":{"7":1}}],["dir=",{"2":{"145":1}}],["dir",{"0":{"196":1},"2":{"7":1,"143":1,"196":1}}],["directions",{"0":{"209":1},"2":{"164":1,"171":3,"209":1}}],["direction",{"0":{"166":1},"2":{"20":2,"41":1,"51":16,"54":3,"64":9,"67":9,"79":2,"82":2,"85":2,"91":1,"94":2,"157":1,"164":5,"168":1,"171":3,"215":1}}],["directory",{"2":{"6":1,"7":4,"12":1,"58":1,"72":1,"140":4,"141":1,"153":1,"196":3,"201":1}}],["directly",{"2":{"2":1,"3":2,"39":1,"87":1,"161":1}}],["dijkstra",{"2":{"2":1,"223":1,"228":1}}],["drive",{"2":{"162":1}}],["drives",{"2":{"147":1}}],["driven",{"2":{"147":1,"199":1}}],["driving",{"2":{"21":3,"28":1,"31":1,"33":6,"37":2,"49":2,"50":1,"51":1,"54":1,"64":3,"67":1,"162":1,"174":1}}],["dr",{"0":{"1":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/docs/v26.5.0/assets/chunks/VPLocalSearchBox.DGlmokQH.js b/docs/v26.5.0/assets/chunks/VPLocalSearchBox.DGlmokQH.js new file mode 100644 index 0000000..74a475c --- /dev/null +++ b/docs/v26.5.0/assets/chunks/VPLocalSearchBox.DGlmokQH.js @@ -0,0 +1,9 @@ +var Ot=Object.defineProperty;var At=(a,e,t)=>e in a?Ot(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>At(a,typeof e!="symbol"?e+"":e,t);import{V as Ct,q as Be,ah as Mt,h as be,ai as nt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as rt,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as xe,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as _e,B as it,F as at,a as pe,t as me,av as Xt,aw as ot,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.C2NLiVii.js";import{u as an,c as on}from"./theme.CRHW4GoY.js";const ln={root:()=>Ct(()=>import("./@localSearchIndexroot.D9qikBrG.js"),[])};/*! +* tabbable 6.4.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var gt=["input:not([inert]):not([inert] *)","select:not([inert]):not([inert] *)","textarea:not([inert]):not([inert] *)","a[href]:not([inert]):not([inert] *)","button:not([inert]):not([inert] *)","[tabindex]:not(slot):not([inert]):not([inert] *)","audio[controls]:not([inert]):not([inert] *)","video[controls]:not([inert]):not([inert] *)",'[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)',"details>summary:first-of-type:not([inert]):not([inert] *)","details:not([inert]):not([inert] *)"],ke=gt.join(","),bt=typeof Element>"u",ae=bt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!bt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function(e,t){var n;t===void 0&&(t=!0);var r=e==null||(n=e.getAttribute)===null||n===void 0?void 0:n.call(e,"inert"),i=r===""||r==="true",s=i||t&&e&&(typeof e.closest=="function"?e.closest("[inert]"):Fe(e.parentNode));return s},cn=function(e){var t,n=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return n===""||n==="true"},yt=function(e,t,n){if(Fe(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ae.call(e,ke)&&r.unshift(e),r=r.filter(n),r},Re=function(e,t,n){for(var r=[],i=Array.from(e);i.length;){var s=i.shift();if(!Fe(s,!1))if(s.tagName==="SLOT"){var o=s.assignedElements(),l=o.length?o:s.children,c=Re(l,!0,n);n.flatten?r.push.apply(r,c):r.push({scopeParent:s,candidates:c})}else{var h=ae.call(s,ke);h&&n.filter(s)&&(t||!e.includes(s))&&r.push(s);var m=s.shadowRoot||typeof n.getShadowRoot=="function"&&n.getShadowRoot(s),p=!Fe(m,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(s));if(m&&p){var b=Re(m===!0?s.children:m.children,!0,n);n.flatten?r.push.apply(r,b):r.push({scopeParent:s,candidates:b})}else i.unshift.apply(i,s.children)}}return r},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||cn(e))&&!wt(e)?0:e.tabIndex},un=function(e,t){var n=ie(e);return n<0&&t&&!wt(e)?0:n},dn=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},St=function(e){return e.tagName==="INPUT"},fn=function(e){return St(e)&&e.type==="hidden"},hn=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(n){return n.tagName==="SUMMARY"});return t},vn=function(e,t){for(var n=0;nsummary:first-of-type"),o=s?e.parentElement:e;if(ae.call(o,"details:not([open]) *"))return!0;if(!n||n==="full"||n==="full-native"||n==="legacy-full"){if(typeof r=="function"){for(var l=e;e;){var c=e.parentElement,h=Ne(e);if(c&&!c.shadowRoot&&r(c)===!0)return lt(e);e.assignedSlot?e=e.assignedSlot:!c&&h!==e.ownerDocument?e=h.host:e=c}e=l}if(bn(e))return!e.getClientRects().length;if(n!=="legacy-full")return!0}else if(n==="non-zero-area")return lt(e);return!1},wn=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var n=0;n=0)},xt=function(e){var t=[],n=[];return e.forEach(function(r,i){var s=!!r.scopeParent,o=s?r.scopeParent:r,l=un(o,s),c=s?xt(r.candidates):o;l===0?s?t.push.apply(t,c):t.push(o):n.push({documentOrder:i,tabIndex:l,item:r,isScope:s,content:c})}),n.sort(dn).reduce(function(r,i){return i.isScope?r.push.apply(r,i.content):r.push(i.content),r},[]).concat(t)},xn=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Sn}):n=yt(e,t.includeContainer,We.bind(null,t)),xt(n)},_n=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):n=yt(e,t.includeContainer,Oe.bind(null,t)),n},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,ke)===!1?!1:We(t,e)},Tn=gt.concat("iframe:not([inert]):not([inert] *)").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Tn)===!1?!1:Oe(t,e)};/*! +* focus-trap 7.8.0 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function Ke(a,e){(e==null||e>a.length)&&(e=a.length);for(var t=0,n=Array(e);t=a.length?{done:!0}:{done:!1,value:a[n++]}},e:function(l){throw l},f:r}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i,s=!0,o=!1;return{s:function(){t=t.call(a)},n:function(){var l=t.next();return s=l.done,l},e:function(l){o=!0,i=l},f:function(){try{s||t.return==null||t.return()}finally{if(o)throw i}}}}function In(a,e,t){return(e=On(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function kn(a){if(typeof Symbol<"u"&&a[Symbol.iterator]!=null||a["@@iterator"]!=null)return Array.from(a)}function Nn(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ut(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(a,r).enumerable})),t.push.apply(t,n)}return t}function dt(a){for(var e=1;e0?e[e.length-1]:null},activateTrap:function(e,t){var n=U.getActiveTrap(e);t!==n&&U.pauseTrap(e);var r=e.indexOf(t);r===-1||e.splice(r,1),e.push(t)},deactivateTrap:function(e,t){var n=e.indexOf(t);n!==-1&&e.splice(n,1),U.unpauseTrap(e)},pauseTrap:function(e){var t=U.getActiveTrap(e);t==null||t._setPausedState(!0)},unpauseTrap:function(e){var t=U.getActiveTrap(e);t&&!t._isManuallyPaused()&&t._setPausedState(!1)}},An=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Cn=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Mn=function(e){return ye(e)&&!e.shiftKey},Ln=function(e){return ye(e)&&e.shiftKey},ft=function(e){return setTimeout(e,0)},ge=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&arguments[1]!==void 0?arguments[1]:{},g=f.hasFallback,E=g===void 0?!1:g,_=f.params,I=_===void 0?[]:_,S=i[u];if(typeof S=="function"&&(S=S.apply(void 0,Fn(I))),S===!0&&(S=void 0),!S){if(S===void 0||S===!1)return S;throw new Error("`".concat(u,"` was specified but was not a node, or did not return a node"))}var v=S;if(typeof S=="string"){try{v=n.querySelector(S)}catch(d){throw new Error("`".concat(u,'` appears to be an invalid selector; error="').concat(d.message,'"'))}if(!v&&!E)throw new Error("`".concat(u,"` as selector refers to no known node"))}return v},m=function(){var u=h("initialFocus",{hasFallback:!0});if(u===!1)return!1;if(u===void 0||u&&!De(u,i.tabbableOptions))if(c(n.activeElement)>=0)u=n.activeElement;else{var f=s.tabbableGroups[0],g=f&&f.firstTabbableNode;u=g||h("fallbackFocus")}else u===null&&(u=h("fallbackFocus"));if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},p=function(){if(s.containerGroups=s.containers.map(function(u){var f=xn(u,i.tabbableOptions),g=_n(u,i.tabbableOptions),E=f.length>0?f[0]:void 0,_=f.length>0?f[f.length-1]:void 0,I=g.find(function(d){return oe(d)}),S=g.slice().reverse().find(function(d){return oe(d)}),v=!!f.find(function(d){return ie(d)>0});return{container:u,tabbableNodes:f,focusableNodes:g,posTabIndexesFound:v,firstTabbableNode:E,lastTabbableNode:_,firstDomTabbableNode:I,lastDomTabbableNode:S,nextTabbableNode:function(x){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,A=f.indexOf(x);return A<0?R?g.slice(g.indexOf(x)+1).find(function(C){return oe(C)}):g.slice(0,g.indexOf(x)).reverse().find(function(C){return oe(C)}):f[A+(R?1:-1)]}}}),s.tabbableGroups=s.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),s.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(s.containerGroups.find(function(u){return u.posTabIndexesFound})&&s.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(u){var f=u.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?b(f.shadowRoot):f},w=function(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){w(m());return}u.focus({preventScroll:!!i.preventScroll}),s.mostRecentlyFocusedNode=u,An(u)&&u.select()}},k=function(u){var f=h("setReturnFocus",{params:[u]});return f||(f===!1?!1:u)},y=function(u){var f=u.target,g=u.event,E=u.isBackward,_=E===void 0?!1:E;f=f||Te(g),p();var I=null;if(s.tabbableGroups.length>0){var S=c(f,g),v=S>=0?s.containerGroups[S]:void 0;if(S<0)_?I=s.tabbableGroups[s.tabbableGroups.length-1].lastTabbableNode:I=s.tabbableGroups[0].firstTabbableNode;else if(_){var d=s.tabbableGroups.findIndex(function(F){var V=F.firstTabbableNode;return f===V});if(d<0&&(v.container===f||De(f,i.tabbableOptions)&&!oe(f,i.tabbableOptions)&&!v.nextTabbableNode(f,!1))&&(d=S),d>=0){var x=d===0?s.tabbableGroups.length-1:d-1,R=s.tabbableGroups[x];I=ie(f)>=0?R.lastTabbableNode:R.lastDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f,!1))}else{var A=s.tabbableGroups.findIndex(function(F){var V=F.lastTabbableNode;return f===V});if(A<0&&(v.container===f||De(f,i.tabbableOptions)&&!oe(f,i.tabbableOptions)&&!v.nextTabbableNode(f))&&(A=S),A>=0){var C=A===s.tabbableGroups.length-1?0:A+1,D=s.tabbableGroups[C];I=ie(f)>=0?D.firstTabbableNode:D.firstDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f))}}else I=h("fallbackFocus");return I},O=function(u){var f=Te(u);if(!(c(f,u)>=0)){if(ge(i.clickOutsideDeactivates,u)){o.deactivate({returnFocus:i.returnFocusOnDeactivate});return}ge(i.allowOutsideClick,u)||u.preventDefault()}},L=function(u){var f=Te(u),g=c(f,u)>=0;if(g||f instanceof Document)g&&(s.mostRecentlyFocusedNode=f);else{u.stopImmediatePropagation();var E,_=!0;if(s.mostRecentlyFocusedNode)if(ie(s.mostRecentlyFocusedNode)>0){var I=c(s.mostRecentlyFocusedNode),S=s.containerGroups[I].tabbableNodes;if(S.length>0){var v=S.findIndex(function(d){return d===s.mostRecentlyFocusedNode});v>=0&&(i.isKeyForward(s.recentNavEvent)?v+1=0&&(E=S[v-1],_=!1))}}else s.containerGroups.some(function(d){return d.tabbableNodes.some(function(x){return ie(x)>0})})||(_=!1);else _=!1;_&&(E=y({target:s.mostRecentlyFocusedNode,isBackward:i.isKeyBackward(s.recentNavEvent)})),w(E||s.mostRecentlyFocusedNode||m())}s.recentNavEvent=void 0},K=function(u){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;s.recentNavEvent=u;var g=y({event:u,isBackward:f});g&&(ye(u)&&u.preventDefault(),w(g))},H=function(u){(i.isKeyForward(u)||i.isKeyBackward(u))&&K(u,i.isKeyBackward(u))},W=function(u){Cn(u)&&ge(i.escapeDeactivates,u)!==!1&&(u.preventDefault(),o.deactivate())},j=function(u){var f=Te(u);c(f,u)>=0||ge(i.clickOutsideDeactivates,u)||ge(i.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},$=function(){if(s.active)return U.activateTrap(r,o),s.delayInitialFocusTimer=i.delayInitialFocus?ft(function(){w(m())}):w(m()),n.addEventListener("focusin",L,!0),n.addEventListener("mousedown",O,{capture:!0,passive:!1}),n.addEventListener("touchstart",O,{capture:!0,passive:!1}),n.addEventListener("click",j,{capture:!0,passive:!1}),n.addEventListener("keydown",H,{capture:!0,passive:!1}),n.addEventListener("keydown",W),o},Ce=function(u){s.active&&!s.paused&&o._setSubtreeIsolation(!1),s.adjacentElements.clear(),s.alreadySilent.clear();var f=new Set,g=new Set,E=ct(u),_;try{for(E.s();!(_=E.n()).done;){var I=_.value;f.add(I);for(var S=typeof ShadowRoot<"u"&&I.getRootNode()instanceof ShadowRoot,v=I;v;){f.add(v);var d=v.parentElement,x=[];d?x=d.children:!d&&S&&(x=v.getRootNode().children,d=v.getRootNode().host,S=typeof ShadowRoot<"u"&&d.getRootNode()instanceof ShadowRoot);var R=ct(x),A;try{for(R.s();!(A=R.n()).done;){var C=A.value;g.add(C)}}catch(D){R.e(D)}finally{R.f()}v=d}}}catch(D){E.e(D)}finally{E.f()}f.forEach(function(D){g.delete(D)}),s.adjacentElements=g},M=function(){if(s.active)return n.removeEventListener("focusin",L,!0),n.removeEventListener("mousedown",O,!0),n.removeEventListener("touchstart",O,!0),n.removeEventListener("click",j,!0),n.removeEventListener("keydown",H,!0),n.removeEventListener("keydown",W),o},Z=function(u){var f=u.some(function(g){var E=Array.from(g.removedNodes);return E.some(function(_){return _===s.mostRecentlyFocusedNode})});f&&w(m())},X=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Z):void 0,ee=function(){X&&(X.disconnect(),s.active&&!s.paused&&s.containers.map(function(u){X.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return s.active},get paused(){return s.paused},activate:function(u){if(s.active)return this;var f=l(u,"onActivate"),g=l(u,"onPostActivate"),E=l(u,"checkCanFocusTrap"),_=U.getActiveTrap(r),I=!1;if(_&&!_.paused){var S;(S=_._setSubtreeIsolation)===null||S===void 0||S.call(_,!1),I=!0}try{E||p(),s.active=!0,s.paused=!1,s.nodeFocusedBeforeActivation=b(n),f==null||f();var v=function(){E&&p(),$(),ee(),i.isolateSubtrees&&o._setSubtreeIsolation(!0),g==null||g()};if(E)return E(s.containers.concat()).then(v,v),this;v()}catch(x){if(_===U.getActiveTrap(r)&&I){var d;(d=_._setSubtreeIsolation)===null||d===void 0||d.call(_,!0)}throw x}return this},deactivate:function(u){if(!s.active)return this;var f=dt({onDeactivate:i.onDeactivate,onPostDeactivate:i.onPostDeactivate,checkCanReturnFocus:i.checkCanReturnFocus},u);clearTimeout(s.delayInitialFocusTimer),s.delayInitialFocusTimer=void 0,s.paused||o._setSubtreeIsolation(!1),s.alreadySilent.clear(),M(),s.active=!1,s.paused=!1,ee(),U.deactivateTrap(r,o);var g=l(f,"onDeactivate"),E=l(f,"onPostDeactivate"),_=l(f,"checkCanReturnFocus"),I=l(f,"returnFocus","returnFocusOnDeactivate");g==null||g();var S=function(){ft(function(){I&&w(k(s.nodeFocusedBeforeActivation)),E==null||E()})};return I&&_?(_(k(s.nodeFocusedBeforeActivation)).then(S,S),this):(S(),this)},pause:function(u){return s.active?(s.manuallyPaused=!0,this._setPausedState(!0,u)):this},unpause:function(u){return s.active?(s.manuallyPaused=!1,r[r.length-1]!==this?this:this._setPausedState(!1,u)):this},updateContainerElements:function(u){var f=[].concat(u).filter(Boolean);return s.containers=f.map(function(g){return typeof g=="string"?n.querySelector(g):g}),i.isolateSubtrees&&Ce(s.containers),s.active&&(p(),i.isolateSubtrees&&!s.paused&&o._setSubtreeIsolation(!0)),ee(),this}},Object.defineProperties(o,{_isManuallyPaused:{value:function(){return s.manuallyPaused}},_setPausedState:{value:function(u,f){if(s.paused===u)return this;if(s.paused=u,u){var g=l(f,"onPause"),E=l(f,"onPostPause");g==null||g(),M(),ee(),o._setSubtreeIsolation(!1),E==null||E()}else{var _=l(f,"onUnpause"),I=l(f,"onPostUnpause");_==null||_(),o._setSubtreeIsolation(!0),p(),$(),ee(),I==null||I()}return this}},_setSubtreeIsolation:{value:function(u){i.isolateSubtrees&&s.adjacentElements.forEach(function(f){var g;u?i.isolateSubtrees==="aria-hidden"?((f.ariaHidden==="true"||((g=f.getAttribute("aria-hidden"))===null||g===void 0?void 0:g.toLowerCase())==="true")&&s.alreadySilent.add(f),f.setAttribute("aria-hidden","true")):((f.inert||f.hasAttribute("inert"))&&s.alreadySilent.add(f),f.setAttribute("inert",!0)):s.alreadySilent.has(f)||(i.isolateSubtrees==="aria-hidden"?f.removeAttribute("aria-hidden"):f.removeAttribute("inert"))})}}}),o.updateContainerElements(e),o};function zn(a,e={}){let t;const{immediate:n,...r}=e,i=ce(!1),s=ce(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),s.value=!0)},h=()=>{t&&(t.unpause(),s.value=!1)},m=be(()=>{const p=nt(a);return Lt(p).map(b=>{const w=nt(b);return typeof w=="string"?w:Dt(w)}).filter(Pt)});return Be(m,p=>{p.length&&(t=Pn(p,{...r,onActivate(){i.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){i.value=!1,e.onDeactivate&&e.onDeactivate()}}),n&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:i,isPaused:s,activate:o,deactivate:l,pause:c,unpause:h}}class ue{constructor(e,t=!0,n=[],r=5e3){this.ctx=e,this.iframes=t,this.exclude=n,this.iframesTimeout=r}static matches(e,t){const n=typeof t=="string"?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){let i=!1;return n.every(s=>r.call(e,s)?(i=!0,!1):!0),i}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(n=>{const r=t.filter(i=>i.contains(n)).length>0;t.indexOf(n)===-1&&!r&&t.push(n)}),t}getIframeContents(e,t,n=()=>{}){let r;try{const i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch{n()}r&&t(r)}isIframeBlank(e){const t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}observeIframeLoad(e,t,n){let r=!1,i=null;const s=()=>{if(!r){r=!0,clearTimeout(i);try{this.isIframeBlank(e)||(e.removeEventListener("load",s),this.getIframeContents(e,t,n))}catch{n()}}};e.addEventListener("load",s),i=setTimeout(s,this.iframesTimeout)}onIframeReady(e,t,n){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch{n()}}waitForIframes(e,t){let n=0;this.forEachIframe(e,()=>!0,r=>{n++,this.waitForIframes(r.querySelector("html"),()=>{--n||t()})},r=>{r||t()})}forEachIframe(e,t,n,r=()=>{}){let i=e.querySelectorAll("iframe"),s=i.length,o=0;i=Array.prototype.slice.call(i);const l=()=>{--s<=0&&r(o)};s||l(),i.forEach(c=>{ue.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,n(h)),l()},l)})}createIterator(e,t,n){return document.createNodeIterator(e,t,n,!1)}createInstanceOnIframe(e){return new ue(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,n){const r=e.compareDocumentPosition(n),i=Node.DOCUMENT_POSITION_PRECEDING;if(r&i)if(t!==null){const s=t.compareDocumentPosition(n),o=Node.DOCUMENT_POSITION_FOLLOWING;if(s&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let n;return t===null?n=e.nextNode():n=e.nextNode()&&e.nextNode(),{prevNode:t,node:n}}checkIframeFilter(e,t,n,r){let i=!1,s=!1;return r.forEach((o,l)=>{o.val===n&&(i=l,s=o.handled)}),this.compareNodeIframe(e,t,n)?(i===!1&&!s?r.push({val:n,handled:!0}):i!==!1&&!s&&(r[i].handled=!0),!0):(i===!1&&r.push({val:n,handled:!1}),!1)}handleOpenIframes(e,t,n,r){e.forEach(i=>{i.handled||this.getIframeContents(i.val,s=>{this.createInstanceOnIframe(s).forEachNode(t,n,r)})})}iterateThroughNodes(e,t,n,r,i){const s=this.createIterator(t,e,r);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(s),c);for(;m();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),r)}),l.push(c);l.forEach(p=>{n(p)}),this.iframes&&this.handleOpenIframes(o,e,n,r),i()}forEachNode(e,t,n,r=()=>{}){const i=this.getContexts();let s=i.length;s||r(),i.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,n,()=>{--s<=0&&r()})};this.iframes?this.waitForIframes(o,l):l()})}}let Vn=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ue(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const n=this.opt.log;this.opt.debug&&typeof n=="object"&&typeof n[t]=="function"&&n[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let i in t)if(t.hasOwnProperty(i)){const s=t[i],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(s):this.escapeStr(s);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${n}`),r+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+r))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,n,r)=>{let i=r.charAt(n+1);return/[(|)\\]/.test(i)||i===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let r=[];return e.split("").forEach(i=>{n.every(s=>{if(s.indexOf(i)!==-1){if(r.indexOf(s)>-1)return!1;e=e.replace(new RegExp(`[${s}]`,`gm${t}`),`[${s}]`),r.push(s)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let n=this.opt.accuracy,r=typeof n=="string"?n:n.value,i=typeof n=="string"?[]:n.limiters,s="";switch(i.forEach(o=>{s+=`|${this.escapeStr(o)}`}),r){case"partially":default:return`()(${e})`;case"complementary":return s="\\s"+(s||this.escapeStr(t)),`()([^${s}]*${e}[^${s}]*)`;case"exactly":return`(^|\\s${s})(${e})(?=$|\\s${s})`}}getSeparatedKeywords(e){let t=[];return e.forEach(n=>{this.opt.separateWordSearch?n.split(" ").forEach(r=>{r.trim()&&t.indexOf(r)===-1&&t.push(r)}):n.trim()&&t.indexOf(n)===-1&&t.push(n)}),{keywords:t.sort((n,r)=>r.length-n.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let n=0;return e.sort((r,i)=>r.start-i.start).forEach(r=>{let{start:i,end:s,valid:o}=this.callNoMatchOnInvalidRanges(r,n);o&&(r.start=i,r.length=s-i,t.push(r),n=s)}),t}callNoMatchOnInvalidRanges(e,t){let n,r,i=!1;return e&&typeof e.start<"u"?(n=parseInt(e.start,10),r=n+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:n,end:r,valid:i}}checkWhitespaceRanges(e,t,n){let r,i=!0,s=n.length,o=t-s,l=parseInt(e.start,10)-o;return l=l>s?s:l,r=l+parseInt(e.length,10),r>s&&(r=s,this.log(`End range automatically set to the max value of ${s}`)),l<0||r-l<0||l>s||r>s?(i=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):n.substring(l,r).replace(/\s+/g,"")===""&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:r,valid:i}}getTextNodes(e){let t="",n=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,r=>{n.push({start:t.length,end:(t+=r.textContent).length,node:r})},r=>this.matchesExclude(r.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:n})})}matchesExclude(e){return ue.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,n){const r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),s=i.splitText(n-t);let o=document.createElement(r);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=i.textContent,i.parentNode.replaceChild(o,i),s}wrapRangeInMappedTextNode(e,t,n,r,i){e.nodes.every((s,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!r(s.node))return!1;const c=t-s.start,h=(n>s.end?s.end:n)-s.start,m=e.value.substr(0,s.start),p=e.value.substr(h+s.start);if(s.node=this.wrapRangeInTextNode(s.node,c,h),e.value=m+p,e.nodes.forEach((b,w)=>{w>=o&&(e.nodes[w].start>0&&w!==o&&(e.nodes[w].start-=h),e.nodes[w].end-=h)}),n-=h,i(s.node.previousSibling,s.start),n>s.end)t=s.end;else return!1}return!0})}wrapMatches(e,t,n,r,i){const s=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[s]!=="";){if(!n(c[s],l))continue;let h=c.index;if(s!==0)for(let m=1;m{let l;for(;(l=e.exec(o.value))!==null&&l[s]!=="";){let c=l.index;if(s!==0)for(let m=1;mn(l[s],m),(m,p)=>{e.lastIndex=p,r(m)})}i()})}wrapRangeFromIndex(e,t,n,r){this.getTextNodes(i=>{const s=i.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,s,i.value);m&&this.wrapRangeInMappedTextNode(i,c,h,p=>t(p,o,i.value.substring(c,h),l),p=>{n(p,o)})}),r()})}unwrapMatches(e){const t=e.parentNode;let n=document.createDocumentFragment();for(;e.firstChild;)n.appendChild(e.removeChild(e.firstChild));t.replaceChild(n,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let n=0,r="wrapMatches";const i=s=>{n++,this.opt.each(s)};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),this[r](e,this.opt.ignoreGroups,(s,o)=>this.opt.filter(o,s,n),i,()=>{n===0&&this.opt.noMatch(e),this.opt.done(n)})}mark(e,t){this.opt=t;let n=0,r="wrapMatches";const{keywords:i,length:s}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[r](h,1,(p,b)=>this.opt.filter(b,c,n,m),p=>{m++,n++,this.opt.each(p)},()=>{m===0&&this.opt.noMatch(c),i[s-1]===c?this.opt.done(n):l(i[i.indexOf(c)+1])})};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),s===0?this.opt.done(n):l(i[0])}markRanges(e,t){this.opt=t;let n=0,r=this.checkRanges(e);r&&r.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(r)),this.wrapRangeFromIndex(r,(i,s,o,l)=>this.opt.filter(i,s,o,l),(i,s)=>{n++,this.opt.each(i,s)},()=>{this.opt.done(n)})):this.opt.done(n)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,n=>{this.unwrapMatches(n)},n=>{const r=ue.matches(n,t),i=this.matchesExclude(n);return!r||i?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function jn(a){const e=new Vn(a);return this.mark=(t,n)=>(e.mark(t,n),this),this.markRegExp=(t,n)=>(e.markRegExp(t,n),this),this.markRanges=(t,n)=>(e.markRanges(t,n),this),this.unmark=t=>(e.unmark(t),this),this}const $n="ENTRIES",Tt="KEYS",Et="VALUES",z="";class Pe{constructor(e,t){const n=e._tree,r=Array.from(n.keys());this.set=e,this._type=t,this._path=r.length>0?[{node:n,keys:r}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===z)return{done:!1,value:this.result()};const n=e.get(le(t));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==z).join("")}value(){return le(this._path).node.get(z)}result(){switch(this._type){case Et:return this.value();case Tt:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Bn=(a,e,t)=>{const n=new Map;if(e===void 0)return n;const r=e.length+1,i=r+t,s=new Uint8Array(i*r).fill(t+1);for(let o=0;o{const l=i*s;e:for(const c of a.keys())if(c===z){const h=r[l-1];h<=t&&n.set(o,[a.get(c),h])}else{let h=i;for(let m=0;mt)continue e}It(a.get(c),e,t,n,r,h,s,o+c)}};class Y{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,n]=Ae(this._tree,e.slice(this._prefix.length));if(t===void 0){const[r,i]=He(n);for(const s of r.keys())if(s!==z&&s.startsWith(i)){const o=new Map;return o.set(s.slice(i.length),r.get(s)),new Y(o,e)}}return new Y(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Wn(this._tree,e)}entries(){return new Pe(this,$n)}forEach(e){for(const[t,n]of this)e(t,n,this)}fuzzyGet(e,t){return Bn(this._tree,e,t)}get(e){const t=Je(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Je(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Pe(this,Tt)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);return n.set(z,t(n.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);let r=n.get(z);return r===void 0&&n.set(z,r=t()),r}values(){return new Pe(this,Et)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Y;for(const[n,r]of e)t.set(n,r);return t}static fromObject(e){return Y.from(Object.entries(e))}}const Ae=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const n of a.keys())if(n!==z&&e.startsWith(n))return t.push([a,n]),Ae(a.get(n),e.slice(n.length),t);return t.push([a,e]),Ae(void 0,"",t)},Je=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Je(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let n=0;a&&n{const[t,n]=Ae(a,e);if(t!==void 0){if(t.delete(z),t.size===0)kt(n);else if(t.size===1){const[r,i]=t.entries().next().value;Nt(n,r,i)}}},kt=a=>{if(a.length===0)return;const[e,t]=He(a);if(e.delete(t),e.size===0)kt(a.slice(0,-1));else if(e.size===1){const[n,r]=e.entries().next().value;n!==z&&Nt(a.slice(0,-1),n,r)}},Nt=(a,e,t)=>{if(a.length===0)return;const[n,r]=He(a);n.set(r+e,t),n.delete(r)},He=a=>a[a.length-1],Ge="or",Ft="and",Kn="and_not";class de{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?$e:e.autoVacuum;this._options={...je,...e,autoVacuum:t,searchOptions:{...ht,...e.searchOptions||{}},autoSuggestOptions:{...Gn,...e.autoSuggestOptions||{}}},this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,stringifyField:n,tokenize:r,processTerm:i,fields:s,idField:o}=this._options,l=t(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);if(this._idToShortId.has(l))throw new Error(`MiniSearch: duplicate ID ${l}`);const c=this.addDocumentId(l);this.saveStoredFields(c,e);for(const h of s){const m=t(e,h);if(m==null)continue;const p=r(n(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.addFieldLength(c,b,this._documentCount-1,w);for(const k of p){const y=i(k,h);if(Array.isArray(y))for(const O of y)this.addTerm(b,c,O);else y&&this.addTerm(b,c,y)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:n=10}=t,r={chunk:[],promise:Promise.resolve()},{chunk:i,promise:s}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%n===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),r);return s.then(()=>this.addAll(i))}remove(e){const{tokenize:t,processTerm:n,extractField:r,stringifyField:i,fields:s,idField:o}=this._options,l=r(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);const c=this._idToShortId.get(l);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${l}: it is not in the index`);for(const h of s){const m=r(e,h);if(m==null)continue;const p=t(i(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.removeFieldLength(c,b,this._documentCount,w);for(const k of p){const y=n(k,h);if(Array.isArray(y))for(const O of y)this.removeTerm(b,c,O);else y&&this.removeTerm(b,c,y)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(l),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((n,r)=>{this.removeFieldLength(t,r,this._documentCount,n)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:n,batchWait:r}=this._options.autoVacuum;this.conditionalVacuum({batchSize:n,batchWait:r},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const n of e)this.discard(n)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:n}=this._options,r=n(e,t);this.discard(r),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const n=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}async performVacuuming(e,t){const n=this._dirtCount;if(this.vacuumConditionsMet(t)){const r=e.batchSize||qe.batchSize,i=e.batchWait||qe.batchWait;let s=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),s%r===0&&await new Promise(c=>setTimeout(c,i)),s+=1}this._dirtCount-=n}await null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:n}=e;return t=t||$e.minDirtCount,n=n||$e.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=n}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const{searchOptions:n}=this._options,r={...n,...t},i=this.executeQuery(e,t),s=[];for(const[o,{score:l,terms:c,match:h}]of i){const m=c.length||1,p={id:this._documentIds.get(o),score:l*m,terms:Object.keys(h),queryTerms:c,match:h};Object.assign(p,this._storedFields.get(o)),(r.filter==null||r.filter(p))&&s.push(p)}return e===de.wildcard&&r.boostDocument==null||s.sort(pt),s}autoSuggest(e,t={}){t={...this._options.autoSuggestOptions,...t};const n=new Map;for(const{score:i,terms:s}of this.search(e,t)){const o=s.join(" "),l=n.get(o);l!=null?(l.score+=i,l.count+=1):n.set(o,{score:i,terms:s,count:1})}const r=[];for(const[i,{score:s,terms:o,count:l}]of n)r.push({suggestion:i,terms:o,score:s/l});return r.sort(pt),r}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static async loadJSONAsync(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)}static getDefault(e){if(je.hasOwnProperty(e))return Ve(je,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:n,documentIds:r,fieldLength:i,storedFields:s,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Ee(r),l._fieldLength=Ee(i),l._storedFields=Ee(s);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of n){const m=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),m.set(parseInt(p,10),Ee(b))}l._index.set(c,m)}return l}static async loadJSAsync(e,t){const{index:n,documentIds:r,fieldLength:i,storedFields:s,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=await Ie(r),l._fieldLength=await Ie(i),l._storedFields=await Ie(s);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of n){const p=new Map;for(const b of Object.keys(m)){let w=m[b];o===1&&(w=w.ds),p.set(parseInt(b,10),await Ie(w))}++c%1e3===0&&await Rt(0),l._index.set(h,p)}return l}static instantiateMiniSearch(e,t){const{documentCount:n,nextId:r,fieldIds:i,averageFieldLength:s,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new de(t);return c._documentCount=n,c._nextId=r,c._idToShortId=new Map,c._fieldIds=i,c._avgFieldLength=s,c._dirtCount=o||0,c._index=new Y,c}executeQuery(e,t={}){if(e===de.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p={...t,...e,queries:void 0},b=e.queries.map(w=>this.executeQuery(w,p));return this.combineResults(b,p.combineWith)}const{tokenize:n,processTerm:r,searchOptions:i}=this._options,s={tokenize:n,processTerm:r,...i,...t},{tokenize:o,processTerm:l}=s,m=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Hn(s)).map(p=>this.executeQuerySpec(p,s));return this.combineResults(m,s.combineWith)}executeQuerySpec(e,t){const n={...this._options.searchOptions,...t},r=(n.fields||this._options.fields).reduce((k,y)=>({...k,[y]:Ve(n.boost,y)||1}),{}),{boostDocument:i,weights:s,maxFuzzy:o,bm25:l}=n,{fuzzy:c,prefix:h}={...ht.weights,...s},m=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,m,r,i,l);let b,w;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const k=e.fuzzy===!0?.2:e.fuzzy,y=k<1?Math.min(o,Math.round(e.term.length*k)):k;y&&(w=this._index.fuzzyGet(e.term,y))}if(b)for(const[k,y]of b){const O=k.length-e.term.length;if(!O)continue;w==null||w.delete(k);const L=h*k.length/(k.length+.3*O);this.termResults(e.term,k,L,e.termBoost,y,r,i,l,p)}if(w)for(const k of w.keys()){const[y,O]=w.get(k);if(!O)continue;const L=c*k.length/(k.length+O);this.termResults(e.term,k,L,e.termBoost,y,r,i,l,p)}return p}executeWildcardQuery(e){const t=new Map,n={...this._options.searchOptions,...e};for(const[r,i]of this._documentIds){const s=n.boostDocument?n.boostDocument(i,"",this._storedFields.get(r)):1;t.set(r,{score:s,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const n=t.toLowerCase(),r=Jn[n];if(!r)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(r)||new Map}toJSON(){const e=[];for(const[t,n]of this._index){const r={};for(const[i,s]of n)r[i]=Object.fromEntries(s);e.push([t,r])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,n,r,i,s,o,l,c=new Map){if(i==null)return c;for(const h of Object.keys(s)){const m=s[h],p=this._fieldIds[h],b=i.get(p);if(b==null)continue;let w=b.size;const k=this._avgFieldLength[p];for(const y of b.keys()){if(!this._documentIds.has(y)){this.removeTerm(p,y,t),w-=1;continue}const O=o?o(this._documentIds.get(y),t,this._storedFields.get(y)):1;if(!O)continue;const L=b.get(y),K=this._fieldLength.get(y)[p],H=Un(L,w,this._documentCount,K,k,l),W=n*r*m*O*H,j=c.get(y);if(j){j.score+=W,Qn(j.terms,e);const $=Ve(j.match,t);$?$.push(h):j.match[t]=[h]}else c.set(y,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,n){const r=this._index.fetch(n,mt);let i=r.get(e);if(i==null)i=new Map,i.set(t,1),r.set(e,i);else{const s=i.get(t);i.set(t,(s||0)+1)}}removeTerm(e,t,n){if(!this._index.has(n)){this.warnDocumentChanged(t,e,n);return}const r=this._index.fetch(n,mt),i=r.get(e);i==null||i.get(t)==null?this.warnDocumentChanged(t,e,n):i.get(t)<=1?i.size<=1?r.delete(e):i.delete(t):i.set(t,i.get(t)-1),this._index.get(n).size===0&&this._index.delete(n)}warnDocumentChanged(e,t,n){for(const r of Object.keys(this._fieldIds))if(this._fieldIds[r]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${n}" was not present in field "${r}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Jn={[Ge]:(a,e)=>{for(const t of e.keys()){const n=a.get(t);if(n==null)a.set(t,e.get(t));else{const{score:r,terms:i,match:s}=e.get(t);n.score=n.score+r,n.match=Object.assign(n.match,s),vt(n.terms,i)}}return a},[Ft]:(a,e)=>{const t=new Map;for(const n of e.keys()){const r=a.get(n);if(r==null)continue;const{score:i,terms:s,match:o}=e.get(n);vt(r.terms,s),t.set(n,{score:r.score+i,terms:r.terms,match:Object.assign(r.match,o)})}return t},[Kn]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},qn={k:1.2,b:.7,d:.5},Un=(a,e,t,n,r,i)=>{const{k:s,b:o,d:l}=i;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(s+1)/(a+s*(1-o+o*n/r)))},Hn=a=>(e,t,n)=>{const r=typeof a.fuzzy=="function"?a.fuzzy(e,t,n):a.fuzzy||!1,i=typeof a.prefix=="function"?a.prefix(e,t,n):a.prefix===!0,s=typeof a.boostTerm=="function"?a.boostTerm(e,t,n):1;return{term:e,fuzzy:r,prefix:i,termBoost:s}},je={idField:"id",extractField:(a,e)=>a[e],stringifyField:(a,e)=>a.toString(),tokenize:a=>a.split(Yn),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ht={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:qn},Gn={combineWith:Ft,prefix:(a,e,t)=>e===t.length-1},qe={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},$e={...qe,...Ue},Qn=(a,e)=>{a.includes(e)||a.push(e)},vt=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},pt=({score:a},{score:e})=>e-a,mt=()=>new Map,Ee=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ie=async a=>{const e=new Map;let t=0;for(const n of Object.keys(a))e.set(parseInt(n,10),a[n]),++t%1e3===0&&await Rt(0);return e},Rt=a=>new Promise(e=>setTimeout(e,a)),Yn=/[\n\r\p{Z}\p{P}]+/u;class Zn{constructor(e=10){Me(this,"max");Me(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Xn=["aria-owns"],er={class:"shell"},tr=["title"],nr={class:"search-actions before"},rr=["title"],sr=["aria-activedescendant","aria-controls","placeholder"],ir={class:"search-actions"},ar=["title"],or=["disabled","title"],lr=["id","role","aria-labelledby"],cr=["id","aria-selected"],ur=["href","aria-label","onMouseenter","onFocusin","data-index"],dr={class:"titles"},fr=["innerHTML"],hr={class:"title main"},vr=["innerHTML"],pr={key:0,class:"excerpt-wrapper"},mr={key:0,class:"excerpt",inert:""},gr=["innerHTML"],br={key:0,class:"no-results"},yr={class:"search-keyboard-shortcuts"},wr=["aria-label"],Sr=["aria-label"],xr=["aria-label"],_r=["aria-label"],Tr=zt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var I,S;const t=e,n=ce(),r=ce(),i=ce(ln),s=an(),{activate:o}=zn(n,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=s,h=rt(async()=>{var v,d,x,R,A,C,D,F,V;return ot(de.loadJSON((x=await((d=(v=i.value)[l.value])==null?void 0:d.call(v)))==null?void 0:x.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((R=c.value.search)==null?void 0:R.provider)==="local"&&((C=(A=c.value.search.options)==null?void 0:A.miniSearch)==null?void 0:C.searchOptions)},...((D=c.value.search)==null?void 0:D.provider)==="local"&&((V=(F=c.value.search.options)==null?void 0:F.miniSearch)==null?void 0:V.options)}))}),p=be(()=>{var v,d;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((d=c.value.search.options)==null?void 0:d.disableQueryPersistence)===!0}).value?he(""):Vt("vitepress:local-search-filter",""),b=jt("vitepress:local-search-detailed-list",((I=c.value.search)==null?void 0:I.provider)==="local"&&((S=c.value.search.options)==null?void 0:S.detailedView)===!0),w=be(()=>{var v,d,x;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((d=c.value.search.options)==null?void 0:d.disableDetailedView)===!0||((x=c.value.search.options)==null?void 0:x.detailedView)===!1)}),k=be(()=>{var d,x,R,A,C,D,F;const v=((d=c.value.search)==null?void 0:d.options)??c.value.algolia;return((C=(A=(R=(x=v==null?void 0:v.locales)==null?void 0:x[l.value])==null?void 0:R.translations)==null?void 0:A.button)==null?void 0:C.buttonText)||((F=(D=v==null?void 0:v.translations)==null?void 0:D.button)==null?void 0:F.buttonText)||"Search"});$t(()=>{w.value&&(b.value=!1)});const y=ce([]),O=he(!1);Be(p,()=>{O.value=!1});const L=rt(async()=>{if(r.value)return ot(new jn(r.value))},null),K=new Zn(16);Bt(()=>[h.value,p.value,b.value],async([v,d,x],R,A)=>{var te,we,Qe,Ye;(R==null?void 0:R[0])!==v&&K.clear();let C=!1;if(A(()=>{C=!0}),!v)return;y.value=v.search(d).slice(0,16),O.value=!0;const D=x?await Promise.all(y.value.map(B=>H(B.id))):[];if(C)return;for(const{id:B,mod:ne}of D){const re=B.slice(0,B.indexOf("#"));let G=K.get(re);if(G)continue;G=new Map,K.set(re,G);const J=ne.default??ne;if(J!=null&&J.render||J!=null&&J.setup){const se=en(J);se.config.warnHandler=()=>{},se.provide(tn,s),Object.defineProperties(se.config.globalProperties,{$frontmatter:{get(){return s.frontmatter.value}},$params:{get(){return s.page.value.params}}});const Ze=document.createElement("div");se.mount(Ze),Ze.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var tt;const Se=(tt=fe.querySelector("a"))==null?void 0:tt.getAttribute("href"),Xe=(Se==null?void 0:Se.startsWith("#"))&&Se.slice(1);if(!Xe)return;let et="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)et+=fe.outerHTML;G.set(Xe,et)}),se.unmount()}if(C)return}const F=new Set;if(y.value=y.value.map(B=>{const[ne,re]=B.id.split("#"),G=K.get(ne),J=(G==null?void 0:G.get(re))??"";for(const se in B.match)F.add(se);return{...B,text:J}}),await ve(),C)return;await new Promise(B=>{var ne;(ne=L.value)==null||ne.unmark({done:()=>{var re;(re=L.value)==null||re.markRegExp(E(F),{done:B})}})});const V=((te=n.value)==null?void 0:te.querySelectorAll(".result .excerpt"))??[];for(const B of V)(we=B.querySelector('mark[data-markjs="true"]'))==null||we.scrollIntoView({block:"center"});(Ye=(Qe=r.value)==null?void 0:Qe.firstElementChild)==null||Ye.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(v){const d=nn(v.slice(0,v.indexOf("#")));try{if(!d)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(d)}}catch(x){return console.error(x),{id:v,mod:{}}}}const W=he(),j=be(()=>{var v;return((v=p.value)==null?void 0:v.length)<=0});function $(v=!0){var d,x;(d=W.value)==null||d.focus(),v&&((x=W.value)==null||x.select())}Le(()=>{$()});function Ce(v){v.pointerType==="mouse"&&$()}const M=he(-1),Z=he(!0);Be(y,v=>{M.value=v.length?0:-1,X()});function X(){ve(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}xe("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=y.value.length-1),Z.value=!0,X()}),xe("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=y.value.length&&(M.value=0),Z.value=!0,X()});const ee=Wt();xe("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const d=y.value[M.value];if(v.target instanceof HTMLInputElement&&!d){v.preventDefault();return}d&&(ee.go(d.id),t("close"))}),xe("Escape",()=>{t("close")});const u=on({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Le(()=>{window.history.pushState(null,"",null)}),Kt("popstate",v=>{v.preventDefault(),t("close")});const f=Jt(qt?document.body:null);Le(()=>{ve(()=>{f.value=!0,ve().then(()=>o())})}),Ut(()=>{f.value=!1});function g(){p.value="",ve().then(()=>$(!1))}function E(v){return new RegExp([...v].sort((d,x)=>x.length-d.length).map(d=>`(${rn(d)})`).join("|"),"gi")}function _(v){var R;if(!Z.value)return;const d=(R=v.target)==null?void 0:R.closest(".result"),x=Number.parseInt(d==null?void 0:d.dataset.index);x>=0&&x!==M.value&&(M.value=x),Z.value=!1}return(v,d)=>{var x,R,A,C,D;return q(),Ht(Xt,{to:"body"},[T("div",{ref_key:"el",ref:n,role:"button","aria-owns":(x=y.value)!=null&&x.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[T("div",{class:"backdrop",onClick:d[0]||(d[0]=F=>v.$emit("close"))}),T("div",er,[T("form",{class:"search-bar",onPointerup:d[4]||(d[4]=F=>Ce(F)),onSubmit:d[5]||(d[5]=Gt(()=>{},["prevent"]))},[T("label",{title:k.value,id:"localsearch-label",for:"localsearch-input"},[...d[7]||(d[7]=[T("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)])],8,tr),T("div",nr,[T("button",{class:"back-button",title:P(u)("modal.backButtonTitle"),onClick:d[1]||(d[1]=F=>v.$emit("close"))},[...d[8]||(d[8]=[T("span",{class:"vpi-arrow-left local-search-icon"},null,-1)])],8,rr)]),Qt(T("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":d[2]||(d[2]=F=>Zt(p)?p.value=F:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(R=y.value)!=null&&R.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:k.value,spellcheck:"false",type:"search"},null,8,sr),[[Yt,P(p)]]),T("div",ir,[w.value?_e("",!0):(q(),Q("button",{key:0,class:st(["toggle-layout-button",{"detailed-list":P(b)}]),type:"button",title:P(u)("modal.displayDetails"),onClick:d[3]||(d[3]=F=>M.value>-1&&(b.value=!P(b)))},[...d[9]||(d[9]=[T("span",{class:"vpi-layout-list local-search-icon"},null,-1)])],10,ar)),T("button",{class:"clear-button",type:"reset",disabled:j.value,title:P(u)("modal.resetButtonTitle"),onClick:g},[...d[10]||(d[10]=[T("span",{class:"vpi-delete local-search-icon"},null,-1)])],8,or)])],32),T("ul",{ref_key:"resultsEl",ref:r,id:(A=y.value)!=null&&A.length?"localsearch-list":void 0,role:(C=y.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(D=y.value)!=null&&D.length?"localsearch-label":void 0,class:"results",onMousemove:_},[(q(!0),Q(at,null,it(y.value,(F,V)=>(q(),Q("li",{key:F.id,id:"localsearch-item-"+V,"aria-selected":M.value===V?"true":"false",role:"option"},[T("a",{href:F.id,class:st(["result",{selected:M.value===V}]),"aria-label":[...F.titles,F.title].join(" > "),onMouseenter:te=>!Z.value&&(M.value=V),onFocusin:te=>M.value=V,onClick:d[6]||(d[6]=te=>v.$emit("close")),"data-index":V},[T("div",null,[T("div",dr,[d[12]||(d[12]=T("span",{class:"title-icon"},"#",-1)),(q(!0),Q(at,null,it(F.titles,(te,we)=>(q(),Q("span",{key:we,class:"title"},[T("span",{class:"text",innerHTML:te},null,8,fr),d[11]||(d[11]=T("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),T("span",hr,[T("span",{class:"text",innerHTML:F.title},null,8,vr)])]),P(b)?(q(),Q("div",pr,[F.text?(q(),Q("div",mr,[T("div",{class:"vp-doc",innerHTML:F.text},null,8,gr)])):_e("",!0),d[13]||(d[13]=T("div",{class:"excerpt-gradient-bottom"},null,-1)),d[14]||(d[14]=T("div",{class:"excerpt-gradient-top"},null,-1))])):_e("",!0)])],42,ur)],8,cr))),128)),P(p)&&!y.value.length&&O.value?(q(),Q("li",br,[pe(me(P(u)("modal.noResultsText"))+' "',1),T("strong",null,me(P(p)),1),d[15]||(d[15]=pe('" ',-1))])):_e("",!0)],40,lr),T("div",yr,[T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.navigateUpKeyAriaLabel")},[...d[16]||(d[16]=[T("span",{class:"vpi-arrow-up navigate-icon"},null,-1)])],8,wr),T("kbd",{"aria-label":P(u)("modal.footer.navigateDownKeyAriaLabel")},[...d[17]||(d[17]=[T("span",{class:"vpi-arrow-down navigate-icon"},null,-1)])],8,Sr),pe(" "+me(P(u)("modal.footer.navigateText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.selectKeyAriaLabel")},[...d[18]||(d[18]=[T("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)])],8,xr),pe(" "+me(P(u)("modal.footer.selectText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.closeKeyAriaLabel")},"esc",8,_r),pe(" "+me(P(u)("modal.footer.closeText")),1)])])])],8,Xn)])}}}),Rr=sn(Tr,[["__scopeId","data-v-ce626c7c"]]);export{Rr as default}; diff --git a/docs/v26.5.0/assets/chunks/framework.C2NLiVii.js b/docs/v26.5.0/assets/chunks/framework.C2NLiVii.js new file mode 100644 index 0000000..a725f03 --- /dev/null +++ b/docs/v26.5.0/assets/chunks/framework.C2NLiVii.js @@ -0,0 +1,19 @@ +/** +* @vue/shared v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Bs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},Lt=[],qe=()=>{},_i=()=>!1,cn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ks=e=>e.startsWith("onUpdate:"),fe=Object.assign,qs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},cl=Object.prototype.hasOwnProperty,Z=(e,t)=>cl.call(e,t),K=Array.isArray,It=e=>an(e)==="[object Map]",bi=e=>an(e)==="[object Set]",_r=e=>an(e)==="[object Date]",q=e=>typeof e=="function",le=e=>typeof e=="string",De=e=>typeof e=="symbol",Q=e=>e!==null&&typeof e=="object",wi=e=>(Q(e)||q(e))&&q(e.then)&&q(e.catch),Si=Object.prototype.toString,an=e=>Si.call(e),al=e=>an(e).slice(8,-1),Ti=e=>an(e)==="[object Object]",Un=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,vt=Bs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Bn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ul=/-\w/g,Ie=Bn(e=>e.replace(ul,t=>t.slice(1).toUpperCase())),fl=/\B([A-Z])/g,ft=Bn(e=>e.replace(fl,"-$1").toLowerCase()),Kn=Bn(e=>e.charAt(0).toUpperCase()+e.slice(1)),An=Bn(e=>e?`on${Kn(e)}`:""),lt=(e,t)=>!Object.is(e,t),Rn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Gs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},dl=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let br;const qn=()=>br||(br=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Xs(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(pl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ys(e){let t="";if(le(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),bl=e=>le(e)?e:e==null?"":K(e)||Q(e)&&(e.toString===Si||!q(e.toString))?Ci(e)?bl(e.value):JSON.stringify(e,Ai,2):String(e),Ai=(e,t)=>Ci(t)?Ai(e,t.value):It(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[ls(s,i)+" =>"]=r,n),{})}:bi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ls(n))}:De(t)?ls(t):Q(t)&&!K(t)&&!Ti(t)?String(t):t,ls=(e,t="")=>{var n;return De(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ye;class wl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=ye,!t&&ye&&(this.index=(ye.scopes||(ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Gt){let t=Gt;for(Gt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;qt;){let t=qt;for(qt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Li(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ii(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Zs(s),Tl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ms(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ni(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ni(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Zt)||(e.globalVersion=Zt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ms(e))))return;e.flags|=2;const t=e.dep,n=re,s=Fe;re=e,Fe=!0;try{Li(e);const r=e.fn(e._value);(t.version===0||lt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{re=n,Fe=s,Ii(e),e.flags&=-3}}function Zs(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Zs(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Tl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Fe=!0;const Fi=[];function Ze(){Fi.push(Fe),Fe=!1}function et(){const e=Fi.pop();Fe=e===void 0?!0:e}function wr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let Zt=0;class El{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Gn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!re||!Fe||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new El(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Hi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.version++,Zt++,this.notify(t)}notify(t){zs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Qs()}}}function Hi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Hi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Nn=new WeakMap,_t=Symbol(""),Os=Symbol(""),en=Symbol("");function _e(e,t,n){if(Fe&&re){let s=Nn.get(e);s||Nn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Gn),r.map=s,r.key=n),r.track()}}function ze(e,t,n,s,r,i){const o=Nn.get(e);if(!o){Zt++;return}const l=c=>{c&&c.trigger()};if(zs(),t==="clear")o.forEach(l);else{const c=K(e),u=c&&Un(n);if(c&&n==="length"){const a=Number(s);o.forEach((d,m)=>{(m==="length"||m===en||!De(m)&&m>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(en)),t){case"add":c?u&&l(o.get("length")):(l(o.get(_t)),It(e)&&l(o.get(Os)));break;case"delete":c||(l(o.get(_t)),It(e)&&l(o.get(Os)));break;case"set":It(e)&&l(o.get(_t));break}}Qs()}function xl(e,t){const n=Nn.get(e);return n&&n.get(t)}function At(e){const t=z(e);return t===e?t:(_e(t,"iterate",en),Re(e)?t:t.map($e))}function Xn(e){return _e(e=z(e),"iterate",en),e}function it(e,t){return tt(e)?Dt(ct(e)?$e(t):t):$e(t)}const Cl={__proto__:null,[Symbol.iterator](){return as(this,Symbol.iterator,e=>it(this,e))},concat(...e){return At(this).concat(...e.map(t=>K(t)?At(t):t))},entries(){return as(this,"entries",e=>(e[1]=it(this,e[1]),e))},every(e,t){return Ge(this,"every",e,t,void 0,arguments)},filter(e,t){return Ge(this,"filter",e,t,n=>n.map(s=>it(this,s)),arguments)},find(e,t){return Ge(this,"find",e,t,n=>it(this,n),arguments)},findIndex(e,t){return Ge(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ge(this,"findLast",e,t,n=>it(this,n),arguments)},findLastIndex(e,t){return Ge(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ge(this,"forEach",e,t,void 0,arguments)},includes(...e){return us(this,"includes",e)},indexOf(...e){return us(this,"indexOf",e)},join(e){return At(this).join(e)},lastIndexOf(...e){return us(this,"lastIndexOf",e)},map(e,t){return Ge(this,"map",e,t,void 0,arguments)},pop(){return Wt(this,"pop")},push(...e){return Wt(this,"push",e)},reduce(e,...t){return Sr(this,"reduce",e,t)},reduceRight(e,...t){return Sr(this,"reduceRight",e,t)},shift(){return Wt(this,"shift")},some(e,t){return Ge(this,"some",e,t,void 0,arguments)},splice(...e){return Wt(this,"splice",e)},toReversed(){return At(this).toReversed()},toSorted(e){return At(this).toSorted(e)},toSpliced(...e){return At(this).toSpliced(...e)},unshift(...e){return Wt(this,"unshift",e)},values(){return as(this,"values",e=>it(this,e))}};function as(e,t,n){const s=Xn(e),r=s[t]();return s!==e&&!Re(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Al=Array.prototype;function Ge(e,t,n,s,r,i){const o=Xn(e),l=o!==e&&!Re(e),c=o[t];if(c!==Al[t]){const d=c.apply(e,i);return l?$e(d):d}let u=n;o!==e&&(l?u=function(d,m){return n.call(this,it(e,d),m,e)}:n.length>2&&(u=function(d,m){return n.call(this,d,m,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function Sr(e,t,n,s){const r=Xn(e);let i=n;return r!==e&&(Re(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,it(e,l),c,e)}),r[t](i,...s)}function us(e,t,n){const s=z(e);_e(s,"iterate",en);const r=s[t](...n);return(r===-1||r===!1)&&Yn(n[0])?(n[0]=z(n[0]),s[t](...n)):r}function Wt(e,t,n=[]){Ze(),zs();const s=z(e)[t].apply(e,n);return Qs(),et(),s}const Rl=Bs("__proto__,__v_isRef,__isVue"),Di=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(De));function Ml(e){De(e)||(e=String(e));const t=z(this);return _e(t,"has",e),t.hasOwnProperty(e)}class $i{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?jl:Wi:i?ki:Vi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=Cl[n]))return c;if(n==="hasOwnProperty")return Ml}const l=Reflect.get(t,n,ae(t)?t:s);if((De(n)?Di.has(n):Rl(n))||(r||_e(t,"get",n),i))return l;if(ae(l)){const c=o&&Un(n)?l:l.value;return r&&Q(c)?tn(c):c}return Q(l)?r?tn(l):Ht(l):l}}class ji extends $i{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=K(t)&&Un(n);if(!this._isShallow){const u=tt(i);if(!Re(s)&&!tt(s)&&(i=z(i),s=z(s)),!o&&ae(i)&&!ae(s))return u||(i.value=s),!0}const l=o?Number(n)e,mn=e=>Reflect.getPrototypeOf(e);function Nl(e,t,n){return function(...s){const r=this.__v_raw,i=z(r),o=It(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?Ps:t?Dt:$e;return!t&&_e(i,"iterate",c?Os:_t),fe(Object.create(u),{next(){const{value:d,done:m}=u.next();return m?{value:d,done:m}:{value:l?[a(d[0]),a(d[1])]:a(d),done:m}}})}}function yn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Fl(e,t){const n={get(r){const i=this.__v_raw,o=z(i),l=z(r);e||(lt(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=mn(o),u=t?Ps:e?Dt:$e;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(z(r),"iterate",_t),r.size},has(r){const i=this.__v_raw,o=z(i),l=z(r);return e||(lt(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=z(l),u=t?Ps:e?Dt:$e;return!e&&_e(c,"iterate",_t),l.forEach((a,d)=>r.call(i,u(a),u(d),o))}};return fe(n,e?{add:yn("add"),set:yn("set"),delete:yn("delete"),clear:yn("clear")}:{add(r){!t&&!Re(r)&&!tt(r)&&(r=z(r));const i=z(this);return mn(i).has.call(i,r)||(i.add(r),ze(i,"add",r,r)),this},set(r,i){!t&&!Re(i)&&!tt(i)&&(i=z(i));const o=z(this),{has:l,get:c}=mn(o);let u=l.call(o,r);u||(r=z(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?lt(i,a)&&ze(o,"set",r,i):ze(o,"add",r,i),this},delete(r){const i=z(this),{has:o,get:l}=mn(i);let c=o.call(i,r);c||(r=z(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&ze(i,"delete",r,void 0),u},clear(){const r=z(this),i=r.size!==0,o=r.clear();return i&&ze(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Nl(r,e,t)}),n}function er(e,t){const n=Fl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const Hl={get:er(!1,!1)},Dl={get:er(!1,!0)},$l={get:er(!0,!1)};const Vi=new WeakMap,ki=new WeakMap,Wi=new WeakMap,jl=new WeakMap;function Vl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function kl(e){return e.__v_skip||!Object.isExtensible(e)?0:Vl(al(e))}function Ht(e){return tt(e)?e:tr(e,!1,Pl,Hl,Vi)}function Wl(e){return tr(e,!1,Il,Dl,ki)}function tn(e){return tr(e,!0,Ll,$l,Wi)}function tr(e,t,n,s,r){if(!Q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=kl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function ct(e){return tt(e)?ct(e.__v_raw):!!(e&&e.__v_isReactive)}function tt(e){return!!(e&&e.__v_isReadonly)}function Re(e){return!!(e&&e.__v_isShallow)}function Yn(e){return e?!!e.__v_raw:!1}function z(e){const t=e&&e.__v_raw;return t?z(t):e}function Mn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&Ei(e,"__v_skip",!0),e}const $e=e=>Q(e)?Ht(e):e,Dt=e=>Q(e)?tn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function He(e){return Ui(e,!1)}function Ee(e){return Ui(e,!0)}function Ui(e,t){return ae(e)?e:new Ul(e,t)}class Ul{constructor(t,n){this.dep=new Gn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:z(t),this._value=n?t:$e(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Re(t)||tt(t);t=s?t:z(t),lt(t,n)&&(this._rawValue=t,this._value=s?t:$e(t),this.dep.trigger())}}function Jn(e){return ae(e)?e.value:e}function ce(e){return q(e)?e():Jn(e)}const Bl={get:(e,t,n)=>t==="__v_raw"?e:Jn(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Bi(e){return ct(e)?e:new Proxy(e,Bl)}class Kl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Gn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function ql(e){return new Kl(e)}class Gl{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._raw=z(t);let r=!0,i=t;if(!K(t)||!Un(String(n)))do r=!Yn(i)||Re(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=Jn(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&ae(this._raw[this._key])){const n=this._object[this._key];if(ae(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return xl(this._raw,this._key)}}class Xl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Yl(e,t,n){return ae(e)?e:q(e)?new Xl(e):Q(e)&&arguments.length>1?Jl(e,t,n):He(e)}function Jl(e,t,n){return new Gl(e,t,n)}class zl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Gn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Zt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return Pi(this,!0),!0}get value(){const t=this.dep.track();return Ni(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Ql(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new zl(s,r,n)}const vn={},Fn=new WeakMap;let mt;function Zl(e,t=!1,n=mt){if(n){let s=Fn.get(n);s||Fn.set(n,s=[]),s.push(e)}}function ec(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Re(g)||r===!1||r===0?Qe(g,1):Qe(g);let a,d,m,_,b=!1,y=!1;if(ae(e)?(d=()=>e.value,b=Re(e)):ct(e)?(d=()=>u(e),b=!0):K(e)?(y=!0,b=e.some(g=>ct(g)||Re(g)),d=()=>e.map(g=>{if(ae(g))return g.value;if(ct(g))return u(g);if(q(g))return c?c(g,2):g()})):q(e)?t?d=c?()=>c(e,2):e:d=()=>{if(m){Ze();try{m()}finally{et()}}const g=mt;mt=a;try{return c?c(e,3,[_]):e(_)}finally{mt=g}}:d=qe,t&&r){const g=d,R=r===!0?1/0:r;d=()=>Qe(g(),R)}const D=Ri(),P=()=>{a.stop(),D&&D.active&&qs(D.effects,a)};if(i&&t){const g=t;t=(...R)=>{g(...R),P()}}let I=y?new Array(e.length).fill(vn):vn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const R=a.run();if(r||b||(y?R.some((j,M)=>lt(j,I[M])):lt(R,I))){m&&m();const j=mt;mt=a;try{const M=[R,I===vn?void 0:y&&I[0]===vn?[]:I,_];I=R,c?c(t,3,M):t(...M)}finally{mt=j}}}else a.run()};return l&&l(p),a=new Mi(d),a.scheduler=o?()=>o(p,!1):p,_=g=>Zl(g,!1,a),m=a.onStop=()=>{const g=Fn.get(a);if(g){if(c)c(g,4);else for(const R of g)R();Fn.delete(a)}},t?s?p(!0):I=a.run():o?o(p.bind(null,!0),!0):a.run(),P.pause=a.pause.bind(a),P.resume=a.resume.bind(a),P.stop=P,P}function Qe(e,t=1/0,n){if(t<=0||!Q(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ae(e))Qe(e.value,t,n);else if(K(e))for(let s=0;s{Qe(s,t,n)});else if(Ti(e)){for(const s in e)Qe(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Qe(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function un(e,t,n,s){try{return s?e(...s):e()}catch(r){fn(r,t,n)}}function je(e,t,n,s){if(q(e)){const r=un(e,t,n,s);return r&&wi(r)&&r.catch(i=>{fn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=we[s],i=nn(r);i=nn(n)?we.push(e):we.splice(nc(t),0,e),e.flags|=1,qi()}}function qi(){Hn||(Hn=Ki.then(Gi))}function sc(e){K(e)?Nt.push(...e):ot&&e.id===-1?ot.splice(Mt+1,0,e):e.flags&1||(Nt.push(e),e.flags|=1),qi()}function Tr(e,t,n=Ue+1){for(;nnn(n)-nn(s));if(Nt.length=0,ot){ot.push(...t);return}for(ot=t,Mt=0;Mte.id==null?e.flags&2?-1:1/0:e.id;function Gi(e){try{for(Ue=0;Ue{s._d&&kn(-1);const i=$n(t);let o;try{o=e(...r)}finally{$n(i),s._d&&kn(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Wu(e,t){if(pe===null)return e;const n=ns(pe),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&q(t)?t.call(s&&s.proxy):t}}function Yi(){return!!(xt()||St)}const oc=Symbol.for("v-scx"),lc=()=>bt(oc);function sr(e,t){return Qn(e,null,t)}function Uu(e,t){return Qn(e,null,{flush:"post"})}function Le(e,t,n){return Qn(e,t,n)}function Qn(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=fe({},n),c=t&&s||!t&&i!=="post";let u;if($t){if(i==="sync"){const _=lc();u=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=qe,_.resume=qe,_.pause=qe,_}}const a=he;l.call=(_,b,y)=>je(_,a,b,y);let d=!1;i==="post"?l.scheduler=_=>{me(_,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(_,b)=>{b?_():nr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),d&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const m=ec(e,t,l);return $t&&(u?u.push(m):c&&m()),m}function cc(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?Ji(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=hn(this),l=Qn(r,i.bind(s),n);return o(),l}function Ji(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,Xt=e=>e&&(e.disabled||e.disabled===""),Er=e=>e&&(e.defer||e.defer===""),xr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Cr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ls=(e,t)=>{const n=e&&e.to;return le(n)?t?t(n):null:n},Zi={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,u){const{mc:a,pc:d,pbc:m,o:{insert:_,querySelector:b,createText:y,createComment:D}}=u,P=Xt(t.props);let{shapeFlag:I,children:p,dynamicChildren:g}=t;if(e==null){const R=t.el=y(""),j=t.anchor=y("");_(R,n,s),_(j,n,s);const M=(T,O)=>{I&16&&a(p,T,O,r,i,o,l,c)},k=()=>{const T=t.target=Ls(t.props,b),O=Is(T,t,y,_);T&&(o!=="svg"&&xr(T)?o="svg":o!=="mathml"&&Cr(T)&&(o="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(T),P||(M(T,O),On(t,!1)))};P&&(M(n,j),On(t,!0)),Er(t.props)?(t.el.__isMounted=!1,me(()=>{k(),delete t.el.__isMounted},i)):k()}else{if(Er(t.props)&&e.el.__isMounted===!1){me(()=>{Zi.process(e,t,n,s,r,i,o,l,c,u)},i);return}t.el=e.el,t.targetStart=e.targetStart;const R=t.anchor=e.anchor,j=t.target=e.target,M=t.targetAnchor=e.targetAnchor,k=Xt(e.props),T=k?n:j,O=k?R:M;if(o==="svg"||xr(j)?o="svg":(o==="mathml"||Cr(j))&&(o="mathml"),g?(m(e.dynamicChildren,g,T,r,i,o,l),cr(e,t,!0)):c||d(e,t,T,O,r,i,o,l,!1),P)k?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):_n(t,n,R,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const A=t.target=Ls(t.props,b);A&&_n(t,A,null,u,0)}else k&&_n(t,j,M,u,1);On(t,P)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:u,targetAnchor:a,target:d,props:m}=e;if(d&&(r(u),r(a)),i&&r(c),o&16){const _=i||!Xt(m);for(let b=0;b{e.isMounted=!0}),oo(()=>{e.isUnmounting=!0}),e}const Me=[Function,Array],eo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Me,onEnter:Me,onAfterEnter:Me,onEnterCancelled:Me,onBeforeLeave:Me,onLeave:Me,onAfterLeave:Me,onLeaveCancelled:Me,onBeforeAppear:Me,onAppear:Me,onAfterAppear:Me,onAppearCancelled:Me},to=e=>{const t=e.subTree;return t.component?to(t.component):t},fc={name:"BaseTransition",props:eo,setup(e,{slots:t}){const n=xt(),s=uc();return()=>{const r=t.default&&ro(t.default(),!0);if(!r||!r.length)return;const i=no(r),o=z(e),{mode:l}=o;if(s.isLeaving)return fs(i);const c=Ar(i);if(!c)return fs(i);let u=Ns(c,o,s,n,d=>u=d);c.type!==de&&sn(c,u);let a=n.subTree&&Ar(n.subTree);if(a&&a.type!==de&&!yt(a,c)&&to(n).type!==de){let d=Ns(a,o,s,n);if(sn(a,d),l==="out-in"&&c.type!==de)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},fs(i);l==="in-out"&&c.type!==de?d.delayLeave=(m,_,b)=>{const y=so(s,a);y[String(a.key)]=a,m[Ke]=()=>{_(),m[Ke]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{b(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function no(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==de){t=n;break}}return t}const dc=fc;function so(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Ns(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:m,onLeave:_,onAfterLeave:b,onLeaveCancelled:y,onBeforeAppear:D,onAppear:P,onAfterAppear:I,onAppearCancelled:p}=t,g=String(e.key),R=so(n,e),j=(T,O)=>{T&&je(T,s,9,O)},M=(T,O)=>{const A=O[1];j(T,O),K(T)?T.every(w=>w.length<=1)&&A():T.length<=1&&A()},k={mode:o,persisted:l,beforeEnter(T){let O=c;if(!n.isMounted)if(i)O=D||c;else return;T[Ke]&&T[Ke](!0);const A=R[g];A&&yt(e,A)&&A.el[Ke]&&A.el[Ke](),j(O,[T])},enter(T){let O=u,A=a,w=d;if(!n.isMounted)if(i)O=P||u,A=I||a,w=p||d;else return;let H=!1;T[Ut]=oe=>{H||(H=!0,oe?j(w,[T]):j(A,[T]),k.delayedLeave&&k.delayedLeave(),T[Ut]=void 0)};const Y=T[Ut].bind(null,!1);O?M(O,[T,Y]):Y()},leave(T,O){const A=String(e.key);if(T[Ut]&&T[Ut](!0),n.isUnmounting)return O();j(m,[T]);let w=!1;T[Ke]=Y=>{w||(w=!0,O(),Y?j(y,[T]):j(b,[T]),T[Ke]=void 0,R[A]===e&&delete R[A])};const H=T[Ke].bind(null,!1);R[A]=e,_?M(_,[T,H]):H()},clone(T){const O=Ns(T,t,n,s,r);return r&&r(O),O}};return k}function fs(e){if(dn(e))return e=at(e),e.children=null,e}function Ar(e){if(!dn(e))return Qi(e.type)&&e.children?no(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function sn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,sn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ro(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iFt(y,t&&(K(t)?t[D]:t),n,s,r));return}if(wt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Ft(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?ns(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,d=l.setupState,m=z(d),_=d===ne?_i:y=>Rr(a,y)?!1:Z(m,y),b=(y,D)=>!(D&&Rr(a,D));if(u!=null&&u!==c){if(Mr(t),le(u))a[u]=null,_(u)&&(d[u]=null);else if(ae(u)){const y=t;b(u,y.k)&&(u.value=null),y.k&&(a[y.k]=null)}}if(q(c))un(c,l,12,[o,a]);else{const y=le(c),D=ae(c);if(y||D){const P=()=>{if(e.f){const I=y?_(c)?d[c]:a[c]:b()||!e.k?c.value:a[e.k];if(r)K(I)&&qs(I,i);else if(K(I))I.includes(i)||I.push(i);else if(y)a[c]=[i],_(c)&&(d[c]=a[c]);else{const p=[i];b(c,e.k)&&(c.value=p),e.k&&(a[e.k]=p)}}else y?(a[c]=o,_(c)&&(d[c]=o)):D&&(b(c,e.k)&&(c.value=o),e.k&&(a[e.k]=o))};if(o){const I=()=>{P(),jn.delete(e)};I.id=-1,jn.set(e,I),me(I,n)}else Mr(e),P()}}}function Mr(e){const t=jn.get(e);t&&(t.flags|=8,jn.delete(e))}let Or=!1;const Rt=()=>{Or||(console.error("Hydration completed but contains mismatches."),Or=!0)},hc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",pc=e=>e.namespaceURI.includes("MathML"),bn=e=>{if(e.nodeType===1){if(hc(e))return"svg";if(pc(e))return"mathml"}},Pt=e=>e.nodeType===8;function gc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),Dn(),g._vnode=p;return}d(g.firstChild,p,null,null,null),Dn(),g._vnode=p},d=(p,g,R,j,M,k=!1)=>{k=k||!!g.dynamicChildren;const T=Pt(p)&&p.data==="[",O=()=>y(p,g,R,j,M,T),{type:A,ref:w,shapeFlag:H,patchFlag:Y}=g;let oe=p.nodeType;g.el=p,Y===-2&&(k=!1,g.dynamicChildren=null);let U=null;switch(A){case Tt:oe!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=O():(p.data!==g.children&&(Rt(),p.data=g.children),U=i(p));break;case de:I(p)?(U=i(p),P(g.el=p.content.firstChild,p,R)):oe!==8||T?U=O():U=i(p);break;case Jt:if(T&&(p=i(p),oe=p.nodeType),oe===1||oe===3){U=p;const X=!g.children.length;for(let V=0;V{k=k||!!g.dynamicChildren;const{type:T,props:O,patchFlag:A,shapeFlag:w,dirs:H,transition:Y}=g,oe=T==="input"||T==="option";if(oe||A!==-1){H&&Be(g,null,R,"created");let U=!1;if(I(p)){U=Ao(null,Y)&&R&&R.vnode.props&&R.vnode.props.appear;const V=p.content.firstChild;if(U){const te=V.getAttribute("class");te&&(V.$cls=te),Y.beforeEnter(V)}P(V,p,R),g.el=p=V}if(w&16&&!(O&&(O.innerHTML||O.textContent))){let V=_(p.firstChild,g,p,R,j,M,k);for(;V;){wn(p,1)||Rt();const te=V;V=V.nextSibling,l(te)}}else if(w&8){let V=g.children;V[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(V=V.slice(1));const{textContent:te}=p;te!==V&&te!==V.replace(/\r\n|\r/g,` +`)&&(wn(p,0)||Rt(),p.textContent=g.children)}if(O){if(oe||!k||A&48){const V=p.tagName.includes("-");for(const te in O)(oe&&(te.endsWith("value")||te==="indeterminate")||cn(te)&&!vt(te)||te[0]==="."||V&&!vt(te))&&s(p,te,null,O[te],void 0,R)}else if(O.onClick)s(p,"onClick",null,O.onClick,void 0,R);else if(A&4&&ct(O.style))for(const V in O.style)O.style[V]}let X;(X=O&&O.onVnodeBeforeMount)&&Oe(X,R,g),H&&Be(g,null,R,"beforeMount"),((X=O&&O.onVnodeMounted)||H||U)&&Po(()=>{X&&Oe(X,R,g),U&&Y.enter(p),H&&Be(g,null,R,"mounted")},j)}return p.nextSibling},_=(p,g,R,j,M,k,T)=>{T=T||!!g.dynamicChildren;const O=g.children,A=O.length;for(let w=0;w{const{slotScopeIds:T}=g;T&&(M=M?M.concat(T):T);const O=o(p),A=_(i(p),g,O,R,j,M,k);return A&&Pt(A)&&A.data==="]"?i(g.anchor=A):(Rt(),c(g.anchor=u("]"),O,A),A)},y=(p,g,R,j,M,k)=>{if(wn(p.parentElement,1)||Rt(),g.el=null,k){const A=D(p);for(;;){const w=i(p);if(w&&w!==A)l(w);else break}}const T=i(p),O=o(p);return l(p),n(null,g,O,T,R,j,bn(O),M),R&&(R.vnode.el=g.el,yo(R,g.el)),T},D=(p,g="[",R="]")=>{let j=0;for(;p;)if(p=i(p),p&&Pt(p)&&(p.data===g&&j++,p.data===R)){if(j===0)return i(p);j--}return p},P=(p,g,R)=>{const j=g.parentNode;j&&j.replaceChild(p,g);let M=R;for(;M;)M.vnode.el===g&&(M.vnode.el=M.subTree.el=p),M=M.parent},I=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}const Pr="data-allow-mismatch",mc={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function wn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Pr);)e=e.parentElement;const n=e&&e.getAttribute(Pr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(mc[t])}}qn().requestIdleCallback;qn().cancelIdleCallback;function yc(e,t){if(Pt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(Pt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const wt=e=>!!e.type.__asyncLoader;function Ku(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let u=null,a,d=0;const m=()=>(d++,u=null,_()),_=()=>{let b;return u||(b=u=t().catch(y=>{if(y=y instanceof Error?y:new Error(String(y)),c)return new Promise((D,P)=>{c(y,()=>D(m()),()=>P(y),d+1)});throw y}).then(y=>b!==u&&u?u:(y&&(y.__esModule||y[Symbol.toStringTag]==="Module")&&(y=y.default),a=y,y)))};return rr({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(b,y,D){let P=!1;(y.bu||(y.bu=[])).push(()=>P=!0);const I=()=>{P||D()},p=i?()=>{const g=i(I,R=>yc(b,R));g&&(y.bum||(y.bum=[])).push(g)}:I;a?p():_().then(()=>!y.isUnmounted&&p())},get __asyncResolved(){return a},setup(){const b=he;if(ir(b),a)return()=>Sn(a,b);const y=p=>{u=null,fn(p,b,13,!s)};if(l&&b.suspense||$t)return _().then(p=>()=>Sn(p,b)).catch(p=>(y(p),()=>s?ue(s,{error:p}):null));const D=He(!1),P=He(),I=He(!!r);return r&&setTimeout(()=>{I.value=!1},r),o!=null&&setTimeout(()=>{if(!D.value&&!P.value){const p=new Error(`Async component timed out after ${o}ms.`);y(p),P.value=p}},o),_().then(()=>{D.value=!0,b.parent&&dn(b.parent.vnode)&&b.parent.update()}).catch(p=>{y(p),P.value=p}),()=>{if(D.value&&a)return Sn(a,b);if(P.value&&s)return ue(s,{error:P.value});if(n&&!I.value)return Sn(n,b)}}})}function Sn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=ue(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const dn=e=>e.type.__isKeepAlive;function vc(e,t){io(e,"a",t)}function _c(e,t){io(e,"da",t)}function io(e,t,n=he){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Zn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)dn(r.parent.vnode)&&bc(s,t,n,r),r=r.parent}}function bc(e,t,n,s){const r=Zn(t,e,s,!0);es(()=>{qs(s[t],r)},n)}function Zn(e,t,n=he,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ze();const l=hn(n),c=je(t,n,e,o);return l(),et(),c});return s?r.unshift(i):r.push(i),i}}const st=e=>(t,n=he)=>{(!$t||e==="sp")&&Zn(e,(...s)=>t(...s),n)},wc=st("bm"),jt=st("m"),Sc=st("bu"),Tc=st("u"),oo=st("bum"),es=st("um"),Ec=st("sp"),xc=st("rtg"),Cc=st("rtc");function Ac(e,t=he){Zn("ec",e,t)}const lo="components";function qu(e,t){return ao(lo,e,!0,t)||e}const co=Symbol.for("v-ndc");function Gu(e){return le(e)?ao(lo,e,!1)||e:e||co}function ao(e,t,n=!0,s=!1){const r=pe||he;if(r){const i=r.type;{const l=ca(i,!1);if(l&&(l===t||l===Ie(t)||l===Kn(Ie(t))))return i}const o=Lr(r[e]||i[e],t)||Lr(r.appContext[e],t);return!o&&s?i:o}}function Lr(e,t){return e&&(e[t]||e[Ie(t)]||e[Kn(Ie(t))])}function Xu(e,t,n,s){let r;const i=n,o=K(e);if(o||le(e)){const l=o&&ct(e);let c=!1,u=!1;l&&(c=!Re(e),u=tt(e),e=Xn(e)),r=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;c0;return t!=="default"&&(n.name=t),js(),Vs(Se,null,[ue("slot",n,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),js();const o=i&&uo(i(n)),l=n.key||o&&o.key,c=Vs(Se,{key:(l&&!De(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function uo(e){return e.some(t=>on(t)?!(t.type===de||t.type===Se&&!uo(t.children)):!0)?e:null}function Ju(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:An(s)]=e[s];return n}const Fs=e=>e?Ho(e)?ns(e):Fs(e.parent):null,Yt=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Fs(e.parent),$root:e=>Fs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>ho(e),$forceUpdate:e=>e.f||(e.f=()=>{nr(e.update)}),$nextTick:e=>e.n||(e.n=zn.bind(e.proxy)),$watch:e=>cc.bind(e)}),ds=(e,t)=>e!==ne&&!e.__isScriptSetup&&Z(e,t),Rc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ds(s,t))return o[t]=1,s[t];if(r!==ne&&Z(r,t))return o[t]=2,r[t];if(Z(i,t))return o[t]=3,i[t];if(n!==ne&&Z(n,t))return o[t]=4,n[t];Hs&&(o[t]=0)}}const u=Yt[t];let a,d;if(u)return t==="$attrs"&&_e(e.attrs,"get",""),u(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(n!==ne&&Z(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,Z(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ds(r,t)?(r[t]=n,!0):s!==ne&&Z(s,t)?(s[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==ne&&l[0]!=="$"&&Z(e,l)||ds(t,l)||Z(i,l)||Z(s,l)||Z(Yt,l)||Z(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function zu(){return Mc().slots}function Mc(e){const t=xt();return t.setupContext||(t.setupContext=$o(t))}function Ir(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Hs=!0;function Oc(e){const t=ho(e),n=e.proxy,s=e.ctx;Hs=!1,t.beforeCreate&&Nr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:d,mounted:m,beforeUpdate:_,updated:b,activated:y,deactivated:D,beforeDestroy:P,beforeUnmount:I,destroyed:p,unmounted:g,render:R,renderTracked:j,renderTriggered:M,errorCaptured:k,serverPrefetch:T,expose:O,inheritAttrs:A,components:w,directives:H,filters:Y}=t;if(u&&Pc(u,s,null),o)for(const X in o){const V=o[X];q(V)&&(s[X]=V.bind(n))}if(r){const X=r.call(n,n);Q(X)&&(e.data=Ht(X))}if(Hs=!0,i)for(const X in i){const V=i[X],te=q(V)?V.bind(n,n):q(V.get)?V.get.bind(n,n):qe,pn=!q(V)&&q(V.set)?V.set.bind(n):qe,dt=ie({get:te,set:pn});Object.defineProperty(s,X,{enumerable:!0,configurable:!0,get:()=>dt.value,set:ke=>dt.value=ke})}if(l)for(const X in l)fo(l[X],s,n,X);if(c){const X=q(c)?c.call(n):c;Reflect.ownKeys(X).forEach(V=>{ic(V,X[V])})}a&&Nr(a,e,"c");function U(X,V){K(V)?V.forEach(te=>X(te.bind(n))):V&&X(V.bind(n))}if(U(wc,d),U(jt,m),U(Sc,_),U(Tc,b),U(vc,y),U(_c,D),U(Ac,k),U(Cc,j),U(xc,M),U(oo,I),U(es,g),U(Ec,T),K(O))if(O.length){const X=e.exposed||(e.exposed={});O.forEach(V=>{Object.defineProperty(X,V,{get:()=>n[V],set:te=>n[V]=te,enumerable:!0})})}else e.exposed||(e.exposed={});R&&e.render===qe&&(e.render=R),A!=null&&(e.inheritAttrs=A),w&&(e.components=w),H&&(e.directives=H),T&&ir(e)}function Pc(e,t,n=qe){K(e)&&(e=Ds(e));for(const s in e){const r=e[s];let i;Q(r)?"default"in r?i=bt(r.from||s,r.default,!0):i=bt(r.from||s):i=bt(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Nr(e,t,n){je(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function fo(e,t,n,s){let r=s.includes(".")?Ji(n,s):()=>n[s];if(le(e)){const i=t[e];q(i)&&Le(r,i)}else if(q(e))Le(r,e.bind(n));else if(Q(e))if(K(e))e.forEach(i=>fo(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Le(r,i,e)}}function ho(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>Vn(c,u,o,!0)),Vn(c,t,o)),Q(t)&&i.set(t,c),c}function Vn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Vn(e,i,n,!0),r&&r.forEach(o=>Vn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Lc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Lc={data:Fr,props:Hr,emits:Hr,methods:Kt,computed:Kt,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:Kt,directives:Kt,watch:Nc,provide:Fr,inject:Ic};function Fr(e,t){return t?e?function(){return fe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Ic(e,t){return Kt(Ds(e),Ds(t))}function Ds(e){if(K(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ie(t)}Modifiers`]||e[`${ft(t)}Modifiers`];function $c(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&Dc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>le(a)?a.trim():a)),o.number&&(r=n.map(Gs)));let l,c=s[l=An(t)]||s[l=An(Ie(t))];!c&&i&&(c=s[l=An(ft(t))]),c&&je(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(u,e,6,r)}}const jc=new WeakMap;function go(e,t,n=!1){const s=n?jc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=u=>{const a=go(u,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Q(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):fe(o,i),Q(e)&&s.set(e,o),o)}function ts(e,t){return!e||!cn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ft(t))||Z(e,t))}function hs(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:d,data:m,setupState:_,ctx:b,inheritAttrs:y}=e,D=$n(e);let P,I;try{if(n.shapeFlag&4){const g=r||s,R=g;P=Pe(u.call(R,g,a,d,_,m,b)),I=l}else{const g=t;P=Pe(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),I=t.props?l:Vc(l)}}catch(g){zt.length=0,fn(g,e,1),P=ue(de)}let p=P;if(I&&y!==!1){const g=Object.keys(I),{shapeFlag:R}=p;g.length&&R&7&&(i&&g.some(Ks)&&(I=kc(I,i)),p=at(p,I,!1,!0))}return n.dirs&&(p=at(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&sn(p,n.transition),P=p,$n(D),P}const Vc=e=>{let t;for(const n in e)(n==="class"||n==="style"||cn(n))&&((t||(t={}))[n]=e[n]);return t},kc=(e,t)=>{const n={};for(const s in e)(!Ks(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Wc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Dr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;dObject.create(vo),bo=e=>Object.getPrototypeOf(e)===vo;function Uc(e,t,n,s=!1){const r={},i=_o();e.propsDefaults=Object.create(null),wo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Wl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Bc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=z(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[m,_]=So(d,t,!0);fe(o,m),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return Q(e)&&s.set(e,Lt),Lt;if(K(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",lr=e=>K(e)?e.map(Pe):[Pe(e)],qc=(e,t,n)=>{if(t._n)return t;const s=rc((...r)=>lr(t(...r)),n);return s._c=!1,s},To=(e,t,n)=>{const s=e._ctx;for(const r in e){if(or(r))continue;const i=e[r];if(q(i))t[r]=qc(r,i,s);else if(i!=null){const o=lr(i);t[r]=()=>o}}},Eo=(e,t)=>{const n=lr(t);e.slots.default=()=>n},xo=(e,t,n)=>{for(const s in t)(n||!or(s))&&(e[s]=t[s])},Gc=(e,t,n)=>{const s=e.slots=_o();if(e.vnode.shapeFlag&32){const r=t._;r?(xo(s,t,n),n&&Ei(s,"_",r,!0)):To(t,s)}else t&&Eo(e,t)},Xc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:xo(r,t,n):(i=!t.$stable,To(t,r)),o=t}else t&&(Eo(e,t),o={default:1});if(i)for(const l in r)!or(l)&&o[l]==null&&delete r[l]},me=Po;function Yc(e){return Co(e)}function Jc(e){return Co(e,gc)}function Co(e,t){const n=qn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:d,nextSibling:m,setScopeId:_=qe,insertStaticContent:b}=e,y=(f,h,v,C=null,S=null,E=null,F=void 0,N=null,L=!!h.dynamicChildren)=>{if(f===h)return;f&&!yt(f,h)&&(C=gn(f),ke(f,S,E,!0),f=null),h.patchFlag===-2&&(L=!1,h.dynamicChildren=null);const{type:x,ref:B,shapeFlag:$}=h;switch(x){case Tt:D(f,h,v,C);break;case de:P(f,h,v,C);break;case Jt:f==null&&I(h,v,C,F);break;case Se:w(f,h,v,C,S,E,F,N,L);break;default:$&1?R(f,h,v,C,S,E,F,N,L):$&6?H(f,h,v,C,S,E,F,N,L):($&64||$&128)&&x.process(f,h,v,C,S,E,F,N,L,Ct)}B!=null&&S?Ft(B,f&&f.ref,E,h||f,!h):B==null&&f&&f.ref!=null&&Ft(f.ref,null,E,f,!0)},D=(f,h,v,C)=>{if(f==null)s(h.el=l(h.children),v,C);else{const S=h.el=f.el;h.children!==f.children&&u(S,h.children)}},P=(f,h,v,C)=>{f==null?s(h.el=c(h.children||""),v,C):h.el=f.el},I=(f,h,v,C)=>{[f.el,f.anchor]=b(f.children,h,v,C,f.el,f.anchor)},p=({el:f,anchor:h},v,C)=>{let S;for(;f&&f!==h;)S=m(f),s(f,v,C),f=S;s(h,v,C)},g=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=m(f),r(f),f=v;r(h)},R=(f,h,v,C,S,E,F,N,L)=>{if(h.type==="svg"?F="svg":h.type==="math"&&(F="mathml"),f==null)j(h,v,C,S,E,F,N,L);else{const x=f.el&&f.el._isVueCE?f.el:null;try{x&&x._beginPatch(),T(f,h,S,E,F,N,L)}finally{x&&x._endPatch()}}},j=(f,h,v,C,S,E,F,N)=>{let L,x;const{props:B,shapeFlag:$,transition:W,dirs:G}=f;if(L=f.el=o(f.type,E,B&&B.is,B),$&8?a(L,f.children):$&16&&k(f.children,L,null,C,S,ps(f,E),F,N),G&&Be(f,null,C,"created"),M(L,f,f.scopeId,F,C),B){for(const se in B)se!=="value"&&!vt(se)&&i(L,se,null,B[se],E,C);"value"in B&&i(L,"value",null,B.value,E),(x=B.onVnodeBeforeMount)&&Oe(x,C,f)}G&&Be(f,null,C,"beforeMount");const J=Ao(S,W);J&&W.beforeEnter(L),s(L,h,v),((x=B&&B.onVnodeMounted)||J||G)&&me(()=>{x&&Oe(x,C,f),J&&W.enter(L),G&&Be(f,null,C,"mounted")},S)},M=(f,h,v,C,S)=>{if(v&&_(f,v),C)for(let E=0;E{for(let x=L;x{const N=h.el=f.el;let{patchFlag:L,dynamicChildren:x,dirs:B}=h;L|=f.patchFlag&16;const $=f.props||ne,W=h.props||ne;let G;if(v&&ht(v,!1),(G=W.onVnodeBeforeUpdate)&&Oe(G,v,h,f),B&&Be(h,f,v,"beforeUpdate"),v&&ht(v,!0),($.innerHTML&&W.innerHTML==null||$.textContent&&W.textContent==null)&&a(N,""),x?O(f.dynamicChildren,x,N,v,C,ps(h,S),E):F||V(f,h,N,null,v,C,ps(h,S),E,!1),L>0){if(L&16)A(N,$,W,v,S);else if(L&2&&$.class!==W.class&&i(N,"class",null,W.class,S),L&4&&i(N,"style",$.style,W.style,S),L&8){const J=h.dynamicProps;for(let se=0;se{G&&Oe(G,v,h,f),B&&Be(h,f,v,"updated")},C)},O=(f,h,v,C,S,E,F)=>{for(let N=0;N{if(h!==v){if(h!==ne)for(const E in h)!vt(E)&&!(E in v)&&i(f,E,h[E],null,S,C);for(const E in v){if(vt(E))continue;const F=v[E],N=h[E];F!==N&&E!=="value"&&i(f,E,N,F,S,C)}"value"in v&&i(f,"value",h.value,v.value,S)}},w=(f,h,v,C,S,E,F,N,L)=>{const x=h.el=f?f.el:l(""),B=h.anchor=f?f.anchor:l("");let{patchFlag:$,dynamicChildren:W,slotScopeIds:G}=h;G&&(N=N?N.concat(G):G),f==null?(s(x,v,C),s(B,v,C),k(h.children||[],v,B,S,E,F,N,L)):$>0&&$&64&&W&&f.dynamicChildren&&f.dynamicChildren.length===W.length?(O(f.dynamicChildren,W,v,S,E,F,N),(h.key!=null||S&&h===S.subTree)&&cr(f,h,!0)):V(f,h,v,B,S,E,F,N,L)},H=(f,h,v,C,S,E,F,N,L)=>{h.slotScopeIds=N,f==null?h.shapeFlag&512?S.ctx.activate(h,v,C,F,L):Y(h,v,C,S,E,F,L):oe(f,h,L)},Y=(f,h,v,C,S,E,F)=>{const N=f.component=ra(f,C,S);if(dn(f)&&(N.ctx.renderer=Ct),ia(N,!1,F),N.asyncDep){if(S&&S.registerDep(N,U,F),!f.el){const L=N.subTree=ue(de);P(null,L,h,v),f.placeholder=L.el}}else U(N,f,h,v,S,E,F)},oe=(f,h,v)=>{const C=h.component=f.component;if(Wc(f,h,v))if(C.asyncDep&&!C.asyncResolved){X(C,h,v);return}else C.next=h,C.update();else h.el=f.el,C.vnode=h},U=(f,h,v,C,S,E,F)=>{const N=()=>{if(f.isMounted){let{next:$,bu:W,u:G,parent:J,vnode:se}=f;{const xe=Ro(f);if(xe){$&&($.el=se.el,X(f,$,F)),xe.asyncDep.then(()=>{me(()=>{f.isUnmounted||x()},S)});return}}let ee=$,Te;ht(f,!1),$?($.el=se.el,X(f,$,F)):$=se,W&&Rn(W),(Te=$.props&&$.props.onVnodeBeforeUpdate)&&Oe(Te,J,$,se),ht(f,!0);const ge=hs(f),Ne=f.subTree;f.subTree=ge,y(Ne,ge,d(Ne.el),gn(Ne),f,S,E),$.el=ge.el,ee===null&&yo(f,ge.el),G&&me(G,S),(Te=$.props&&$.props.onVnodeUpdated)&&me(()=>Oe(Te,J,$,se),S)}else{let $;const{el:W,props:G}=h,{bm:J,m:se,parent:ee,root:Te,type:ge}=f,Ne=wt(h);if(ht(f,!1),J&&Rn(J),!Ne&&($=G&&G.onVnodeBeforeMount)&&Oe($,ee,h),ht(f,!0),W&&os){const xe=()=>{f.subTree=hs(f),os(W,f.subTree,f,S,null)};Ne&&ge.__asyncHydrate?ge.__asyncHydrate(W,f,xe):xe()}else{Te.ce&&Te.ce._hasShadowRoot()&&Te.ce._injectChildStyle(ge);const xe=f.subTree=hs(f);y(null,xe,v,C,f,S,E),h.el=xe.el}if(se&&me(se,S),!Ne&&($=G&&G.onVnodeMounted)){const xe=h;me(()=>Oe($,ee,xe),S)}(h.shapeFlag&256||ee&&wt(ee.vnode)&&ee.vnode.shapeFlag&256)&&f.a&&me(f.a,S),f.isMounted=!0,h=v=C=null}};f.scope.on();const L=f.effect=new Mi(N);f.scope.off();const x=f.update=L.run.bind(L),B=f.job=L.runIfDirty.bind(L);B.i=f,B.id=f.uid,L.scheduler=()=>nr(B),ht(f,!0),x()},X=(f,h,v)=>{h.component=f;const C=f.vnode.props;f.vnode=h,f.next=null,Bc(f,h.props,C,v),Xc(f,h.children,v),Ze(),Tr(f),et()},V=(f,h,v,C,S,E,F,N,L=!1)=>{const x=f&&f.children,B=f?f.shapeFlag:0,$=h.children,{patchFlag:W,shapeFlag:G}=h;if(W>0){if(W&128){pn(x,$,v,C,S,E,F,N,L);return}else if(W&256){te(x,$,v,C,S,E,F,N,L);return}}G&8?(B&16&&Vt(x,S,E),$!==x&&a(v,$)):B&16?G&16?pn(x,$,v,C,S,E,F,N,L):Vt(x,S,E,!0):(B&8&&a(v,""),G&16&&k($,v,C,S,E,F,N,L))},te=(f,h,v,C,S,E,F,N,L)=>{f=f||Lt,h=h||Lt;const x=f.length,B=h.length,$=Math.min(x,B);let W;for(W=0;W<$;W++){const G=h[W]=L?Je(h[W]):Pe(h[W]);y(f[W],G,v,null,S,E,F,N,L)}x>B?Vt(f,S,E,!0,!1,$):k(h,v,C,S,E,F,N,L,$)},pn=(f,h,v,C,S,E,F,N,L)=>{let x=0;const B=h.length;let $=f.length-1,W=B-1;for(;x<=$&&x<=W;){const G=f[x],J=h[x]=L?Je(h[x]):Pe(h[x]);if(yt(G,J))y(G,J,v,null,S,E,F,N,L);else break;x++}for(;x<=$&&x<=W;){const G=f[$],J=h[W]=L?Je(h[W]):Pe(h[W]);if(yt(G,J))y(G,J,v,null,S,E,F,N,L);else break;$--,W--}if(x>$){if(x<=W){const G=W+1,J=GW)for(;x<=$;)ke(f[x],S,E,!0),x++;else{const G=x,J=x,se=new Map;for(x=J;x<=W;x++){const Ce=h[x]=L?Je(h[x]):Pe(h[x]);Ce.key!=null&&se.set(Ce.key,x)}let ee,Te=0;const ge=W-J+1;let Ne=!1,xe=0;const kt=new Array(ge);for(x=0;x=ge){ke(Ce,S,E,!0);continue}let We;if(Ce.key!=null)We=se.get(Ce.key);else for(ee=J;ee<=W;ee++)if(kt[ee-J]===0&&yt(Ce,h[ee])){We=ee;break}We===void 0?ke(Ce,S,E,!0):(kt[We-J]=x+1,We>=xe?xe=We:Ne=!0,y(Ce,h[We],v,null,S,E,F,N,L),Te++)}const mr=Ne?zc(kt):Lt;for(ee=mr.length-1,x=ge-1;x>=0;x--){const Ce=J+x,We=h[Ce],yr=h[Ce+1],vr=Ce+1{const{el:E,type:F,transition:N,children:L,shapeFlag:x}=f;if(x&6){dt(f.component.subTree,h,v,C);return}if(x&128){f.suspense.move(h,v,C);return}if(x&64){F.move(f,h,v,Ct);return}if(F===Se){s(E,h,v);for(let $=0;$N.enter(E),S);else{const{leave:$,delayLeave:W,afterLeave:G}=N,J=()=>{f.ctx.isUnmounted?r(E):s(E,h,v)},se=()=>{E._isLeaving&&E[Ke](!0),$(E,()=>{J(),G&&G()})};W?W(E,J,se):se()}else s(E,h,v)},ke=(f,h,v,C=!1,S=!1)=>{const{type:E,props:F,ref:N,children:L,dynamicChildren:x,shapeFlag:B,patchFlag:$,dirs:W,cacheIndex:G}=f;if($===-2&&(S=!1),N!=null&&(Ze(),Ft(N,null,v,f,!0),et()),G!=null&&(h.renderCache[G]=void 0),B&256){h.ctx.deactivate(f);return}const J=B&1&&W,se=!wt(f);let ee;if(se&&(ee=F&&F.onVnodeBeforeUnmount)&&Oe(ee,h,f),B&6)ll(f.component,v,C);else{if(B&128){f.suspense.unmount(v,C);return}J&&Be(f,null,h,"beforeUnmount"),B&64?f.type.remove(f,h,v,Ct,C):x&&!x.hasOnce&&(E!==Se||$>0&&$&64)?Vt(x,h,v,!1,!0):(E===Se&&$&384||!S&&B&16)&&Vt(L,h,v),C&&pr(f)}(se&&(ee=F&&F.onVnodeUnmounted)||J)&&me(()=>{ee&&Oe(ee,h,f),J&&Be(f,null,h,"unmounted")},v)},pr=f=>{const{type:h,el:v,anchor:C,transition:S}=f;if(h===Se){ol(v,C);return}if(h===Jt){g(f);return}const E=()=>{r(v),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(f.shapeFlag&1&&S&&!S.persisted){const{leave:F,delayLeave:N}=S,L=()=>F(v,E);N?N(f.el,E,L):L()}else E()},ol=(f,h)=>{let v;for(;f!==h;)v=m(f),r(f),f=v;r(h)},ll=(f,h,v)=>{const{bum:C,scope:S,job:E,subTree:F,um:N,m:L,a:x}=f;jr(L),jr(x),C&&Rn(C),S.stop(),E&&(E.flags|=8,ke(F,f,h,v)),N&&me(N,h),me(()=>{f.isUnmounted=!0},h)},Vt=(f,h,v,C=!1,S=!1,E=0)=>{for(let F=E;F{if(f.shapeFlag&6)return gn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=m(f.anchor||f.el),v=h&&h[zi];return v?m(v):h};let rs=!1;const gr=(f,h,v)=>{let C;f==null?h._vnode&&(ke(h._vnode,null,null,!0),C=h._vnode.component):y(h._vnode||null,f,h,null,null,null,v),h._vnode=f,rs||(rs=!0,Tr(C),Dn(),rs=!1)},Ct={p:y,um:ke,m:dt,r:pr,mt:Y,mc:k,pc:V,pbc:O,n:gn,o:e};let is,os;return t&&([is,os]=t(Ct)),{render:gr,hydrate:is,createApp:Hc(gr,is)}}function ps({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ht({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ao(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function cr(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ro(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ro(t)}function jr(e){if(e)for(let t=0;te.__isSuspense;function Po(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):sc(e)}const Se=Symbol.for("v-fgt"),Tt=Symbol.for("v-txt"),de=Symbol.for("v-cmt"),Jt=Symbol.for("v-stc"),zt=[];let Ae=null;function js(e=!1){zt.push(Ae=e?null:[])}function Qc(){zt.pop(),Ae=zt[zt.length-1]||null}let rn=1;function kn(e,t=!1){rn+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function Lo(e){return e.dynamicChildren=rn>0?Ae||Lt:null,Qc(),rn>0&&Ae&&Ae.push(e),e}function Qu(e,t,n,s,r,i){return Lo(No(e,t,n,s,r,i,!0))}function Vs(e,t,n,s,r){return Lo(ue(e,t,n,s,r,!0))}function on(e){return e?e.__v_isVNode===!0:!1}function yt(e,t){return e.type===t.type&&e.key===t.key}const Io=({key:e})=>e??null,Pn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||ae(e)||q(e)?{i:pe,r:e,k:t,f:!!n}:e:null);function No(e,t=null,n=null,s=0,r=null,i=e===Se?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Io(t),ref:t&&Pn(t),scopeId:Xi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:pe};return l?(ar(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),rn>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ue=Zc;function Zc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===co)&&(e=de),on(e)){const l=at(e,t,!0);return n&&ar(l,n),rn>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(aa(e)&&(e=e.__vccOpts),t){t=ea(t);let{class:l,style:c}=t;l&&!le(l)&&(t.class=Ys(l)),Q(c)&&(Yn(c)&&!K(c)&&(c=fe({},c)),t.style=Xs(c))}const o=le(e)?1:Oo(e)?128:Qi(e)?64:Q(e)?4:q(e)?2:0;return No(e,t,n,s,r,o,i,!0)}function ea(e){return e?Yn(e)||bo(e)?fe({},e):e:null}function at(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?ta(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Io(u),ref:t&&t.ref?n&&i?K(i)?i.concat(Pn(t)):[i,Pn(t)]:Pn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Se?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&at(e.ssContent),ssFallback:e.ssFallback&&at(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&sn(a,c.clone(a)),a}function Fo(e=" ",t=0){return ue(Tt,null,e,t)}function Zu(e,t){const n=ue(Jt,null,e);return n.staticCount=t,n}function ef(e="",t=!1){return t?(js(),Vs(de,null,e)):ue(de,null,e)}function Pe(e){return e==null||typeof e=="boolean"?ue(de):K(e)?ue(Se,null,e.slice()):on(e)?Je(e):ue(Tt,null,String(e))}function Je(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:at(e)}function ar(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ar(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!bo(t)?t._ctx=pe:r===3&&pe&&(pe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:pe},n=32):(t=String(t),s&64?(n=16,t=[Fo(t)]):n=8);e.children=t,e.shapeFlag|=n}function ta(...e){const t={};for(let n=0;nhe||pe;let Wn,ks;{const e=qn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Wn=t("__VUE_INSTANCE_SETTERS__",n=>he=n),ks=t("__VUE_SSR_SETTERS__",n=>$t=n)}const hn=e=>{const t=he;return Wn(e),e.scope.on(),()=>{e.scope.off(),Wn(t)}},Vr=()=>{he&&he.scope.off(),Wn(null)};function Ho(e){return e.vnode.shapeFlag&4}let $t=!1;function ia(e,t=!1,n=!1){t&&ks(t);const{props:s,children:r}=e.vnode,i=Ho(e);Uc(e,s,i,t),Gc(e,r,n||t);const o=i?oa(e,t):void 0;return t&&ks(!1),o}function oa(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Rc);const{setup:s}=n;if(s){Ze();const r=e.setupContext=s.length>1?$o(e):null,i=hn(e),o=un(s,e,0,[e.props,r]),l=wi(o);if(et(),i(),(l||e.sp)&&!wt(e)&&ir(e),l){if(o.then(Vr,Vr),t)return o.then(c=>{kr(e,c)}).catch(c=>{fn(c,e,0)});e.asyncDep=o}else kr(e,o)}else Do(e)}function kr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Q(t)&&(e.setupState=Bi(t)),Do(e)}function Do(e,t,n){const s=e.type;e.render||(e.render=s.render||qe);{const r=hn(e);Ze();try{Oc(e)}finally{et(),r()}}}const la={get(e,t){return _e(e,"get",""),e[t]}};function $o(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,la),slots:e.slots,emit:e.emit,expose:t}}function ns(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Bi(Mn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Yt)return Yt[n](e)},has(t,n){return n in t||n in Yt}})):e.proxy}function ca(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function aa(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>Ql(e,t,$t);function Ws(e,t,n){try{kn(-1);const s=arguments.length;return s===2?Q(t)&&!K(t)?on(t)?ue(e,null,[t]):ue(e,t):ue(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&on(n)&&(n=[n]),ue(e,t,n))}finally{kn(1)}}const ua="3.5.28";/** +* @vue/runtime-dom v3.5.28 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Us;const Wr=typeof window<"u"&&window.trustedTypes;if(Wr)try{Us=Wr.createPolicy("vue",{createHTML:e=>e})}catch{}const jo=Us?e=>Us.createHTML(e):e=>e,fa="http://www.w3.org/2000/svg",da="http://www.w3.org/1998/Math/MathML",Ye=typeof document<"u"?document:null,Ur=Ye&&Ye.createElement("template"),ha={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Ye.createElementNS(fa,e):t==="mathml"?Ye.createElementNS(da,e):n?Ye.createElement(e,{is:n}):Ye.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ye.createTextNode(e),createComment:e=>Ye.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ye.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Ur.innerHTML=jo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Ur.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},rt="transition",Bt="animation",ln=Symbol("_vtc"),Vo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},pa=fe({},eo,Vo),ga=e=>(e.displayName="Transition",e.props=pa,e),tf=ga((e,{slots:t})=>Ws(dc,ma(e),t)),pt=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},Br=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function ma(e){const t={};for(const w in e)w in Vo||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,b=ya(r),y=b&&b[0],D=b&&b[1],{onBeforeEnter:P,onEnter:I,onEnterCancelled:p,onLeave:g,onLeaveCancelled:R,onBeforeAppear:j=P,onAppear:M=I,onAppearCancelled:k=p}=t,T=(w,H,Y,oe)=>{w._enterCancelled=oe,gt(w,H?a:l),gt(w,H?u:o),Y&&Y()},O=(w,H)=>{w._isLeaving=!1,gt(w,d),gt(w,_),gt(w,m),H&&H()},A=w=>(H,Y)=>{const oe=w?M:I,U=()=>T(H,w,Y);pt(oe,[H,U]),Kr(()=>{gt(H,w?c:i),Xe(H,w?a:l),Br(oe)||qr(H,s,y,U)})};return fe(t,{onBeforeEnter(w){pt(P,[w]),Xe(w,i),Xe(w,o)},onBeforeAppear(w){pt(j,[w]),Xe(w,c),Xe(w,u)},onEnter:A(!1),onAppear:A(!0),onLeave(w,H){w._isLeaving=!0;const Y=()=>O(w,H);Xe(w,d),w._enterCancelled?(Xe(w,m),Yr(w)):(Yr(w),Xe(w,m)),Kr(()=>{w._isLeaving&&(gt(w,d),Xe(w,_),Br(g)||qr(w,s,D,Y))}),pt(g,[w,Y])},onEnterCancelled(w){T(w,!1,void 0,!0),pt(p,[w])},onAppearCancelled(w){T(w,!0,void 0,!0),pt(k,[w])},onLeaveCancelled(w){O(w),pt(R,[w])}})}function ya(e){if(e==null)return null;if(Q(e))return[gs(e.enter),gs(e.leave)];{const t=gs(e);return[t,t]}}function gs(e){return dl(e)}function Xe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ln]||(e[ln]=new Set)).add(t)}function gt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[ln];n&&(n.delete(t),n.size||(e[ln]=void 0))}function Kr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let va=0;function qr(e,t,n,s){const r=e._endId=++va,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=_a(e,t);if(!o)return s();const u=o+"end";let a=0;const d=()=>{e.removeEventListener(u,m),i()},m=_=>{_.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[b]||"").split(", "),r=s(`${rt}Delay`),i=s(`${rt}Duration`),o=Gr(r,i),l=s(`${Bt}Delay`),c=s(`${Bt}Duration`),u=Gr(l,c);let a=null,d=0,m=0;t===rt?o>0&&(a=rt,d=o,m=i.length):t===Bt?u>0&&(a=Bt,d=u,m=c.length):(d=Math.max(o,u),a=d>0?o>u?rt:Bt:null,m=a?a===rt?i.length:c.length:0);const _=a===rt&&/\b(?:transform|all)(?:,|$)/.test(s(`${rt}Property`).toString());return{type:a,timeout:d,propCount:m,hasTransform:_}}function Gr(e,t){for(;e.lengthXr(n)+Xr(e[s])))}function Xr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Yr(e){return(e?e.ownerDocument:document).body.offsetHeight}function ba(e,t,n){const s=e[ln];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Jr=Symbol("_vod"),wa=Symbol("_vsh"),Sa=Symbol(""),Ta=/(?:^|;)\s*display\s*:/;function Ea(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Ln(s,l,"")}else for(const o in t)n[o]==null&&Ln(s,o,"");for(const o in n)o==="display"&&(i=!0),Ln(s,o,n[o])}else if(r){if(t!==n){const o=s[Sa];o&&(n+=";"+o),s.cssText=n,i=Ta.test(n)}}else t&&e.removeAttribute("style");Jr in e&&(e[Jr]=i?s.display:"",e[wa]&&(s.display="none"))}const zr=/\s*!important$/;function Ln(e,t,n){if(K(n))n.forEach(s=>Ln(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=xa(e,t);zr.test(n)?e.setProperty(ft(s),n.replace(zr,""),"important"):e[s]=n}}const Qr=["Webkit","Moz","ms"],ms={};function xa(e,t){const n=ms[t];if(n)return n;let s=Ie(t);if(s!=="filter"&&s in e)return ms[t]=s;s=Kn(s);for(let r=0;rys||(Ma.then(()=>ys=0),ys=Date.now());function Pa(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(La(s,n.value),t,5,[s])};return n.value=e,n.attached=Oa(),n}function La(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ri=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Ia=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?ba(e,s,o):t==="style"?Ea(e,n,s):cn(t)?Ks(t)||Aa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Na(e,t,s,o))?(ti(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ei(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!le(s))?ti(e,Ie(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ei(e,t,s,o))};function Na(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ri(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ri(t)&&le(n)?!1:t in e}const ii=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>Rn(t,n):t};function Fa(e){e.target.composing=!0}function oi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const vs=Symbol("_assign");function li(e,t,n){return t&&(e=e.trim()),n&&(e=Gs(e)),e}const nf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[vs]=ii(r);const i=s||r.props&&r.props.type==="number";Ot(e,t?"change":"input",o=>{o.target.composing||e[vs](li(e.value,n,i))}),(n||i)&&Ot(e,"change",()=>{e.value=li(e.value,n,i)}),t||(Ot(e,"compositionstart",Fa),Ot(e,"compositionend",oi),Ot(e,"change",oi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[vs]=ii(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Gs(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},Ha=["ctrl","shift","alt","meta"],Da={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ha.some(n=>e[`${n}Key`]&&!t.includes(n))},sf=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const i=ft(r.key);if(t.some(o=>o===i||$a[o]===i))return e(r)}))},ko=fe({patchProp:Ia},ha);let Qt,ci=!1;function ja(){return Qt||(Qt=Yc(ko))}function Va(){return Qt=ci?Qt:Jc(ko),ci=!0,Qt}const of=((...e)=>{const t=ja().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Uo(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Wo(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t}),lf=((...e)=>{const t=Va().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Uo(s);if(r)return n(r,!0,Wo(r))},t});function Wo(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Uo(e){return le(e)?document.querySelector(e):e}const ka=window.__VP_SITE_DATA__;function Bo(e){return Ri()?(Sl(e),!0):!1}const _s=new WeakMap,Wa=(...e)=>{var t;const n=e[0],s=(t=xt())==null?void 0:t.proxy;if(s==null&&!Yi())throw new Error("injectLocal must be called in setup");return s&&_s.has(s)&&n in _s.get(s)?_s.get(s)[n]:bt(...e)},Ko=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const cf=e=>e!=null,Ua=Object.prototype.toString,Ba=e=>Ua.call(e)==="[object Object]",ut=()=>{},ai=Ka();function Ka(){var e,t;return Ko&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ur(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const qo=e=>e();function Go(e,t={}){let n,s,r=ut;const i=c=>{clearTimeout(c),r(),r=ut};let o;return c=>{const u=ce(e),a=ce(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((d,m)=>{r=t.rejectOnCancel?m:d,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,d(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,d(c())},u)})}}function qa(...e){let t=0,n,s=!0,r=ut,i,o,l,c,u;!ae(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=ut)};return m=>{const _=ce(o),b=Date.now()-t,y=()=>i=m();return a(),_<=0?(t=Date.now(),y()):(b>_&&(c||!s)?(t=Date.now(),y()):l&&(i=new Promise((D,P)=>{r=u?P:D,n=setTimeout(()=>{t=Date.now(),s=!0,D(y()),a()},Math.max(0,_-b))})),!c&&!n&&(n=setTimeout(()=>s=!0,_)),s=!1,i)}}function Ga(e=qo,t={}){const{initialState:n="active"}=t,s=fr(n==="active");function r(){s.value=!1}function i(){s.value=!0}return{isActive:tn(s),pause:r,resume:i,eventFilter:(...l)=>{s.value&&e(...l)}}}function ui(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function Xa(e){return xt()}function bs(e){return Array.isArray(e)?e:[e]}function fr(...e){if(e.length!==1)return Yl(...e);const t=e[0];return typeof t=="function"?tn(ql(()=>({get:t,set:ut}))):He(t)}function Ya(e,t=200,n={}){return ur(Go(t,n),e)}function Ja(e,t=200,n=!1,s=!0,r=!1){return ur(qa(t,n,s,r),e)}function Xo(e,t,n={}){const{eventFilter:s=qo,...r}=n;return Le(e,ur(s,t),r)}function za(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=Ga(s,{initialState:r});return{stop:Xo(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function ss(e,t=!0,n){Xa()?jt(e,n):t?e():zn(e)}function af(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Xo(e,t,{...i,eventFilter:Go(s,{maxWait:r})})}function Qa(e,t,n){return Le(e,t,{...n,immediate:!0})}function uf(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=ut}=s,c=Ee(!r),u=o?Ee(t):He(t);let a=0;return sr(async d=>{if(!c.value)return;a++;const m=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const b=await e(y=>{d(()=>{i&&(i.value=!1),_||y()})});m===a&&(u.value=b)}catch(b){l(b)}finally{i&&m===a&&(i.value=!1),_=!0}}),r?ie(()=>(c.value=!0,u.value)):u}const Ve=Ko?window:void 0;function dr(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function nt(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=ie(()=>{const l=bs(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=Qa(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>dr(u)))!=null?c:[Ve].filter(u=>u!=null),bs(ce(r.value?e[1]:e[0])),bs(Jn(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(u!=null&&u.length))return;const d=Ba(a)?{...a}:a;t.push(...l.flatMap(m=>c.flatMap(_=>u.map(b=>s(m,_,b,d)))))},{flush:"post"}),o=()=>{i(),n()};return Bo(n),o}function Za(){const e=Ee(!1),t=xt();return t&&jt(()=>{e.value=!0},t),e}function eu(e){const t=Za();return ie(()=>(t.value,!!e()))}function tu(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function ff(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ve,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=tu(t);return nt(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const nu=Symbol("vueuse-ssr-width");function su(){const e=Yi()?Wa(nu,null):null;return typeof e=="number"?e:void 0}function Yo(e,t={}){const{window:n=Ve,ssrWidth:s=su()}=t,r=eu(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=Ee(typeof s=="number"),o=Ee(),l=Ee(!1),c=u=>{l.value=u.matches};return sr(()=>{if(i.value){i.value=!r.value;const u=ce(e).split(",");l.value=u.some(a=>{const d=a.includes("not all"),m=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),_=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let b=!!(m||_);return m&&b&&(b=s>=ui(m[1])),_&&b&&(b=s<=ui(_[1])),d?!b:b});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),nt(o,"change",c,{passive:!0}),ie(()=>l.value)}const Tn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},En="__vueuse_ssr_handlers__",ru=iu();function iu(){return En in Tn||(Tn[En]=Tn[En]||{}),Tn[En]}function Jo(e,t){return ru[e]||t}function zo(e){return Yo("(prefers-color-scheme: dark)",e)}function ou(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const lu={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},fi="vueuse-storage";function hr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:d=Ve,eventFilter:m,onError:_=A=>{console.error(A)},initOnMounted:b}=s,y=(a?Ee:He)(typeof t=="function"?t():t),D=ie(()=>ce(e));if(!n)try{n=Jo("getDefaultStorage",()=>{var A;return(A=Ve)==null?void 0:A.localStorage})()}catch(A){_(A)}if(!n)return y;const P=ce(t),I=ou(P),p=(r=s.serializer)!=null?r:lu[I],{pause:g,resume:R}=za(y,()=>M(y.value),{flush:i,deep:o,eventFilter:m});Le(D,()=>T(),{flush:i}),d&&l&&ss(()=>{n instanceof Storage?nt(d,"storage",T,{passive:!0}):nt(d,fi,O),b&&T()}),b||T();function j(A,w){if(d){const H={key:D.value,oldValue:A,newValue:w,storageArea:n};d.dispatchEvent(n instanceof Storage?new StorageEvent("storage",H):new CustomEvent(fi,{detail:H}))}}function M(A){try{const w=n.getItem(D.value);if(A==null)j(w,null),n.removeItem(D.value);else{const H=p.write(A);w!==H&&(n.setItem(D.value,H),j(w,H))}}catch(w){_(w)}}function k(A){const w=A?A.newValue:n.getItem(D.value);if(w==null)return c&&P!=null&&n.setItem(D.value,p.write(P)),P;if(!A&&u){const H=p.read(w);return typeof u=="function"?u(H,P):I==="object"&&!Array.isArray(H)?{...P,...H}:H}else return typeof w!="string"?w:p.read(w)}function T(A){if(!(A&&A.storageArea!==n)){if(A&&A.key==null){y.value=P;return}if(!(A&&A.key!==D.value)){g();try{(A==null?void 0:A.newValue)!==p.write(y.value)&&(y.value=k(A))}catch(w){_(w)}finally{A?zn(R):R()}}}}function O(A){T(A.detail)}return y}const cu="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function au(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ve,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},m=zo({window:r}),_=ie(()=>m.value?"dark":"light"),b=c||(o==null?fr(s):hr(o,s,i,{window:r,listenToStorageChanges:l})),y=ie(()=>b.value==="auto"?_.value:b.value),D=Jo("updateHTMLAttrs",(g,R,j)=>{const M=typeof g=="string"?r==null?void 0:r.document.querySelector(g):dr(g);if(!M)return;const k=new Set,T=new Set;let O=null;if(R==="class"){const w=j.split(/\s/g);Object.values(d).flatMap(H=>(H||"").split(/\s/g)).filter(Boolean).forEach(H=>{w.includes(H)?k.add(H):T.add(H)})}else O={key:R,value:j};if(k.size===0&&T.size===0&&O===null)return;let A;a&&(A=r.document.createElement("style"),A.appendChild(document.createTextNode(cu)),r.document.head.appendChild(A));for(const w of k)M.classList.add(w);for(const w of T)M.classList.remove(w);O&&M.setAttribute(O.key,O.value),a&&(r.getComputedStyle(A).opacity,document.head.removeChild(A))});function P(g){var R;D(t,n,(R=d[g])!=null?R:g)}function I(g){e.onChanged?e.onChanged(g,P):P(g)}Le(y,I,{flush:"post",immediate:!0}),ss(()=>I(y.value));const p=ie({get(){return u?b.value:y.value},set(g){b.value=g}});return Object.assign(p,{store:b,system:_,state:y})}function uu(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=au({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function ws(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const di=1;function fu(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=ut,onScroll:i=ut,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:u=Ve,onError:a=M=>{console.error(M)}}=t,d=Ee(0),m=Ee(0),_=ie({get(){return d.value},set(M){y(M,void 0)}}),b=ie({get(){return m.value},set(M){y(void 0,M)}});function y(M,k){var T,O,A,w;if(!u)return;const H=ce(e);if(!H)return;(A=H instanceof Document?u.document.body:H)==null||A.scrollTo({top:(T=ce(k))!=null?T:b.value,left:(O=ce(M))!=null?O:_.value,behavior:ce(c)});const Y=((w=H==null?void 0:H.document)==null?void 0:w.documentElement)||(H==null?void 0:H.documentElement)||H;_!=null&&(d.value=Y.scrollLeft),b!=null&&(m.value=Y.scrollTop)}const D=Ee(!1),P=Ht({left:!0,right:!1,top:!0,bottom:!1}),I=Ht({left:!1,right:!1,top:!1,bottom:!1}),p=M=>{D.value&&(D.value=!1,I.left=!1,I.right=!1,I.top=!1,I.bottom=!1,r(M))},g=Ya(p,n+s),R=M=>{var k;if(!u)return;const T=((k=M==null?void 0:M.document)==null?void 0:k.documentElement)||(M==null?void 0:M.documentElement)||dr(M),{display:O,flexDirection:A,direction:w}=getComputedStyle(T),H=w==="rtl"?-1:1,Y=T.scrollLeft;I.left=Yd.value;const oe=Math.abs(Y*H)<=(o.left||0),U=Math.abs(Y*H)+T.clientWidth>=T.scrollWidth-(o.right||0)-di;O==="flex"&&A==="row-reverse"?(P.left=U,P.right=oe):(P.left=oe,P.right=U),d.value=Y;let X=T.scrollTop;M===u.document&&!X&&(X=u.document.body.scrollTop),I.top=Xm.value;const V=Math.abs(X)<=(o.top||0),te=Math.abs(X)+T.clientHeight>=T.scrollHeight-(o.bottom||0)-di;O==="flex"&&A==="column-reverse"?(P.top=te,P.bottom=V):(P.top=V,P.bottom=te),m.value=X},j=M=>{var k;if(!u)return;const T=(k=M.target.documentElement)!=null?k:M.target;R(T),D.value=!0,g(M),i(M)};return nt(e,"scroll",n?Ja(j,n,!0,!1):j,l),ss(()=>{try{const M=ce(e);if(!M)return;R(M)}catch(M){a(M)}}),nt(e,"scrollend",p,l),{x:_,y:b,isScrolling:D,arrivedState:P,directions:I,measure(){const M=ce(e);u&&M&&R(M)}}}function df(e,t,n={}){const{window:s=Ve}=n;return hr(e,t,s==null?void 0:s.localStorage,n)}function Qo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const Ss=new WeakMap;function hf(e,t=!1){const n=Ee(t);let s=null,r="";Le(fr(e),l=>{const c=ws(ce(l));if(c){const u=c;if(Ss.get(u)||Ss.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=ws(ce(e));!l||n.value||(ai&&(s=nt(l,"touchmove",c=>{du(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=ws(ce(e));!l||!n.value||(ai&&(s==null||s()),l.style.overflow=r,Ss.delete(l),n.value=!1)};return Bo(o),ie({get(){return n.value},set(l){l?i():o()}})}function pf(e,t,n={}){const{window:s=Ve}=n;return hr(e,t,s==null?void 0:s.sessionStorage,n)}function gf(e={}){const{window:t=Ve,...n}=e;return fu(t,n)}function mf(e={}){const{window:t=Ve,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=Ee(n),c=Ee(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:d,height:m,scale:_}=t.visualViewport;l.value=Math.round(d*_),c.value=Math.round(m*_)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),ss(u);const a={passive:!0};if(nt("resize",u,a),t&&o==="visual"&&t.visualViewport&&nt(t.visualViewport,"resize",u,a),r){const d=Yo("(orientation: portrait)");Le(d,()=>u())}return{width:l,height:c}}const Ts={};var Es={};const Zo=/^(?:[a-z]+:|\/\/)/i,hu="vitepress-theme-appearance",pu=/#.*$/,gu=/[?#].*$/,mu=/(?:(^|\/)index)?\.(?:md|html)$/,ve=typeof document<"u",el={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function yu(e,t,n=!1){if(t===void 0)return!1;if(e=hi(`/${e}`),n)return new RegExp(t).test(e);if(hi(t)!==e)return!1;const s=t.match(pu);return s?(ve?location.hash:"")===s[0]:!0}function hi(e){return decodeURI(e).replace(gu,"").replace(mu,"$1")}function vu(e){return Zo.test(e)}function _u(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!vu(n)&&yu(t,`/${n}/`,!0))||"root"}function bu(e,t){var s,r,i,o,l,c,u;const n=_u(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:nl(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function tl(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=wu(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function wu(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Su(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function nl(e,t){return[...e.filter(n=>!Su(t,n)),...t]}const Tu=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Eu=/^[a-z]:/i;function pi(e){const t=Eu.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Tu,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const xs=new Set;function xu(e){if(xs.size===0){const n=typeof process=="object"&&(Es==null?void 0:Es.VITE_EXTRA_EXTENSIONS)||(Ts==null?void 0:Ts.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>xs.add(s))}const t=e.split(".").pop();return t==null||!xs.has(t.toLowerCase())}function yf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Cu=Symbol(),Et=Ee(ka);function vf(e){const t=ie(()=>bu(Et.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?He(!0):n==="force-auto"?zo():n?uu({storageKey:hu,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):He(!1),r=He(ve?location.hash:"");return ve&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Le(()=>e.data,()=>{r.value=ve?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>tl(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function Au(){const e=bt(Cu);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ru(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function gi(e){return Zo.test(e)||!e.startsWith("/")?e:Ru(Et.value.base,e)}function Mu(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ve){t=pi(t.slice(1).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`/assets/${t}.${s}.js`}else t=`./${pi(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let In=[];function _f(e){In.push(e),es(()=>{In=In.filter(t=>t!==e)})}function Ou(){let e=Et.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=mi(e,n);else if(Array.isArray(e))for(const s of e){const r=mi(s,n);if(r){t=r;break}}return t}function mi(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Pu=Symbol(),sl="http://a.com",Lu=()=>({path:"/",component:null,data:el});function bf(e,t){const n=Ht(Lu()),s={route:n,go:r};async function r(l=ve?location.href:"/"){var c,u;l=Cs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ve&&l!==Cs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(l)))}let i=null;async function o(l,c=0,u=!1){var m,_;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const a=new URL(l,sl),d=i=a.pathname;try{let b=await e(d);if(!b)throw new Error(`Page not found: ${d}`);if(i===d){i=null;const{default:y,__pageData:D}=b;if(!y)throw new Error(`Invalid route component: ${y}`);await((_=s.onAfterPageLoad)==null?void 0:_.call(s,l)),n.path=ve?d:gi(d),n.component=Mn(y),n.data=Mn(D),ve&&zn(()=>{let P=Et.value.base+D.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!Et.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==a.pathname&&(a.pathname=P,l=P+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let I=null;try{I=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(I){yi(I,a.hash);return}}window.scrollTo(0,c)})}}catch(b){if(!/fetch|Page not found/.test(b.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(b),!u)try{const y=await fetch(Et.value.base+"hashmap.json");window.__VP_HASH_MAP__=await y.json(),await o(l,c,!0);return}catch{}if(i===d){i=null,n.path=ve?d:gi(d),n.component=t?Mn(t):null;const y=ve?d.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...el,relativePath:y}}}}return ve&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:d,pathname:m,hash:_,search:b}=new URL(u,c.baseURI),y=new URL(location.href);d===y.origin&&xu(m)&&(l.preventDefault(),m===y.pathname&&b===y.search?(_!==y.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:y.href,newURL:a}))),_?yi(c,_,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var u;if(l.state===null)return;const c=Cs(location.href);await o(c,l.state&&l.state.scrollPosition||0),await((u=s.onAfterRouteChange??s.onAfterRouteChanged)==null?void 0:u(c))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Iu(){const e=bt(Pu);if(!e)throw new Error("useRouter() is called without provider.");return e}function rl(){return Iu().route}function yi(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Ou()+i;requestAnimationFrame(r)}}function Cs(e){const t=new URL(e,sl);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Et.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const xn=()=>In.forEach(e=>e()),wf=rr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=rl(),{frontmatter:n,site:s}=Au();return Le(n,xn,{deep:!0,flush:"post"}),()=>Ws(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Ws(t.component,{onVnodeMounted:xn,onVnodeUpdated:xn,onVnodeUnmounted:xn}):"404 Page Not Found"])}}),Sf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Nu="modulepreload",Fu=function(e){return"/"+e},vi={},Tf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let o=function(u){return Promise.all(u.map(a=>Promise.resolve(a).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};document.getElementsByTagName("link");const l=document.querySelector("meta[property=csp-nonce]"),c=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));r=o(n.map(u=>{if(u=Fu(u),u in vi)return;vi[u]=!0;const a=u.endsWith(".css"),d=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${d}`))return;const m=document.createElement("link");if(m.rel=a?"stylesheet":Nu,a||(m.as="script"),m.crossOrigin="",m.href=u,c&&m.setAttribute("nonce",c),document.head.appendChild(m),a)return new Promise((_,b)=>{m.addEventListener("load",_),m.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${u}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},Ef=rr({setup(e,{slots:t}){const n=He(!1);return jt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function xf(){ve&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Cf(){if(ve){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Hu(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Hu(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Af(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=As(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(As);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};sr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=tl(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.getAttribute("content")!==a&&d.setAttribute("content",a):As(["meta",{name:"description",content:a}]),r(nl(o.head,$u(c)))})}function As([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function Du(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function $u(e){return e.filter(t=>!Du(t))}const Rs=new Set,il=()=>document.createElement("link"),ju=e=>{const t=il();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Vu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Cn;const ku=ve&&(Cn=il())&&Cn.relList&&Cn.relList.supports&&Cn.relList.supports("prefetch")?ju:Vu;function Rf(){if(!ve||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!Rs.has(c)){Rs.add(c);const u=Mu(c);u&&ku(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):Rs.add(l))})})};jt(s);const r=rl();Le(()=>r.path,s),es(()=>{n&&n.disconnect()})}export{oo as $,Ou as A,Xu as B,qu as C,_f as D,ue as E,Se as F,Ee as G,Gu as H,Zo as I,rl as J,ta as K,bt as L,mf as M,Xs as N,ff as O,zn as P,gf as Q,ve as R,tn as S,tf as T,Ku as U,Tf as V,hf as W,ic as X,Ju as Y,rf as Z,Sf as _,Fo as a,sf as a0,zu as a1,Af as a2,Pu as a3,vf as a4,Cu as a5,wf as a6,Ef as a7,Et as a8,bf as a9,Mu as aa,lf as ab,Rf as ac,Cf as ad,xf as ae,Ws as af,Zu as ag,Bo as ah,ce as ai,bs as aj,dr as ak,cf as al,uf as am,pf as an,df as ao,af as ap,Iu as aq,nt as ar,Wu as as,nf as at,ae as au,Bu as av,Mn as aw,of as ax,yf as ay,Vs as b,Qu as c,rr as d,ef as e,xu as f,gi as g,ie as h,vu as i,No as j,Jn as k,yu as l,Yo as m,Ys as n,js as o,He as p,Le as q,Yu as r,sr as s,bl as t,Au as u,jt as v,rc as w,es as x,Uu as y,Tc as z}; diff --git a/docs/v26.5.0/assets/chunks/theme.CRHW4GoY.js b/docs/v26.5.0/assets/chunks/theme.CRHW4GoY.js new file mode 100644 index 0000000..159923b --- /dev/null +++ b/docs/v26.5.0/assets/chunks/theme.CRHW4GoY.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.DGlmokQH.js","assets/chunks/framework.C2NLiVii.js"])))=>i.map(i=>d[i]); +import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.C2NLiVii.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-c79a1216"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-d6be1790"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-b933a997"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-a5bbad30"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-3f215769"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-e98dd255"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-e257564d"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-39a288b8"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-fa7799d5"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-8426fc1a"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-4f9c455b"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-a3976bdc"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-a6181336"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-8e2d4988"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-8b561e3d"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-1428d186"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-e315a0ad"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-8a42e2b4"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-a6f0e41e"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-1d5665e3"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-5337faa4"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-6c893767"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-35975db6"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-69e747b5"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-b98bc113"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-cf11d7a2"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-bd121fe5"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-7bc22406"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-bb2aa2f0"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-e5dd9c1c"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-e56f3d57"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-dc692963"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.DGlmokQH.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-0394ad82"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-1168a8e4"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-88af2de4"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-6aa21345"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-b44890b2"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-df37e6dd"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-3e9c20e4"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-8133b170"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-b9ab8c58"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-858fe1a4"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-f2779853"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-ae24b3ad"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-b3fd67f8"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-c40bc020"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-319d5ca6"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-0b0ada53"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-5d98c3a5"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; diff --git a/docs/v26.5.0/assets/cucumber.md.B5iBKzmw.js b/docs/v26.5.0/assets/cucumber.md.B5iBKzmw.js new file mode 100644 index 0000000..21343dc --- /dev/null +++ b/docs/v26.5.0/assets/cucumber.md.B5iBKzmw.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as d,ag as s}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"Cucumber","description":"","frontmatter":{},"headers":[],"relativePath":"cucumber.md","filePath":"cucumber.md"}'),o={name:"cucumber.md"};function i(r,t,l,n,c,h){return a(),d("div",null,[...t[0]||(t[0]=[s('

Cucumber

This documentation describes the technical aspects of our cucumber test suite.

tl;dr

Run the Cucumber tests with:

bash
$ npm test

Single OSRM Configuration

An OSRM configuration consists of a routing algorithm and a data load method. OSRM currently supports the routing algorithms:

  • ch (Contraction Hierarchy), and
  • mld (Multi-Level-Dijkstra)

and the data load methods:

  • directly (load the files into memory),
  • mmap (use memory mapped files), and
  • datastore (use shared memory).

To test all scenarios with a single OSRM configuration, say:

bash
$ npx cucumber-js -p home -p mld -p mmap --parallel 8 --fail-fast

Explanations follow:

Profiles

Profiles are chosen with the -p commandline argument. Cucumber profiles allow you to change multiple configuration items with just one commandline argument. If you set more than one profile they are all merged into one configuration.

Note: Cucumber profiles should not be confused with OSRM profiles. Cucumber profiles are defined in cucumber.mjs. OSRM profiles reside in the profiles/*.lua files.

Our implementation offers following stock profiles. You should always use one base profile followed by zero or more additional profiles.

Name
homeBase profile to use on a developer machine
githubBase profile to use on the github CI server
chAdditional profile that selects the CH algorithm
mldAdditional profile that selects the MLD algorithm
mmapAdditional profile that selects the mmap data load method
directlyAdditional profile that selects the directly data load method
datastoreAdditional profile that selects the datastore data load method
stressAdditional profile that selects only @stress tests
todoAdditional profile that selects only @todo tests
allAdditional profile that selects all tests

Arguments

Here is a description of all arguments you can pass to Cucumber. The interesting ones probably are: --fail-fast, --format, --parallel, and --tags.

Note: when using --parallel N make sure there are N contiguous free ports at the configured port number (eg. at ports 5000--5000+N).

All OSRM Configurations

We provide a shortcut to run all 6 configurations:

bash
$ npm test

This is how the tests are run on the CI server. You can pass the same arguments as mentioned above.

Cache

To speed up subsequent runs with the same parameters, the files generated by Cucumber and the by the OSRM extraction chain are held in a cache directory. This cache is located by default in test/cache and should be cleaned periodically:

bash
$ rm -rf test/cache

Configuration

The whole configuration is done in cucumber.mjs. You can either edit worldParameters in cucumber.mjs or use environment variables to override single defaults.

worldParametersEnvironment VariableDefaults to
CUCUMBER_TIMEOUT5000Scenario timeout in ms.
httpTimeoutCUCUMBER_HTTP_TIMEOUT2000HTTP timeout in ms.
testPathCUCUMBER_TEST_PATHtestThe test directory
profilesPathCUCUMBER_PROFILES_PATHprofilesThe profiles directory
logsPathCUCUMBER_LOGS_PATHtest/logsThe logs directory
cachePathCUCUMBER_CACHE_PATHtest/cacheThe cache directory
buildPathOSRM_BUILD_DIRbuildPath to the binaries
loadMethodOSRM_LOAD_METHODdatastoreData load method
algorithmOSRM_ALGORITHMchRouting algorithm
ipOSRM_IP127.0.0.1IP Address
portOSRM_PORT5000IP Port

The default Cucumber timeout can be changed by setting the environment variable CUCUMBER_TIMEOUT. This is discouraged, because the default timeout of 5 seconds is plenty for the problem sizes we are dealing with. The probable reasons for a test timing out are that osrm-routed died or that sync between osrm-datastore and osrm-routed was lost.

Other environment variables

OSRM_RASTER_SOURCE is set by 'Given the raster source' and is supposed to be read back in your profiles/*.lua profile by os.getenv('OSRM_RASTER_SOURCE').

OSRM_PROFILE See: Pull Request #4516

Tags

Single scenarios or whole feature files can be tagged. Tag names can be selected arbitrarily although it is best to conform to the tags already used. Eg. the tag @guidance can be used to run only those tests related to the guidance feature:

bash
$ npm test -- --tags @guidance

We also support following special tags:

TagA scenario thus tagged ...
@isolatedwill not run while any other scenario is running in parallel
@with_(datastore|directly|mmap)will be executed iff the load method matches
@no_(datastore|directly|mmap)will be executed unless the load method matches
@with_(ch|mld)will be executed iff the algorithm matches
@no_(ch|mld)will be executed unless the algorithm matches
@with_(linux|darwin|win32)will be executed iff the OS matches
@no_(linux|darwin|win32)will be executed unless the OS matches

A test that calls osrm-datastore --spring-clean should not run concurrently with any other test, thus the tag @isolated should be applied. A test that runs or kills osrm-routed should not run while testing the datastore load method, and thus should be labeled with the tag @no_datastore.

',42)])])}const m=e(o,[["render",i]]);export{p as __pageData,m as default}; diff --git a/docs/v26.5.0/assets/cucumber.md.B5iBKzmw.lean.js b/docs/v26.5.0/assets/cucumber.md.B5iBKzmw.lean.js new file mode 100644 index 0000000..76505d4 --- /dev/null +++ b/docs/v26.5.0/assets/cucumber.md.B5iBKzmw.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as d,ag as s}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"Cucumber","description":"","frontmatter":{},"headers":[],"relativePath":"cucumber.md","filePath":"cucumber.md"}'),o={name:"cucumber.md"};function i(r,t,l,n,c,h){return a(),d("div",null,[...t[0]||(t[0]=[s("",42)])])}const m=e(o,[["render",i]]);export{p as __pageData,m as default}; diff --git a/docs/v26.5.0/assets/developing.md.CHbv2cLk.js b/docs/v26.5.0/assets/developing.md.CHbv2cLk.js new file mode 100644 index 0000000..fbeb9f1 --- /dev/null +++ b/docs/v26.5.0/assets/developing.md.CHbv2cLk.js @@ -0,0 +1 @@ +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"Developing / Debugging guidance code","description":"","frontmatter":{},"headers":[],"relativePath":"developing.md","filePath":"developing.md"}'),n={name:"developing.md"};function r(d,e,g,s,c,u){return t(),i("div",null,[...e[0]||(e[0]=[a('

Developing / Debugging guidance code

When changing guidance code, it is easy to introduce problems somewhere in the network. To get a better feeling of how your changes impact the OSRM experience, we offer ways of generating geojson output to inspect (e.g. with Mapbox Studio). When you do changes, make sure to inspect a few areas for the impact of the changes.

How to use GeoJson-Debugging

This is a short guide to describe usage of our GeoJson debug logging mechanism. It is synchronized to guarantee thread-safe logging.

Outputting into a single file

To use it, the inclusion of geojson_debug_logger.hpp geojson_debug_policies.hpp from the util directory is required.

Geojson debugging requires a few simple steps to output data into a feature collection.

  • Create a Scoped Guard that lives through the process and provide it with all required datastructures (it needs to span the lifetime of all your logging efforts)
  • At the location of the output, simply call Write with your own parameters.

A guard (ScopedGeojsonLoggerGuard) requires a logging policy. Per default we provide a way of printing out node-ids as coordinates.

The initialisation to do so looks like this: util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug.geojson", data-for-conversion); Make sure to give the guard a name, so it actually gets a lifetime.

The field data-for-conversion can be an arbitrary long set of features and needs to match the parameters used for constructing our policy (in this case util::NodeIdVectorToLineString).

The policy itself offers a operator() accepting a vector of NodeID.

For outputting data into our file (debug.geojson), we simply need to call the matching logging routine of the guard: util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString>::Write(list_of_node_ids); (or guard.Write(list_of_node_ids) if you created an instance).

Possible Scopeguard Location

Think of the scopeguard as you would do of any reference. If you want to access logging during a call, the guard object must be alive and valid.

As an example: a good location to create a scopeguard to log decisions in the edge-based-graph-factory would be right before we run it (here). If you put util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug.geojson", node_coordinate_vector); at that location, you can then print util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString>::Write(list_of_node_ids); anywhere within the edge-based-graph-factory.

This location would enable calls for all guidance related pre-processing which is called in the edge-based-graph-factory. Logging any turn-handler decisions, for example, would now be possible.

Limitations

GeoJson debugging requires a single GeoJsonGuard (ScopedGeojsonLoggerGuard) for each desired output file. For each set of template parameters, only the most recent guard will actually produce output.

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug.geojson", data-for-conversion);

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug-2.geojson", data-for-conversion);

Will not provide a way to write into two files, but only debug-2 will actually contain features.

We cannot nest these calls.

If we want to use the same policy for multiple files, we need to use different template parameters both for the logger and the guard.

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,0> geojson_guard( "debug.geojson", data-for-conversion);

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,1> geojson_guard( "debug-2.geojson", data-for-conversion);

as well as,

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,0>::Write(list_of_node_ids);

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,1>::Write(list_of_node_ids);

',29)])])}const h=o(n,[["render",r]]);export{p as __pageData,h as default}; diff --git a/docs/v26.5.0/assets/developing.md.CHbv2cLk.lean.js b/docs/v26.5.0/assets/developing.md.CHbv2cLk.lean.js new file mode 100644 index 0000000..88b62f6 --- /dev/null +++ b/docs/v26.5.0/assets/developing.md.CHbv2cLk.lean.js @@ -0,0 +1 @@ +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"Developing / Debugging guidance code","description":"","frontmatter":{},"headers":[],"relativePath":"developing.md","filePath":"developing.md"}'),n={name:"developing.md"};function r(d,e,g,s,c,u){return t(),i("div",null,[...e[0]||(e[0]=[a("",29)])])}const h=o(n,[["render",r]]);export{p as __pageData,h as default}; diff --git a/docs/v26.5.0/assets/example-tile-response.Edf9KoW6.png b/docs/v26.5.0/assets/example-tile-response.Edf9KoW6.png new file mode 100644 index 0000000..86c8571 Binary files /dev/null and b/docs/v26.5.0/assets/example-tile-response.Edf9KoW6.png differ diff --git a/docs/v26.5.0/assets/http.md.B98BbSjI.js b/docs/v26.5.0/assets/http.md.B98BbSjI.js new file mode 100644 index 0000000..6113305 --- /dev/null +++ b/docs/v26.5.0/assets/http.md.B98BbSjI.js @@ -0,0 +1,266 @@ +import{_ as t,o as s,c as i,ag as a}from"./chunks/framework.C2NLiVii.js";const n="/assets/example-tile-response.Edf9KoW6.png",u=JSON.parse('{"title":"OSRM HTTP server","description":"","frontmatter":{},"headers":[],"relativePath":"http.md","filePath":"http.md"}'),o={name:"http.md"};function d(l,e,r,h,p,c){return s(),i("div",null,[...e[0]||(e[0]=[a(`

OSRM HTTP server

The built-in HTTP server is a basic HTTP/1.0 server that supports a 'keep-alive' extension. Persistent connections are limited to 512 requests per connection and allow no more than 5 seconds between requests.

General options

All OSRM HTTP requests use a common structure.

The following syntax applies to all services, except as noted.

Requests

GET
/{service}/{version}/{profile}/{coordinates}[.{format}]?option=value&option=value
ParameterDescription
serviceOne of the following values: route, nearest, table, match, trip, tile
versionVersion of the protocol implemented by the service. v1 for all OSRM 5.x installations
profileMode of transportation, is determined statically by the Lua profile that is used to prepare the data using osrm-extract. Typically car, bike or foot if using one of the supplied profiles.
coordinatesString of format {longitude},{latitude};{longitude},{latitude}[;{longitude},{latitude} ...] or polyline({polyline}) or polyline6({polyline6}).
formatjson or flatbuffers. This parameter is optional and defaults to json.

Passing any option=value is optional. polyline follows Google's polyline format with precision 5 by default and can be generated using this package.

To pass parameters to each location some options support an array-like encoding:

Request options

OptionValuesDescription
bearings{bearing};{bearing}[;{bearing} ...]Limits the search to segments with given bearing in degrees towards true north in a clockwise direction.
radiuses{radius};{radius}[;{radius} ...]Limits the search to given radius in meters.
generate_hintstrue (default), falseAdds a Hint to the response which can be used in subsequent requests, see hints parameter.
hints{hint};{hint}[;{hint} ...]Hint from previous request to derive position in street network.
approaches{approach};{approach}[;{approach} ...]Restrict the direction on the road network at a waypoint, relative to the input coordinate.
exclude{class}[,{class}]Additive list of classes to avoid, the order does not matter.
snappingdefault (default), anyDefault snapping avoids is_startpoint (see profile) edges, any will snap to any edge in the graph
skip_waypointstrue, false (default)Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of the response and do not want to transfer waste data.

Where the elements follow the following format:

ElementValues
bearing{value},{range} integer 0 .. 360,integer 0 .. 180
radiusdouble >= 0 or unlimited (default)
hintBase64 string
approachcurb, opposite or unrestricted (default)
classA class name determined by the profile or none.
{option}={element};{element}[;{element} ... ]

The number of elements must match exactly the number of locations (except for generate_hints and exclude). If you don't want to pass a value but instead use the default you can pass an empty element.

Example: 2nd location uses the default value for option:

{option}={element};;{element}

Example Requests

bash
# Query on Berlin with three coordinates:
+curl 'http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?overview=false'
+
+# Query on Berlin excluding the usage of motorways:
+curl 'http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407?exclude=motorway'
+
+# Using polyline:
+curl 'http://router.project-osrm.org/route/v1/driving/polyline(ofp_Ik_vpAilAyu@te@g\`E)?overview=false'

Responses

Code

Every response object has a code property containing one of the strings below or a service dependent code:

TypeDescription
OkRequest could be processed as expected.
InvalidUrlURL string is invalid.
InvalidServiceService name is invalid.
InvalidVersionVersion is not found.
InvalidOptionsOptions are invalid.
InvalidQueryThe query string is syntactically malformed.
InvalidValueThe successfully parsed query parameters are invalid.
NoSegmentOne of the supplied input coordinates could not snap to the street segment.
TooBigThe request size violates one of the service-specific request size restrictions.
DisabledDatasetThe request tried to access a disabled dataset.
  • message is an optional human-readable error message. All other status types are service-dependent.
  • In case of an error the HTTP status code will be 400. Otherwise, the HTTP status code will be 200 and code will be Ok.

Data version

Every response object has a data_version property containing a timestamp from the original OpenStreetMap file. This field is optional. It can be omitted if the data_version parameter was not set on the osrm-extract stage or the OSM file has not osmosis_replication_timestamp section.

Example response

json
{
+"code": "Ok",
+"message": "Everything worked",
+"data_version": "2017-11-17T21:43:02Z"
+}

Services

Nearest service

Snaps a coordinate to the street network and returns the nearest n matches.

GET
http://{server}/nearest/v1/{profile}/{coordinates}.json?number={number}

Where coordinates only supports a single {longitude},{latitude} entry.

In addition to the general options the following options are supported for this service:

OptionValuesDescription
numberinteger >= 1 (default 1)Number of nearest segments that should be returned.

As waypoints is a single thing returned by that service, using it with the option skip_waypoints set to true is quite useless, but still possible. In that case, only the code field will be returned.

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • waypoints array of Waypoint objects sorted by distance to the input coordinate. Each object has at least the following additional properties:
    • nodes: Array of OpenStreetMap node ids.

Example Requests

bash
# Querying nearest three snapped locations of \`13.388860,52.517037\` with a bearing between \`20° - 340°\`.
+curl 'http://router.project-osrm.org/nearest/v1/driving/13.388860,52.517037?number=3&bearings=0,20'

Example Response

JSON
{
+   "waypoints" : [
+      {
+         "nodes": [
+            2264199819,
+            0
+         ],
+         "hint" : "KSoKADRYroqUBAEAEAAAABkAAAAGAAAAAAAAABhnCQCLtwAA_0vMAKlYIQM8TMwArVghAwEAAQH1a66g",
+         "distance" : 4.152629,
+         "name" : "Friedrichstraße",
+         "location" : [
+            13.388799,
+            52.517033
+         ]
+      },
+      {
+         "nodes": [
+            2045820592,
+            0
+         ],
+         "hint" : "KSoKADRYroqUBAEABgAAAAAAAAAAAAAAKQAAABhnCQCLtwAA7kvMAAxZIQM8TMwArVghAwAAAQH1a66g",
+         "distance" : 11.811961,
+         "name" : "Friedrichstraße",
+         "location" : [
+            13.388782,
+            52.517132
+         ]
+      },
+      {
+         "nodes": [
+            0,
+            21487242
+         ],
+         "hint" : "KioKgDbbDgCUBAEAAAAAABoAAAAAAAAAPAAAABlnCQCLtwAA50vMADJZIQM8TMwArVghAwAAAQH1a66g",
+         "distance" : 15.872438,
+         "name" : "Friedrichstraße",
+         "location" : [
+            13.388775,
+            52.51717
+         ]
+      }
+   ],
+   "code" : "Ok"
+}

Route service

Finds the fastest route between coordinates in the supplied order.

GET
/route/v1/{profile}/{coordinates}?alternatives={true|false|number}&steps={true|false}&geometries={polyline|polyline6|geojson}&overview={full|simplified|false}&annotations={true|false}

In addition to the general options the following options are supported for this service:

OptionValuesDescription
alternativestrue, false (default), or NumberSearch for alternative routes. Passing a number alternatives=n searches for up to n alternative routes.*
stepstrue, false (default)Returned route steps for each route leg
annotationstrue, false (default), nodes, distance, duration, datasources, weight, speedReturns additional metadata for each coordinate along the route geometry.
geometriespolyline (default), polyline6, geojsonReturned route geometry format (influences overview and per step)
overviewsimplified (default), full, false, by_legsAdd overview geometry either full, simplified according to highest zoom level it could be displayed on, not at all, or split by leg.
continue_straightdefault (default), true, falseForces the route to keep going straight at waypoints constraining uturns there even if it would be faster. Default value depends on the profile.
waypoints{index};{index};{index}...Treats input coordinates indicated by given indices as waypoints in returned Match object. Default is to treat all input coordinates as waypoints.

* Please note that even if alternative routes are requested, a result cannot be guaranteed.

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • waypoints: Array of Waypoint objects representing all waypoints in order:
  • routes: An array of Route objects, ordered by descending recommendation rank.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoRouteNo route found.

All other properties might be undefined.

Example Request

bash
# Query on Berlin with three coordinates and no overview geometry returned:
+curl 'http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?overview=false'

Table service

Computes the duration of the fastest route between all pairs of supplied coordinates. Returns durations or distances or both between the coordinate pairs. Note that the distances are not the shortest distance between two coordinates, but rather the distances of the fastest routes. Durations are in seconds and distances are in meters.

GET
/table/v1/{profile}/{coordinates}?{sources}=[{elem}...];&{destinations}=[{elem}...]&annotations={duration|distance|duration,distance}

Options

In addition to the general options the following options are supported for this service:

OptionValuesDescription
sources{index};{index}[;{index} ...] or all (default)Use location with given index as source.
destinations{index};{index}[;{index} ...] or all (default)Use location with given index as destination.
annotationsduration (default), distance, or duration,distanceReturn the requested table or tables in response.
fallback_speeddouble > 0If no route found between a source/destination pair, calculate the as-the-crow-flies distance, then use this speed to estimate duration.
fallback_coordinateinput (default), or snappedWhen using a fallback_speed, use the user-supplied coordinate (input), or the snapped location (snapped) for calculating distances.
scale_factordouble > 0Use in conjunction with annotations=durations. Scales the table duration values by this number.

Unlike other array encoded options, the length of sources and destinations can be smaller or equal to number of input locations;

With skip_waypoints set to true, both sources and destinations arrays will be skipped.

Example:

sources=0;5;7&destinations=5;1;4;2;3;6
ElementValues
index0 <= integer < #locations

Example Request

bash
# Returns a 3x3 duration matrix:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219'
+
+# Returns a 1x3 duration matrix
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?sources=0'
+
+# Returns a asymmetric 3x2 duration matrix with from the polyline encoded locations \`qikdcB}~dpXkkHz\`:
+curl 'http://router.project-osrm.org/table/v1/driving/polyline(egs_Iq_aqAppHzbHulFzeMe\`EuvKpnCglA)?sources=0;1;3&destinations=2;4'
+
+# Returns a 3x3 duration matrix:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?annotations=duration'
+
+# Returns a 3x3 distance matrix for CH:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?annotations=distance'
+
+# Returns a 3x3 duration matrix and a 3x3 distance matrix for CH:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?annotations=distance,duration'

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • durations array of arrays that stores the matrix in row-major order. durations[i][j] gives the travel time from the i-th source to the j-th destination. Values are given in seconds. Can be null if no route between i and j can be found.
  • distances array of arrays that stores the matrix in row-major order. distances[i][j] gives the travel distance from the i-th source to the j-th destination. Values are given in meters. Can be null if no route between i and j can be found.
  • sources array of Waypoint objects describing all sources in order
  • destinations array of Waypoint objects describing all destinations in order
  • fallback_speed_cells (optional) array of arrays containing i,j pairs indicating which cells contain estimated values based on fallback_speed. Will be absent if fallback_speed is not used.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoTableNo route found.
NotImplementedThis request is not supported

All other properties might be undefined.

Example Response

json
{
+  "sources": [
+    {
+      "location": [
+        13.3888,
+        52.517033
+      ],
+      "hint": "PAMAgEVJAoAUAAAAIAAAAAcAAAAAAAAArss0Qa7LNEHiVIRA4lSEQAoAAAAQAAAABAAAAAAAAADMAAAAAEzMAKlYIQM8TMwArVghAwEA3wps52D3",
+      "name": "Friedrichstraße"
+    },
+    {
+      "location": [
+        13.397631,
+        52.529432
+      ],
+      "hint": "WIQBgL6mAoAEAAAABgAAAAAAAAA7AAAAhU6PQHvHj0IAAAAAQbyYQgQAAAAGAAAAAAAAADsAAADMAAAAf27MABiJIQOCbswA_4ghAwAAXwVs52D3",
+      "name": "Torstraße"
+    },
+    {
+      "location": [
+        13.428554,
+        52.523239
+      ],
+      "hint": "7UcAgP___38fAAAAUQAAACYAAABTAAAAhSQKQrXq5kKRbiZCWJo_Qx8AAABRAAAAJgAAAFMAAADMAAAASufMAOdwIQNL58wA03AhAwMAvxBs52D3",
+      "name": "Platz der Vereinten Nationen"
+    }
+  ],
+  "durations": [
+    [
+      0,
+      192.6,
+      382.8
+    ],
+    [
+      199,
+      0,
+      283.9
+    ],
+    [
+      344.7,
+      222.3,
+      0
+    ]
+  ],
+  "destinations": [
+    {
+      "location": [
+        13.3888,
+        52.517033
+      ],
+      "hint": "PAMAgEVJAoAUAAAAIAAAAAcAAAAAAAAArss0Qa7LNEHiVIRA4lSEQAoAAAAQAAAABAAAAAAAAADMAAAAAEzMAKlYIQM8TMwArVghAwEA3wps52D3",
+      "name": "Friedrichstraße"
+    },
+    {
+      "location": [
+        13.397631,
+        52.529432
+      ],
+      "hint": "WIQBgL6mAoAEAAAABgAAAAAAAAA7AAAAhU6PQHvHj0IAAAAAQbyYQgQAAAAGAAAAAAAAADsAAADMAAAAf27MABiJIQOCbswA_4ghAwAAXwVs52D3",
+      "name": "Torstraße"
+    },
+    {
+      "location": [
+        13.428554,
+        52.523239
+      ],
+      "hint": "7UcAgP___38fAAAAUQAAACYAAABTAAAAhSQKQrXq5kKRbiZCWJo_Qx8AAABRAAAAJgAAAFMAAADMAAAASufMAOdwIQNL58wA03AhAwMAvxBs52D3",
+      "name": "Platz der Vereinten Nationen"
+    }
+  ],
+  "code": "Ok",
+  "distances": [
+    [
+      0,
+      1886.89,
+      3791.3
+    ],
+    [
+      1824,
+      0,
+      2838.09
+    ],
+    [
+      3275.36,
+      2361.73,
+      0
+    ]
+  ],
+  "fallback_speed_cells": [
+    [ 0, 1 ],
+    [ 1, 0 ]
+  ]
+}

Match service

Map matching matches/snaps given GPS points to the road network in the most plausible way. Please note the request might result in multiple sub-traces. Large jumps in the timestamps (> 60s) or improbable transitions lead to trace splits if a complete matching could not be found. The algorithm might not be able to match all points. Outliers are removed if they can not be matched successfully.

GET
/match/v1/{profile}/{coordinates}?steps={true|false}&geometries={polyline|polyline6|geojson}&overview={simplified|full|false}&annotations={true|false}

In addition to the general options the following options are supported for this service:

OptionValuesDescription
stepstrue, false (default)Returned route steps for each route
geometriespolyline (default), polyline6, geojsonReturned route geometry format (influences overview and per step)
annotationstrue, false (default), nodes, distance, duration, datasources, weight, speedReturns additional metadata for each coordinate along the route geometry.
overviewsimplified (default), full, false, by_legsAdd overview geometry either full, simplified according to highest zoom level it could be displayed on, not at all, or split by leg.
timestamps{timestamp};{timestamp}[;{timestamp} ...]Timestamps for the input locations in seconds since UNIX epoch. Timestamps need to be monotonically increasing.
radiuses{radius};{radius}[;{radius} ...]Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy.
gapssplit (default), ignoreAllows the input track splitting based on huge timestamp gaps between points.
tidytrue, false (default)Allows the input track modification to obtain better matching quality for noisy tracks.
waypoints{index};{index};{index}...Treats input coordinates indicated by given indices as waypoints in returned Match object. Default is to treat all input coordinates as waypoints.
ParameterValues
timestampinteger seconds since UNIX epoch
radiusdouble >= 0 (default 5m)

The radius for each point should be the standard error of the location measured in meters from the true location. Use Location.getAccuracy() on Android or CLLocation.horizontalAccuracy on iOS. This value is used to determine which points should be considered as candidates (larger radius means more candidates) and how likely each candidate is (larger radius means far-away candidates are penalized less). The area to search is chosen such that the correct candidate should be considered 99.9% of the time (for more details see this ticket).

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • tracepoints: Array of Waypoint objects representing all points of the trace in order. If the tracepoint was omitted by map matching because it is an outlier, the entry will be null. Each Waypoint object has the following additional properties:
    • matchings_index: Index to the Route object in matchings the sub-trace was matched to.
    • waypoint_index: Index of the waypoint inside the matched route.
    • alternatives_count: Number of probable alternative matchings for this tracepoint. A value of zero indicates that this point was matched unambiguously. Split the trace at these points for incremental map matching.
  • matchings: An array of Route objects that assemble the trace. Each Route object has the following additional properties:
    • confidence: Confidence of the matching. float value between 0 and 1. 1 is very confident that the matching is correct.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoMatchNo matchings found.

All other properties might be undefined.

Trip service

The trip plugin solves the Traveling Salesman Problem using a greedy heuristic (farthest-insertion algorithm) for 10 or more waypoints and uses brute force for less than 10 waypoints. The returned path does not have to be the fastest one. As TSP is NP-hard it only returns an approximation. Note that all input coordinates have to be connected for the trip service to work.

GET
/trip/v1/{profile}/{coordinates}?roundtrip={true|false}&source={any|first}&destination={any|last}&steps={true|false}&geometries={polyline|polyline6|geojson}&overview={simplified|full|false}&annotations={true|false}

In addition to the general options the following options are supported for this service:

OptionValuesDescription
roundtriptrue (default), falseReturned route is a roundtrip (route returns to first location)
sourceany (default), firstReturned route starts at any or first coordinate
destinationany (default), lastReturned route ends at any or last coordinate
stepstrue, false (default)Returned route instructions for each trip
annotationstrue, false (default), nodes, distance, duration, datasources, weight, speedReturns additional metadata for each coordinate along the route geometry.
geometriespolyline (default), polyline6, geojsonReturned route geometry format (influences overview and per step)
overviewsimplified (default), full, false, by_legsAdd overview geometry either full, simplified according to highest zoom level it could be displayed on, not at all, or split by leg.

Fixing Start and End Points

It is possible to explicitly set the start or end coordinate of the trip. When the source is set to first, the first coordinate is used as the start coordinate of the trip in the output. When the destination is set to last, the last coordinate will be used as the destination of the trip in the returned output. If you specify any, any of the coordinates can be used as the first or last coordinate in the output.

However, if source=any&destination=any the returned round-trip will still start at the first input coordinate by default.

Currently, not all combinations of roundtrip, source, and destination are supported. Right now, the following combinations are possible:

roundtripsourcedestinationsupported
truefirstlastyes
truefirstanyyes
trueanylastyes
trueanyanyyes
falsefirstlastyes
falsefirstanyyes
falseanylastyes
falseanyanyno

Example Requests

bash
# Round trip in Berlin with three stops:
+curl 'http://router.project-osrm.org/trip/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219'
bash
# Round trip in Berlin with four stops, starting at the first stop, ending at the last:
+curl 'http://router.project-osrm.org/trip/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219;13.418555,52.523215?source=first&destination=last'

Response

  • code: if the request was successful Ok otherwise see the service dependent and general status codes.
  • waypoints: Array of Waypoint objects representing all waypoints in input order. Each Waypoint object has the following additional properties:
    • trips_index: Index to trips of the sub-trip the point was matched to.
    • waypoint_index: Index of the point in the trip.
  • trips: An array of Route objects that assemble the trace.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoTripsNo trips found because input coordinates are not connected.
NotImplementedThis request is not supported

All other properties might be undefined.

Tile service

This service generates Mapbox Vector Tiles that can be viewed with a vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can be used to examine the routing graph. The tiles are generated directly from the data in-memory, so are in sync with actual routing results, and let you examine which roads are actually routable, and what weights they have applied.

GET
/tile/v1/{profile}/tile({x},{y},{zoom}).mvt

The x, y, and zoom values are the same as described at https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames, and are supported by vector tile viewers like Mapbox GL JS.

Example request

bash
# This fetches a Z=13 tile for downtown San Francisco:
+curl 'http://router.project-osrm.org/tile/v1/car/tile(1310,3166,13).mvt'

Example response

example rendered tilehttp://map.project-osrm.org/debug/#14.33/52.5212/13.3919

The response object is either a binary encoded blob with a Content-Type of application/x-protobuf, or a 404 error. Note that OSRM is hard-coded to only return tiles from zoom level 12 and higher (to avoid accidentally returning extremely large vector tiles).

Vector tiles contain two layers:

speeds layer:

PropertyTypeDescription
speedintegerthe speed on that road segment, in km/h
is_smallbooleanwhether this segment belongs to a small (< 1000 node) strongly connected component
datasourcestringthe source for the speed value (normally lua profile unless you're using the traffic update feature, in which case it contains the stem of the filename that supplied the speed value for this segment
durationfloathow long this segment takes to traverse, in seconds. This value is to calculate the total route ETA.
weight integerhow long this segment takes to traverse, in units (may differ from duration when artificial biasing is applied in the Lua profiles). ACTUAL ROUTING USES THIS VALUE.
namestringthe name of the road this segment belongs to
ratefloatthe value of length/weight - analogous to speed, but using the weight value rather than duration, rounded to the nearest integer
is_startpointbooleanwhether this segment can be used as a start/endpoint for routes

turns layer:

PropertyTypeDescription
bearing_inintegerthe absolute bearing that approaches the intersection. -180 to +180, 0 = North, 90 = East
turn_angleintegerthe angle of the turn, relative to the bearing_in. -180 to +180, 0 = straight ahead, 90 = 90-degrees to the right
costfloatthe time we think it takes to make that turn, in seconds. May be negative, depending on how the data model is constructed (some turns get a "bonus").
weightfloatthe weight we think it takes to make that turn. May be negative, depending on how the data model is constructed (some turns get a "bonus"). ACTUAL ROUTING USES THIS VALUE
typestringthe type of this turn - values like turn, continue, etc. See the StepManeuver for a partial list, this field also exposes internal turn types that are never returned with an API response
modifierstringthe direction modifier of the turn (left, sharp left, etc)

Result objects

Route object

Represents a route through (potentially multiple) waypoints.

Properties

  • distance: The distance traveled by the route, in float meters.
  • duration: The estimated travel time, in float number of seconds.
  • geometry: The whole geometry of the route value depending on overview parameter, format depending on the geometries parameter. See RouteStep's geometry property for the parameter documentation.
  • weight: The calculated weight of the route.
  • weight_name: The name of the weight profile used during the extraction phase.
overviewDescription
simplifiedGeometry is simplified according to the highest zoom level it can still be displayed in full.
fullGeometry is not simplified.
falseGeometry is not added.
  • legs: The legs between the given waypoints, an array of RouteLeg objects.

Example

Three input coordinates, geometry=geojson, steps=false:

json
{
+  "distance": 90.0,
+  "duration": 300.0,
+  "weight": 300.0,
+  "weight_name": "duration",
+  "geometry": {"type": "LineString", "coordinates": [[120.0, 10.0], [120.1, 10.0], [120.2, 10.0], [120.3, 10.0]]},
+  "legs": [
+    {
+      "distance": 30.0,
+      "duration": 100.0,
+      "steps": []
+    },
+    {
+      "distance": 60.0,
+      "duration": 200.0,
+      "steps": []
+    }
+  ]
+}

RouteLeg object

Represents a route between two waypoints.

Properties

  • distance: The distance traveled by this route leg, in float meters.
  • duration: The estimated travel time, in float number of seconds.
  • weight: The calculated weight of the route leg.
  • summary: Summary of the route taken as string. Depends on the steps parameter:
steps
trueNames of the two major roads used. Can be empty if the route is too short.
falseempty string
  • steps: Depends on the steps parameter.
steps
truearray of RouteStep objects describing the turn-by-turn instructions
falseempty array
  • annotation: Additional details about each coordinate along with the route geometry:
annotations
trueAn Annotation object containing node ids, durations, distances, and weights.
falseundefined

Example

With steps=false and annotations=true:

json
{
+  "distance": 30.0,
+  "duration": 100.0,
+  "weight": 100.0,
+  "steps": [],
+  "annotation": {
+    "distance": [5,5,10,5,5],
+    "duration": [15,15,40,15,15],
+    "datasources": [1,0,0,0,1],
+    "metadata": { "datasource_names": ["traffic","lua profile","lua profile","lua profile","traffic"] },
+    "nodes": [49772551,49772552,49786799,49786800,49786801,49786802],
+    "speed": [0.3, 0.3, 0.3, 0.3, 0.3]
+  }
+}

Annotation object

Annotation of the whole route leg with fine-grained information about each segment or node id.

Properties

  • distance: The distance, in meters, between each pair of coordinates
  • duration: The duration between each pair of coordinates, in seconds. Does not include the duration of any turns.
  • datasources: The index of the data source for the speed between each pair of coordinates. 0 is the default profile, other values are supplied via --segment-speed-file to osrm-contract or osrm-customize. String-like names are in the metadata.datasource_names array.
  • nodes: The OSM node ID for each coordinate along the route, excluding the first/last user-supplied coordinates
  • weight: The weights between each pair of coordinates. Does not include any turn costs.
  • speed: Convenience field, calculation of distance / duration rounded to one decimal place
  • metadata: Metadata related to other annotations
    • datasource_names: The names of the data sources used for the speed between each pair of coordinates. lua profile is the default profile, other values are the filenames supplied via --segment-speed-file to osrm-contract or osrm-customize

Example

json
{
+  "distance": [5,5,10,5,5],
+  "duration": [15,15,40,15,15],
+  "datasources": [1,0,0,0,1],
+  "metadata": { "datasource_names": ["traffic","lua profile","lua profile","lua profile","traffic"] },
+  "nodes": [49772551,49772552,49786799,49786800,49786801,49786802],
+  "weight": [15,15,40,15,15]
+}

RouteStep object

A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a single way to the subsequent step.

Properties

  • distance: The distance of travel from the maneuver to the subsequent step, in float meters.
  • duration: The estimated travel time, in float number of seconds.
  • geometry: The unsimplified geometry of the route segment, depending on the geometries parameter.
  • weight: The calculated weight of the step.
geometry
polylinepolyline with precision 5 in [latitude,longitude] encoding
polyline6polyline with precision 6 in [latitude,longitude] encoding
geojsonGeoJSON LineString
  • name: The name of the way along which travel proceeds.
  • ref: A reference number or code for the way. Optionally included, if ref data is available for the given way.
  • pronunciation: A string containing an IPA phonetic transcription indicating how to pronounce the name in the name property. This property is omitted if pronunciation data is unavailable for the step.
  • destinations: The destinations of the way. Will be undefined if there are no destinations.
  • exits: The exit numbers or names of the way. Will be undefined if there are no exit numbers or names.
  • mode: A string signifying the mode of transportation.
  • maneuver: A StepManeuver object representing the maneuver.
  • intersections: A list of Intersection objects that are passed along the segment, the very first belonging to the StepManeuver
  • rotary_name: The name for the rotary. Optionally included, if the step is a rotary and a rotary name is available.
  • rotary_pronunciation: The pronunciation hint of the rotary name. Optionally included, if the step is a rotary and a rotary pronunciation is available.
  • driving_side: The legal driving side at the location for this step. Either left or right.

Example

json
{
+   "geometry" : "{lu_IypwpAVrAvAdI",
+   "mode" : "driving",
+   "duration" : 15.6,
+   "weight" : 15.6,
+   "intersections" : [
+      {  "bearings" : [ 10, 92, 184, 270 ],
+         "lanes" : [
+            { "indications" : [ "left", "straight" ],
+               "valid" : false },
+            { "valid" : true,
+               "indications" : [ "right" ] }
+         ],
+         "out" : 2,
+         "in" : 3,
+         "entry" : [ "true", "true", "true", "false" ],
+         "location" : [ 13.39677, 52.54366 ]
+      },
+      {  "out" : 1,
+         "lanes" : [
+            { "indications" : [ "straight" ],
+               "valid" : true },
+            { "indications" : [ "right" ],
+               "valid" : false }
+         ],
+         "bearings" : [ 60, 240, 330 ],
+         "in" : 0,
+         "entry" : [ "false", "true", "true" ],
+         "location" : [ 13.394718, 52.543096 ]
+      }
+   ],
+   "name" : "Lortzingstraße",
+   "distance" : 152.3,
+   "maneuver" : {
+      "modifier" : "right",
+      "type" : "turn"
+   }
+}

StepManeuver object

Properties

  • location: A [longitude, latitude] pair describing the location of the turn.
  • bearing_before: The clockwise angle from true north to the direction of travel immediately before the maneuver. Range 0-359.
  • bearing_after: The clockwise angle from true north to the direction of travel immediately after the maneuver. Range 0-359.
  • type A string indicating the type of maneuver. new identifiers might be introduced without API change Types unknown to the client should be handled like the turn type, the existence of correct modifier values is guaranteed.
typeDescription
turna basic turn into the direction of the modifier
new nameno turn is taken/possible, but the road name changes. The road can take a turn itself, following modifier.
departindicates the departure of the leg
arriveindicates the destination of the leg
mergemerge onto a street (e.g. getting on the highway from a ramp, the modifier specifies the direction of the merge)
rampDeprecated. Replaced by on_ramp and off_ramp.
on ramptake a ramp to enter a highway (direction given my modifier)
off ramptake a ramp to exit a highway (direction given my modifier)
forktake the left/right side at a fork depending on modifier
end of roadroad ends in a T intersection turn in direction of modifier
use laneDeprecated replaced by lanes on all intersection entries
continueTurn in direction of modifier to stay on the same road
roundabouttraverse roundabout, if the route leaves the roundabout there will be an additional property exit for exit counting. The modifier specifies the direction of entering the roundabout.
rotarya traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer rotary_name and/or rotary_pronunciation parameters (located in the RouteStep object) in addition to the exit parameter (located on the StepManeuver object).
roundabout turnDescribes a turn at a small roundabout that should be treated as a normal turn. The modifier indicates the turn direction. Example instruction: At the roundabout turn left.
notificationnot an actual turn but a change in the driving conditions. For example the travel mode or classes. If the road takes a turn itself, the modifier describes the direction
exit roundaboutDescribes a maneuver exiting a roundabout (usually preceded by a roundabout instruction)
exit rotaryDescribes the maneuver exiting a rotary (large named roundabout)

Please note that even though there are new name and notification instructions, the mode and name can change between all instructions. They only offer a fallback in case nothing else is to report.

  • modifier An optional string indicating the direction change of the maneuver.
modifierDescription
uturnindicates the reversal of direction
sharp righta sharp right turn
righta normal turn to the right
slight righta slight turn to the right
straightno relevant change in direction
slight lefta slight turn to the left
lefta normal turn to the left
sharp lefta sharp turn to the left

The list of turns without a modifier is limited to: depart/arrive. If the source/target location is close enough to the depart/arrive location, no modifier will be given.

The meaning depends on the type property.

typeDescription
turnmodifier indicates the change in direction accomplished through the turn
depart/arrivemodifier indicates the position of departure point and arrival point in relation to the current direction of travel
  • exit An optional integer indicating the number of the exit to take. The property exists for the roundabout / rotary property: Number of the roundabout exit to take. If an exit is undefined the destination is on the roundabout.

New properties (potentially depending on type) may be introduced in the future without an API version change.

Lane object

A Lane represents a turn lane at the corresponding turn location.

Properties

  • indications: an indication (e.g. marking on the road) specifying the turn lane. A road can have multiple indications (e.g. an arrow pointing straight and left). The indications are given in an array, each containing one of the following types. Further indications might be added on without an API version change.
valueDescription
noneNo dedicated indication is shown.
uturnAn indication signaling the possibility to reverse (i.e. fully bend arrow).
sharp rightAn indication indicating a sharp right turn (i.e. strongly bend arrow).
rightAn indication indicating a right turn (i.e. bend arrow).
slight rightAn indication indicating a slight right turn (i.e. slightly bend arrow).
straightNo dedicated indication is shown (i.e. straight arrow).
slight leftAn indication indicating a slight left turn (i.e. slightly bend arrow).
leftAn indication indicating a left turn (i.e. bend arrow).
sharp leftAn indication indicating a sharp left turn (i.e. strongly bend arrow).
  • valid: a boolean flag indicating whether the lane is a valid choice in the current maneuver

Example

json
{
+    "indications": ["left", "straight"],
+    "valid": false
+}

Intersection object

An intersection gives a full representation of any cross-way the path passes by. For every step, the very first intersection (intersections[0]) corresponds to the location of the StepManeuver. Further intersections are listed for every cross-way until the next turn instruction.

Properties

  • location: A [longitude, latitude] pair describing the location of the turn.
  • bearings: A list of bearing values (e.g. [0,90,180,270]) that are available at the intersection. The bearings describe all available roads at the intersection. Values are between 0-359 (0=true north)
  • classes: An array of strings signifying the classes (as specified in the profile) of the road exiting the intersection.
  • entry: A list of entry flags, corresponding in a 1:1 relationship to the bearings. A value of true indicates that the respective road could be entered on a valid route. false indicates that the turn onto the respective road would violate a restriction.
  • in: index into bearings/entry array. Used to calculate the bearing just before the turn. Namely, the clockwise angle from true north to the direction of travel immediately before the maneuver/passing the intersection. Bearings are given relative to the intersection. To get the bearing in the direction of driving, the bearing has to be rotated by a value of 180. The value is not supplied for depart maneuvers.
  • out: index into the bearings/entry array. Used to extract the bearing just after the turn. Namely, The clockwise angle from true north to the direction of travel immediately after the maneuver/passing the intersection. The value is not supplied for arrive maneuvers.
  • lanes: Array of Lane objects that denote the available turn lanes at the intersection. If no lane information is available for an intersection, the lanes property will not be present.

Example

json
{
+    "location":[13.394718,52.543096],
+    "in":0,
+    "out":2,
+    "bearings":[60,150,240,330],
+    "entry":["false","true","true","true"],
+    "classes": ["toll", "restricted"],
+    "lanes":{
+        "indications": ["left", "straight"],
+        "valid": false
+    }
+}

Waypoint object

The object is used to describe the waypoint on a route.

Properties

  • name Name of the street the coordinate snapped to
  • location Array that contains the [longitude, latitude] pair of the snapped coordinate
  • distance The distance, in meters, from the input coordinate to the snapped coordinate
  • hint Unique internal identifier of the segment (ephemeral, not constant over data updates) This can be used on subsequent requests to significantly speed up the query and to connect multiple services. E.g. you can use the hint value obtained by the nearest query as hint values for route inputs.

Example

json
{
+   "hint" : "KSoKADRYroqUBAEAEAAAABkAAAAGAAAAAAAAABhnCQCLtwAA_0vMAKlYIQM8TMwArVghAwEAAQH1a66g",
+   "distance" : 4.152629,
+   "name" : "Friedrichstraße",
+   "location" : [
+      13.388799,
+      52.517033
+   ]
+}

Flatbuffers format

The default response format is json, but OSRM supports binary flatbuffers format, which is much faster in serialization/deserialization, comparing to json.

The format itself is described in message descriptors, located at include/engine/api/flatbuffers directory. Those descriptors could be compiled to provide protocol parsers in Go/Javascript/Typescript/Java/Dart/C#/Python/Lobster/Lua/Rust/PHP/Kotlin. Precompiled protocol parser for C++ is supplied with OSRM.

Flatbuffers format provides exactly the same data, as json format with a slightly different layout, which was optimized to minimize in-transfer size.

Root object

Root object is the only object, available from a 'raw' flatbuffers buffer. It can be constructed with a following call:

     auto osrm = osrm::engine::api::fbresult::GetFBResult(some_input_buffer);
+

Properties

  • error: bool Marks response as erroneous. An erroneous response should include the code fieldset, all the other fields may not be present.
  • code: Error Error description object, only present, when error is true
  • waypoints: [Waypoint] Array of Waypoint objects. Should present for every service call, unless skip_waypoints is set to true. Table service will put sources array here.
  • routes: [RouteObject] Array of RouteObject objects. May be empty or absent. Should present for Route/Trip/Match services call.
  • table: Table Table object, may absent. Should be present in case of Table service call.

Error object

Contains error information.

Properties

  • code: string Error code
  • message: string Detailed error message

Waypoint object

Almost the same as json Waypoint object. The following properties differ:

  • location: Position Same as json location field, but different format.
  • nodes: Uint64Pair Same as json nodes field, but different format.

RouteObject object

Almost the same as json Route object. The following properties differ:

  • polyline: string Same as json geometry.polyline or geometry.polyline6 fields. One field for both formats.
  • coordinates: [Position] Same as json geometry.coordinates field, but different format.
  • legs: [Leg] Array of Leg objects.

Leg object

Almost the same as json Leg object. The following properties differ:

  • annotations: Annotation Same as json annotation field, but different format.
  • steps: [Step] Same as step annotation field, but different format.

Step object

Almost the same as json Step object. The following properties differ:

  • polyline: string Same as json geometry.polyline or geometry.polyline6 fields. One field for both formats.
  • coordinates: [Position] Same as json geometry.coordinates field, but different format.
  • maneuver: StepManeuver Same as json maneuver field, but different format.
typeDescription
Turna basic turn into the direction of the modifier
NewNameno turn is taken/possible, but the road name changes. The road can take a turn itself, following modifier.
Departindicates the departure of the leg
Arriveindicates the destination of the leg
Mergemerge onto a street (e.g. getting on the highway from a ramp, the modifier specifies the direction of the merge)
OnRamptake a ramp to enter a highway (direction given my modifier)
OffRamptake a ramp to exit a highway (direction given my modifier)
Forktake the left/right side at a fork depending on modifier
EndOfRoadroad ends in a T intersection turn in direction of modifier
ContinueTurn in direction of modifier to stay on the same road
Roundabouttraverse roundabout, if the route leaves the roundabout there will be an additional property exit for exit counting. The modifier specifies the direction of entering the roundabout.
Rotarya traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer rotary_name and/or rotary_pronunciation parameters (located in the RouteStep object) in addition to the exit parameter (located on the StepManeuver object).
RoundaboutTurnDescribes a turn at a small roundabout that should be treated as a normal turn. The modifier indicates the turn direction. Example instruction: At the roundabout turn left.
Notificationnot an actual turn but a change in the driving conditions. For example the travel mode or classes. If the road takes a turn itself, the modifier describes the direction
ExitRoundaboutDescribes a maneuver exiting a roundabout (usually preceded by a roundabout instruction)
ExitRotaryDescribes the maneuver exiting a rotary (large named roundabout)
  • driving_side: bool True stands for left side driving.
  • intersections: [Intersection] Same as json intersections field, but different format.

Intersection object

Almost the same as json Intersection object. The following properties differ:

  • location: Position Same as json location property, but in a different format.
  • lanes: [Lane] Array of Lane objects.

Lane object

Almost the same as json Lane object. The following properties differ:

  • indications: Turn Array of Turn enum values.
valueDescription
NoneNo dedicated indication is shown.
UTurnAn indication signaling the possibility to reverse (i.e. fully bend arrow).
SharpRightAn indication indicating a sharp right turn (i.e. strongly bend arrow).
RightAn indication indicating a right turn (i.e. bend arrow).
SlightRightAn indication indicating a slight right turn (i.e. slightly bend arrow).
StraightNo dedicated indication is shown (i.e. straight arrow).
SlightLeftAn indication indicating a slight left turn (i.e. slightly bend arrow).
LeftAn indication indicating a left turn (i.e. bend arrow).
SharpLeftAn indication indicating a sharp left turn (i.e. strongly bend arrow).

StepManeuver object

Almost the same as json StepManeuver object. The following properties differ:

  • location: Position Same as json location property, but in a different format.
  • type: ManeuverType Type of a maneuver (enum)
typeDescription
Turna basic turn into the direction of the modifier
NewNameno turn is taken/possible, but the road name changes. The road can take a turn itself, following modifier.
Departindicates the departure of the leg
Arriveindicates the destination of the leg
Mergemerge onto a street (e.g. getting on the highway from a ramp, the modifier specifies the direction of the merge)
OnRamptake a ramp to enter a highway (direction given my modifier)
OffRamptake a ramp to exit a highway (direction given my modifier)
Forktake the left/right side at a fork depending on modifier
EndOfRoadroad ends in a T intersection turn in direction of modifier
ContinueTurn in direction of modifier to stay on the same road
Roundabouttraverse roundabout, if the route leaves the roundabout there will be an additional property exit for exit counting. The modifier specifies the direction of entering the roundabout.
Rotarya traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer rotary_name and/or rotary_pronunciation parameters (located in the RouteStep object) in addition to the exit parameter (located on the StepManeuver object).
RoundaboutTurnDescribes a turn at a small roundabout that should be treated as a normal turn. The modifier indicates the turn direction. Example instruction: At the roundabout turn left.
Notificationnot an actual turn but a change in the driving conditions. For example the travel mode or classes. If the road takes a turn itself, the modifier describes the direction
ExitRoundaboutDescribes a maneuver exiting a roundabout (usually preceded by a roundabout instruction)
ExitRotaryDescribes the maneuver exiting a rotary (large named roundabout)
  • modifier: Turn Maneuver turn (enum)

Annotation object

Exactly the same as json annotation object.

Position object

A point on Earth.

Properties

  • longitude: float Point's longitude
  • latitude: float Point's latitude

Uint64Pair

A pair of long long integers. Used only by Waypoint object.

Properties

  • first: uint64 First pair value.
  • second: uint64 Second pair value.

Table object

Almost the same as json Table object. The main difference is that 'sources' field is absent and the root's object 'waypoints' field is used instead. All the other differences follow:

  • durations: [float] Flat representation of a durations matrix. Element at row;col can be addressed as [row * cols + col]
  • distances: [float] Flat representation of a destinations matrix. Element at row;col can be addressed as [row * cols + col]
  • destinations: [Waypoint] Array of Waypoint objects. Will be null if skip_waypoints will be set to true
  • rows: ushort Number of rows in durations/destinations matrices.
  • cols: ushort Number of cols in durations/destinations matrices.
`,240)])])}const E=t(o,[["render",d]]);export{u as __pageData,E as default}; diff --git a/docs/v26.5.0/assets/http.md.B98BbSjI.lean.js b/docs/v26.5.0/assets/http.md.B98BbSjI.lean.js new file mode 100644 index 0000000..577bb1e --- /dev/null +++ b/docs/v26.5.0/assets/http.md.B98BbSjI.lean.js @@ -0,0 +1 @@ +import{_ as t,o as s,c as i,ag as a}from"./chunks/framework.C2NLiVii.js";const n="/assets/example-tile-response.Edf9KoW6.png",u=JSON.parse('{"title":"OSRM HTTP server","description":"","frontmatter":{},"headers":[],"relativePath":"http.md","filePath":"http.md"}'),o={name:"http.md"};function d(l,e,r,h,p,c){return s(),i("div",null,[...e[0]||(e[0]=[a("",240)])])}const E=t(o,[["render",d]]);export{u as __pageData,E as default}; diff --git a/docs/v26.5.0/assets/index.md.BuTlAqVr.js b/docs/v26.5.0/assets/index.md.BuTlAqVr.js new file mode 100644 index 0000000..ea27414 --- /dev/null +++ b/docs/v26.5.0/assets/index.md.BuTlAqVr.js @@ -0,0 +1 @@ +import{_ as t,o as i,c as r,ag as a}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"OSRM","text":"API Documentation","tagline":"The Open Source Routing Machine - High performance routing engine for OpenStreetMap data","actions":[{"theme":"brand","text":"HTTP API","link":"/http"},{"theme":"alt","text":"Node.js API","link":"/nodejs/api"},{"theme":"alt","text":"Python API","link":"/python/api"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/Project-OSRM/osrm-backend"},{"theme":"alt","text":"Sponsor ❤","link":"https://github.com/sponsors/Project-OSRM"}]},"features":[{"icon":"🚗","title":"Route Service","details":"Find the fastest path between coordinates with support for alternative routes and turn-by-turn instructions."},{"icon":"📊","title":"Table Service","details":"Compute time and distance matrices between multiple locations for optimization problems."},{"icon":"🗺️","title":"Map Matching","details":"Match GPS traces to the road network with high accuracy using the Match service."},{"icon":"🎯","title":"Trip Planning","details":"Solve the traveling salesman problem with the Trip service for optimal route ordering."},{"icon":"📍","title":"Nearest Service","details":"Snap coordinates to the street network and find the nearest road segments."},{"icon":"🎨","title":"Tile Service","details":"Generate vector tiles for visualizing the road network and routing data."}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),o={name:"index.md"};function n(s,e,l,c,d,h){return i(),r("div",null,[...e[0]||(e[0]=[a('

Getting Started

OSRM provides powerful routing services through both HTTP and Node.js APIs:

Documentation

Resources

',7)])])}const g=t(o,[["render",n]]);export{p as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/index.md.BuTlAqVr.lean.js b/docs/v26.5.0/assets/index.md.BuTlAqVr.lean.js new file mode 100644 index 0000000..5bf84c4 --- /dev/null +++ b/docs/v26.5.0/assets/index.md.BuTlAqVr.lean.js @@ -0,0 +1 @@ +import{_ as t,o as i,c as r,ag as a}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"OSRM","text":"API Documentation","tagline":"The Open Source Routing Machine - High performance routing engine for OpenStreetMap data","actions":[{"theme":"brand","text":"HTTP API","link":"/http"},{"theme":"alt","text":"Node.js API","link":"/nodejs/api"},{"theme":"alt","text":"Python API","link":"/python/api"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/Project-OSRM/osrm-backend"},{"theme":"alt","text":"Sponsor ❤","link":"https://github.com/sponsors/Project-OSRM"}]},"features":[{"icon":"🚗","title":"Route Service","details":"Find the fastest path between coordinates with support for alternative routes and turn-by-turn instructions."},{"icon":"📊","title":"Table Service","details":"Compute time and distance matrices between multiple locations for optimization problems."},{"icon":"🗺️","title":"Map Matching","details":"Match GPS traces to the road network with high accuracy using the Match service."},{"icon":"🎯","title":"Trip Planning","details":"Solve the traveling salesman problem with the Trip service for optimal route ordering."},{"icon":"📍","title":"Nearest Service","details":"Snap coordinates to the street network and find the nearest road segments."},{"icon":"🎨","title":"Tile Service","details":"Generate vector tiles for visualizing the road network and routing data."}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),o={name:"index.md"};function n(s,e,l,c,d,h){return i(),r("div",null,[...e[0]||(e[0]=[a("",7)])])}const g=t(o,[["render",n]]);export{p as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/docs/v26.5.0/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000..b6b603d Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/docs/v26.5.0/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/docs/v26.5.0/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000..def40a4 Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/docs/v26.5.0/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/docs/v26.5.0/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 0000000..e070c3d Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/docs/v26.5.0/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/docs/v26.5.0/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000..a3c16ca Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/docs/v26.5.0/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/docs/v26.5.0/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000..2210a89 Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/docs/v26.5.0/assets/inter-italic-latin.C2AdPX0b.woff2 b/docs/v26.5.0/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 0000000..790d62d Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/docs/v26.5.0/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/docs/v26.5.0/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 0000000..1eec077 Binary files /dev/null and b/docs/v26.5.0/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/docs/v26.5.0/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 0000000..2cfe615 Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/docs/v26.5.0/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 0000000..e3886dd Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/docs/v26.5.0/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000..36d6748 Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-greek.BBVDIX6e.woff2 b/docs/v26.5.0/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000..2bed1e8 Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/docs/v26.5.0/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000..9a8d1e2 Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-latin.Di8DUHzh.woff2 b/docs/v26.5.0/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000..07d3c53 Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/docs/v26.5.0/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/docs/v26.5.0/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000..57bdc22 Binary files /dev/null and b/docs/v26.5.0/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/docs/v26.5.0/assets/libosrm.md.BKkADM6U.js b/docs/v26.5.0/assets/libosrm.md.BKkADM6U.js new file mode 100644 index 0000000..d88ab6e --- /dev/null +++ b/docs/v26.5.0/assets/libosrm.md.BKkADM6U.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,ag as r}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"libosrm.md","filePath":"libosrm.md"}'),i={name:"libosrm.md"};function n(s,e,c,d,l,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

Introduction

OSRM can be used as a library (libosrm) via C++ instead of using it through the HTTP interface and osrm-routed. This allows for fine-tuning OSRM and has much less overhead. Here is a quick introduction into how to use libosrm in the current version.

Take a look at the example code that lives in the example directory. Here is all you ever wanted to know about libosrm, that is a short description of what the types do and where to find documentation on it:

Important interface objects

  • EngineConfig - for initializing an OSRM instance we can configure certain properties and constraints. E.g. the storage config is the base path such as france.osm.osrm from which we derive and load france.osm.osrm.* auxiliary files. This also lets you set constraints such as the maximum number of locations allowed for specific services.

  • OSRM - this is the main Routing Machine type with functions such as Route and Table. You initialize it with a EngineConfig. It does all the heavy lifting for you. Each function takes its own parameters, e.g. the Route function takes RouteParameters, and a out-reference to a JSON result that gets filled. The return value is a Status, indicating error or success.

  • Status - this is a type wrapping Error or Ok for indicating error or success, respectively.

  • TableParameters - this is an example of parameter types the Routing Machine functions expect. In this case Table expects its own parameters as TableParameters. You can see it wrapping two vectors, sources and destinations --- these are indices into your coordinates for the table service to construct a matrix from (empty sources or destinations means: use all of them). If you ask yourself where coordinates come from, you can see TableParameters inheriting from BaseParameters.

  • BaseParameters - this most importantly holds coordinates (and a few other optional properties that you don't need for basic usage); the specific parameter types inherit from BaseParameters to get these member attributes. That means your TableParameters type has coordinates, sources and destinations member attributes (and a few other that we ignore for now).

  • Coordinate - this is a wrapper around a (longitude, latitude) pair. We really don't care about (lon, lat) vs (lat, lon) but we don't want you to accidentally mix them up, so both latitude and longitude are strictly typed wrappers around integers (fixed notation such as 13423240) and floating points (floating notation such as 13.42324).

  • Parameters for other services - here are all other *Parameters you need for other Routing Machine services.

  • JSON - this is a sum type resembling JSON. The Routing Machine service functions take a out-ref to a JSON result and fill it accordingly. It is currently implemented using std::variant. There are two ways to work with this sum type: either provide a visitor that acts on each type on visitation (with std::visit) or use the std::get function in case you're sure about the structure. The JSON structure is written down in the HTTP API.

Example

See the example folder in the OSRM repository.

Workflow

  • Create an OSRM instance initialized with a EngineConfig
  • Call the service function on the OSRM object providing service specific *Parameters
  • Check the return code and use the JSON result
',9)])])}const m=t(i,[["render",n]]);export{p as __pageData,m as default}; diff --git a/docs/v26.5.0/assets/libosrm.md.BKkADM6U.lean.js b/docs/v26.5.0/assets/libosrm.md.BKkADM6U.lean.js new file mode 100644 index 0000000..10e5788 --- /dev/null +++ b/docs/v26.5.0/assets/libosrm.md.BKkADM6U.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,ag as r}from"./chunks/framework.C2NLiVii.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"libosrm.md","filePath":"libosrm.md"}'),i={name:"libosrm.md"};function n(s,e,c,d,l,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",9)])])}const m=t(i,[["render",n]]);export{p as __pageData,m as default}; diff --git a/docs/v26.5.0/assets/nodejs_api.md.B1H4WFni.js b/docs/v26.5.0/assets/nodejs_api.md.B1H4WFni.js new file mode 100644 index 0000000..0ec01ba --- /dev/null +++ b/docs/v26.5.0/assets/nodejs_api.md.B1H4WFni.js @@ -0,0 +1,66 @@ +import{_ as a,o as s,c as t,ag as i}from"./chunks/framework.C2NLiVii.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"nodejs/api.md","filePath":"nodejs/api.md"}'),r={name:"nodejs/api.md"};function o(n,e,l,d,p,h){return s(),t("div",null,[...e[0]||(e[0]=[i(`

OSRM

The OSRM method is the main constructor for creating an OSRM instance. An OSRM instance requires a .osrm.* dataset(.osrm.* because it contains several files), which is prepared by the OSRM toolchain. You can create such a .osrm.* dataset by running the OSRM binaries we ship in node_modules/osrm/lib/binding_napi_v8/ and default profiles (e.g. for setting speeds and determining road types to route on) in node_modules/osrm/profiles/:

node_modules/osrm/lib/binding_napi_v8/osrm-extract data.osm.pbf -p node_modules/osrm/profiles/car.lua
+node_modules/osrm/lib/binding_napi_v8/osrm-contract data.osrm
+

Consult the osrm-backend documentation for further details.

Once you have a complete network.osrm.* dataset, you can calculate routes in javascript with this object.

javascript
var osrm = new OSRM('network.osrm');

Parameters

  • options (Object | String) Options for creating an OSRM object or string to the .osrm file. (optional, default {shared_memory:true})

    • options.algorithm String? The algorithm to use for routing. Can be 'CH', or 'MLD'. Default is 'CH'. Make sure you prepared the dataset with the correct toolchain.
    • options.shared_memory Boolean? Connects to the persistent shared memory datastore. This requires you to run osrm-datastore prior to creating an OSRM object.
    • options.dataset_name String? Connects to the persistent shared memory datastore defined by --dataset_name option when running osrm-datastore. This requires you to run osrm-datastore --dataset_name prior to creating an OSRM object.
    • options.memory_file String? DEPRECATED Old behaviour: Path to a file on disk to store the memory using mmap. Current behaviour: setting this value is the same as setting mmap_memory: true.
    • options.mmap_memory Boolean? Map on-disk files to virtual memory addresses (mmap), rather than loading into RAM.
    • options.path String? The path to the .osrm files. This is mutually exclusive with setting {options.shared_memory} to true.
    • options.disable_feature_dataset Array? Disables a feature dataset from being loaded into memory if not needed. Options: ROUTE_STEPS, ROUTE_GEOMETRY.
    • options.max_locations_trip Number? Max. locations supported in trip query (default: unlimited).
    • options.max_locations_viaroute Number? Max. locations supported in viaroute query (default: unlimited).
    • options.max_locations_distance_table Number? Max. locations supported in distance table query (default: unlimited).
    • options.max_locations_map_matching Number? Max. locations supported in map-matching query (default: unlimited).
    • options.max_radius_map_matching Number? Max. radius size supported in map matching query (default: 5).
    • options.max_results_nearest Number? Max. results supported in nearest query (default: unlimited).
    • options.max_alternatives Number? Max. number of alternatives supported in alternative routes query (default: 3).
    • options.default_radius Number? Default radius for queries (default: unlimited).

route

Returns the fastest route between two or more coordinates while visiting the waypoints in order.

Parameters

  • options Object Object literal containing parameters for the route query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be null (unlimited, default) or double >= 0.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.exclude Array? List of classes to avoid, order does not matter.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.alternatives Boolean Search for alternative routes. (optional, default false)
    • options.alternatives Number Search for up to this many alternative routes. Please note that even if alternative routes are requested, a result cannot be guaranteed. (optional, default 0)
    • options.steps Boolean Return route steps for each route leg. (optional, default false)
    • options.annotations (Array | Boolean) An array with strings of duration, nodes, distance, weight, datasources, speed or boolean for enabling/disabling all. (optional, default false)
    • options.geometries String Returned route geometry format (influences overview and per step). Can also be geojson. (optional, default polyline)
    • options.overview String Add overview geometry either full, simplified according to highest zoom level it could be displayed on, or not at all (false). If you want the overview for each leg, you can use by_legs. (optional, default simplified)
    • options.continue_straight Boolean? Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile.
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be null (unrestricted, default), curb or opposite. null/true/false
    • options.waypoints Array? Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index.
    • options.format String? Which output format to use, either json, or flatbuffers.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
    • options.skip_waypoints Boolean Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of response and do not want to transfer waste data. (optional, default false)
  • callback Function

Examples

javascript
var osrm = new OSRM("berlin-latest.osrm");
+osrm.route({coordinates: [[52.519930,13.438640], [52.513191,13.415852]]}, function(err, result) {
+  if(err) throw err;
+  console.log(result.waypoints); // array of Waypoint objects representing all waypoints in order
+  console.log(result.routes); // array of Route objects ordered by descending recommendation rank
+});

Returns Object An array of Waypoint objects representing all waypoints in order AND an array of Route objects ordered by descending recommendation rank.

nearest

Snaps a coordinate to the street network and returns the nearest n matches.

Note: coordinates in the general options only supports a single {longitude},{latitude} entry.

Parameters

  • options Object Object literal containing parameters for the nearest query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be null (unlimited, default) or double >= 0.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.number Number Number of nearest segments that should be returned. Must be an integer greater than or equal to 1. (optional, default 1)
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be null (unrestricted, default), curb or opposite.
    • options.format String? Which output format to use, either json, or flatbuffers.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [[13.388860,52.517037]],
+  number: 3,
+  bearings: [[0,20]]
+};
+osrm.nearest(options, function(err, response) {
+  console.log(response.waypoints); // array of Waypoint objects
+});

Returns Object containing waypoints. waypoints: array of Ẁaypoint objects sorted by distance to the input coordinate. Each object has an additional distance property, which is the distance in meters to the supplied input coordinate.

table

Computes duration table for the given locations. Allows for both symmetric and asymmetric tables. Optionally returns distance table.

Parameters

  • options Object Object literal containing parameters for the table query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be null (unlimited, default) or double >= 0.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.sources Array? An array of index elements (0 <= integer < #coordinates) to use location with given index as source. Default is to use all.
    • options.destinations Array? An array of index elements (0 <= integer < #coordinates) to use location with given index as destination. Default is to use all.
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate.. Can be null (unrestricted, default), curb or opposite.
    • options.fallback_speed Number? Replace null responses in result with as-the-crow-flies estimates based on fallback_speed. Value is in metres/second.
    • options.fallback_coordinate String? Either input (default) or snapped. If using a fallback_speed, use either the user-supplied coordinate (input), or the snapped coordinate (snapped) for calculating the as-the-crow-flies distance between two points.
    • options.scale_factor Number? Multiply the table duration values in the table by this number for more controlled input into a route optimization solver.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
    • options.annotations Array? Return the requested table or tables in response. Can be ['duration'] (return the duration matrix, default), [distance'] (return the distance matrix), or ['duration', distance'] (return both the duration matrix and the distance matrix).
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [
+    [13.388860,52.517037],
+    [13.397634,52.529407],
+    [13.428555,52.523219]
+  ]
+};
+osrm.table(options, function(err, response) {
+  console.log(response.durations); // array of arrays, matrix in row-major order
+  console.log(response.distances); // array of arrays, matrix in row-major order
+  console.log(response.sources); // array of Waypoint objects
+  console.log(response.destinations); // array of Waypoint objects
+});

Returns Object containing durations, distances, sources, and destinations. durations: array of arrays that stores the matrix in row-major order. durations[i][j] gives the travel time from the i-th waypoint to the j-th waypoint. Values are given in seconds. distances: array of arrays that stores the matrix in row-major order. distances[i][j] gives the travel time from the i-th waypoint to the j-th waypoint. Values are given in meters. sources: array of Ẁaypoint objects describing all sources in order. destinations: array of Ẁaypoint objects describing all destinations in order. fallback_speed_cells: (optional) if fallback_speed is used, will be an array of arrays of row,column values, indicating which cells contain estimated values.

tile

This generates Mapbox Vector Tiles that can be viewed with a vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can be used to examine the routing graph. The tiles are generated directly from the data in-memory, so are in sync with actual routing results, and let you examine which roads are actually routable, and what weights they have applied.

Parameters

Examples

javascript
var osrm = new OSRM('network.osrm');
+osrm.tile([0, 0, 0], function(err, response) {
+  if (err) throw err;
+  fs.writeFileSync('./tile.vector.pbf', response); // write the buffer to a file
+});

Returns Buffer contains a Protocol Buffer encoded vector tile.

match

Map matching matches given GPS points to the road network in the most plausible way. Please note the request might result multiple sub-traces. Large jumps in the timestamps (>60s) or improbable transitions lead to trace splits if a complete matching could not be found. The algorithm might not be able to match all points. Outliers are removed if they can not be matched successfully.

Parameters

  • options Object Object literal containing parameters for the match query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.steps Boolean Return route steps for each route. (optional, default false)
    • options.annotations (Array | Boolean) An array with strings of duration, nodes, distance, weight, datasources, speed or boolean for enabling/disabling all. (optional, default false)
    • options.geometries String Returned route geometry format (influences overview and per step). Can also be geojson. (optional, default polyline)
    • options.overview String Add overview geometry either full, simplified according to highest zoom level it could be display on, or not at all (false). (optional, default simplified)
    • options.timestamps Array<Number>? Timestamp of the input location (integers, UNIX-like timestamp).
    • options.radiuses Array? Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy. Can be null for default value 5 meters or double >= 0.
    • options.gaps String Allows the input track splitting based on huge timestamp gaps between points. Either split or ignore. (optional, default split)
    • options.tidy Boolean Allows the input track modification to obtain better matching quality for noisy tracks. (optional, default false)
    • options.waypoints Array? Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+    coordinates: [[13.393252,52.542648],[13.39478,52.543079],[13.397389,52.542107]],
+    timestamps: [1424684612, 1424684616, 1424684620]
+};
+osrm.match(options, function(err, response) {
+    if (err) throw err;
+    console.log(response.tracepoints); // array of Waypoint objects
+    console.log(response.matchings); // array of Route objects
+});

Returns Object containing tracepoints and matchings. tracepoints Array of Ẁaypoint objects representing all points of the trace in order. If the trace point was omitted by map matching because it is an outlier, the entry will be null. Each Waypoint object has the following additional properties, 1) matchings_index: Index to the Route object in matchings the sub-trace was matched to, 2) waypoint_index: Index of the waypoint inside the matched route. 3) alternatives_count: Number of probable alternative matchings for this trace point. A value of zero indicate that this point was matched unambiguously. Split the trace at these points for incremental map matching. matchings is an array of Route objects that assemble the trace. Each Route object has an additional confidence property, which is the confidence of the matching. float value between 0 and 1. 1 is very confident that the matching is correct.

trip

The trip plugin solves the Traveling Salesman Problem using a greedy heuristic (farthest-insertion algorithm) for 10 or * more waypoints and uses brute force for less than 10 waypoints. The returned path does not have to be the shortest path, * as TSP is NP-hard it is only an approximation.

Note that all input coordinates have to be connected for the trip service to work. Currently, not all combinations of roundtrip, source and destination are supported. Right now, the following combinations are possible:

roundtripsourcedestinationsupported
truefirstlastyes
truefirstanyyes
trueanylastyes
trueanyanyyes
falsefirstlastyes
falsefirstanyno
falseanylastno
falseanyanyno

Parameters

  • options Object Object literal containing parameters for the trip query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be double >= 0 or null (unlimited, default).
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.steps Boolean Return route steps for each route. (optional, default false)
    • options.annotations (Array | Boolean) An array with strings of duration, nodes, distance, weight, datasources, speed or boolean for enabling/disabling all. (optional, default false)
    • options.geometries String Returned route geometry format (influences overview and per step). Can also be geojson. (optional, default polyline)
    • options.overview String Add overview geometry either full, simplified, false or by_legs. (optional, default simplified)
    • options.roundtrip Boolean Return route is a roundtrip. (optional, default true)
    • options.source String Return route starts at any or first coordinate. (optional, default any)
    • options.destination String Return route ends at any or last coordinate. (optional, default any)
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be null (unrestricted, default), curb or opposite.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [
+    [13.36761474609375, 52.51663871100423],
+    [13.374481201171875, 52.506191342034576]
+  ],
+  source: "first",
+  destination: "last",
+  roundtrip: false
+}
+osrm.trip(options, function(err, response) {
+  if (err) throw err;
+  console.log(response.waypoints); // array of Waypoint objects
+  console.log(response.trips); // array of Route objects
+});

Returns Object containing waypoints and trips. waypoints: an array of Waypoint objects representing all waypoints in input order. Each Waypoint object has the following additional properties, 1) trips_index: index to trips of the sub-trip the point was matched to, and 2) waypoint_index: index of the point in the trip. trips: an array of Route objects that assemble the trace.

Configuration

All plugins support a second additional object that is available to configure some NodeJS specific behaviours.

Parameters

  • plugin_config Object? Object literal containing parameters for the trip query.

    • plugin_config.format String? The format of the result object to various API calls. Valid options are object (default if options.format is json), which returns a standard Javascript object, as described above, and buffer(default if options.format is flatbuffers), which will return a NodeJS Buffer object, containing a JSON string or Flatbuffers object. The latter has the advantage that it can be immediately serialized to disk/sent over the network, and the generation of the string is performed outside the main NodeJS event loop. This option is ignored by the tile plugin. Also note that options.format set to flatbuffers cannot be used with plugin_config.format set to object. json_buffer is deprecated alias for buffer.

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [
+    [13.36761474609375, 52.51663871100423],
+    [13.374481201171875, 52.506191342034576]
+  ]
+};
+osrm.route(options, { format: "buffer" }, function(err, response) {
+  if (err) throw err;
+  console.log(response.toString("utf-8"));
+});

Responses

Route

Represents a route through (potentially multiple) waypoints.

Parameters

RouteLeg

Represents a route between two waypoints.

Parameters

RouteStep

A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a single way to the subsequent step.

Parameters

StepManeuver

Parameters

Waypoint

Object used to describe waypoint on a route.

Parameters

`,79)])])}const k=a(r,[["render",o]]);export{g as __pageData,k as default}; diff --git a/docs/v26.5.0/assets/nodejs_api.md.B1H4WFni.lean.js b/docs/v26.5.0/assets/nodejs_api.md.B1H4WFni.lean.js new file mode 100644 index 0000000..a298662 --- /dev/null +++ b/docs/v26.5.0/assets/nodejs_api.md.B1H4WFni.lean.js @@ -0,0 +1 @@ +import{_ as a,o as s,c as t,ag as i}from"./chunks/framework.C2NLiVii.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"nodejs/api.md","filePath":"nodejs/api.md"}'),r={name:"nodejs/api.md"};function o(n,e,l,d,p,h){return s(),t("div",null,[...e[0]||(e[0]=[i("",79)])])}const k=a(r,[["render",o]]);export{g as __pageData,k as default}; diff --git a/docs/v26.5.0/assets/profiles.md.PHAThxX1.js b/docs/v26.5.0/assets/profiles.md.PHAThxX1.js new file mode 100644 index 0000000..b733825 --- /dev/null +++ b/docs/v26.5.0/assets/profiles.md.PHAThxX1.js @@ -0,0 +1,83 @@ +import{_ as e,o as a,c as s,ag as i}from"./chunks/framework.C2NLiVii.js";const k=JSON.parse('{"title":"OSRM profiles","description":"","frontmatter":{},"headers":[],"relativePath":"profiles.md","filePath":"profiles.md"}'),n={name:"profiles.md"};function d(r,t,o,l,h,p){return a(),s("div",null,[...t[0]||(t[0]=[i(`

OSRM profiles

OSRM supports "profiles". Profiles represent routing behavior for different transport modes like car, bike and foot. You can also create profiles for variations like a fastest/shortest car profile or fastest/safest/greenest bicycles profile.

A profile describes whether or not it's possible to route along a particular type of way, whether we can pass a particular node, and how quickly we'll be traveling when we do. This feeds into the way the routing graph is created and thus influences the output routes.

Available profiles

Out-of-the-box OSRM comes with profiles for car, bicycle and foot. You can easily modify these or create new ones if you like.

Profiles have a 'lua' extension, and are placed in 'profiles' directory.

When running OSRM preprocessing commands you specify the profile with the --profile (or the shorthand -p) option, for example:

osrm-extract --profile ../profiles/car.lua planet-latest.osm.pbf

Using Multiple Profiles with the Same Input

You can extract the same OSM file with different profiles by specifying an output path:

bash
osrm-extract --profile profiles/car.lua planet.osm.pbf --output /data/car
+osrm-extract --profile profiles/bicycle.lua planet.osm.pbf --output /data/bicycle
+osrm-extract --profile profiles/foot.lua planet.osm.pbf --output /data/foot

This avoids the need to create symbolic links to the input file.

Processing flow

It's important to understand that profiles are used when preprocessing the OSM data, NOT at query time when routes are computed.

This means that after modifying a profile you will need to extract, contract and reload the data again and to see changes in the routing results. See Processing Flow for more.

Profiles are written in Lua

Profiles are not just configuration files. They are scripts written in the Lua scripting language. The reason for this is that OpenStreetMap data is complex, and it's not possible to simply define tag mappings. Lua scripting offers a powerful way to handle all the possible tag combinations found in OpenStreetMap nodes and ways.

Basic structure of profiles

A profile will process every node and way in the OSM input data to determine what ways are routable in which direction, at what speed, etc.

A profile will typically:

  • Define api version (required)
  • Require library files (optional)
  • Define setup function (required)
  • Define process functions (some are required)
  • Return functions table (required)

A profile can also define various local functions it needs.

Looking at car.lua as an example, at the top of the file the api version is defined and then required library files are included.

Then follows the setup function, which is called once when the profile is loaded. It returns a big hash table of configurations, specifying things like what speed to use for different way types. The configurations are used later in the various processing functions. Many adjustments can be done just by modifying this configuration table.

The setup function is also where you can do other setup, like loading an elevation data source if you want to consider that when processing ways.

Then come the process_node and process_way functions, which are called for each OSM node and way when extracting OpenStreetMap data with osrm-extract.

The process_turn function processes every possible turn in the network, and sets a penalty depending on the angle and turn of the movement.

Profiles can also define a process_segment function to handle differences in speed along an OSM way, for example to handle elevation. As you can see, this is not currently used in the car profile.

At the end of the file, a table is returned with references to the setup and processing functions the profile has defined.

Understanding speed, weight and rate

When computing a route from A to B there can be different measures of what is the best route. That's why there's a need for different profiles.

Because speeds vary on different types of roads, the shortest and the fastest route are typically different. But there are many other possible preferences. For example a user might prefer a bicycle route that follow parks or other green areas, even though both duration and distance are a bit longer.

To handle this, OSRM doesn't simply choose the ways with the highest speed. Instead it uses the concepts of weight and rate. The rate is an abstract measure that you can assign to ways as you like to make some ways preferable to others. Routing will prefer ways with high rate.

The weight of a way is normally computed as length / rate. The weight can be thought of as the resistance or cost when passing the way. Routing will prefer ways with low weight.

You can also set the weight of a way to a fixed value. In this case it's not calculated based on the length or rate, and the rate is ignored.

You should set the speed to your best estimate of the actual speed that will be used on a particular way. This will result in the best estimated travel times.

If you want to prefer certain ways due to other factors than the speed, adjust the rate accordingly. If you adjust the speed, the time estimation will be skewed.

If you set the same rate on all ways, the result will be shortest path routing. If you set rate = speed on all ways, the result will be fastest path routing. If you want to prioritize certain streets, increase the rate on these.

Elements

api_version

A profile should set api_version at the top of your profile. This is done to ensure that older profiles are still supported when the api changes. If api_version is not defined, 0 will be assumed. The current api version is 4.

Library files

The folder profiles/lib/ contains Lua library files for handling many common processing tasks.

FileNotes
way_handlers.luaFunctions for processing way tags
tags.luaFunctions for general parsing of OSM tags
set.luaDefines the Set helper for handling sets of values
sequence.luaDefines the Sequence helper for handling sequences of values
access.luaFunction for finding relevant access tags
destination.luaFunction for finding relevant destination tags
maxspeed.luaFunction for determining maximum speed
guidance.luaFunction for processing guidance attributes

They all return a table of functions when you use require to load them. You can either store this table and reference its functions later, or if you need only a single function you can store that directly.

setup()

The setup function is called once when the profile is loaded and must return a table of configurations. It's also where you can do other global setup, like loading data sources that are used during processing.

Note that processing of data is parallelized and several unconnected Lua interpreters will be running at the same time. The setup function will be called once for each. Each Lua interpreter will have its own set of globals.

The following global properties can be set under properties in the hash you return in the setup function:

AttributeTypeNotes
weight_nameStringName used in output for the routing weight property (default 'duration')
weight_precisionUnsignedDecimal precision of edge weights (default 1)
left_hand_drivingBooleanAre vehicles assumed to drive on the left? (used in guidance, default false)
use_turn_restrictionsBooleanAre turn restrictions followed? (default false)
continue_straight_at_waypointBooleanMust the route continue straight on at a via point, or are U-turns allowed? (default true)
max_speed_for_map_matchingFloatMaximum vehicle speed to be assumed in matching (in m/s)
max_turn_weightFloatMaximum turn penalty weight
force_split_edgesBooleanTrue value forces a split of forward and backward edges of extracted ways and guarantees that process_segment will be called for all segments (default false)

The following additional global properties can be set in the hash you return in the setup function:

AttributeTypeNotes
excludableSequence of SetsDetermines which class-combinations are supported by the exclude option at query time. E.g. Sequence{Set{"ferry", "motorway"}, Set{"motorway"}} will allow you to exclude ferries and motorways, or only motorways.
classesSequenceDetermines the allowed classes that can be referenced using {forward,backward}_classes on the way in the process_way function.
restrictionsSequenceDetermines which turn restrictions will be used for this profile.
suffix_listSetList of name suffixes needed for determining if "Highway 101 NW" the same road as "Highway 101 ES".
relation_typesSequenceDetermines which relations should be cached for processing in this profile. It contains relations types

process_node(profile, node, result, relations)

Process an OSM node to determine whether this node is an obstacle, if it can be passed at all and whether passing it incurs a delay.

ArgumentDescription
profileThe configuration table you returned in setup.
nodeThe input node to process (read-only).
resultThe output that you will modify.
relationsStorage of relations to access relations, where node is a member.

The following attributes can be set on result: (Note: for new code use the obstacle_map.

AttributeTypeNotes
barrierBooleanIs it an impassable barrier?
traffic_lightsBooleanIs it a traffic light (incurs delay in process_turn)?

Obstacle

A user type that represents an obstacle on the road or a place where you can turn around.

This may be a completely impassable obstacle like a barrier, a temporary obstacle like a traffic light or a stop sign, or an obstacle that just slows you down like a traffic_calming. The obstacle may be present in both directions or in one direction only.

This also represents a good turning point like a mini_roundabout, turning_loop, or turning_circle.

An object of this type is immutable once constructed.

lua
local obs = Obstacle.new(
+  obstacle_type.traffic_signals,
+  obstacle_direction.forward,
+  2.5,
+  0
+)
+assert(obs.duration == 2.5)
MemberModeTypeNotes
typeread-onlyobstacle_typeeg. obstacle_type.barrier
directionread-onlyobstacle_directioneg. obstacle_direction.forward
durationread-onlyfloatThe expected delay in seconds
weightread-onlyfloatThe weight

obstacle_type

An enum with the following keys:

Keys
none
barrier
traffic_signals
stop
give_way
crossing
traffic_calming
mini_roundabout
turning_loop
turning_circle
gate

obstacle_direction

An enum with the following keys:

Keys
none
forward
backward
both

obstacle_map

A global user type. It stores obstacles.

The canonical workflow is: to store obstacles in process_node() and retrieve them in process_turn().

Note: In the course of processing, between the process_node() stage and the process_turn() stage, the extractor switches from using OSM nodes to using internal nodes. Both types have different ids. You can only store OSM nodes and only retrieve internal nodes. This implies that, in process_node(), you cannot retrieve an obstacle you have just stored.

obstacle_map:add(node, obstacle)

Call this function inside process_node() to register an obstacle on a node. You can register as many different obstacles as you wish on any given node. It is your responsibility to register the same obstacle only once.

In a following step -- likely in process_turn() -- you can retrieve all obstacles registered at any given node. This function works with OSM nodes.

ArgumentTypeNotes
nodeOSMNodeThe same node as passed to process_node.
obstacleObstacleThe obstacle

Usage example:

lua
function process_node(profile, node, result, relations)
+  ...
+  obstacle_map:add(node,
+    Obstacle.new(
+      obstacle_type.traffic_signal,
+      obstacle_direction.forward,
+      2, 0))
+end

obstacle_map:any(from, to, type)

Return true if there are any obstacles at node to when coming from node from and having the type type.

You will likely call this function inside process_turn(). Note that this works only with internal nodes, not with OSM nodes.

lua
bool obstacle_map:any(to)
+bool obstacle_map:any(from, to)
+bool obstacle_map:any(from, to, type)
ArgumentTypeNotes
fromNodeThe leading node. Optional.
toNodeThe node with the obstacle.
typeobstacle_typeThe obstacle type. Defaults to all types. May be a bitwise-or combination of types.
returnsboolTrue if there are any obstacles satisfiying the given criteria.

Usage examples:

lua
function process_turn(profile, turn)
+  if obstacle_map:any(turn.via) then
+    ...
+  end
+  if obstacle_map:any(turn.from, turn.via, obstacle_type.traffic_signal) then
+    turn.duration = turn.duration + 2
+  end
+end

obstacle_map:get(from, to, type)

This function retrieves all registered obstacles at node to when coming from the node from and having the type type.

You will likely call this function inside process_turn(). Note that this works only with internal nodes, not with OSM nodes.

lua
obstacle_map:get(to)
+obstacle_map:get(from, to)
+obstacle_map:get(from, to, type)
ArgumentTypeNotes
fromNodeThe leading node. Optional.
toNodeThe node with the obstacle.
typeobstacle_typeThe obstacle type. Defaults to all types. May be a bitwise-or combination of types.
returnstableA table of Obstacles.

Usage examples:

lua
function process_turn(profile, turn)
+  for _, obs in pairs(obstacle_map:get(turn.via)) do
+    if obs.type == obstacle_type.barrier then
+      turn.duration = turn.duration + obs.duration
+    end
+  end
+  for _, obs in pairs(obstacle_map:get(
+      turn.from, turn.via, obstacle_type.traffic_signal)) do
+    turn.duration = turn.duration + obs.duration
+  end
+end

process_way(profile, way, result, relations)

Given an OpenStreetMap way, the process_way function will either return nothing (meaning we are not going to route over this way at all), or it will set up a result hash.

ArgumentDescription
profileThe configuration table you returned in setup.
wayThe input way to process (read-only).
resultThe output that you will modify.
relationsStorage of relations to access relations, where way is a member.

Importantly it will set result.forward_mode and result.backward_mode to indicate the travel mode in each direction, as well as set result.forward_speed and result.backward_speed to integer values representing the speed for traversing the way.

It will also set a number of other attributes on result.

Using the power of the scripting language you wouldn't typically see something as simple as a result.forward_speed = 20 line within the process_way function. Instead process_way will examine the tag set on the way, process this information in various ways, calling other local functions and referencing the configuration in profile, etc., before arriving at the result.

The following attributes can be set on the result in process_way:

AttributeTypeNotes
forward_speedFloatSpeed on this way in km/h. Mandatory.
backward_speedFloat""
forward_rateFloatRouting weight, expressed as meters/weight (e.g. for a fastest-route weighting, you would want this to be meters/second, so set it to forward_speed/3.6)
backward_rateFloat""
forward_modeEnumMode of travel (e.g. car, ferry). Mandatory. Defined in include/extractor/travel_mode.hpp.
backward_modeEnum""
forward_classesTableMark this way as being of a specific class, e.g. result.classes["toll"] = true. This will be exposed in the API as classes on each RouteStep.
backward_classesTable""
durationFloatAlternative setter for duration of the whole way in both directions
weightFloatAlternative setter for weight of the whole way in both directions
turn_lanes_forwardStringDirections for individual lanes (normalized OSM turn:lanes value)
turn_lanes_backwardString""
forward_restrictedBooleanIs this a restricted access road? (e.g. private, or deliveries only; used to enable high turn penalty, so that way is only chosen for start/end of route)
backward_restrictedBoolean""
is_startpointBooleanCan a journey start on this way? (e.g. ferry; if false, prevents snapping the start point to this way)
roundaboutBooleanIs this part of a roundabout?
circularBooleanIs this part of a non-roundabout circular junction?
nameStringName of the way
refStringRoad number (equal to set forward_ref and backward_ref with one value)
forward_refStringRoad number in forward way direction
backward_refStringRoad number in backward way direction
destinationsStringThe road's destinations
exitsStringThe ramp's exit numbers or names
pronunciationStringName pronunciation
road_classification.motorway_classBooleanGuidance: way is a motorway
road_classification.link_classBooleanGuidance: way is a slip/link road
road_classification.road_priority_classEnumGuidance: order in priority list. Defined in include/extractor/road_classification.hpp
road_classification.may_be_ignoredBooleanGuidance: way is non-highway
road_classification.num_lanesUnsignedGuidance: total number of lanes in way

Way names

The WayHandlers.names function in way_handlers.lua handles extraction of way names for routing instructions. It processes the following OSM tags:

TagNotes
namePrimary name of the way
name:pronunciationPronunciation hint for text-to-speech
refRoad reference number (e.g., "A1", "I-95")
junction:refExit or junction reference number

For unnamed sidewalks and sidepaths (where highway=footway, highway=cycleway, or highway=path), the function also supports fallback name tags when the way is marked as a sidepath:

TagNotes
is_sidepath:of:nameName of the street the sidepath follows (checked first)
street:nameAlternative tag for the associated street name

The fallback is only applied when the way has one of these sidepath markers:

  • footway=sidewalk
  • cycleway=sidepath
  • is_sidepath=yes

This allows routing instructions to show street names for separately mapped sidewalks, e.g., "Turn right onto Main Street" instead of just "Turn right".

process_segment(profile, segment)

The process_segment function is called for every segment of OSM ways. A segment is a straight line between two OSM nodes.

An OpenStreetMap way cannot have different tags on different parts of a way. Instead you would split the way into several smaller ways. However, many ways are long. For example, many ways pass over hills without any change in tags.

Processing each segment of an OSM way makes it possible to have different speeds on different parts of a way based on external data like data about elevation, pollution, noise or scenic value and adjust weight and duration of the segment accordingly.

In the process_segment function you don't have access to OSM tags. Instead you use the geographical location of the start and end point of the way to look up information from another data source, like elevation data. See rasterbot.lua for an example.

The following attributes can be read and set on the result in process_segment:

AttributeRead/write?TypeNotes
source.lonReadFloatCo-ordinates of segment start
source.latReadFloat""
target.lonReadFloatCo-ordinates of segment end
target.latReadFloat""
distanceReadFloatLength of segment
weightRead/writeFloatRouting weight for this segment
durationRead/writeFloatDuration for this segment

process_turn(profile, turn)

The process_turn function is called for every possible turn in the network. Based on the angle and type of turn you assign the weight and duration of the movement.

The following attributes can be read and set on the result in process_turn:

AttributeRead/write?TypeNotes
angleReadFloatAngle of turn in degrees ([-179, 180]: 0=straight, 180=u turn, +x=x degrees to the right, -x= x degrees to the left)
number_of_roadsReadIntegerNumber of ways at the intersection of the turn
is_u_turnReadBooleanIs the turn a u-turn?
has_traffic_lightReadBooleanIs a traffic light present at this turn?
is_left_hand_drivingReadBooleanIs left-hand traffic?
source_restrictedReadBooleanIs it from a restricted access road? (See definition in process_way)
source_modeReadEnumTravel mode before the turn. Defined in include/extractor/travel_mode.hpp
source_is_motorwayReadBooleanIs the source road a motorway?
source_is_linkReadBooleanIs the source road a link?
source_number_of_lanesReadIntegerHow many lanes does the source road have? (default when not tagged: 0)
source_highway_turn_classificationReadIntegerClassification based on highway tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
source_access_turn_classificationReadIntegerClassification based on access tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
source_speedReadIntegerSpeed on this source road in km/h
source_priority_classReadEnumThe type of road priority class of the source. Defined in include/extractor/road_classification.hpp
target_restrictedReadBooleanIs the target a restricted access road? (See definition in process_way)
target_modeReadEnumTravel mode after the turn. Defined in include/extractor/travel_mode.hpp
target_is_motorwayReadBooleanIs the target road a motorway?
target_is_linkReadBooleanIs the target road a link?
target_number_of_lanesReadIntegerHow many lanes does the target road have? (default when not tagged: 0)
target_highway_turn_classificationReadIntegerClassification based on highway tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
target_access_turn_classificationReadIntegerClassification based on access tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
target_speedReadIntegerSpeed on this target road in km/h
target_priority_classReadEnumThe type of road priority class of the target. Defined in include/extractor/road_classification.hpp
fromReadNodeIDThe leading node
viaReadNodeIDThe intersection node
toReadNodeIDThe trailing node
source_roadReadExtractionTurnLegThe incoming road
target_roadReadExtractionTurnLegThe outgoing road
roads_on_the_rightReadVector<ExtractionTurnLeg>Vector with information about other roads on the right of the turn that are also connected at the intersection
roads_on_the_leftReadVector<ExtractionTurnLeg>Vector with information about other roads on the left of the turn that are also connected at the intersection. If turn is a u turn, this is empty.
weightRead/writeFloatPenalty to be applied for this turn (routing weight)
durationRead/writeFloatPenalty to be applied for this turn (duration in deciseconds)

from, via, and to

Use these node IDs to retrieve obstacles. See: obstacle_map:get.

source_road, target_road, roads_on_the_right, and roads_on_the_left

The information of source_road, target_road, roads_on_the_right, and roads_on_the_left that can be read are as follows:

AttributeRead/write?TypeNotes
is_restrictedReadBooleanIs it a restricted access road? (See definition in process_way)
modeReadEnumTravel mode before the turn. Defined in include/extractor/travel_mode.hpp
is_motorwayReadBooleanIs the road a motorway?
is_linkReadBooleanIs the road a link?
number_of_lanesReadIntegerHow many lanes does the road have? (default when not tagged: 0)
highway_turn_classificationReadIntegerClassification based on highway tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15)
access_turn_classificationReadIntegerClassification based on access tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15)
speedReadIntegerSpeed on this road in km/h
distanceReadDoubleThe length of the road edge
priority_classReadEnumThe type of road priority class of the leg. Defined in include/extractor/road_classification.hpp
is_incomingReadBooleanIs the road an incoming road of the intersection
is_outgoingReadBooleanIs the road an outgoing road of the intersection

The order of the roads in roads_on_the_right and roads_on_the_left are counter clockwise. If the turn is a u turn, all other connected roads will be in roads_on_the_right.

Example

           c   e
+           |  /
+           | /
+    a ---- x ---- b
+          /|
+         / |
+        f  d

When turning from a to b via x,

  • roads_on_the_right[1] is the road xf
  • roads_on_the_right[2] is the road xd
  • roads_on_the_left[1] is the road xe
  • roads_on_the_left[2] is the road xc

Note that indices of arrays in Lua are 1-based.

highway_turn_classification and access_turn_classification

When setting appropriate turn weights and duration, information about the highway and access tags of roads that are involved in the turn are necessary. The Lua turn function process_turn does not have access to the original OSM tags anymore. However, highway_turn_classification and access_turn_classification can be set during setup. The classification set during setup can be later used in process_turn.

Example

In the following example we use highway_turn_classification to set the turn weight to 10 if the turn is on a highway and to 5 if the turn is on a primary.

function setup()
+  return {
+    highway_turn_classification = {
+      ['motorway'] = 2,
+      ['primary'] = 1
+    }
+  }
+end
+
+function process_turn(profile, turn) {
+  if turn.source_highway_turn_classification == 2 and turn.target_highway_turn_classification == 2 then
+    turn.weight = 10
+  end
+  if turn.source_highway_turn_classification == 1 and turn.target_highway_turn_classification == 1 then
+    turn.weight = 5
+  end
+}

Guidance

The guidance parameters in profiles are currently a work in progress. They can and will change. Please be aware of this when using guidance configuration possibilities.

Guidance uses road classes to decide on when/if to emit specific instructions and to discover which road is obvious when following a route. Classification uses three flags and a priority-category. The flags indicate whether a road is a motorway (required for on/off ramps), a link type (the ramps itself, if also a motorway) and whether a road may be omitted in considerations (is considered purely for connectivity). The priority-category influences the decision which road is considered the obvious choice and which roads can be seen as fork. Forks can be emitted between roads of similar priority category only. Obvious choices follow a major priority road, if the priority difference is large.

Using raster data

OSRM has built-in support for loading an interpolating raster data in ASCII format. This can be used e.g. for factoring in elevation when computing routes.

Use raster:load() in your setup function to load data and store the source in your configuration hash:

lua
function setup()
+  return {
+    raster_source = raster:load(
+      "rastersource.asc",  -- file to load
+      0,    -- longitude min
+      0.1,  -- longitude max
+      0,    -- latitude min
+      0.1,  -- latitude max
+      5,    -- number of rows
+      4     -- number of columns
+    )
+  }
+end

The input data must be an ASCII file with rows of integers, e.g.:

0  0  0   0
+0  0  0   250
+0  0  250 500
+0  0  0   250
+0  0  0   0

In your segment_function you can then access the raster source and use raster:query() to query to find the nearest data point, or raster:interpolate() to interpolate a value based on nearby data points.

You must check whether the result is valid before using it.

Example:

lua
function process_segment (profile, segment)
+  local sourceData = raster:query(profile.raster_source, segment.source.lon, segment.source.lat)
+  local targetData = raster:query(profile.raster_source, segment.target.lon, segment.target.lat)
+
+  local invalid = sourceData.invalid_data()
+  if sourceData.datum ~= invalid and targetData.datum ~= invalid then
+      -- use values to adjust weight and duration
+    [...]
+end

See rasterbot.lua and rasterbotinterp.lua for examples.

Helper functions

There are a few helper functions defined in the global scope that profiles can use:

  • durationIsValid
  • parseDuration
  • trimLaneString
  • applyAccessTokens
  • canonicalizeStringList
`,154)])])}const u=e(n,[["render",d]]);export{k as __pageData,u as default}; diff --git a/docs/v26.5.0/assets/profiles.md.PHAThxX1.lean.js b/docs/v26.5.0/assets/profiles.md.PHAThxX1.lean.js new file mode 100644 index 0000000..3edea49 --- /dev/null +++ b/docs/v26.5.0/assets/profiles.md.PHAThxX1.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as s,ag as i}from"./chunks/framework.C2NLiVii.js";const k=JSON.parse('{"title":"OSRM profiles","description":"","frontmatter":{},"headers":[],"relativePath":"profiles.md","filePath":"profiles.md"}'),n={name:"profiles.md"};function d(r,t,o,l,h,p){return a(),s("div",null,[...t[0]||(t[0]=[i("",154)])])}const u=e(n,[["render",d]]);export{k as __pageData,u as default}; diff --git a/docs/v26.5.0/assets/python_api.md.BMYgTnwH.js b/docs/v26.5.0/assets/python_api.md.BMYgTnwH.js new file mode 100644 index 0000000..f4ca499 --- /dev/null +++ b/docs/v26.5.0/assets/python_api.md.BMYgTnwH.js @@ -0,0 +1,66 @@ +import{_ as i,o as a,c as t,ag as e}from"./chunks/framework.C2NLiVii.js";const c=JSON.parse('{"title":"Python API","description":"","frontmatter":{},"headers":[],"relativePath":"python/api.md","filePath":"python/api.md"}'),n={name:"python/api.md"};function l(h,s,p,o,k,r){return a(),t("div",null,[...s[0]||(s[0]=[e(`

Python API

The Python bindings provide access to OSRM's routing services through the osrm package. Install with pip install osrm-bindings.

OSRM

The OSRM class is the main entry point. It requires a .osrm.* dataset prepared by the OSRM toolchain.

python
import osrm
+
+# From file
+engine = osrm.OSRM("path/to/data.osrm")
+
+# With keyword arguments
+engine = osrm.OSRM(
+    storage_config="path/to/data.osrm",
+    algorithm="CH",                      # or "MLD"
+    use_shared_memory=False,
+    max_locations_trip=3,
+    max_locations_viaroute=3,
+    max_locations_distance_table=3,
+    max_locations_map_matching=3,
+    max_results_nearest=1,
+    max_alternatives=1,
+    default_radius="unlimited",
+)
+
+# Using shared memory (requires osrm-datastore)
+engine = osrm.OSRM(use_shared_memory=True)

Parameters

  • storage_config str - Path to the .osrm dataset.
  • algorithm str - Routing algorithm: "CH" or "MLD". Default: "CH".
  • use_shared_memory bool - Connect to shared memory datastore. Default: True.
  • dataset_name str - Named shared memory dataset (requires osrm-datastore --dataset_name).
  • memory_file str - Deprecated. Equivalent to use_mmap=True.
  • use_mmap bool - Memory-map files instead of loading into RAM.
  • max_locations_trip int - Max locations in trip queries.
  • max_locations_viaroute int - Max locations in route queries.
  • max_locations_distance_table int - Max locations in table queries.
  • max_locations_map_matching int - Max locations in match queries.
  • max_results_nearest int - Max results in nearest queries.
  • max_alternatives int - Max alternative routes.
  • default_radius float | "unlimited" - Default search radius in meters.

Services

All service methods take a parameters object and return a dict-like Object:

python
result = engine.Route(route_params)
+print(result["routes"])
+print(result["waypoints"])

Route

Finds the fastest route between two or more coordinates.

python
params = osrm.RouteParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077)],
+    steps=True,
+    alternatives=2,
+    annotations=["speed", "duration"],
+    geometries="geojson",
+    overview="full",
+)
+result = engine.Route(params)

RouteParameters

Inherits all BaseParameters.

  • steps bool - Return route steps for each leg. Default: False.
  • alternatives int - Number of alternative routes to search for. Default: 0.
  • annotations list[str] - Additional metadata: "none", "duration", "nodes", "distance", "weight", "datasources", "speed", "all". Default: [].
  • geometries str - Geometry format: "polyline", "polyline6", "geojson". Default: "polyline".
  • overview str - Overview geometry: "simplified", "full", "false". Default: "simplified".
  • continue_straight bool | None - Force route to continue straight at waypoints.
  • waypoints list[int] - Indices of coordinates to treat as waypoints. Must include first and last.

Table

Computes duration/distance matrices between coordinates.

python
params = osrm.TableParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077), (7.41862, 43.73216)],
+    sources=[0],
+    destinations=[1, 2],
+    annotations=["duration", "distance"],
+)
+result = engine.Table(params)

TableParameters

Inherits all BaseParameters.

  • sources list[int] - Indices of source coordinates. Default: all.
  • destinations list[int] - Indices of destination coordinates. Default: all.
  • annotations list[str] - "duration", "distance", "all". Default: ["duration"].
  • fallback_speed float - Speed for crow-flies fallback when no route found.
  • fallback_coordinate_type str - "input" or "snapped".
  • scale_factor float - Scales duration values. Default: 1.0.

Nearest

Finds the nearest street segment for a coordinate.

python
params = osrm.NearestParameters(
+    coordinates=[(7.41337, 43.72956)],
+    number_of_results=3,
+)
+result = engine.Nearest(params)

NearestParameters

Inherits all BaseParameters.

  • number_of_results int - Number of nearest segments to return. Default: 1.

Match

Snaps noisy GPS traces to the road network.

python
params = osrm.MatchParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077), (7.41862, 43.73216)],
+    timestamps=[1424684612, 1424684616, 1424684620],
+    radiuses=[5.0, 5.0, 5.0],
+    annotations=["speed"],
+    geometries="geojson",
+)
+result = engine.Match(params)

MatchParameters

Inherits all RouteParameters and BaseParameters.

  • timestamps list[int] - UNIX timestamps for each coordinate.
  • gaps str - Gap handling: "split" or "ignore". Default: "split".
  • tidy bool - Remove duplicates. Default: False.
  • waypoints list[int] - Indices of coordinates to treat as waypoints.

Trip

Solves the Traveling Salesman Problem for the given coordinates.

python
params = osrm.TripParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077), (7.41862, 43.73216)],
+    source="first",
+    destination="last",
+    roundtrip=True,
+    annotations=["duration"],
+    geometries="geojson",
+)
+result = engine.Trip(params)

TripParameters

Inherits all RouteParameters and BaseParameters.

  • source str - "any" or "first". Default: "any".
  • destination str - "any" or "last". Default: "any".
  • roundtrip bool - Return to first location. Default: True.

Tile

Generates vector tiles with internal routing graph data.

python
params = osrm.TileParameters(x=17059, y=11948, z=15)
+result = engine.Tile(params)  # returns bytes

TileParameters

  • x int - Tile x coordinate.
  • y int - Tile y coordinate.
  • z int - Tile zoom level.

BaseParameters

Shared parameters inherited by Nearest, Table, Route, Match, and Trip.

  • coordinates list[tuple[float, float]] - List of (longitude, latitude) pairs.
  • hints list[str | None] - Base64-encoded hints from previous requests.
  • radiuses list[float | None] - Search radius per coordinate in meters. None for unlimited.
  • bearings list[tuple[int, int] | None] - (bearing, range) pairs in degrees. None for unrestricted.
  • approaches list[str | None] - "curb", "unrestricted", or None.
  • generate_hints bool - Include hints in response. Default: True.
  • exclude list[str] - Road classes to avoid (e.g. ["motorway"]).
  • snapping str - "default" or "any". Default: "default".

Types

Coordinate

python
coord = osrm.Coordinate((7.41337, 43.72956))
+print(coord.lon, coord.lat)

Bearing

python
bearing = osrm.Bearing((200, 180))
+print(bearing.bearing, bearing.range)

Object / Array

Service results are returned as Object (dict-like) and Array (list-like) wrappers around OSRM's internal JSON types. They support [], len(), in, and iteration.

python
result = engine.Route(params)
+for route in result["routes"]:
+    print(route["distance"], route["duration"])

CLI

The package also installs OSRM command-line tools, accessible via python -m osrm:

bash
python -m osrm extract data.osm.pbf -p profiles/car.lua
+python -m osrm contract data.osrm
+python -m osrm partition data.osrm
+python -m osrm customize data.osrm
+python -m osrm datastore data.osrm
+python -m osrm routed data.osrm
`,59)])])}const E=i(n,[["render",l]]);export{c as __pageData,E as default}; diff --git a/docs/v26.5.0/assets/python_api.md.BMYgTnwH.lean.js b/docs/v26.5.0/assets/python_api.md.BMYgTnwH.lean.js new file mode 100644 index 0000000..50dd264 --- /dev/null +++ b/docs/v26.5.0/assets/python_api.md.BMYgTnwH.lean.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as t,ag as e}from"./chunks/framework.C2NLiVii.js";const c=JSON.parse('{"title":"Python API","description":"","frontmatter":{},"headers":[],"relativePath":"python/api.md","filePath":"python/api.md"}'),n={name:"python/api.md"};function l(h,s,p,o,k,r){return a(),t("div",null,[...s[0]||(s[0]=[e("",59)])])}const E=i(n,[["render",l]]);export{c as __pageData,E as default}; diff --git a/docs/v26.5.0/assets/python_development.md.DMJOl9Fk.js b/docs/v26.5.0/assets/python_development.md.DMJOl9Fk.js new file mode 100644 index 0000000..44331f2 --- /dev/null +++ b/docs/v26.5.0/assets/python_development.md.DMJOl9Fk.js @@ -0,0 +1,40 @@ +import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.C2NLiVii.js";const c=JSON.parse('{"title":"Python Bindings Development Guide","description":"","frontmatter":{},"headers":[],"relativePath":"python/development.md","filePath":"python/development.md"}'),n={name:"python/development.md"};function l(h,s,p,d,o,k){return a(),e("div",null,[...s[0]||(s[0]=[t(`

Python Bindings Development Guide

Installing for production

Pre-built wheels are published to PyPI for Linux (x86_64), macOS (x86_64), and Windows (amd64). They use the CPython 3.12 stable ABI (cp312-abi3) and therefore install on Python 3.12+:

bash
pip install osrm-bindings

The package itself supports Python 3.10+ when built from source — needed for 3.10/3.11, aarch64 Linux, arm64 macOS, or any platform without a pre-built wheel:

bash
pip install osrm-bindings --no-binary osrm-bindings

Source builds compile the full OSRM C++ library — this takes a long time. See platform-specific notes for prerequisites.

Installing for development

Clone the repo and install in editable mode with dev dependencies:

bash
git clone https://github.com/Project-OSRM/osrm-backend
+cd osrm-backend
+pip install -e ".[dev]"

Install pre-commit hooks:

bash
pre-commit install

Platform-specific build requirements

Linux

CI wheel builds run inside a custom manylinux image (nilsnolde/manylinux, branch osrm_python) that ships vcpkg pre-bootstrapped at the SHA pinned in vcpkg-configuration.json, plus a pre-warmed vcpkg binary cache compiled against this repo's vcpkg.json. The wheel build's own vcpkg install hits that cache instead of recompiling boost/tbb/etc. from source.

The image needs rebuilding when this repo's vcpkg.json, the baseline SHA in vcpkg-configuration.json, or any file under vcpkg-overlay-ports/ changes — otherwise the wheel build either misses the cache (slow) or fails on a missing port. The manylinux repo's Build workflow takes an osrmRef input for that purpose; see its README.

For local source builds outside the manylinux image, install vcpkg yourself, point CMake at its toolchain, and use the release-only triplet to match the cache:

bash
git clone https://github.com/microsoft/vcpkg
+./vcpkg/bootstrap-vcpkg.sh
+export VCPKG_ROOT=$PWD/vcpkg
+export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-linux-release"

macOS

Install OSRM's C++ dependencies via Homebrew (the same set the cibuildwheel macOS before-all uses; all ship CMake config files so the find_package(... CONFIG REQUIRED) calls in CMakeLists.txt resolve without a toolchain file):

bash
brew install lua tbb boost@1.90 fmt rapidjson sol2 flatbuffers \\
+             protozero libosmium
+brew link boost@1.90

Windows

Windows uses vcpkg in manifest mode for OSRM's C++ dependencies. Clone and bootstrap it, then export VCPKG_ROOT:

powershell
git clone https://github.com/microsoft/vcpkg
+.\\vcpkg\\bootstrap-vcpkg.bat
+$env:VCPKG_ROOT = "$PWD\\vcpkg"

Pass the toolchain to CMake at build time via CMAKE_ARGS (see below).

Building locally

A standard pip install -e . works, but by default pip uses PEP 517 isolated builds — each invocation creates a temporary directory, compiles everything, then discards it. This means OSRM is recompiled from scratch every time.

Use --no-build-isolation to make scikit-build-core reuse the persistent build directory (build/{wheel_tag}/) across runs:

bash
# Linux / macOS
+pip install -e . --no-build-isolation
+
+# Windows (PowerShell) — VCPKG_ROOT must be set, see Platform-specific
+# build requirements
+$env:CMAKE_ARGS = "-DCMAKE_TOOLCHAIN_FILE=$env:VCPKG_ROOT\\scripts\\buildsystems\\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static-md"
+pip install -e . --no-build-isolation

The first run is slow (full OSRM compile). Subsequent runs only recompile changed binding files.

Keep config flags identical across runs

scikit-build-core hashes its configuration to detect changes. If the flags differ between runs, it wipes the build directory and starts from scratch.

Generator mismatch

CMake records the generator in CMakeCache.txt. If you ever see Does not match the generator used previously, delete the build directory and rebuild from scratch:

powershell
Remove-Item -Recurse -Force build/cp312-abi3-win_amd64

Building a wheel

After the editable install has compiled everything, produce a wheel without recompiling:

bash
# Linux / macOS
+pip wheel . --no-build-isolation -w dist
+
+# Windows (PowerShell) — uses the same CMAKE_ARGS as the editable install above
+pip wheel . --no-build-isolation -w dist

CMake finds the existing artifacts in the build directory and skips recompilation. The wheel lands in dist/.

Wheel repair

Locally built wheels link against system shared libraries and are tagged as linux_x86_64 (not manylinux). To make them portable or to inspect their dependencies, use the platform-specific repair tools:

Linuxauditwheel:

bash
pip install auditwheel
+auditwheel show dist/*.whl          # inspect shared library dependencies
+auditwheel repair -w dist dist/*.whl # bundle libs and retag as manylinux

macOSdelocate:

bash
pip install delocate
+delocate-listdeps dist/*.whl        # inspect dependencies
+delocate-wheel -w dist dist/*.whl   # bundle dylibs

Windowsdelvewheel:

bash
pip install delvewheel
+delvewheel show dist/*.whl          # inspect dependencies
+delvewheel repair -w dist dist/*.whl

On Windows, vcpkg's shared DLLs (tbb12.dll, hwloc.dll — TBB is shared even under the static-md triplet) live in build\\<wheel-tag>\\vcpkg_installed\\x64-windows-static-md\\bin\\. Pass that to delvewheel via --add-path so it can resolve and bundle them:

powershell
delvewheel repair --analyze-existing-exes \`
+    --add-path build\\cp312-abi3-win_amd64\\vcpkg_installed\\x64-windows-static-md\\bin \`
+    --add-dll hwloc.dll --no-mangle tbb12.dll --no-mangle hwloc.dll \`
+    -w dist dist\\*.whl

TIP

cibuildwheel runs wheel repair automatically in CI. You only need these commands when building wheels locally for distribution.

Compiler cache

On Linux and macOS, ccache is used automatically (pre-installed in the manylinux image; installed via Homebrew for macOS CI).

On Windows, scikit-build-core defaults to the Visual Studio generator, which does not support CMAKE_CXX_COMPILER_LAUNCHER. The build dir reuse from --no-build-isolation is the main speed optimisation for local Windows development.

Running tests

Build the test data (requires the package to be installed so the osrm executables are available):

bash
# Linux / macOS
+cd test/data && make
+
+# Windows
+cd test\\data && windows-build-test-data.bat

Load the shared memory datastore:

bash
python -m osrm datastore test/data/ch/monaco

Run the test suite:

bash
pytest test/python/

Running cibuildwheel locally

cibuildwheel builds wheels inside isolated environments that closely match CI. Install it with:

bash
pip install cibuildwheel

Build for the current platform:

bash
cibuildwheel --platform linux    # requires Docker on non-Linux hosts
+cibuildwheel --platform macos
+cibuildwheel --platform windows

Wheels land in wheelhouse/.

Windows note: the toolchain wiring (CMAKE_TOOLCHAIN_FILE, VCPKG_TARGET_TRIPLET) lives in [tool.cibuildwheel.windows].environment in pyproject.toml, where $VCPKG_ROOT is expanded at build time from the host environment. Make sure VCPKG_ROOT is set in your shell before invoking cibuildwheel.

Linux note: the wheel build inside the manylinux container reads VCPKG_ROOT and VCPKG_DEFAULT_BINARY_CACHE from the image's ENV, so no toolchain forwarding is needed from the host. If you override CIBW_ENVIRONMENT_LINUX to mount a host ccache, remember it replaces (not merges with) [tool.cibuildwheel.linux].environment in pyproject.toml — re-include LD_LIBRARY_PATH and the CMAKE_ARGS line verbatim:

bash
CIBW_CONTAINER_ENGINE="docker; create_args: --volume /tmp/ccache:/ccache" \\
+CIBW_ENVIRONMENT_LINUX='LD_LIBRARY_PATH=/usr/local/lib64:\${LD_LIBRARY_PATH} CCACHE_DIR=/ccache CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-linux-release"' \\
+cibuildwheel --platform linux

Type stubs

src/python/osrm/osrm_ext.pyi is auto-generated by nanobind_add_stub() at build time and committed to the repository so documentation tools can work without compiling the extension.

After changing C++ bindings, rebuild and commit the updated stub:

bash
pip install -e . --no-build-isolation   # regenerates the .pyi
+git add src/python/osrm/osrm_ext.pyi

To regenerate manually without a full rebuild:

bash
pip install nanobind ruff
+python -m nanobind.stubgen -m osrm.osrm_ext -o src/python/osrm/osrm_ext.pyi
+ruff format src/python/osrm/osrm_ext.pyi

Releasing

Releases are driven by the monthly release workflow (.github/workflows/release-monthly.yml), not by pushing a tag by hand. The workflow bumps the version, creates the tag, drives CI, downloads the built wheels, and publishes to both PyPI and npm in one shot.

Scheduled monthly release

A cron on the 1st of each month at 08:00 UTC runs the workflow against master:

  1. Compute the next version as (YYYY-2000).M.patchlevel (e.g. 26.4.0).
  2. Bump package.json + package-lock.json, commit, create annotated tag v<version>, push branch and tag.
  3. Dispatch osrm-backend.yml on the tag. That run builds wheels + sdist via cibuildwheel and uploads them as wheels-* artifacts.
  4. Wait for the dispatched CI run to finish with conclusion success.
  5. Run the publish job: download every wheels-* artifact into dist/, publish to PyPI via trusted publisher (OIDC), then npm publish.

If PyPI fails, the npm publish still runs (the npm steps have if: \${{ !cancelled() }}), and the overall job is marked failed so the PyPI problem stays visible.

Manual release

Trigger the workflow from the Actions UI or gh workflow run release-monthly.yml with optional inputs:

  • version_override — set the version explicitly (e.g. 26.4.1) instead of using the (YYYY-2000).M.patchlevel calculation.
  • branch — release from a branch other than master.

Verification

After the run finishes, check:

Version mechanics

pyproject.toml uses setuptools-scm with local_scheme = "no-local-version". On a tag checkout (e.g. v26.4.0), the Python version resolves cleanly to 26.4.0, matching the package.json version that release-monthly.yml committed when creating the tag.

`,87)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/python_development.md.DMJOl9Fk.lean.js b/docs/v26.5.0/assets/python_development.md.DMJOl9Fk.lean.js new file mode 100644 index 0000000..a3927b7 --- /dev/null +++ b/docs/v26.5.0/assets/python_development.md.DMJOl9Fk.lean.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.C2NLiVii.js";const c=JSON.parse('{"title":"Python Bindings Development Guide","description":"","frontmatter":{},"headers":[],"relativePath":"python/development.md","filePath":"python/development.md"}'),n={name:"python/development.md"};function l(h,s,p,d,o,k){return a(),e("div",null,[...s[0]||(s[0]=[t("",87)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/releasing.md.D_HqADus.js b/docs/v26.5.0/assets/releasing.md.D_HqADus.js new file mode 100644 index 0000000..1885c70 --- /dev/null +++ b/docs/v26.5.0/assets/releasing.md.D_HqADus.js @@ -0,0 +1 @@ +import{_ as a,o,c as t,ag as l}from"./chunks/framework.C2NLiVii.js";const u=JSON.parse('{"title":"Releasing a new OSRM version","description":"","frontmatter":{},"headers":[],"relativePath":"releasing.md","filePath":"releasing.md"}'),i={name:"releasing.md"};function r(s,e,n,c,d,h){return o(),t("div",null,[...e[0]||(e[0]=[l('

Releasing a new OSRM version

We use a unified semver versioning scheme for monthly releases: (YYYY-2000).M.patchlevel

  • Format: X.M.patchlevel where X = year - 2000, M = month (1-12, no leading zeros)
  • Example: 26.4.0 represents April 2026, first release
  • Git tags: Prefixed with v (e.g., v26.4.0)
  • npm packages: Unprefixed semver (e.g., 26.4.0)

Version History

Previous scheme (ended 2025): Traditional semantic versioning (v6.0, v6.0.1, v6.0.2, etc.)

  • Last release: v6.0.0 in December 2025
  • Manual release process

New scheme (started 2026): Monthly date-based versioning with automated releases

  • First release: v26.1.0 (January 2026)
  • Automatic monthly releases on the 1st of each month at 08:00 UTC
  • Year offset: 2026 → 26, 2027 → 27, etc.
  • Month: 1-12 (no leading zeros), patch: 0-N per month

Versioning Scheme

Format

Git tags: vX.M.patchlevel where X = year - 2000, M = 1-12

  • X: Year offset (26 = 2026, 27 = 2027, etc.)
  • M: Month (1-12, no leading zeros)
  • patchlevel: Incremental counter starting at 0 per month (0, 1, 2, ...)

npm packages: X.M.patchlevel (same as git tag without the v prefix)

Examples

Git tags and npm versions for the same release:

  • April 2026, 1st release: Git tag v26.4.0, npm 26.4.0
  • April 2026, 2nd release: Git tag v26.4.1, npm 26.4.1
  • May 2026, 1st release: Git tag v26.5.0, npm 26.5.0
  • January 2027, 1st release: Git tag v27.1.0, npm 27.1.0

Release Compatibility Guarantees

Patch version change (new patchlevel in same month)

  • No change of query parameters or response formats
  • Compatible HTTP API
  • Compatible C++ library API
  • Compatible node-osrm API
  • Compatible OSRM datasets

Month change (new YYYY-MM)

  • May introduce forward-compatible changes: query parameters and response properties may be added in responses, but existing properties may not be changed or removed
  • Forward-compatible HTTP API
  • Forward-compatible C++ library API
  • Forward-compatible node-osrm API
  • No compatibility between OSRM datasets (needs new processing)

Conventional Commits

Pull request titles must follow Conventional Commits format with types: feat, fix, docs, style, refactor, perf, test, ci, chore, build. This is validated in CI and helps organize the commit history.

Breaking changes should be indicated with the ! suffix in the PR title (e.g., feat!: remove deprecated API) so they are called out in release notes.

Release Management

  • The master branch is for development and should always be green
  • Automated monthly releases occur on the 1st of each month at 08:00 UTC
  • All changes in master will be automatically released monthly
  • No release candidates are used; the master branch is the quality gate
  • Patch versions within the same month can be released manually at any time

Automated Release Process

Releases are created automatically every month on a scheduled basis:

  1. A GitHub Actions workflow runs on the 1st of each month at 08:00 UTC
  2. Version is calculated as (YYYY-2000).M.patchlevel with M = 1-12 (no leading zeros)
  3. package.json and package-lock.json versions are updated
  4. A git tag is created and pushed (e.g., v26.4.0)
  5. A GitHub Release is published with auto-generated release notes
  6. The package is published to npm (format: 26.4.0 without v prefix)

Manual Release Trigger

You can also trigger a release manually on any branch:

  1. Go to ActionsMonthly Release workflow
  2. Click Run workflow
  3. Select your branch (defaults to master)
  4. Optionally override the version (format: X.M.patchlevel with M = 1-12, e.g., 26.4.0)
  5. Click Run workflow

This is useful for:

  • Out-of-schedule patch releases within the same month
  • Emergency releases from other branches
  • Backports to older versions

Release Checklist

When releasing (automated or manual):

  1. ✅ All GitHub Actions CI checks pass
  2. ✅ The target branch is in a releasable state
  3. ✅ For manual releases: verify the version format is correct (X.M.patchlevel with month 1-12, e.g., 26.4.0)
  4. ✅ The release is created automatically with:
    • Git tag
    • GitHub Release (with auto-generated release notes)
    • npm publication

After Release

No additional manual steps are required. The automated workflow handles:

  • Version bumping in package.json
  • Git commit and tag creation
  • GitHub Release publishing
  • npm package publication

For non-automated releases, monitor:

  • GitHub Actions to verify the release completed successfully
  • npm registry to confirm the new version is published
',42)])])}const p=a(i,[["render",r]]);export{u as __pageData,p as default}; diff --git a/docs/v26.5.0/assets/releasing.md.D_HqADus.lean.js b/docs/v26.5.0/assets/releasing.md.D_HqADus.lean.js new file mode 100644 index 0000000..03b3d29 --- /dev/null +++ b/docs/v26.5.0/assets/releasing.md.D_HqADus.lean.js @@ -0,0 +1 @@ +import{_ as a,o,c as t,ag as l}from"./chunks/framework.C2NLiVii.js";const u=JSON.parse('{"title":"Releasing a new OSRM version","description":"","frontmatter":{},"headers":[],"relativePath":"releasing.md","filePath":"releasing.md"}'),i={name:"releasing.md"};function r(s,e,n,c,d,h){return o(),t("div",null,[...e[0]||(e[0]=[l("",42)])])}const p=a(i,[["render",r]]);export{u as __pageData,p as default}; diff --git a/docs/v26.5.0/assets/routed.md.B7b7kZju.js b/docs/v26.5.0/assets/routed.md.B7b7kZju.js new file mode 100644 index 0000000..42f69b0 --- /dev/null +++ b/docs/v26.5.0/assets/routed.md.B7b7kZju.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as r,ag as n}from"./chunks/framework.C2NLiVii.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"routed.md","filePath":"routed.md"}'),i={name:"routed.md"};function o(s,e,l,d,h,_){return a(),r("div",null,[...e[0]||(e[0]=[n('

Environment Variables

SHM_LOCK_DIR

If the SHM_LOCK_DIR environment variable is set, OSRM will use it as the directory for shared memory lock files instead of the system temporary directory. This is useful in containerized environments (Docker/Kubernetes) where the lock file directory should persist across container restarts when loading from shared memory.

SIGNAL_PARENT_WHEN_READY

If the SIGNAL_PARENT_WHEN_READY environment variable is set osrm-routed will send the USR1 signal to its parent when it will be running and waiting for requests. This could be used to upgrade osrm-routed to a new binary on the fly without any service downtime - no incoming requests will be lost.

DISABLE_ACCESS_LOGGING

If the DISABLE_ACCESS_LOGGING environment variable is set osrm-routed will not log any http requests to standard output. This can be useful in high traffic setup.

',7)])])}const m=t(i,[["render",o]]);export{u as __pageData,m as default}; diff --git a/docs/v26.5.0/assets/routed.md.B7b7kZju.lean.js b/docs/v26.5.0/assets/routed.md.B7b7kZju.lean.js new file mode 100644 index 0000000..6d83461 --- /dev/null +++ b/docs/v26.5.0/assets/routed.md.B7b7kZju.lean.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as r,ag as n}from"./chunks/framework.C2NLiVii.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"routed.md","filePath":"routed.md"}'),i={name:"routed.md"};function o(s,e,l,d,h,_){return a(),r("div",null,[...e[0]||(e[0]=[n("",7)])])}const m=t(i,[["render",o]]);export{u as __pageData,m as default}; diff --git a/docs/v26.5.0/assets/style.aohmNY8E.css b/docs/v26.5.0/assets/style.aohmNY8E.css new file mode 100644 index 0000000..0ac839e --- /dev/null +++ b/docs/v26.5.0/assets/style.aohmNY8E.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media(min-width:960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media(prefers-reduced-motion:reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media(min-width:640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media(min-width:768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media(min-width:640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media(max-width:639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-c79a1216]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-c79a1216],.VPBackdrop.fade-leave-to[data-v-c79a1216]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c79a1216]{transition-duration:.25s}@media(min-width:1280px){.VPBackdrop[data-v-c79a1216]{display:none}}.NotFound[data-v-d6be1790]{padding:64px 24px 96px;text-align:center}@media(min-width:768px){.NotFound[data-v-d6be1790]{padding:96px 32px 168px}}.code[data-v-d6be1790]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-d6be1790]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-d6be1790]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-d6be1790]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-d6be1790]{padding-top:20px}.link[data-v-d6be1790]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-d6be1790]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-b933a997]{position:relative;z-index:1}.nested[data-v-b933a997]{padding-right:16px;padding-left:16px}.outline-link[data-v-b933a997]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-b933a997]:hover,.outline-link.active[data-v-b933a997]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-b933a997]{padding-left:13px}.VPDocAsideOutline[data-v-a5bbad30]{display:none}.VPDocAsideOutline.has-outline[data-v-a5bbad30]{display:block}.content[data-v-a5bbad30]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-a5bbad30]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-a5bbad30]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-3f215769]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-3f215769]{flex-grow:1}.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-3f215769] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-e98dd255]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media(min-width:640px){.VPLastUpdated[data-v-e98dd255]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-e257564d]{margin-top:64px}.edit-info[data-v-e257564d]{padding-bottom:18px}@media(min-width:640px){.edit-info[data-v-e257564d]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-e257564d]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-e257564d]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-e257564d]{margin-right:8px}.prev-next[data-v-e257564d]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media(min-width:640px){.prev-next[data-v-e257564d]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-e257564d]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-e257564d]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-e257564d]{margin-left:auto;text-align:right}.desc[data-v-e257564d]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-e257564d]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-39a288b8]{padding:32px 24px 96px;width:100%}@media(min-width:768px){.VPDoc[data-v-39a288b8]{padding:48px 32px 128px}}@media(min-width:960px){.VPDoc[data-v-39a288b8]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-39a288b8]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-39a288b8]{max-width:752px}}@media(min-width:1280px){.VPDoc .container[data-v-39a288b8]{display:flex;justify-content:center}.VPDoc .aside[data-v-39a288b8]{display:block}}@media(min-width:1440px){.VPDoc:not(.has-sidebar) .content[data-v-39a288b8]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-39a288b8]{max-width:1104px}}.container[data-v-39a288b8]{margin:0 auto;width:100%}.aside[data-v-39a288b8]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-39a288b8]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-39a288b8]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-39a288b8]::-webkit-scrollbar{display:none}.aside-curtain[data-v-39a288b8]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-39a288b8]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-39a288b8]{position:relative;margin:0 auto;width:100%}@media(min-width:960px){.content[data-v-39a288b8]{padding:0 32px 128px}}@media(min-width:1280px){.content[data-v-39a288b8]{order:1;margin:0;min-width:640px}}.content-container[data-v-39a288b8]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-39a288b8]{max-width:688px}.VPButton[data-v-fa7799d5]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-fa7799d5]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-fa7799d5]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-fa7799d5]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-fa7799d5]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-fa7799d5]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-fa7799d5]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-fa7799d5]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-fa7799d5]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-fa7799d5]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-fa7799d5]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-fa7799d5]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-fa7799d5]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-8426fc1a]{display:none}.dark .VPImage.light[data-v-8426fc1a]{display:none}.VPHero[data-v-4f9c455b]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media(min-width:640px){.VPHero[data-v-4f9c455b]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media(min-width:960px){.VPHero[data-v-4f9c455b]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-4f9c455b]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media(min-width:960px){.container[data-v-4f9c455b]{flex-direction:row}}.main[data-v-4f9c455b]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-4f9c455b]{text-align:center}@media(min-width:960px){.VPHero.has-image .container[data-v-4f9c455b]{text-align:left}}@media(min-width:960px){.main[data-v-4f9c455b]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-4f9c455b]{max-width:592px}}.heading[data-v-4f9c455b]{display:flex;flex-direction:column}.name[data-v-4f9c455b],.text[data-v-4f9c455b]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-4f9c455b],.VPHero.has-image .text[data-v-4f9c455b]{margin:0 auto}.name[data-v-4f9c455b]{color:var(--vp-home-hero-name-color)}.clip[data-v-4f9c455b]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media(min-width:640px){.name[data-v-4f9c455b],.text[data-v-4f9c455b]{max-width:576px;line-height:56px;font-size:48px}}@media(min-width:960px){.name[data-v-4f9c455b],.text[data-v-4f9c455b]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-4f9c455b],.VPHero.has-image .text[data-v-4f9c455b]{margin:0}}.tagline[data-v-4f9c455b]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-4f9c455b]{margin:0 auto}@media(min-width:640px){.tagline[data-v-4f9c455b]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media(min-width:960px){.tagline[data-v-4f9c455b]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-4f9c455b]{margin:0}}.actions[data-v-4f9c455b]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-4f9c455b]{justify-content:center}@media(min-width:640px){.actions[data-v-4f9c455b]{padding-top:32px}}@media(min-width:960px){.VPHero.has-image .actions[data-v-4f9c455b]{justify-content:flex-start}}.action[data-v-4f9c455b]{flex-shrink:0;padding:6px}.image[data-v-4f9c455b]{order:1;margin:-76px -24px -48px}@media(min-width:640px){.image[data-v-4f9c455b]{margin:-108px -24px -48px}}@media(min-width:960px){.image[data-v-4f9c455b]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-4f9c455b]{position:relative;margin:0 auto;width:320px;height:320px}@media(min-width:640px){.image-container[data-v-4f9c455b]{width:392px;height:392px}}@media(min-width:960px){.image-container[data-v-4f9c455b]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-4f9c455b]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media(min-width:640px){.image-bg[data-v-4f9c455b]{width:256px;height:256px}}@media(min-width:960px){.image-bg[data-v-4f9c455b]{width:320px;height:320px}}[data-v-4f9c455b] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media(min-width:640px){[data-v-4f9c455b] .image-src{max-width:256px;max-height:256px}}@media(min-width:960px){[data-v-4f9c455b] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-a3976bdc]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-a3976bdc]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-a3976bdc]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-a3976bdc]>.VPImage{margin-bottom:20px}.icon[data-v-a3976bdc]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-a3976bdc]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-a3976bdc]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-a3976bdc]{padding-top:8px}.link-text-value[data-v-a3976bdc]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-a3976bdc]{margin-left:6px}.VPFeatures[data-v-a6181336]{position:relative;padding:0 24px}@media(min-width:640px){.VPFeatures[data-v-a6181336]{padding:0 48px}}@media(min-width:960px){.VPFeatures[data-v-a6181336]{padding:0 64px}}.container[data-v-a6181336]{margin:0 auto;max-width:1152px}.items[data-v-a6181336]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-a6181336]{padding:8px;width:100%}@media(min-width:640px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:50%}}@media(min-width:768px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336]{width:50%}.item.grid-3[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:calc(100% / 3)}}@media(min-width:960px){.item.grid-4[data-v-a6181336]{width:25%}}.container[data-v-8e2d4988]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media(min-width:640px){.container[data-v-8e2d4988]{padding:0 48px}}@media(min-width:960px){.container[data-v-8e2d4988]{width:100%;padding:0 64px}}.vp-doc[data-v-8e2d4988] .VPHomeSponsors,.vp-doc[data-v-8e2d4988] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-8e2d4988] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-8e2d4988] .VPHomeSponsors a,.vp-doc[data-v-8e2d4988] .VPTeamPage a{text-decoration:none}.VPHome[data-v-8b561e3d]{margin-bottom:96px}@media(min-width:768px){.VPHome[data-v-8b561e3d]{margin-bottom:128px}}.VPContent[data-v-1428d186]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-1428d186]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-1428d186]{margin:0}@media(min-width:960px){.VPContent[data-v-1428d186]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-1428d186]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media(min-width:1440px){.VPContent.has-sidebar[data-v-1428d186]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e315a0ad]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e315a0ad]{display:none}.VPFooter[data-v-e315a0ad] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-e315a0ad] a:hover{color:var(--vp-c-text-1)}@media(min-width:768px){.VPFooter[data-v-e315a0ad]{padding:32px}}.container[data-v-e315a0ad]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e315a0ad],.copyright[data-v-e315a0ad]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-8a42e2b4]{padding:12px 20px 11px}@media(min-width:960px){.VPLocalNavOutlineDropdown[data-v-8a42e2b4]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-8a42e2b4]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-8a42e2b4]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-8a42e2b4]{color:var(--vp-c-text-1)}.icon[data-v-8a42e2b4]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media(min-width:960px){.VPLocalNavOutlineDropdown button[data-v-8a42e2b4]{font-size:14px}.icon[data-v-8a42e2b4]{font-size:16px}}.open>.icon[data-v-8a42e2b4]{transform:rotate(90deg)}.items[data-v-8a42e2b4]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media(min-width:960px){.items[data-v-8a42e2b4]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-8a42e2b4]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-8a42e2b4]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-8a42e2b4]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-8a42e2b4]{transition:all .2s ease-out}.flyout-leave-active[data-v-8a42e2b4]{transition:all .15s ease-in}.flyout-enter-from[data-v-8a42e2b4],.flyout-leave-to[data-v-8a42e2b4]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-a6f0e41e]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-a6f0e41e]{position:fixed}@media(min-width:960px){.VPLocalNav[data-v-a6f0e41e]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-a6f0e41e]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-a6f0e41e]{display:none}}@media(min-width:1280px){.VPLocalNav[data-v-a6f0e41e]{display:none}}@media(min-width:1440px){.VPLocalNav.has-sidebar[data-v-a6f0e41e]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-a6f0e41e]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-a6f0e41e]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-a6f0e41e]:hover{color:var(--vp-c-text-1);transition:color .25s}@media(min-width:768px){.menu[data-v-a6f0e41e]{padding:0 32px}}@media(min-width:960px){.menu[data-v-a6f0e41e]{display:none}}.menu-icon[data-v-a6f0e41e]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-a6f0e41e]{padding:12px 24px 11px}@media(min-width:768px){.VPOutlineDropdown[data-v-a6f0e41e]{padding:12px 32px 11px}}.VPSwitch[data-v-1d5665e3]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-1d5665e3]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1d5665e3]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-1d5665e3]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1d5665e3] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-1d5665e3] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-5337faa4]{opacity:1}.moon[data-v-5337faa4],.dark .sun[data-v-5337faa4]{opacity:0}.dark .moon[data-v-5337faa4]{opacity:1}.dark .VPSwitchAppearance[data-v-5337faa4] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-6c893767]{display:none}@media(min-width:1280px){.VPNavBarAppearance[data-v-6c893767]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-35975db6]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-35975db6]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-35975db6]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-35975db6]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-69e747b5]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-69e747b5]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-69e747b5]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-69e747b5]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-b98bc113]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-b98bc113] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-b98bc113] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-b98bc113] .group:last-child{padding-bottom:0}.VPMenu[data-v-b98bc113] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-b98bc113] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-b98bc113] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-b98bc113] .action{padding-left:24px}.VPFlyout[data-v-cf11d7a2]{position:relative}.VPFlyout[data-v-cf11d7a2]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-cf11d7a2]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-cf11d7a2]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-cf11d7a2]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-cf11d7a2]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-cf11d7a2]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-cf11d7a2],.button[aria-expanded=true]+.menu[data-v-cf11d7a2]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-cf11d7a2]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-cf11d7a2]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-cf11d7a2]{margin-right:0;font-size:16px}.text-icon[data-v-cf11d7a2]{margin-left:4px;font-size:14px}.icon[data-v-cf11d7a2]{font-size:20px;transition:fill .25s}.menu[data-v-cf11d7a2]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-bd121fe5]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-bd121fe5]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-bd121fe5]>svg,.VPSocialLink[data-v-bd121fe5]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-7bc22406]{display:flex;justify-content:center}.VPNavBarExtra[data-v-bb2aa2f0]{display:none;margin-right:-12px}@media(min-width:768px){.VPNavBarExtra[data-v-bb2aa2f0]{display:block}}@media(min-width:1280px){.VPNavBarExtra[data-v-bb2aa2f0]{display:none}}.trans-title[data-v-bb2aa2f0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-bb2aa2f0],.item.social-links[data-v-bb2aa2f0]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-bb2aa2f0]{min-width:176px}.appearance-action[data-v-bb2aa2f0]{margin-right:-2px}.social-links-list[data-v-bb2aa2f0]{margin:-4px -8px}.VPNavBarHamburger[data-v-e5dd9c1c]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media(min-width:768px){.VPNavBarHamburger[data-v-e5dd9c1c]{display:none}}.container[data-v-e5dd9c1c]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-e5dd9c1c]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .middle[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .bottom[data-v-e5dd9c1c]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-e5dd9c1c],.middle[data-v-e5dd9c1c],.bottom[data-v-e5dd9c1c]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(0)}.middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-e56f3d57]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-e56f3d57],.VPNavBarMenuLink[data-v-e56f3d57]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-dc692963]{display:none}@media(min-width:768px){.VPNavBarMenu[data-v-dc692963]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media(max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media(max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media(min-width:768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media(min-width:768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media(min-width:768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media(min-width:768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media(min-width:768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media(min-width:960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-0394ad82]{display:none}@media(min-width:1280px){.VPNavBarSocialLinks[data-v-0394ad82]{display:flex;align-items:center}}.title[data-v-1168a8e4]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media(min-width:960px){.title[data-v-1168a8e4]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-1168a8e4]{border-bottom-color:var(--vp-c-divider)}}[data-v-1168a8e4] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-88af2de4]{display:none}@media(min-width:1280px){.VPNavBarTranslations[data-v-88af2de4]{display:flex;align-items:center}}.title[data-v-88af2de4]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-6aa21345]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-6aa21345]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-6aa21345]:not(.home){background-color:var(--vp-nav-bg-color)}@media(min-width:960px){.VPNavBar[data-v-6aa21345]:not(.home){background-color:transparent}.VPNavBar[data-v-6aa21345]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-6aa21345]{padding:0 8px 0 24px}@media(min-width:768px){.wrapper[data-v-6aa21345]{padding:0 32px}}@media(min-width:960px){.VPNavBar.has-sidebar .wrapper[data-v-6aa21345]{padding:0}}.container[data-v-6aa21345]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-6aa21345],.container>.content[data-v-6aa21345]{pointer-events:none}.container[data-v-6aa21345] *{pointer-events:auto}@media(min-width:960px){.VPNavBar.has-sidebar .container[data-v-6aa21345]{max-width:100%}}.title[data-v-6aa21345]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media(min-width:960px){.VPNavBar.has-sidebar .title[data-v-6aa21345]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media(min-width:1440px){.VPNavBar.has-sidebar .title[data-v-6aa21345]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-6aa21345]{flex-grow:1}@media(min-width:960px){.VPNavBar.has-sidebar .content[data-v-6aa21345]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media(min-width:1440px){.VPNavBar.has-sidebar .content[data-v-6aa21345]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-6aa21345]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media(min-width:960px){.VPNavBar:not(.home.top) .content-body[data-v-6aa21345]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-6aa21345]{background-color:transparent}}@media(max-width:767px){.content-body[data-v-6aa21345]{column-gap:.5rem}}.menu+.translations[data-v-6aa21345]:before,.menu+.appearance[data-v-6aa21345]:before,.menu+.social-links[data-v-6aa21345]:before,.translations+.appearance[data-v-6aa21345]:before,.appearance+.social-links[data-v-6aa21345]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-6aa21345]:before,.translations+.appearance[data-v-6aa21345]:before{margin-right:16px}.appearance+.social-links[data-v-6aa21345]:before{margin-left:16px}.social-links[data-v-6aa21345]{margin-right:-8px}.divider[data-v-6aa21345]{width:100%;height:1px}@media(min-width:960px){.VPNavBar.has-sidebar .divider[data-v-6aa21345]{padding-left:var(--vp-sidebar-width)}}@media(min-width:1440px){.VPNavBar.has-sidebar .divider[data-v-6aa21345]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-6aa21345]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-6aa21345]{background-color:var(--vp-c-gutter)}@media(min-width:960px){.VPNavBar:not(.home.top) .divider-line[data-v-6aa21345]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-6aa21345]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-b44890b2]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-b44890b2]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-df37e6dd]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-df37e6dd]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-3e9c20e4]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-3e9c20e4]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-8133b170]{display:block}.title[data-v-8133b170]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-b9ab8c58]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-b9ab8c58]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-b9ab8c58]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-b9ab8c58]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-b9ab8c58]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-b9ab8c58]{transform:rotate(45deg)}.button[data-v-b9ab8c58]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-b9ab8c58]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-b9ab8c58]{transition:transform .25s}.group[data-v-b9ab8c58]:first-child{padding-top:0}.group+.group[data-v-b9ab8c58],.group+.item[data-v-b9ab8c58]{padding-top:4px}.VPNavScreenTranslations[data-v-858fe1a4]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-858fe1a4]{height:auto}.title[data-v-858fe1a4]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-858fe1a4]{font-size:16px}.icon.lang[data-v-858fe1a4]{margin-right:8px}.icon.chevron[data-v-858fe1a4]{margin-left:4px}.list[data-v-858fe1a4]{padding:4px 0 0 24px}.link[data-v-858fe1a4]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f2779853]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-f2779853],.VPNavScreen.fade-leave-active[data-v-f2779853]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f2779853],.VPNavScreen.fade-leave-active .container[data-v-f2779853]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f2779853],.VPNavScreen.fade-leave-to[data-v-f2779853]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f2779853],.VPNavScreen.fade-leave-to .container[data-v-f2779853]{transform:translateY(-8px)}@media(min-width:768px){.VPNavScreen[data-v-f2779853]{display:none}}.container[data-v-f2779853]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f2779853],.menu+.appearance[data-v-f2779853],.translations+.appearance[data-v-f2779853]{margin-top:24px}.menu+.social-links[data-v-f2779853]{margin-top:16px}.appearance+.social-links[data-v-f2779853]{margin-top:16px}.VPNav[data-v-ae24b3ad]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media(min-width:960px){.VPNav[data-v-ae24b3ad]{position:fixed}}.VPSidebarItem.level-0[data-v-b3fd67f8]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-b3fd67f8]{padding-bottom:10px}.item[data-v-b3fd67f8]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-b3fd67f8]{cursor:pointer}.indicator[data-v-b3fd67f8]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-b3fd67f8],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-b3fd67f8],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-b3fd67f8],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-b3fd67f8]{background-color:var(--vp-c-brand-1)}.link[data-v-b3fd67f8]{display:flex;align-items:center;flex-grow:1}.text[data-v-b3fd67f8]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-b3fd67f8]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-b3fd67f8],.VPSidebarItem.level-2 .text[data-v-b3fd67f8],.VPSidebarItem.level-3 .text[data-v-b3fd67f8],.VPSidebarItem.level-4 .text[data-v-b3fd67f8],.VPSidebarItem.level-5 .text[data-v-b3fd67f8]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-b3fd67f8],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-b3fd67f8],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-b3fd67f8],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-b3fd67f8],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-b3fd67f8],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-b3fd67f8]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-b3fd67f8],.VPSidebarItem.level-1.has-active>.item>.text[data-v-b3fd67f8],.VPSidebarItem.level-2.has-active>.item>.text[data-v-b3fd67f8],.VPSidebarItem.level-3.has-active>.item>.text[data-v-b3fd67f8],.VPSidebarItem.level-4.has-active>.item>.text[data-v-b3fd67f8],.VPSidebarItem.level-5.has-active>.item>.text[data-v-b3fd67f8],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-b3fd67f8],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-b3fd67f8],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-b3fd67f8],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-b3fd67f8],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-b3fd67f8],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-b3fd67f8]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-b3fd67f8],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-b3fd67f8],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-b3fd67f8],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-b3fd67f8],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-b3fd67f8],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-b3fd67f8]{color:var(--vp-c-brand-1)}.caret[data-v-b3fd67f8]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-b3fd67f8]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-b3fd67f8]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-b3fd67f8]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-b3fd67f8]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-b3fd67f8],.VPSidebarItem.level-2 .items[data-v-b3fd67f8],.VPSidebarItem.level-3 .items[data-v-b3fd67f8],.VPSidebarItem.level-4 .items[data-v-b3fd67f8],.VPSidebarItem.level-5 .items[data-v-b3fd67f8]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-b3fd67f8]{display:none}.no-transition[data-v-c40bc020] .caret-icon{transition:none}.group+.group[data-v-c40bc020]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media(min-width:960px){.group[data-v-c40bc020]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-319d5ca6]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-319d5ca6]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-319d5ca6]{box-shadow:var(--vp-shadow-1)}@media(min-width:960px){.VPSidebar[data-v-319d5ca6]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media(min-width:1440px){.VPSidebar[data-v-319d5ca6]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media(min-width:960px){.curtain[data-v-319d5ca6]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-319d5ca6]{outline:0}.VPSkipLink[data-v-0b0ada53]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-0b0ada53]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media(min-width:1280px){.VPSkipLink[data-v-0b0ada53]{top:14px;left:16px}}.Layout[data-v-5d98c3a5]{display:flex;flex-direction:column;min-height:100vh}.endpoint{display:flex;align-items:stretch;margin:1rem 0;border-radius:6px;overflow:hidden;background-color:var(--vp-c-bg-soft);border:1px solid var(--vp-c-divider)}.endpoint-method{padding:.75rem 1rem;font-weight:700;font-family:var(--vp-font-family-mono);font-size:.875rem;background-color:var(--vp-c-brand-1);color:#fff;display:flex;align-items:center;white-space:nowrap}.endpoint-url{padding:.75rem 1rem;font-family:var(--vp-font-family-mono);font-size:.875rem;display:flex;align-items:center;flex:1;overflow-x:auto}.endpoint-url .strong{font-weight:700;color:var(--vp-c-brand-1)}.dark .endpoint{background-color:var(--vp-c-bg-soft)}.dark .endpoint-method{background-color:var(--vp-c-brand-2)}.VPLocalSearchBox[data-v-ce626c7c]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-ce626c7c]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-ce626c7c]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media(max-width:767px){.shell[data-v-ce626c7c]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-ce626c7c]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media(max-width:767px){.search-bar[data-v-ce626c7c]{padding:0 8px}}.search-bar[data-v-ce626c7c]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-ce626c7c]{display:block;font-size:18px}.navigate-icon[data-v-ce626c7c]{display:block;font-size:14px}.search-icon[data-v-ce626c7c]{margin:8px}@media(max-width:767px){.search-icon[data-v-ce626c7c]{display:none}}.search-input[data-v-ce626c7c]{padding:6px 12px;font-size:inherit;width:100%}@media(max-width:767px){.search-input[data-v-ce626c7c]{padding:6px 4px}}.search-actions[data-v-ce626c7c]{display:flex;gap:4px}@media(any-pointer:coarse){.search-actions[data-v-ce626c7c]{gap:8px}}@media(min-width:769px){.search-actions.before[data-v-ce626c7c]{display:none}}.search-actions button[data-v-ce626c7c]{padding:8px}.search-actions button[data-v-ce626c7c]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-ce626c7c]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-ce626c7c]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-ce626c7c]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-ce626c7c]{display:flex;align-items:center;gap:4px}@media(max-width:767px){.search-keyboard-shortcuts[data-v-ce626c7c]{display:none}}.search-keyboard-shortcuts kbd[data-v-ce626c7c]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-ce626c7c]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-ce626c7c]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-ce626c7c]{margin:12px;width:100%;overflow:hidden}@media(max-width:767px){.result>div[data-v-ce626c7c]{margin:8px}}.titles[data-v-ce626c7c]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-ce626c7c]{display:flex;align-items:center;gap:4px}.title.main[data-v-ce626c7c]{font-weight:500}.title-icon[data-v-ce626c7c]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-ce626c7c]{opacity:.5}.result.selected[data-v-ce626c7c]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-ce626c7c]{position:relative}.excerpt[data-v-ce626c7c]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-ce626c7c]{opacity:1}.excerpt[data-v-ce626c7c] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-ce626c7c] mark,.excerpt[data-v-ce626c7c] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-ce626c7c] .vp-code-group .tabs{display:none}.excerpt[data-v-ce626c7c] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-ce626c7c]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-ce626c7c]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-ce626c7c],.result.selected .title-icon[data-v-ce626c7c]{color:var(--vp-c-brand-1)!important}.no-results[data-v-ce626c7c]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-ce626c7c]{flex:none} diff --git a/docs/v26.5.0/assets/testing.md.CV2ZaUd4.js b/docs/v26.5.0/assets/testing.md.CV2ZaUd4.js new file mode 100644 index 0000000..dd7bca3 --- /dev/null +++ b/docs/v26.5.0/assets/testing.md.CV2ZaUd4.js @@ -0,0 +1,181 @@ +import{_ as a,o as n,c as e,ag as t}from"./chunks/framework.C2NLiVii.js";const h=JSON.parse('{"title":"Testsuite","description":"","frontmatter":{},"headers":[],"relativePath":"testing.md","filePath":"testing.md"}'),p={name:"testing.md"};function i(o,s,l,r,c,d){return n(),e("div",null,[...s[0]||(s[0]=[t(`

Testsuite

OSRM comes with a testsuite containing both unit-tests using the Boost library and cucumber.js for scenario driven testing.

Unit Tests

For a general introduction on Boost.Test have a look at its docs.

Separate Test Binaries

Unit tests should be registered according to the sub-project they're in. If you want to write tests for utility functions, add them to the utility test binary. See CMakeLists.txt in the unit test directory for how to register new unit tests.

Using Boost.Test Primitives

There is a difference between only reporting a failed condition and aborting the test right at a failed condition. Have a look at BOOST_CHECK vs BOOST_REQUIRE. Instead of manually checking e.g. for equality, less than, if a function throws etc. use their corresponding Boost.Test primitives.

If you use BOOST_CHECK_EQUAL you have to implement operator<< for your type so that Boost.Test can print mismatches. If you do not want to do this, define BOOST_TEST_DONT_PRINT_LOG_VALUE (and undef it after the check call) or sidestep it with BOOST_CHECK(fst == snd);.

Test Fixture

If you need to test features on a real dataset (think about this twice: prefer cucumber and dataset-independent tests for their reproducibility and minimality), there is a fixed dataset in test/data. This dataset is a small extract and may not even contain all tags or edge cases. Furthermore this dataset is not in sync with what you see in up-to-date OSM maps or on the demo server. See the library tests for how to add new dataset dependent tests.

To prepare the test data simply cd test/data/ and then run make.

Running Tests

To build the unit tests:

cd build
+cmake ..
+make tests

You should see the compiled binaries in build/unit_tests, you can then run each suite individually:

./engine-tests

Cucumber

For a general introduction on cucumber in our testsuite, have a look at the wiki.

This documentation aims to supply a guideline on how to write cucumber tests that test new features introduced into osrm.

Test the feature

It is often tempting to reduce the test to a path and accompanying instructions. Instructions can and will change over the course of improving guidance.

Instructions should only be used when writing a feature located in features/guidance. All other features should avoid using instructions at all.

Write Tests to Scale

OSRM is a navigation engine. Tests should always consider this context.

An important implication is the grid size. If tests use a very small grid size, you run into the chance of instructions being omitted. For example:

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b c d
+        """
+
+    And the ways
+        | nodes | highway |
+        | ab    | primary |
+        | bc    | primary |
+        | cd    | primary |
+
+    When I route I should get
+        | from | to | route       |
+        | a    | d  | ab,bc,cd,cd |

In a navigation engine, the instructions

  • depart east on ab
  • in 10 meters the road name changes to bc
  • in 10 meters the road name changes to cd
  • you arrived at cd

would be impossible to announce and not helpful at all. Since no actual choices exist, the route you get could result in ab,cd and simply say depart and arrive.

To prevent such surprises, always consider the availability of other roads and use grid sizes/road lengths that correspond to actually reasonable scenarios in a road network.

Use names

If you specify many nodes in close succession to present a specific road geometry, consider using name to indicate to OSRM that the segment is a single road.

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b c d
+        """
+
+    And the ways
+        | nodes | highway | name |
+        | ab    | primary | road |
+        | bc    | primary | road |
+        | cd    | primary | road |
+
+    When I route I should get
+        | from | to | route     | turns         |
+        | a    | d  | road,road | depart,arrive |

Guidance guarantees only essential maneuvers. You will always see depart and arrive as well as all turns that are not obvious.

So the following scenario does not change the instructions

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b
+        d c
+        """
+
+    And the ways
+        | nodes | highway | name |
+        | ab    | primary | road |
+        | bc    | primary | road |
+        | cd    | primary | road |
+
+    When I route I should get
+        | from | to | route     | turns         |
+        | a    | d  | road,road | depart,arrive |

but if we modify it to

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b e
+        d c
+        """
+
+    And the ways
+        | nodes | highway | name |
+        | ab    | primary | road |
+        | bc    | primary | road |
+        | cd    | primary | road |
+        | be    | primary | turn |
+
+    When I route I should get
+        | from | to | route          | turns                        |
+        | a    | d  | road,road,road | depart,continue right,arrive |

Test all directions

Modelling a road as roundabout has an implied oneway tag associated with it. In the following case, we can route from a to d but not from d to a. To discover those errors, make sure to check for all allowed directions.

Scenario: Enter and Exit mini roundabout with sharp angle   # features/guidance/mini-roundabout.feature:37
+    Given the profile "car"                                   # features/step_definitions/data.js:8
+    Given a grid size of 10 meters                            # features/step_definitions/data.js:20
+    Given the node map                                        # features/step_definitions/data.js:45
+        """
+        a b
+          c d
+        """
+    And the ways                                              # features/step_definitions/data.js:128
+        | nodes | highway         | name |
+        | ab    | tertiary        | MySt |
+        | bc    | roundabout      |      |
+        | cd    | tertiary        | MySt |
+    When I route I should get                                 # features/step_definitions/routing.js:4
+        | from | to | route     | turns         | #                                               |
+        | a    | d  | MySt,MySt | depart,arrive | # suppress multiple enter/exit mini roundabouts |
+        | d    | a  | MySt,MySt | depart,arrive | # suppress multiple enter/exit mini roundabouts |
+    Tables were not identical:
+        |  from |     to |     route     |     turns         |     #
+        |     a |      d |     MySt,MySt |     depart,arrive |     # suppress multiple enter/exit mini roundabouts |
+        | (-) d |  (-) a | (-) MySt,MySt | (-) depart,arrive | (-) # suppress multiple enter/exit mini roundabouts |
+        | (+) d |  (+) a | (+)           | (+)               | (+) # suppress multiple enter/exit mini roundabouts |

Prevent Randomness

Some features in OSRM can result in strange experiences during testcases. To prevent some of these issues, follow the guidelines below.

Use Waypoints

Using grid nodes as waypoints offers the chance of unwanted side effects. OSRM converts the grid into a so called edge-based graph.

Scenario: Testbot - Intersection
+    Given the node map
+        """
+          e
+        b a d
+          c
+        """
+
+    And the ways
+        | nodes | highway | oneway |
+        | ab    | primary | yes    |
+        | ac    | primary | yes    |
+        | ad    | primary | yes    |
+        | ae    | primary | yes    |

Selecting a as a waypoint results in four possible starting locations. Which one of the routes a,b, a,c, a,d, or a,e is found is pure chance and depends on the order in the static r-tree.

To guarantee discovery, use:

Scenario: Testbot - Intersection
+    Given the node map
+        """
+            e
+            4
+        b 1 a 3 d
+            2
+            c
+        """
+
+    And the ways
+        | nodes | highway | oneway |
+        | ab    | primary | yes    |
+        | ac    | primary | yes    |
+        | ad    | primary | yes    |
+        | ae    | primary | yes    |

And use 1,2,3, and 4 as starting waypoints. The routes 1,b, 2,c, 3,d, and 4,e can all be discovered.

Allow For Small Offsets

Whenever you are independent of the start location (see use waypoints), the waypoint chosen as start/end location can still influence distances/durations.

If you are testing for a duration metric, allow for a tiny offset to ensure a passing test in the presence of rounding/snapping issues.

Don't Rely on Alternatives

Alternative route discovery is a random feature in itself. The discovery of routes depends on the contraction order of roads and cannot be assumed successful, ever.

Understanding Turn Restrictions

Adding turn restrictions requires the restriction to follow a very specific format.

We specify them in a table with the header | type | way:from | way:to | node:via | restriction |. It is important that turn restrictions require micro segmentation.

Consider the following scenario:

Given the node map:
+    """
+          e
+          |
+    a - - b - - c
+          |
+          d
+    """
+
+And the ways
+    | nodes | oneway |
+    | abc   | yes    |
+    | ebd   | yes    |
+
+And the relations
+    | type        | way:from | way:to | node:via | restriction   |
+    | restriction | abc      | ebd    | b        | no_right_turn |

The setting looks perfectly fine at first glance. However, it is not well defined. The forbidden right turn could be either a superfluous addition, forbidding the turn cb to be, or actually refer to the turn ab to bd to say that a turn is forbidden here.

To model turn-restrictions correctly and uniquely, we need to split segments that contribute to the restriction into the smallest possible parts. E.g. the above scenario could correctly be expressed as:

Given the node map:
+    """
+          e
+          |
+    a - - b - - c
+          |
+          d
+    """
+
+And the ways
+    | nodes | oneway | name |
+    | ab    | yes    | abc  |
+    | bc    | yes    | abc  |
+    | eb    | yes    | ebd  |
+    | bd    | yes    | ebd  |
+
+And the relations
+    | type        | way:from | way:to | node:via | restriction   |
+    | restriction | ab       | bd     | b        | no_right_turn |

Unless this format is used, OSRM will omit the (then ambiguous) turn restrictions and ignore them.

My Guidance Tests are Failing - Understanding what you can change

If you change some stuff in guidance, you will easily see tests change their result. E.g. if you change the angles for which we report right, then obviously some tests might not report a direction modifier named right anymore.

This small section will try to guide you in making the correct decisions for changing the behaviour of tests.

The difficulty in guidance tests is that not all items can be translated 1:1 from the ascii art into turn-angles.

The turn-angle calculation tries to find turn angles that would represent perceived turn angles, not the exact angle at the connection.

This is necessary, since connections in OSM are always bound by the paradigm that the way is supposed to be in the middle of the actual road. For broad streets, you will see stronger angles than the actual turns.

Don't change the test, change the expected behaviour

If we have a test that looks like this:

Given a grid size of 5 m
+Given the node map
+"""
+a - b - - - - - - c
+     \\  
+      d - - - - - e
+"""
+
+When I route I should get
+ | waypoints | route       | turns                          |
+ | a,e       | abc,bde,bde | depart,turn slight right,arrive|

And the test reports turn right for the route a->e, where before it said slight right.

If you change the turn angles, obviously you can expect changes in the distinction between slight right and right. In such a case it is, of course, reasonable to change the expected route to report right instead of slight right. You should consider inspecting the actual turn angles at b to see if you feel that change is justified.

However, you should never adjust the test itself. If you look at a failure, the other way around

Given a grid size of 5 m
+Given the node map
+"""
+a - b - - - - - - c
+     \\  
+      d - - - - - e
+"""
+
+When I route I should get
+ | waypoints | route       | turns                   |
+ | a,e       | abc,bde,bde | depart,turn right,arrive|

where we see a slight right, over the expected right. We could be tempted to adjust the grid size (e.g. from 10 m to 20 meters).

Such a change would fundamentally alter the tests, though. Since the part b-d is a short offset, when we are looking at a grid of size 5 m, the angle calculation will try and compensate for this offset.

In this case we would see a very slight turn angle. If your change now reports different turn angles, you can of course change the expected result. But you should not adjust the grid size. The test would be testing turn angles of 180 and 100 degrees, instead of 180 and 160.

Consider Post-Processing Impacts

Some changes you might see could look completely unrelated. To understand the impact of your changes, you can make use of the debugging utilities you can find in util/debug.hpp (and potentially other related headers).

If your test is inspecting a series of turns (remember, a turn does not necessarily equals an instruction), you could see interaction with post-processing. To see the unprocessed turns, you should print the steps at the end of step assembly (assembleSteps in engine/guidance/assemble_steps.hpp).

If you see unexpected changes, you can consider adding the locations field to your test to study what location a turn is reported at.

To study a test without post-processing impacts, you can create a copy of the case on a very large grid (like 2000 meters). In such a grid, turn collapsing would be essentially disabled.

Sadly, there is no general guideline.

Use Caution

If in doubt, ask another person. Inspect as much of the data as possible (e.g. print un-collapsed steps, turn angles and so on) and use your best judgement, if the new result seems justified.

`,89)])])}const g=a(p,[["render",i]]);export{h as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/testing.md.CV2ZaUd4.lean.js b/docs/v26.5.0/assets/testing.md.CV2ZaUd4.lean.js new file mode 100644 index 0000000..f689ab8 --- /dev/null +++ b/docs/v26.5.0/assets/testing.md.CV2ZaUd4.lean.js @@ -0,0 +1 @@ +import{_ as a,o as n,c as e,ag as t}from"./chunks/framework.C2NLiVii.js";const h=JSON.parse('{"title":"Testsuite","description":"","frontmatter":{},"headers":[],"relativePath":"testing.md","filePath":"testing.md"}'),p={name:"testing.md"};function i(o,s,l,r,c,d){return n(),e("div",null,[...s[0]||(s[0]=[t("",89)])])}const g=a(p,[["render",i]]);export{h as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/tools.md.DBA6o9B7.js b/docs/v26.5.0/assets/tools.md.DBA6o9B7.js new file mode 100644 index 0000000..49275ff --- /dev/null +++ b/docs/v26.5.0/assets/tools.md.DBA6o9B7.js @@ -0,0 +1,10 @@ +import{_ as e,o as d,c as o,ag as a}from"./chunks/framework.C2NLiVii.js";const m=JSON.parse('{"title":"Command-Line Tools","description":"","frontmatter":{},"headers":[],"relativePath":"tools.md","filePath":"tools.md"}'),s={name:"tools.md"};function i(r,t,n,c,l,h){return d(),o("div",null,[...t[0]||(t[0]=[a(`

Command-Line Tools

OSRM ships six command-line tools that cover the full data pipeline, from raw OSM data to a running routing server. All tools share a set of common options described below, followed by per-tool reference sections.

Common Options

These flags are accepted by every tool.

FlagShortDescription
--help-hShow the help message and exit.
--version-vShow the version string and exit.
--verbosity <level>-lLog verbosity: NONE, ERROR, WARNING, INFO (default), DEBUG.
--list-inputsPrint all required and optional input file extensions the tool expects, then exit. Useful for deployment scripts.
--threads <n>-tNumber of threads to use (default: number of logical CPUs).

--list-inputs

Prints one line per file in the format required|optional <extension>:

$ osrm-routed --list-inputs
+required .osrm.datasource_names
+required .osrm.ebg_nodes
+required .osrm.edges
+...
+optional .osrm.hsgr
+optional .osrm.cells

Example — collect all files needed to deploy osrm-routed:

bash
BASE=map
+for line in $(osrm-routed --list-inputs); do
+    echo "$BASE$line"
+done

osrm-extract

Reads an OSM file and a Lua profile, and produces the intermediate .osrm.* files consumed by the graph-preparation tools.

osrm-extract <input.osm/.osm.bz2/.osm.pbf> [options]
FlagShortDefaultDescription
--profile <path>-pprofiles/car.luaPath to the Lua routing profile.
--output <path>-oDerived from input filenameBase path for generated output files.
--data_version <string>-d(none)Tag the dataset with a version string. Use osmosis to read the timestamp embedded in the PBF file.
--small-component-size <n>1000Minimum node count for a strongly-connected component to be treated as "large". Affects nearest-neighbor snapping.
--with-osm-metadataParse OSM metadata (user, timestamp, etc.). May reduce extraction performance.
--parse-conditional-restrictionsSave conditional turn restrictions to disk so they can be evaluated during contraction.
--location-dependent-data <file>GeoJSON files containing location-dependent data (e.g. speed limits by region). Repeatable.
--disable-location-cacheDisable the internal node-location cache used for location-dependent data lookups.
--dump-nbg-graphWrite the raw node-based graph to the .osrm file for debugging.

osrm-partition

Partitions the road network graph into a hierarchy of cells used by the Multi-Level Dijkstra (MLD) algorithm.

osrm-partition <input.osrm> [options]
FlagDefaultDescription
--max-cell-sizes <list>128,4096,65536,2097152Comma-separated maximum cell sizes per level, starting from level 1. The first value is also the bisection termination threshold.
--balance <factor>1.2Maximum allowed size ratio between the two sides of a single bisection.
--boundary <fraction>0.25Fraction of nodes to use as boundary sources/sinks during contraction.
--optimizing-cuts <n>10Number of candidate cuts evaluated when optimizing a single bisection.
--small-component-size <n>1000Node-count threshold below which a component is treated as small.

osrm-customize

Applies live traffic data (speed and turn-penalty files) to a partitioned MLD graph. Can be run repeatedly without re-partitioning when speeds change.

osrm-customize <input.osrm> [options]
FlagDefaultDescription
--segment-speed-file <file>CSV with nodeA,nodeB,speed columns to override edge weights. Repeatable.
--turn-penalty-file <file>CSV with from_node,via_node,to_node,penalty to override turn weights. Repeatable.
--edge-weight-updates-over-factor <x>0 (disabled)Log edges whose weight changed by more than factor x (requires --segment-speed-file).
--parse-conditionals-from-now <utc_timestamp>0 (disabled)UTC Unix timestamp from which to evaluate conditional turn restrictions.
--time-zone-file <file>GeoJSON file with time-zone boundaries, required for conditional restriction parsing.

osrm-contract

Builds a Contraction Hierarchy (CH) from the extracted graph. Use this instead of osrm-partition + osrm-customize when you don't need live traffic updates.

osrm-contract <input.osrm> [options]
FlagDefaultDescription
--segment-speed-file <file>CSV with nodeA,nodeB,speed columns to override edge weights. Repeatable.
--turn-penalty-file <file>CSV with from_node,via_node,to_node,penalty to override turn weights. Repeatable.
--edge-weight-updates-over-factor <x>0 (disabled)Log edges whose weight changed by more than factor x.
--parse-conditionals-from-now <utc_timestamp>0 (disabled)UTC Unix timestamp for evaluating conditional turn restrictions.
--time-zone-file <file>GeoJSON file with time-zone boundaries, required for conditional restriction parsing.

osrm-routed

The HTTP server. Loads a prepared dataset and serves the OSRM HTTP API.

osrm-routed <base.osrm> [options]

Server

FlagShortDefaultDescription
--ip <address>-i0.0.0.0IP address to listen on.
--port <n>-p5000TCP port to listen on.
--keepalive-timeout <s>-k5HTTP keep-alive timeout in seconds.
--trialStart up fully, then exit immediately. Useful to validate a dataset without serving traffic.

Data loading

FlagShortDefaultDescription
--algorithm <name>-aCHRouting algorithm: CH (Contraction Hierarchy) or MLD (Multi-Level Dijkstra).
--shared-memory-soffLoad data from a shared memory region managed by osrm-datastore.
--mmap-moffMemory-map the data files instead of loading them into RAM.
--dataset-name <name>Shared memory dataset name to connect to (used with --shared-memory).
--disable-feature-dataset <name>Skip loading an optional dataset to save memory. Options: ROUTE_STEPS, ROUTE_GEOMETRY.

Query limits

FlagDefaultDescription
--max-viaroute-size <n>500Maximum number of waypoints in a route query.
--max-trip-size <n>100Maximum number of locations in a trip query.
--max-table-size <n>100Maximum number of locations in a table query.
--max-matching-size <n>100Maximum number of locations in a map-matching query.
--max-nearest-size <n>100Maximum number of results in a nearest query.
--max-alternatives <n>3Maximum number of alternative routes (MLD only).
--max-matching-radius <m>-1 (unlimited)Maximum search radius in metres for map-matching.
--default-radius <m>-1 (unlimited)Default snap radius for all queries.
--max-header-size <bytes>0 (auto)Maximum HTTP header size in bytes.

osrm-datastore

Loads a prepared dataset into shared memory so that one or more osrm-routed processes can serve it with zero-copy access. Enables live traffic updates without restarting the server.

osrm-datastore [options] <base.osrm>
FlagShortDefaultDescription
--dataset-name <name>Name for this dataset in shared memory. Allows multiple datasets to coexist.
--max-wait <s>-1 (unlimited)Seconds to wait for a running update to finish before forcibly acquiring the lock.
--only-metricReload only the metric (weights/durations) without replacing the full dataset. Optimized for frequent traffic updates.
--disable-feature-dataset <name>Skip loading an optional dataset. Options: ROUTE_STEPS, ROUTE_GEOMETRY.
--remove-locks-rRemove stale shared-memory locks and exit.
--spring-clean-sRemove all OSRM shared memory regions and exit.
--listList all datasets currently loaded in shared memory.
--list-blocksList all shared memory blocks currently in use.
`,45)])])}const u=e(s,[["render",i]]);export{m as __pageData,u as default}; diff --git a/docs/v26.5.0/assets/tools.md.DBA6o9B7.lean.js b/docs/v26.5.0/assets/tools.md.DBA6o9B7.lean.js new file mode 100644 index 0000000..8a71806 --- /dev/null +++ b/docs/v26.5.0/assets/tools.md.DBA6o9B7.lean.js @@ -0,0 +1 @@ +import{_ as e,o as d,c as o,ag as a}from"./chunks/framework.C2NLiVii.js";const m=JSON.parse('{"title":"Command-Line Tools","description":"","frontmatter":{},"headers":[],"relativePath":"tools.md","filePath":"tools.md"}'),s={name:"tools.md"};function i(r,t,n,c,l,h){return d(),o("div",null,[...t[0]||(t[0]=[a("",45)])])}const u=e(s,[["render",i]]);export{m as __pageData,u as default}; diff --git a/docs/v26.5.0/assets/windows-deps.md.g5icV0ej.js b/docs/v26.5.0/assets/windows-deps.md.g5icV0ej.js new file mode 100644 index 0000000..ce463f2 --- /dev/null +++ b/docs/v26.5.0/assets/windows-deps.md.g5icV0ej.js @@ -0,0 +1,4 @@ +import{_ as i,o as s,c as a,ag as n}from"./chunks/framework.C2NLiVii.js";const u=JSON.parse('{"title":"Building OSRM for Windows","description":"","frontmatter":{},"headers":[],"relativePath":"windows-deps.md","filePath":"windows-deps.md"}'),t={name:"windows-deps.md"};function o(r,e,d,l,p,h){return s(),a("div",null,[...e[0]||(e[0]=[n(`

Building OSRM for Windows

There is experimental support for building OSRM on Windows.

Dependencies

You will need a modern Windows development stack (e.g. Visual Studio 17). The published binaries are built with Windows Server 2025 Github hosted runners.

Dependencies are managed via vcpkg in manifest mode (see vcpkg.json at the repo root). The baseline commit is pinned in vcpkg-configuration.json.

Prerequisites

  1. Install Visual Studio 2022 with the "Desktop development with C++" workload.
  2. Clone vcpkg and bootstrap it:
bat
git clone https://github.com/microsoft/vcpkg.git C:\\vcpkg
+C:\\vcpkg\\bootstrap-vcpkg.bat
+set VCPKG_ROOT=C:\\vcpkg

Building

From a x64 Native Tools Command Prompt for VS 2022 at the repo root:

bat
cmake --preset ci-windows -DENABLE_NODE_BINDINGS=ON
+cmake --build --preset ci-windows

The first configure will build every dependency from source, which takes a while. Subsequent configures reuse vcpkg's binary cache.

`,12)])])}const g=i(t,[["render",o]]);export{u as __pageData,g as default}; diff --git a/docs/v26.5.0/assets/windows-deps.md.g5icV0ej.lean.js b/docs/v26.5.0/assets/windows-deps.md.g5icV0ej.lean.js new file mode 100644 index 0000000..a05e04e --- /dev/null +++ b/docs/v26.5.0/assets/windows-deps.md.g5icV0ej.lean.js @@ -0,0 +1 @@ +import{_ as i,o as s,c as a,ag as n}from"./chunks/framework.C2NLiVii.js";const u=JSON.parse('{"title":"Building OSRM for Windows","description":"","frontmatter":{},"headers":[],"relativePath":"windows-deps.md","filePath":"windows-deps.md"}'),t={name:"windows-deps.md"};function o(r,e,d,l,p,h){return s(),a("div",null,[...e[0]||(e[0]=[n("",12)])])}const g=i(t,[["render",o]]);export{u as __pageData,g as default}; diff --git a/docs/v26.5.0/cucumber.html b/docs/v26.5.0/cucumber.html new file mode 100644 index 0000000..05b54f8 --- /dev/null +++ b/docs/v26.5.0/cucumber.html @@ -0,0 +1,25 @@ + + + + + + Cucumber | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Cucumber

This documentation describes the technical aspects of our cucumber test suite.

tl;dr

Run the Cucumber tests with:

bash
$ npm test

Single OSRM Configuration

An OSRM configuration consists of a routing algorithm and a data load method. OSRM currently supports the routing algorithms:

  • ch (Contraction Hierarchy), and
  • mld (Multi-Level-Dijkstra)

and the data load methods:

  • directly (load the files into memory),
  • mmap (use memory mapped files), and
  • datastore (use shared memory).

To test all scenarios with a single OSRM configuration, say:

bash
$ npx cucumber-js -p home -p mld -p mmap --parallel 8 --fail-fast

Explanations follow:

Profiles

Profiles are chosen with the -p commandline argument. Cucumber profiles allow you to change multiple configuration items with just one commandline argument. If you set more than one profile they are all merged into one configuration.

Note: Cucumber profiles should not be confused with OSRM profiles. Cucumber profiles are defined in cucumber.mjs. OSRM profiles reside in the profiles/*.lua files.

Our implementation offers following stock profiles. You should always use one base profile followed by zero or more additional profiles.

Name
homeBase profile to use on a developer machine
githubBase profile to use on the github CI server
chAdditional profile that selects the CH algorithm
mldAdditional profile that selects the MLD algorithm
mmapAdditional profile that selects the mmap data load method
directlyAdditional profile that selects the directly data load method
datastoreAdditional profile that selects the datastore data load method
stressAdditional profile that selects only @stress tests
todoAdditional profile that selects only @todo tests
allAdditional profile that selects all tests

Arguments

Here is a description of all arguments you can pass to Cucumber. The interesting ones probably are: --fail-fast, --format, --parallel, and --tags.

Note: when using --parallel N make sure there are N contiguous free ports at the configured port number (eg. at ports 5000--5000+N).

All OSRM Configurations

We provide a shortcut to run all 6 configurations:

bash
$ npm test

This is how the tests are run on the CI server. You can pass the same arguments as mentioned above.

Cache

To speed up subsequent runs with the same parameters, the files generated by Cucumber and the by the OSRM extraction chain are held in a cache directory. This cache is located by default in test/cache and should be cleaned periodically:

bash
$ rm -rf test/cache

Configuration

The whole configuration is done in cucumber.mjs. You can either edit worldParameters in cucumber.mjs or use environment variables to override single defaults.

worldParametersEnvironment VariableDefaults to
CUCUMBER_TIMEOUT5000Scenario timeout in ms.
httpTimeoutCUCUMBER_HTTP_TIMEOUT2000HTTP timeout in ms.
testPathCUCUMBER_TEST_PATHtestThe test directory
profilesPathCUCUMBER_PROFILES_PATHprofilesThe profiles directory
logsPathCUCUMBER_LOGS_PATHtest/logsThe logs directory
cachePathCUCUMBER_CACHE_PATHtest/cacheThe cache directory
buildPathOSRM_BUILD_DIRbuildPath to the binaries
loadMethodOSRM_LOAD_METHODdatastoreData load method
algorithmOSRM_ALGORITHMchRouting algorithm
ipOSRM_IP127.0.0.1IP Address
portOSRM_PORT5000IP Port

The default Cucumber timeout can be changed by setting the environment variable CUCUMBER_TIMEOUT. This is discouraged, because the default timeout of 5 seconds is plenty for the problem sizes we are dealing with. The probable reasons for a test timing out are that osrm-routed died or that sync between osrm-datastore and osrm-routed was lost.

Other environment variables

OSRM_RASTER_SOURCE is set by 'Given the raster source' and is supposed to be read back in your profiles/*.lua profile by os.getenv('OSRM_RASTER_SOURCE').

OSRM_PROFILE See: Pull Request #4516

Tags

Single scenarios or whole feature files can be tagged. Tag names can be selected arbitrarily although it is best to conform to the tags already used. Eg. the tag @guidance can be used to run only those tests related to the guidance feature:

bash
$ npm test -- --tags @guidance

We also support following special tags:

TagA scenario thus tagged ...
@isolatedwill not run while any other scenario is running in parallel
@with_(datastore|directly|mmap)will be executed iff the load method matches
@no_(datastore|directly|mmap)will be executed unless the load method matches
@with_(ch|mld)will be executed iff the algorithm matches
@no_(ch|mld)will be executed unless the algorithm matches
@with_(linux|darwin|win32)will be executed iff the OS matches
@no_(linux|darwin|win32)will be executed unless the OS matches

A test that calls osrm-datastore --spring-clean should not run concurrently with any other test, thus the tag @isolated should be applied. A test that runs or kills osrm-routed should not run while testing the datastore load method, and thus should be labeled with the tag @no_datastore.

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/developing.html b/docs/v26.5.0/developing.html new file mode 100644 index 0000000..7f793fb --- /dev/null +++ b/docs/v26.5.0/developing.html @@ -0,0 +1,25 @@ + + + + + + Developing / Debugging guidance code | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Developing / Debugging guidance code

When changing guidance code, it is easy to introduce problems somewhere in the network. To get a better feeling of how your changes impact the OSRM experience, we offer ways of generating geojson output to inspect (e.g. with Mapbox Studio). When you do changes, make sure to inspect a few areas for the impact of the changes.

How to use GeoJson-Debugging

This is a short guide to describe usage of our GeoJson debug logging mechanism. It is synchronized to guarantee thread-safe logging.

Outputting into a single file

To use it, the inclusion of geojson_debug_logger.hpp geojson_debug_policies.hpp from the util directory is required.

Geojson debugging requires a few simple steps to output data into a feature collection.

  • Create a Scoped Guard that lives through the process and provide it with all required datastructures (it needs to span the lifetime of all your logging efforts)
  • At the location of the output, simply call Write with your own parameters.

A guard (ScopedGeojsonLoggerGuard) requires a logging policy. Per default we provide a way of printing out node-ids as coordinates.

The initialisation to do so looks like this: util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug.geojson", data-for-conversion); Make sure to give the guard a name, so it actually gets a lifetime.

The field data-for-conversion can be an arbitrary long set of features and needs to match the parameters used for constructing our policy (in this case util::NodeIdVectorToLineString).

The policy itself offers a operator() accepting a vector of NodeID.

For outputting data into our file (debug.geojson), we simply need to call the matching logging routine of the guard: util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString>::Write(list_of_node_ids); (or guard.Write(list_of_node_ids) if you created an instance).

Possible Scopeguard Location

Think of the scopeguard as you would do of any reference. If you want to access logging during a call, the guard object must be alive and valid.

As an example: a good location to create a scopeguard to log decisions in the edge-based-graph-factory would be right before we run it (here). If you put util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug.geojson", node_coordinate_vector); at that location, you can then print util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString>::Write(list_of_node_ids); anywhere within the edge-based-graph-factory.

This location would enable calls for all guidance related pre-processing which is called in the edge-based-graph-factory. Logging any turn-handler decisions, for example, would now be possible.

Limitations

GeoJson debugging requires a single GeoJsonGuard (ScopedGeojsonLoggerGuard) for each desired output file. For each set of template parameters, only the most recent guard will actually produce output.

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug.geojson", data-for-conversion);

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString> geojson_guard( "debug-2.geojson", data-for-conversion);

Will not provide a way to write into two files, but only debug-2 will actually contain features.

We cannot nest these calls.

If we want to use the same policy for multiple files, we need to use different template parameters both for the logger and the guard.

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,0> geojson_guard( "debug.geojson", data-for-conversion);

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,1> geojson_guard( "debug-2.geojson", data-for-conversion);

as well as,

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,0>::Write(list_of_node_ids);

util::ScopedGeojsonLoggerGuard<util::NodeIdVectorToLineString,1>::Write(list_of_node_ids);

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/hashmap.json b/docs/v26.5.0/hashmap.json new file mode 100644 index 0000000..08411c8 --- /dev/null +++ b/docs/v26.5.0/hashmap.json @@ -0,0 +1 @@ +{"cucumber.md":"B5iBKzmw","developing.md":"CHbv2cLk","http.md":"B98BbSjI","index.md":"BuTlAqVr","libosrm.md":"BKkADM6U","nodejs_api.md":"B1H4WFni","profiles.md":"PHAThxX1","python_api.md":"BMYgTnwH","python_development.md":"DMJOl9Fk","releasing.md":"D_HqADus","routed.md":"B7b7kZju","testing.md":"CV2ZaUd4","tools.md":"DBA6o9B7","windows-deps.md":"g5icV0ej"} diff --git a/docs/v26.5.0/http.html b/docs/v26.5.0/http.html new file mode 100644 index 0000000..726765e --- /dev/null +++ b/docs/v26.5.0/http.html @@ -0,0 +1,290 @@ + + + + + + OSRM HTTP server | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

OSRM HTTP server

The built-in HTTP server is a basic HTTP/1.0 server that supports a 'keep-alive' extension. Persistent connections are limited to 512 requests per connection and allow no more than 5 seconds between requests.

General options

All OSRM HTTP requests use a common structure.

The following syntax applies to all services, except as noted.

Requests

GET
/{service}/{version}/{profile}/{coordinates}[.{format}]?option=value&option=value
ParameterDescription
serviceOne of the following values: route, nearest, table, match, trip, tile
versionVersion of the protocol implemented by the service. v1 for all OSRM 5.x installations
profileMode of transportation, is determined statically by the Lua profile that is used to prepare the data using osrm-extract. Typically car, bike or foot if using one of the supplied profiles.
coordinatesString of format {longitude},{latitude};{longitude},{latitude}[;{longitude},{latitude} ...] or polyline({polyline}) or polyline6({polyline6}).
formatjson or flatbuffers. This parameter is optional and defaults to json.

Passing any option=value is optional. polyline follows Google's polyline format with precision 5 by default and can be generated using this package.

To pass parameters to each location some options support an array-like encoding:

Request options

OptionValuesDescription
bearings{bearing};{bearing}[;{bearing} ...]Limits the search to segments with given bearing in degrees towards true north in a clockwise direction.
radiuses{radius};{radius}[;{radius} ...]Limits the search to given radius in meters.
generate_hintstrue (default), falseAdds a Hint to the response which can be used in subsequent requests, see hints parameter.
hints{hint};{hint}[;{hint} ...]Hint from previous request to derive position in street network.
approaches{approach};{approach}[;{approach} ...]Restrict the direction on the road network at a waypoint, relative to the input coordinate.
exclude{class}[,{class}]Additive list of classes to avoid, the order does not matter.
snappingdefault (default), anyDefault snapping avoids is_startpoint (see profile) edges, any will snap to any edge in the graph
skip_waypointstrue, false (default)Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of the response and do not want to transfer waste data.

Where the elements follow the following format:

ElementValues
bearing{value},{range} integer 0 .. 360,integer 0 .. 180
radiusdouble >= 0 or unlimited (default)
hintBase64 string
approachcurb, opposite or unrestricted (default)
classA class name determined by the profile or none.
{option}={element};{element}[;{element} ... ]

The number of elements must match exactly the number of locations (except for generate_hints and exclude). If you don't want to pass a value but instead use the default you can pass an empty element.

Example: 2nd location uses the default value for option:

{option}={element};;{element}

Example Requests

bash
# Query on Berlin with three coordinates:
+curl 'http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?overview=false'
+
+# Query on Berlin excluding the usage of motorways:
+curl 'http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407?exclude=motorway'
+
+# Using polyline:
+curl 'http://router.project-osrm.org/route/v1/driving/polyline(ofp_Ik_vpAilAyu@te@g`E)?overview=false'

Responses

Code

Every response object has a code property containing one of the strings below or a service dependent code:

TypeDescription
OkRequest could be processed as expected.
InvalidUrlURL string is invalid.
InvalidServiceService name is invalid.
InvalidVersionVersion is not found.
InvalidOptionsOptions are invalid.
InvalidQueryThe query string is syntactically malformed.
InvalidValueThe successfully parsed query parameters are invalid.
NoSegmentOne of the supplied input coordinates could not snap to the street segment.
TooBigThe request size violates one of the service-specific request size restrictions.
DisabledDatasetThe request tried to access a disabled dataset.
  • message is an optional human-readable error message. All other status types are service-dependent.
  • In case of an error the HTTP status code will be 400. Otherwise, the HTTP status code will be 200 and code will be Ok.

Data version

Every response object has a data_version property containing a timestamp from the original OpenStreetMap file. This field is optional. It can be omitted if the data_version parameter was not set on the osrm-extract stage or the OSM file has not osmosis_replication_timestamp section.

Example response

json
{
+"code": "Ok",
+"message": "Everything worked",
+"data_version": "2017-11-17T21:43:02Z"
+}

Services

Nearest service

Snaps a coordinate to the street network and returns the nearest n matches.

GET
http://{server}/nearest/v1/{profile}/{coordinates}.json?number={number}

Where coordinates only supports a single {longitude},{latitude} entry.

In addition to the general options the following options are supported for this service:

OptionValuesDescription
numberinteger >= 1 (default 1)Number of nearest segments that should be returned.

As waypoints is a single thing returned by that service, using it with the option skip_waypoints set to true is quite useless, but still possible. In that case, only the code field will be returned.

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • waypoints array of Waypoint objects sorted by distance to the input coordinate. Each object has at least the following additional properties:
    • nodes: Array of OpenStreetMap node ids.

Example Requests

bash
# Querying nearest three snapped locations of `13.388860,52.517037` with a bearing between `20° - 340°`.
+curl 'http://router.project-osrm.org/nearest/v1/driving/13.388860,52.517037?number=3&bearings=0,20'

Example Response

JSON
{
+   "waypoints" : [
+      {
+         "nodes": [
+            2264199819,
+            0
+         ],
+         "hint" : "KSoKADRYroqUBAEAEAAAABkAAAAGAAAAAAAAABhnCQCLtwAA_0vMAKlYIQM8TMwArVghAwEAAQH1a66g",
+         "distance" : 4.152629,
+         "name" : "Friedrichstraße",
+         "location" : [
+            13.388799,
+            52.517033
+         ]
+      },
+      {
+         "nodes": [
+            2045820592,
+            0
+         ],
+         "hint" : "KSoKADRYroqUBAEABgAAAAAAAAAAAAAAKQAAABhnCQCLtwAA7kvMAAxZIQM8TMwArVghAwAAAQH1a66g",
+         "distance" : 11.811961,
+         "name" : "Friedrichstraße",
+         "location" : [
+            13.388782,
+            52.517132
+         ]
+      },
+      {
+         "nodes": [
+            0,
+            21487242
+         ],
+         "hint" : "KioKgDbbDgCUBAEAAAAAABoAAAAAAAAAPAAAABlnCQCLtwAA50vMADJZIQM8TMwArVghAwAAAQH1a66g",
+         "distance" : 15.872438,
+         "name" : "Friedrichstraße",
+         "location" : [
+            13.388775,
+            52.51717
+         ]
+      }
+   ],
+   "code" : "Ok"
+}

Route service

Finds the fastest route between coordinates in the supplied order.

GET
/route/v1/{profile}/{coordinates}?alternatives={true|false|number}&steps={true|false}&geometries={polyline|polyline6|geojson}&overview={full|simplified|false}&annotations={true|false}

In addition to the general options the following options are supported for this service:

OptionValuesDescription
alternativestrue, false (default), or NumberSearch for alternative routes. Passing a number alternatives=n searches for up to n alternative routes.*
stepstrue, false (default)Returned route steps for each route leg
annotationstrue, false (default), nodes, distance, duration, datasources, weight, speedReturns additional metadata for each coordinate along the route geometry.
geometriespolyline (default), polyline6, geojsonReturned route geometry format (influences overview and per step)
overviewsimplified (default), full, false, by_legsAdd overview geometry either full, simplified according to highest zoom level it could be displayed on, not at all, or split by leg.
continue_straightdefault (default), true, falseForces the route to keep going straight at waypoints constraining uturns there even if it would be faster. Default value depends on the profile.
waypoints{index};{index};{index}...Treats input coordinates indicated by given indices as waypoints in returned Match object. Default is to treat all input coordinates as waypoints.

* Please note that even if alternative routes are requested, a result cannot be guaranteed.

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • waypoints: Array of Waypoint objects representing all waypoints in order:
  • routes: An array of Route objects, ordered by descending recommendation rank.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoRouteNo route found.

All other properties might be undefined.

Example Request

bash
# Query on Berlin with three coordinates and no overview geometry returned:
+curl 'http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?overview=false'

Table service

Computes the duration of the fastest route between all pairs of supplied coordinates. Returns durations or distances or both between the coordinate pairs. Note that the distances are not the shortest distance between two coordinates, but rather the distances of the fastest routes. Durations are in seconds and distances are in meters.

GET
/table/v1/{profile}/{coordinates}?{sources}=[{elem}...];&{destinations}=[{elem}...]&annotations={duration|distance|duration,distance}

Options

In addition to the general options the following options are supported for this service:

OptionValuesDescription
sources{index};{index}[;{index} ...] or all (default)Use location with given index as source.
destinations{index};{index}[;{index} ...] or all (default)Use location with given index as destination.
annotationsduration (default), distance, or duration,distanceReturn the requested table or tables in response.
fallback_speeddouble > 0If no route found between a source/destination pair, calculate the as-the-crow-flies distance, then use this speed to estimate duration.
fallback_coordinateinput (default), or snappedWhen using a fallback_speed, use the user-supplied coordinate (input), or the snapped location (snapped) for calculating distances.
scale_factordouble > 0Use in conjunction with annotations=durations. Scales the table duration values by this number.

Unlike other array encoded options, the length of sources and destinations can be smaller or equal to number of input locations;

With skip_waypoints set to true, both sources and destinations arrays will be skipped.

Example:

sources=0;5;7&destinations=5;1;4;2;3;6
ElementValues
index0 <= integer < #locations

Example Request

bash
# Returns a 3x3 duration matrix:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219'
+
+# Returns a 1x3 duration matrix
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?sources=0'
+
+# Returns a asymmetric 3x2 duration matrix with from the polyline encoded locations `qikdcB}~dpXkkHz`:
+curl 'http://router.project-osrm.org/table/v1/driving/polyline(egs_Iq_aqAppHzbHulFzeMe`EuvKpnCglA)?sources=0;1;3&destinations=2;4'
+
+# Returns a 3x3 duration matrix:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?annotations=duration'
+
+# Returns a 3x3 distance matrix for CH:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?annotations=distance'
+
+# Returns a 3x3 duration matrix and a 3x3 distance matrix for CH:
+curl 'http://router.project-osrm.org/table/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?annotations=distance,duration'

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • durations array of arrays that stores the matrix in row-major order. durations[i][j] gives the travel time from the i-th source to the j-th destination. Values are given in seconds. Can be null if no route between i and j can be found.
  • distances array of arrays that stores the matrix in row-major order. distances[i][j] gives the travel distance from the i-th source to the j-th destination. Values are given in meters. Can be null if no route between i and j can be found.
  • sources array of Waypoint objects describing all sources in order
  • destinations array of Waypoint objects describing all destinations in order
  • fallback_speed_cells (optional) array of arrays containing i,j pairs indicating which cells contain estimated values based on fallback_speed. Will be absent if fallback_speed is not used.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoTableNo route found.
NotImplementedThis request is not supported

All other properties might be undefined.

Example Response

json
{
+  "sources": [
+    {
+      "location": [
+        13.3888,
+        52.517033
+      ],
+      "hint": "PAMAgEVJAoAUAAAAIAAAAAcAAAAAAAAArss0Qa7LNEHiVIRA4lSEQAoAAAAQAAAABAAAAAAAAADMAAAAAEzMAKlYIQM8TMwArVghAwEA3wps52D3",
+      "name": "Friedrichstraße"
+    },
+    {
+      "location": [
+        13.397631,
+        52.529432
+      ],
+      "hint": "WIQBgL6mAoAEAAAABgAAAAAAAAA7AAAAhU6PQHvHj0IAAAAAQbyYQgQAAAAGAAAAAAAAADsAAADMAAAAf27MABiJIQOCbswA_4ghAwAAXwVs52D3",
+      "name": "Torstraße"
+    },
+    {
+      "location": [
+        13.428554,
+        52.523239
+      ],
+      "hint": "7UcAgP___38fAAAAUQAAACYAAABTAAAAhSQKQrXq5kKRbiZCWJo_Qx8AAABRAAAAJgAAAFMAAADMAAAASufMAOdwIQNL58wA03AhAwMAvxBs52D3",
+      "name": "Platz der Vereinten Nationen"
+    }
+  ],
+  "durations": [
+    [
+      0,
+      192.6,
+      382.8
+    ],
+    [
+      199,
+      0,
+      283.9
+    ],
+    [
+      344.7,
+      222.3,
+      0
+    ]
+  ],
+  "destinations": [
+    {
+      "location": [
+        13.3888,
+        52.517033
+      ],
+      "hint": "PAMAgEVJAoAUAAAAIAAAAAcAAAAAAAAArss0Qa7LNEHiVIRA4lSEQAoAAAAQAAAABAAAAAAAAADMAAAAAEzMAKlYIQM8TMwArVghAwEA3wps52D3",
+      "name": "Friedrichstraße"
+    },
+    {
+      "location": [
+        13.397631,
+        52.529432
+      ],
+      "hint": "WIQBgL6mAoAEAAAABgAAAAAAAAA7AAAAhU6PQHvHj0IAAAAAQbyYQgQAAAAGAAAAAAAAADsAAADMAAAAf27MABiJIQOCbswA_4ghAwAAXwVs52D3",
+      "name": "Torstraße"
+    },
+    {
+      "location": [
+        13.428554,
+        52.523239
+      ],
+      "hint": "7UcAgP___38fAAAAUQAAACYAAABTAAAAhSQKQrXq5kKRbiZCWJo_Qx8AAABRAAAAJgAAAFMAAADMAAAASufMAOdwIQNL58wA03AhAwMAvxBs52D3",
+      "name": "Platz der Vereinten Nationen"
+    }
+  ],
+  "code": "Ok",
+  "distances": [
+    [
+      0,
+      1886.89,
+      3791.3
+    ],
+    [
+      1824,
+      0,
+      2838.09
+    ],
+    [
+      3275.36,
+      2361.73,
+      0
+    ]
+  ],
+  "fallback_speed_cells": [
+    [ 0, 1 ],
+    [ 1, 0 ]
+  ]
+}

Match service

Map matching matches/snaps given GPS points to the road network in the most plausible way. Please note the request might result in multiple sub-traces. Large jumps in the timestamps (> 60s) or improbable transitions lead to trace splits if a complete matching could not be found. The algorithm might not be able to match all points. Outliers are removed if they can not be matched successfully.

GET
/match/v1/{profile}/{coordinates}?steps={true|false}&geometries={polyline|polyline6|geojson}&overview={simplified|full|false}&annotations={true|false}

In addition to the general options the following options are supported for this service:

OptionValuesDescription
stepstrue, false (default)Returned route steps for each route
geometriespolyline (default), polyline6, geojsonReturned route geometry format (influences overview and per step)
annotationstrue, false (default), nodes, distance, duration, datasources, weight, speedReturns additional metadata for each coordinate along the route geometry.
overviewsimplified (default), full, false, by_legsAdd overview geometry either full, simplified according to highest zoom level it could be displayed on, not at all, or split by leg.
timestamps{timestamp};{timestamp}[;{timestamp} ...]Timestamps for the input locations in seconds since UNIX epoch. Timestamps need to be monotonically increasing.
radiuses{radius};{radius}[;{radius} ...]Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy.
gapssplit (default), ignoreAllows the input track splitting based on huge timestamp gaps between points.
tidytrue, false (default)Allows the input track modification to obtain better matching quality for noisy tracks.
waypoints{index};{index};{index}...Treats input coordinates indicated by given indices as waypoints in returned Match object. Default is to treat all input coordinates as waypoints.
ParameterValues
timestampinteger seconds since UNIX epoch
radiusdouble >= 0 (default 5m)

The radius for each point should be the standard error of the location measured in meters from the true location. Use Location.getAccuracy() on Android or CLLocation.horizontalAccuracy on iOS. This value is used to determine which points should be considered as candidates (larger radius means more candidates) and how likely each candidate is (larger radius means far-away candidates are penalized less). The area to search is chosen such that the correct candidate should be considered 99.9% of the time (for more details see this ticket).

Response

  • code if the request was successful Ok otherwise see the service dependent and general status codes.
  • tracepoints: Array of Waypoint objects representing all points of the trace in order. If the tracepoint was omitted by map matching because it is an outlier, the entry will be null. Each Waypoint object has the following additional properties:
    • matchings_index: Index to the Route object in matchings the sub-trace was matched to.
    • waypoint_index: Index of the waypoint inside the matched route.
    • alternatives_count: Number of probable alternative matchings for this tracepoint. A value of zero indicates that this point was matched unambiguously. Split the trace at these points for incremental map matching.
  • matchings: An array of Route objects that assemble the trace. Each Route object has the following additional properties:
    • confidence: Confidence of the matching. float value between 0 and 1. 1 is very confident that the matching is correct.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoMatchNo matchings found.

All other properties might be undefined.

Trip service

The trip plugin solves the Traveling Salesman Problem using a greedy heuristic (farthest-insertion algorithm) for 10 or more waypoints and uses brute force for less than 10 waypoints. The returned path does not have to be the fastest one. As TSP is NP-hard it only returns an approximation. Note that all input coordinates have to be connected for the trip service to work.

GET
/trip/v1/{profile}/{coordinates}?roundtrip={true|false}&source={any|first}&destination={any|last}&steps={true|false}&geometries={polyline|polyline6|geojson}&overview={simplified|full|false}&annotations={true|false}

In addition to the general options the following options are supported for this service:

OptionValuesDescription
roundtriptrue (default), falseReturned route is a roundtrip (route returns to first location)
sourceany (default), firstReturned route starts at any or first coordinate
destinationany (default), lastReturned route ends at any or last coordinate
stepstrue, false (default)Returned route instructions for each trip
annotationstrue, false (default), nodes, distance, duration, datasources, weight, speedReturns additional metadata for each coordinate along the route geometry.
geometriespolyline (default), polyline6, geojsonReturned route geometry format (influences overview and per step)
overviewsimplified (default), full, false, by_legsAdd overview geometry either full, simplified according to highest zoom level it could be displayed on, not at all, or split by leg.

Fixing Start and End Points

It is possible to explicitly set the start or end coordinate of the trip. When the source is set to first, the first coordinate is used as the start coordinate of the trip in the output. When the destination is set to last, the last coordinate will be used as the destination of the trip in the returned output. If you specify any, any of the coordinates can be used as the first or last coordinate in the output.

However, if source=any&destination=any the returned round-trip will still start at the first input coordinate by default.

Currently, not all combinations of roundtrip, source, and destination are supported. Right now, the following combinations are possible:

roundtripsourcedestinationsupported
truefirstlastyes
truefirstanyyes
trueanylastyes
trueanyanyyes
falsefirstlastyes
falsefirstanyyes
falseanylastyes
falseanyanyno

Example Requests

bash
# Round trip in Berlin with three stops:
+curl 'http://router.project-osrm.org/trip/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219'
bash
# Round trip in Berlin with four stops, starting at the first stop, ending at the last:
+curl 'http://router.project-osrm.org/trip/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219;13.418555,52.523215?source=first&destination=last'

Response

  • code: if the request was successful Ok otherwise see the service dependent and general status codes.
  • waypoints: Array of Waypoint objects representing all waypoints in input order. Each Waypoint object has the following additional properties:
    • trips_index: Index to trips of the sub-trip the point was matched to.
    • waypoint_index: Index of the point in the trip.
  • trips: An array of Route objects that assemble the trace.

In case of error the following codes are supported in addition to the general ones:

TypeDescription
NoTripsNo trips found because input coordinates are not connected.
NotImplementedThis request is not supported

All other properties might be undefined.

Tile service

This service generates Mapbox Vector Tiles that can be viewed with a vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can be used to examine the routing graph. The tiles are generated directly from the data in-memory, so are in sync with actual routing results, and let you examine which roads are actually routable, and what weights they have applied.

GET
/tile/v1/{profile}/tile({x},{y},{zoom}).mvt

The x, y, and zoom values are the same as described at https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames, and are supported by vector tile viewers like Mapbox GL JS.

Example request

bash
# This fetches a Z=13 tile for downtown San Francisco:
+curl 'http://router.project-osrm.org/tile/v1/car/tile(1310,3166,13).mvt'

Example response

example rendered tilehttp://map.project-osrm.org/debug/#14.33/52.5212/13.3919

The response object is either a binary encoded blob with a Content-Type of application/x-protobuf, or a 404 error. Note that OSRM is hard-coded to only return tiles from zoom level 12 and higher (to avoid accidentally returning extremely large vector tiles).

Vector tiles contain two layers:

speeds layer:

PropertyTypeDescription
speedintegerthe speed on that road segment, in km/h
is_smallbooleanwhether this segment belongs to a small (< 1000 node) strongly connected component
datasourcestringthe source for the speed value (normally lua profile unless you're using the traffic update feature, in which case it contains the stem of the filename that supplied the speed value for this segment
durationfloathow long this segment takes to traverse, in seconds. This value is to calculate the total route ETA.
weight integerhow long this segment takes to traverse, in units (may differ from duration when artificial biasing is applied in the Lua profiles). ACTUAL ROUTING USES THIS VALUE.
namestringthe name of the road this segment belongs to
ratefloatthe value of length/weight - analogous to speed, but using the weight value rather than duration, rounded to the nearest integer
is_startpointbooleanwhether this segment can be used as a start/endpoint for routes

turns layer:

PropertyTypeDescription
bearing_inintegerthe absolute bearing that approaches the intersection. -180 to +180, 0 = North, 90 = East
turn_angleintegerthe angle of the turn, relative to the bearing_in. -180 to +180, 0 = straight ahead, 90 = 90-degrees to the right
costfloatthe time we think it takes to make that turn, in seconds. May be negative, depending on how the data model is constructed (some turns get a "bonus").
weightfloatthe weight we think it takes to make that turn. May be negative, depending on how the data model is constructed (some turns get a "bonus"). ACTUAL ROUTING USES THIS VALUE
typestringthe type of this turn - values like turn, continue, etc. See the StepManeuver for a partial list, this field also exposes internal turn types that are never returned with an API response
modifierstringthe direction modifier of the turn (left, sharp left, etc)

Result objects

Route object

Represents a route through (potentially multiple) waypoints.

Properties

  • distance: The distance traveled by the route, in float meters.
  • duration: The estimated travel time, in float number of seconds.
  • geometry: The whole geometry of the route value depending on overview parameter, format depending on the geometries parameter. See RouteStep's geometry property for the parameter documentation.
  • weight: The calculated weight of the route.
  • weight_name: The name of the weight profile used during the extraction phase.
overviewDescription
simplifiedGeometry is simplified according to the highest zoom level it can still be displayed in full.
fullGeometry is not simplified.
falseGeometry is not added.
  • legs: The legs between the given waypoints, an array of RouteLeg objects.

Example

Three input coordinates, geometry=geojson, steps=false:

json
{
+  "distance": 90.0,
+  "duration": 300.0,
+  "weight": 300.0,
+  "weight_name": "duration",
+  "geometry": {"type": "LineString", "coordinates": [[120.0, 10.0], [120.1, 10.0], [120.2, 10.0], [120.3, 10.0]]},
+  "legs": [
+    {
+      "distance": 30.0,
+      "duration": 100.0,
+      "steps": []
+    },
+    {
+      "distance": 60.0,
+      "duration": 200.0,
+      "steps": []
+    }
+  ]
+}

RouteLeg object

Represents a route between two waypoints.

Properties

  • distance: The distance traveled by this route leg, in float meters.
  • duration: The estimated travel time, in float number of seconds.
  • weight: The calculated weight of the route leg.
  • summary: Summary of the route taken as string. Depends on the steps parameter:
steps
trueNames of the two major roads used. Can be empty if the route is too short.
falseempty string
  • steps: Depends on the steps parameter.
steps
truearray of RouteStep objects describing the turn-by-turn instructions
falseempty array
  • annotation: Additional details about each coordinate along with the route geometry:
annotations
trueAn Annotation object containing node ids, durations, distances, and weights.
falseundefined

Example

With steps=false and annotations=true:

json
{
+  "distance": 30.0,
+  "duration": 100.0,
+  "weight": 100.0,
+  "steps": [],
+  "annotation": {
+    "distance": [5,5,10,5,5],
+    "duration": [15,15,40,15,15],
+    "datasources": [1,0,0,0,1],
+    "metadata": { "datasource_names": ["traffic","lua profile","lua profile","lua profile","traffic"] },
+    "nodes": [49772551,49772552,49786799,49786800,49786801,49786802],
+    "speed": [0.3, 0.3, 0.3, 0.3, 0.3]
+  }
+}

Annotation object

Annotation of the whole route leg with fine-grained information about each segment or node id.

Properties

  • distance: The distance, in meters, between each pair of coordinates
  • duration: The duration between each pair of coordinates, in seconds. Does not include the duration of any turns.
  • datasources: The index of the data source for the speed between each pair of coordinates. 0 is the default profile, other values are supplied via --segment-speed-file to osrm-contract or osrm-customize. String-like names are in the metadata.datasource_names array.
  • nodes: The OSM node ID for each coordinate along the route, excluding the first/last user-supplied coordinates
  • weight: The weights between each pair of coordinates. Does not include any turn costs.
  • speed: Convenience field, calculation of distance / duration rounded to one decimal place
  • metadata: Metadata related to other annotations
    • datasource_names: The names of the data sources used for the speed between each pair of coordinates. lua profile is the default profile, other values are the filenames supplied via --segment-speed-file to osrm-contract or osrm-customize

Example

json
{
+  "distance": [5,5,10,5,5],
+  "duration": [15,15,40,15,15],
+  "datasources": [1,0,0,0,1],
+  "metadata": { "datasource_names": ["traffic","lua profile","lua profile","lua profile","traffic"] },
+  "nodes": [49772551,49772552,49786799,49786800,49786801,49786802],
+  "weight": [15,15,40,15,15]
+}

RouteStep object

A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a single way to the subsequent step.

Properties

  • distance: The distance of travel from the maneuver to the subsequent step, in float meters.
  • duration: The estimated travel time, in float number of seconds.
  • geometry: The unsimplified geometry of the route segment, depending on the geometries parameter.
  • weight: The calculated weight of the step.
geometry
polylinepolyline with precision 5 in [latitude,longitude] encoding
polyline6polyline with precision 6 in [latitude,longitude] encoding
geojsonGeoJSON LineString
  • name: The name of the way along which travel proceeds.
  • ref: A reference number or code for the way. Optionally included, if ref data is available for the given way.
  • pronunciation: A string containing an IPA phonetic transcription indicating how to pronounce the name in the name property. This property is omitted if pronunciation data is unavailable for the step.
  • destinations: The destinations of the way. Will be undefined if there are no destinations.
  • exits: The exit numbers or names of the way. Will be undefined if there are no exit numbers or names.
  • mode: A string signifying the mode of transportation.
  • maneuver: A StepManeuver object representing the maneuver.
  • intersections: A list of Intersection objects that are passed along the segment, the very first belonging to the StepManeuver
  • rotary_name: The name for the rotary. Optionally included, if the step is a rotary and a rotary name is available.
  • rotary_pronunciation: The pronunciation hint of the rotary name. Optionally included, if the step is a rotary and a rotary pronunciation is available.
  • driving_side: The legal driving side at the location for this step. Either left or right.

Example

json
{
+   "geometry" : "{lu_IypwpAVrAvAdI",
+   "mode" : "driving",
+   "duration" : 15.6,
+   "weight" : 15.6,
+   "intersections" : [
+      {  "bearings" : [ 10, 92, 184, 270 ],
+         "lanes" : [
+            { "indications" : [ "left", "straight" ],
+               "valid" : false },
+            { "valid" : true,
+               "indications" : [ "right" ] }
+         ],
+         "out" : 2,
+         "in" : 3,
+         "entry" : [ "true", "true", "true", "false" ],
+         "location" : [ 13.39677, 52.54366 ]
+      },
+      {  "out" : 1,
+         "lanes" : [
+            { "indications" : [ "straight" ],
+               "valid" : true },
+            { "indications" : [ "right" ],
+               "valid" : false }
+         ],
+         "bearings" : [ 60, 240, 330 ],
+         "in" : 0,
+         "entry" : [ "false", "true", "true" ],
+         "location" : [ 13.394718, 52.543096 ]
+      }
+   ],
+   "name" : "Lortzingstraße",
+   "distance" : 152.3,
+   "maneuver" : {
+      "modifier" : "right",
+      "type" : "turn"
+   }
+}

StepManeuver object

Properties

  • location: A [longitude, latitude] pair describing the location of the turn.
  • bearing_before: The clockwise angle from true north to the direction of travel immediately before the maneuver. Range 0-359.
  • bearing_after: The clockwise angle from true north to the direction of travel immediately after the maneuver. Range 0-359.
  • type A string indicating the type of maneuver. new identifiers might be introduced without API change Types unknown to the client should be handled like the turn type, the existence of correct modifier values is guaranteed.
typeDescription
turna basic turn into the direction of the modifier
new nameno turn is taken/possible, but the road name changes. The road can take a turn itself, following modifier.
departindicates the departure of the leg
arriveindicates the destination of the leg
mergemerge onto a street (e.g. getting on the highway from a ramp, the modifier specifies the direction of the merge)
rampDeprecated. Replaced by on_ramp and off_ramp.
on ramptake a ramp to enter a highway (direction given my modifier)
off ramptake a ramp to exit a highway (direction given my modifier)
forktake the left/right side at a fork depending on modifier
end of roadroad ends in a T intersection turn in direction of modifier
use laneDeprecated replaced by lanes on all intersection entries
continueTurn in direction of modifier to stay on the same road
roundabouttraverse roundabout, if the route leaves the roundabout there will be an additional property exit for exit counting. The modifier specifies the direction of entering the roundabout.
rotarya traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer rotary_name and/or rotary_pronunciation parameters (located in the RouteStep object) in addition to the exit parameter (located on the StepManeuver object).
roundabout turnDescribes a turn at a small roundabout that should be treated as a normal turn. The modifier indicates the turn direction. Example instruction: At the roundabout turn left.
notificationnot an actual turn but a change in the driving conditions. For example the travel mode or classes. If the road takes a turn itself, the modifier describes the direction
exit roundaboutDescribes a maneuver exiting a roundabout (usually preceded by a roundabout instruction)
exit rotaryDescribes the maneuver exiting a rotary (large named roundabout)

Please note that even though there are new name and notification instructions, the mode and name can change between all instructions. They only offer a fallback in case nothing else is to report.

  • modifier An optional string indicating the direction change of the maneuver.
modifierDescription
uturnindicates the reversal of direction
sharp righta sharp right turn
righta normal turn to the right
slight righta slight turn to the right
straightno relevant change in direction
slight lefta slight turn to the left
lefta normal turn to the left
sharp lefta sharp turn to the left

The list of turns without a modifier is limited to: depart/arrive. If the source/target location is close enough to the depart/arrive location, no modifier will be given.

The meaning depends on the type property.

typeDescription
turnmodifier indicates the change in direction accomplished through the turn
depart/arrivemodifier indicates the position of departure point and arrival point in relation to the current direction of travel
  • exit An optional integer indicating the number of the exit to take. The property exists for the roundabout / rotary property: Number of the roundabout exit to take. If an exit is undefined the destination is on the roundabout.

New properties (potentially depending on type) may be introduced in the future without an API version change.

Lane object

A Lane represents a turn lane at the corresponding turn location.

Properties

  • indications: an indication (e.g. marking on the road) specifying the turn lane. A road can have multiple indications (e.g. an arrow pointing straight and left). The indications are given in an array, each containing one of the following types. Further indications might be added on without an API version change.
valueDescription
noneNo dedicated indication is shown.
uturnAn indication signaling the possibility to reverse (i.e. fully bend arrow).
sharp rightAn indication indicating a sharp right turn (i.e. strongly bend arrow).
rightAn indication indicating a right turn (i.e. bend arrow).
slight rightAn indication indicating a slight right turn (i.e. slightly bend arrow).
straightNo dedicated indication is shown (i.e. straight arrow).
slight leftAn indication indicating a slight left turn (i.e. slightly bend arrow).
leftAn indication indicating a left turn (i.e. bend arrow).
sharp leftAn indication indicating a sharp left turn (i.e. strongly bend arrow).
  • valid: a boolean flag indicating whether the lane is a valid choice in the current maneuver

Example

json
{
+    "indications": ["left", "straight"],
+    "valid": false
+}

Intersection object

An intersection gives a full representation of any cross-way the path passes by. For every step, the very first intersection (intersections[0]) corresponds to the location of the StepManeuver. Further intersections are listed for every cross-way until the next turn instruction.

Properties

  • location: A [longitude, latitude] pair describing the location of the turn.
  • bearings: A list of bearing values (e.g. [0,90,180,270]) that are available at the intersection. The bearings describe all available roads at the intersection. Values are between 0-359 (0=true north)
  • classes: An array of strings signifying the classes (as specified in the profile) of the road exiting the intersection.
  • entry: A list of entry flags, corresponding in a 1:1 relationship to the bearings. A value of true indicates that the respective road could be entered on a valid route. false indicates that the turn onto the respective road would violate a restriction.
  • in: index into bearings/entry array. Used to calculate the bearing just before the turn. Namely, the clockwise angle from true north to the direction of travel immediately before the maneuver/passing the intersection. Bearings are given relative to the intersection. To get the bearing in the direction of driving, the bearing has to be rotated by a value of 180. The value is not supplied for depart maneuvers.
  • out: index into the bearings/entry array. Used to extract the bearing just after the turn. Namely, The clockwise angle from true north to the direction of travel immediately after the maneuver/passing the intersection. The value is not supplied for arrive maneuvers.
  • lanes: Array of Lane objects that denote the available turn lanes at the intersection. If no lane information is available for an intersection, the lanes property will not be present.

Example

json
{
+    "location":[13.394718,52.543096],
+    "in":0,
+    "out":2,
+    "bearings":[60,150,240,330],
+    "entry":["false","true","true","true"],
+    "classes": ["toll", "restricted"],
+    "lanes":{
+        "indications": ["left", "straight"],
+        "valid": false
+    }
+}

Waypoint object

The object is used to describe the waypoint on a route.

Properties

  • name Name of the street the coordinate snapped to
  • location Array that contains the [longitude, latitude] pair of the snapped coordinate
  • distance The distance, in meters, from the input coordinate to the snapped coordinate
  • hint Unique internal identifier of the segment (ephemeral, not constant over data updates) This can be used on subsequent requests to significantly speed up the query and to connect multiple services. E.g. you can use the hint value obtained by the nearest query as hint values for route inputs.

Example

json
{
+   "hint" : "KSoKADRYroqUBAEAEAAAABkAAAAGAAAAAAAAABhnCQCLtwAA_0vMAKlYIQM8TMwArVghAwEAAQH1a66g",
+   "distance" : 4.152629,
+   "name" : "Friedrichstraße",
+   "location" : [
+      13.388799,
+      52.517033
+   ]
+}

Flatbuffers format

The default response format is json, but OSRM supports binary flatbuffers format, which is much faster in serialization/deserialization, comparing to json.

The format itself is described in message descriptors, located at include/engine/api/flatbuffers directory. Those descriptors could be compiled to provide protocol parsers in Go/Javascript/Typescript/Java/Dart/C#/Python/Lobster/Lua/Rust/PHP/Kotlin. Precompiled protocol parser for C++ is supplied with OSRM.

Flatbuffers format provides exactly the same data, as json format with a slightly different layout, which was optimized to minimize in-transfer size.

Root object

Root object is the only object, available from a 'raw' flatbuffers buffer. It can be constructed with a following call:

     auto osrm = osrm::engine::api::fbresult::GetFBResult(some_input_buffer);
+

Properties

  • error: bool Marks response as erroneous. An erroneous response should include the code fieldset, all the other fields may not be present.
  • code: Error Error description object, only present, when error is true
  • waypoints: [Waypoint] Array of Waypoint objects. Should present for every service call, unless skip_waypoints is set to true. Table service will put sources array here.
  • routes: [RouteObject] Array of RouteObject objects. May be empty or absent. Should present for Route/Trip/Match services call.
  • table: Table Table object, may absent. Should be present in case of Table service call.

Error object

Contains error information.

Properties

  • code: string Error code
  • message: string Detailed error message

Waypoint object

Almost the same as json Waypoint object. The following properties differ:

  • location: Position Same as json location field, but different format.
  • nodes: Uint64Pair Same as json nodes field, but different format.

RouteObject object

Almost the same as json Route object. The following properties differ:

  • polyline: string Same as json geometry.polyline or geometry.polyline6 fields. One field for both formats.
  • coordinates: [Position] Same as json geometry.coordinates field, but different format.
  • legs: [Leg] Array of Leg objects.

Leg object

Almost the same as json Leg object. The following properties differ:

  • annotations: Annotation Same as json annotation field, but different format.
  • steps: [Step] Same as step annotation field, but different format.

Step object

Almost the same as json Step object. The following properties differ:

  • polyline: string Same as json geometry.polyline or geometry.polyline6 fields. One field for both formats.
  • coordinates: [Position] Same as json geometry.coordinates field, but different format.
  • maneuver: StepManeuver Same as json maneuver field, but different format.
typeDescription
Turna basic turn into the direction of the modifier
NewNameno turn is taken/possible, but the road name changes. The road can take a turn itself, following modifier.
Departindicates the departure of the leg
Arriveindicates the destination of the leg
Mergemerge onto a street (e.g. getting on the highway from a ramp, the modifier specifies the direction of the merge)
OnRamptake a ramp to enter a highway (direction given my modifier)
OffRamptake a ramp to exit a highway (direction given my modifier)
Forktake the left/right side at a fork depending on modifier
EndOfRoadroad ends in a T intersection turn in direction of modifier
ContinueTurn in direction of modifier to stay on the same road
Roundabouttraverse roundabout, if the route leaves the roundabout there will be an additional property exit for exit counting. The modifier specifies the direction of entering the roundabout.
Rotarya traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer rotary_name and/or rotary_pronunciation parameters (located in the RouteStep object) in addition to the exit parameter (located on the StepManeuver object).
RoundaboutTurnDescribes a turn at a small roundabout that should be treated as a normal turn. The modifier indicates the turn direction. Example instruction: At the roundabout turn left.
Notificationnot an actual turn but a change in the driving conditions. For example the travel mode or classes. If the road takes a turn itself, the modifier describes the direction
ExitRoundaboutDescribes a maneuver exiting a roundabout (usually preceded by a roundabout instruction)
ExitRotaryDescribes the maneuver exiting a rotary (large named roundabout)
  • driving_side: bool True stands for left side driving.
  • intersections: [Intersection] Same as json intersections field, but different format.

Intersection object

Almost the same as json Intersection object. The following properties differ:

  • location: Position Same as json location property, but in a different format.
  • lanes: [Lane] Array of Lane objects.

Lane object

Almost the same as json Lane object. The following properties differ:

  • indications: Turn Array of Turn enum values.
valueDescription
NoneNo dedicated indication is shown.
UTurnAn indication signaling the possibility to reverse (i.e. fully bend arrow).
SharpRightAn indication indicating a sharp right turn (i.e. strongly bend arrow).
RightAn indication indicating a right turn (i.e. bend arrow).
SlightRightAn indication indicating a slight right turn (i.e. slightly bend arrow).
StraightNo dedicated indication is shown (i.e. straight arrow).
SlightLeftAn indication indicating a slight left turn (i.e. slightly bend arrow).
LeftAn indication indicating a left turn (i.e. bend arrow).
SharpLeftAn indication indicating a sharp left turn (i.e. strongly bend arrow).

StepManeuver object

Almost the same as json StepManeuver object. The following properties differ:

  • location: Position Same as json location property, but in a different format.
  • type: ManeuverType Type of a maneuver (enum)
typeDescription
Turna basic turn into the direction of the modifier
NewNameno turn is taken/possible, but the road name changes. The road can take a turn itself, following modifier.
Departindicates the departure of the leg
Arriveindicates the destination of the leg
Mergemerge onto a street (e.g. getting on the highway from a ramp, the modifier specifies the direction of the merge)
OnRamptake a ramp to enter a highway (direction given my modifier)
OffRamptake a ramp to exit a highway (direction given my modifier)
Forktake the left/right side at a fork depending on modifier
EndOfRoadroad ends in a T intersection turn in direction of modifier
ContinueTurn in direction of modifier to stay on the same road
Roundabouttraverse roundabout, if the route leaves the roundabout there will be an additional property exit for exit counting. The modifier specifies the direction of entering the roundabout.
Rotarya traffic circle. While very similar to a larger version of a roundabout, it does not necessarily follow roundabout rules for right of way. It can offer rotary_name and/or rotary_pronunciation parameters (located in the RouteStep object) in addition to the exit parameter (located on the StepManeuver object).
RoundaboutTurnDescribes a turn at a small roundabout that should be treated as a normal turn. The modifier indicates the turn direction. Example instruction: At the roundabout turn left.
Notificationnot an actual turn but a change in the driving conditions. For example the travel mode or classes. If the road takes a turn itself, the modifier describes the direction
ExitRoundaboutDescribes a maneuver exiting a roundabout (usually preceded by a roundabout instruction)
ExitRotaryDescribes the maneuver exiting a rotary (large named roundabout)
  • modifier: Turn Maneuver turn (enum)

Annotation object

Exactly the same as json annotation object.

Position object

A point on Earth.

Properties

  • longitude: float Point's longitude
  • latitude: float Point's latitude

Uint64Pair

A pair of long long integers. Used only by Waypoint object.

Properties

  • first: uint64 First pair value.
  • second: uint64 Second pair value.

Table object

Almost the same as json Table object. The main difference is that 'sources' field is absent and the root's object 'waypoints' field is used instead. All the other differences follow:

  • durations: [float] Flat representation of a durations matrix. Element at row;col can be addressed as [row * cols + col]
  • distances: [float] Flat representation of a destinations matrix. Element at row;col can be addressed as [row * cols + col]
  • destinations: [Waypoint] Array of Waypoint objects. Will be null if skip_waypoints will be set to true
  • rows: ushort Number of rows in durations/destinations matrices.
  • cols: ushort Number of cols in durations/destinations matrices.
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/index.html b/docs/v26.5.0/index.html new file mode 100644 index 0000000..3f655e4 --- /dev/null +++ b/docs/v26.5.0/index.html @@ -0,0 +1,25 @@ + + + + + + OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

OSRMAPI Documentation

The Open Source Routing Machine - High performance routing engine for OpenStreetMap data

Getting Started

OSRM provides powerful routing services through both HTTP and Node.js APIs:

Documentation

Resources

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/jsdoc-extract.js b/docs/v26.5.0/jsdoc-extract.js new file mode 100644 index 0000000..6d40141 --- /dev/null +++ b/docs/v26.5.0/jsdoc-extract.js @@ -0,0 +1,403 @@ +/** + * The `OSRM` method is the main constructor for creating an OSRM instance. + * An OSRM instance requires a `.osrm.*` dataset(`.osrm.*` because it contains several files), which is prepared by the OSRM toolchain. + * You can create such a `.osrm.*` dataset by running the OSRM binaries we ship in `node_modules/osrm/lib/binding_napi_v8/` and default + * profiles (e.g. for setting speeds and determining road types to route on) in `node_modules/osrm/profiles/`: + * + * node_modules/osrm/lib/binding_napi_v8/osrm-extract data.osm.pbf -p node_modules/osrm/profiles/car.lua + * node_modules/osrm/lib/binding_napi_v8/osrm-contract data.osrm + * + * Consult the [osrm-backend](https://github.com/Project-OSRM/osrm-backend) documentation for further details. + * + * Once you have a complete `network.osrm.*` dataset, you can calculate routes in javascript with this object. + * + * ```javascript + * var osrm = new OSRM('network.osrm'); + * ``` + * + * @param {Object|String} [options={shared_memory: true}] Options for creating an OSRM object or string to the `.osrm` file. + * @param {String} [options.algorithm] The algorithm to use for routing. Can be 'CH', or 'MLD'. Default is 'CH'. + * Make sure you prepared the dataset with the correct toolchain. + * @param {Boolean} [options.shared_memory] Connects to the persistent shared memory datastore. + * This requires you to run `osrm-datastore` prior to creating an `OSRM` object. + * @param {String} [options.dataset_name] Connects to the persistent shared memory datastore defined by `--dataset_name` option when running `osrm-datastore`. + * This requires you to run `osrm-datastore --dataset_name` prior to creating an `OSRM` object. + * @param {String} [options.memory_file] **DEPRECATED** + * Old behaviour: Path to a file on disk to store the memory using mmap. Current behaviour: setting this value is the same as setting `mmap_memory: true`. + * @param {Boolean} [options.mmap_memory] Map on-disk files to virtual memory addresses (mmap), rather than loading into RAM. + * @param {String} [options.path] The path to the `.osrm` files. This is mutually exclusive with setting {options.shared_memory} to true. + * @param {Array} [options.disable_feature_dataset] Disables a feature dataset from being loaded into memory if not needed. Options: `ROUTE_STEPS`, `ROUTE_GEOMETRY`. + * @param {Number} [options.max_locations_trip] Max. locations supported in trip query (default: unlimited). + * @param {Number} [options.max_locations_viaroute] Max. locations supported in viaroute query (default: unlimited). + * @param {Number} [options.max_locations_distance_table] Max. locations supported in distance table query (default: unlimited). + * @param {Number} [options.max_locations_map_matching] Max. locations supported in map-matching query (default: unlimited). + * @param {Number} [options.max_radius_map_matching] Max. radius size supported in map matching query (default: 5). + * @param {Number} [options.max_results_nearest] Max. results supported in nearest query (default: unlimited). + * @param {Number} [options.max_alternatives] Max. number of alternatives supported in alternative routes query (default: 3). + * @param {Number} [options.default_radius] Default radius for queries (default: unlimited). + * + * @class OSRM + * + */ + +/** + * Returns the fastest route between two or more coordinates while visiting the waypoints in order. + * + * @name route + * @memberof OSRM + * @param {Object} options Object literal containing parameters for the route query. + * @param {Array} [options.coordinates] The coordinates this request will use, coordinates as `[{lon},{lat}]` values, in decimal degrees. + * @param {Array} [options.bearings] Limits the search to segments with given bearing in degrees towards true north in clockwise direction. + * Can be `null` or an array of `[{value},{range}]` with `integer 0 .. 360,integer 0 .. 180`. + * @param {Array} [options.radiuses] Limits the coordinate snapping to streets in the given radius in meters. Can be `null` (unlimited, default) or `double >= 0`. + * @param {Array} [options.hints] Hints for the coordinate snapping. Array of base64 encoded strings. + * @param {Array} [options.exclude] List of classes to avoid, order does not matter. + * @param {Boolean} [options.generate_hints=true] Whether or not adds a Hint to the response which can be used in subsequent requests. + * @param {Boolean} [options.alternatives=false] Search for alternative routes. + * @param {Number} [options.alternatives=0] Search for up to this many alternative routes. + * *Please note that even if alternative routes are requested, a result cannot be guaranteed.* + * @param {Boolean} [options.steps=false] Return route steps for each route leg. + * @param {Array|Boolean} [options.annotations=false] An array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed` or boolean for enabling/disabling all. + * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview and per step). Can also be `geojson`. + * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` according to highest zoom level it could be displayed on, or not at all (`false`). If you want the overview for each leg, you can use `by_legs`. + * @param {Boolean} [options.continue_straight] Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile. + * @param {Array} [options.approaches] Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be `null` (unrestricted, default), `curb` or `opposite`. + * `null`/`true`/`false` + * @param {Array} [options.waypoints] Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index. + * @param {String} [options.format] Which output format to use, either `json`, or [`flatbuffers`](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api/flatbuffers). + * @param {String} [options.snapping] Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. + * @param {Boolean} [options.skip_waypoints=false] Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of response and do not want to transfer waste data. + * @param {Function} callback + * + * @returns {Object} An array of [Waypoint](#waypoint) objects representing all waypoints in order AND an array of [`Route`](#route) objects ordered by descending recommendation rank. + * + * @example + * var osrm = new OSRM("berlin-latest.osrm"); + * osrm.route({coordinates: [[52.519930,13.438640], [52.513191,13.415852]]}, function(err, result) { + * if(err) throw err; + * console.log(result.waypoints); // array of Waypoint objects representing all waypoints in order + * console.log(result.routes); // array of Route objects ordered by descending recommendation rank + * }); + */ + +/** + * Snaps a coordinate to the street network and returns the nearest n matches. + * + * Note: `coordinates` in the general options only supports a single `{longitude},{latitude}` entry. + * + * @name nearest + * @memberof OSRM + * @param {Object} options - Object literal containing parameters for the nearest query. + * @param {Array} [options.coordinates] The coordinates this request will use, coordinates as `[{lon},{lat}]` values, in decimal degrees. + * @param {Array} [options.bearings] Limits the search to segments with given bearing in degrees towards true north in clockwise direction. + * Can be `null` or an array of `[{value},{range}]` with `integer 0 .. 360,integer 0 .. 180`. + * @param {Array} [options.radiuses] Limits the coordinate snapping to streets in the given radius in meters. Can be `null` (unlimited, default) or `double >= 0`. + * @param {Array} [options.hints] Hints for the coordinate snapping. Array of base64 encoded strings. + * @param {Boolean} [options.generate_hints=true] Whether or not adds a Hint to the response which can be used in subsequent requests. + * @param {Number} [options.number=1] Number of nearest segments that should be returned. + * Must be an integer greater than or equal to `1`. + * @param {Array} [options.approaches] Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be `null` (unrestricted, default), `curb` or `opposite`. + * @param {String} [options.format] Which output format to use, either `json`, or [`flatbuffers`](https://github.com/Project-OSRM/osrm-backend/tree/master/include/engine/api/flatbuffers). + * @param {String} [options.snapping] Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. + * @param {Function} callback + * + * @returns {Object} containing `waypoints`. + * **`waypoints`**: array of [`Ẁaypoint`](#waypoint) objects sorted by distance to the input coordinate. + * Each object has an additional `distance` property, which is the distance in meters to the supplied input coordinate. + * + * @example + * var osrm = new OSRM('network.osrm'); + * var options = { + * coordinates: [[13.388860,52.517037]], + * number: 3, + * bearings: [[0,20]] + * }; + * osrm.nearest(options, function(err, response) { + * console.log(response.waypoints); // array of Waypoint objects + * }); + */ + +/** + * Computes duration table for the given locations. Allows for both symmetric and asymmetric tables. + * Optionally returns distance table. + * + * @name table + * @memberof OSRM + * @param {Object} options - Object literal containing parameters for the table query. + * @param {Array} [options.coordinates] The coordinates this request will use, coordinates as `[{lon},{lat}]` values, in decimal degrees. + * @param {Array} [options.bearings] Limits the search to segments with given bearing in degrees towards true north in clockwise direction. + * Can be `null` or an array of `[{value},{range}]` with `integer 0 .. 360,integer 0 .. 180`. + * @param {Array} [options.radiuses] Limits the coordinate snapping to streets in the given radius in meters. Can be `null` (unlimited, default) or `double >= 0`. + * @param {Array} [options.hints] Hints for the coordinate snapping. Array of base64 encoded strings. + * @param {Boolean} [options.generate_hints=true] Whether or not adds a Hint to the response which can be used in subsequent requests. + * @param {Array} [options.sources] An array of `index` elements (`0 <= integer < #coordinates`) to use + * location with given index as source. Default is to use all. + * @param {Array} [options.destinations] An array of `index` elements (`0 <= integer < #coordinates`) to use location with given index as destination. Default is to use all. + * @param {Array} [options.approaches] Restrict the direction on the road network at a waypoint, relative to the input coordinate.. Can be `null` (unrestricted, default), `curb` or `opposite`. + * @param {Number} [options.fallback_speed] Replace `null` responses in result with as-the-crow-flies estimates based on `fallback_speed`. Value is in metres/second. + * @param {String} [options.fallback_coordinate] Either `input` (default) or `snapped`. If using a `fallback_speed`, use either the user-supplied coordinate (`input`), or the snapped coordinate (`snapped`) for calculating the as-the-crow-flies distance between two points. + * @param {Number} [options.scale_factor] Multiply the table duration values in the table by this number for more controlled input into a route optimization solver. + * @param {String} [options.snapping] Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. + * @param {Array} [options.annotations] Return the requested table or tables in response. Can be `['duration']` (return the duration matrix, default), `[distance']` (return the distance matrix), or `['duration', distance']` (return both the duration matrix and the distance matrix). + * @param {Function} callback + * + * @returns {Object} containing `durations`, `distances`, `sources`, and `destinations`. + * **`durations`**: array of arrays that stores the matrix in row-major order. `durations[i][j]` gives the travel time from the i-th waypoint to the j-th waypoint. + * Values are given in seconds. + * **`distances`**: array of arrays that stores the matrix in row-major order. `distances[i][j]` gives the travel time from the i-th waypoint to the j-th waypoint. + * Values are given in meters. + * **`sources`**: array of [`Ẁaypoint`](#waypoint) objects describing all sources in order. + * **`destinations`**: array of [`Ẁaypoint`](#waypoint) objects describing all destinations in order. + * **`fallback_speed_cells`**: (optional) if `fallback_speed` is used, will be an array of arrays of `row,column` values, indicating which cells contain estimated values. + * + * @example + * var osrm = new OSRM('network.osrm'); + * var options = { + * coordinates: [ + * [13.388860,52.517037], + * [13.397634,52.529407], + * [13.428555,52.523219] + * ] + * }; + * osrm.table(options, function(err, response) { + * console.log(response.durations); // array of arrays, matrix in row-major order + * console.log(response.distances); // array of arrays, matrix in row-major order + * console.log(response.sources); // array of Waypoint objects + * console.log(response.destinations); // array of Waypoint objects + * }); + */ + +/** + * This generates [Mapbox Vector Tiles](https://mapbox.com/vector-tiles) that can be viewed with a + * vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can + * be used to examine the routing graph. The tiles are generated directly from the data in-memory, + * so are in sync with actual routing results, and let you examine which roads are actually + * routable, + * and what weights they have applied. + * + * @name tile + * @memberof OSRM + * @param {Array} ZXY - an array consisting of `x`, `y`, and `z` values representing tile coordinates like + * [wiki.openstreetmap.org/wiki/Slippy_map_tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) + * and are supported by vector tile viewers like [Mapbox GL JS](https://www.mapbox.com/mapbox-gl-js/api/). + * @param {Function} callback + * + * @returns {Buffer} contains a Protocol Buffer encoded vector tile. + * + * @example + * var osrm = new OSRM('network.osrm'); + * osrm.tile([0, 0, 0], function(err, response) { + * if (err) throw err; + * fs.writeFileSync('./tile.vector.pbf', response); // write the buffer to a file + * }); + */ + +/** + * Map matching matches given GPS points to the road network in the most plausible way. + * Please note the request might result multiple sub-traces. Large jumps in the timestamps + * (>60s) or improbable transitions lead to trace splits if a complete matching could + * not be found. The algorithm might not be able to match all points. Outliers are removed + * if they can not be matched successfully. + * + * @name match + * @memberof OSRM + * @param {Object} options - Object literal containing parameters for the match query. + * @param {Array} [options.coordinates] The coordinates this request will use, coordinates as `[{lon},{lat}]` values, in decimal degrees. + * @param {Array} [options.bearings] Limits the search to segments with given bearing in degrees towards true north in clockwise direction. + * Can be `null` or an array of `[{value},{range}]` with `integer 0 .. 360,integer 0 .. 180`. + * @param {Array} [options.hints] Hints for the coordinate snapping. Array of base64 encoded strings. + * @param {Boolean} [options.generate_hints=true] Whether or not adds a Hint to the response which can be used in subsequent requests. + * @param {Boolean} [options.steps=false] Return route steps for each route. + * @param {Array|Boolean} [options.annotations=false] An array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed` or boolean for enabling/disabling all. + * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview and per step). Can also be `geojson`. + * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). + * @param {Array} [options.timestamps] Timestamp of the input location (integers, UNIX-like timestamp). + * @param {Array} [options.radiuses] Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy. Can be `null` for default value `5` meters or `double >= 0`. + * @param {String} [options.gaps=split] Allows the input track splitting based on huge timestamp gaps between points. Either `split` or `ignore`. + * @param {Boolean} [options.tidy=false] Allows the input track modification to obtain better matching quality for noisy tracks. + * @param {Array} [options.waypoints] Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index. + * @param {String} [options.snapping] Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. + * + * @param {Function} callback + * + * @returns {Object} containing `tracepoints` and `matchings`. + * **`tracepoints`** Array of [`Ẁaypoint`](#waypoint) objects representing all points of the trace in order. + * If the trace point was omitted by map matching because it is an outlier, the entry will be null. + * Each `Waypoint` object has the following additional properties, + * 1) `matchings_index`: Index to the + * [`Route`](#route) object in matchings the sub-trace was matched to, + * 2) `waypoint_index`: Index of + * the waypoint inside the matched route. + * 3) `alternatives_count`: Number of probable alternative matchings for this trace point. A value of zero indicate that this point was matched unambiguously. Split the trace at these points for incremental map matching. + * **`matchings`** is an array of [`Route`](#route) objects that assemble the trace. Each `Route` object has an additional `confidence` property, + * which is the confidence of the matching. float value between `0` and `1`. `1` is very confident that the matching is correct. + * + * @example + * var osrm = new OSRM('network.osrm'); + * var options = { + * coordinates: [[13.393252,52.542648],[13.39478,52.543079],[13.397389,52.542107]], + * timestamps: [1424684612, 1424684616, 1424684620] + * }; + * osrm.match(options, function(err, response) { + * if (err) throw err; + * console.log(response.tracepoints); // array of Waypoint objects + * console.log(response.matchings); // array of Route objects + * }); + * + */ + +/** + * The trip plugin solves the Traveling Salesman Problem using a greedy heuristic + * (farthest-insertion algorithm) for 10 or * more waypoints and uses brute force for less than 10 + * waypoints. The returned path does not have to be the shortest path, * as TSP is NP-hard it is + * only an approximation. + * + * Note that all input coordinates have to be connected for the trip service to work. + * Currently, not all combinations of `roundtrip`, `source` and `destination` are supported. + * Right now, the following combinations are possible: + * + * | roundtrip | source | destination | supported | + * | :-- | :-- | :-- | :-- | + * | true | first | last | **yes** | + * | true | first | any | **yes** | + * | true | any | last | **yes** | + * | true | any | any | **yes** | + * | false | first | last | **yes** | + * | false | first | any | no | + * | false | any | last | no | + * | false | any | any | no | + * + * @name trip + * @memberof OSRM + * @param {Object} options - Object literal containing parameters for the trip query. + * @param {Array} [options.coordinates] The coordinates this request will use, coordinates as `[{lon},{lat}]` values, in decimal degrees. + * @param {Array} [options.bearings] Limits the search to segments with given bearing in degrees towards true north in clockwise direction. + * Can be `null` or an array of `[{value},{range}]` with `integer 0 .. 360,integer 0 .. 180`. + * @param {Array} [options.radiuses] Limits the coordinate snapping to streets in the given radius in meters. Can be `double >= 0` or `null` (unlimited, default). + * @param {Array} [options.hints] Hints for the coordinate snapping. Array of base64 encoded strings. + * @param {Boolean} [options.generate_hints=true] Whether or not adds a Hint to the response which can be used in subsequent requests. + * @param {Boolean} [options.steps=false] Return route steps for each route. + * @param {Array|Boolean} [options.annotations=false] An array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed` or boolean for enabling/disabling all. + * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview and per step). Can also be `geojson`. + * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified`, `false` or `by_legs`. + * @param {Function} callback + * @param {Boolean} [options.roundtrip=true] Return route is a roundtrip. + * @param {String} [options.source=any] Return route starts at `any` or `first` coordinate. + * @param {String} [options.destination=any] Return route ends at `any` or `last` coordinate. + * @param {Array} [options.approaches] Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be `null` (unrestricted, default), `curb` or `opposite`. + * @param {String} [options.snapping] Which edges can be snapped to, either `default`, or `any`. `default` only snaps to edges marked by the profile as `is_startpoint`, `any` will allow snapping to any edge in the routing graph. + * + * @returns {Object} containing `waypoints` and `trips`. + * **`waypoints`**: an array of [`Waypoint`](#waypoint) objects representing all waypoints in input order. + * Each Waypoint object has the following additional properties, + * 1) `trips_index`: index to trips of the sub-trip the point was matched to, and + * 2) `waypoint_index`: index of the point in the trip. + * **`trips`**: an array of [`Route`](#route) objects that assemble the trace. + * + * @example + * var osrm = new OSRM('network.osrm'); + * var options = { + * coordinates: [ + * [13.36761474609375, 52.51663871100423], + * [13.374481201171875, 52.506191342034576] + * ], + * source: "first", + * destination: "last", + * roundtrip: false + * } + * osrm.trip(options, function(err, response) { + * if (err) throw err; + * console.log(response.waypoints); // array of Waypoint objects + * console.log(response.trips); // array of Route objects + * }); + */ + +/** + * All plugins support a second additional object that is available to configure some NodeJS + * specific behaviours. + * + * @name Configuration + * @param {Object} [plugin_config] - Object literal containing parameters for the trip query. + * @param {String} [plugin_config.format] The format of the result object to various API calls. + * Valid options are `object` (default if `options.format` is + * `json`), which returns a standard Javascript object, as described above, and `buffer`(default if + * `options.format` is `flatbuffers`), which will return a NodeJS + * **[Buffer](https://nodejs.org/api/buffer.html)** object, containing a JSON string or Flatbuffers + * object. The latter has the advantage that it can be immediately serialized to disk/sent over the + * network, and the generation of the string is performed outside the main NodeJS event loop. This + * option is ignored by the `tile` plugin. Also note that `options.format` set to `flatbuffers` + * cannot be used with `plugin_config.format` set to `object`. `json_buffer` is deprecated alias for + * `buffer`. + * + * @example + * var osrm = new OSRM('network.osrm'); + * var options = { + * coordinates: [ + * [13.36761474609375, 52.51663871100423], + * [13.374481201171875, 52.506191342034576] + * ] + * }; + * osrm.route(options, { format: "buffer" }, function(err, response) { + * if (err) throw err; + * console.log(response.toString("utf-8")); + * }); + */ + +/** + * @class Responses + */ + +/** + * Represents a route through (potentially multiple) waypoints. + * + * @name Route + * @memberof Responses + * + * @param {documentation} external in + * [`osrm-backend`](../http.md#route-object) + * + */ + +/** + * Represents a route between two waypoints. + * + * @name RouteLeg + * @memberof Responses + * + * @param {documentation} external in + * [`osrm-backend`](../http.md#routeleg-object) + * + */ + +/** + * A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a + * single way to the subsequent step. + * + * @name RouteStep + * @memberof Responses + * + * @param {documentation} external in + * [`osrm-backend`](../http.md#routestep-object) + * + */ + +/** + * + * @name StepManeuver + * @memberof Responses + * + * @param {documentation} external in + * [`osrm-backend`](../http.md#stepmaneuver-object) + * + */ + +/** + * Object used to describe waypoint on a route. + * + * @name Waypoint + * @memberof Responses + * + * @param {documentation} external in + * [`osrm-backend`](../http.md#waypoint-object) + * + */ diff --git a/docs/v26.5.0/libosrm.html b/docs/v26.5.0/libosrm.html new file mode 100644 index 0000000..1ea49e9 --- /dev/null +++ b/docs/v26.5.0/libosrm.html @@ -0,0 +1,25 @@ + + + + + + OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Introduction

OSRM can be used as a library (libosrm) via C++ instead of using it through the HTTP interface and osrm-routed. This allows for fine-tuning OSRM and has much less overhead. Here is a quick introduction into how to use libosrm in the current version.

Take a look at the example code that lives in the example directory. Here is all you ever wanted to know about libosrm, that is a short description of what the types do and where to find documentation on it:

Important interface objects

  • EngineConfig - for initializing an OSRM instance we can configure certain properties and constraints. E.g. the storage config is the base path such as france.osm.osrm from which we derive and load france.osm.osrm.* auxiliary files. This also lets you set constraints such as the maximum number of locations allowed for specific services.

  • OSRM - this is the main Routing Machine type with functions such as Route and Table. You initialize it with a EngineConfig. It does all the heavy lifting for you. Each function takes its own parameters, e.g. the Route function takes RouteParameters, and a out-reference to a JSON result that gets filled. The return value is a Status, indicating error or success.

  • Status - this is a type wrapping Error or Ok for indicating error or success, respectively.

  • TableParameters - this is an example of parameter types the Routing Machine functions expect. In this case Table expects its own parameters as TableParameters. You can see it wrapping two vectors, sources and destinations --- these are indices into your coordinates for the table service to construct a matrix from (empty sources or destinations means: use all of them). If you ask yourself where coordinates come from, you can see TableParameters inheriting from BaseParameters.

  • BaseParameters - this most importantly holds coordinates (and a few other optional properties that you don't need for basic usage); the specific parameter types inherit from BaseParameters to get these member attributes. That means your TableParameters type has coordinates, sources and destinations member attributes (and a few other that we ignore for now).

  • Coordinate - this is a wrapper around a (longitude, latitude) pair. We really don't care about (lon, lat) vs (lat, lon) but we don't want you to accidentally mix them up, so both latitude and longitude are strictly typed wrappers around integers (fixed notation such as 13423240) and floating points (floating notation such as 13.42324).

  • Parameters for other services - here are all other *Parameters you need for other Routing Machine services.

  • JSON - this is a sum type resembling JSON. The Routing Machine service functions take a out-ref to a JSON result and fill it accordingly. It is currently implemented using std::variant. There are two ways to work with this sum type: either provide a visitor that acts on each type on visitation (with std::visit) or use the std::get function in case you're sure about the structure. The JSON structure is written down in the HTTP API.

Example

See the example folder in the OSRM repository.

Workflow

  • Create an OSRM instance initialized with a EngineConfig
  • Call the service function on the OSRM object providing service specific *Parameters
  • Check the return code and use the JSON result
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/nodejs/api.html b/docs/v26.5.0/nodejs/api.html new file mode 100644 index 0000000..8e880ec --- /dev/null +++ b/docs/v26.5.0/nodejs/api.html @@ -0,0 +1,90 @@ + + + + + + OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

OSRM

The OSRM method is the main constructor for creating an OSRM instance. An OSRM instance requires a .osrm.* dataset(.osrm.* because it contains several files), which is prepared by the OSRM toolchain. You can create such a .osrm.* dataset by running the OSRM binaries we ship in node_modules/osrm/lib/binding_napi_v8/ and default profiles (e.g. for setting speeds and determining road types to route on) in node_modules/osrm/profiles/:

node_modules/osrm/lib/binding_napi_v8/osrm-extract data.osm.pbf -p node_modules/osrm/profiles/car.lua
+node_modules/osrm/lib/binding_napi_v8/osrm-contract data.osrm
+

Consult the osrm-backend documentation for further details.

Once you have a complete network.osrm.* dataset, you can calculate routes in javascript with this object.

javascript
var osrm = new OSRM('network.osrm');

Parameters

  • options (Object | String) Options for creating an OSRM object or string to the .osrm file. (optional, default {shared_memory:true})

    • options.algorithm String? The algorithm to use for routing. Can be 'CH', or 'MLD'. Default is 'CH'. Make sure you prepared the dataset with the correct toolchain.
    • options.shared_memory Boolean? Connects to the persistent shared memory datastore. This requires you to run osrm-datastore prior to creating an OSRM object.
    • options.dataset_name String? Connects to the persistent shared memory datastore defined by --dataset_name option when running osrm-datastore. This requires you to run osrm-datastore --dataset_name prior to creating an OSRM object.
    • options.memory_file String? DEPRECATED Old behaviour: Path to a file on disk to store the memory using mmap. Current behaviour: setting this value is the same as setting mmap_memory: true.
    • options.mmap_memory Boolean? Map on-disk files to virtual memory addresses (mmap), rather than loading into RAM.
    • options.path String? The path to the .osrm files. This is mutually exclusive with setting {options.shared_memory} to true.
    • options.disable_feature_dataset Array? Disables a feature dataset from being loaded into memory if not needed. Options: ROUTE_STEPS, ROUTE_GEOMETRY.
    • options.max_locations_trip Number? Max. locations supported in trip query (default: unlimited).
    • options.max_locations_viaroute Number? Max. locations supported in viaroute query (default: unlimited).
    • options.max_locations_distance_table Number? Max. locations supported in distance table query (default: unlimited).
    • options.max_locations_map_matching Number? Max. locations supported in map-matching query (default: unlimited).
    • options.max_radius_map_matching Number? Max. radius size supported in map matching query (default: 5).
    • options.max_results_nearest Number? Max. results supported in nearest query (default: unlimited).
    • options.max_alternatives Number? Max. number of alternatives supported in alternative routes query (default: 3).
    • options.default_radius Number? Default radius for queries (default: unlimited).

route

Returns the fastest route between two or more coordinates while visiting the waypoints in order.

Parameters

  • options Object Object literal containing parameters for the route query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be null (unlimited, default) or double >= 0.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.exclude Array? List of classes to avoid, order does not matter.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.alternatives Boolean Search for alternative routes. (optional, default false)
    • options.alternatives Number Search for up to this many alternative routes. Please note that even if alternative routes are requested, a result cannot be guaranteed. (optional, default 0)
    • options.steps Boolean Return route steps for each route leg. (optional, default false)
    • options.annotations (Array | Boolean) An array with strings of duration, nodes, distance, weight, datasources, speed or boolean for enabling/disabling all. (optional, default false)
    • options.geometries String Returned route geometry format (influences overview and per step). Can also be geojson. (optional, default polyline)
    • options.overview String Add overview geometry either full, simplified according to highest zoom level it could be displayed on, or not at all (false). If you want the overview for each leg, you can use by_legs. (optional, default simplified)
    • options.continue_straight Boolean? Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile.
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be null (unrestricted, default), curb or opposite. null/true/false
    • options.waypoints Array? Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index.
    • options.format String? Which output format to use, either json, or flatbuffers.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
    • options.skip_waypoints Boolean Removes waypoints from the response. Waypoints are still calculated, but not serialized. Could be useful in case you are interested in some other part of response and do not want to transfer waste data. (optional, default false)
  • callback Function

Examples

javascript
var osrm = new OSRM("berlin-latest.osrm");
+osrm.route({coordinates: [[52.519930,13.438640], [52.513191,13.415852]]}, function(err, result) {
+  if(err) throw err;
+  console.log(result.waypoints); // array of Waypoint objects representing all waypoints in order
+  console.log(result.routes); // array of Route objects ordered by descending recommendation rank
+});

Returns Object An array of Waypoint objects representing all waypoints in order AND an array of Route objects ordered by descending recommendation rank.

nearest

Snaps a coordinate to the street network and returns the nearest n matches.

Note: coordinates in the general options only supports a single {longitude},{latitude} entry.

Parameters

  • options Object Object literal containing parameters for the nearest query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be null (unlimited, default) or double >= 0.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.number Number Number of nearest segments that should be returned. Must be an integer greater than or equal to 1. (optional, default 1)
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be null (unrestricted, default), curb or opposite.
    • options.format String? Which output format to use, either json, or flatbuffers.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [[13.388860,52.517037]],
+  number: 3,
+  bearings: [[0,20]]
+};
+osrm.nearest(options, function(err, response) {
+  console.log(response.waypoints); // array of Waypoint objects
+});

Returns Object containing waypoints. waypoints: array of Ẁaypoint objects sorted by distance to the input coordinate. Each object has an additional distance property, which is the distance in meters to the supplied input coordinate.

table

Computes duration table for the given locations. Allows for both symmetric and asymmetric tables. Optionally returns distance table.

Parameters

  • options Object Object literal containing parameters for the table query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be null (unlimited, default) or double >= 0.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.sources Array? An array of index elements (0 <= integer < #coordinates) to use location with given index as source. Default is to use all.
    • options.destinations Array? An array of index elements (0 <= integer < #coordinates) to use location with given index as destination. Default is to use all.
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate.. Can be null (unrestricted, default), curb or opposite.
    • options.fallback_speed Number? Replace null responses in result with as-the-crow-flies estimates based on fallback_speed. Value is in metres/second.
    • options.fallback_coordinate String? Either input (default) or snapped. If using a fallback_speed, use either the user-supplied coordinate (input), or the snapped coordinate (snapped) for calculating the as-the-crow-flies distance between two points.
    • options.scale_factor Number? Multiply the table duration values in the table by this number for more controlled input into a route optimization solver.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
    • options.annotations Array? Return the requested table or tables in response. Can be ['duration'] (return the duration matrix, default), [distance'] (return the distance matrix), or ['duration', distance'] (return both the duration matrix and the distance matrix).
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [
+    [13.388860,52.517037],
+    [13.397634,52.529407],
+    [13.428555,52.523219]
+  ]
+};
+osrm.table(options, function(err, response) {
+  console.log(response.durations); // array of arrays, matrix in row-major order
+  console.log(response.distances); // array of arrays, matrix in row-major order
+  console.log(response.sources); // array of Waypoint objects
+  console.log(response.destinations); // array of Waypoint objects
+});

Returns Object containing durations, distances, sources, and destinations. durations: array of arrays that stores the matrix in row-major order. durations[i][j] gives the travel time from the i-th waypoint to the j-th waypoint. Values are given in seconds. distances: array of arrays that stores the matrix in row-major order. distances[i][j] gives the travel time from the i-th waypoint to the j-th waypoint. Values are given in meters. sources: array of Ẁaypoint objects describing all sources in order. destinations: array of Ẁaypoint objects describing all destinations in order. fallback_speed_cells: (optional) if fallback_speed is used, will be an array of arrays of row,column values, indicating which cells contain estimated values.

tile

This generates Mapbox Vector Tiles that can be viewed with a vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can be used to examine the routing graph. The tiles are generated directly from the data in-memory, so are in sync with actual routing results, and let you examine which roads are actually routable, and what weights they have applied.

Parameters

Examples

javascript
var osrm = new OSRM('network.osrm');
+osrm.tile([0, 0, 0], function(err, response) {
+  if (err) throw err;
+  fs.writeFileSync('./tile.vector.pbf', response); // write the buffer to a file
+});

Returns Buffer contains a Protocol Buffer encoded vector tile.

match

Map matching matches given GPS points to the road network in the most plausible way. Please note the request might result multiple sub-traces. Large jumps in the timestamps (>60s) or improbable transitions lead to trace splits if a complete matching could not be found. The algorithm might not be able to match all points. Outliers are removed if they can not be matched successfully.

Parameters

  • options Object Object literal containing parameters for the match query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.steps Boolean Return route steps for each route. (optional, default false)
    • options.annotations (Array | Boolean) An array with strings of duration, nodes, distance, weight, datasources, speed or boolean for enabling/disabling all. (optional, default false)
    • options.geometries String Returned route geometry format (influences overview and per step). Can also be geojson. (optional, default polyline)
    • options.overview String Add overview geometry either full, simplified according to highest zoom level it could be display on, or not at all (false). (optional, default simplified)
    • options.timestamps Array<Number>? Timestamp of the input location (integers, UNIX-like timestamp).
    • options.radiuses Array? Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy. Can be null for default value 5 meters or double >= 0.
    • options.gaps String Allows the input track splitting based on huge timestamp gaps between points. Either split or ignore. (optional, default split)
    • options.tidy Boolean Allows the input track modification to obtain better matching quality for noisy tracks. (optional, default false)
    • options.waypoints Array? Indices to coordinates to treat as waypoints. If not supplied, all coordinates are waypoints. Must include first and last coordinate index.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+    coordinates: [[13.393252,52.542648],[13.39478,52.543079],[13.397389,52.542107]],
+    timestamps: [1424684612, 1424684616, 1424684620]
+};
+osrm.match(options, function(err, response) {
+    if (err) throw err;
+    console.log(response.tracepoints); // array of Waypoint objects
+    console.log(response.matchings); // array of Route objects
+});

Returns Object containing tracepoints and matchings. tracepoints Array of Ẁaypoint objects representing all points of the trace in order. If the trace point was omitted by map matching because it is an outlier, the entry will be null. Each Waypoint object has the following additional properties, 1) matchings_index: Index to the Route object in matchings the sub-trace was matched to, 2) waypoint_index: Index of the waypoint inside the matched route. 3) alternatives_count: Number of probable alternative matchings for this trace point. A value of zero indicate that this point was matched unambiguously. Split the trace at these points for incremental map matching. matchings is an array of Route objects that assemble the trace. Each Route object has an additional confidence property, which is the confidence of the matching. float value between 0 and 1. 1 is very confident that the matching is correct.

trip

The trip plugin solves the Traveling Salesman Problem using a greedy heuristic (farthest-insertion algorithm) for 10 or * more waypoints and uses brute force for less than 10 waypoints. The returned path does not have to be the shortest path, * as TSP is NP-hard it is only an approximation.

Note that all input coordinates have to be connected for the trip service to work. Currently, not all combinations of roundtrip, source and destination are supported. Right now, the following combinations are possible:

roundtripsourcedestinationsupported
truefirstlastyes
truefirstanyyes
trueanylastyes
trueanyanyyes
falsefirstlastyes
falsefirstanyno
falseanylastno
falseanyanyno

Parameters

  • options Object Object literal containing parameters for the trip query.

    • options.coordinates Array? The coordinates this request will use, coordinates as [{lon},{lat}] values, in decimal degrees.
    • options.bearings Array? Limits the search to segments with given bearing in degrees towards true north in clockwise direction. Can be null or an array of [{value},{range}] with integer 0 .. 360,integer 0 .. 180.
    • options.radiuses Array? Limits the coordinate snapping to streets in the given radius in meters. Can be double >= 0 or null (unlimited, default).
    • options.hints Array? Hints for the coordinate snapping. Array of base64 encoded strings.
    • options.generate_hints Boolean Whether or not adds a Hint to the response which can be used in subsequent requests. (optional, default true)
    • options.steps Boolean Return route steps for each route. (optional, default false)
    • options.annotations (Array | Boolean) An array with strings of duration, nodes, distance, weight, datasources, speed or boolean for enabling/disabling all. (optional, default false)
    • options.geometries String Returned route geometry format (influences overview and per step). Can also be geojson. (optional, default polyline)
    • options.overview String Add overview geometry either full, simplified, false or by_legs. (optional, default simplified)
    • options.roundtrip Boolean Return route is a roundtrip. (optional, default true)
    • options.source String Return route starts at any or first coordinate. (optional, default any)
    • options.destination String Return route ends at any or last coordinate. (optional, default any)
    • options.approaches Array? Restrict the direction on the road network at a waypoint, relative to the input coordinate. Can be null (unrestricted, default), curb or opposite.
    • options.snapping String? Which edges can be snapped to, either default, or any. default only snaps to edges marked by the profile as is_startpoint, any will allow snapping to any edge in the routing graph.
  • callback Function

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [
+    [13.36761474609375, 52.51663871100423],
+    [13.374481201171875, 52.506191342034576]
+  ],
+  source: "first",
+  destination: "last",
+  roundtrip: false
+}
+osrm.trip(options, function(err, response) {
+  if (err) throw err;
+  console.log(response.waypoints); // array of Waypoint objects
+  console.log(response.trips); // array of Route objects
+});

Returns Object containing waypoints and trips. waypoints: an array of Waypoint objects representing all waypoints in input order. Each Waypoint object has the following additional properties, 1) trips_index: index to trips of the sub-trip the point was matched to, and 2) waypoint_index: index of the point in the trip. trips: an array of Route objects that assemble the trace.

Configuration

All plugins support a second additional object that is available to configure some NodeJS specific behaviours.

Parameters

  • plugin_config Object? Object literal containing parameters for the trip query.

    • plugin_config.format String? The format of the result object to various API calls. Valid options are object (default if options.format is json), which returns a standard Javascript object, as described above, and buffer(default if options.format is flatbuffers), which will return a NodeJS Buffer object, containing a JSON string or Flatbuffers object. The latter has the advantage that it can be immediately serialized to disk/sent over the network, and the generation of the string is performed outside the main NodeJS event loop. This option is ignored by the tile plugin. Also note that options.format set to flatbuffers cannot be used with plugin_config.format set to object. json_buffer is deprecated alias for buffer.

Examples

javascript
var osrm = new OSRM('network.osrm');
+var options = {
+  coordinates: [
+    [13.36761474609375, 52.51663871100423],
+    [13.374481201171875, 52.506191342034576]
+  ]
+};
+osrm.route(options, { format: "buffer" }, function(err, response) {
+  if (err) throw err;
+  console.log(response.toString("utf-8"));
+});

Responses

Route

Represents a route through (potentially multiple) waypoints.

Parameters

RouteLeg

Represents a route between two waypoints.

Parameters

RouteStep

A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a single way to the subsequent step.

Parameters

StepManeuver

Parameters

Waypoint

Object used to describe waypoint on a route.

Parameters

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/profiles.html b/docs/v26.5.0/profiles.html new file mode 100644 index 0000000..7fd7ff7 --- /dev/null +++ b/docs/v26.5.0/profiles.html @@ -0,0 +1,107 @@ + + + + + + OSRM profiles | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

OSRM profiles

OSRM supports "profiles". Profiles represent routing behavior for different transport modes like car, bike and foot. You can also create profiles for variations like a fastest/shortest car profile or fastest/safest/greenest bicycles profile.

A profile describes whether or not it's possible to route along a particular type of way, whether we can pass a particular node, and how quickly we'll be traveling when we do. This feeds into the way the routing graph is created and thus influences the output routes.

Available profiles

Out-of-the-box OSRM comes with profiles for car, bicycle and foot. You can easily modify these or create new ones if you like.

Profiles have a 'lua' extension, and are placed in 'profiles' directory.

When running OSRM preprocessing commands you specify the profile with the --profile (or the shorthand -p) option, for example:

osrm-extract --profile ../profiles/car.lua planet-latest.osm.pbf

Using Multiple Profiles with the Same Input

You can extract the same OSM file with different profiles by specifying an output path:

bash
osrm-extract --profile profiles/car.lua planet.osm.pbf --output /data/car
+osrm-extract --profile profiles/bicycle.lua planet.osm.pbf --output /data/bicycle
+osrm-extract --profile profiles/foot.lua planet.osm.pbf --output /data/foot

This avoids the need to create symbolic links to the input file.

Processing flow

It's important to understand that profiles are used when preprocessing the OSM data, NOT at query time when routes are computed.

This means that after modifying a profile you will need to extract, contract and reload the data again and to see changes in the routing results. See Processing Flow for more.

Profiles are written in Lua

Profiles are not just configuration files. They are scripts written in the Lua scripting language. The reason for this is that OpenStreetMap data is complex, and it's not possible to simply define tag mappings. Lua scripting offers a powerful way to handle all the possible tag combinations found in OpenStreetMap nodes and ways.

Basic structure of profiles

A profile will process every node and way in the OSM input data to determine what ways are routable in which direction, at what speed, etc.

A profile will typically:

  • Define api version (required)
  • Require library files (optional)
  • Define setup function (required)
  • Define process functions (some are required)
  • Return functions table (required)

A profile can also define various local functions it needs.

Looking at car.lua as an example, at the top of the file the api version is defined and then required library files are included.

Then follows the setup function, which is called once when the profile is loaded. It returns a big hash table of configurations, specifying things like what speed to use for different way types. The configurations are used later in the various processing functions. Many adjustments can be done just by modifying this configuration table.

The setup function is also where you can do other setup, like loading an elevation data source if you want to consider that when processing ways.

Then come the process_node and process_way functions, which are called for each OSM node and way when extracting OpenStreetMap data with osrm-extract.

The process_turn function processes every possible turn in the network, and sets a penalty depending on the angle and turn of the movement.

Profiles can also define a process_segment function to handle differences in speed along an OSM way, for example to handle elevation. As you can see, this is not currently used in the car profile.

At the end of the file, a table is returned with references to the setup and processing functions the profile has defined.

Understanding speed, weight and rate

When computing a route from A to B there can be different measures of what is the best route. That's why there's a need for different profiles.

Because speeds vary on different types of roads, the shortest and the fastest route are typically different. But there are many other possible preferences. For example a user might prefer a bicycle route that follow parks or other green areas, even though both duration and distance are a bit longer.

To handle this, OSRM doesn't simply choose the ways with the highest speed. Instead it uses the concepts of weight and rate. The rate is an abstract measure that you can assign to ways as you like to make some ways preferable to others. Routing will prefer ways with high rate.

The weight of a way is normally computed as length / rate. The weight can be thought of as the resistance or cost when passing the way. Routing will prefer ways with low weight.

You can also set the weight of a way to a fixed value. In this case it's not calculated based on the length or rate, and the rate is ignored.

You should set the speed to your best estimate of the actual speed that will be used on a particular way. This will result in the best estimated travel times.

If you want to prefer certain ways due to other factors than the speed, adjust the rate accordingly. If you adjust the speed, the time estimation will be skewed.

If you set the same rate on all ways, the result will be shortest path routing. If you set rate = speed on all ways, the result will be fastest path routing. If you want to prioritize certain streets, increase the rate on these.

Elements

api_version

A profile should set api_version at the top of your profile. This is done to ensure that older profiles are still supported when the api changes. If api_version is not defined, 0 will be assumed. The current api version is 4.

Library files

The folder profiles/lib/ contains Lua library files for handling many common processing tasks.

FileNotes
way_handlers.luaFunctions for processing way tags
tags.luaFunctions for general parsing of OSM tags
set.luaDefines the Set helper for handling sets of values
sequence.luaDefines the Sequence helper for handling sequences of values
access.luaFunction for finding relevant access tags
destination.luaFunction for finding relevant destination tags
maxspeed.luaFunction for determining maximum speed
guidance.luaFunction for processing guidance attributes

They all return a table of functions when you use require to load them. You can either store this table and reference its functions later, or if you need only a single function you can store that directly.

setup()

The setup function is called once when the profile is loaded and must return a table of configurations. It's also where you can do other global setup, like loading data sources that are used during processing.

Note that processing of data is parallelized and several unconnected Lua interpreters will be running at the same time. The setup function will be called once for each. Each Lua interpreter will have its own set of globals.

The following global properties can be set under properties in the hash you return in the setup function:

AttributeTypeNotes
weight_nameStringName used in output for the routing weight property (default 'duration')
weight_precisionUnsignedDecimal precision of edge weights (default 1)
left_hand_drivingBooleanAre vehicles assumed to drive on the left? (used in guidance, default false)
use_turn_restrictionsBooleanAre turn restrictions followed? (default false)
continue_straight_at_waypointBooleanMust the route continue straight on at a via point, or are U-turns allowed? (default true)
max_speed_for_map_matchingFloatMaximum vehicle speed to be assumed in matching (in m/s)
max_turn_weightFloatMaximum turn penalty weight
force_split_edgesBooleanTrue value forces a split of forward and backward edges of extracted ways and guarantees that process_segment will be called for all segments (default false)

The following additional global properties can be set in the hash you return in the setup function:

AttributeTypeNotes
excludableSequence of SetsDetermines which class-combinations are supported by the exclude option at query time. E.g. Sequence{Set{"ferry", "motorway"}, Set{"motorway"}} will allow you to exclude ferries and motorways, or only motorways.
classesSequenceDetermines the allowed classes that can be referenced using {forward,backward}_classes on the way in the process_way function.
restrictionsSequenceDetermines which turn restrictions will be used for this profile.
suffix_listSetList of name suffixes needed for determining if "Highway 101 NW" the same road as "Highway 101 ES".
relation_typesSequenceDetermines which relations should be cached for processing in this profile. It contains relations types

process_node(profile, node, result, relations)

Process an OSM node to determine whether this node is an obstacle, if it can be passed at all and whether passing it incurs a delay.

ArgumentDescription
profileThe configuration table you returned in setup.
nodeThe input node to process (read-only).
resultThe output that you will modify.
relationsStorage of relations to access relations, where node is a member.

The following attributes can be set on result: (Note: for new code use the obstacle_map.

AttributeTypeNotes
barrierBooleanIs it an impassable barrier?
traffic_lightsBooleanIs it a traffic light (incurs delay in process_turn)?

Obstacle

A user type that represents an obstacle on the road or a place where you can turn around.

This may be a completely impassable obstacle like a barrier, a temporary obstacle like a traffic light or a stop sign, or an obstacle that just slows you down like a traffic_calming. The obstacle may be present in both directions or in one direction only.

This also represents a good turning point like a mini_roundabout, turning_loop, or turning_circle.

An object of this type is immutable once constructed.

lua
local obs = Obstacle.new(
+  obstacle_type.traffic_signals,
+  obstacle_direction.forward,
+  2.5,
+  0
+)
+assert(obs.duration == 2.5)
MemberModeTypeNotes
typeread-onlyobstacle_typeeg. obstacle_type.barrier
directionread-onlyobstacle_directioneg. obstacle_direction.forward
durationread-onlyfloatThe expected delay in seconds
weightread-onlyfloatThe weight

obstacle_type

An enum with the following keys:

Keys
none
barrier
traffic_signals
stop
give_way
crossing
traffic_calming
mini_roundabout
turning_loop
turning_circle
gate

obstacle_direction

An enum with the following keys:

Keys
none
forward
backward
both

obstacle_map

A global user type. It stores obstacles.

The canonical workflow is: to store obstacles in process_node() and retrieve them in process_turn().

Note: In the course of processing, between the process_node() stage and the process_turn() stage, the extractor switches from using OSM nodes to using internal nodes. Both types have different ids. You can only store OSM nodes and only retrieve internal nodes. This implies that, in process_node(), you cannot retrieve an obstacle you have just stored.

obstacle_map:add(node, obstacle)

Call this function inside process_node() to register an obstacle on a node. You can register as many different obstacles as you wish on any given node. It is your responsibility to register the same obstacle only once.

In a following step -- likely in process_turn() -- you can retrieve all obstacles registered at any given node. This function works with OSM nodes.

ArgumentTypeNotes
nodeOSMNodeThe same node as passed to process_node.
obstacleObstacleThe obstacle

Usage example:

lua
function process_node(profile, node, result, relations)
+  ...
+  obstacle_map:add(node,
+    Obstacle.new(
+      obstacle_type.traffic_signal,
+      obstacle_direction.forward,
+      2, 0))
+end

obstacle_map:any(from, to, type)

Return true if there are any obstacles at node to when coming from node from and having the type type.

You will likely call this function inside process_turn(). Note that this works only with internal nodes, not with OSM nodes.

lua
bool obstacle_map:any(to)
+bool obstacle_map:any(from, to)
+bool obstacle_map:any(from, to, type)
ArgumentTypeNotes
fromNodeThe leading node. Optional.
toNodeThe node with the obstacle.
typeobstacle_typeThe obstacle type. Defaults to all types. May be a bitwise-or combination of types.
returnsboolTrue if there are any obstacles satisfiying the given criteria.

Usage examples:

lua
function process_turn(profile, turn)
+  if obstacle_map:any(turn.via) then
+    ...
+  end
+  if obstacle_map:any(turn.from, turn.via, obstacle_type.traffic_signal) then
+    turn.duration = turn.duration + 2
+  end
+end

obstacle_map:get(from, to, type)

This function retrieves all registered obstacles at node to when coming from the node from and having the type type.

You will likely call this function inside process_turn(). Note that this works only with internal nodes, not with OSM nodes.

lua
obstacle_map:get(to)
+obstacle_map:get(from, to)
+obstacle_map:get(from, to, type)
ArgumentTypeNotes
fromNodeThe leading node. Optional.
toNodeThe node with the obstacle.
typeobstacle_typeThe obstacle type. Defaults to all types. May be a bitwise-or combination of types.
returnstableA table of Obstacles.

Usage examples:

lua
function process_turn(profile, turn)
+  for _, obs in pairs(obstacle_map:get(turn.via)) do
+    if obs.type == obstacle_type.barrier then
+      turn.duration = turn.duration + obs.duration
+    end
+  end
+  for _, obs in pairs(obstacle_map:get(
+      turn.from, turn.via, obstacle_type.traffic_signal)) do
+    turn.duration = turn.duration + obs.duration
+  end
+end

process_way(profile, way, result, relations)

Given an OpenStreetMap way, the process_way function will either return nothing (meaning we are not going to route over this way at all), or it will set up a result hash.

ArgumentDescription
profileThe configuration table you returned in setup.
wayThe input way to process (read-only).
resultThe output that you will modify.
relationsStorage of relations to access relations, where way is a member.

Importantly it will set result.forward_mode and result.backward_mode to indicate the travel mode in each direction, as well as set result.forward_speed and result.backward_speed to integer values representing the speed for traversing the way.

It will also set a number of other attributes on result.

Using the power of the scripting language you wouldn't typically see something as simple as a result.forward_speed = 20 line within the process_way function. Instead process_way will examine the tag set on the way, process this information in various ways, calling other local functions and referencing the configuration in profile, etc., before arriving at the result.

The following attributes can be set on the result in process_way:

AttributeTypeNotes
forward_speedFloatSpeed on this way in km/h. Mandatory.
backward_speedFloat""
forward_rateFloatRouting weight, expressed as meters/weight (e.g. for a fastest-route weighting, you would want this to be meters/second, so set it to forward_speed/3.6)
backward_rateFloat""
forward_modeEnumMode of travel (e.g. car, ferry). Mandatory. Defined in include/extractor/travel_mode.hpp.
backward_modeEnum""
forward_classesTableMark this way as being of a specific class, e.g. result.classes["toll"] = true. This will be exposed in the API as classes on each RouteStep.
backward_classesTable""
durationFloatAlternative setter for duration of the whole way in both directions
weightFloatAlternative setter for weight of the whole way in both directions
turn_lanes_forwardStringDirections for individual lanes (normalized OSM turn:lanes value)
turn_lanes_backwardString""
forward_restrictedBooleanIs this a restricted access road? (e.g. private, or deliveries only; used to enable high turn penalty, so that way is only chosen for start/end of route)
backward_restrictedBoolean""
is_startpointBooleanCan a journey start on this way? (e.g. ferry; if false, prevents snapping the start point to this way)
roundaboutBooleanIs this part of a roundabout?
circularBooleanIs this part of a non-roundabout circular junction?
nameStringName of the way
refStringRoad number (equal to set forward_ref and backward_ref with one value)
forward_refStringRoad number in forward way direction
backward_refStringRoad number in backward way direction
destinationsStringThe road's destinations
exitsStringThe ramp's exit numbers or names
pronunciationStringName pronunciation
road_classification.motorway_classBooleanGuidance: way is a motorway
road_classification.link_classBooleanGuidance: way is a slip/link road
road_classification.road_priority_classEnumGuidance: order in priority list. Defined in include/extractor/road_classification.hpp
road_classification.may_be_ignoredBooleanGuidance: way is non-highway
road_classification.num_lanesUnsignedGuidance: total number of lanes in way

Way names

The WayHandlers.names function in way_handlers.lua handles extraction of way names for routing instructions. It processes the following OSM tags:

TagNotes
namePrimary name of the way
name:pronunciationPronunciation hint for text-to-speech
refRoad reference number (e.g., "A1", "I-95")
junction:refExit or junction reference number

For unnamed sidewalks and sidepaths (where highway=footway, highway=cycleway, or highway=path), the function also supports fallback name tags when the way is marked as a sidepath:

TagNotes
is_sidepath:of:nameName of the street the sidepath follows (checked first)
street:nameAlternative tag for the associated street name

The fallback is only applied when the way has one of these sidepath markers:

  • footway=sidewalk
  • cycleway=sidepath
  • is_sidepath=yes

This allows routing instructions to show street names for separately mapped sidewalks, e.g., "Turn right onto Main Street" instead of just "Turn right".

process_segment(profile, segment)

The process_segment function is called for every segment of OSM ways. A segment is a straight line between two OSM nodes.

An OpenStreetMap way cannot have different tags on different parts of a way. Instead you would split the way into several smaller ways. However, many ways are long. For example, many ways pass over hills without any change in tags.

Processing each segment of an OSM way makes it possible to have different speeds on different parts of a way based on external data like data about elevation, pollution, noise or scenic value and adjust weight and duration of the segment accordingly.

In the process_segment function you don't have access to OSM tags. Instead you use the geographical location of the start and end point of the way to look up information from another data source, like elevation data. See rasterbot.lua for an example.

The following attributes can be read and set on the result in process_segment:

AttributeRead/write?TypeNotes
source.lonReadFloatCo-ordinates of segment start
source.latReadFloat""
target.lonReadFloatCo-ordinates of segment end
target.latReadFloat""
distanceReadFloatLength of segment
weightRead/writeFloatRouting weight for this segment
durationRead/writeFloatDuration for this segment

process_turn(profile, turn)

The process_turn function is called for every possible turn in the network. Based on the angle and type of turn you assign the weight and duration of the movement.

The following attributes can be read and set on the result in process_turn:

AttributeRead/write?TypeNotes
angleReadFloatAngle of turn in degrees ([-179, 180]: 0=straight, 180=u turn, +x=x degrees to the right, -x= x degrees to the left)
number_of_roadsReadIntegerNumber of ways at the intersection of the turn
is_u_turnReadBooleanIs the turn a u-turn?
has_traffic_lightReadBooleanIs a traffic light present at this turn?
is_left_hand_drivingReadBooleanIs left-hand traffic?
source_restrictedReadBooleanIs it from a restricted access road? (See definition in process_way)
source_modeReadEnumTravel mode before the turn. Defined in include/extractor/travel_mode.hpp
source_is_motorwayReadBooleanIs the source road a motorway?
source_is_linkReadBooleanIs the source road a link?
source_number_of_lanesReadIntegerHow many lanes does the source road have? (default when not tagged: 0)
source_highway_turn_classificationReadIntegerClassification based on highway tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
source_access_turn_classificationReadIntegerClassification based on access tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
source_speedReadIntegerSpeed on this source road in km/h
source_priority_classReadEnumThe type of road priority class of the source. Defined in include/extractor/road_classification.hpp
target_restrictedReadBooleanIs the target a restricted access road? (See definition in process_way)
target_modeReadEnumTravel mode after the turn. Defined in include/extractor/travel_mode.hpp
target_is_motorwayReadBooleanIs the target road a motorway?
target_is_linkReadBooleanIs the target road a link?
target_number_of_lanesReadIntegerHow many lanes does the target road have? (default when not tagged: 0)
target_highway_turn_classificationReadIntegerClassification based on highway tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
target_access_turn_classificationReadIntegerClassification based on access tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15))
target_speedReadIntegerSpeed on this target road in km/h
target_priority_classReadEnumThe type of road priority class of the target. Defined in include/extractor/road_classification.hpp
fromReadNodeIDThe leading node
viaReadNodeIDThe intersection node
toReadNodeIDThe trailing node
source_roadReadExtractionTurnLegThe incoming road
target_roadReadExtractionTurnLegThe outgoing road
roads_on_the_rightReadVector<ExtractionTurnLeg>Vector with information about other roads on the right of the turn that are also connected at the intersection
roads_on_the_leftReadVector<ExtractionTurnLeg>Vector with information about other roads on the left of the turn that are also connected at the intersection. If turn is a u turn, this is empty.
weightRead/writeFloatPenalty to be applied for this turn (routing weight)
durationRead/writeFloatPenalty to be applied for this turn (duration in deciseconds)

from, via, and to

Use these node IDs to retrieve obstacles. See: obstacle_map:get.

source_road, target_road, roads_on_the_right, and roads_on_the_left

The information of source_road, target_road, roads_on_the_right, and roads_on_the_left that can be read are as follows:

AttributeRead/write?TypeNotes
is_restrictedReadBooleanIs it a restricted access road? (See definition in process_way)
modeReadEnumTravel mode before the turn. Defined in include/extractor/travel_mode.hpp
is_motorwayReadBooleanIs the road a motorway?
is_linkReadBooleanIs the road a link?
number_of_lanesReadIntegerHow many lanes does the road have? (default when not tagged: 0)
highway_turn_classificationReadIntegerClassification based on highway tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15)
access_turn_classificationReadIntegerClassification based on access tag defined by user during setup. (default when not set: 0, allowed classification values are: 0-15)
speedReadIntegerSpeed on this road in km/h
distanceReadDoubleThe length of the road edge
priority_classReadEnumThe type of road priority class of the leg. Defined in include/extractor/road_classification.hpp
is_incomingReadBooleanIs the road an incoming road of the intersection
is_outgoingReadBooleanIs the road an outgoing road of the intersection

The order of the roads in roads_on_the_right and roads_on_the_left are counter clockwise. If the turn is a u turn, all other connected roads will be in roads_on_the_right.

Example

           c   e
+           |  /
+           | /
+    a ---- x ---- b
+          /|
+         / |
+        f  d

When turning from a to b via x,

  • roads_on_the_right[1] is the road xf
  • roads_on_the_right[2] is the road xd
  • roads_on_the_left[1] is the road xe
  • roads_on_the_left[2] is the road xc

Note that indices of arrays in Lua are 1-based.

highway_turn_classification and access_turn_classification

When setting appropriate turn weights and duration, information about the highway and access tags of roads that are involved in the turn are necessary. The Lua turn function process_turn does not have access to the original OSM tags anymore. However, highway_turn_classification and access_turn_classification can be set during setup. The classification set during setup can be later used in process_turn.

Example

In the following example we use highway_turn_classification to set the turn weight to 10 if the turn is on a highway and to 5 if the turn is on a primary.

function setup()
+  return {
+    highway_turn_classification = {
+      ['motorway'] = 2,
+      ['primary'] = 1
+    }
+  }
+end
+
+function process_turn(profile, turn) {
+  if turn.source_highway_turn_classification == 2 and turn.target_highway_turn_classification == 2 then
+    turn.weight = 10
+  end
+  if turn.source_highway_turn_classification == 1 and turn.target_highway_turn_classification == 1 then
+    turn.weight = 5
+  end
+}

Guidance

The guidance parameters in profiles are currently a work in progress. They can and will change. Please be aware of this when using guidance configuration possibilities.

Guidance uses road classes to decide on when/if to emit specific instructions and to discover which road is obvious when following a route. Classification uses three flags and a priority-category. The flags indicate whether a road is a motorway (required for on/off ramps), a link type (the ramps itself, if also a motorway) and whether a road may be omitted in considerations (is considered purely for connectivity). The priority-category influences the decision which road is considered the obvious choice and which roads can be seen as fork. Forks can be emitted between roads of similar priority category only. Obvious choices follow a major priority road, if the priority difference is large.

Using raster data

OSRM has built-in support for loading an interpolating raster data in ASCII format. This can be used e.g. for factoring in elevation when computing routes.

Use raster:load() in your setup function to load data and store the source in your configuration hash:

lua
function setup()
+  return {
+    raster_source = raster:load(
+      "rastersource.asc",  -- file to load
+      0,    -- longitude min
+      0.1,  -- longitude max
+      0,    -- latitude min
+      0.1,  -- latitude max
+      5,    -- number of rows
+      4     -- number of columns
+    )
+  }
+end

The input data must be an ASCII file with rows of integers, e.g.:

0  0  0   0
+0  0  0   250
+0  0  250 500
+0  0  0   250
+0  0  0   0

In your segment_function you can then access the raster source and use raster:query() to query to find the nearest data point, or raster:interpolate() to interpolate a value based on nearby data points.

You must check whether the result is valid before using it.

Example:

lua
function process_segment (profile, segment)
+  local sourceData = raster:query(profile.raster_source, segment.source.lon, segment.source.lat)
+  local targetData = raster:query(profile.raster_source, segment.target.lon, segment.target.lat)
+
+  local invalid = sourceData.invalid_data()
+  if sourceData.datum ~= invalid and targetData.datum ~= invalid then
+      -- use values to adjust weight and duration
+    [...]
+end

See rasterbot.lua and rasterbotinterp.lua for examples.

Helper functions

There are a few helper functions defined in the global scope that profiles can use:

  • durationIsValid
  • parseDuration
  • trimLaneString
  • applyAccessTokens
  • canonicalizeStringList
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/python/api.html b/docs/v26.5.0/python/api.html new file mode 100644 index 0000000..07cdb34 --- /dev/null +++ b/docs/v26.5.0/python/api.html @@ -0,0 +1,90 @@ + + + + + + Python API | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Python API

The Python bindings provide access to OSRM's routing services through the osrm package. Install with pip install osrm-bindings.

OSRM

The OSRM class is the main entry point. It requires a .osrm.* dataset prepared by the OSRM toolchain.

python
import osrm
+
+# From file
+engine = osrm.OSRM("path/to/data.osrm")
+
+# With keyword arguments
+engine = osrm.OSRM(
+    storage_config="path/to/data.osrm",
+    algorithm="CH",                      # or "MLD"
+    use_shared_memory=False,
+    max_locations_trip=3,
+    max_locations_viaroute=3,
+    max_locations_distance_table=3,
+    max_locations_map_matching=3,
+    max_results_nearest=1,
+    max_alternatives=1,
+    default_radius="unlimited",
+)
+
+# Using shared memory (requires osrm-datastore)
+engine = osrm.OSRM(use_shared_memory=True)

Parameters

  • storage_config str - Path to the .osrm dataset.
  • algorithm str - Routing algorithm: "CH" or "MLD". Default: "CH".
  • use_shared_memory bool - Connect to shared memory datastore. Default: True.
  • dataset_name str - Named shared memory dataset (requires osrm-datastore --dataset_name).
  • memory_file str - Deprecated. Equivalent to use_mmap=True.
  • use_mmap bool - Memory-map files instead of loading into RAM.
  • max_locations_trip int - Max locations in trip queries.
  • max_locations_viaroute int - Max locations in route queries.
  • max_locations_distance_table int - Max locations in table queries.
  • max_locations_map_matching int - Max locations in match queries.
  • max_results_nearest int - Max results in nearest queries.
  • max_alternatives int - Max alternative routes.
  • default_radius float | "unlimited" - Default search radius in meters.

Services

All service methods take a parameters object and return a dict-like Object:

python
result = engine.Route(route_params)
+print(result["routes"])
+print(result["waypoints"])

Route

Finds the fastest route between two or more coordinates.

python
params = osrm.RouteParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077)],
+    steps=True,
+    alternatives=2,
+    annotations=["speed", "duration"],
+    geometries="geojson",
+    overview="full",
+)
+result = engine.Route(params)

RouteParameters

Inherits all BaseParameters.

  • steps bool - Return route steps for each leg. Default: False.
  • alternatives int - Number of alternative routes to search for. Default: 0.
  • annotations list[str] - Additional metadata: "none", "duration", "nodes", "distance", "weight", "datasources", "speed", "all". Default: [].
  • geometries str - Geometry format: "polyline", "polyline6", "geojson". Default: "polyline".
  • overview str - Overview geometry: "simplified", "full", "false". Default: "simplified".
  • continue_straight bool | None - Force route to continue straight at waypoints.
  • waypoints list[int] - Indices of coordinates to treat as waypoints. Must include first and last.

Table

Computes duration/distance matrices between coordinates.

python
params = osrm.TableParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077), (7.41862, 43.73216)],
+    sources=[0],
+    destinations=[1, 2],
+    annotations=["duration", "distance"],
+)
+result = engine.Table(params)

TableParameters

Inherits all BaseParameters.

  • sources list[int] - Indices of source coordinates. Default: all.
  • destinations list[int] - Indices of destination coordinates. Default: all.
  • annotations list[str] - "duration", "distance", "all". Default: ["duration"].
  • fallback_speed float - Speed for crow-flies fallback when no route found.
  • fallback_coordinate_type str - "input" or "snapped".
  • scale_factor float - Scales duration values. Default: 1.0.

Nearest

Finds the nearest street segment for a coordinate.

python
params = osrm.NearestParameters(
+    coordinates=[(7.41337, 43.72956)],
+    number_of_results=3,
+)
+result = engine.Nearest(params)

NearestParameters

Inherits all BaseParameters.

  • number_of_results int - Number of nearest segments to return. Default: 1.

Match

Snaps noisy GPS traces to the road network.

python
params = osrm.MatchParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077), (7.41862, 43.73216)],
+    timestamps=[1424684612, 1424684616, 1424684620],
+    radiuses=[5.0, 5.0, 5.0],
+    annotations=["speed"],
+    geometries="geojson",
+)
+result = engine.Match(params)

MatchParameters

Inherits all RouteParameters and BaseParameters.

  • timestamps list[int] - UNIX timestamps for each coordinate.
  • gaps str - Gap handling: "split" or "ignore". Default: "split".
  • tidy bool - Remove duplicates. Default: False.
  • waypoints list[int] - Indices of coordinates to treat as waypoints.

Trip

Solves the Traveling Salesman Problem for the given coordinates.

python
params = osrm.TripParameters(
+    coordinates=[(7.41337, 43.72956), (7.41546, 43.73077), (7.41862, 43.73216)],
+    source="first",
+    destination="last",
+    roundtrip=True,
+    annotations=["duration"],
+    geometries="geojson",
+)
+result = engine.Trip(params)

TripParameters

Inherits all RouteParameters and BaseParameters.

  • source str - "any" or "first". Default: "any".
  • destination str - "any" or "last". Default: "any".
  • roundtrip bool - Return to first location. Default: True.

Tile

Generates vector tiles with internal routing graph data.

python
params = osrm.TileParameters(x=17059, y=11948, z=15)
+result = engine.Tile(params)  # returns bytes

TileParameters

  • x int - Tile x coordinate.
  • y int - Tile y coordinate.
  • z int - Tile zoom level.

BaseParameters

Shared parameters inherited by Nearest, Table, Route, Match, and Trip.

  • coordinates list[tuple[float, float]] - List of (longitude, latitude) pairs.
  • hints list[str | None] - Base64-encoded hints from previous requests.
  • radiuses list[float | None] - Search radius per coordinate in meters. None for unlimited.
  • bearings list[tuple[int, int] | None] - (bearing, range) pairs in degrees. None for unrestricted.
  • approaches list[str | None] - "curb", "unrestricted", or None.
  • generate_hints bool - Include hints in response. Default: True.
  • exclude list[str] - Road classes to avoid (e.g. ["motorway"]).
  • snapping str - "default" or "any". Default: "default".

Types

Coordinate

python
coord = osrm.Coordinate((7.41337, 43.72956))
+print(coord.lon, coord.lat)

Bearing

python
bearing = osrm.Bearing((200, 180))
+print(bearing.bearing, bearing.range)

Object / Array

Service results are returned as Object (dict-like) and Array (list-like) wrappers around OSRM's internal JSON types. They support [], len(), in, and iteration.

python
result = engine.Route(params)
+for route in result["routes"]:
+    print(route["distance"], route["duration"])

CLI

The package also installs OSRM command-line tools, accessible via python -m osrm:

bash
python -m osrm extract data.osm.pbf -p profiles/car.lua
+python -m osrm contract data.osrm
+python -m osrm partition data.osrm
+python -m osrm customize data.osrm
+python -m osrm datastore data.osrm
+python -m osrm routed data.osrm
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/python/development.html b/docs/v26.5.0/python/development.html new file mode 100644 index 0000000..3348940 --- /dev/null +++ b/docs/v26.5.0/python/development.html @@ -0,0 +1,64 @@ + + + + + + Python Bindings Development Guide | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Python Bindings Development Guide

Installing for production

Pre-built wheels are published to PyPI for Linux (x86_64), macOS (x86_64), and Windows (amd64). They use the CPython 3.12 stable ABI (cp312-abi3) and therefore install on Python 3.12+:

bash
pip install osrm-bindings

The package itself supports Python 3.10+ when built from source — needed for 3.10/3.11, aarch64 Linux, arm64 macOS, or any platform without a pre-built wheel:

bash
pip install osrm-bindings --no-binary osrm-bindings

Source builds compile the full OSRM C++ library — this takes a long time. See platform-specific notes for prerequisites.

Installing for development

Clone the repo and install in editable mode with dev dependencies:

bash
git clone https://github.com/Project-OSRM/osrm-backend
+cd osrm-backend
+pip install -e ".[dev]"

Install pre-commit hooks:

bash
pre-commit install

Platform-specific build requirements

Linux

CI wheel builds run inside a custom manylinux image (nilsnolde/manylinux, branch osrm_python) that ships vcpkg pre-bootstrapped at the SHA pinned in vcpkg-configuration.json, plus a pre-warmed vcpkg binary cache compiled against this repo's vcpkg.json. The wheel build's own vcpkg install hits that cache instead of recompiling boost/tbb/etc. from source.

The image needs rebuilding when this repo's vcpkg.json, the baseline SHA in vcpkg-configuration.json, or any file under vcpkg-overlay-ports/ changes — otherwise the wheel build either misses the cache (slow) or fails on a missing port. The manylinux repo's Build workflow takes an osrmRef input for that purpose; see its README.

For local source builds outside the manylinux image, install vcpkg yourself, point CMake at its toolchain, and use the release-only triplet to match the cache:

bash
git clone https://github.com/microsoft/vcpkg
+./vcpkg/bootstrap-vcpkg.sh
+export VCPKG_ROOT=$PWD/vcpkg
+export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-linux-release"

macOS

Install OSRM's C++ dependencies via Homebrew (the same set the cibuildwheel macOS before-all uses; all ship CMake config files so the find_package(... CONFIG REQUIRED) calls in CMakeLists.txt resolve without a toolchain file):

bash
brew install lua tbb boost@1.90 fmt rapidjson sol2 flatbuffers \
+             protozero libosmium
+brew link boost@1.90

Windows

Windows uses vcpkg in manifest mode for OSRM's C++ dependencies. Clone and bootstrap it, then export VCPKG_ROOT:

powershell
git clone https://github.com/microsoft/vcpkg
+.\vcpkg\bootstrap-vcpkg.bat
+$env:VCPKG_ROOT = "$PWD\vcpkg"

Pass the toolchain to CMake at build time via CMAKE_ARGS (see below).

Building locally

A standard pip install -e . works, but by default pip uses PEP 517 isolated builds — each invocation creates a temporary directory, compiles everything, then discards it. This means OSRM is recompiled from scratch every time.

Use --no-build-isolation to make scikit-build-core reuse the persistent build directory (build/{wheel_tag}/) across runs:

bash
# Linux / macOS
+pip install -e . --no-build-isolation
+
+# Windows (PowerShell) — VCPKG_ROOT must be set, see Platform-specific
+# build requirements
+$env:CMAKE_ARGS = "-DCMAKE_TOOLCHAIN_FILE=$env:VCPKG_ROOT\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-static-md"
+pip install -e . --no-build-isolation

The first run is slow (full OSRM compile). Subsequent runs only recompile changed binding files.

Keep config flags identical across runs

scikit-build-core hashes its configuration to detect changes. If the flags differ between runs, it wipes the build directory and starts from scratch.

Generator mismatch

CMake records the generator in CMakeCache.txt. If you ever see Does not match the generator used previously, delete the build directory and rebuild from scratch:

powershell
Remove-Item -Recurse -Force build/cp312-abi3-win_amd64

Building a wheel

After the editable install has compiled everything, produce a wheel without recompiling:

bash
# Linux / macOS
+pip wheel . --no-build-isolation -w dist
+
+# Windows (PowerShell) — uses the same CMAKE_ARGS as the editable install above
+pip wheel . --no-build-isolation -w dist

CMake finds the existing artifacts in the build directory and skips recompilation. The wheel lands in dist/.

Wheel repair

Locally built wheels link against system shared libraries and are tagged as linux_x86_64 (not manylinux). To make them portable or to inspect their dependencies, use the platform-specific repair tools:

Linuxauditwheel:

bash
pip install auditwheel
+auditwheel show dist/*.whl          # inspect shared library dependencies
+auditwheel repair -w dist dist/*.whl # bundle libs and retag as manylinux

macOSdelocate:

bash
pip install delocate
+delocate-listdeps dist/*.whl        # inspect dependencies
+delocate-wheel -w dist dist/*.whl   # bundle dylibs

Windowsdelvewheel:

bash
pip install delvewheel
+delvewheel show dist/*.whl          # inspect dependencies
+delvewheel repair -w dist dist/*.whl

On Windows, vcpkg's shared DLLs (tbb12.dll, hwloc.dll — TBB is shared even under the static-md triplet) live in build\<wheel-tag>\vcpkg_installed\x64-windows-static-md\bin\. Pass that to delvewheel via --add-path so it can resolve and bundle them:

powershell
delvewheel repair --analyze-existing-exes `
+    --add-path build\cp312-abi3-win_amd64\vcpkg_installed\x64-windows-static-md\bin `
+    --add-dll hwloc.dll --no-mangle tbb12.dll --no-mangle hwloc.dll `
+    -w dist dist\*.whl

TIP

cibuildwheel runs wheel repair automatically in CI. You only need these commands when building wheels locally for distribution.

Compiler cache

On Linux and macOS, ccache is used automatically (pre-installed in the manylinux image; installed via Homebrew for macOS CI).

On Windows, scikit-build-core defaults to the Visual Studio generator, which does not support CMAKE_CXX_COMPILER_LAUNCHER. The build dir reuse from --no-build-isolation is the main speed optimisation for local Windows development.

Running tests

Build the test data (requires the package to be installed so the osrm executables are available):

bash
# Linux / macOS
+cd test/data && make
+
+# Windows
+cd test\data && windows-build-test-data.bat

Load the shared memory datastore:

bash
python -m osrm datastore test/data/ch/monaco

Run the test suite:

bash
pytest test/python/

Running cibuildwheel locally

cibuildwheel builds wheels inside isolated environments that closely match CI. Install it with:

bash
pip install cibuildwheel

Build for the current platform:

bash
cibuildwheel --platform linux    # requires Docker on non-Linux hosts
+cibuildwheel --platform macos
+cibuildwheel --platform windows

Wheels land in wheelhouse/.

Windows note: the toolchain wiring (CMAKE_TOOLCHAIN_FILE, VCPKG_TARGET_TRIPLET) lives in [tool.cibuildwheel.windows].environment in pyproject.toml, where $VCPKG_ROOT is expanded at build time from the host environment. Make sure VCPKG_ROOT is set in your shell before invoking cibuildwheel.

Linux note: the wheel build inside the manylinux container reads VCPKG_ROOT and VCPKG_DEFAULT_BINARY_CACHE from the image's ENV, so no toolchain forwarding is needed from the host. If you override CIBW_ENVIRONMENT_LINUX to mount a host ccache, remember it replaces (not merges with) [tool.cibuildwheel.linux].environment in pyproject.toml — re-include LD_LIBRARY_PATH and the CMAKE_ARGS line verbatim:

bash
CIBW_CONTAINER_ENGINE="docker; create_args: --volume /tmp/ccache:/ccache" \
+CIBW_ENVIRONMENT_LINUX='LD_LIBRARY_PATH=/usr/local/lib64:${LD_LIBRARY_PATH} CCACHE_DIR=/ccache CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-linux-release"' \
+cibuildwheel --platform linux

Type stubs

src/python/osrm/osrm_ext.pyi is auto-generated by nanobind_add_stub() at build time and committed to the repository so documentation tools can work without compiling the extension.

After changing C++ bindings, rebuild and commit the updated stub:

bash
pip install -e . --no-build-isolation   # regenerates the .pyi
+git add src/python/osrm/osrm_ext.pyi

To regenerate manually without a full rebuild:

bash
pip install nanobind ruff
+python -m nanobind.stubgen -m osrm.osrm_ext -o src/python/osrm/osrm_ext.pyi
+ruff format src/python/osrm/osrm_ext.pyi

Releasing

Releases are driven by the monthly release workflow (.github/workflows/release-monthly.yml), not by pushing a tag by hand. The workflow bumps the version, creates the tag, drives CI, downloads the built wheels, and publishes to both PyPI and npm in one shot.

Scheduled monthly release

A cron on the 1st of each month at 08:00 UTC runs the workflow against master:

  1. Compute the next version as (YYYY-2000).M.patchlevel (e.g. 26.4.0).
  2. Bump package.json + package-lock.json, commit, create annotated tag v<version>, push branch and tag.
  3. Dispatch osrm-backend.yml on the tag. That run builds wheels + sdist via cibuildwheel and uploads them as wheels-* artifacts.
  4. Wait for the dispatched CI run to finish with conclusion success.
  5. Run the publish job: download every wheels-* artifact into dist/, publish to PyPI via trusted publisher (OIDC), then npm publish.

If PyPI fails, the npm publish still runs (the npm steps have if: ${{ !cancelled() }}), and the overall job is marked failed so the PyPI problem stays visible.

Manual release

Trigger the workflow from the Actions UI or gh workflow run release-monthly.yml with optional inputs:

  • version_override — set the version explicitly (e.g. 26.4.1) instead of using the (YYYY-2000).M.patchlevel calculation.
  • branch — release from a branch other than master.

Verification

After the run finishes, check:

Version mechanics

pyproject.toml uses setuptools-scm with local_scheme = "no-local-version". On a tag checkout (e.g. v26.4.0), the Python version resolves cleanly to 26.4.0, matching the package.json version that release-monthly.yml committed when creating the tag.

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/releasing.html b/docs/v26.5.0/releasing.html new file mode 100644 index 0000000..53bd46e --- /dev/null +++ b/docs/v26.5.0/releasing.html @@ -0,0 +1,25 @@ + + + + + + Releasing a new OSRM version | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Releasing a new OSRM version

We use a unified semver versioning scheme for monthly releases: (YYYY-2000).M.patchlevel

  • Format: X.M.patchlevel where X = year - 2000, M = month (1-12, no leading zeros)
  • Example: 26.4.0 represents April 2026, first release
  • Git tags: Prefixed with v (e.g., v26.4.0)
  • npm packages: Unprefixed semver (e.g., 26.4.0)

Version History

Previous scheme (ended 2025): Traditional semantic versioning (v6.0, v6.0.1, v6.0.2, etc.)

  • Last release: v6.0.0 in December 2025
  • Manual release process

New scheme (started 2026): Monthly date-based versioning with automated releases

  • First release: v26.1.0 (January 2026)
  • Automatic monthly releases on the 1st of each month at 08:00 UTC
  • Year offset: 2026 → 26, 2027 → 27, etc.
  • Month: 1-12 (no leading zeros), patch: 0-N per month

Versioning Scheme

Format

Git tags: vX.M.patchlevel where X = year - 2000, M = 1-12

  • X: Year offset (26 = 2026, 27 = 2027, etc.)
  • M: Month (1-12, no leading zeros)
  • patchlevel: Incremental counter starting at 0 per month (0, 1, 2, ...)

npm packages: X.M.patchlevel (same as git tag without the v prefix)

Examples

Git tags and npm versions for the same release:

  • April 2026, 1st release: Git tag v26.4.0, npm 26.4.0
  • April 2026, 2nd release: Git tag v26.4.1, npm 26.4.1
  • May 2026, 1st release: Git tag v26.5.0, npm 26.5.0
  • January 2027, 1st release: Git tag v27.1.0, npm 27.1.0

Release Compatibility Guarantees

Patch version change (new patchlevel in same month)

  • No change of query parameters or response formats
  • Compatible HTTP API
  • Compatible C++ library API
  • Compatible node-osrm API
  • Compatible OSRM datasets

Month change (new YYYY-MM)

  • May introduce forward-compatible changes: query parameters and response properties may be added in responses, but existing properties may not be changed or removed
  • Forward-compatible HTTP API
  • Forward-compatible C++ library API
  • Forward-compatible node-osrm API
  • No compatibility between OSRM datasets (needs new processing)

Conventional Commits

Pull request titles must follow Conventional Commits format with types: feat, fix, docs, style, refactor, perf, test, ci, chore, build. This is validated in CI and helps organize the commit history.

Breaking changes should be indicated with the ! suffix in the PR title (e.g., feat!: remove deprecated API) so they are called out in release notes.

Release Management

  • The master branch is for development and should always be green
  • Automated monthly releases occur on the 1st of each month at 08:00 UTC
  • All changes in master will be automatically released monthly
  • No release candidates are used; the master branch is the quality gate
  • Patch versions within the same month can be released manually at any time

Automated Release Process

Releases are created automatically every month on a scheduled basis:

  1. A GitHub Actions workflow runs on the 1st of each month at 08:00 UTC
  2. Version is calculated as (YYYY-2000).M.patchlevel with M = 1-12 (no leading zeros)
  3. package.json and package-lock.json versions are updated
  4. A git tag is created and pushed (e.g., v26.4.0)
  5. A GitHub Release is published with auto-generated release notes
  6. The package is published to npm (format: 26.4.0 without v prefix)

Manual Release Trigger

You can also trigger a release manually on any branch:

  1. Go to ActionsMonthly Release workflow
  2. Click Run workflow
  3. Select your branch (defaults to master)
  4. Optionally override the version (format: X.M.patchlevel with M = 1-12, e.g., 26.4.0)
  5. Click Run workflow

This is useful for:

  • Out-of-schedule patch releases within the same month
  • Emergency releases from other branches
  • Backports to older versions

Release Checklist

When releasing (automated or manual):

  1. ✅ All GitHub Actions CI checks pass
  2. ✅ The target branch is in a releasable state
  3. ✅ For manual releases: verify the version format is correct (X.M.patchlevel with month 1-12, e.g., 26.4.0)
  4. ✅ The release is created automatically with:
    • Git tag
    • GitHub Release (with auto-generated release notes)
    • npm publication

After Release

No additional manual steps are required. The automated workflow handles:

  • Version bumping in package.json
  • Git commit and tag creation
  • GitHub Release publishing
  • npm package publication

For non-automated releases, monitor:

  • GitHub Actions to verify the release completed successfully
  • npm registry to confirm the new version is published
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/routed.html b/docs/v26.5.0/routed.html new file mode 100644 index 0000000..2edc319 --- /dev/null +++ b/docs/v26.5.0/routed.html @@ -0,0 +1,25 @@ + + + + + + OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Environment Variables

SHM_LOCK_DIR

If the SHM_LOCK_DIR environment variable is set, OSRM will use it as the directory for shared memory lock files instead of the system temporary directory. This is useful in containerized environments (Docker/Kubernetes) where the lock file directory should persist across container restarts when loading from shared memory.

SIGNAL_PARENT_WHEN_READY

If the SIGNAL_PARENT_WHEN_READY environment variable is set osrm-routed will send the USR1 signal to its parent when it will be running and waiting for requests. This could be used to upgrade osrm-routed to a new binary on the fly without any service downtime - no incoming requests will be lost.

DISABLE_ACCESS_LOGGING

If the DISABLE_ACCESS_LOGGING environment variable is set osrm-routed will not log any http requests to standard output. This can be useful in high traffic setup.

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/testing.html b/docs/v26.5.0/testing.html new file mode 100644 index 0000000..badc876 --- /dev/null +++ b/docs/v26.5.0/testing.html @@ -0,0 +1,205 @@ + + + + + + Testsuite | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Testsuite

OSRM comes with a testsuite containing both unit-tests using the Boost library and cucumber.js for scenario driven testing.

Unit Tests

For a general introduction on Boost.Test have a look at its docs.

Separate Test Binaries

Unit tests should be registered according to the sub-project they're in. If you want to write tests for utility functions, add them to the utility test binary. See CMakeLists.txt in the unit test directory for how to register new unit tests.

Using Boost.Test Primitives

There is a difference between only reporting a failed condition and aborting the test right at a failed condition. Have a look at BOOST_CHECK vs BOOST_REQUIRE. Instead of manually checking e.g. for equality, less than, if a function throws etc. use their corresponding Boost.Test primitives.

If you use BOOST_CHECK_EQUAL you have to implement operator<< for your type so that Boost.Test can print mismatches. If you do not want to do this, define BOOST_TEST_DONT_PRINT_LOG_VALUE (and undef it after the check call) or sidestep it with BOOST_CHECK(fst == snd);.

Test Fixture

If you need to test features on a real dataset (think about this twice: prefer cucumber and dataset-independent tests for their reproducibility and minimality), there is a fixed dataset in test/data. This dataset is a small extract and may not even contain all tags or edge cases. Furthermore this dataset is not in sync with what you see in up-to-date OSM maps or on the demo server. See the library tests for how to add new dataset dependent tests.

To prepare the test data simply cd test/data/ and then run make.

Running Tests

To build the unit tests:

cd build
+cmake ..
+make tests

You should see the compiled binaries in build/unit_tests, you can then run each suite individually:

./engine-tests

Cucumber

For a general introduction on cucumber in our testsuite, have a look at the wiki.

This documentation aims to supply a guideline on how to write cucumber tests that test new features introduced into osrm.

Test the feature

It is often tempting to reduce the test to a path and accompanying instructions. Instructions can and will change over the course of improving guidance.

Instructions should only be used when writing a feature located in features/guidance. All other features should avoid using instructions at all.

Write Tests to Scale

OSRM is a navigation engine. Tests should always consider this context.

An important implication is the grid size. If tests use a very small grid size, you run into the chance of instructions being omitted. For example:

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b c d
+        """
+
+    And the ways
+        | nodes | highway |
+        | ab    | primary |
+        | bc    | primary |
+        | cd    | primary |
+
+    When I route I should get
+        | from | to | route       |
+        | a    | d  | ab,bc,cd,cd |

In a navigation engine, the instructions

  • depart east on ab
  • in 10 meters the road name changes to bc
  • in 10 meters the road name changes to cd
  • you arrived at cd

would be impossible to announce and not helpful at all. Since no actual choices exist, the route you get could result in ab,cd and simply say depart and arrive.

To prevent such surprises, always consider the availability of other roads and use grid sizes/road lengths that correspond to actually reasonable scenarios in a road network.

Use names

If you specify many nodes in close succession to present a specific road geometry, consider using name to indicate to OSRM that the segment is a single road.

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b c d
+        """
+
+    And the ways
+        | nodes | highway | name |
+        | ab    | primary | road |
+        | bc    | primary | road |
+        | cd    | primary | road |
+
+    When I route I should get
+        | from | to | route     | turns         |
+        | a    | d  | road,road | depart,arrive |

Guidance guarantees only essential maneuvers. You will always see depart and arrive as well as all turns that are not obvious.

So the following scenario does not change the instructions

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b
+        d c
+        """
+
+    And the ways
+        | nodes | highway | name |
+        | ab    | primary | road |
+        | bc    | primary | road |
+        | cd    | primary | road |
+
+    When I route I should get
+        | from | to | route     | turns         |
+        | a    | d  | road,road | depart,arrive |

but if we modify it to

Background:
+    Given the profile "car"
+    Given a grid size of 10 meters
+
+Scenario: Testbot - Straight Road
+    Given the node map
+        """
+        a b e
+        d c
+        """
+
+    And the ways
+        | nodes | highway | name |
+        | ab    | primary | road |
+        | bc    | primary | road |
+        | cd    | primary | road |
+        | be    | primary | turn |
+
+    When I route I should get
+        | from | to | route          | turns                        |
+        | a    | d  | road,road,road | depart,continue right,arrive |

Test all directions

Modelling a road as roundabout has an implied oneway tag associated with it. In the following case, we can route from a to d but not from d to a. To discover those errors, make sure to check for all allowed directions.

Scenario: Enter and Exit mini roundabout with sharp angle   # features/guidance/mini-roundabout.feature:37
+    Given the profile "car"                                   # features/step_definitions/data.js:8
+    Given a grid size of 10 meters                            # features/step_definitions/data.js:20
+    Given the node map                                        # features/step_definitions/data.js:45
+        """
+        a b
+          c d
+        """
+    And the ways                                              # features/step_definitions/data.js:128
+        | nodes | highway         | name |
+        | ab    | tertiary        | MySt |
+        | bc    | roundabout      |      |
+        | cd    | tertiary        | MySt |
+    When I route I should get                                 # features/step_definitions/routing.js:4
+        | from | to | route     | turns         | #                                               |
+        | a    | d  | MySt,MySt | depart,arrive | # suppress multiple enter/exit mini roundabouts |
+        | d    | a  | MySt,MySt | depart,arrive | # suppress multiple enter/exit mini roundabouts |
+    Tables were not identical:
+        |  from |     to |     route     |     turns         |     #
+        |     a |      d |     MySt,MySt |     depart,arrive |     # suppress multiple enter/exit mini roundabouts |
+        | (-) d |  (-) a | (-) MySt,MySt | (-) depart,arrive | (-) # suppress multiple enter/exit mini roundabouts |
+        | (+) d |  (+) a | (+)           | (+)               | (+) # suppress multiple enter/exit mini roundabouts |

Prevent Randomness

Some features in OSRM can result in strange experiences during testcases. To prevent some of these issues, follow the guidelines below.

Use Waypoints

Using grid nodes as waypoints offers the chance of unwanted side effects. OSRM converts the grid into a so called edge-based graph.

Scenario: Testbot - Intersection
+    Given the node map
+        """
+          e
+        b a d
+          c
+        """
+
+    And the ways
+        | nodes | highway | oneway |
+        | ab    | primary | yes    |
+        | ac    | primary | yes    |
+        | ad    | primary | yes    |
+        | ae    | primary | yes    |

Selecting a as a waypoint results in four possible starting locations. Which one of the routes a,b, a,c, a,d, or a,e is found is pure chance and depends on the order in the static r-tree.

To guarantee discovery, use:

Scenario: Testbot - Intersection
+    Given the node map
+        """
+            e
+            4
+        b 1 a 3 d
+            2
+            c
+        """
+
+    And the ways
+        | nodes | highway | oneway |
+        | ab    | primary | yes    |
+        | ac    | primary | yes    |
+        | ad    | primary | yes    |
+        | ae    | primary | yes    |

And use 1,2,3, and 4 as starting waypoints. The routes 1,b, 2,c, 3,d, and 4,e can all be discovered.

Allow For Small Offsets

Whenever you are independent of the start location (see use waypoints), the waypoint chosen as start/end location can still influence distances/durations.

If you are testing for a duration metric, allow for a tiny offset to ensure a passing test in the presence of rounding/snapping issues.

Don't Rely on Alternatives

Alternative route discovery is a random feature in itself. The discovery of routes depends on the contraction order of roads and cannot be assumed successful, ever.

Understanding Turn Restrictions

Adding turn restrictions requires the restriction to follow a very specific format.

We specify them in a table with the header | type | way:from | way:to | node:via | restriction |. It is important that turn restrictions require micro segmentation.

Consider the following scenario:

Given the node map:
+    """
+          e
+          |
+    a - - b - - c
+          |
+          d
+    """
+
+And the ways
+    | nodes | oneway |
+    | abc   | yes    |
+    | ebd   | yes    |
+
+And the relations
+    | type        | way:from | way:to | node:via | restriction   |
+    | restriction | abc      | ebd    | b        | no_right_turn |

The setting looks perfectly fine at first glance. However, it is not well defined. The forbidden right turn could be either a superfluous addition, forbidding the turn cb to be, or actually refer to the turn ab to bd to say that a turn is forbidden here.

To model turn-restrictions correctly and uniquely, we need to split segments that contribute to the restriction into the smallest possible parts. E.g. the above scenario could correctly be expressed as:

Given the node map:
+    """
+          e
+          |
+    a - - b - - c
+          |
+          d
+    """
+
+And the ways
+    | nodes | oneway | name |
+    | ab    | yes    | abc  |
+    | bc    | yes    | abc  |
+    | eb    | yes    | ebd  |
+    | bd    | yes    | ebd  |
+
+And the relations
+    | type        | way:from | way:to | node:via | restriction   |
+    | restriction | ab       | bd     | b        | no_right_turn |

Unless this format is used, OSRM will omit the (then ambiguous) turn restrictions and ignore them.

My Guidance Tests are Failing - Understanding what you can change

If you change some stuff in guidance, you will easily see tests change their result. E.g. if you change the angles for which we report right, then obviously some tests might not report a direction modifier named right anymore.

This small section will try to guide you in making the correct decisions for changing the behaviour of tests.

The difficulty in guidance tests is that not all items can be translated 1:1 from the ascii art into turn-angles.

The turn-angle calculation tries to find turn angles that would represent perceived turn angles, not the exact angle at the connection.

This is necessary, since connections in OSM are always bound by the paradigm that the way is supposed to be in the middle of the actual road. For broad streets, you will see stronger angles than the actual turns.

Don't change the test, change the expected behaviour

If we have a test that looks like this:

Given a grid size of 5 m
+Given the node map
+"""
+a - b - - - - - - c
+     \  
+      d - - - - - e
+"""
+
+When I route I should get
+ | waypoints | route       | turns                          |
+ | a,e       | abc,bde,bde | depart,turn slight right,arrive|

And the test reports turn right for the route a->e, where before it said slight right.

If you change the turn angles, obviously you can expect changes in the distinction between slight right and right. In such a case it is, of course, reasonable to change the expected route to report right instead of slight right. You should consider inspecting the actual turn angles at b to see if you feel that change is justified.

However, you should never adjust the test itself. If you look at a failure, the other way around

Given a grid size of 5 m
+Given the node map
+"""
+a - b - - - - - - c
+     \  
+      d - - - - - e
+"""
+
+When I route I should get
+ | waypoints | route       | turns                   |
+ | a,e       | abc,bde,bde | depart,turn right,arrive|

where we see a slight right, over the expected right. We could be tempted to adjust the grid size (e.g. from 10 m to 20 meters).

Such a change would fundamentally alter the tests, though. Since the part b-d is a short offset, when we are looking at a grid of size 5 m, the angle calculation will try and compensate for this offset.

In this case we would see a very slight turn angle. If your change now reports different turn angles, you can of course change the expected result. But you should not adjust the grid size. The test would be testing turn angles of 180 and 100 degrees, instead of 180 and 160.

Consider Post-Processing Impacts

Some changes you might see could look completely unrelated. To understand the impact of your changes, you can make use of the debugging utilities you can find in util/debug.hpp (and potentially other related headers).

If your test is inspecting a series of turns (remember, a turn does not necessarily equals an instruction), you could see interaction with post-processing. To see the unprocessed turns, you should print the steps at the end of step assembly (assembleSteps in engine/guidance/assemble_steps.hpp).

If you see unexpected changes, you can consider adding the locations field to your test to study what location a turn is reported at.

To study a test without post-processing impacts, you can create a copy of the case on a very large grid (like 2000 meters). In such a grid, turn collapsing would be essentially disabled.

Sadly, there is no general guideline.

Use Caution

If in doubt, ask another person. Inspect as much of the data as possible (e.g. print un-collapsed steps, turn angles and so on) and use your best judgement, if the new result seems justified.

+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/tools.html b/docs/v26.5.0/tools.html new file mode 100644 index 0000000..d3ff405 --- /dev/null +++ b/docs/v26.5.0/tools.html @@ -0,0 +1,34 @@ + + + + + + Command-Line Tools | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Command-Line Tools

OSRM ships six command-line tools that cover the full data pipeline, from raw OSM data to a running routing server. All tools share a set of common options described below, followed by per-tool reference sections.

Common Options

These flags are accepted by every tool.

FlagShortDescription
--help-hShow the help message and exit.
--version-vShow the version string and exit.
--verbosity <level>-lLog verbosity: NONE, ERROR, WARNING, INFO (default), DEBUG.
--list-inputsPrint all required and optional input file extensions the tool expects, then exit. Useful for deployment scripts.
--threads <n>-tNumber of threads to use (default: number of logical CPUs).

--list-inputs

Prints one line per file in the format required|optional <extension>:

$ osrm-routed --list-inputs
+required .osrm.datasource_names
+required .osrm.ebg_nodes
+required .osrm.edges
+...
+optional .osrm.hsgr
+optional .osrm.cells

Example — collect all files needed to deploy osrm-routed:

bash
BASE=map
+for line in $(osrm-routed --list-inputs); do
+    echo "$BASE$line"
+done

osrm-extract

Reads an OSM file and a Lua profile, and produces the intermediate .osrm.* files consumed by the graph-preparation tools.

osrm-extract <input.osm/.osm.bz2/.osm.pbf> [options]
FlagShortDefaultDescription
--profile <path>-pprofiles/car.luaPath to the Lua routing profile.
--output <path>-oDerived from input filenameBase path for generated output files.
--data_version <string>-d(none)Tag the dataset with a version string. Use osmosis to read the timestamp embedded in the PBF file.
--small-component-size <n>1000Minimum node count for a strongly-connected component to be treated as "large". Affects nearest-neighbor snapping.
--with-osm-metadataParse OSM metadata (user, timestamp, etc.). May reduce extraction performance.
--parse-conditional-restrictionsSave conditional turn restrictions to disk so they can be evaluated during contraction.
--location-dependent-data <file>GeoJSON files containing location-dependent data (e.g. speed limits by region). Repeatable.
--disable-location-cacheDisable the internal node-location cache used for location-dependent data lookups.
--dump-nbg-graphWrite the raw node-based graph to the .osrm file for debugging.

osrm-partition

Partitions the road network graph into a hierarchy of cells used by the Multi-Level Dijkstra (MLD) algorithm.

osrm-partition <input.osrm> [options]
FlagDefaultDescription
--max-cell-sizes <list>128,4096,65536,2097152Comma-separated maximum cell sizes per level, starting from level 1. The first value is also the bisection termination threshold.
--balance <factor>1.2Maximum allowed size ratio between the two sides of a single bisection.
--boundary <fraction>0.25Fraction of nodes to use as boundary sources/sinks during contraction.
--optimizing-cuts <n>10Number of candidate cuts evaluated when optimizing a single bisection.
--small-component-size <n>1000Node-count threshold below which a component is treated as small.

osrm-customize

Applies live traffic data (speed and turn-penalty files) to a partitioned MLD graph. Can be run repeatedly without re-partitioning when speeds change.

osrm-customize <input.osrm> [options]
FlagDefaultDescription
--segment-speed-file <file>CSV with nodeA,nodeB,speed columns to override edge weights. Repeatable.
--turn-penalty-file <file>CSV with from_node,via_node,to_node,penalty to override turn weights. Repeatable.
--edge-weight-updates-over-factor <x>0 (disabled)Log edges whose weight changed by more than factor x (requires --segment-speed-file).
--parse-conditionals-from-now <utc_timestamp>0 (disabled)UTC Unix timestamp from which to evaluate conditional turn restrictions.
--time-zone-file <file>GeoJSON file with time-zone boundaries, required for conditional restriction parsing.

osrm-contract

Builds a Contraction Hierarchy (CH) from the extracted graph. Use this instead of osrm-partition + osrm-customize when you don't need live traffic updates.

osrm-contract <input.osrm> [options]
FlagDefaultDescription
--segment-speed-file <file>CSV with nodeA,nodeB,speed columns to override edge weights. Repeatable.
--turn-penalty-file <file>CSV with from_node,via_node,to_node,penalty to override turn weights. Repeatable.
--edge-weight-updates-over-factor <x>0 (disabled)Log edges whose weight changed by more than factor x.
--parse-conditionals-from-now <utc_timestamp>0 (disabled)UTC Unix timestamp for evaluating conditional turn restrictions.
--time-zone-file <file>GeoJSON file with time-zone boundaries, required for conditional restriction parsing.

osrm-routed

The HTTP server. Loads a prepared dataset and serves the OSRM HTTP API.

osrm-routed <base.osrm> [options]

Server

FlagShortDefaultDescription
--ip <address>-i0.0.0.0IP address to listen on.
--port <n>-p5000TCP port to listen on.
--keepalive-timeout <s>-k5HTTP keep-alive timeout in seconds.
--trialStart up fully, then exit immediately. Useful to validate a dataset without serving traffic.

Data loading

FlagShortDefaultDescription
--algorithm <name>-aCHRouting algorithm: CH (Contraction Hierarchy) or MLD (Multi-Level Dijkstra).
--shared-memory-soffLoad data from a shared memory region managed by osrm-datastore.
--mmap-moffMemory-map the data files instead of loading them into RAM.
--dataset-name <name>Shared memory dataset name to connect to (used with --shared-memory).
--disable-feature-dataset <name>Skip loading an optional dataset to save memory. Options: ROUTE_STEPS, ROUTE_GEOMETRY.

Query limits

FlagDefaultDescription
--max-viaroute-size <n>500Maximum number of waypoints in a route query.
--max-trip-size <n>100Maximum number of locations in a trip query.
--max-table-size <n>100Maximum number of locations in a table query.
--max-matching-size <n>100Maximum number of locations in a map-matching query.
--max-nearest-size <n>100Maximum number of results in a nearest query.
--max-alternatives <n>3Maximum number of alternative routes (MLD only).
--max-matching-radius <m>-1 (unlimited)Maximum search radius in metres for map-matching.
--default-radius <m>-1 (unlimited)Default snap radius for all queries.
--max-header-size <bytes>0 (auto)Maximum HTTP header size in bytes.

osrm-datastore

Loads a prepared dataset into shared memory so that one or more osrm-routed processes can serve it with zero-copy access. Enables live traffic updates without restarting the server.

osrm-datastore [options] <base.osrm>
FlagShortDefaultDescription
--dataset-name <name>Name for this dataset in shared memory. Allows multiple datasets to coexist.
--max-wait <s>-1 (unlimited)Seconds to wait for a running update to finish before forcibly acquiring the lock.
--only-metricReload only the metric (weights/durations) without replacing the full dataset. Optimized for frequent traffic updates.
--disable-feature-dataset <name>Skip loading an optional dataset. Options: ROUTE_STEPS, ROUTE_GEOMETRY.
--remove-locks-rRemove stale shared-memory locks and exit.
--spring-clean-sRemove all OSRM shared memory regions and exit.
--listList all datasets currently loaded in shared memory.
--list-blocksList all shared memory blocks currently in use.
+ + + + \ No newline at end of file diff --git a/docs/v26.5.0/vp-icons.css b/docs/v26.5.0/vp-icons.css new file mode 100644 index 0000000..ddc5bd8 --- /dev/null +++ b/docs/v26.5.0/vp-icons.css @@ -0,0 +1 @@ +.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")} \ No newline at end of file diff --git a/docs/v26.5.0/windows-deps.html b/docs/v26.5.0/windows-deps.html new file mode 100644 index 0000000..26c38ce --- /dev/null +++ b/docs/v26.5.0/windows-deps.html @@ -0,0 +1,28 @@ + + + + + + Building OSRM for Windows | OSRM API Documentation + + + + + + + + + + + + + + +
Skip to content

Building OSRM for Windows

There is experimental support for building OSRM on Windows.

Dependencies

You will need a modern Windows development stack (e.g. Visual Studio 17). The published binaries are built with Windows Server 2025 Github hosted runners.

Dependencies are managed via vcpkg in manifest mode (see vcpkg.json at the repo root). The baseline commit is pinned in vcpkg-configuration.json.

Prerequisites

  1. Install Visual Studio 2022 with the "Desktop development with C++" workload.
  2. Clone vcpkg and bootstrap it:
bat
git clone https://github.com/microsoft/vcpkg.git C:\vcpkg
+C:\vcpkg\bootstrap-vcpkg.bat
+set VCPKG_ROOT=C:\vcpkg

Building

From a x64 Native Tools Command Prompt for VS 2022 at the repo root:

bat
cmake --preset ci-windows -DENABLE_NODE_BINDINGS=ON
+cmake --build --preset ci-windows

The first configure will build every dependency from source, which takes a while. Subsequent configures reuse vcpkg's binary cache.

+ + + + \ No newline at end of file