[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-navigation":3,"docs-page-security-headers":166},[4,38,57,65,114,138,157],{"id":5,"group":6,"pages":7},"get-started","Get started",[8,13,18,23,28,33],{"path":9,"title":10,"description":11,"navTitle":10,"group":6,"order":12},"\u002Fdocs\u002Fgetting-started","Getting started","Create your app from the kit, run it locally with no credentials, make yourself superadmin and find where your own code goes.",1,{"path":14,"title":15,"description":16,"navTitle":15,"group":6,"order":17},"\u002Fdocs\u002Flayout","Project structure","Where code lives by where it runs, and which server\u002F directories turn a new file into a route, a job or a provider.",2,{"path":19,"title":20,"description":21,"navTitle":20,"group":6,"order":22},"\u002Fdocs\u002Fconfiguration","Configuration","starter.config.ts switches each part of the kit and its providers, environment variables hold the secrets: every key and what it changes.",3,{"path":24,"title":25,"description":26,"navTitle":25,"group":6,"order":27},"\u002Fdocs\u002Ftemplate","Updating from the kit","Keep the kit as a git remote and take each update as one commit you review, with pnpm template:update, then resolve what conflicts.",4,{"path":29,"title":30,"description":31,"navTitle":30,"group":6,"order":32},"\u002Fdocs\u002Fdeployment","Deployment","Ship the app as one Cloudflare Worker: create the resources, set the secrets, deploy main from GitHub Actions or your machine.",5,{"path":34,"title":35,"description":36,"navTitle":35,"group":6,"order":37},"\u002Fdocs\u002Fmcp","MCP server","Connect Claude Code, Cursor or VS Code to https:\u002F\u002Fnuxter.app\u002Fmcp, so your agent searches and reads these docs and their design notes.",6,{"id":39,"group":40,"pages":41},"accounts","Accounts",[42,47,52],{"path":43,"title":44,"description":45,"navTitle":44,"group":40,"order":46},"\u002Fdocs\u002Fauth","Auth","Pick the sign-in methods, add an OAuth provider, protect a route, and handle sessions, second factors and account deletion.",7,{"path":48,"title":49,"description":50,"navTitle":49,"group":40,"order":51},"\u002Fdocs\u002Ftenancy","Organizations","Scope routes and pages to an organization, and work with its members, roles, seats, invitations and a second level such as branches.",8,{"path":53,"title":54,"description":55,"navTitle":54,"group":40,"order":56},"\u002Fdocs\u002Fpermissions","Roles and permissions","Routes check permissions that an account’s role or its organization’s plan grants: checking one, adding a role, and the staff tools.",9,{"id":58,"group":59,"pages":60},"payments","Payments",[61],{"path":62,"title":59,"description":63,"navTitle":59,"group":59,"order":64},"\u002Fdocs\u002Fpayments","Sell plans through Stripe, Polar, Lemon Squeezy or Creem: define plans, connect a provider, gate features, trials, coupons and refunds.",10,{"id":66,"group":67,"pages":68},"building-blocks","Building blocks",[69,74,79,84,89,94,99,104,109],{"path":70,"title":71,"description":72,"navTitle":71,"group":67,"order":73},"\u002Fdocs\u002Fdatabase","Database","Postgres through Drizzle, on Hyperdrive in production and PGlite locally: add a table, query, transactions, migrations and seed data.",11,{"path":75,"title":76,"description":77,"navTitle":76,"group":67,"order":78},"\u002Fdocs\u002Fbackground-jobs","Background jobs","Run work after the response on Cloudflare Queues with retries: add and enqueue a job, run jobs locally, and schedule cron tasks.",12,{"path":80,"title":81,"description":82,"navTitle":81,"group":67,"order":83},"\u002Fdocs\u002Fevents","Events","React to what the kit does by adding a file to server\u002Flisteners\u002F, fire events of your own, and look up every event’s payload.",13,{"path":85,"title":86,"description":87,"navTitle":86,"group":67,"order":88},"\u002Fdocs\u002Femail","Email","Set up sending, send your own mail with deliverEmail, change the templates and wording, handle unsubscribes and add a provider.",14,{"path":90,"title":91,"description":92,"navTitle":91,"group":67,"order":93},"\u002Fdocs\u002Fcontact","Contact","A \u002Fcontact page that mails you a message or shows your address after a Turnstile check: choose the channels, set the address, know the limits.",15,{"path":95,"title":96,"description":97,"navTitle":96,"group":67,"order":98},"\u002Fdocs\u002Fnotifications","Notifications","The dashboard bell: add a notification type, send one with notify(), and how categories, opt-outs and retention apply.",16,{"path":100,"title":101,"description":102,"navTitle":101,"group":67,"order":103},"\u002Fdocs\u002Fstorage","Storage","Uploads in R2 with one policy per purpose: add a purpose, accept an upload, replace or delete a file, and serve it to its owner.",17,{"path":105,"title":106,"description":107,"navTitle":106,"group":67,"order":108},"\u002Fdocs\u002Ffeature-flags","Feature flags","Declare typed flags in starter.config.ts, read them with flag() or useFlag(), roll them out by rule or percentage, and add a provider.",18,{"path":110,"title":111,"description":112,"navTitle":111,"group":67,"order":113},"\u002Fdocs\u002Fai","AI","Call models from server code by role: text, images, speech, transcription, embeddings and video, with provider fallbacks.",19,{"id":115,"group":116,"pages":117},"web","Web",[118,123,128,133],{"path":119,"title":120,"description":121,"navTitle":120,"group":116,"order":122},"\u002Fdocs\u002Fsecurity-headers","Security headers","The Content-Security-Policy and hardening headers on every response: allow another origin, keep tokens out of Referer, accept cross-site posts.",20,{"path":124,"title":125,"description":126,"navTitle":125,"group":116,"order":127},"\u002Fdocs\u002Frate-limiting","Rate limiting","Cap how often a caller hits a route with requireRateLimit, count only failures, space out sends, and protect the zone.",21,{"path":129,"title":130,"description":131,"navTitle":130,"group":116,"order":132},"\u002Fdocs\u002Fanalytics","Analytics","Product analytics and ad conversions sent from the server with no browser script: add an event, connect a provider, and handle consent.",22,{"path":134,"title":135,"description":136,"navTitle":135,"group":116,"order":137},"\u002Fdocs\u002Fobservability","Observability","Find a failed request by its id, send faults to Sentry or Better Stack, report an error you caught, and change the error page.",23,{"id":139,"group":140,"pages":141},"content-and-look","Content and look",[142,147,152],{"path":143,"title":144,"description":145,"navTitle":144,"group":140,"order":146},"\u002Fdocs\u002Fblog","Blog","Markdown posts with an RSS feed per language, and workflows that draft posts with an AI model and open each one as a pull request.",24,{"path":148,"title":149,"description":150,"navTitle":149,"group":140,"order":151},"\u002Fdocs\u002Flanguages","Languages","Add or remove a language, write copy in the locale files, and write code, refusals and links that follow the reader’s language.",25,{"path":153,"title":154,"description":155,"navTitle":154,"group":140,"order":156},"\u002Fdocs\u002Ftheme","Theme","Change the brand colour and font, and build dashboard sections, list pages, loading placeholders and charts that match the kit.",26,{"id":158,"group":159,"pages":160},"quality","Quality",[161],{"path":162,"title":163,"description":164,"navTitle":163,"group":159,"order":165},"\u002Fdocs\u002Ftesting","Testing","Unit tests in Node, component tests in a real Nuxt app and Playwright end to end: test a route or a component, and what CI runs.",27,{"page":167,"surround":886,"linksToKit":889},{"path":119,"title":120,"description":121,"navTitle":120,"group":116,"seo":168,"body":170},{"title":169,"description":121},"Nuxt Content-Security-Policy and security headers",{"type":171,"value":172,"toc":876},"minimark",[173,177,181,186,200,297,308,312,315,325,393,397,408,486,497,527,531,555,580,599,641,645,678,693,739,749,753,760,763,807,810,814,872],[174,175,120],"h1",{"id":176},"security-headers",[178,179,180],"p",{},"The Worker puts a Content-Security-Policy and a set of hardening headers on\nevery response it handles, and refuses API writes posted from other sites. You\nwork here when a page needs something from another origin, such as images from\na CDN or a script from a vendor.",[182,183,185],"h2",{"id":184},"how-it-works","How it works",[178,187,188,199],{},[189,190,195],"a",{"href":191,"rel":192,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Fmiddleware\u002Fsecurity-headers.ts",[193],"nofollow","Licensees only",[196,197,198],"code",{},"server\u002Fmiddleware\u002Fsecurity-headers.ts","\nruns on every request and sets:",[201,202,203,216],"table",{},[204,205,206],"thead",{},[207,208,209,213],"tr",{},[210,211,212],"th",{},"Header",[210,214,215],{},"Value",[217,218,219,233,245,257,269,281],"tbody",{},[207,220,221,227],{},[222,223,224],"td",{},[196,225,226],{},"content-security-policy",[222,228,229,230],{},"The policy below, plus ",[196,231,232],{},"security.cspExtend",[207,234,235,240],{},[222,236,237],{},[196,238,239],{},"x-frame-options",[222,241,242],{},[196,243,244],{},"DENY",[207,246,247,252],{},[222,248,249],{},[196,250,251],{},"x-content-type-options",[222,253,254],{},[196,255,256],{},"nosniff",[207,258,259,264],{},[222,260,261],{},[196,262,263],{},"referrer-policy",[222,265,266],{},[196,267,268],{},"strict-origin-when-cross-origin",[207,270,271,276],{},[222,272,273],{},[196,274,275],{},"permissions-policy",[222,277,278],{},[196,279,280],{},"accelerometer=(), camera=(), display-capture=(), geolocation=(), gyroscope=(), microphone=(), payment=(), usb=()",[207,282,283,288],{},[222,284,285],{},[196,286,287],{},"strict-transport-security",[222,289,290,293,294],{},[196,291,292],{},"max-age=31536000; includeSubDomains",", over https only and never under ",[196,295,296],{},"pnpm dev",[178,298,299,300,307],{},"The values come from\n",[189,301,304],{"href":302,"rel":303,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Futils\u002Fsecurity-headers.ts",[193],[196,305,306],{},"server\u002Futils\u002Fsecurity-headers.ts",". The\npolicy is built once when the Worker starts, since everything it reads is\nbuild-time config.",[182,309,311],{"id":310},"the-policy","The policy",[178,313,314],{},"With the shipped config the policy is:",[316,317,323],"pre",{"className":318,"code":320,"language":321,"meta":322},[319],"language-text","default-src 'self'\nscript-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https:\u002F\u002Fchallenges.cloudflare.com\nstyle-src 'self' 'unsafe-inline' https:\u002F\u002Ffonts.googleapis.com\nimg-src 'self' data: blob: https:\u002F\u002Fimagedelivery.net\nfont-src 'self' data: https:\u002F\u002Ffonts.gstatic.com\nconnect-src 'self'\nframe-ancestors 'none'\nbase-uri 'self'\nform-action 'self'\nobject-src 'none'\nframe-src 'self' https:\u002F\u002Fchallenges.cloudflare.com\n","text","",[196,324,320],{"__ignoreMap":322},[326,327,328,339,349,370,380],"ul",{},[329,330,331,334,335,338],"li",{},[196,332,333],{},"challenges.cloudflare.com"," is Turnstile. It is added only while\n",[196,336,337],{},"auth.enabled"," is on.",[329,340,341,344,345,348],{},[196,342,343],{},"imagedelivery.net"," is Cloudflare Images, which serves the blog covers.\nAvatars are R2 objects the app serves itself, under ",[196,346,347],{},"'self'",".",[329,350,351,354,355,358,359,361,362,365,366,369],{},[196,352,353],{},"data:"," in ",[196,356,357],{},"img-src"," is for Nuxt Icon, which draws icons as ",[196,360,353],{}," SVG\nmasks. ",[196,363,364],{},"blob:"," is for the previews Nuxt UI's ",[196,367,368],{},"UFileUpload"," shows.",[329,371,372,375,376,379],{},[196,373,374],{},"'wasm-unsafe-eval'"," lets ",[196,377,378],{},"@nuxt\u002Fcontent"," run its WebAssembly queries.",[329,381,382,385,386,388,389,392],{},[196,383,384],{},"connect-src"," stays ",[196,387,347],{}," because analytics and marketing events are sent\nfrom the server. A ",[196,390,391],{},"fetch"," from the browser to any other origin is blocked.",[182,394,396],{"id":395},"allow-another-origin","Allow another origin",[178,398,399,400,407],{},"Add sources per directive in ",[189,401,404],{"href":402,"rel":403,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fstarter.config.ts",[193],[196,405,406],{},"starter.config.ts",":",[316,409,413],{"className":410,"code":411,"language":412,"meta":322,"style":322},"language-ts shiki shiki-themes github-light github-light github-dark","security: {\n  headers: true,\n  cspExtend: {\n    'img-src': ['https:\u002F\u002Fcdn.example.com'],\n    'connect-src': ['https:\u002F\u002Fapi.example.com'],\n  },\n},\n","ts",[196,414,415,427,442,449,464,476,481],{"__ignoreMap":322},[416,417,419,423],"span",{"class":418,"line":12},"line",[416,420,422],{"class":421},"snPdu","security",[416,424,426],{"class":425},"sxrX7",": {\n",[416,428,429,432,435,439],{"class":418,"line":17},[416,430,431],{"class":421},"  headers",[416,433,434],{"class":425},": ",[416,436,438],{"class":437},"sBjJW","true",[416,440,441],{"class":425},",\n",[416,443,444,447],{"class":418,"line":22},[416,445,446],{"class":421},"  cspExtend",[416,448,426],{"class":425},[416,450,451,455,458,461],{"class":418,"line":27},[416,452,454],{"class":453},"sIIMD","    'img-src'",[416,456,457],{"class":425},": [",[416,459,460],{"class":453},"'https:\u002F\u002Fcdn.example.com'",[416,462,463],{"class":425},"],\n",[416,465,466,469,471,474],{"class":418,"line":32},[416,467,468],{"class":453},"    'connect-src'",[416,470,457],{"class":425},[416,472,473],{"class":453},"'https:\u002F\u002Fapi.example.com'",[416,475,463],{"class":425},[416,477,478],{"class":418,"line":37},[416,479,480],{"class":425},"  },\n",[416,482,483],{"class":418,"line":46},[416,484,485],{"class":425},"},\n",[178,487,488,489,492,493,496],{},"Each list is appended to the kit's sources for that directive, and repeats are\ndropped. A directive the kit doesn't set, such as ",[196,490,491],{},"media-src",", is added as\nwritten; until you add it, it falls back to ",[196,494,495],{},"default-src 'self'",". The policy\nis read at build, so a deploy needs a rebuild.",[178,498,499,500,507,508,511,512,515,516,519,520,522,523,526],{},"A blocked resource doesn't show up on the server. The page answers 200, the\nbrowser refuses the image or request, and the console logs a \"Refused to load\"\nline. Blog posts are checked for you:\n",[189,501,504],{"href":502,"rel":503,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Ftest\u002Funit\u002Fcontent-image-origins.test.ts",[193],[196,505,506],{},"test\u002Funit\u002Fcontent-image-origins.test.ts","\nreads every ",[196,509,510],{},"src"," and ",[196,513,514],{},"avatar"," in the frontmatter under ",[196,517,518],{},"content\u002F"," and fails\nwhen ",[196,521,357],{}," would block one. A GitHub profile picture or a Gravatar URL as a\npost's ",[196,524,525],{},"author.avatar"," fails it.",[182,528,530],{"id":529},"keep-tokens-out-of-the-referer-header","Keep tokens out of the Referer header",[178,532,533,534,537,538,441,541,537,544,511,547,550,551,554],{},"Pages that receive a token in their URL (",[196,535,536],{},"\u002Freset-password",", ",[196,539,540],{},"\u002Fmagic-link",[196,542,543],{},"\u002Fverify-email",[196,545,546],{},"\u002Frestore-account",[196,548,549],{},"\u002Finvite",") set ",[196,552,553],{},"no-referrer"," and are\nnever cached. A page of yours that reads a token from its query string needs\nthe same two things. In the page:",[316,556,558],{"className":410,"code":557,"language":412,"meta":322,"style":322},"useHead({ meta: [{ name: 'referrer', content: 'no-referrer' }] })\n",[196,559,560],{"__ignoreMap":322},[416,561,562,565,568,571,574,577],{"class":418,"line":12},[416,563,564],{"class":421},"useHead",[416,566,567],{"class":425},"({ meta: [{ name: ",[416,569,570],{"class":453},"'referrer'",[416,572,573],{"class":425},", content: ",[416,575,576],{"class":453},"'no-referrer'",[416,578,579],{"class":425}," }] })\n",[178,581,582,583,586,587,590,591,598],{},"And in the ",[196,584,585],{},"perLocale({ ... })"," block of ",[196,588,589],{},"routeRules"," in\n",[189,592,595],{"href":593,"rel":594,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fnuxt.config.ts",[193],[196,596,597],{},"nuxt.config.ts",", so every locale prefix gets it:",[316,600,602],{"className":410,"code":601,"language":412,"meta":322,"style":322},"'\u002Fclaim': {\n  headers: { 'cache-control': 'no-store' },\n  robots: false,\n},\n",[196,603,604,611,627,637],{"__ignoreMap":322},[416,605,606,609],{"class":418,"line":12},[416,607,608],{"class":453},"'\u002Fclaim'",[416,610,426],{"class":425},[416,612,613,616,619,621,624],{"class":418,"line":17},[416,614,615],{"class":425},"  headers: { ",[416,617,618],{"class":453},"'cache-control'",[416,620,434],{"class":425},[416,622,623],{"class":453},"'no-store'",[416,625,626],{"class":425}," },\n",[416,628,629,632,635],{"class":418,"line":22},[416,630,631],{"class":425},"  robots: ",[416,633,634],{"class":437},"false",[416,636,441],{"class":425},[416,638,639],{"class":418,"line":27},[416,640,485],{"class":425},[182,642,644],{"id":643},"accept-a-cross-site-post","Accept a cross-site post",[178,646,647,654,655,658,659,537,662,665,666,669,670,673,674,677],{},[189,648,651],{"href":649,"rel":650,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Fserver\u002Fmiddleware\u002Fcross-site-writes.ts",[193],[196,652,653],{},"server\u002Fmiddleware\u002Fcross-site-writes.ts","\nanswers 403 to any write under ",[196,656,657],{},"\u002Fapi\u002F"," (anything but ",[196,660,661],{},"GET",[196,663,664],{},"HEAD"," and\n",[196,667,668],{},"OPTIONS",") that the browser labels ",[196,671,672],{},"Sec-Fetch-Site: cross-site",". A request\nwithout that header, from a server or an old browser, passes, so provider\nwebhooks and server-to-server calls are unaffected. Payment webhooks live under\n",[196,675,676],{},"\u002Fwebhooks\u002F",", outside the check anyway.",[178,679,680,681,684,685,688,689,692],{},"Two prefixes are allowed through: ",[196,682,683],{},"\u002Fapi\u002Fauth\u002Foauth\u002F",", where the OAuth state\nprotects the callback, and ",[196,686,687],{},"\u002Fapi\u002Femail\u002Funsubscribe",", which mail clients post to\nfor one-click unsubscribe. An endpoint that must accept a form posted from\nanother site's page goes in ",[196,690,691],{},"CROSS_SITE_WRITES_ALLOWED"," in that file:",[316,694,696],{"className":410,"code":695,"language":412,"meta":322,"style":322},"const CROSS_SITE_WRITES_ALLOWED = [\n  '\u002Fapi\u002Fauth\u002Foauth\u002F',\n  '\u002Fapi\u002Femail\u002Funsubscribe',\n  '\u002Fapi\u002Fsso\u002Fcallback',\n]\n",[196,697,698,713,720,727,734],{"__ignoreMap":322},[416,699,700,704,707,710],{"class":418,"line":12},[416,701,703],{"class":702},"s8jYJ","const",[416,705,706],{"class":437}," CROSS_SITE_WRITES_ALLOWED",[416,708,709],{"class":702}," =",[416,711,712],{"class":425}," [\n",[416,714,715,718],{"class":418,"line":17},[416,716,717],{"class":453},"  '\u002Fapi\u002Fauth\u002Foauth\u002F'",[416,719,441],{"class":425},[416,721,722,725],{"class":418,"line":22},[416,723,724],{"class":453},"  '\u002Fapi\u002Femail\u002Funsubscribe'",[416,726,441],{"class":425},[416,728,729,732],{"class":418,"line":27},[416,730,731],{"class":453},"  '\u002Fapi\u002Fsso\u002Fcallback'",[416,733,441],{"class":425},[416,735,736],{"class":418,"line":32},[416,737,738],{"class":425},"]\n",[178,740,741,742,745,746,348],{},"The session cookie is ",[196,743,744],{},"SameSite=Lax"," and never rides a cross-site post, so that\nendpoint has to authenticate the request itself, with a signature or a token.\nThis check ignores ",[196,747,748],{},"security.headers",[182,750,752],{"id":751},"turn-the-headers-off","Turn the headers off",[178,754,755,756,759],{},"Set ",[196,757,758],{},"security.headers: false"," and the middleware sets none of them, HSTS\nincluded. Do this only when something in front of the Worker, such as a\nCloudflare Transform Rule, already sets them. A browser that receives two\npolicies enforces both.",[182,761,20],{"id":762},"configuration",[201,764,765,778],{},[204,766,767],{},[207,768,769,772,775],{},[210,770,771],{},"Key",[210,773,774],{},"Default",[210,776,777],{},"What it does",[217,779,780,793],{},[207,781,782,786,790],{},[222,783,784],{},[196,785,748],{},[222,787,788],{},[196,789,438],{},[222,791,792],{},"Sets the CSP and the hardening headers on every response.",[207,794,795,799,804],{},[222,796,797],{},[196,798,232],{},[222,800,801],{},[196,802,803],{},"{}",[222,805,806],{},"Extra sources per CSP directive, merged into the kit's policy.",[178,808,809],{},"There are no environment variables.",[182,811,813],{"id":812},"good-to-know","Good to know",[326,815,816,823,836,853],{},[329,817,818,819,822],{},"HSTS carries ",[196,820,821],{},"includeSubDomains",", so once a browser has seen it, every\nsubdomain of the app's host has to serve https for a year.",[329,824,825,826,828,829,832,833,835],{},"HSTS is never sent under ",[196,827,296],{},". Sent from ",[196,830,831],{},"localhost",", it would force\nhttps on every project you run on ",[196,834,831],{}," in that browser.",[329,837,838,841,842,845,846,511,849,852],{},[196,839,840],{},"'unsafe-inline'"," stays in ",[196,843,844],{},"script-src",". Nuxt writes its hydration payload as\nan inline script, and ",[196,847,848],{},"\u002Fblog",[196,850,851],{},"\u002Flegal"," are served from the swr cache,\nwhere one HTML body answers many requests, so a per-request nonce can't work.",[329,854,855,856,859,860,863,864,871],{},"Nitro runs ",[196,857,858],{},"server\u002Fmiddleware\u002F"," in file-name order. A middleware of yours\nthat answers a request ends the chain, so name it to sort after\n",[196,861,862],{},"security-headers.ts"," or its response goes out without the headers.\n",[189,865,868],{"href":866,"rel":867,"title":194},"https:\u002F\u002Fgithub.com\u002Fnuxter-app\u002Fkit\u002Fblob\u002Fmain\u002Ftest\u002Funit\u002Fmiddleware-order.test.ts",[193],[196,869,870],{},"test\u002Funit\u002Fmiddleware-order.test.ts","\nholds the kit's own to this.",[873,874,875],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":322,"searchDepth":17,"depth":17,"links":877},[878,879,880,881,882,883,884,885],{"id":184,"depth":17,"text":185},{"id":310,"depth":17,"text":311},{"id":395,"depth":17,"text":396},{"id":529,"depth":17,"text":530},{"id":643,"depth":17,"text":644},{"id":751,"depth":17,"text":752},{"id":762,"depth":17,"text":20},{"id":812,"depth":17,"text":813},[887,888],{"path":110,"title":111,"description":112,"navTitle":111,"group":67,"order":113},{"path":124,"title":125,"description":126,"navTitle":125,"group":116,"order":127},true]