[{"data":1,"prerenderedAt":5956},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection_surround":3630,"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection":3633},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":20,"path":22,"stem":70,"children":71},"docs\u002Fauth-h3client\u002Findex",[72,73,82,119,145,167,170,191,195],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":76},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[77,78],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":83,"path":84,"stem":85,"children":86},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[87,88,92,96,100,104,108,111,115],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":93,"path":94,"stem":95},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":97,"path":98,"stem":99},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":101,"path":102,"stem":103},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":105,"path":106,"stem":107},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":109,"stem":110},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":112,"path":113,"stem":114},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":116,"path":117,"stem":118},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":120,"path":121,"stem":122,"children":123},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[124,125,129,133,137,141],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":130,"path":131,"stem":132},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":134,"path":135,"stem":136},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":138,"path":139,"stem":140},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":142,"path":143,"stem":144},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":146,"path":147,"stem":148,"children":149},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[150,151,155,159,163],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":156,"path":157,"stem":158},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":160,"path":161,"stem":162},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":164,"path":165,"stem":166},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":168,"stem":169},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":171,"path":172,"stem":173,"children":174,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[175,179,183,187],{"title":176,"path":177,"stem":178},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":180,"path":181,"stem":182},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":184,"path":185,"stem":186},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":188,"path":189,"stem":190},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":192,"path":193,"stem":194},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":196,"path":197,"stem":198,"children":199},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[200,201,205,209,213],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":206,"path":207,"stem":208},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":210,"path":211,"stem":212},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":214,"path":215,"stem":216},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",[218],{"title":9,"path":66,"stem":67,"children":219,"page":53},[220,268,386,391,569,636],{"title":20,"path":22,"stem":70,"children":221},[222,223,227,238,246,253,254,260,261],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":224},[225,226],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},{"title":83,"path":84,"stem":85,"children":228},[229,230,231,232,233,234,235,236,237],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},{"title":93,"path":94,"stem":95},{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":33,"path":109,"stem":110},{"title":112,"path":113,"stem":114},{"title":116,"path":117,"stem":118},{"title":120,"path":121,"stem":122,"children":239},[240,241,242,243,244,245],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148,"children":247},[248,249,250,251,252],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},{"title":156,"path":157,"stem":158},{"title":160,"path":161,"stem":162},{"title":164,"path":165,"stem":166},{"title":38,"path":168,"stem":169},{"title":171,"path":172,"stem":173,"children":255,"page":53},[256,257,258,259],{"title":176,"path":177,"stem":178},{"title":180,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":192,"path":193,"stem":194},{"title":196,"path":197,"stem":198,"children":262},[263,264,265,266,267],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":269,"path":35,"stem":270,"children":271},"Bot Detector","docs\u002Fbot-detection\u002Findex",[272,273,276,280,284,303,377,380,383],{"title":269,"path":35,"stem":270},{"title":14,"path":274,"stem":275},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":277,"path":278,"stem":279},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":281,"path":282,"stem":283},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":171,"path":285,"stem":286,"children":287,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[288,292,296,299],{"title":289,"path":290,"stem":291},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":293,"path":294,"stem":295},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":116,"path":297,"stem":298},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":300,"path":301,"stem":302},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":304,"path":305,"stem":306,"children":307},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[308,309,313,317,321,325,329,333,337,341,345,349,353,357,361,365,369,373],{"title":304,"path":305,"stem":306},{"title":310,"path":311,"stem":312},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":314,"path":315,"stem":316},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":318,"path":319,"stem":320},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":322,"path":323,"stem":324},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":326,"path":327,"stem":328},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":330,"path":331,"stem":332},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":334,"path":335,"stem":336},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":338,"path":339,"stem":340},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":342,"path":343,"stem":344},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":346,"path":347,"stem":348},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":350,"path":351,"stem":352},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":354,"path":355,"stem":356},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":358,"path":359,"stem":360},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":362,"path":363,"stem":364},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":366,"path":367,"stem":368},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":370,"path":371,"stem":372},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":374,"path":375,"stem":376},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":378,"stem":379},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":196,"path":381,"stem":382},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":192,"path":384,"stem":385},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":387,"path":11,"stem":388,"children":389},"Introduction","docs\u002Fgetting-started\u002Findex",[390],{"title":387,"path":11,"stem":388},{"title":27,"path":29,"stem":392,"children":393},"docs\u002Fiam\u002Findex",[394,395,398,533,536,552,555],{"title":27,"path":29,"stem":392},{"title":14,"path":396,"stem":397},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":83,"path":399,"stem":400,"children":401},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[402,403,407,411,415,419,423,427,431,435,439,443,446,450,454,458,462,465,469,473,476,480,483],{"title":83,"path":399,"stem":400},{"title":404,"path":405,"stem":406},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":408,"path":409,"stem":410},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":412,"path":413,"stem":414},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":416,"path":417,"stem":418},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":420,"path":421,"stem":422},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":424,"path":425,"stem":426},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":428,"path":429,"stem":430},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":432,"path":433,"stem":434},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":436,"path":437,"stem":438},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":440,"path":441,"stem":442},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":120,"path":444,"stem":445},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":447,"path":448,"stem":449},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":451,"path":452,"stem":453},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":455,"path":456,"stem":457},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":459,"path":460,"stem":461},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":116,"path":463,"stem":464},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":466,"path":467,"stem":468},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":470,"path":471,"stem":472},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":112,"path":474,"stem":475},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":477,"path":478,"stem":479},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":130,"path":481,"stem":482},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":484,"path":485,"stem":486,"children":487},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[488,489,493,497,527,530],{"title":484,"path":485,"stem":486},{"title":490,"path":491,"stem":492},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":494,"path":495,"stem":496},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":498,"path":499,"stem":500,"children":501},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[502,503,507,511,515,519,523],{"title":498,"path":499,"stem":500},{"title":504,"path":505,"stem":506},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":508,"path":509,"stem":510},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":512,"path":513,"stem":514},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":516,"path":517,"stem":518},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":520,"path":521,"stem":522},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":524,"path":525,"stem":526},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":466,"path":528,"stem":529},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":531,"stem":532},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":534,"stem":535},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":171,"path":537,"stem":538,"children":539,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[540,544,548],{"title":541,"path":542,"stem":543},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":545,"path":546,"stem":547},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":549,"path":550,"stem":551},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":192,"path":553,"stem":554},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":556,"path":557,"stem":558,"children":559,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[560,563,566],{"title":196,"path":561,"stem":562},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":206,"path":564,"stem":565},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":202,"path":567,"stem":568},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":570,"children":571},"docs\u002Fshield-base\u002Findex",[572,573,576,580,621,625,629,633],{"title":40,"path":42,"stem":570},{"title":14,"path":574,"stem":575},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":577,"path":578,"stem":579},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":281,"path":581,"stem":582,"children":583},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[584,585,589,593,597,601,605,609,613,617],{"title":281,"path":581,"stem":582},{"title":586,"path":587,"stem":588},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":590,"path":591,"stem":592},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":594,"path":595,"stem":596},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":598,"path":599,"stem":600},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":602,"path":603,"stem":604},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":606,"path":607,"stem":608},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":610,"path":611,"stem":612},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":614,"path":615,"stem":616},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":618,"path":619,"stem":620},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":622,"path":623,"stem":624},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":626,"path":627,"stem":628},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":630,"path":631,"stem":632},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":196,"path":634,"stem":635},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":214,"path":48,"stem":637,"children":638},"docs\u002Futils\u002Findex",[639,640,657,690,787],{"title":214,"path":48,"stem":637},{"title":641,"path":642,"stem":643,"children":644,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[645,649,653],{"title":646,"path":647,"stem":648},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":650,"path":651,"stem":652},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":654,"path":655,"stem":656},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":658,"path":659,"stem":660,"children":661,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[662,666,670,674,678,682,686],{"title":663,"path":664,"stem":665},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":667,"path":668,"stem":669},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":671,"path":672,"stem":673},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":675,"path":676,"stem":677},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":679,"path":680,"stem":681},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":683,"path":684,"stem":685},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":687,"path":688,"stem":689},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":691,"path":692,"stem":693,"children":694,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783],{"title":696,"path":697,"stem":698},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":700,"path":701,"stem":702},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":704,"path":705,"stem":706},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":708,"path":709,"stem":710},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":712,"path":713,"stem":714},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":716,"path":717,"stem":718},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":720,"path":721,"stem":722},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":724,"path":725,"stem":726},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":728,"path":729,"stem":730},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":732,"path":733,"stem":734},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":736,"path":737,"stem":738},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":740,"path":741,"stem":742},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":744,"path":745,"stem":746},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":748,"path":749,"stem":750},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":752,"path":753,"stem":754},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":756,"path":757,"stem":758},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":760,"path":761,"stem":762},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":764,"path":765,"stem":766},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":768,"path":769,"stem":770},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":772,"path":773,"stem":774},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":776,"path":777,"stem":778},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":780,"path":781,"stem":782},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":784,"path":785,"stem":786},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":788,"path":789,"stem":790,"children":791},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[792,793,797,801,805,809,813,817,821,825],{"title":788,"path":789,"stem":790},{"title":794,"path":795,"stem":796},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":798,"path":799,"stem":800},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":802,"path":803,"stem":804},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":806,"path":807,"stem":808},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":810,"path":811,"stem":812},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":814,"path":815,"stem":816},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":818,"path":819,"stem":820},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":822,"path":823,"stem":824},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":826,"path":827,"stem":828},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":830,"meta":841,"stem":62,"__hash__":63},[831,839,840],{"nested":8,"label":9,"icon":10,"to":11,"children":832},[833,834,835,836,837,838],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":843,"title":93,"body":844,"description":3622,"extension":3623,"icon":3624,"meta":3625,"module":3626,"navigation":8,"path":94,"rawbody":3627,"seo":3628,"stem":95,"__hash__":3629},"docs\u002Fdocs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection.md",{"type":845,"value":846,"toc":3606},"minimark",[847,864,867,883,886,891,1085,1087,1092,1107,1220,1229,1350,1352,1357,1370,1512,1514,1519,1526,1603,1605,1610,1613,1696,1709,1714,1716,1721,1732,1751,1758,1893,1900,2032,2034,2039,2054,2057,2089,2092,2212,2231,2247,2267,2274,2546,2549,2662,2671,2673,2678,2687,2692,2777,2786,2788,2793,2822,2832,2912,2917,2919,2924,2931,2983,2992,2994,2999,3002,3062,3081,3083,3087,3090,3268,3270,3274,3277,3585,3587,3591,3602],[848,849,850,851,855,856,859,860,863],"p",{},"The module exports a set of event handler wrappers that enforce\nauthentication, API-key verification, CSRF requirements, request-body limits,\nand method requirements before your handler runs. Each wrapper is a\nhigher-order function that accepts your handler and returns a new handler with\nthe enforcement logic built in. Import them from ",[852,853,854],"code",{},"auth-h3client"," (defaults to\nv1) or ",[852,857,858],{},"auth-h3client\u002Fv2"," depending on your H3 version. When using the Nuxt\nmodule, all wrappers are auto-imported inside the ",[852,861,862],{},"server\u002F"," directory.",[848,865,866],{},"The API token flows use two dedicated wrappers:",[868,869,870,877],"ul",{},[871,872,873,874],"li",{},"machine-to-machine protection with ",[852,875,876],{},"defineAuthenticatePublicApi",[871,878,879,880],{},"authenticated browser-side token management with\n",[852,881,882],{},"defineApiManagementHandler",[884,885],"hr",{},[887,888,890],"h2",{"id":889},"wrapper-overview","Wrapper overview",[892,893,894,916],"table",{},[895,896,897],"thead",{},[898,899,900,904,907,910,913],"tr",{},[901,902,903],"th",{},"Wrapper",[901,905,906],{},"Session auth",[901,908,909],{},"API key",[901,911,912],{},"CSRF",[901,914,915],{},"Method",[917,918,919,938,954,969,985,999,1013,1039,1055,1070],"tbody",{},[898,920,921,927,930,933,935],{},[922,923,924],"td",{},[852,925,926],{},"defineAuthenticatedEventHandler",[922,928,929],{},"Yes",[922,931,932],{},"No",[922,934,932],{},[922,936,937],{},"Any",[898,939,940,945,948,950,952],{},[922,941,942],{},[852,943,944],{},"defineOptionalAuthenticationEvent",[922,946,947],{},"Optional",[922,949,932],{},[922,951,932],{},[922,953,937],{},[898,955,956,961,963,965,967],{},[922,957,958],{},[852,959,960],{},"defineVerifiedCsrfHandler",[922,962,932],{},[922,964,932],{},[922,966,929],{},[922,968,937],{},[898,970,971,976,978,980,982],{},[922,972,973],{},[852,974,975],{},"defineAuthenticatedEventPostHandlers",[922,977,929],{},[922,979,932],{},[922,981,929],{},[922,983,984],{},"POST only",[898,986,987,991,993,995,997],{},[922,988,989],{},[852,990,876],{},[922,992,932],{},[922,994,929],{},[922,996,932],{},[922,998,937],{},[898,1000,1001,1005,1007,1009,1011],{},[922,1002,1003],{},[852,1004,882],{},[922,1006,929],{},[922,1008,932],{},[922,1010,929],{},[922,1012,984],{},[898,1014,1015,1020,1022,1024,1026],{},[922,1016,1017],{},[852,1018,1019],{},"defineByteLimiterHandler",[922,1021,932],{},[922,1023,932],{},[922,1025,932],{},[922,1027,1028,1031,1032,1035,1036],{},[852,1029,1030],{},"POST",", ",[852,1033,1034],{},"PUT",", or ",[852,1037,1038],{},"PATCH",[898,1040,1041,1046,1048,1050,1052],{},[922,1042,1043],{},[852,1044,1045],{},"defineVerifiedMagicLinkGetHandler",[922,1047,932],{},[922,1049,932],{},[922,1051,932],{},[922,1053,1054],{},"GET only",[898,1056,1057,1062,1064,1066,1068],{},[922,1058,1059],{},[852,1060,1061],{},"defineMfaCodeVerifierHandler",[922,1063,932],{},[922,1065,932],{},[922,1067,929],{},[922,1069,984],{},[898,1071,1072,1077,1079,1081,1083],{},[922,1073,1074],{},[852,1075,1076],{},"defineDeduplicatedEventHandler",[922,1078,932],{},[922,1080,932],{},[922,1082,932],{},[922,1084,937],{},[884,1086],{},[887,1088,1090],{"id":1089},"defineauthenticatedeventhandler",[852,1091,926],{},[848,1093,1094,1095,1098,1099,1102,1103,1106],{},"The standard wrapper for protected routes. It runs token rotation via ",[852,1096,1097],{},"ensureValidCredentials",", verifies the session against the IAM service, and populates ",[852,1100,1101],{},"event.context.authorizedData"," with the verified user data. A missing or invalid session throws HTTP 401. An MFA challenge returns HTTP 202 with a ",[852,1104,1105],{},"mfaRequired"," body.",[1108,1109,1115],"pre",{"className":1110,"code":1111,"filename":1112,"language":1113,"meta":1114,"style":1114},"language-ts shiki shiki-themes light-plus light-plus dracula","export default defineAuthenticatedEventHandler(async (event) => {\n  const { userId, roles } = event.context.authorizedData\n  return { userId, roles }\n})\n","server\u002Fapi\u002Fprofile.get.ts","ts","",[852,1116,1117,1157,1197,1214],{"__ignoreMap":1114},[1118,1119,1122,1126,1129,1133,1137,1141,1144,1148,1151,1154],"span",{"class":1120,"line":1121},"line",1,[1118,1123,1125],{"class":1124},"sZ328","export",[1118,1127,1128],{"class":1124}," default",[1118,1130,1132],{"class":1131},"sHOzp"," defineAuthenticatedEventHandler",[1118,1134,1136],{"class":1135},"sDd4n","(",[1118,1138,1140],{"class":1139},"sl46w","async",[1118,1142,1143],{"class":1135}," (",[1118,1145,1147],{"class":1146},"sygFZ","event",[1118,1149,1150],{"class":1135},") ",[1118,1152,1153],{"class":1139},"=>",[1118,1155,1156],{"class":1135}," {\n",[1118,1158,1160,1163,1166,1170,1172,1175,1178,1182,1186,1189,1192,1194],{"class":1120,"line":1159},2,[1118,1161,1162],{"class":1139},"  const",[1118,1164,1165],{"class":1135}," { ",[1118,1167,1169],{"class":1168},"s3JHE","userId",[1118,1171,1031],{"class":1135},[1118,1173,1174],{"class":1168},"roles",[1118,1176,1177],{"class":1135}," } ",[1118,1179,1181],{"class":1180},"saOXh","=",[1118,1183,1185],{"class":1184},"sjsA6"," event",[1118,1187,1188],{"class":1135},".",[1118,1190,1191],{"class":1184},"context",[1118,1193,1188],{"class":1135},[1118,1195,1196],{"class":1184},"authorizedData\n",[1118,1198,1200,1203,1205,1207,1209,1211],{"class":1120,"line":1199},3,[1118,1201,1202],{"class":1124},"  return",[1118,1204,1165],{"class":1135},[1118,1206,1169],{"class":1184},[1118,1208,1031],{"class":1135},[1118,1210,1174],{"class":1184},[1118,1212,1213],{"class":1135}," }\n",[1118,1215,1217],{"class":1120,"line":1216},4,[1118,1218,1219],{"class":1135},"})\n",[848,1221,1222,1224,1225,1228],{},[852,1223,1101],{}," is typed as ",[852,1226,1227],{},"ServerResponse",":",[1108,1230,1232],{"className":1110,"code":1231,"language":1113,"meta":1114,"style":1114},"interface ServerResponse {\n  authorized: boolean\n  userId?: string\n  roles?: string[] | string\n  ipAddress: string\n  userAgent: string\n  date: string\n  reason?: string\n  error?: string\n  message?: string\n}\n",[852,1233,1234,1245,1255,1266,1284,1294,1304,1314,1324,1334,1344],{"__ignoreMap":1114},[1118,1235,1236,1239,1243],{"class":1120,"line":1121},[1118,1237,1238],{"class":1139},"interface",[1118,1240,1242],{"class":1241},"sFs1U"," ServerResponse",[1118,1244,1156],{"class":1135},[1118,1246,1247,1250,1252],{"class":1120,"line":1159},[1118,1248,1249],{"class":1184},"  authorized",[1118,1251,1228],{"class":1180},[1118,1253,1254],{"class":1241}," boolean\n",[1118,1256,1257,1260,1263],{"class":1120,"line":1199},[1118,1258,1259],{"class":1184},"  userId",[1118,1261,1262],{"class":1180},"?:",[1118,1264,1265],{"class":1241}," string\n",[1118,1267,1268,1271,1273,1276,1279,1282],{"class":1120,"line":1216},[1118,1269,1270],{"class":1184},"  roles",[1118,1272,1262],{"class":1180},[1118,1274,1275],{"class":1241}," string",[1118,1277,1278],{"class":1135},"[] ",[1118,1280,1281],{"class":1180},"|",[1118,1283,1265],{"class":1241},[1118,1285,1287,1290,1292],{"class":1120,"line":1286},5,[1118,1288,1289],{"class":1184},"  ipAddress",[1118,1291,1228],{"class":1180},[1118,1293,1265],{"class":1241},[1118,1295,1297,1300,1302],{"class":1120,"line":1296},6,[1118,1298,1299],{"class":1184},"  userAgent",[1118,1301,1228],{"class":1180},[1118,1303,1265],{"class":1241},[1118,1305,1307,1310,1312],{"class":1120,"line":1306},7,[1118,1308,1309],{"class":1184},"  date",[1118,1311,1228],{"class":1180},[1118,1313,1265],{"class":1241},[1118,1315,1317,1320,1322],{"class":1120,"line":1316},8,[1118,1318,1319],{"class":1184},"  reason",[1118,1321,1262],{"class":1180},[1118,1323,1265],{"class":1241},[1118,1325,1327,1330,1332],{"class":1120,"line":1326},9,[1118,1328,1329],{"class":1184},"  error",[1118,1331,1262],{"class":1180},[1118,1333,1265],{"class":1241},[1118,1335,1337,1340,1342],{"class":1120,"line":1336},10,[1118,1338,1339],{"class":1184},"  message",[1118,1341,1262],{"class":1180},[1118,1343,1265],{"class":1241},[1118,1345,1347],{"class":1120,"line":1346},11,[1118,1348,1349],{"class":1135},"}\n",[884,1351],{},[887,1353,1355],{"id":1354},"defineoptionalauthenticationevent",[852,1356,944],{},[848,1358,1359,1360,1362,1363,1365,1366,1369],{},"Use this wrapper for routes that serve both authenticated users and guests. It attempts authentication and populates ",[852,1361,1101],{}," when successful. If authentication fails for any reason other than a rate limit, it sets ",[852,1364,1101],{}," to ",[852,1367,1368],{},"undefined"," and continues to your handler as a guest. HTTP 429 rate limit responses are still propagated.",[1108,1371,1374],{"className":1110,"code":1372,"filename":1373,"language":1113,"meta":1114,"style":1114},"export default defineOptionalAuthenticationEvent(async (event) => {\n  const user = event.context.authorizedData \u002F\u002F undefined for guests\n\n  if (user) {\n    return { content: 'private content', userId: user.userId }\n  }\n\n  return { content: 'public content' }\n})\n","server\u002Fapi\u002Fposts\u002F[id].get.ts",[852,1375,1376,1399,1424,1429,1442,1480,1485,1489,1508],{"__ignoreMap":1114},[1118,1377,1378,1380,1382,1385,1387,1389,1391,1393,1395,1397],{"class":1120,"line":1121},[1118,1379,1125],{"class":1124},[1118,1381,1128],{"class":1124},[1118,1383,1384],{"class":1131}," defineOptionalAuthenticationEvent",[1118,1386,1136],{"class":1135},[1118,1388,1140],{"class":1139},[1118,1390,1143],{"class":1135},[1118,1392,1147],{"class":1146},[1118,1394,1150],{"class":1135},[1118,1396,1153],{"class":1139},[1118,1398,1156],{"class":1135},[1118,1400,1401,1403,1406,1409,1411,1413,1415,1417,1420],{"class":1120,"line":1159},[1118,1402,1162],{"class":1139},[1118,1404,1405],{"class":1168}," user",[1118,1407,1408],{"class":1180}," =",[1118,1410,1185],{"class":1184},[1118,1412,1188],{"class":1135},[1118,1414,1191],{"class":1184},[1118,1416,1188],{"class":1135},[1118,1418,1419],{"class":1184},"authorizedData",[1118,1421,1423],{"class":1422},"sghk6"," \u002F\u002F undefined for guests\n",[1118,1425,1426],{"class":1120,"line":1199},[1118,1427,1428],{"emptyLinePlaceholder":8},"\n",[1118,1430,1431,1434,1436,1439],{"class":1120,"line":1216},[1118,1432,1433],{"class":1124},"  if",[1118,1435,1143],{"class":1135},[1118,1437,1438],{"class":1184},"user",[1118,1440,1441],{"class":1135},") {\n",[1118,1443,1444,1447,1449,1452,1455,1459,1463,1466,1468,1470,1472,1474,1476,1478],{"class":1120,"line":1286},[1118,1445,1446],{"class":1124},"    return",[1118,1448,1165],{"class":1135},[1118,1450,1451],{"class":1184},"content",[1118,1453,1228],{"class":1454},"s34zl",[1118,1456,1458],{"class":1457},"sFkSl"," '",[1118,1460,1462],{"class":1461},"sFB1V","private content",[1118,1464,1465],{"class":1457},"'",[1118,1467,1031],{"class":1135},[1118,1469,1169],{"class":1184},[1118,1471,1228],{"class":1454},[1118,1473,1405],{"class":1184},[1118,1475,1188],{"class":1135},[1118,1477,1169],{"class":1184},[1118,1479,1213],{"class":1135},[1118,1481,1482],{"class":1120,"line":1296},[1118,1483,1484],{"class":1135},"  }\n",[1118,1486,1487],{"class":1120,"line":1306},[1118,1488,1428],{"emptyLinePlaceholder":8},[1118,1490,1491,1493,1495,1497,1499,1501,1504,1506],{"class":1120,"line":1316},[1118,1492,1202],{"class":1124},[1118,1494,1165],{"class":1135},[1118,1496,1451],{"class":1184},[1118,1498,1228],{"class":1454},[1118,1500,1458],{"class":1457},[1118,1502,1503],{"class":1461},"public content",[1118,1505,1465],{"class":1457},[1118,1507,1213],{"class":1135},[1118,1509,1510],{"class":1120,"line":1326},[1118,1511,1219],{"class":1135},[884,1513],{},[887,1515,1517],{"id":1516},"defineverifiedcsrfhandler",[852,1518,960],{},[848,1520,1521,1522,1525],{},"Validates the CSRF cookie and the ",[852,1523,1524],{},"X-CSRF-Token"," request header before running the handler. Does not check authentication. Use this wrapper when you need CSRF protection without requiring a login, for example on forms accessible to both guests and authenticated users.",[1108,1527,1530],{"className":1110,"code":1528,"filename":1529,"language":1113,"meta":1114,"style":1114},"export default defineVerifiedCsrfHandler(async (event) => {\n  const body = await readBody(event)\n  \u002F\u002F CSRF is valid; process the form submission\n  return { ok: true }\n})\n","server\u002Fapi\u002Fcontact.post.ts",[852,1531,1532,1555,1577,1582,1599],{"__ignoreMap":1114},[1118,1533,1534,1536,1538,1541,1543,1545,1547,1549,1551,1553],{"class":1120,"line":1121},[1118,1535,1125],{"class":1124},[1118,1537,1128],{"class":1124},[1118,1539,1540],{"class":1131}," defineVerifiedCsrfHandler",[1118,1542,1136],{"class":1135},[1118,1544,1140],{"class":1139},[1118,1546,1143],{"class":1135},[1118,1548,1147],{"class":1146},[1118,1550,1150],{"class":1135},[1118,1552,1153],{"class":1139},[1118,1554,1156],{"class":1135},[1118,1556,1557,1559,1562,1564,1567,1570,1572,1574],{"class":1120,"line":1159},[1118,1558,1162],{"class":1139},[1118,1560,1561],{"class":1168}," body",[1118,1563,1408],{"class":1180},[1118,1565,1566],{"class":1124}," await",[1118,1568,1569],{"class":1131}," readBody",[1118,1571,1136],{"class":1135},[1118,1573,1147],{"class":1184},[1118,1575,1576],{"class":1135},")\n",[1118,1578,1579],{"class":1120,"line":1199},[1118,1580,1581],{"class":1422},"  \u002F\u002F CSRF is valid; process the form submission\n",[1118,1583,1584,1586,1588,1591,1593,1597],{"class":1120,"line":1216},[1118,1585,1202],{"class":1124},[1118,1587,1165],{"class":1135},[1118,1589,1590],{"class":1184},"ok",[1118,1592,1228],{"class":1454},[1118,1594,1596],{"class":1595},"sjR7W"," true",[1118,1598,1213],{"class":1135},[1118,1600,1601],{"class":1120,"line":1286},[1118,1602,1219],{"class":1135},[884,1604],{},[887,1606,1608],{"id":1607},"defineauthenticatedeventposthandlers",[852,1609,975],{},[848,1611,1612],{},"Combines authentication, CSRF validation, and a POST method assertion in one wrapper. This is the correct choice for any state-changing endpoint that requires a login.",[1108,1614,1617],{"className":1110,"code":1615,"filename":1616,"language":1113,"meta":1114,"style":1114},"export default defineAuthenticatedEventPostHandlers(async (event) => {\n  const { userId } = event.context.authorizedData\n  await deleteAccount(userId)\n  return { ok: true }\n})\n","server\u002Fapi\u002Faccount\u002Fdelete.post.ts",[852,1618,1619,1642,1664,1678,1692],{"__ignoreMap":1114},[1118,1620,1621,1623,1625,1628,1630,1632,1634,1636,1638,1640],{"class":1120,"line":1121},[1118,1622,1125],{"class":1124},[1118,1624,1128],{"class":1124},[1118,1626,1627],{"class":1131}," defineAuthenticatedEventPostHandlers",[1118,1629,1136],{"class":1135},[1118,1631,1140],{"class":1139},[1118,1633,1143],{"class":1135},[1118,1635,1147],{"class":1146},[1118,1637,1150],{"class":1135},[1118,1639,1153],{"class":1139},[1118,1641,1156],{"class":1135},[1118,1643,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662],{"class":1120,"line":1159},[1118,1645,1162],{"class":1139},[1118,1647,1165],{"class":1135},[1118,1649,1169],{"class":1168},[1118,1651,1177],{"class":1135},[1118,1653,1181],{"class":1180},[1118,1655,1185],{"class":1184},[1118,1657,1188],{"class":1135},[1118,1659,1191],{"class":1184},[1118,1661,1188],{"class":1135},[1118,1663,1196],{"class":1184},[1118,1665,1666,1669,1672,1674,1676],{"class":1120,"line":1199},[1118,1667,1668],{"class":1124},"  await",[1118,1670,1671],{"class":1131}," deleteAccount",[1118,1673,1136],{"class":1135},[1118,1675,1169],{"class":1184},[1118,1677,1576],{"class":1135},[1118,1679,1680,1682,1684,1686,1688,1690],{"class":1120,"line":1216},[1118,1681,1202],{"class":1124},[1118,1683,1165],{"class":1135},[1118,1685,1590],{"class":1184},[1118,1687,1228],{"class":1454},[1118,1689,1596],{"class":1595},[1118,1691,1213],{"class":1135},[1118,1693,1694],{"class":1120,"line":1286},[1118,1695,1219],{"class":1135},[848,1697,1698,1699,1701,1702,1704,1705,1708],{},"This wrapper combines ",[852,1700,926],{},",\n",[852,1703,960],{},", and ",[852,1706,1707],{},"assertMethod('POST')"," in that order.",[848,1710,1711,1713],{},[852,1712,882],{}," builds on this wrapper for API token lifecycle\noperations, then adds a 2 KB JSON body limit, action validation, and token\nidentity mapping in the server layer.",[884,1715],{},[887,1717,1719],{"id":1718},"defineauthenticatepublicapi",[852,1720,876],{},[848,1722,1723,1724,1727,1728,1731],{},"Use this wrapper for machine-to-machine routes that accept an API token in the\n",[852,1725,1726],{},"X-API-KEY"," header instead of a browser session. The wrapper forwards that key\nto the IAM ",[852,1729,1730],{},"\u002Fapi\u002Fpublic\u002Fverify"," endpoint, along with the privilege you\ndefine for the route, and only then calls your handler.",[1733,1734,1735],"warning",{},[848,1736,1737,1738,1740,1741,1744,1745,1704,1748,1750],{},"Use ",[852,1739,876],{}," on routes that bypass the Nuxt global auth\nmiddleware or any manual ",[852,1742,1743],{},"isIPValid -> botDetectorMiddleware -> generateCsrfCookie"," chain. This wrapper protects machine-to-machine API-key\nrequests, so running the browser middleware on the same route can trigger\nbot-detector rate limits or bans. Keep the global middleware for regular auth\nroutes, ",[852,1746,1747],{},"getApiListsController",[852,1749,882],{},", because\nthose browser session flows still depend on bot detection and the CSRF cookie.",[848,1752,1753,1754,1757],{},"On success, the wrapper populates ",[852,1755,1756],{},"event.context.apiVerification"," with the\nverified token metadata. On failure, it returns a normalized JSON response and\nuses the same status code returned by IAM. Rate limits are only applied to\ninvalid or abusive verification attempts. Successful verification calls are not rate\nlimited by the wrapper.",[1108,1759,1762],{"className":1110,"code":1760,"filename":1761,"language":1113,"meta":1114,"style":1114},"export default defineAuthenticatePublicApi(async (event) => {\n  const token = event.context.apiVerification\n\n  return {\n    ok: true,\n    tokenId: token.tokenId,\n    userId: token.userId,\n    privilege: token.providedPrivilege,\n  }\n}, 'demo')\n","server\u002Fapi\u002Fpublic\u002Freports.get.ts",[852,1763,1764,1787,1807,1811,1817,1828,1844,1859,1875,1879],{"__ignoreMap":1114},[1118,1765,1766,1768,1770,1773,1775,1777,1779,1781,1783,1785],{"class":1120,"line":1121},[1118,1767,1125],{"class":1124},[1118,1769,1128],{"class":1124},[1118,1771,1772],{"class":1131}," defineAuthenticatePublicApi",[1118,1774,1136],{"class":1135},[1118,1776,1140],{"class":1139},[1118,1778,1143],{"class":1135},[1118,1780,1147],{"class":1146},[1118,1782,1150],{"class":1135},[1118,1784,1153],{"class":1139},[1118,1786,1156],{"class":1135},[1118,1788,1789,1791,1794,1796,1798,1800,1802,1804],{"class":1120,"line":1159},[1118,1790,1162],{"class":1139},[1118,1792,1793],{"class":1168}," token",[1118,1795,1408],{"class":1180},[1118,1797,1185],{"class":1184},[1118,1799,1188],{"class":1135},[1118,1801,1191],{"class":1184},[1118,1803,1188],{"class":1135},[1118,1805,1806],{"class":1184},"apiVerification\n",[1118,1808,1809],{"class":1120,"line":1199},[1118,1810,1428],{"emptyLinePlaceholder":8},[1118,1812,1813,1815],{"class":1120,"line":1216},[1118,1814,1202],{"class":1124},[1118,1816,1156],{"class":1135},[1118,1818,1819,1822,1824,1826],{"class":1120,"line":1286},[1118,1820,1821],{"class":1184},"    ok",[1118,1823,1228],{"class":1454},[1118,1825,1596],{"class":1595},[1118,1827,1701],{"class":1135},[1118,1829,1830,1833,1835,1837,1839,1842],{"class":1120,"line":1296},[1118,1831,1832],{"class":1184},"    tokenId",[1118,1834,1228],{"class":1454},[1118,1836,1793],{"class":1184},[1118,1838,1188],{"class":1135},[1118,1840,1841],{"class":1184},"tokenId",[1118,1843,1701],{"class":1135},[1118,1845,1846,1849,1851,1853,1855,1857],{"class":1120,"line":1306},[1118,1847,1848],{"class":1184},"    userId",[1118,1850,1228],{"class":1454},[1118,1852,1793],{"class":1184},[1118,1854,1188],{"class":1135},[1118,1856,1169],{"class":1184},[1118,1858,1701],{"class":1135},[1118,1860,1861,1864,1866,1868,1870,1873],{"class":1120,"line":1316},[1118,1862,1863],{"class":1184},"    privilege",[1118,1865,1228],{"class":1454},[1118,1867,1793],{"class":1184},[1118,1869,1188],{"class":1135},[1118,1871,1872],{"class":1184},"providedPrivilege",[1118,1874,1701],{"class":1135},[1118,1876,1877],{"class":1120,"line":1326},[1118,1878,1484],{"class":1135},[1118,1880,1881,1884,1886,1889,1891],{"class":1120,"line":1336},[1118,1882,1883],{"class":1135},"}, ",[1118,1885,1465],{"class":1457},[1118,1887,1888],{"class":1461},"demo",[1118,1890,1465],{"class":1457},[1118,1892,1576],{"class":1135},[848,1894,1895,1224,1897,1228],{},[852,1896,1756],{},[852,1898,1899],{},"VerifySuccessResponse",[1108,1901,1903],{"className":1110,"code":1902,"language":1113,"meta":1114,"style":1114},"interface VerifySuccessResponse {\n  name: string\n  tokenId: number\n  userId: number\n  createdAt: string\n  expiresAt: string\n  lastUsed: string\n  usageCount: number\n  providedPrivilege: 'custom' | 'demo' | 'restricted' | 'protected' | 'full'\n}\n",[852,1904,1905,1914,1923,1933,1941,1950,1959,1968,1977,2028],{"__ignoreMap":1114},[1118,1906,1907,1909,1912],{"class":1120,"line":1121},[1118,1908,1238],{"class":1139},[1118,1910,1911],{"class":1241}," VerifySuccessResponse",[1118,1913,1156],{"class":1135},[1118,1915,1916,1919,1921],{"class":1120,"line":1159},[1118,1917,1918],{"class":1184},"  name",[1118,1920,1228],{"class":1180},[1118,1922,1265],{"class":1241},[1118,1924,1925,1928,1930],{"class":1120,"line":1199},[1118,1926,1927],{"class":1184},"  tokenId",[1118,1929,1228],{"class":1180},[1118,1931,1932],{"class":1241}," number\n",[1118,1934,1935,1937,1939],{"class":1120,"line":1216},[1118,1936,1259],{"class":1184},[1118,1938,1228],{"class":1180},[1118,1940,1932],{"class":1241},[1118,1942,1943,1946,1948],{"class":1120,"line":1286},[1118,1944,1945],{"class":1184},"  createdAt",[1118,1947,1228],{"class":1180},[1118,1949,1265],{"class":1241},[1118,1951,1952,1955,1957],{"class":1120,"line":1296},[1118,1953,1954],{"class":1184},"  expiresAt",[1118,1956,1228],{"class":1180},[1118,1958,1265],{"class":1241},[1118,1960,1961,1964,1966],{"class":1120,"line":1306},[1118,1962,1963],{"class":1184},"  lastUsed",[1118,1965,1228],{"class":1180},[1118,1967,1265],{"class":1241},[1118,1969,1970,1973,1975],{"class":1120,"line":1316},[1118,1971,1972],{"class":1184},"  usageCount",[1118,1974,1228],{"class":1180},[1118,1976,1932],{"class":1241},[1118,1978,1979,1982,1984,1986,1989,1991,1994,1996,1998,2000,2002,2004,2007,2009,2011,2013,2016,2018,2020,2022,2025],{"class":1120,"line":1326},[1118,1980,1981],{"class":1184},"  providedPrivilege",[1118,1983,1228],{"class":1180},[1118,1985,1458],{"class":1457},[1118,1987,1988],{"class":1461},"custom",[1118,1990,1465],{"class":1457},[1118,1992,1993],{"class":1180}," |",[1118,1995,1458],{"class":1457},[1118,1997,1888],{"class":1461},[1118,1999,1465],{"class":1457},[1118,2001,1993],{"class":1180},[1118,2003,1458],{"class":1457},[1118,2005,2006],{"class":1461},"restricted",[1118,2008,1465],{"class":1457},[1118,2010,1993],{"class":1180},[1118,2012,1458],{"class":1457},[1118,2014,2015],{"class":1461},"protected",[1118,2017,1465],{"class":1457},[1118,2019,1993],{"class":1180},[1118,2021,1458],{"class":1457},[1118,2023,2024],{"class":1461},"full",[1118,2026,2027],{"class":1457},"'\n",[1118,2029,2030],{"class":1120,"line":1336},[1118,2031,1349],{"class":1135},[884,2033],{},[887,2035,2037],{"id":2036},"defineapimanagementhandler",[852,2038,882],{},[848,2040,2041,2042,2045,2046,2049,2050,2053],{},"Use this wrapper for authenticated POST routes that create, rotate, revoke, or\ninspect API tokens on behalf of the logged-in user. The implementation wraps\n",[852,2043,2044],{},"defineAuthenticatedEventPostHandlers(...)"," with\n",[852,2047,2048],{},"defineByteLimiterHandler(..., 2000, 'POST')",", so the raw body is size-checked\nand parsed into ",[852,2051,2052],{},"event.context.body"," before the action-specific IAM proxy logic\nruns.",[848,2055,2056],{},"The wrapper supports these actions:",[868,2058,2059,2064,2069,2074,2079,2084],{},[871,2060,2061],{},[852,2062,2063],{},"new-token",[871,2065,2066],{},[852,2067,2068],{},"revoke",[871,2070,2071],{},[852,2072,2073],{},"metadata",[871,2075,2076],{},[852,2077,2078],{},"rotate",[871,2080,2081],{},[852,2082,2083],{},"ip-restriction-update",[871,2085,2086],{},[852,2087,2088],{},"privilege-update",[848,2090,2091],{},"The wrapper accepts different request bodies depending on the action:",[892,2093,2094,2107],{},[895,2095,2096],{},[898,2097,2098,2101,2104],{},[901,2099,2100],{},"Action",[901,2102,2103],{},"Request body accepted by the wrapper",[901,2105,2106],{},"What the wrapper adds before calling IAM",[917,2108,2109,2125,2144,2160,2176,2193],{},[898,2110,2111,2115,2120],{},[922,2112,2113],{},[852,2114,2063],{},[922,2116,2117],{},[852,2118,2119],{},"{ name, prefix, ipv4?, expires? }",[922,2121,2122],{},[852,2123,2124],{},"privilege: allowedPrivilege",[898,2126,2127,2131,2136],{},[922,2128,2129],{},[852,2130,2068],{},[922,2132,2133],{},[852,2134,2135],{},"{ tokenId }",[922,2137,2138,1031,2141],{},[852,2139,2140],{},"publicIdentifier",[852,2142,2143],{},"name",[898,2145,2146,2150,2154],{},[922,2147,2148],{},[852,2149,2073],{},[922,2151,2152],{},[852,2153,2135],{},[922,2155,2156,1031,2158],{},[852,2157,2140],{},[852,2159,2143],{},[898,2161,2162,2166,2170],{},[922,2163,2164],{},[852,2165,2078],{},[922,2167,2168],{},[852,2169,2135],{},[922,2171,2172,1031,2174],{},[852,2173,2140],{},[852,2175,2143],{},[898,2177,2178,2182,2187],{},[922,2179,2180],{},[852,2181,2083],{},[922,2183,2184],{},[852,2185,2186],{},"{ tokenId, ipv4? }",[922,2188,2189,1031,2191],{},[852,2190,2140],{},[852,2192,2143],{},[898,2194,2195,2199,2203],{},[922,2196,2197],{},[852,2198,2088],{},[922,2200,2201],{},[852,2202,2135],{},[922,2204,2205,1031,2207,1031,2209],{},[852,2206,2140],{},[852,2208,2143],{},[852,2210,2211],{},"newPrivilege: updateToNewPrivilege",[848,2213,2214,2215,2217,2218,2220,2221,2224,2225,2227,2228,2230],{},"For every action except ",[852,2216,2063],{},", the client submits only ",[852,2219,1841],{},". The\nwrapper first calls IAM ",[852,2222,2223],{},"\u002Fapi\u002Fmanage\u002Flist-metadata",", resolves the matching\ntoken row, and then forwards ",[852,2226,2140],{}," and ",[852,2229,2143],{}," to IAM. This keeps\ntoken identity details in the server layer instead of exposing them to the\nclient.",[848,2232,2233,2236,2237,2240,2241,2243,2244,1188],{},[852,2234,2235],{},"allowedPrivilege"," controls the privilege assigned to newly created tokens.\n",[852,2238,2239],{},"updateToNewPrivilege"," is optional, but you must provide it if you want the\n",[852,2242,2088],{}," action to succeed. It controls the level that can be\nupdated, and the client request body does not supply ",[852,2245,2246],{},"newPrivilege",[848,2248,2249,2250,2252,2253,2256,2257,2259,2260,2263,2264,1188],{},"On ",[852,2251,2063],{},", IAM returns ",[852,2254,2255],{},"rawPublicId"," in addition to the raw key. The\nwrapper removes ",[852,2258,2255],{}," and exposes only ",[852,2261,2262],{},"{ rawApiKey, expiresAt }"," on\n",[852,2265,2266],{},"event.context.newApiToken",[848,2268,2269,2270,1188],{},"For the raw IAM route contracts behind these wrapper calls, see the\n",[2271,2272,2273],"a",{"href":485},"IAM API token docs",[1108,2275,2278],{"className":1110,"code":2276,"filename":2277,"language":1113,"meta":1114,"style":1114},"export default defineApiManagementHandler(async (event) => {\n  const action = event.context.params?.action\n\n  if (action === 'new-token') {\n    return { ok: true, data: event.context.newApiToken }\n  }\n\n  if (action === 'metadata') {\n    return { ok: true, data: event.context.extensiveMetadata }\n  }\n\n  if (action === 'rotate') {\n    return { ok: true, data: event.context.rotate }\n  }\n\n  return { ok: true }\n}, 'demo', 'protected')\n","server\u002Fapi\u002Fauth\u002Fapi-tokens\u002F[action].post.ts",[852,2279,2280,2303,2329,2333,2353,2385,2389,2393,2411,2442,2446,2450,2469,2500,2505,2510,2525],{"__ignoreMap":1114},[1118,2281,2282,2284,2286,2289,2291,2293,2295,2297,2299,2301],{"class":1120,"line":1121},[1118,2283,1125],{"class":1124},[1118,2285,1128],{"class":1124},[1118,2287,2288],{"class":1131}," defineApiManagementHandler",[1118,2290,1136],{"class":1135},[1118,2292,1140],{"class":1139},[1118,2294,1143],{"class":1135},[1118,2296,1147],{"class":1146},[1118,2298,1150],{"class":1135},[1118,2300,1153],{"class":1139},[1118,2302,1156],{"class":1135},[1118,2304,2305,2307,2310,2312,2314,2316,2318,2320,2323,2326],{"class":1120,"line":1159},[1118,2306,1162],{"class":1139},[1118,2308,2309],{"class":1168}," action",[1118,2311,1408],{"class":1180},[1118,2313,1185],{"class":1184},[1118,2315,1188],{"class":1135},[1118,2317,1191],{"class":1184},[1118,2319,1188],{"class":1135},[1118,2321,2322],{"class":1184},"params",[1118,2324,2325],{"class":1135},"?.",[1118,2327,2328],{"class":1184},"action\n",[1118,2330,2331],{"class":1120,"line":1199},[1118,2332,1428],{"emptyLinePlaceholder":8},[1118,2334,2335,2337,2339,2342,2345,2347,2349,2351],{"class":1120,"line":1216},[1118,2336,1433],{"class":1124},[1118,2338,1143],{"class":1135},[1118,2340,2341],{"class":1184},"action",[1118,2343,2344],{"class":1180}," ===",[1118,2346,1458],{"class":1457},[1118,2348,2063],{"class":1461},[1118,2350,1465],{"class":1457},[1118,2352,1441],{"class":1135},[1118,2354,2355,2357,2359,2361,2363,2365,2367,2370,2372,2374,2376,2378,2380,2383],{"class":1120,"line":1286},[1118,2356,1446],{"class":1124},[1118,2358,1165],{"class":1135},[1118,2360,1590],{"class":1184},[1118,2362,1228],{"class":1454},[1118,2364,1596],{"class":1595},[1118,2366,1031],{"class":1135},[1118,2368,2369],{"class":1184},"data",[1118,2371,1228],{"class":1454},[1118,2373,1185],{"class":1184},[1118,2375,1188],{"class":1135},[1118,2377,1191],{"class":1184},[1118,2379,1188],{"class":1135},[1118,2381,2382],{"class":1184},"newApiToken",[1118,2384,1213],{"class":1135},[1118,2386,2387],{"class":1120,"line":1296},[1118,2388,1484],{"class":1135},[1118,2390,2391],{"class":1120,"line":1306},[1118,2392,1428],{"emptyLinePlaceholder":8},[1118,2394,2395,2397,2399,2401,2403,2405,2407,2409],{"class":1120,"line":1316},[1118,2396,1433],{"class":1124},[1118,2398,1143],{"class":1135},[1118,2400,2341],{"class":1184},[1118,2402,2344],{"class":1180},[1118,2404,1458],{"class":1457},[1118,2406,2073],{"class":1461},[1118,2408,1465],{"class":1457},[1118,2410,1441],{"class":1135},[1118,2412,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2440],{"class":1120,"line":1326},[1118,2414,1446],{"class":1124},[1118,2416,1165],{"class":1135},[1118,2418,1590],{"class":1184},[1118,2420,1228],{"class":1454},[1118,2422,1596],{"class":1595},[1118,2424,1031],{"class":1135},[1118,2426,2369],{"class":1184},[1118,2428,1228],{"class":1454},[1118,2430,1185],{"class":1184},[1118,2432,1188],{"class":1135},[1118,2434,1191],{"class":1184},[1118,2436,1188],{"class":1135},[1118,2438,2439],{"class":1184},"extensiveMetadata",[1118,2441,1213],{"class":1135},[1118,2443,2444],{"class":1120,"line":1336},[1118,2445,1484],{"class":1135},[1118,2447,2448],{"class":1120,"line":1346},[1118,2449,1428],{"emptyLinePlaceholder":8},[1118,2451,2453,2455,2457,2459,2461,2463,2465,2467],{"class":1120,"line":2452},12,[1118,2454,1433],{"class":1124},[1118,2456,1143],{"class":1135},[1118,2458,2341],{"class":1184},[1118,2460,2344],{"class":1180},[1118,2462,1458],{"class":1457},[1118,2464,2078],{"class":1461},[1118,2466,1465],{"class":1457},[1118,2468,1441],{"class":1135},[1118,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498],{"class":1120,"line":2471},13,[1118,2473,1446],{"class":1124},[1118,2475,1165],{"class":1135},[1118,2477,1590],{"class":1184},[1118,2479,1228],{"class":1454},[1118,2481,1596],{"class":1595},[1118,2483,1031],{"class":1135},[1118,2485,2369],{"class":1184},[1118,2487,1228],{"class":1454},[1118,2489,1185],{"class":1184},[1118,2491,1188],{"class":1135},[1118,2493,1191],{"class":1184},[1118,2495,1188],{"class":1135},[1118,2497,2078],{"class":1184},[1118,2499,1213],{"class":1135},[1118,2501,2503],{"class":1120,"line":2502},14,[1118,2504,1484],{"class":1135},[1118,2506,2508],{"class":1120,"line":2507},15,[1118,2509,1428],{"emptyLinePlaceholder":8},[1118,2511,2513,2515,2517,2519,2521,2523],{"class":1120,"line":2512},16,[1118,2514,1202],{"class":1124},[1118,2516,1165],{"class":1135},[1118,2518,1590],{"class":1184},[1118,2520,1228],{"class":1454},[1118,2522,1596],{"class":1595},[1118,2524,1213],{"class":1135},[1118,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544],{"class":1120,"line":2527},17,[1118,2529,1883],{"class":1135},[1118,2531,1465],{"class":1457},[1118,2533,1888],{"class":1461},[1118,2535,1465],{"class":1457},[1118,2537,1031],{"class":1135},[1118,2539,1465],{"class":1457},[1118,2541,2015],{"class":1461},[1118,2543,1465],{"class":1457},[1118,2545,1576],{"class":1135},[848,2547,2548],{},"This wrapper populates one of several action-specific fields on the H3 event\ncontext:",[892,2550,2551,2566],{},[895,2552,2553],{},[898,2554,2555,2557,2563],{},[901,2556,2100],{},[901,2558,2559,2562],{},[852,2560,2561],{},"event.context"," field",[901,2564,2565],{},"Value",[917,2567,2568,2582,2598,2613,2632,2647],{},[898,2569,2570,2574,2578],{},[922,2571,2572],{},[852,2573,2063],{},[922,2575,2576],{},[852,2577,2382],{},[922,2579,2580],{},[852,2581,2262],{},[898,2583,2584,2588,2593],{},[922,2585,2586],{},[852,2587,2083],{},[922,2589,2590],{},[852,2591,2592],{},"ipRestrictionUpdate",[922,2594,2595],{},[852,2596,2597],{},"{ msg }",[898,2599,2600,2604,2609],{},[922,2601,2602],{},[852,2603,2088],{},[922,2605,2606],{},[852,2607,2608],{},"privilegeUpdate",[922,2610,2611],{},[852,2612,2597],{},[898,2614,2615,2619,2623],{},[922,2616,2617],{},[852,2618,2068],{},[922,2620,2621],{},[852,2622,2068],{},[922,2624,2625,2628,2629],{},[852,2626,2627],{},"string"," or ",[852,2630,2631],{},"{ msg, invalidedTokenId, userId }",[898,2633,2634,2638,2642],{},[922,2635,2636],{},[852,2637,2073],{},[922,2639,2640],{},[852,2641,2439],{},[922,2643,2644],{},[852,2645,2646],{},"{ tokenMeta, counts }",[898,2648,2649,2653,2657],{},[922,2650,2651],{},[852,2652,2078],{},[922,2654,2655],{},[852,2656,2078],{},[922,2658,2659],{},[852,2660,2661],{},"{ msg, newRawToken, newExpiry }",[848,2663,2664,2667,2668,2670],{},[852,2665,2666],{},"list-metadata"," is intentionally rejected on POST. Use ",[852,2669,1747],{},"\nfor the authenticated GET route instead.",[884,2672],{},[887,2674,2676],{"id":2675},"definebytelimiterhandler",[852,2677,1019],{},[848,2679,2680,2681,2684,2685,1188],{},"Use this wrapper when you need a low-level raw-body size limit before JSON\nparsing. It asserts the request method, checks ",[852,2682,2683],{},"Content-Length"," when present,\nreads the raw body once, rejects bodies larger than your limit, and stores the\nparsed JSON object on ",[852,2686,2052],{},[848,2688,2689,2691],{},[852,2690,882],{}," uses this body parser. Use it\ndirectly for other custom routes when you need a strict byte limit before any\nschema validation runs.",[1108,2693,2696],{"className":1110,"code":2694,"filename":2695,"language":1113,"meta":1114,"style":1114},"export default defineByteLimiterHandler(async (event) => {\n  const body = event.context.body\n  return { ok: true, body }\n}, 2048, 'POST')\n","server\u002Fapi\u002Fupload-metadata.post.ts",[852,2697,2698,2721,2740,2759],{"__ignoreMap":1114},[1118,2699,2700,2702,2704,2707,2709,2711,2713,2715,2717,2719],{"class":1120,"line":1121},[1118,2701,1125],{"class":1124},[1118,2703,1128],{"class":1124},[1118,2705,2706],{"class":1131}," defineByteLimiterHandler",[1118,2708,1136],{"class":1135},[1118,2710,1140],{"class":1139},[1118,2712,1143],{"class":1135},[1118,2714,1147],{"class":1146},[1118,2716,1150],{"class":1135},[1118,2718,1153],{"class":1139},[1118,2720,1156],{"class":1135},[1118,2722,2723,2725,2727,2729,2731,2733,2735,2737],{"class":1120,"line":1159},[1118,2724,1162],{"class":1139},[1118,2726,1561],{"class":1168},[1118,2728,1408],{"class":1180},[1118,2730,1185],{"class":1184},[1118,2732,1188],{"class":1135},[1118,2734,1191],{"class":1184},[1118,2736,1188],{"class":1135},[1118,2738,2739],{"class":1184},"body\n",[1118,2741,2742,2744,2746,2748,2750,2752,2754,2757],{"class":1120,"line":1199},[1118,2743,1202],{"class":1124},[1118,2745,1165],{"class":1135},[1118,2747,1590],{"class":1184},[1118,2749,1228],{"class":1454},[1118,2751,1596],{"class":1595},[1118,2753,1031],{"class":1135},[1118,2755,2756],{"class":1184},"body",[1118,2758,1213],{"class":1135},[1118,2760,2761,2763,2767,2769,2771,2773,2775],{"class":1120,"line":1216},[1118,2762,1883],{"class":1135},[1118,2764,2766],{"class":2765},"spgvN","2048",[1118,2768,1031],{"class":1135},[1118,2770,1465],{"class":1457},[1118,2772,1030],{"class":1461},[1118,2774,1465],{"class":1457},[1118,2776,1576],{"class":1135},[848,2778,2779,2780,2782,2783,2785],{},"If the request body is empty, ",[852,2781,2052],{}," is left as ",[852,2784,1368],{}," and\nyour handler still runs.",[884,2787],{},[887,2789,2791],{"id":2790},"defineverifiedmagiclinkgethandler",[852,2792,1045],{},[848,2794,2795,2796,1031,2799,1704,2802,2805,2806,1143,2809,1031,2812,1031,2815,1031,2818,2821],{},"Validates incoming magic link query parameters before running the handler. It checks that the request is a GET, that the ",[852,2797,2798],{},"canary_id",[852,2800,2801],{},"session",[852,2803,2804],{},"__Secure-a"," cookies exist, and that the query string matches the ",[852,2807,2808],{},"VerificationLinkSchema",[852,2810,2811],{},"visitor",[852,2813,2814],{},"token",[852,2816,2817],{},"random",[852,2819,2820],{},"reason","). After schema validation it calls the IAM service to verify the link.",[848,2823,2824,2825,2227,2828,2831],{},"On success, ",[852,2826,2827],{},"event.context.link",[852,2829,2830],{},"event.context.reason"," are populated from the IAM response:",[1108,2833,2836],{"className":1110,"code":2834,"filename":2835,"language":1113,"meta":1114,"style":1114},"export default defineVerifiedMagicLinkGetHandler(async (event) => {\n  const { link, reason } = event.context\n  \u002F\u002F Link is verified; render the page or return data for the frontend\n  return { ok: true, reason }\n})\n","server\u002Fapi\u002Fauth\u002Fverify-mfa.get.ts",[852,2837,2838,2861,2885,2890,2908],{"__ignoreMap":1114},[1118,2839,2840,2842,2844,2847,2849,2851,2853,2855,2857,2859],{"class":1120,"line":1121},[1118,2841,1125],{"class":1124},[1118,2843,1128],{"class":1124},[1118,2845,2846],{"class":1131}," defineVerifiedMagicLinkGetHandler",[1118,2848,1136],{"class":1135},[1118,2850,1140],{"class":1139},[1118,2852,1143],{"class":1135},[1118,2854,1147],{"class":1146},[1118,2856,1150],{"class":1135},[1118,2858,1153],{"class":1139},[1118,2860,1156],{"class":1135},[1118,2862,2863,2865,2867,2870,2872,2874,2876,2878,2880,2882],{"class":1120,"line":1159},[1118,2864,1162],{"class":1139},[1118,2866,1165],{"class":1135},[1118,2868,2869],{"class":1168},"link",[1118,2871,1031],{"class":1135},[1118,2873,2820],{"class":1168},[1118,2875,1177],{"class":1135},[1118,2877,1181],{"class":1180},[1118,2879,1185],{"class":1184},[1118,2881,1188],{"class":1135},[1118,2883,2884],{"class":1184},"context\n",[1118,2886,2887],{"class":1120,"line":1199},[1118,2888,2889],{"class":1422},"  \u002F\u002F Link is verified; render the page or return data for the frontend\n",[1118,2891,2892,2894,2896,2898,2900,2902,2904,2906],{"class":1120,"line":1216},[1118,2893,1202],{"class":1124},[1118,2895,1165],{"class":1135},[1118,2897,1590],{"class":1184},[1118,2899,1228],{"class":1454},[1118,2901,1596],{"class":1595},[1118,2903,1031],{"class":1135},[1118,2905,2820],{"class":1184},[1118,2907,1213],{"class":1135},[1118,2909,2910],{"class":1120,"line":1286},[1118,2911,1219],{"class":1135},[1733,2913,2914],{},[848,2915,2916],{},"This wrapper does not validate a CSRF token because it is designed for GET requests arriving from an email link, to let callers render pages for the right user.",[884,2918],{},[887,2920,2922],{"id":2921},"definemfacodeverifierhandler",[852,2923,1061],{},[848,2925,2926,2927,2930],{},"Validates an MFA code submitted after a magic link is verified. It enforces POST method, verifies the CSRF cookie, limits the request body to 8 MB, validates the link query parameters, reads ",[852,2928,2929],{},"event.context.body.code"," (a 7-digit numeric string), and sends the code to the IAM service for verification. On success, tokens are rotated automatically and the new cookies are applied to the response before your handler runs.",[1108,2932,2935],{"className":1110,"code":2933,"filename":2934,"language":1113,"meta":1114,"style":1114},"export default defineMfaCodeVerifierHandler(async (event) => {\n  \u002F\u002F Code verified, tokens are already rotated\n  return { ok: true }\n})\n","server\u002Fapi\u002Fauth\u002Fverify-mfa.post.ts",[852,2936,2937,2960,2965,2979],{"__ignoreMap":1114},[1118,2938,2939,2941,2943,2946,2948,2950,2952,2954,2956,2958],{"class":1120,"line":1121},[1118,2940,1125],{"class":1124},[1118,2942,1128],{"class":1124},[1118,2944,2945],{"class":1131}," defineMfaCodeVerifierHandler",[1118,2947,1136],{"class":1135},[1118,2949,1140],{"class":1139},[1118,2951,1143],{"class":1135},[1118,2953,1147],{"class":1146},[1118,2955,1150],{"class":1135},[1118,2957,1153],{"class":1139},[1118,2959,1156],{"class":1135},[1118,2961,2962],{"class":1120,"line":1159},[1118,2963,2964],{"class":1422},"  \u002F\u002F Code verified, tokens are already rotated\n",[1118,2966,2967,2969,2971,2973,2975,2977],{"class":1120,"line":1199},[1118,2968,1202],{"class":1124},[1118,2970,1165],{"class":1135},[1118,2972,1590],{"class":1184},[1118,2974,1228],{"class":1454},[1118,2976,1596],{"class":1595},[1118,2978,1213],{"class":1135},[1118,2980,2981],{"class":1120,"line":1216},[1118,2982,1219],{"class":1135},[848,2984,2985,2986,2988,2989,2991],{},"The code must be present in the parsed request body as ",[852,2987,852],{},". Read the body before this wrapper runs, or use ",[852,2990,2052],{}," if a body-parsing middleware already ran upstream.",[884,2993],{},[887,2995,2997],{"id":2996},"definededuplicatedeventhandler",[852,2998,1076],{},[848,3000,3001],{},"Wraps a handler with request deduplication. Concurrent requests with the same identity are coalesced so that only one execution runs at a time. Use this for handlers that must not run concurrently per session, such as checkout or idempotent write operations.",[1108,3003,3006],{"className":1110,"code":3004,"filename":3005,"language":1113,"meta":1114,"style":1114},"export default defineDeduplicatedEventHandler(async (event) => {\n  await processCheckout(event)\n  return { ok: true }\n})\n","server\u002Fapi\u002Fcheckout.post.ts",[852,3007,3008,3031,3044,3058],{"__ignoreMap":1114},[1118,3009,3010,3012,3014,3017,3019,3021,3023,3025,3027,3029],{"class":1120,"line":1121},[1118,3011,1125],{"class":1124},[1118,3013,1128],{"class":1124},[1118,3015,3016],{"class":1131}," defineDeduplicatedEventHandler",[1118,3018,1136],{"class":1135},[1118,3020,1140],{"class":1139},[1118,3022,1143],{"class":1135},[1118,3024,1147],{"class":1146},[1118,3026,1150],{"class":1135},[1118,3028,1153],{"class":1139},[1118,3030,1156],{"class":1135},[1118,3032,3033,3035,3038,3040,3042],{"class":1120,"line":1159},[1118,3034,1668],{"class":1124},[1118,3036,3037],{"class":1131}," processCheckout",[1118,3039,1136],{"class":1135},[1118,3041,1147],{"class":1184},[1118,3043,1576],{"class":1135},[1118,3045,3046,3048,3050,3052,3054,3056],{"class":1120,"line":1199},[1118,3047,1202],{"class":1124},[1118,3049,1165],{"class":1135},[1118,3051,1590],{"class":1184},[1118,3053,1228],{"class":1454},[1118,3055,1596],{"class":1595},[1118,3057,1213],{"class":1135},[1118,3059,3060],{"class":1120,"line":1216},[1118,3061,1219],{"class":1135},[848,3063,3064,3065,1031,3068,1031,3071,1031,3074,1031,3077,3080],{},"The built-in controllers (",[852,3066,3067],{},"loginHandler",[852,3069,3070],{},"logoutHandler",[852,3072,3073],{},"signUpHandler",[852,3075,3076],{},"restartPasswordHandler",[852,3078,3079],{},"sendMfaCodeHandler",") already use this wrapper internally.",[884,3082],{},[887,3084,3086],{"id":3085},"event-context-fields-added-by-wrappers","Event context fields added by wrappers",[848,3088,3089],{},"The wrapper layer extends the H3 event context so your handler can read the\nresult of each verification step without repeating verification logic.",[892,3091,3092,3105],{},[895,3093,3094],{},[898,3095,3096,3099,3102],{},[901,3097,3098],{},"Field",[901,3100,3101],{},"Set by",[901,3103,3104],{},"Meaning",[917,3106,3107,3122,3136,3149,3163,3177,3190,3203,3216,3229,3242,3255],{},[898,3108,3109,3113,3119],{},[922,3110,3111],{},[852,3112,1419],{},[922,3114,3115,1031,3117],{},[852,3116,926],{},[852,3118,944],{},[922,3120,3121],{},"Verified user session data",[898,3123,3124,3129,3133],{},[922,3125,3126],{},[852,3127,3128],{},"accessToken",[922,3130,3131],{},[852,3132,1097],{},[922,3134,3135],{},"Current or rotated access token",[898,3137,3138,3142,3146],{},[922,3139,3140],{},[852,3141,2801],{},[922,3143,3144],{},[852,3145,1097],{},[922,3147,3148],{},"Current or rotated refresh token",[898,3150,3151,3156,3160],{},[922,3152,3153],{},[852,3154,3155],{},"limitedMetaData",[922,3157,3158],{},[852,3159,1061],{},[922,3161,3162],{},"Verified MFA result after token rotation",[898,3164,3165,3170,3174],{},[922,3166,3167],{},[852,3168,3169],{},"apiVerification",[922,3171,3172],{},[852,3173,876],{},[922,3175,3176],{},"Verified API token metadata",[898,3178,3179,3183,3187],{},[922,3180,3181],{},[852,3182,2382],{},[922,3184,3185],{},[852,3186,882],{},[922,3188,3189],{},"Token creation result",[898,3191,3192,3196,3200],{},[922,3193,3194],{},[852,3195,2592],{},[922,3197,3198],{},[852,3199,882],{},[922,3201,3202],{},"IP restriction update result",[898,3204,3205,3209,3213],{},[922,3206,3207],{},[852,3208,2608],{},[922,3210,3211],{},[852,3212,882],{},[922,3214,3215],{},"Privilege update result",[898,3217,3218,3222,3226],{},[922,3219,3220],{},[852,3221,2068],{},[922,3223,3224],{},[852,3225,882],{},[922,3227,3228],{},"Revocation result",[898,3230,3231,3235,3239],{},[922,3232,3233],{},[852,3234,2439],{},[922,3236,3237],{},[852,3238,882],{},[922,3240,3241],{},"Single-token metadata result",[898,3243,3244,3248,3252],{},[922,3245,3246],{},[852,3247,2078],{},[922,3249,3250],{},[852,3251,882],{},[922,3253,3254],{},"Token rotation result",[898,3256,3257,3261,3265],{},[922,3258,3259],{},[852,3260,2756],{},[922,3262,3263],{},[852,3264,1019],{},[922,3266,3267],{},"Parsed JSON body",[884,3269],{},[887,3271,3273],{"id":3272},"making-a-custom-wrapper","Making a Custom wrapper",[848,3275,3276],{},"Make your own custom wrappers by simply following the pattern in this module, for example a wrapper that requires auth and csrf and its deduplicated:",[1108,3278,3281],{"className":1110,"code":3279,"filename":3280,"language":1113,"meta":1114,"style":1114},"import { defineEventHandler, type EventHandler, type EventHandlerRequest } from 'h3';\nimport { defineAuthenticatedEventPostHandlers, defineDeduplicatedEventHandler } from 'auth-h3client';\n\nexport const myCustomEventHandler = \u003CT extends EventHandlerRequest, D>(\n  handler: EventHandler\u003CT, D>\n): EventHandler\u003CT, Promise\u003CD>> => {\n  \n  return defineAuthenticatedEventPostHandlers(\n    defineDeduplicatedEventHandler(\n      defineEventHandler((event) => {\n        \n        \u002F\u002F Do stuff\n\n        return handler(event);\n      })\n    ) as EventHandler\u003CT, D>\n    );\n};\n\n\u002F\u002F usage\n\nexport default myCustomEventHandler(async (event) => {\n  \u002F\u002F stuff\n})\n\n","myWrapper.ts",[852,3282,3283,3323,3347,3351,3383,3404,3433,3438,3447,3454,3470,3475,3480,3484,3499,3504,3524,3529,3535,3540,3546,3551,3574,3580],{"__ignoreMap":1114},[1118,3284,3285,3288,3290,3293,3295,3298,3301,3303,3305,3308,3310,3313,3315,3318,3320],{"class":1120,"line":1121},[1118,3286,3287],{"class":1124},"import",[1118,3289,1165],{"class":1135},[1118,3291,3292],{"class":1184},"defineEventHandler",[1118,3294,1031],{"class":1135},[1118,3296,3297],{"class":1124},"type",[1118,3299,3300],{"class":1184}," EventHandler",[1118,3302,1031],{"class":1135},[1118,3304,3297],{"class":1124},[1118,3306,3307],{"class":1184}," EventHandlerRequest",[1118,3309,1177],{"class":1135},[1118,3311,3312],{"class":1124},"from",[1118,3314,1458],{"class":1457},[1118,3316,3317],{"class":1461},"h3",[1118,3319,1465],{"class":1457},[1118,3321,3322],{"class":1135},";\n",[1118,3324,3325,3327,3329,3331,3333,3335,3337,3339,3341,3343,3345],{"class":1120,"line":1159},[1118,3326,3287],{"class":1124},[1118,3328,1165],{"class":1135},[1118,3330,975],{"class":1184},[1118,3332,1031],{"class":1135},[1118,3334,1076],{"class":1184},[1118,3336,1177],{"class":1135},[1118,3338,3312],{"class":1124},[1118,3340,1458],{"class":1457},[1118,3342,854],{"class":1461},[1118,3344,1465],{"class":1457},[1118,3346,3322],{"class":1135},[1118,3348,3349],{"class":1120,"line":1199},[1118,3350,1428],{"emptyLinePlaceholder":8},[1118,3352,3353,3355,3358,3361,3363,3366,3370,3373,3375,3377,3380],{"class":1120,"line":1216},[1118,3354,1125],{"class":1124},[1118,3356,3357],{"class":1139}," const",[1118,3359,3360],{"class":1131}," myCustomEventHandler",[1118,3362,1408],{"class":1180},[1118,3364,3365],{"class":1135}," \u003C",[1118,3367,3369],{"class":3368},"sW-rI","T",[1118,3371,3372],{"class":1139}," extends",[1118,3374,3307],{"class":3368},[1118,3376,1031],{"class":1135},[1118,3378,3379],{"class":3368},"D",[1118,3381,3382],{"class":1135},">(\n",[1118,3384,3385,3388,3390,3392,3395,3397,3399,3401],{"class":1120,"line":1286},[1118,3386,3387],{"class":1146},"  handler",[1118,3389,1228],{"class":1180},[1118,3391,3300],{"class":1241},[1118,3393,3394],{"class":1135},"\u003C",[1118,3396,3369],{"class":3368},[1118,3398,1031],{"class":1135},[1118,3400,3379],{"class":3368},[1118,3402,3403],{"class":1135},">\n",[1118,3405,3406,3409,3411,3413,3415,3417,3419,3422,3424,3426,3429,3431],{"class":1120,"line":1296},[1118,3407,3408],{"class":1135},")",[1118,3410,1228],{"class":1180},[1118,3412,3300],{"class":1241},[1118,3414,3394],{"class":1135},[1118,3416,3369],{"class":3368},[1118,3418,1031],{"class":1135},[1118,3420,3421],{"class":3368},"Promise",[1118,3423,3394],{"class":1135},[1118,3425,3379],{"class":3368},[1118,3427,3428],{"class":1135},">> ",[1118,3430,1153],{"class":1139},[1118,3432,1156],{"class":1135},[1118,3434,3435],{"class":1120,"line":1306},[1118,3436,3437],{"class":1135},"  \n",[1118,3439,3440,3442,3444],{"class":1120,"line":1316},[1118,3441,1202],{"class":1124},[1118,3443,1627],{"class":1131},[1118,3445,3446],{"class":1135},"(\n",[1118,3448,3449,3452],{"class":1120,"line":1326},[1118,3450,3451],{"class":1131},"    defineDeduplicatedEventHandler",[1118,3453,3446],{"class":1135},[1118,3455,3456,3459,3462,3464,3466,3468],{"class":1120,"line":1336},[1118,3457,3458],{"class":1131},"      defineEventHandler",[1118,3460,3461],{"class":1135},"((",[1118,3463,1147],{"class":1146},[1118,3465,1150],{"class":1135},[1118,3467,1153],{"class":1139},[1118,3469,1156],{"class":1135},[1118,3471,3472],{"class":1120,"line":1346},[1118,3473,3474],{"class":1135},"        \n",[1118,3476,3477],{"class":1120,"line":2452},[1118,3478,3479],{"class":1422},"        \u002F\u002F Do stuff\n",[1118,3481,3482],{"class":1120,"line":2471},[1118,3483,1428],{"emptyLinePlaceholder":8},[1118,3485,3486,3489,3492,3494,3496],{"class":1120,"line":2502},[1118,3487,3488],{"class":1124},"        return",[1118,3490,3491],{"class":1131}," handler",[1118,3493,1136],{"class":1135},[1118,3495,1147],{"class":1184},[1118,3497,3498],{"class":1135},");\n",[1118,3500,3501],{"class":1120,"line":2507},[1118,3502,3503],{"class":1135},"      })\n",[1118,3505,3506,3509,3512,3514,3516,3518,3520,3522],{"class":1120,"line":2512},[1118,3507,3508],{"class":1135},"    ) ",[1118,3510,3511],{"class":1124},"as",[1118,3513,3300],{"class":1241},[1118,3515,3394],{"class":1135},[1118,3517,3369],{"class":3368},[1118,3519,1031],{"class":1135},[1118,3521,3379],{"class":3368},[1118,3523,3403],{"class":1135},[1118,3525,3526],{"class":1120,"line":2527},[1118,3527,3528],{"class":1135},"    );\n",[1118,3530,3532],{"class":1120,"line":3531},18,[1118,3533,3534],{"class":1135},"};\n",[1118,3536,3538],{"class":1120,"line":3537},19,[1118,3539,1428],{"emptyLinePlaceholder":8},[1118,3541,3543],{"class":1120,"line":3542},20,[1118,3544,3545],{"class":1422},"\u002F\u002F usage\n",[1118,3547,3549],{"class":1120,"line":3548},21,[1118,3550,1428],{"emptyLinePlaceholder":8},[1118,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570,3572],{"class":1120,"line":3553},22,[1118,3555,1125],{"class":1124},[1118,3557,1128],{"class":1124},[1118,3559,3360],{"class":1131},[1118,3561,1136],{"class":1135},[1118,3563,1140],{"class":1139},[1118,3565,1143],{"class":1135},[1118,3567,1147],{"class":1146},[1118,3569,1150],{"class":1135},[1118,3571,1153],{"class":1139},[1118,3573,1156],{"class":1135},[1118,3575,3577],{"class":1120,"line":3576},23,[1118,3578,3579],{"class":1422},"  \u002F\u002F stuff\n",[1118,3581,3583],{"class":1120,"line":3582},24,[1118,3584,1219],{"class":1135},[884,3586],{},[887,3588,3590],{"id":3589},"access-token-rotation-inside-wrappers","Access token rotation inside wrappers",[848,3592,3593,3594,2227,3596,3598,3599,3601],{},"Both ",[852,3595,926],{},[852,3597,944],{}," call ",[852,3600,1097],{}," before passing control to your handler. This means token rotation is transparent: if the access token is missing or near expiry, a fresh token pair is fetched from the IAM service and written to the response cookies before your handler reads any session data.",[3603,3604,3605],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}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 .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}",{"title":1114,"searchDepth":1159,"depth":1159,"links":3607},[3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621],{"id":889,"depth":1159,"text":890},{"id":1089,"depth":1159,"text":926},{"id":1354,"depth":1159,"text":944},{"id":1516,"depth":1159,"text":960},{"id":1607,"depth":1159,"text":975},{"id":1718,"depth":1159,"text":876},{"id":2036,"depth":1159,"text":882},{"id":2675,"depth":1159,"text":1019},{"id":2790,"depth":1159,"text":1045},{"id":2921,"depth":1159,"text":1061},{"id":2996,"depth":1159,"text":1076},{"id":3085,"depth":1159,"text":3086},{"id":3272,"depth":1159,"text":3273},{"id":3589,"depth":1159,"text":3590},"Event handler wrappers that enforce authentication, API-key verification, CSRF validation, body limits, and method requirements at the route definition level, with typed access to session data.","md","i-lucide-lock-keyhole",{},null,"---\ntitle: Route Protection\ndescription: Event handler wrappers that enforce authentication, API-key verification, CSRF validation, body limits, and method requirements at the route definition level, with typed access to session data.\nicon: i-lucide-lock-keyhole\n---\n\nThe module exports a set of event handler wrappers that enforce\nauthentication, API-key verification, CSRF requirements, request-body limits,\nand method requirements before your handler runs. Each wrapper is a\nhigher-order function that accepts your handler and returns a new handler with\nthe enforcement logic built in. Import them from `auth-h3client` (defaults to\nv1) or `auth-h3client\u002Fv2` depending on your H3 version. When using the Nuxt\nmodule, all wrappers are auto-imported inside the `server\u002F` directory.\n\nThe API token flows use two dedicated wrappers:\n\n- machine-to-machine protection with `defineAuthenticatePublicApi`\n- authenticated browser-side token management with\n  `defineApiManagementHandler`\n\n---\n\n## Wrapper overview\n\n| Wrapper | Session auth | API key | CSRF | Method |\n|---|---|---|---|---|\n| `defineAuthenticatedEventHandler` | Yes | No | No | Any |\n| `defineOptionalAuthenticationEvent` | Optional | No | No | Any |\n| `defineVerifiedCsrfHandler` | No | No | Yes | Any |\n| `defineAuthenticatedEventPostHandlers` | Yes | No | Yes | POST only |\n| `defineAuthenticatePublicApi` | No | Yes | No | Any |\n| `defineApiManagementHandler` | Yes | No | Yes | POST only |\n| `defineByteLimiterHandler` | No | No | No | `POST`, `PUT`, or `PATCH` |\n| `defineVerifiedMagicLinkGetHandler` | No | No | No | GET only |\n| `defineMfaCodeVerifierHandler` | No | No | Yes | POST only |\n| `defineDeduplicatedEventHandler` | No | No | No | Any |\n\n---\n\n## `defineAuthenticatedEventHandler`\n\nThe standard wrapper for protected routes. It runs token rotation via `ensureValidCredentials`, verifies the session against the IAM service, and populates `event.context.authorizedData` with the verified user data. A missing or invalid session throws HTTP 401. An MFA challenge returns HTTP 202 with a `mfaRequired` body.\n\n```ts [server\u002Fapi\u002Fprofile.get.ts]\nexport default defineAuthenticatedEventHandler(async (event) => {\n  const { userId, roles } = event.context.authorizedData\n  return { userId, roles }\n})\n```\n\n`event.context.authorizedData` is typed as `ServerResponse`:\n\n```ts\ninterface ServerResponse {\n  authorized: boolean\n  userId?: string\n  roles?: string[] | string\n  ipAddress: string\n  userAgent: string\n  date: string\n  reason?: string\n  error?: string\n  message?: string\n}\n```\n\n---\n\n## `defineOptionalAuthenticationEvent`\n\nUse this wrapper for routes that serve both authenticated users and guests. It attempts authentication and populates `event.context.authorizedData` when successful. If authentication fails for any reason other than a rate limit, it sets `event.context.authorizedData` to `undefined` and continues to your handler as a guest. HTTP 429 rate limit responses are still propagated.\n\n```ts [server\u002Fapi\u002Fposts\u002F[id].get.ts]\nexport default defineOptionalAuthenticationEvent(async (event) => {\n  const user = event.context.authorizedData \u002F\u002F undefined for guests\n\n  if (user) {\n    return { content: 'private content', userId: user.userId }\n  }\n\n  return { content: 'public content' }\n})\n```\n\n---\n\n## `defineVerifiedCsrfHandler`\n\nValidates the CSRF cookie and the `X-CSRF-Token` request header before running the handler. Does not check authentication. Use this wrapper when you need CSRF protection without requiring a login, for example on forms accessible to both guests and authenticated users.\n\n```ts [server\u002Fapi\u002Fcontact.post.ts]\nexport default defineVerifiedCsrfHandler(async (event) => {\n  const body = await readBody(event)\n  \u002F\u002F CSRF is valid; process the form submission\n  return { ok: true }\n})\n```\n\n---\n\n## `defineAuthenticatedEventPostHandlers`\n\nCombines authentication, CSRF validation, and a POST method assertion in one wrapper. This is the correct choice for any state-changing endpoint that requires a login.\n\n```ts [server\u002Fapi\u002Faccount\u002Fdelete.post.ts]\nexport default defineAuthenticatedEventPostHandlers(async (event) => {\n  const { userId } = event.context.authorizedData\n  await deleteAccount(userId)\n  return { ok: true }\n})\n```\n\nThis wrapper combines `defineAuthenticatedEventHandler`,\n`defineVerifiedCsrfHandler`, and `assertMethod('POST')` in that order.\n\n`defineApiManagementHandler` builds on this wrapper for API token lifecycle\noperations, then adds a 2 KB JSON body limit, action validation, and token\nidentity mapping in the server layer.\n\n---\n\n## `defineAuthenticatePublicApi`\n\nUse this wrapper for machine-to-machine routes that accept an API token in the\n`X-API-KEY` header instead of a browser session. The wrapper forwards that key\nto the IAM `\u002Fapi\u002Fpublic\u002Fverify` endpoint, along with the privilege you\ndefine for the route, and only then calls your handler.\n\n::warning\nUse `defineAuthenticatePublicApi` on routes that bypass the Nuxt global auth\nmiddleware or any manual `isIPValid -> botDetectorMiddleware ->\ngenerateCsrfCookie` chain. This wrapper protects machine-to-machine API-key\nrequests, so running the browser middleware on the same route can trigger\nbot-detector rate limits or bans. Keep the global middleware for regular auth\nroutes, `getApiListsController`, and `defineApiManagementHandler`, because\nthose browser session flows still depend on bot detection and the CSRF cookie.\n::\n\nOn success, the wrapper populates `event.context.apiVerification` with the\nverified token metadata. On failure, it returns a normalized JSON response and\nuses the same status code returned by IAM. Rate limits are only applied to\ninvalid or abusive verification attempts. Successful verification calls are not rate\nlimited by the wrapper.\n\n```ts [server\u002Fapi\u002Fpublic\u002Freports.get.ts]\nexport default defineAuthenticatePublicApi(async (event) => {\n  const token = event.context.apiVerification\n\n  return {\n    ok: true,\n    tokenId: token.tokenId,\n    userId: token.userId,\n    privilege: token.providedPrivilege,\n  }\n}, 'demo')\n```\n\n`event.context.apiVerification` is typed as `VerifySuccessResponse`:\n\n```ts\ninterface VerifySuccessResponse {\n  name: string\n  tokenId: number\n  userId: number\n  createdAt: string\n  expiresAt: string\n  lastUsed: string\n  usageCount: number\n  providedPrivilege: 'custom' | 'demo' | 'restricted' | 'protected' | 'full'\n}\n```\n\n---\n\n## `defineApiManagementHandler`\n\nUse this wrapper for authenticated POST routes that create, rotate, revoke, or\ninspect API tokens on behalf of the logged-in user. The implementation wraps\n`defineAuthenticatedEventPostHandlers(...)` with\n`defineByteLimiterHandler(..., 2000, 'POST')`, so the raw body is size-checked\nand parsed into `event.context.body` before the action-specific IAM proxy logic\nruns.\n\nThe wrapper supports these actions:\n\n- `new-token`\n- `revoke`\n- `metadata`\n- `rotate`\n- `ip-restriction-update`\n- `privilege-update`\n\nThe wrapper accepts different request bodies depending on the action:\n\n| Action | Request body accepted by the wrapper | What the wrapper adds before calling IAM |\n|---|---|---|\n| `new-token` | `{ name, prefix, ipv4?, expires? }` | `privilege: allowedPrivilege` |\n| `revoke` | `{ tokenId }` | `publicIdentifier`, `name` |\n| `metadata` | `{ tokenId }` | `publicIdentifier`, `name` |\n| `rotate` | `{ tokenId }` | `publicIdentifier`, `name` |\n| `ip-restriction-update` | `{ tokenId, ipv4? }` | `publicIdentifier`, `name` |\n| `privilege-update` | `{ tokenId }` | `publicIdentifier`, `name`, `newPrivilege: updateToNewPrivilege` |\n\nFor every action except `new-token`, the client submits only `tokenId`. The\nwrapper first calls IAM `\u002Fapi\u002Fmanage\u002Flist-metadata`, resolves the matching\ntoken row, and then forwards `publicIdentifier` and `name` to IAM. This keeps\ntoken identity details in the server layer instead of exposing them to the\nclient.\n\n`allowedPrivilege` controls the privilege assigned to newly created tokens.\n`updateToNewPrivilege` is optional, but you must provide it if you want the\n`privilege-update` action to succeed. It controls the level that can be\nupdated, and the client request body does not supply `newPrivilege`.\n\nOn `new-token`, IAM returns `rawPublicId` in addition to the raw key. The\nwrapper removes `rawPublicId` and exposes only `{ rawApiKey, expiresAt }` on\n`event.context.newApiToken`.\n\nFor the raw IAM route contracts behind these wrapper calls, see the\n[IAM API token docs](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi).\n\n```ts [server\u002Fapi\u002Fauth\u002Fapi-tokens\u002F[action].post.ts]\nexport default defineApiManagementHandler(async (event) => {\n  const action = event.context.params?.action\n\n  if (action === 'new-token') {\n    return { ok: true, data: event.context.newApiToken }\n  }\n\n  if (action === 'metadata') {\n    return { ok: true, data: event.context.extensiveMetadata }\n  }\n\n  if (action === 'rotate') {\n    return { ok: true, data: event.context.rotate }\n  }\n\n  return { ok: true }\n}, 'demo', 'protected')\n```\n\nThis wrapper populates one of several action-specific fields on the H3 event\ncontext:\n\n| Action | `event.context` field | Value |\n|---|---|---|\n| `new-token` | `newApiToken` | `{ rawApiKey, expiresAt }` |\n| `ip-restriction-update` | `ipRestrictionUpdate` | `{ msg }` |\n| `privilege-update` | `privilegeUpdate` | `{ msg }` |\n| `revoke` | `revoke` | `string` or `{ msg, invalidedTokenId, userId }` |\n| `metadata` | `extensiveMetadata` | `{ tokenMeta, counts }` |\n| `rotate` | `rotate` | `{ msg, newRawToken, newExpiry }` |\n\n`list-metadata` is intentionally rejected on POST. Use `getApiListsController`\nfor the authenticated GET route instead.\n\n---\n\n## `defineByteLimiterHandler`\n\nUse this wrapper when you need a low-level raw-body size limit before JSON\nparsing. It asserts the request method, checks `Content-Length` when present,\nreads the raw body once, rejects bodies larger than your limit, and stores the\nparsed JSON object on `event.context.body`.\n\n`defineApiManagementHandler` uses this body parser. Use it\ndirectly for other custom routes when you need a strict byte limit before any\nschema validation runs.\n\n```ts [server\u002Fapi\u002Fupload-metadata.post.ts]\nexport default defineByteLimiterHandler(async (event) => {\n  const body = event.context.body\n  return { ok: true, body }\n}, 2048, 'POST')\n```\n\nIf the request body is empty, `event.context.body` is left as `undefined` and\nyour handler still runs.\n\n---\n\n## `defineVerifiedMagicLinkGetHandler`\n\nValidates incoming magic link query parameters before running the handler. It checks that the request is a GET, that the `canary_id`, `session`, and `__Secure-a` cookies exist, and that the query string matches the `VerificationLinkSchema` (`visitor`, `token`, `random`, `reason`). After schema validation it calls the IAM service to verify the link.\n\nOn success, `event.context.link` and `event.context.reason` are populated from the IAM response:\n\n```ts [server\u002Fapi\u002Fauth\u002Fverify-mfa.get.ts]\nexport default defineVerifiedMagicLinkGetHandler(async (event) => {\n  const { link, reason } = event.context\n  \u002F\u002F Link is verified; render the page or return data for the frontend\n  return { ok: true, reason }\n})\n```\n::warning\nThis wrapper does not validate a CSRF token because it is designed for GET requests arriving from an email link, to let callers render pages for the right user.\n::\n\n---\n\n## `defineMfaCodeVerifierHandler`\n\nValidates an MFA code submitted after a magic link is verified. It enforces POST method, verifies the CSRF cookie, limits the request body to 8 MB, validates the link query parameters, reads `event.context.body.code` (a 7-digit numeric string), and sends the code to the IAM service for verification. On success, tokens are rotated automatically and the new cookies are applied to the response before your handler runs.\n\n```ts [server\u002Fapi\u002Fauth\u002Fverify-mfa.post.ts]\nexport default defineMfaCodeVerifierHandler(async (event) => {\n  \u002F\u002F Code verified, tokens are already rotated\n  return { ok: true }\n})\n```\n\nThe code must be present in the parsed request body as `code`. Read the body before this wrapper runs, or use `event.context.body` if a body-parsing middleware already ran upstream.\n\n---\n\n## `defineDeduplicatedEventHandler`\n\nWraps a handler with request deduplication. Concurrent requests with the same identity are coalesced so that only one execution runs at a time. Use this for handlers that must not run concurrently per session, such as checkout or idempotent write operations.\n\n```ts [server\u002Fapi\u002Fcheckout.post.ts]\nexport default defineDeduplicatedEventHandler(async (event) => {\n  await processCheckout(event)\n  return { ok: true }\n})\n```\n\nThe built-in controllers (`loginHandler`, `logoutHandler`, `signUpHandler`, `restartPasswordHandler`, `sendMfaCodeHandler`) already use this wrapper internally.\n\n---\n\n## Event context fields added by wrappers\n\nThe wrapper layer extends the H3 event context so your handler can read the\nresult of each verification step without repeating verification logic.\n\n| Field | Set by | Meaning |\n|---|---|---|\n| `authorizedData` | `defineAuthenticatedEventHandler`, `defineOptionalAuthenticationEvent` | Verified user session data |\n| `accessToken` | `ensureValidCredentials` | Current or rotated access token |\n| `session` | `ensureValidCredentials` | Current or rotated refresh token |\n| `limitedMetaData` | `defineMfaCodeVerifierHandler` | Verified MFA result after token rotation |\n| `apiVerification` | `defineAuthenticatePublicApi` | Verified API token metadata |\n| `newApiToken` | `defineApiManagementHandler` | Token creation result |\n| `ipRestrictionUpdate` | `defineApiManagementHandler` | IP restriction update result |\n| `privilegeUpdate` | `defineApiManagementHandler` | Privilege update result |\n| `revoke` | `defineApiManagementHandler` | Revocation result |\n| `extensiveMetadata` | `defineApiManagementHandler` | Single-token metadata result |\n| `rotate` | `defineApiManagementHandler` | Token rotation result |\n| `body` | `defineByteLimiterHandler` | Parsed JSON body |\n\n---\n\n## Making a Custom wrapper\n\nMake your own custom wrappers by simply following the pattern in this module, for example a wrapper that requires auth and csrf and its deduplicated:\n\n```ts [myWrapper.ts]\nimport { defineEventHandler, type EventHandler, type EventHandlerRequest } from 'h3';\nimport { defineAuthenticatedEventPostHandlers, defineDeduplicatedEventHandler } from 'auth-h3client';\n\nexport const myCustomEventHandler = \u003CT extends EventHandlerRequest, D>(\n  handler: EventHandler\u003CT, D>\n): EventHandler\u003CT, Promise\u003CD>> => {\n  \n  return defineAuthenticatedEventPostHandlers(\n    defineDeduplicatedEventHandler(\n      defineEventHandler((event) => {\n        \n        \u002F\u002F Do stuff\n\n        return handler(event);\n      })\n    ) as EventHandler\u003CT, D>\n    );\n};\n\n\u002F\u002F usage\n\nexport default myCustomEventHandler(async (event) => {\n  \u002F\u002F stuff\n})\n\n```\n---\n\n## Access token rotation inside wrappers\n\nBoth `defineAuthenticatedEventHandler` and `defineOptionalAuthenticationEvent` call `ensureValidCredentials` before passing control to your handler. This means token rotation is transparent: if the access token is missing or near expiry, a fresh token pair is fetched from the IAM service and written to the response cookies before your handler reads any session data.",{"title":93,"description":3622},"0i_AtSewXee257hgTxcLkj58NolGC1XdboBuAjb4Mq0",[3631,3632],{"title":89,"path":90,"stem":91,"children":-1},{"title":97,"path":98,"stem":99,"children":-1},{"id":843,"title":93,"body":3634,"description":3622,"extension":3623,"icon":3624,"meta":5954,"module":3626,"navigation":8,"path":94,"rawbody":3627,"seo":5955,"stem":95,"__hash__":3629},{"type":845,"value":3635,"toc":5938},[3636,3644,3646,3656,3658,3660,3824,3826,3830,3838,3908,3914,4008,4010,4014,4022,4142,4144,4148,4152,4218,4220,4224,4226,4304,4312,4316,4318,4322,4328,4340,4344,4466,4472,4588,4590,4594,4602,4604,4630,4632,4742,4754,4764,4776,4780,5034,5036,5138,5144,5146,5150,5156,5160,5238,5244,5246,5250,5268,5274,5348,5352,5354,5358,5362,5410,5416,5418,5422,5424,5480,5492,5494,5496,5498,5658,5660,5662,5664,5924,5926,5928,5936],[848,3637,850,3638,855,3640,859,3642,863],{},[852,3639,854],{},[852,3641,858],{},[852,3643,862],{},[848,3645,866],{},[868,3647,3648,3652],{},[871,3649,873,3650],{},[852,3651,876],{},[871,3653,879,3654],{},[852,3655,882],{},[884,3657],{},[887,3659,890],{"id":889},[892,3661,3662,3676],{},[895,3663,3664],{},[898,3665,3666,3668,3670,3672,3674],{},[901,3667,903],{},[901,3669,906],{},[901,3671,909],{},[901,3673,912],{},[901,3675,915],{},[917,3677,3678,3692,3706,3720,3734,3748,3762,3782,3796,3810],{},[898,3679,3680,3684,3686,3688,3690],{},[922,3681,3682],{},[852,3683,926],{},[922,3685,929],{},[922,3687,932],{},[922,3689,932],{},[922,3691,937],{},[898,3693,3694,3698,3700,3702,3704],{},[922,3695,3696],{},[852,3697,944],{},[922,3699,947],{},[922,3701,932],{},[922,3703,932],{},[922,3705,937],{},[898,3707,3708,3712,3714,3716,3718],{},[922,3709,3710],{},[852,3711,960],{},[922,3713,932],{},[922,3715,932],{},[922,3717,929],{},[922,3719,937],{},[898,3721,3722,3726,3728,3730,3732],{},[922,3723,3724],{},[852,3725,975],{},[922,3727,929],{},[922,3729,932],{},[922,3731,929],{},[922,3733,984],{},[898,3735,3736,3740,3742,3744,3746],{},[922,3737,3738],{},[852,3739,876],{},[922,3741,932],{},[922,3743,929],{},[922,3745,932],{},[922,3747,937],{},[898,3749,3750,3754,3756,3758,3760],{},[922,3751,3752],{},[852,3753,882],{},[922,3755,929],{},[922,3757,932],{},[922,3759,929],{},[922,3761,984],{},[898,3763,3764,3768,3770,3772,3774],{},[922,3765,3766],{},[852,3767,1019],{},[922,3769,932],{},[922,3771,932],{},[922,3773,932],{},[922,3775,3776,1031,3778,1035,3780],{},[852,3777,1030],{},[852,3779,1034],{},[852,3781,1038],{},[898,3783,3784,3788,3790,3792,3794],{},[922,3785,3786],{},[852,3787,1045],{},[922,3789,932],{},[922,3791,932],{},[922,3793,932],{},[922,3795,1054],{},[898,3797,3798,3802,3804,3806,3808],{},[922,3799,3800],{},[852,3801,1061],{},[922,3803,932],{},[922,3805,932],{},[922,3807,929],{},[922,3809,984],{},[898,3811,3812,3816,3818,3820,3822],{},[922,3813,3814],{},[852,3815,1076],{},[922,3817,932],{},[922,3819,932],{},[922,3821,932],{},[922,3823,937],{},[884,3825],{},[887,3827,3828],{"id":1089},[852,3829,926],{},[848,3831,1094,3832,1098,3834,1102,3836,1106],{},[852,3833,1097],{},[852,3835,1101],{},[852,3837,1105],{},[1108,3839,3840],{"className":1110,"code":1111,"filename":1112,"language":1113,"meta":1114,"style":1114},[852,3841,3842,3864,3890,3904],{"__ignoreMap":1114},[1118,3843,3844,3846,3848,3850,3852,3854,3856,3858,3860,3862],{"class":1120,"line":1121},[1118,3845,1125],{"class":1124},[1118,3847,1128],{"class":1124},[1118,3849,1132],{"class":1131},[1118,3851,1136],{"class":1135},[1118,3853,1140],{"class":1139},[1118,3855,1143],{"class":1135},[1118,3857,1147],{"class":1146},[1118,3859,1150],{"class":1135},[1118,3861,1153],{"class":1139},[1118,3863,1156],{"class":1135},[1118,3865,3866,3868,3870,3872,3874,3876,3878,3880,3882,3884,3886,3888],{"class":1120,"line":1159},[1118,3867,1162],{"class":1139},[1118,3869,1165],{"class":1135},[1118,3871,1169],{"class":1168},[1118,3873,1031],{"class":1135},[1118,3875,1174],{"class":1168},[1118,3877,1177],{"class":1135},[1118,3879,1181],{"class":1180},[1118,3881,1185],{"class":1184},[1118,3883,1188],{"class":1135},[1118,3885,1191],{"class":1184},[1118,3887,1188],{"class":1135},[1118,3889,1196],{"class":1184},[1118,3891,3892,3894,3896,3898,3900,3902],{"class":1120,"line":1199},[1118,3893,1202],{"class":1124},[1118,3895,1165],{"class":1135},[1118,3897,1169],{"class":1184},[1118,3899,1031],{"class":1135},[1118,3901,1174],{"class":1184},[1118,3903,1213],{"class":1135},[1118,3905,3906],{"class":1120,"line":1216},[1118,3907,1219],{"class":1135},[848,3909,3910,1224,3912,1228],{},[852,3911,1101],{},[852,3913,1227],{},[1108,3915,3916],{"className":1110,"code":1231,"language":1113,"meta":1114,"style":1114},[852,3917,3918,3926,3934,3942,3956,3964,3972,3980,3988,3996,4004],{"__ignoreMap":1114},[1118,3919,3920,3922,3924],{"class":1120,"line":1121},[1118,3921,1238],{"class":1139},[1118,3923,1242],{"class":1241},[1118,3925,1156],{"class":1135},[1118,3927,3928,3930,3932],{"class":1120,"line":1159},[1118,3929,1249],{"class":1184},[1118,3931,1228],{"class":1180},[1118,3933,1254],{"class":1241},[1118,3935,3936,3938,3940],{"class":1120,"line":1199},[1118,3937,1259],{"class":1184},[1118,3939,1262],{"class":1180},[1118,3941,1265],{"class":1241},[1118,3943,3944,3946,3948,3950,3952,3954],{"class":1120,"line":1216},[1118,3945,1270],{"class":1184},[1118,3947,1262],{"class":1180},[1118,3949,1275],{"class":1241},[1118,3951,1278],{"class":1135},[1118,3953,1281],{"class":1180},[1118,3955,1265],{"class":1241},[1118,3957,3958,3960,3962],{"class":1120,"line":1286},[1118,3959,1289],{"class":1184},[1118,3961,1228],{"class":1180},[1118,3963,1265],{"class":1241},[1118,3965,3966,3968,3970],{"class":1120,"line":1296},[1118,3967,1299],{"class":1184},[1118,3969,1228],{"class":1180},[1118,3971,1265],{"class":1241},[1118,3973,3974,3976,3978],{"class":1120,"line":1306},[1118,3975,1309],{"class":1184},[1118,3977,1228],{"class":1180},[1118,3979,1265],{"class":1241},[1118,3981,3982,3984,3986],{"class":1120,"line":1316},[1118,3983,1319],{"class":1184},[1118,3985,1262],{"class":1180},[1118,3987,1265],{"class":1241},[1118,3989,3990,3992,3994],{"class":1120,"line":1326},[1118,3991,1329],{"class":1184},[1118,3993,1262],{"class":1180},[1118,3995,1265],{"class":1241},[1118,3997,3998,4000,4002],{"class":1120,"line":1336},[1118,3999,1339],{"class":1184},[1118,4001,1262],{"class":1180},[1118,4003,1265],{"class":1241},[1118,4005,4006],{"class":1120,"line":1346},[1118,4007,1349],{"class":1135},[884,4009],{},[887,4011,4012],{"id":1354},[852,4013,944],{},[848,4015,1359,4016,1362,4018,1365,4020,1369],{},[852,4017,1101],{},[852,4019,1101],{},[852,4021,1368],{},[1108,4023,4024],{"className":1110,"code":1372,"filename":1373,"language":1113,"meta":1114,"style":1114},[852,4025,4026,4048,4068,4072,4082,4112,4116,4120,4138],{"__ignoreMap":1114},[1118,4027,4028,4030,4032,4034,4036,4038,4040,4042,4044,4046],{"class":1120,"line":1121},[1118,4029,1125],{"class":1124},[1118,4031,1128],{"class":1124},[1118,4033,1384],{"class":1131},[1118,4035,1136],{"class":1135},[1118,4037,1140],{"class":1139},[1118,4039,1143],{"class":1135},[1118,4041,1147],{"class":1146},[1118,4043,1150],{"class":1135},[1118,4045,1153],{"class":1139},[1118,4047,1156],{"class":1135},[1118,4049,4050,4052,4054,4056,4058,4060,4062,4064,4066],{"class":1120,"line":1159},[1118,4051,1162],{"class":1139},[1118,4053,1405],{"class":1168},[1118,4055,1408],{"class":1180},[1118,4057,1185],{"class":1184},[1118,4059,1188],{"class":1135},[1118,4061,1191],{"class":1184},[1118,4063,1188],{"class":1135},[1118,4065,1419],{"class":1184},[1118,4067,1423],{"class":1422},[1118,4069,4070],{"class":1120,"line":1199},[1118,4071,1428],{"emptyLinePlaceholder":8},[1118,4073,4074,4076,4078,4080],{"class":1120,"line":1216},[1118,4075,1433],{"class":1124},[1118,4077,1143],{"class":1135},[1118,4079,1438],{"class":1184},[1118,4081,1441],{"class":1135},[1118,4083,4084,4086,4088,4090,4092,4094,4096,4098,4100,4102,4104,4106,4108,4110],{"class":1120,"line":1286},[1118,4085,1446],{"class":1124},[1118,4087,1165],{"class":1135},[1118,4089,1451],{"class":1184},[1118,4091,1228],{"class":1454},[1118,4093,1458],{"class":1457},[1118,4095,1462],{"class":1461},[1118,4097,1465],{"class":1457},[1118,4099,1031],{"class":1135},[1118,4101,1169],{"class":1184},[1118,4103,1228],{"class":1454},[1118,4105,1405],{"class":1184},[1118,4107,1188],{"class":1135},[1118,4109,1169],{"class":1184},[1118,4111,1213],{"class":1135},[1118,4113,4114],{"class":1120,"line":1296},[1118,4115,1484],{"class":1135},[1118,4117,4118],{"class":1120,"line":1306},[1118,4119,1428],{"emptyLinePlaceholder":8},[1118,4121,4122,4124,4126,4128,4130,4132,4134,4136],{"class":1120,"line":1316},[1118,4123,1202],{"class":1124},[1118,4125,1165],{"class":1135},[1118,4127,1451],{"class":1184},[1118,4129,1228],{"class":1454},[1118,4131,1458],{"class":1457},[1118,4133,1503],{"class":1461},[1118,4135,1465],{"class":1457},[1118,4137,1213],{"class":1135},[1118,4139,4140],{"class":1120,"line":1326},[1118,4141,1219],{"class":1135},[884,4143],{},[887,4145,4146],{"id":1516},[852,4147,960],{},[848,4149,1521,4150,1525],{},[852,4151,1524],{},[1108,4153,4154],{"className":1110,"code":1528,"filename":1529,"language":1113,"meta":1114,"style":1114},[852,4155,4156,4178,4196,4200,4214],{"__ignoreMap":1114},[1118,4157,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176],{"class":1120,"line":1121},[1118,4159,1125],{"class":1124},[1118,4161,1128],{"class":1124},[1118,4163,1540],{"class":1131},[1118,4165,1136],{"class":1135},[1118,4167,1140],{"class":1139},[1118,4169,1143],{"class":1135},[1118,4171,1147],{"class":1146},[1118,4173,1150],{"class":1135},[1118,4175,1153],{"class":1139},[1118,4177,1156],{"class":1135},[1118,4179,4180,4182,4184,4186,4188,4190,4192,4194],{"class":1120,"line":1159},[1118,4181,1162],{"class":1139},[1118,4183,1561],{"class":1168},[1118,4185,1408],{"class":1180},[1118,4187,1566],{"class":1124},[1118,4189,1569],{"class":1131},[1118,4191,1136],{"class":1135},[1118,4193,1147],{"class":1184},[1118,4195,1576],{"class":1135},[1118,4197,4198],{"class":1120,"line":1199},[1118,4199,1581],{"class":1422},[1118,4201,4202,4204,4206,4208,4210,4212],{"class":1120,"line":1216},[1118,4203,1202],{"class":1124},[1118,4205,1165],{"class":1135},[1118,4207,1590],{"class":1184},[1118,4209,1228],{"class":1454},[1118,4211,1596],{"class":1595},[1118,4213,1213],{"class":1135},[1118,4215,4216],{"class":1120,"line":1286},[1118,4217,1219],{"class":1135},[884,4219],{},[887,4221,4222],{"id":1607},[852,4223,975],{},[848,4225,1612],{},[1108,4227,4228],{"className":1110,"code":1615,"filename":1616,"language":1113,"meta":1114,"style":1114},[852,4229,4230,4252,4274,4286,4300],{"__ignoreMap":1114},[1118,4231,4232,4234,4236,4238,4240,4242,4244,4246,4248,4250],{"class":1120,"line":1121},[1118,4233,1125],{"class":1124},[1118,4235,1128],{"class":1124},[1118,4237,1627],{"class":1131},[1118,4239,1136],{"class":1135},[1118,4241,1140],{"class":1139},[1118,4243,1143],{"class":1135},[1118,4245,1147],{"class":1146},[1118,4247,1150],{"class":1135},[1118,4249,1153],{"class":1139},[1118,4251,1156],{"class":1135},[1118,4253,4254,4256,4258,4260,4262,4264,4266,4268,4270,4272],{"class":1120,"line":1159},[1118,4255,1162],{"class":1139},[1118,4257,1165],{"class":1135},[1118,4259,1169],{"class":1168},[1118,4261,1177],{"class":1135},[1118,4263,1181],{"class":1180},[1118,4265,1185],{"class":1184},[1118,4267,1188],{"class":1135},[1118,4269,1191],{"class":1184},[1118,4271,1188],{"class":1135},[1118,4273,1196],{"class":1184},[1118,4275,4276,4278,4280,4282,4284],{"class":1120,"line":1199},[1118,4277,1668],{"class":1124},[1118,4279,1671],{"class":1131},[1118,4281,1136],{"class":1135},[1118,4283,1169],{"class":1184},[1118,4285,1576],{"class":1135},[1118,4287,4288,4290,4292,4294,4296,4298],{"class":1120,"line":1216},[1118,4289,1202],{"class":1124},[1118,4291,1165],{"class":1135},[1118,4293,1590],{"class":1184},[1118,4295,1228],{"class":1454},[1118,4297,1596],{"class":1595},[1118,4299,1213],{"class":1135},[1118,4301,4302],{"class":1120,"line":1286},[1118,4303,1219],{"class":1135},[848,4305,1698,4306,1701,4308,1704,4310,1708],{},[852,4307,926],{},[852,4309,960],{},[852,4311,1707],{},[848,4313,4314,1713],{},[852,4315,882],{},[884,4317],{},[887,4319,4320],{"id":1718},[852,4321,876],{},[848,4323,1723,4324,1727,4326,1731],{},[852,4325,1726],{},[852,4327,1730],{},[1733,4329,4330],{},[848,4331,1737,4332,1740,4334,1744,4336,1704,4338,1750],{},[852,4333,876],{},[852,4335,1743],{},[852,4337,1747],{},[852,4339,882],{},[848,4341,1753,4342,1757],{},[852,4343,1756],{},[1108,4345,4346],{"className":1110,"code":1760,"filename":1761,"language":1113,"meta":1114,"style":1114},[852,4347,4348,4370,4388,4392,4398,4408,4422,4436,4450,4454],{"__ignoreMap":1114},[1118,4349,4350,4352,4354,4356,4358,4360,4362,4364,4366,4368],{"class":1120,"line":1121},[1118,4351,1125],{"class":1124},[1118,4353,1128],{"class":1124},[1118,4355,1772],{"class":1131},[1118,4357,1136],{"class":1135},[1118,4359,1140],{"class":1139},[1118,4361,1143],{"class":1135},[1118,4363,1147],{"class":1146},[1118,4365,1150],{"class":1135},[1118,4367,1153],{"class":1139},[1118,4369,1156],{"class":1135},[1118,4371,4372,4374,4376,4378,4380,4382,4384,4386],{"class":1120,"line":1159},[1118,4373,1162],{"class":1139},[1118,4375,1793],{"class":1168},[1118,4377,1408],{"class":1180},[1118,4379,1185],{"class":1184},[1118,4381,1188],{"class":1135},[1118,4383,1191],{"class":1184},[1118,4385,1188],{"class":1135},[1118,4387,1806],{"class":1184},[1118,4389,4390],{"class":1120,"line":1199},[1118,4391,1428],{"emptyLinePlaceholder":8},[1118,4393,4394,4396],{"class":1120,"line":1216},[1118,4395,1202],{"class":1124},[1118,4397,1156],{"class":1135},[1118,4399,4400,4402,4404,4406],{"class":1120,"line":1286},[1118,4401,1821],{"class":1184},[1118,4403,1228],{"class":1454},[1118,4405,1596],{"class":1595},[1118,4407,1701],{"class":1135},[1118,4409,4410,4412,4414,4416,4418,4420],{"class":1120,"line":1296},[1118,4411,1832],{"class":1184},[1118,4413,1228],{"class":1454},[1118,4415,1793],{"class":1184},[1118,4417,1188],{"class":1135},[1118,4419,1841],{"class":1184},[1118,4421,1701],{"class":1135},[1118,4423,4424,4426,4428,4430,4432,4434],{"class":1120,"line":1306},[1118,4425,1848],{"class":1184},[1118,4427,1228],{"class":1454},[1118,4429,1793],{"class":1184},[1118,4431,1188],{"class":1135},[1118,4433,1169],{"class":1184},[1118,4435,1701],{"class":1135},[1118,4437,4438,4440,4442,4444,4446,4448],{"class":1120,"line":1316},[1118,4439,1863],{"class":1184},[1118,4441,1228],{"class":1454},[1118,4443,1793],{"class":1184},[1118,4445,1188],{"class":1135},[1118,4447,1872],{"class":1184},[1118,4449,1701],{"class":1135},[1118,4451,4452],{"class":1120,"line":1326},[1118,4453,1484],{"class":1135},[1118,4455,4456,4458,4460,4462,4464],{"class":1120,"line":1336},[1118,4457,1883],{"class":1135},[1118,4459,1465],{"class":1457},[1118,4461,1888],{"class":1461},[1118,4463,1465],{"class":1457},[1118,4465,1576],{"class":1135},[848,4467,4468,1224,4470,1228],{},[852,4469,1756],{},[852,4471,1899],{},[1108,4473,4474],{"className":1110,"code":1902,"language":1113,"meta":1114,"style":1114},[852,4475,4476,4484,4492,4500,4508,4516,4524,4532,4540,4584],{"__ignoreMap":1114},[1118,4477,4478,4480,4482],{"class":1120,"line":1121},[1118,4479,1238],{"class":1139},[1118,4481,1911],{"class":1241},[1118,4483,1156],{"class":1135},[1118,4485,4486,4488,4490],{"class":1120,"line":1159},[1118,4487,1918],{"class":1184},[1118,4489,1228],{"class":1180},[1118,4491,1265],{"class":1241},[1118,4493,4494,4496,4498],{"class":1120,"line":1199},[1118,4495,1927],{"class":1184},[1118,4497,1228],{"class":1180},[1118,4499,1932],{"class":1241},[1118,4501,4502,4504,4506],{"class":1120,"line":1216},[1118,4503,1259],{"class":1184},[1118,4505,1228],{"class":1180},[1118,4507,1932],{"class":1241},[1118,4509,4510,4512,4514],{"class":1120,"line":1286},[1118,4511,1945],{"class":1184},[1118,4513,1228],{"class":1180},[1118,4515,1265],{"class":1241},[1118,4517,4518,4520,4522],{"class":1120,"line":1296},[1118,4519,1954],{"class":1184},[1118,4521,1228],{"class":1180},[1118,4523,1265],{"class":1241},[1118,4525,4526,4528,4530],{"class":1120,"line":1306},[1118,4527,1963],{"class":1184},[1118,4529,1228],{"class":1180},[1118,4531,1265],{"class":1241},[1118,4533,4534,4536,4538],{"class":1120,"line":1316},[1118,4535,1972],{"class":1184},[1118,4537,1228],{"class":1180},[1118,4539,1932],{"class":1241},[1118,4541,4542,4544,4546,4548,4550,4552,4554,4556,4558,4560,4562,4564,4566,4568,4570,4572,4574,4576,4578,4580,4582],{"class":1120,"line":1326},[1118,4543,1981],{"class":1184},[1118,4545,1228],{"class":1180},[1118,4547,1458],{"class":1457},[1118,4549,1988],{"class":1461},[1118,4551,1465],{"class":1457},[1118,4553,1993],{"class":1180},[1118,4555,1458],{"class":1457},[1118,4557,1888],{"class":1461},[1118,4559,1465],{"class":1457},[1118,4561,1993],{"class":1180},[1118,4563,1458],{"class":1457},[1118,4565,2006],{"class":1461},[1118,4567,1465],{"class":1457},[1118,4569,1993],{"class":1180},[1118,4571,1458],{"class":1457},[1118,4573,2015],{"class":1461},[1118,4575,1465],{"class":1457},[1118,4577,1993],{"class":1180},[1118,4579,1458],{"class":1457},[1118,4581,2024],{"class":1461},[1118,4583,2027],{"class":1457},[1118,4585,4586],{"class":1120,"line":1336},[1118,4587,1349],{"class":1135},[884,4589],{},[887,4591,4592],{"id":2036},[852,4593,882],{},[848,4595,2041,4596,2045,4598,2049,4600,2053],{},[852,4597,2044],{},[852,4599,2048],{},[852,4601,2052],{},[848,4603,2056],{},[868,4605,4606,4610,4614,4618,4622,4626],{},[871,4607,4608],{},[852,4609,2063],{},[871,4611,4612],{},[852,4613,2068],{},[871,4615,4616],{},[852,4617,2073],{},[871,4619,4620],{},[852,4621,2078],{},[871,4623,4624],{},[852,4625,2083],{},[871,4627,4628],{},[852,4629,2088],{},[848,4631,2091],{},[892,4633,4634,4644],{},[895,4635,4636],{},[898,4637,4638,4640,4642],{},[901,4639,2100],{},[901,4641,2103],{},[901,4643,2106],{},[917,4645,4646,4660,4676,4692,4708,4724],{},[898,4647,4648,4652,4656],{},[922,4649,4650],{},[852,4651,2063],{},[922,4653,4654],{},[852,4655,2119],{},[922,4657,4658],{},[852,4659,2124],{},[898,4661,4662,4666,4670],{},[922,4663,4664],{},[852,4665,2068],{},[922,4667,4668],{},[852,4669,2135],{},[922,4671,4672,1031,4674],{},[852,4673,2140],{},[852,4675,2143],{},[898,4677,4678,4682,4686],{},[922,4679,4680],{},[852,4681,2073],{},[922,4683,4684],{},[852,4685,2135],{},[922,4687,4688,1031,4690],{},[852,4689,2140],{},[852,4691,2143],{},[898,4693,4694,4698,4702],{},[922,4695,4696],{},[852,4697,2078],{},[922,4699,4700],{},[852,4701,2135],{},[922,4703,4704,1031,4706],{},[852,4705,2140],{},[852,4707,2143],{},[898,4709,4710,4714,4718],{},[922,4711,4712],{},[852,4713,2083],{},[922,4715,4716],{},[852,4717,2186],{},[922,4719,4720,1031,4722],{},[852,4721,2140],{},[852,4723,2143],{},[898,4725,4726,4730,4734],{},[922,4727,4728],{},[852,4729,2088],{},[922,4731,4732],{},[852,4733,2135],{},[922,4735,4736,1031,4738,1031,4740],{},[852,4737,2140],{},[852,4739,2143],{},[852,4741,2211],{},[848,4743,2214,4744,2217,4746,2220,4748,2224,4750,2227,4752,2230],{},[852,4745,2063],{},[852,4747,1841],{},[852,4749,2223],{},[852,4751,2140],{},[852,4753,2143],{},[848,4755,4756,2236,4758,2240,4760,2243,4762,1188],{},[852,4757,2235],{},[852,4759,2239],{},[852,4761,2088],{},[852,4763,2246],{},[848,4765,2249,4766,2252,4768,2256,4770,2259,4772,2263,4774,1188],{},[852,4767,2063],{},[852,4769,2255],{},[852,4771,2255],{},[852,4773,2262],{},[852,4775,2266],{},[848,4777,2269,4778,1188],{},[2271,4779,2273],{"href":485},[1108,4781,4782],{"className":1110,"code":2276,"filename":2277,"language":1113,"meta":1114,"style":1114},[852,4783,4784,4806,4828,4832,4850,4880,4884,4888,4906,4936,4940,4944,4962,4992,4996,5000,5014],{"__ignoreMap":1114},[1118,4785,4786,4788,4790,4792,4794,4796,4798,4800,4802,4804],{"class":1120,"line":1121},[1118,4787,1125],{"class":1124},[1118,4789,1128],{"class":1124},[1118,4791,2288],{"class":1131},[1118,4793,1136],{"class":1135},[1118,4795,1140],{"class":1139},[1118,4797,1143],{"class":1135},[1118,4799,1147],{"class":1146},[1118,4801,1150],{"class":1135},[1118,4803,1153],{"class":1139},[1118,4805,1156],{"class":1135},[1118,4807,4808,4810,4812,4814,4816,4818,4820,4822,4824,4826],{"class":1120,"line":1159},[1118,4809,1162],{"class":1139},[1118,4811,2309],{"class":1168},[1118,4813,1408],{"class":1180},[1118,4815,1185],{"class":1184},[1118,4817,1188],{"class":1135},[1118,4819,1191],{"class":1184},[1118,4821,1188],{"class":1135},[1118,4823,2322],{"class":1184},[1118,4825,2325],{"class":1135},[1118,4827,2328],{"class":1184},[1118,4829,4830],{"class":1120,"line":1199},[1118,4831,1428],{"emptyLinePlaceholder":8},[1118,4833,4834,4836,4838,4840,4842,4844,4846,4848],{"class":1120,"line":1216},[1118,4835,1433],{"class":1124},[1118,4837,1143],{"class":1135},[1118,4839,2341],{"class":1184},[1118,4841,2344],{"class":1180},[1118,4843,1458],{"class":1457},[1118,4845,2063],{"class":1461},[1118,4847,1465],{"class":1457},[1118,4849,1441],{"class":1135},[1118,4851,4852,4854,4856,4858,4860,4862,4864,4866,4868,4870,4872,4874,4876,4878],{"class":1120,"line":1286},[1118,4853,1446],{"class":1124},[1118,4855,1165],{"class":1135},[1118,4857,1590],{"class":1184},[1118,4859,1228],{"class":1454},[1118,4861,1596],{"class":1595},[1118,4863,1031],{"class":1135},[1118,4865,2369],{"class":1184},[1118,4867,1228],{"class":1454},[1118,4869,1185],{"class":1184},[1118,4871,1188],{"class":1135},[1118,4873,1191],{"class":1184},[1118,4875,1188],{"class":1135},[1118,4877,2382],{"class":1184},[1118,4879,1213],{"class":1135},[1118,4881,4882],{"class":1120,"line":1296},[1118,4883,1484],{"class":1135},[1118,4885,4886],{"class":1120,"line":1306},[1118,4887,1428],{"emptyLinePlaceholder":8},[1118,4889,4890,4892,4894,4896,4898,4900,4902,4904],{"class":1120,"line":1316},[1118,4891,1433],{"class":1124},[1118,4893,1143],{"class":1135},[1118,4895,2341],{"class":1184},[1118,4897,2344],{"class":1180},[1118,4899,1458],{"class":1457},[1118,4901,2073],{"class":1461},[1118,4903,1465],{"class":1457},[1118,4905,1441],{"class":1135},[1118,4907,4908,4910,4912,4914,4916,4918,4920,4922,4924,4926,4928,4930,4932,4934],{"class":1120,"line":1326},[1118,4909,1446],{"class":1124},[1118,4911,1165],{"class":1135},[1118,4913,1590],{"class":1184},[1118,4915,1228],{"class":1454},[1118,4917,1596],{"class":1595},[1118,4919,1031],{"class":1135},[1118,4921,2369],{"class":1184},[1118,4923,1228],{"class":1454},[1118,4925,1185],{"class":1184},[1118,4927,1188],{"class":1135},[1118,4929,1191],{"class":1184},[1118,4931,1188],{"class":1135},[1118,4933,2439],{"class":1184},[1118,4935,1213],{"class":1135},[1118,4937,4938],{"class":1120,"line":1336},[1118,4939,1484],{"class":1135},[1118,4941,4942],{"class":1120,"line":1346},[1118,4943,1428],{"emptyLinePlaceholder":8},[1118,4945,4946,4948,4950,4952,4954,4956,4958,4960],{"class":1120,"line":2452},[1118,4947,1433],{"class":1124},[1118,4949,1143],{"class":1135},[1118,4951,2341],{"class":1184},[1118,4953,2344],{"class":1180},[1118,4955,1458],{"class":1457},[1118,4957,2078],{"class":1461},[1118,4959,1465],{"class":1457},[1118,4961,1441],{"class":1135},[1118,4963,4964,4966,4968,4970,4972,4974,4976,4978,4980,4982,4984,4986,4988,4990],{"class":1120,"line":2471},[1118,4965,1446],{"class":1124},[1118,4967,1165],{"class":1135},[1118,4969,1590],{"class":1184},[1118,4971,1228],{"class":1454},[1118,4973,1596],{"class":1595},[1118,4975,1031],{"class":1135},[1118,4977,2369],{"class":1184},[1118,4979,1228],{"class":1454},[1118,4981,1185],{"class":1184},[1118,4983,1188],{"class":1135},[1118,4985,1191],{"class":1184},[1118,4987,1188],{"class":1135},[1118,4989,2078],{"class":1184},[1118,4991,1213],{"class":1135},[1118,4993,4994],{"class":1120,"line":2502},[1118,4995,1484],{"class":1135},[1118,4997,4998],{"class":1120,"line":2507},[1118,4999,1428],{"emptyLinePlaceholder":8},[1118,5001,5002,5004,5006,5008,5010,5012],{"class":1120,"line":2512},[1118,5003,1202],{"class":1124},[1118,5005,1165],{"class":1135},[1118,5007,1590],{"class":1184},[1118,5009,1228],{"class":1454},[1118,5011,1596],{"class":1595},[1118,5013,1213],{"class":1135},[1118,5015,5016,5018,5020,5022,5024,5026,5028,5030,5032],{"class":1120,"line":2527},[1118,5017,1883],{"class":1135},[1118,5019,1465],{"class":1457},[1118,5021,1888],{"class":1461},[1118,5023,1465],{"class":1457},[1118,5025,1031],{"class":1135},[1118,5027,1465],{"class":1457},[1118,5029,2015],{"class":1461},[1118,5031,1465],{"class":1457},[1118,5033,1576],{"class":1135},[848,5035,2548],{},[892,5037,5038,5050],{},[895,5039,5040],{},[898,5041,5042,5044,5048],{},[901,5043,2100],{},[901,5045,5046,2562],{},[852,5047,2561],{},[901,5049,2565],{},[917,5051,5052,5066,5080,5094,5110,5124],{},[898,5053,5054,5058,5062],{},[922,5055,5056],{},[852,5057,2063],{},[922,5059,5060],{},[852,5061,2382],{},[922,5063,5064],{},[852,5065,2262],{},[898,5067,5068,5072,5076],{},[922,5069,5070],{},[852,5071,2083],{},[922,5073,5074],{},[852,5075,2592],{},[922,5077,5078],{},[852,5079,2597],{},[898,5081,5082,5086,5090],{},[922,5083,5084],{},[852,5085,2088],{},[922,5087,5088],{},[852,5089,2608],{},[922,5091,5092],{},[852,5093,2597],{},[898,5095,5096,5100,5104],{},[922,5097,5098],{},[852,5099,2068],{},[922,5101,5102],{},[852,5103,2068],{},[922,5105,5106,2628,5108],{},[852,5107,2627],{},[852,5109,2631],{},[898,5111,5112,5116,5120],{},[922,5113,5114],{},[852,5115,2073],{},[922,5117,5118],{},[852,5119,2439],{},[922,5121,5122],{},[852,5123,2646],{},[898,5125,5126,5130,5134],{},[922,5127,5128],{},[852,5129,2078],{},[922,5131,5132],{},[852,5133,2078],{},[922,5135,5136],{},[852,5137,2661],{},[848,5139,5140,2667,5142,2670],{},[852,5141,2666],{},[852,5143,1747],{},[884,5145],{},[887,5147,5148],{"id":2675},[852,5149,1019],{},[848,5151,2680,5152,2684,5154,1188],{},[852,5153,2683],{},[852,5155,2052],{},[848,5157,5158,2691],{},[852,5159,882],{},[1108,5161,5162],{"className":1110,"code":2694,"filename":2695,"language":1113,"meta":1114,"style":1114},[852,5163,5164,5186,5204,5222],{"__ignoreMap":1114},[1118,5165,5166,5168,5170,5172,5174,5176,5178,5180,5182,5184],{"class":1120,"line":1121},[1118,5167,1125],{"class":1124},[1118,5169,1128],{"class":1124},[1118,5171,2706],{"class":1131},[1118,5173,1136],{"class":1135},[1118,5175,1140],{"class":1139},[1118,5177,1143],{"class":1135},[1118,5179,1147],{"class":1146},[1118,5181,1150],{"class":1135},[1118,5183,1153],{"class":1139},[1118,5185,1156],{"class":1135},[1118,5187,5188,5190,5192,5194,5196,5198,5200,5202],{"class":1120,"line":1159},[1118,5189,1162],{"class":1139},[1118,5191,1561],{"class":1168},[1118,5193,1408],{"class":1180},[1118,5195,1185],{"class":1184},[1118,5197,1188],{"class":1135},[1118,5199,1191],{"class":1184},[1118,5201,1188],{"class":1135},[1118,5203,2739],{"class":1184},[1118,5205,5206,5208,5210,5212,5214,5216,5218,5220],{"class":1120,"line":1199},[1118,5207,1202],{"class":1124},[1118,5209,1165],{"class":1135},[1118,5211,1590],{"class":1184},[1118,5213,1228],{"class":1454},[1118,5215,1596],{"class":1595},[1118,5217,1031],{"class":1135},[1118,5219,2756],{"class":1184},[1118,5221,1213],{"class":1135},[1118,5223,5224,5226,5228,5230,5232,5234,5236],{"class":1120,"line":1216},[1118,5225,1883],{"class":1135},[1118,5227,2766],{"class":2765},[1118,5229,1031],{"class":1135},[1118,5231,1465],{"class":1457},[1118,5233,1030],{"class":1461},[1118,5235,1465],{"class":1457},[1118,5237,1576],{"class":1135},[848,5239,2779,5240,2782,5242,2785],{},[852,5241,2052],{},[852,5243,1368],{},[884,5245],{},[887,5247,5248],{"id":2790},[852,5249,1045],{},[848,5251,2795,5252,1031,5254,1704,5256,2805,5258,1143,5260,1031,5262,1031,5264,1031,5266,2821],{},[852,5253,2798],{},[852,5255,2801],{},[852,5257,2804],{},[852,5259,2808],{},[852,5261,2811],{},[852,5263,2814],{},[852,5265,2817],{},[852,5267,2820],{},[848,5269,2824,5270,2227,5272,2831],{},[852,5271,2827],{},[852,5273,2830],{},[1108,5275,5276],{"className":1110,"code":2834,"filename":2835,"language":1113,"meta":1114,"style":1114},[852,5277,5278,5300,5322,5326,5344],{"__ignoreMap":1114},[1118,5279,5280,5282,5284,5286,5288,5290,5292,5294,5296,5298],{"class":1120,"line":1121},[1118,5281,1125],{"class":1124},[1118,5283,1128],{"class":1124},[1118,5285,2846],{"class":1131},[1118,5287,1136],{"class":1135},[1118,5289,1140],{"class":1139},[1118,5291,1143],{"class":1135},[1118,5293,1147],{"class":1146},[1118,5295,1150],{"class":1135},[1118,5297,1153],{"class":1139},[1118,5299,1156],{"class":1135},[1118,5301,5302,5304,5306,5308,5310,5312,5314,5316,5318,5320],{"class":1120,"line":1159},[1118,5303,1162],{"class":1139},[1118,5305,1165],{"class":1135},[1118,5307,2869],{"class":1168},[1118,5309,1031],{"class":1135},[1118,5311,2820],{"class":1168},[1118,5313,1177],{"class":1135},[1118,5315,1181],{"class":1180},[1118,5317,1185],{"class":1184},[1118,5319,1188],{"class":1135},[1118,5321,2884],{"class":1184},[1118,5323,5324],{"class":1120,"line":1199},[1118,5325,2889],{"class":1422},[1118,5327,5328,5330,5332,5334,5336,5338,5340,5342],{"class":1120,"line":1216},[1118,5329,1202],{"class":1124},[1118,5331,1165],{"class":1135},[1118,5333,1590],{"class":1184},[1118,5335,1228],{"class":1454},[1118,5337,1596],{"class":1595},[1118,5339,1031],{"class":1135},[1118,5341,2820],{"class":1184},[1118,5343,1213],{"class":1135},[1118,5345,5346],{"class":1120,"line":1286},[1118,5347,1219],{"class":1135},[1733,5349,5350],{},[848,5351,2916],{},[884,5353],{},[887,5355,5356],{"id":2921},[852,5357,1061],{},[848,5359,2926,5360,2930],{},[852,5361,2929],{},[1108,5363,5364],{"className":1110,"code":2933,"filename":2934,"language":1113,"meta":1114,"style":1114},[852,5365,5366,5388,5392,5406],{"__ignoreMap":1114},[1118,5367,5368,5370,5372,5374,5376,5378,5380,5382,5384,5386],{"class":1120,"line":1121},[1118,5369,1125],{"class":1124},[1118,5371,1128],{"class":1124},[1118,5373,2945],{"class":1131},[1118,5375,1136],{"class":1135},[1118,5377,1140],{"class":1139},[1118,5379,1143],{"class":1135},[1118,5381,1147],{"class":1146},[1118,5383,1150],{"class":1135},[1118,5385,1153],{"class":1139},[1118,5387,1156],{"class":1135},[1118,5389,5390],{"class":1120,"line":1159},[1118,5391,2964],{"class":1422},[1118,5393,5394,5396,5398,5400,5402,5404],{"class":1120,"line":1199},[1118,5395,1202],{"class":1124},[1118,5397,1165],{"class":1135},[1118,5399,1590],{"class":1184},[1118,5401,1228],{"class":1454},[1118,5403,1596],{"class":1595},[1118,5405,1213],{"class":1135},[1118,5407,5408],{"class":1120,"line":1216},[1118,5409,1219],{"class":1135},[848,5411,2985,5412,2988,5414,2991],{},[852,5413,852],{},[852,5415,2052],{},[884,5417],{},[887,5419,5420],{"id":2996},[852,5421,1076],{},[848,5423,3001],{},[1108,5425,5426],{"className":1110,"code":3004,"filename":3005,"language":1113,"meta":1114,"style":1114},[852,5427,5428,5450,5462,5476],{"__ignoreMap":1114},[1118,5429,5430,5432,5434,5436,5438,5440,5442,5444,5446,5448],{"class":1120,"line":1121},[1118,5431,1125],{"class":1124},[1118,5433,1128],{"class":1124},[1118,5435,3016],{"class":1131},[1118,5437,1136],{"class":1135},[1118,5439,1140],{"class":1139},[1118,5441,1143],{"class":1135},[1118,5443,1147],{"class":1146},[1118,5445,1150],{"class":1135},[1118,5447,1153],{"class":1139},[1118,5449,1156],{"class":1135},[1118,5451,5452,5454,5456,5458,5460],{"class":1120,"line":1159},[1118,5453,1668],{"class":1124},[1118,5455,3037],{"class":1131},[1118,5457,1136],{"class":1135},[1118,5459,1147],{"class":1184},[1118,5461,1576],{"class":1135},[1118,5463,5464,5466,5468,5470,5472,5474],{"class":1120,"line":1199},[1118,5465,1202],{"class":1124},[1118,5467,1165],{"class":1135},[1118,5469,1590],{"class":1184},[1118,5471,1228],{"class":1454},[1118,5473,1596],{"class":1595},[1118,5475,1213],{"class":1135},[1118,5477,5478],{"class":1120,"line":1216},[1118,5479,1219],{"class":1135},[848,5481,3064,5482,1031,5484,1031,5486,1031,5488,1031,5490,3080],{},[852,5483,3067],{},[852,5485,3070],{},[852,5487,3073],{},[852,5489,3076],{},[852,5491,3079],{},[884,5493],{},[887,5495,3086],{"id":3085},[848,5497,3089],{},[892,5499,5500,5510],{},[895,5501,5502],{},[898,5503,5504,5506,5508],{},[901,5505,3098],{},[901,5507,3101],{},[901,5509,3104],{},[917,5511,5512,5526,5538,5550,5562,5574,5586,5598,5610,5622,5634,5646],{},[898,5513,5514,5518,5524],{},[922,5515,5516],{},[852,5517,1419],{},[922,5519,5520,1031,5522],{},[852,5521,926],{},[852,5523,944],{},[922,5525,3121],{},[898,5527,5528,5532,5536],{},[922,5529,5530],{},[852,5531,3128],{},[922,5533,5534],{},[852,5535,1097],{},[922,5537,3135],{},[898,5539,5540,5544,5548],{},[922,5541,5542],{},[852,5543,2801],{},[922,5545,5546],{},[852,5547,1097],{},[922,5549,3148],{},[898,5551,5552,5556,5560],{},[922,5553,5554],{},[852,5555,3155],{},[922,5557,5558],{},[852,5559,1061],{},[922,5561,3162],{},[898,5563,5564,5568,5572],{},[922,5565,5566],{},[852,5567,3169],{},[922,5569,5570],{},[852,5571,876],{},[922,5573,3176],{},[898,5575,5576,5580,5584],{},[922,5577,5578],{},[852,5579,2382],{},[922,5581,5582],{},[852,5583,882],{},[922,5585,3189],{},[898,5587,5588,5592,5596],{},[922,5589,5590],{},[852,5591,2592],{},[922,5593,5594],{},[852,5595,882],{},[922,5597,3202],{},[898,5599,5600,5604,5608],{},[922,5601,5602],{},[852,5603,2608],{},[922,5605,5606],{},[852,5607,882],{},[922,5609,3215],{},[898,5611,5612,5616,5620],{},[922,5613,5614],{},[852,5615,2068],{},[922,5617,5618],{},[852,5619,882],{},[922,5621,3228],{},[898,5623,5624,5628,5632],{},[922,5625,5626],{},[852,5627,2439],{},[922,5629,5630],{},[852,5631,882],{},[922,5633,3241],{},[898,5635,5636,5640,5644],{},[922,5637,5638],{},[852,5639,2078],{},[922,5641,5642],{},[852,5643,882],{},[922,5645,3254],{},[898,5647,5648,5652,5656],{},[922,5649,5650],{},[852,5651,2756],{},[922,5653,5654],{},[852,5655,1019],{},[922,5657,3267],{},[884,5659],{},[887,5661,3273],{"id":3272},[848,5663,3276],{},[1108,5665,5666],{"className":1110,"code":3279,"filename":3280,"language":1113,"meta":1114,"style":1114},[852,5667,5668,5700,5724,5728,5752,5770,5796,5800,5808,5814,5828,5832,5836,5840,5852,5856,5874,5878,5882,5886,5890,5894,5916,5920],{"__ignoreMap":1114},[1118,5669,5670,5672,5674,5676,5678,5680,5682,5684,5686,5688,5690,5692,5694,5696,5698],{"class":1120,"line":1121},[1118,5671,3287],{"class":1124},[1118,5673,1165],{"class":1135},[1118,5675,3292],{"class":1184},[1118,5677,1031],{"class":1135},[1118,5679,3297],{"class":1124},[1118,5681,3300],{"class":1184},[1118,5683,1031],{"class":1135},[1118,5685,3297],{"class":1124},[1118,5687,3307],{"class":1184},[1118,5689,1177],{"class":1135},[1118,5691,3312],{"class":1124},[1118,5693,1458],{"class":1457},[1118,5695,3317],{"class":1461},[1118,5697,1465],{"class":1457},[1118,5699,3322],{"class":1135},[1118,5701,5702,5704,5706,5708,5710,5712,5714,5716,5718,5720,5722],{"class":1120,"line":1159},[1118,5703,3287],{"class":1124},[1118,5705,1165],{"class":1135},[1118,5707,975],{"class":1184},[1118,5709,1031],{"class":1135},[1118,5711,1076],{"class":1184},[1118,5713,1177],{"class":1135},[1118,5715,3312],{"class":1124},[1118,5717,1458],{"class":1457},[1118,5719,854],{"class":1461},[1118,5721,1465],{"class":1457},[1118,5723,3322],{"class":1135},[1118,5725,5726],{"class":1120,"line":1199},[1118,5727,1428],{"emptyLinePlaceholder":8},[1118,5729,5730,5732,5734,5736,5738,5740,5742,5744,5746,5748,5750],{"class":1120,"line":1216},[1118,5731,1125],{"class":1124},[1118,5733,3357],{"class":1139},[1118,5735,3360],{"class":1131},[1118,5737,1408],{"class":1180},[1118,5739,3365],{"class":1135},[1118,5741,3369],{"class":3368},[1118,5743,3372],{"class":1139},[1118,5745,3307],{"class":3368},[1118,5747,1031],{"class":1135},[1118,5749,3379],{"class":3368},[1118,5751,3382],{"class":1135},[1118,5753,5754,5756,5758,5760,5762,5764,5766,5768],{"class":1120,"line":1286},[1118,5755,3387],{"class":1146},[1118,5757,1228],{"class":1180},[1118,5759,3300],{"class":1241},[1118,5761,3394],{"class":1135},[1118,5763,3369],{"class":3368},[1118,5765,1031],{"class":1135},[1118,5767,3379],{"class":3368},[1118,5769,3403],{"class":1135},[1118,5771,5772,5774,5776,5778,5780,5782,5784,5786,5788,5790,5792,5794],{"class":1120,"line":1296},[1118,5773,3408],{"class":1135},[1118,5775,1228],{"class":1180},[1118,5777,3300],{"class":1241},[1118,5779,3394],{"class":1135},[1118,5781,3369],{"class":3368},[1118,5783,1031],{"class":1135},[1118,5785,3421],{"class":3368},[1118,5787,3394],{"class":1135},[1118,5789,3379],{"class":3368},[1118,5791,3428],{"class":1135},[1118,5793,1153],{"class":1139},[1118,5795,1156],{"class":1135},[1118,5797,5798],{"class":1120,"line":1306},[1118,5799,3437],{"class":1135},[1118,5801,5802,5804,5806],{"class":1120,"line":1316},[1118,5803,1202],{"class":1124},[1118,5805,1627],{"class":1131},[1118,5807,3446],{"class":1135},[1118,5809,5810,5812],{"class":1120,"line":1326},[1118,5811,3451],{"class":1131},[1118,5813,3446],{"class":1135},[1118,5815,5816,5818,5820,5822,5824,5826],{"class":1120,"line":1336},[1118,5817,3458],{"class":1131},[1118,5819,3461],{"class":1135},[1118,5821,1147],{"class":1146},[1118,5823,1150],{"class":1135},[1118,5825,1153],{"class":1139},[1118,5827,1156],{"class":1135},[1118,5829,5830],{"class":1120,"line":1346},[1118,5831,3474],{"class":1135},[1118,5833,5834],{"class":1120,"line":2452},[1118,5835,3479],{"class":1422},[1118,5837,5838],{"class":1120,"line":2471},[1118,5839,1428],{"emptyLinePlaceholder":8},[1118,5841,5842,5844,5846,5848,5850],{"class":1120,"line":2502},[1118,5843,3488],{"class":1124},[1118,5845,3491],{"class":1131},[1118,5847,1136],{"class":1135},[1118,5849,1147],{"class":1184},[1118,5851,3498],{"class":1135},[1118,5853,5854],{"class":1120,"line":2507},[1118,5855,3503],{"class":1135},[1118,5857,5858,5860,5862,5864,5866,5868,5870,5872],{"class":1120,"line":2512},[1118,5859,3508],{"class":1135},[1118,5861,3511],{"class":1124},[1118,5863,3300],{"class":1241},[1118,5865,3394],{"class":1135},[1118,5867,3369],{"class":3368},[1118,5869,1031],{"class":1135},[1118,5871,3379],{"class":3368},[1118,5873,3403],{"class":1135},[1118,5875,5876],{"class":1120,"line":2527},[1118,5877,3528],{"class":1135},[1118,5879,5880],{"class":1120,"line":3531},[1118,5881,3534],{"class":1135},[1118,5883,5884],{"class":1120,"line":3537},[1118,5885,1428],{"emptyLinePlaceholder":8},[1118,5887,5888],{"class":1120,"line":3542},[1118,5889,3545],{"class":1422},[1118,5891,5892],{"class":1120,"line":3548},[1118,5893,1428],{"emptyLinePlaceholder":8},[1118,5895,5896,5898,5900,5902,5904,5906,5908,5910,5912,5914],{"class":1120,"line":3553},[1118,5897,1125],{"class":1124},[1118,5899,1128],{"class":1124},[1118,5901,3360],{"class":1131},[1118,5903,1136],{"class":1135},[1118,5905,1140],{"class":1139},[1118,5907,1143],{"class":1135},[1118,5909,1147],{"class":1146},[1118,5911,1150],{"class":1135},[1118,5913,1153],{"class":1139},[1118,5915,1156],{"class":1135},[1118,5917,5918],{"class":1120,"line":3576},[1118,5919,3579],{"class":1422},[1118,5921,5922],{"class":1120,"line":3582},[1118,5923,1219],{"class":1135},[884,5925],{},[887,5927,3590],{"id":3589},[848,5929,3593,5930,2227,5932,3598,5934,3601],{},[852,5931,926],{},[852,5933,944],{},[852,5935,1097],{},[3603,5937,3605],{},{"title":1114,"searchDepth":1159,"depth":1159,"links":5939},[5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953],{"id":889,"depth":1159,"text":890},{"id":1089,"depth":1159,"text":926},{"id":1354,"depth":1159,"text":944},{"id":1516,"depth":1159,"text":960},{"id":1607,"depth":1159,"text":975},{"id":1718,"depth":1159,"text":876},{"id":2036,"depth":1159,"text":882},{"id":2675,"depth":1159,"text":1019},{"id":2790,"depth":1159,"text":1045},{"id":2921,"depth":1159,"text":1061},{"id":2996,"depth":1159,"text":1076},{"id":3085,"depth":1159,"text":3086},{"id":3272,"depth":1159,"text":3273},{"id":3589,"depth":1159,"text":3590},{},{"title":93,"description":3622},1780436290319]