[{"data":1,"prerenderedAt":5703},["ShallowReactive",2],{"navigation_docs":3,"-reference-api-reference":172,"-reference-api-reference-surround":5700},[4,26,67,98,124,140,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-play",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Core","i-lucide-box","\u002Fcore","2.core",[32,37,42,47,52,57,62],{"title":33,"path":34,"stem":35,"icon":36},"Routing","\u002Fcore\u002Frouting","2.core\u002F1.routing","i-lucide-route",{"title":38,"path":39,"stem":40,"icon":41},"Handlers","\u002Fcore\u002Fhandlers","2.core\u002F2.handlers","i-lucide-braces",{"title":43,"path":44,"stem":45,"icon":46},"Request Binding","\u002Fcore\u002Frequest-binding","2.core\u002F3.request-binding","i-lucide-tags",{"title":48,"path":49,"stem":50,"icon":51},"Validation","\u002Fcore\u002Fvalidation","2.core\u002F4.validation","i-lucide-check-check",{"title":53,"path":54,"stem":55,"icon":56},"Context","\u002Fcore\u002Fcontext","2.core\u002F5.context","i-lucide-file-input",{"title":58,"path":59,"stem":60,"icon":61},"Errors","\u002Fcore\u002Ferrors","2.core\u002F6.errors","i-lucide-triangle-alert",{"title":63,"path":64,"stem":65,"icon":66},"Middleware","\u002Fcore\u002Fmiddleware","2.core\u002F7.middleware","i-lucide-layers",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":25},"Auth","i-lucide-shield-check","\u002Fauth","3.auth",[73,78,83,88,93],{"title":74,"path":75,"stem":76,"icon":77},"Overview","\u002Fauth\u002Foverview","3.auth\u002F1.overview","i-lucide-shield",{"title":79,"path":80,"stem":81,"icon":82},"Auth Rules","\u002Fauth\u002Fauth-rules","3.auth\u002F2.auth-rules","i-lucide-lock",{"title":84,"path":85,"stem":86,"icon":87},"JWT Providers","\u002Fauth\u002Fjwt-providers","3.auth\u002F3.jwt-providers","i-lucide-key",{"title":89,"path":90,"stem":91,"icon":92},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F4.roles-and-permissions","i-lucide-users",{"title":94,"path":95,"stem":96,"icon":97},"Audit Logging","\u002Fauth\u002Faudit-logging","3.auth\u002F5.audit-logging","i-lucide-scroll-text",{"title":99,"icon":100,"path":101,"stem":102,"children":103,"page":25},"GoTrue","i-lucide-key-round","\u002Fgotrue","4.gotrue",[104,109,114,119],{"title":105,"path":106,"stem":107,"icon":108},"Proxy","\u002Fgotrue\u002Fproxy","4.gotrue\u002F1.proxy","i-lucide-shuffle",{"title":110,"path":111,"stem":112,"icon":113},"Endpoints","\u002Fgotrue\u002Fendpoints","4.gotrue\u002F2.endpoints","i-lucide-list",{"title":115,"path":116,"stem":117,"icon":118},"Client IP & Rate Limits","\u002Fgotrue\u002Fclient-ip-and-rate-limits","4.gotrue\u002F3.client-ip-and-rate-limits","i-lucide-network",{"title":120,"path":121,"stem":122,"icon":123},"Deployment","\u002Fgotrue\u002Fdeployment","4.gotrue\u002F4.deployment","i-lucide-server",{"title":125,"icon":126,"path":127,"stem":128,"children":129,"page":25},"API Docs","i-lucide-file-text","\u002Fapi-docs","5.api-docs",[130,135],{"title":131,"path":132,"stem":133,"icon":134},"OpenAPI","\u002Fapi-docs\u002Fopenapi","5.api-docs\u002F1.openapi","i-lucide-file-json",{"title":136,"path":137,"stem":138,"icon":139},"Scalar UI","\u002Fapi-docs\u002Fscalar","5.api-docs\u002F2.scalar","i-lucide-book-open-text",{"title":141,"icon":142,"path":143,"stem":144,"children":145,"page":25},"Guides","i-lucide-compass","\u002Fguides","6.guides",[146,151,156],{"title":147,"path":148,"stem":149,"icon":150},"Testing","\u002Fguides\u002Ftesting","6.guides\u002F1.testing","i-lucide-flask-conical",{"title":152,"path":153,"stem":154,"icon":155},"Performance","\u002Fguides\u002Fperformance","6.guides\u002F2.performance","i-lucide-gauge",{"title":157,"path":158,"stem":159,"icon":160},"Releasing","\u002Fguides\u002Freleasing","6.guides\u002F3.releasing","i-lucide-tag",{"title":162,"icon":163,"path":164,"stem":165,"children":166,"page":25},"Reference","i-lucide-code","\u002Freference","7.reference",[167],{"title":168,"path":169,"stem":170,"icon":171},"API Reference","\u002Freference\u002Fapi-reference","7.reference\u002F1.api-reference","i-lucide-list-tree",{"id":173,"title":168,"body":174,"description":5693,"extension":5694,"links":5695,"meta":5696,"navigation":5697,"path":169,"seo":5698,"stem":170,"__hash__":5699},"docs\u002F7.reference\u002F1.api-reference.md",{"type":175,"value":176,"toc":5666},"minimark",[177,181,186,191,224,364,464,474,478,529,533,727,824,830,834,945,1029,1102,1125,1129,1132,1301,1305,1308,1416,1442,1445,1514,1627,1795,1799,1802,1928,1988,1992,1996,2188,2239,2243,2247,2578,2613,2617,2722,3016,3020,3024,3319,3379,3455,3461,3465,3469,3856,3868,3872,4134,4138,4335,4340,4344,4529,4552,4556,4824,4829,4832,5056,5124,5131,5135,5264,5268,5271,5454,5481,5505,5552,5556,5653,5662],[178,179,180],"p",{},"A map of the public surface. Each entry links to the page that explains it in context.",[182,183,185],"h2",{"id":184},"package-ezz","Package ezz",[187,188,190],"h3",{"id":189},"app","App",[192,193,198],"pre",{"className":194,"code":195,"language":196,"meta":197,"style":197},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func New() *App\n","go","",[199,200,201],"code",{"__ignoreMap":197},[202,203,206,210,214,217,220],"span",{"class":204,"line":205},"line",1,[202,207,209],{"class":208},"sMK4o","func",[202,211,213],{"class":212},"s2Zo4"," New",[202,215,216],{"class":208},"()",[202,218,219],{"class":208}," *",[202,221,223],{"class":222},"sBMFI","App\n",[225,226,227,240],"table",{},[228,229,230],"thead",{},[231,232,233,237],"tr",{},[234,235,236],"th",{},"Method",[234,238,239],{},"Purpose",[241,242,243,254,264,278,288,298,308,318,331,344,354],"tbody",{},[231,244,245,251],{},[246,247,248],"td",{},[199,249,250],{},"Logger(*slog.Logger) *App",[246,252,253],{},"Set the logger and rebuild the default middleware",[231,255,256,261],{},[246,257,258],{},[199,259,260],{},"Auth(AuthProvider) *App",[246,262,263],{},"Register the authentication provider",[231,265,266,271],{},[246,267,268],{},[199,269,270],{},"DefaultAuth(AuthRule) *App",[246,272,273,274,277],{},"Change the default rule; ",[199,275,276],{},"nil"," makes routes public",[231,279,280,285],{},[246,281,282],{},[199,283,284],{},"Use(...Middleware) *App",[246,286,287],{},"Append middleware",[231,289,290,295],{},[246,291,292],{},[199,293,294],{},"GET\u002FPOST\u002FPUT\u002FDELETE\u002FPATCH\u002FHEAD\u002FOPTIONS(pattern, http.Handler) *RouteBuilder",[246,296,297],{},"Register a route",[231,299,300,305],{},[246,301,302],{},[199,303,304],{},"Handle(method, pattern string, h http.Handler) *RouteBuilder",[246,306,307],{},"Register with an explicit method",[231,309,310,315],{},[246,311,312],{},[199,313,314],{},"Group(prefix string) *RouteGroup",[246,316,317],{},"Create a route group",[231,319,320,325],{},[246,321,322],{},[199,323,324],{},"ServeHTTP(w, r)",[246,326,327,328],{},"Satisfies ",[199,329,330],{},"http.Handler",[231,332,333,338],{},[246,334,335],{},[199,336,337],{},"Listen(addr string) error",[246,339,340,341],{},"Start a server on ",[199,342,343],{},"addr",[231,345,346,351],{},[246,347,348],{},[199,349,350],{},"Routes() []*Route",[246,352,353],{},"Registered routes",[231,355,356,361],{},[246,357,358],{},[199,359,360],{},"GetRoutes() []RouteInfo",[246,362,363],{},"Legacy view used by the OpenAPI generator",[192,365,367],{"className":194,"code":366,"language":196,"meta":197,"style":197},"type AuthProvider interface {\n    Authenticate(r *http.Request) (any, error)\n}\n\nfunc UserFromContext(ctx context.Context) any\n",[199,368,369,383,426,432,439],{"__ignoreMap":197},[202,370,371,374,377,380],{"class":204,"line":205},[202,372,373],{"class":208},"type",[202,375,376],{"class":222}," AuthProvider",[202,378,379],{"class":208}," interface",[202,381,382],{"class":208}," {\n",[202,384,386,389,392,396,398,401,404,407,410,413,416,419,423],{"class":204,"line":385},2,[202,387,388],{"class":212},"    Authenticate",[202,390,391],{"class":208},"(",[202,393,395],{"class":394},"sHdIc","r",[202,397,219],{"class":208},[202,399,400],{"class":222},"http",[202,402,403],{"class":208},".",[202,405,406],{"class":222},"Request",[202,408,409],{"class":208},")",[202,411,412],{"class":208}," (",[202,414,415],{"class":222},"any",[202,417,418],{"class":208},",",[202,420,422],{"class":421},"spNyl"," error",[202,424,425],{"class":208},")\n",[202,427,429],{"class":204,"line":428},3,[202,430,431],{"class":208},"}\n",[202,433,435],{"class":204,"line":434},4,[202,436,438],{"emptyLinePlaceholder":437},true,"\n",[202,440,442,444,447,449,452,455,457,459,461],{"class":204,"line":441},5,[202,443,209],{"class":208},[202,445,446],{"class":212}," UserFromContext",[202,448,391],{"class":208},[202,450,451],{"class":394},"ctx",[202,453,454],{"class":222}," context",[202,456,403],{"class":208},[202,458,53],{"class":222},[202,460,409],{"class":208},[202,462,463],{"class":222}," any\n",[178,465,466,467,470,471,403],{},"See ",[468,469,33],"a",{"href":34}," and ",[468,472,473],{"href":75},"Auth overview",[187,475,477],{"id":476},"routegroup","RouteGroup",[225,479,480,488],{},[228,481,482],{},[231,483,484,486],{},[234,485,236],{},[234,487,239],{},[241,489,490,500,510,519],{},[231,491,492,497],{},[246,493,494],{},[199,495,496],{},"Use(...Middleware) *RouteGroup",[246,498,499],{},"Middleware for routes in this group",[231,501,502,507],{},[246,503,504],{},[199,505,506],{},"Auth(AuthRule) *RouteGroup",[246,508,509],{},"Auth rule for routes in this group",[231,511,512,516],{},[246,513,514],{},[199,515,314],{},[246,517,518],{},"Nested group, inheriting middleware and rule",[231,520,521,526],{},[246,522,523],{},[199,524,525],{},"GET\u002FPOST\u002FPUT\u002FDELETE\u002FPATCH\u002FHEAD\u002FOPTIONS(pattern, h) *RouteBuilder",[246,527,528],{},"Register a route under the prefix",[187,530,532],{"id":531},"route-and-routebuilder","Route and RouteBuilder",[192,534,536],{"className":194,"code":535,"language":196,"meta":197,"style":197},"type Route struct {\n    Method, Pattern string\n    Handler         http.Handler\n    AuthRule        AuthRule\n    Summary         string\n    Description     string\n    Tags            []string\n    OperationID     string\n    Deprecated      bool\n    RequestType     reflect.Type\n    ResponseType    reflect.Type\n    Responses       map[int]ResponseInfo\n}\n\ntype ResponseInfo struct {\n    Description string\n    Type        reflect.Type\n    Example     any\n}\n",[199,537,538,550,564,576,584,591,599,610,618,627,641,653,671,676,681,693,701,713,722],{"__ignoreMap":197},[202,539,540,542,545,548],{"class":204,"line":205},[202,541,373],{"class":208},[202,543,544],{"class":222}," Route",[202,546,547],{"class":208}," struct",[202,549,382],{"class":208},[202,551,552,556,558,561],{"class":204,"line":385},[202,553,555],{"class":554},"sTEyZ","    Method",[202,557,418],{"class":208},[202,559,560],{"class":554}," Pattern ",[202,562,563],{"class":421},"string\n",[202,565,566,569,571,573],{"class":204,"line":428},[202,567,568],{"class":554},"    Handler         ",[202,570,400],{"class":222},[202,572,403],{"class":208},[202,574,575],{"class":222},"Handler\n",[202,577,578,581],{"class":204,"line":434},[202,579,580],{"class":554},"    AuthRule        ",[202,582,583],{"class":222},"AuthRule\n",[202,585,586,589],{"class":204,"line":441},[202,587,588],{"class":554},"    Summary         ",[202,590,563],{"class":421},[202,592,594,597],{"class":204,"line":593},6,[202,595,596],{"class":554},"    Description     ",[202,598,563],{"class":421},[202,600,602,605,608],{"class":204,"line":601},7,[202,603,604],{"class":554},"    Tags            ",[202,606,607],{"class":208},"[]",[202,609,563],{"class":421},[202,611,613,616],{"class":204,"line":612},8,[202,614,615],{"class":554},"    OperationID     ",[202,617,563],{"class":421},[202,619,621,624],{"class":204,"line":620},9,[202,622,623],{"class":554},"    Deprecated      ",[202,625,626],{"class":421},"bool\n",[202,628,630,633,636,638],{"class":204,"line":629},10,[202,631,632],{"class":554},"    RequestType     ",[202,634,635],{"class":222},"reflect",[202,637,403],{"class":208},[202,639,640],{"class":222},"Type\n",[202,642,644,647,649,651],{"class":204,"line":643},11,[202,645,646],{"class":554},"    ResponseType    ",[202,648,635],{"class":222},[202,650,403],{"class":208},[202,652,640],{"class":222},[202,654,656,659,662,665,668],{"class":204,"line":655},12,[202,657,658],{"class":554},"    Responses       ",[202,660,661],{"class":208},"map[",[202,663,664],{"class":421},"int",[202,666,667],{"class":208},"]",[202,669,670],{"class":222},"ResponseInfo\n",[202,672,674],{"class":204,"line":673},13,[202,675,431],{"class":208},[202,677,679],{"class":204,"line":678},14,[202,680,438],{"emptyLinePlaceholder":437},[202,682,684,686,689,691],{"class":204,"line":683},15,[202,685,373],{"class":208},[202,687,688],{"class":222}," ResponseInfo",[202,690,547],{"class":208},[202,692,382],{"class":208},[202,694,696,699],{"class":204,"line":695},16,[202,697,698],{"class":554},"    Description ",[202,700,563],{"class":421},[202,702,704,707,709,711],{"class":204,"line":703},17,[202,705,706],{"class":554},"    Type        ",[202,708,635],{"class":222},[202,710,403],{"class":208},[202,712,640],{"class":222},[202,714,716,719],{"class":204,"line":715},18,[202,717,718],{"class":554},"    Example     ",[202,720,721],{"class":222},"any\n",[202,723,725],{"class":204,"line":724},19,[202,726,431],{"class":208},[225,728,729,742],{},[228,730,731],{},[231,732,733,739],{},[234,734,735,738],{},[199,736,737],{},"*RouteBuilder"," method",[234,740,741],{},"Effect",[241,743,744,754,764,774,784,794,804,814],{},[231,745,746,751],{},[246,747,748],{},[199,749,750],{},"Auth(AuthRule)",[246,752,753],{},"Set the route's rule",[231,755,756,761],{},[246,757,758],{},[199,759,760],{},"Public()",[246,762,763],{},"Allow unauthenticated access",[231,765,766,771],{},[246,767,768],{},[199,769,770],{},"Summary(string)",[246,772,773],{},"Store a summary",[231,775,776,781],{},[246,777,778],{},[199,779,780],{},"Description(string)",[246,782,783],{},"Set the OpenAPI description",[231,785,786,791],{},[246,787,788],{},[199,789,790],{},"Tags(...string)",[246,792,793],{},"Set OpenAPI tags",[231,795,796,801],{},[246,797,798],{},[199,799,800],{},"OperationID(string)",[246,802,803],{},"Store an operation ID",[231,805,806,811],{},[246,807,808],{},[199,809,810],{},"Deprecated()",[246,812,813],{},"Mark deprecated",[231,815,816,821],{},[246,817,818],{},[199,819,820],{},"Response(status int, description string, example ...any)",[246,822,823],{},"Record a response",[178,825,826,827,403],{},"Tags and description are what the generator currently emits; see ",[468,828,131],{"href":829},"\u002Fapi-docs\u002Fopenapi#metadata-that-is-not-emitted-yet",[187,831,833],{"id":832},"auth-rules","Auth rules",[192,835,837],{"className":194,"code":836,"language":196,"meta":197,"style":197},"type AuthRule interface {\n    Check(user any) error\n    IsPublic() bool\n}\n\ntype RoleChecker interface       { HasRole(role string) bool }\ntype PermissionChecker interface { HasPermission(permission string) bool }\n",[199,838,839,850,868,878,882,886,917],{"__ignoreMap":197},[202,840,841,843,846,848],{"class":204,"line":205},[202,842,373],{"class":208},[202,844,845],{"class":222}," AuthRule",[202,847,379],{"class":208},[202,849,382],{"class":208},[202,851,852,855,857,860,863,865],{"class":204,"line":385},[202,853,854],{"class":212},"    Check",[202,856,391],{"class":208},[202,858,859],{"class":394},"user",[202,861,862],{"class":222}," any",[202,864,409],{"class":208},[202,866,867],{"class":421}," error\n",[202,869,870,873,875],{"class":204,"line":428},[202,871,872],{"class":212},"    IsPublic",[202,874,216],{"class":208},[202,876,877],{"class":421}," bool\n",[202,879,880],{"class":204,"line":434},[202,881,431],{"class":208},[202,883,884],{"class":204,"line":441},[202,885,438],{"emptyLinePlaceholder":437},[202,887,888,890,893,895,898,901,903,906,909,911,914],{"class":204,"line":593},[202,889,373],{"class":208},[202,891,892],{"class":222}," RoleChecker",[202,894,379],{"class":208},[202,896,897],{"class":208},"       {",[202,899,900],{"class":212}," HasRole",[202,902,391],{"class":208},[202,904,905],{"class":394},"role",[202,907,908],{"class":421}," string",[202,910,409],{"class":208},[202,912,913],{"class":421}," bool",[202,915,916],{"class":208}," }\n",[202,918,919,921,924,926,929,932,934,937,939,941,943],{"class":204,"line":601},[202,920,373],{"class":208},[202,922,923],{"class":222}," PermissionChecker",[202,925,379],{"class":208},[202,927,928],{"class":208}," {",[202,930,931],{"class":212}," HasPermission",[202,933,391],{"class":208},[202,935,936],{"class":394},"permission",[202,938,908],{"class":421},[202,940,409],{"class":208},[202,942,913],{"class":421},[202,944,916],{"class":208},[225,946,947,957],{},[228,948,949],{},[231,950,951,954],{},[234,952,953],{},"Constructor",[234,955,956],{},"Requires",[241,958,959,969,979,989,999,1009,1019],{},[231,960,961,966],{},[246,962,963],{},[199,964,965],{},"Public() AuthRule",[246,967,968],{},"Nothing",[231,970,971,976],{},[246,972,973],{},[199,974,975],{},"Authenticated() AuthRule",[246,977,978],{},"A non-nil user",[231,980,981,986],{},[246,982,983],{},[199,984,985],{},"Role(role string) AuthRule",[246,987,988],{},"That role",[231,990,991,996],{},[246,992,993],{},[199,994,995],{},"AnyRole(roles ...string) AuthRule",[246,997,998],{},"Any listed role",[231,1000,1001,1006],{},[246,1002,1003],{},[199,1004,1005],{},"AllRoles(roles ...string) AuthRule",[246,1007,1008],{},"Every listed role",[231,1010,1011,1016],{},[246,1012,1013],{},[199,1014,1015],{},"Permission(perm string) AuthRule",[246,1017,1018],{},"That permission",[231,1020,1021,1026],{},[246,1022,1023],{},[199,1024,1025],{},"Custom(fn func(user any) bool) AuthRule",[246,1027,1028],{},"The predicate to pass",[192,1030,1032],{"className":194,"code":1031,"language":196,"meta":197,"style":197},"var ErrUnauthorized = NewHTTPError(http.StatusUnauthorized, \"Unauthorized\")\nvar ErrForbidden    = NewHTTPError(http.StatusForbidden, \"Forbidden\")\n",[199,1033,1034,1071],{"__ignoreMap":197},[202,1035,1036,1039,1042,1045,1048,1050,1052,1054,1057,1059,1062,1066,1069],{"class":204,"line":205},[202,1037,1038],{"class":208},"var",[202,1040,1041],{"class":554}," ErrUnauthorized ",[202,1043,1044],{"class":208},"=",[202,1046,1047],{"class":212}," NewHTTPError",[202,1049,391],{"class":208},[202,1051,400],{"class":554},[202,1053,403],{"class":208},[202,1055,1056],{"class":554},"StatusUnauthorized",[202,1058,418],{"class":208},[202,1060,1061],{"class":208}," \"",[202,1063,1065],{"class":1064},"sfazB","Unauthorized",[202,1067,1068],{"class":208},"\"",[202,1070,425],{"class":208},[202,1072,1073,1075,1078,1080,1082,1084,1086,1088,1091,1093,1095,1098,1100],{"class":204,"line":385},[202,1074,1038],{"class":208},[202,1076,1077],{"class":554}," ErrForbidden    ",[202,1079,1044],{"class":208},[202,1081,1047],{"class":212},[202,1083,391],{"class":208},[202,1085,400],{"class":554},[202,1087,403],{"class":208},[202,1089,1090],{"class":554},"StatusForbidden",[202,1092,418],{"class":208},[202,1094,1061],{"class":208},[202,1096,1097],{"class":1064},"Forbidden",[202,1099,1068],{"class":208},[202,1101,425],{"class":208},[1103,1104,1105,1106,1109,1110,1113,1114,1117,1118,1121,1122,403],"warning",{},"Use these, not the same-named helpers in the ",[199,1107,1108],{},"auth"," package. ",[199,1111,1112],{},"auth.Role(...)"," returns an ",[199,1115,1116],{},"auth.AuthRule"," struct from an earlier design, which does not satisfy ",[199,1119,1120],{},"ezz.AuthRule"," and cannot be passed to ",[199,1123,1124],{},".Auth(...)",[178,1126,466,1127,403],{},[468,1128,833],{"href":80},[187,1130,38],{"id":1131},"handlers",[192,1133,1135],{"className":194,"code":1134,"language":196,"meta":197,"style":197},"func H[Req, Resp any](fn func(*Context, Req) (Resp, error)) *Handler[Req, Resp]\nfunc HFunc[Resp any](fn func(*Context) (Resp, error)) *Handler[struct{}, Resp]\n\ntype TypedHandler interface {\n    http.Handler\n    RequestType() reflect.Type\n    ResponseType() reflect.Type\n}\n",[199,1136,1137,1203,1246,1250,1261,1270,1284,1297],{"__ignoreMap":197},[202,1138,1139,1141,1144,1147,1150,1152,1155,1157,1160,1163,1166,1168,1170,1173,1175,1177,1180,1182,1184,1187,1189,1192,1194,1196,1198,1200],{"class":204,"line":205},[202,1140,209],{"class":208},[202,1142,1143],{"class":212}," H",[202,1145,1146],{"class":208},"[",[202,1148,1149],{"class":394},"Req",[202,1151,418],{"class":208},[202,1153,1154],{"class":394}," Resp",[202,1156,862],{"class":222},[202,1158,1159],{"class":208},"](",[202,1161,1162],{"class":394},"fn",[202,1164,1165],{"class":208}," func(*",[202,1167,53],{"class":222},[202,1169,418],{"class":208},[202,1171,1172],{"class":222}," Req",[202,1174,409],{"class":208},[202,1176,412],{"class":208},[202,1178,1179],{"class":222},"Resp",[202,1181,418],{"class":208},[202,1183,422],{"class":421},[202,1185,1186],{"class":208},"))",[202,1188,219],{"class":208},[202,1190,1191],{"class":222},"Handler",[202,1193,1146],{"class":208},[202,1195,1149],{"class":222},[202,1197,418],{"class":208},[202,1199,1154],{"class":222},[202,1201,1202],{"class":208},"]\n",[202,1204,1205,1207,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1243],{"class":204,"line":385},[202,1206,209],{"class":208},[202,1208,1209],{"class":212}," HFunc",[202,1211,1146],{"class":208},[202,1213,1179],{"class":394},[202,1215,862],{"class":222},[202,1217,1159],{"class":208},[202,1219,1162],{"class":394},[202,1221,1165],{"class":208},[202,1223,53],{"class":222},[202,1225,409],{"class":208},[202,1227,412],{"class":208},[202,1229,1179],{"class":222},[202,1231,418],{"class":208},[202,1233,422],{"class":421},[202,1235,1186],{"class":208},[202,1237,219],{"class":208},[202,1239,1191],{"class":222},[202,1241,1242],{"class":208},"[struct{},",[202,1244,1245],{"class":554}," Resp]\n",[202,1247,1248],{"class":204,"line":428},[202,1249,438],{"emptyLinePlaceholder":437},[202,1251,1252,1254,1257,1259],{"class":204,"line":434},[202,1253,373],{"class":208},[202,1255,1256],{"class":222}," TypedHandler",[202,1258,379],{"class":208},[202,1260,382],{"class":208},[202,1262,1263,1266,1268],{"class":204,"line":441},[202,1264,1265],{"class":222},"    http",[202,1267,403],{"class":208},[202,1269,575],{"class":222},[202,1271,1272,1275,1277,1280,1282],{"class":204,"line":593},[202,1273,1274],{"class":212},"    RequestType",[202,1276,216],{"class":208},[202,1278,1279],{"class":222}," reflect",[202,1281,403],{"class":208},[202,1283,640],{"class":222},[202,1285,1286,1289,1291,1293,1295],{"class":204,"line":601},[202,1287,1288],{"class":212},"    ResponseType",[202,1290,216],{"class":208},[202,1292,1279],{"class":222},[202,1294,403],{"class":208},[202,1296,640],{"class":222},[202,1298,1299],{"class":204,"line":612},[202,1300,431],{"class":208},[178,1302,466,1303,403],{},[468,1304,38],{"href":39},[187,1306,58],{"id":1307},"errors",[192,1309,1311],{"className":194,"code":1310,"language":196,"meta":197,"style":197},"type HTTPError struct {\n    StatusCode int\n    Message    string\n    Internal   error\n}\n\nfunc NewHTTPError(status int, message string) *HTTPError\nfunc (e *HTTPError) WithInternal(err error) *HTTPError\n",[199,1312,1313,1324,1332,1339,1347,1351,1355,1383],{"__ignoreMap":197},[202,1314,1315,1317,1320,1322],{"class":204,"line":205},[202,1316,373],{"class":208},[202,1318,1319],{"class":222}," HTTPError",[202,1321,547],{"class":208},[202,1323,382],{"class":208},[202,1325,1326,1329],{"class":204,"line":385},[202,1327,1328],{"class":554},"    StatusCode ",[202,1330,1331],{"class":421},"int\n",[202,1333,1334,1337],{"class":204,"line":428},[202,1335,1336],{"class":554},"    Message    ",[202,1338,563],{"class":421},[202,1340,1341,1344],{"class":204,"line":434},[202,1342,1343],{"class":554},"    Internal   ",[202,1345,1346],{"class":421},"error\n",[202,1348,1349],{"class":204,"line":441},[202,1350,431],{"class":208},[202,1352,1353],{"class":204,"line":593},[202,1354,438],{"emptyLinePlaceholder":437},[202,1356,1357,1359,1361,1363,1366,1369,1371,1374,1376,1378,1380],{"class":204,"line":601},[202,1358,209],{"class":208},[202,1360,1047],{"class":212},[202,1362,391],{"class":208},[202,1364,1365],{"class":394},"status",[202,1367,1368],{"class":421}," int",[202,1370,418],{"class":208},[202,1372,1373],{"class":394}," message",[202,1375,908],{"class":421},[202,1377,409],{"class":208},[202,1379,219],{"class":208},[202,1381,1382],{"class":222},"HTTPError\n",[202,1384,1385,1387,1389,1392,1395,1398,1400,1403,1405,1408,1410,1412,1414],{"class":204,"line":612},[202,1386,209],{"class":208},[202,1388,412],{"class":208},[202,1390,1391],{"class":394},"e ",[202,1393,1394],{"class":208},"*",[202,1396,1397],{"class":222},"HTTPError",[202,1399,409],{"class":208},[202,1401,1402],{"class":212}," WithInternal",[202,1404,391],{"class":208},[202,1406,1407],{"class":394},"err",[202,1409,422],{"class":421},[202,1411,409],{"class":208},[202,1413,219],{"class":208},[202,1415,1382],{"class":222},[178,1417,1418,1419,1422,1423,1422,1425,1422,1427,1422,1430,1422,1433,1422,1436,1439,1440,403],{},"Constructors: ",[199,1420,1421],{},"BadRequest",", ",[199,1424,1065],{},[199,1426,1097],{},[199,1428,1429],{},"NotFound",[199,1431,1432],{},"Conflict",[199,1434,1435],{},"UnprocessableEntity",[199,1437,1438],{},"InternalServerError",". See ",[468,1441,58],{"href":59},[187,1443,53],{"id":1444},"context",[192,1446,1448],{"className":194,"code":1447,"language":196,"meta":197,"style":197},"type Context struct {\n    context.Context\n    Request   *http.Request\n    Response  http.ResponseWriter\n    StartTime time.Time\n}\n",[199,1449,1450,1461,1471,1485,1497,1510],{"__ignoreMap":197},[202,1451,1452,1454,1457,1459],{"class":204,"line":205},[202,1453,373],{"class":208},[202,1455,1456],{"class":222}," Context",[202,1458,547],{"class":208},[202,1460,382],{"class":208},[202,1462,1463,1466,1468],{"class":204,"line":385},[202,1464,1465],{"class":222},"    context",[202,1467,403],{"class":208},[202,1469,1470],{"class":222},"Context\n",[202,1472,1473,1476,1478,1480,1482],{"class":204,"line":428},[202,1474,1475],{"class":554},"    Request   ",[202,1477,1394],{"class":208},[202,1479,400],{"class":222},[202,1481,403],{"class":208},[202,1483,1484],{"class":222},"Request\n",[202,1486,1487,1490,1492,1494],{"class":204,"line":434},[202,1488,1489],{"class":554},"    Response  ",[202,1491,400],{"class":222},[202,1493,403],{"class":208},[202,1495,1496],{"class":222},"ResponseWriter\n",[202,1498,1499,1502,1505,1507],{"class":204,"line":441},[202,1500,1501],{"class":554},"    StartTime ",[202,1503,1504],{"class":222},"time",[202,1506,403],{"class":208},[202,1508,1509],{"class":222},"Time\n",[202,1511,1512],{"class":204,"line":593},[202,1513,431],{"class":208},[225,1515,1516,1526],{},[228,1517,1518],{},[231,1519,1520,1523],{},[234,1521,1522],{},"Group",[234,1524,1525],{},"Methods",[241,1527,1528,1547,1574,1605],{},[231,1529,1530,1533],{},[246,1531,1532],{},"Metadata",[246,1534,1535,1422,1538,1422,1541,1422,1544],{},[199,1536,1537],{},"GetRequestID",[199,1539,1540],{},"GetClientIP",[199,1542,1543],{},"GetUserAgent",[199,1545,1546],{},"GetTraceID",[231,1548,1549,1551],{},[246,1550,406],{},[246,1552,1553,1422,1556,1422,1559,1422,1562,1422,1565,1422,1568,1422,1571],{},[199,1554,1555],{},"Param",[199,1557,1558],{},"SetParam",[199,1560,1561],{},"Query",[199,1563,1564],{},"QueryValues",[199,1566,1567],{},"QueryAll",[199,1569,1570],{},"RequestHeader",[199,1572,1573],{},"Body",[231,1575,1576,1579],{},[246,1577,1578],{},"Response",[246,1580,1581,1422,1584,1422,1587,1422,1590,1422,1593,1422,1596,1422,1599,1422,1602],{},[199,1582,1583],{},"JSON",[199,1585,1586],{},"Error",[199,1588,1589],{},"Status",[199,1591,1592],{},"SetHeader",[199,1594,1595],{},"NoContent",[199,1597,1598],{},"Redirect",[199,1600,1601],{},"ServeFile",[199,1603,1604],{},"Stream",[231,1606,1607,1610],{},[246,1608,1609],{},"State",[246,1611,1612,1422,1615,1422,1618,1422,1621,1422,1624],{},[199,1613,1614],{},"Written",[199,1616,1617],{},"StatusCode",[199,1619,1620],{},"User",[199,1622,1623],{},"MustUser",[199,1625,1626],{},"SetUser",[192,1628,1630],{"className":194,"code":1629,"language":196,"meta":197,"style":197},"type StreamWriter struct{}\n\nfunc (sw *StreamWriter) WriteEvent(eventType, data string) error\nfunc (sw *StreamWriter) WriteJSON(eventType string, data any) error\nfunc (sw *StreamWriter) Write(data []byte) (int, error)\nfunc (sw *StreamWriter) Flush()\nfunc (sw *StreamWriter) Close() error\n",[199,1631,1632,1642,1646,1681,1714,1754,1774],{"__ignoreMap":197},[202,1633,1634,1636,1639],{"class":204,"line":205},[202,1635,373],{"class":208},[202,1637,1638],{"class":222}," StreamWriter",[202,1640,1641],{"class":208}," struct{}\n",[202,1643,1644],{"class":204,"line":385},[202,1645,438],{"emptyLinePlaceholder":437},[202,1647,1648,1650,1652,1655,1657,1660,1662,1665,1667,1670,1672,1675,1677,1679],{"class":204,"line":428},[202,1649,209],{"class":208},[202,1651,412],{"class":208},[202,1653,1654],{"class":394},"sw ",[202,1656,1394],{"class":208},[202,1658,1659],{"class":222},"StreamWriter",[202,1661,409],{"class":208},[202,1663,1664],{"class":212}," WriteEvent",[202,1666,391],{"class":208},[202,1668,1669],{"class":394},"eventType",[202,1671,418],{"class":208},[202,1673,1674],{"class":394}," data",[202,1676,908],{"class":421},[202,1678,409],{"class":208},[202,1680,867],{"class":421},[202,1682,1683,1685,1687,1689,1691,1693,1695,1698,1700,1702,1704,1706,1708,1710,1712],{"class":204,"line":434},[202,1684,209],{"class":208},[202,1686,412],{"class":208},[202,1688,1654],{"class":394},[202,1690,1394],{"class":208},[202,1692,1659],{"class":222},[202,1694,409],{"class":208},[202,1696,1697],{"class":212}," WriteJSON",[202,1699,391],{"class":208},[202,1701,1669],{"class":394},[202,1703,908],{"class":421},[202,1705,418],{"class":208},[202,1707,1674],{"class":394},[202,1709,862],{"class":222},[202,1711,409],{"class":208},[202,1713,867],{"class":421},[202,1715,1716,1718,1720,1722,1724,1726,1728,1731,1733,1736,1739,1742,1744,1746,1748,1750,1752],{"class":204,"line":441},[202,1717,209],{"class":208},[202,1719,412],{"class":208},[202,1721,1654],{"class":394},[202,1723,1394],{"class":208},[202,1725,1659],{"class":222},[202,1727,409],{"class":208},[202,1729,1730],{"class":212}," Write",[202,1732,391],{"class":208},[202,1734,1735],{"class":394},"data",[202,1737,1738],{"class":208}," []",[202,1740,1741],{"class":421},"byte",[202,1743,409],{"class":208},[202,1745,412],{"class":208},[202,1747,664],{"class":421},[202,1749,418],{"class":208},[202,1751,422],{"class":421},[202,1753,425],{"class":208},[202,1755,1756,1758,1760,1762,1764,1766,1768,1771],{"class":204,"line":593},[202,1757,209],{"class":208},[202,1759,412],{"class":208},[202,1761,1654],{"class":394},[202,1763,1394],{"class":208},[202,1765,1659],{"class":222},[202,1767,409],{"class":208},[202,1769,1770],{"class":212}," Flush",[202,1772,1773],{"class":208},"()\n",[202,1775,1776,1778,1780,1782,1784,1786,1788,1791,1793],{"class":204,"line":601},[202,1777,209],{"class":208},[202,1779,412],{"class":208},[202,1781,1654],{"class":394},[202,1783,1394],{"class":208},[202,1785,1659],{"class":222},[202,1787,409],{"class":208},[202,1789,1790],{"class":212}," Close",[202,1792,216],{"class":208},[202,1794,867],{"class":421},[178,1796,466,1797,403],{},[468,1798,53],{"href":54},[187,1800,63],{"id":1801},"middleware",[192,1803,1805],{"className":194,"code":1804,"language":196,"meta":197,"style":197},"type Middleware func(http.Handler) http.Handler\n\nfunc Logging(logger *slog.Logger) Middleware\nfunc Recovery(logger *slog.Logger) Middleware\nfunc RequestID() Middleware\nfunc CORS(config CORSConfig) Middleware\nfunc DefaultCORSConfig() CORSConfig\n",[199,1806,1807,1832,1836,1863,1886,1897,1916],{"__ignoreMap":197},[202,1808,1809,1811,1814,1817,1819,1821,1823,1825,1828,1830],{"class":204,"line":205},[202,1810,373],{"class":208},[202,1812,1813],{"class":222}," Middleware",[202,1815,1816],{"class":208}," func(",[202,1818,400],{"class":222},[202,1820,403],{"class":208},[202,1822,1191],{"class":222},[202,1824,409],{"class":208},[202,1826,1827],{"class":222}," http",[202,1829,403],{"class":208},[202,1831,575],{"class":222},[202,1833,1834],{"class":204,"line":385},[202,1835,438],{"emptyLinePlaceholder":437},[202,1837,1838,1840,1843,1845,1848,1850,1853,1855,1858,1860],{"class":204,"line":428},[202,1839,209],{"class":208},[202,1841,1842],{"class":212}," Logging",[202,1844,391],{"class":208},[202,1846,1847],{"class":394},"logger",[202,1849,219],{"class":208},[202,1851,1852],{"class":222},"slog",[202,1854,403],{"class":208},[202,1856,1857],{"class":222},"Logger",[202,1859,409],{"class":208},[202,1861,1862],{"class":222}," Middleware\n",[202,1864,1865,1867,1870,1872,1874,1876,1878,1880,1882,1884],{"class":204,"line":434},[202,1866,209],{"class":208},[202,1868,1869],{"class":212}," Recovery",[202,1871,391],{"class":208},[202,1873,1847],{"class":394},[202,1875,219],{"class":208},[202,1877,1852],{"class":222},[202,1879,403],{"class":208},[202,1881,1857],{"class":222},[202,1883,409],{"class":208},[202,1885,1862],{"class":222},[202,1887,1888,1890,1893,1895],{"class":204,"line":441},[202,1889,209],{"class":208},[202,1891,1892],{"class":212}," RequestID",[202,1894,216],{"class":208},[202,1896,1862],{"class":222},[202,1898,1899,1901,1904,1906,1909,1912,1914],{"class":204,"line":593},[202,1900,209],{"class":208},[202,1902,1903],{"class":212}," CORS",[202,1905,391],{"class":208},[202,1907,1908],{"class":394},"config",[202,1910,1911],{"class":222}," CORSConfig",[202,1913,409],{"class":208},[202,1915,1862],{"class":222},[202,1917,1918,1920,1923,1925],{"class":204,"line":601},[202,1919,209],{"class":208},[202,1921,1922],{"class":212}," DefaultCORSConfig",[202,1924,216],{"class":208},[202,1926,1927],{"class":222}," CORSConfig\n",[192,1929,1931],{"className":194,"code":1930,"language":196,"meta":197,"style":197},"type CORSConfig struct {\n    AllowedOrigins   []string\n    AllowedMethods   []string\n    AllowedHeaders   []string\n    AllowCredentials bool\n    MaxAge           int\n}\n",[199,1932,1933,1943,1952,1961,1970,1977,1984],{"__ignoreMap":197},[202,1934,1935,1937,1939,1941],{"class":204,"line":205},[202,1936,373],{"class":208},[202,1938,1911],{"class":222},[202,1940,547],{"class":208},[202,1942,382],{"class":208},[202,1944,1945,1948,1950],{"class":204,"line":385},[202,1946,1947],{"class":554},"    AllowedOrigins   ",[202,1949,607],{"class":208},[202,1951,563],{"class":421},[202,1953,1954,1957,1959],{"class":204,"line":428},[202,1955,1956],{"class":554},"    AllowedMethods   ",[202,1958,607],{"class":208},[202,1960,563],{"class":421},[202,1962,1963,1966,1968],{"class":204,"line":434},[202,1964,1965],{"class":554},"    AllowedHeaders   ",[202,1967,607],{"class":208},[202,1969,563],{"class":421},[202,1971,1972,1975],{"class":204,"line":441},[202,1973,1974],{"class":554},"    AllowCredentials ",[202,1976,626],{"class":421},[202,1978,1979,1982],{"class":204,"line":593},[202,1980,1981],{"class":554},"    MaxAge           ",[202,1983,1331],{"class":421},[202,1985,1986],{"class":204,"line":601},[202,1987,431],{"class":208},[178,1989,466,1990,403],{},[468,1991,63],{"href":64},[187,1993,1995],{"id":1994},"testing-helpers","Testing helpers",[192,1997,1999],{"className":194,"code":1998,"language":196,"meta":197,"style":197},"func NewTestApp() *TestApp\nfunc NewTestContext(w http.ResponseWriter, r *http.Request) *Context\nfunc MockHandler[Req, Resp any](fn func(*Context, Req) (Resp, error)) *Handler[Req, Resp]\nfunc WithJWT(token string) map[string]string\nfunc WithHeaders(headers map[string]string) map[string]string\nfunc WithContentType(contentType string) map[string]string\n",[199,2000,2001,2015,2053,2108,2134,2164],{"__ignoreMap":197},[202,2002,2003,2005,2008,2010,2012],{"class":204,"line":205},[202,2004,209],{"class":208},[202,2006,2007],{"class":212}," NewTestApp",[202,2009,216],{"class":208},[202,2011,219],{"class":208},[202,2013,2014],{"class":222},"TestApp\n",[202,2016,2017,2019,2022,2024,2027,2029,2031,2034,2036,2039,2041,2043,2045,2047,2049,2051],{"class":204,"line":385},[202,2018,209],{"class":208},[202,2020,2021],{"class":212}," NewTestContext",[202,2023,391],{"class":208},[202,2025,2026],{"class":394},"w",[202,2028,1827],{"class":222},[202,2030,403],{"class":208},[202,2032,2033],{"class":222},"ResponseWriter",[202,2035,418],{"class":208},[202,2037,2038],{"class":394}," r",[202,2040,219],{"class":208},[202,2042,400],{"class":222},[202,2044,403],{"class":208},[202,2046,406],{"class":222},[202,2048,409],{"class":208},[202,2050,219],{"class":208},[202,2052,1470],{"class":222},[202,2054,2055,2057,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106],{"class":204,"line":428},[202,2056,209],{"class":208},[202,2058,2059],{"class":212}," MockHandler",[202,2061,1146],{"class":208},[202,2063,1149],{"class":394},[202,2065,418],{"class":208},[202,2067,1154],{"class":394},[202,2069,862],{"class":222},[202,2071,1159],{"class":208},[202,2073,1162],{"class":394},[202,2075,1165],{"class":208},[202,2077,53],{"class":222},[202,2079,418],{"class":208},[202,2081,1172],{"class":222},[202,2083,409],{"class":208},[202,2085,412],{"class":208},[202,2087,1179],{"class":222},[202,2089,418],{"class":208},[202,2091,422],{"class":421},[202,2093,1186],{"class":208},[202,2095,219],{"class":208},[202,2097,1191],{"class":222},[202,2099,1146],{"class":208},[202,2101,1149],{"class":222},[202,2103,418],{"class":208},[202,2105,1154],{"class":222},[202,2107,1202],{"class":208},[202,2109,2110,2112,2115,2117,2120,2122,2124,2127,2130,2132],{"class":204,"line":434},[202,2111,209],{"class":208},[202,2113,2114],{"class":212}," WithJWT",[202,2116,391],{"class":208},[202,2118,2119],{"class":394},"token",[202,2121,908],{"class":421},[202,2123,409],{"class":208},[202,2125,2126],{"class":208}," map[",[202,2128,2129],{"class":421},"string",[202,2131,667],{"class":208},[202,2133,563],{"class":421},[202,2135,2136,2138,2141,2143,2146,2148,2150,2152,2154,2156,2158,2160,2162],{"class":204,"line":441},[202,2137,209],{"class":208},[202,2139,2140],{"class":212}," WithHeaders",[202,2142,391],{"class":208},[202,2144,2145],{"class":394},"headers",[202,2147,2126],{"class":208},[202,2149,2129],{"class":421},[202,2151,667],{"class":208},[202,2153,2129],{"class":421},[202,2155,409],{"class":208},[202,2157,2126],{"class":208},[202,2159,2129],{"class":421},[202,2161,667],{"class":208},[202,2163,563],{"class":421},[202,2165,2166,2168,2171,2173,2176,2178,2180,2182,2184,2186],{"class":204,"line":593},[202,2167,209],{"class":208},[202,2169,2170],{"class":212}," WithContentType",[202,2172,391],{"class":208},[202,2174,2175],{"class":394},"contentType",[202,2177,908],{"class":421},[202,2179,409],{"class":208},[202,2181,2126],{"class":208},[202,2183,2129],{"class":421},[202,2185,667],{"class":208},[202,2187,563],{"class":421},[178,2189,2190,2193,2194,1422,2196,1422,2199,1422,2202,1422,2205,1422,2208,1422,2211,2213,2214,2193,2217,1422,2219,1422,2222,1422,2225,1422,2227,1422,2230,1422,2233,1422,2236,403],{},[199,2191,2192],{},"*TestApp",": ",[199,2195,190],{},[199,2197,2198],{},"GET",[199,2200,2201],{},"POST",[199,2203,2204],{},"PUT",[199,2206,2207],{},"PATCH",[199,2209,2210],{},"DELETE",[199,2212,406],{},".\n",[199,2215,2216],{},"*TestResponse",[199,2218,1617],{},[199,2220,2221],{},"Header",[199,2223,2224],{},"BodyString",[199,2226,1583],{},[199,2228,2229],{},"AssertStatus",[199,2231,2232],{},"AssertHeader",[199,2234,2235],{},"AssertBodyContains",[199,2237,2238],{},"AssertJSON",[178,2240,466,2241,403],{},[468,2242,147],{"href":148},[182,2244,2246],{"id":2245},"package-ezzbinding","Package ezz\u002Fbinding",[192,2248,2250],{"className":194,"code":2249,"language":196,"meta":197,"style":197},"func Bind(r *http.Request, target any) error\nfunc BindJSON(r *http.Request, target any) error\nfunc BindQuery(values url.Values, target any) error\nfunc BindPath(r *http.Request, target any) error\nfunc Validate(target any) error\n\nfunc NewBinder(typ reflect.Type) *Binder\nfunc (b *Binder) Bind(r *http.Request, target any) error\n\nfunc NewValidator(typ reflect.Type) *Validator\nfunc (v *Validator) Validate(target any) error\n\ntype ValidationError struct {\n    Field   string\n    Tag     string\n    Value   any\n    Message string\n}\n\ntype ValidationErrors []ValidationError\n",[199,2251,2252,2282,2311,2341,2370,2388,2392,2418,2458,2462,2486,2514,2518,2529,2536,2543,2550,2557,2561,2565],{"__ignoreMap":197},[202,2253,2254,2256,2259,2261,2263,2265,2267,2269,2271,2273,2276,2278,2280],{"class":204,"line":205},[202,2255,209],{"class":208},[202,2257,2258],{"class":212}," Bind",[202,2260,391],{"class":208},[202,2262,395],{"class":394},[202,2264,219],{"class":208},[202,2266,400],{"class":222},[202,2268,403],{"class":208},[202,2270,406],{"class":222},[202,2272,418],{"class":208},[202,2274,2275],{"class":394}," target",[202,2277,862],{"class":222},[202,2279,409],{"class":208},[202,2281,867],{"class":421},[202,2283,2284,2286,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309],{"class":204,"line":385},[202,2285,209],{"class":208},[202,2287,2288],{"class":212}," BindJSON",[202,2290,391],{"class":208},[202,2292,395],{"class":394},[202,2294,219],{"class":208},[202,2296,400],{"class":222},[202,2298,403],{"class":208},[202,2300,406],{"class":222},[202,2302,418],{"class":208},[202,2304,2275],{"class":394},[202,2306,862],{"class":222},[202,2308,409],{"class":208},[202,2310,867],{"class":421},[202,2312,2313,2315,2318,2320,2323,2326,2328,2331,2333,2335,2337,2339],{"class":204,"line":428},[202,2314,209],{"class":208},[202,2316,2317],{"class":212}," BindQuery",[202,2319,391],{"class":208},[202,2321,2322],{"class":394},"values",[202,2324,2325],{"class":222}," url",[202,2327,403],{"class":208},[202,2329,2330],{"class":222},"Values",[202,2332,418],{"class":208},[202,2334,2275],{"class":394},[202,2336,862],{"class":222},[202,2338,409],{"class":208},[202,2340,867],{"class":421},[202,2342,2343,2345,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368],{"class":204,"line":434},[202,2344,209],{"class":208},[202,2346,2347],{"class":212}," BindPath",[202,2349,391],{"class":208},[202,2351,395],{"class":394},[202,2353,219],{"class":208},[202,2355,400],{"class":222},[202,2357,403],{"class":208},[202,2359,406],{"class":222},[202,2361,418],{"class":208},[202,2363,2275],{"class":394},[202,2365,862],{"class":222},[202,2367,409],{"class":208},[202,2369,867],{"class":421},[202,2371,2372,2374,2377,2379,2382,2384,2386],{"class":204,"line":441},[202,2373,209],{"class":208},[202,2375,2376],{"class":212}," Validate",[202,2378,391],{"class":208},[202,2380,2381],{"class":394},"target",[202,2383,862],{"class":222},[202,2385,409],{"class":208},[202,2387,867],{"class":421},[202,2389,2390],{"class":204,"line":593},[202,2391,438],{"emptyLinePlaceholder":437},[202,2393,2394,2396,2399,2401,2404,2406,2408,2411,2413,2415],{"class":204,"line":601},[202,2395,209],{"class":208},[202,2397,2398],{"class":212}," NewBinder",[202,2400,391],{"class":208},[202,2402,2403],{"class":394},"typ",[202,2405,1279],{"class":222},[202,2407,403],{"class":208},[202,2409,2410],{"class":222},"Type",[202,2412,409],{"class":208},[202,2414,219],{"class":208},[202,2416,2417],{"class":222},"Binder\n",[202,2419,2420,2422,2424,2427,2429,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456],{"class":204,"line":612},[202,2421,209],{"class":208},[202,2423,412],{"class":208},[202,2425,2426],{"class":394},"b ",[202,2428,1394],{"class":208},[202,2430,2431],{"class":222},"Binder",[202,2433,409],{"class":208},[202,2435,2258],{"class":212},[202,2437,391],{"class":208},[202,2439,395],{"class":394},[202,2441,219],{"class":208},[202,2443,400],{"class":222},[202,2445,403],{"class":208},[202,2447,406],{"class":222},[202,2449,418],{"class":208},[202,2451,2275],{"class":394},[202,2453,862],{"class":222},[202,2455,409],{"class":208},[202,2457,867],{"class":421},[202,2459,2460],{"class":204,"line":620},[202,2461,438],{"emptyLinePlaceholder":437},[202,2463,2464,2466,2469,2471,2473,2475,2477,2479,2481,2483],{"class":204,"line":629},[202,2465,209],{"class":208},[202,2467,2468],{"class":212}," NewValidator",[202,2470,391],{"class":208},[202,2472,2403],{"class":394},[202,2474,1279],{"class":222},[202,2476,403],{"class":208},[202,2478,2410],{"class":222},[202,2480,409],{"class":208},[202,2482,219],{"class":208},[202,2484,2485],{"class":222},"Validator\n",[202,2487,2488,2490,2492,2495,2497,2500,2502,2504,2506,2508,2510,2512],{"class":204,"line":643},[202,2489,209],{"class":208},[202,2491,412],{"class":208},[202,2493,2494],{"class":394},"v ",[202,2496,1394],{"class":208},[202,2498,2499],{"class":222},"Validator",[202,2501,409],{"class":208},[202,2503,2376],{"class":212},[202,2505,391],{"class":208},[202,2507,2381],{"class":394},[202,2509,862],{"class":222},[202,2511,409],{"class":208},[202,2513,867],{"class":421},[202,2515,2516],{"class":204,"line":655},[202,2517,438],{"emptyLinePlaceholder":437},[202,2519,2520,2522,2525,2527],{"class":204,"line":673},[202,2521,373],{"class":208},[202,2523,2524],{"class":222}," ValidationError",[202,2526,547],{"class":208},[202,2528,382],{"class":208},[202,2530,2531,2534],{"class":204,"line":678},[202,2532,2533],{"class":554},"    Field   ",[202,2535,563],{"class":421},[202,2537,2538,2541],{"class":204,"line":683},[202,2539,2540],{"class":554},"    Tag     ",[202,2542,563],{"class":421},[202,2544,2545,2548],{"class":204,"line":695},[202,2546,2547],{"class":554},"    Value   ",[202,2549,721],{"class":222},[202,2551,2552,2555],{"class":204,"line":703},[202,2553,2554],{"class":554},"    Message ",[202,2556,563],{"class":421},[202,2558,2559],{"class":204,"line":715},[202,2560,431],{"class":208},[202,2562,2563],{"class":204,"line":724},[202,2564,438],{"emptyLinePlaceholder":437},[202,2566,2568,2570,2573,2575],{"class":204,"line":2567},20,[202,2569,373],{"class":208},[202,2571,2572],{"class":222}," ValidationErrors",[202,2574,1738],{"class":208},[202,2576,2577],{"class":222},"ValidationError\n",[178,2579,2580,2581,1422,2584,1422,2587,1422,2590,1422,2593,1422,2596,1422,2599,1422,2602,1422,2605,1439,2608,470,2611,403],{},"Tags: ",[199,2582,2583],{},"path",[199,2585,2586],{},"query",[199,2588,2589],{},"header",[199,2591,2592],{},"form",[199,2594,2595],{},"json",[199,2597,2598],{},"default",[199,2600,2601],{},"validate",[199,2603,2604],{},"description",[199,2606,2607],{},"example",[468,2609,2610],{"href":44},"Request binding",[468,2612,48],{"href":49},[182,2614,2616],{"id":2615},"package-ezzmiddleware","Package ezz\u002Fmiddleware",[192,2618,2620],{"className":194,"code":2619,"language":196,"meta":197,"style":197},"func Gzip(config ...CompressionConfig) ezz.Middleware\nfunc DecompressionMiddleware() ezz.Middleware\nfunc DefaultCompressionConfig() CompressionConfig\n\ntype CompressionConfig struct {\n    Level     int\n    MinLength int\n    MIMETypes map[string]bool\n}\n",[199,2621,2622,2649,2664,2676,2680,2691,2698,2705,2718],{"__ignoreMap":197},[202,2623,2624,2626,2629,2631,2633,2636,2639,2641,2644,2646],{"class":204,"line":205},[202,2625,209],{"class":208},[202,2627,2628],{"class":212}," Gzip",[202,2630,391],{"class":208},[202,2632,1908],{"class":394},[202,2634,2635],{"class":208}," ...",[202,2637,2638],{"class":222},"CompressionConfig",[202,2640,409],{"class":208},[202,2642,2643],{"class":222}," ezz",[202,2645,403],{"class":208},[202,2647,2648],{"class":222},"Middleware\n",[202,2650,2651,2653,2656,2658,2660,2662],{"class":204,"line":385},[202,2652,209],{"class":208},[202,2654,2655],{"class":212}," DecompressionMiddleware",[202,2657,216],{"class":208},[202,2659,2643],{"class":222},[202,2661,403],{"class":208},[202,2663,2648],{"class":222},[202,2665,2666,2668,2671,2673],{"class":204,"line":428},[202,2667,209],{"class":208},[202,2669,2670],{"class":212}," DefaultCompressionConfig",[202,2672,216],{"class":208},[202,2674,2675],{"class":222}," CompressionConfig\n",[202,2677,2678],{"class":204,"line":434},[202,2679,438],{"emptyLinePlaceholder":437},[202,2681,2682,2684,2687,2689],{"class":204,"line":441},[202,2683,373],{"class":208},[202,2685,2686],{"class":222}," CompressionConfig",[202,2688,547],{"class":208},[202,2690,382],{"class":208},[202,2692,2693,2696],{"class":204,"line":593},[202,2694,2695],{"class":554},"    Level     ",[202,2697,1331],{"class":421},[202,2699,2700,2703],{"class":204,"line":601},[202,2701,2702],{"class":554},"    MinLength ",[202,2704,1331],{"class":421},[202,2706,2707,2710,2712,2714,2716],{"class":204,"line":612},[202,2708,2709],{"class":554},"    MIMETypes ",[202,2711,661],{"class":208},[202,2713,2129],{"class":421},[202,2715,667],{"class":208},[202,2717,626],{"class":421},[202,2719,2720],{"class":204,"line":620},[202,2721,431],{"class":208},[192,2723,2725],{"className":194,"code":2724,"language":196,"meta":197,"style":197},"type RateLimiter interface {\n    Allow(key string) bool\n    Reset(key string)\n}\n\nfunc NewBucketLimiter(capacity int, rate time.Duration) *BucketLimiter\nfunc NewMemoryLimiter(capacity int, rate, cleanup time.Duration) *MemoryLimiter\n\nfunc RateLimitMiddleware(limiter RateLimiter, keyFunc func(*http.Request) string) ezz.Middleware\nfunc IPRateLimit(requestsPerMinute int) ezz.Middleware\nfunc UserRateLimitMiddleware(requestsPerMinute int, userIDFunc func(*http.Request) string) ezz.Middleware\nfunc APIKeyRateLimitMiddleware(requestsPerMinute int) ezz.Middleware\nfunc CustomRateLimitMiddleware(capacity int, refillRate time.Duration, keyFunc func(*http.Request) string) ezz.Middleware\n",[199,2726,2727,2738,2754,2767,2771,2775,2809,2844,2848,2887,2909,2947,2968],{"__ignoreMap":197},[202,2728,2729,2731,2734,2736],{"class":204,"line":205},[202,2730,373],{"class":208},[202,2732,2733],{"class":222}," RateLimiter",[202,2735,379],{"class":208},[202,2737,382],{"class":208},[202,2739,2740,2743,2745,2748,2750,2752],{"class":204,"line":385},[202,2741,2742],{"class":212},"    Allow",[202,2744,391],{"class":208},[202,2746,2747],{"class":394},"key",[202,2749,908],{"class":421},[202,2751,409],{"class":208},[202,2753,877],{"class":421},[202,2755,2756,2759,2761,2763,2765],{"class":204,"line":428},[202,2757,2758],{"class":212},"    Reset",[202,2760,391],{"class":208},[202,2762,2747],{"class":394},[202,2764,908],{"class":421},[202,2766,425],{"class":208},[202,2768,2769],{"class":204,"line":434},[202,2770,431],{"class":208},[202,2772,2773],{"class":204,"line":441},[202,2774,438],{"emptyLinePlaceholder":437},[202,2776,2777,2779,2782,2784,2787,2789,2791,2794,2797,2799,2802,2804,2806],{"class":204,"line":593},[202,2778,209],{"class":208},[202,2780,2781],{"class":212}," NewBucketLimiter",[202,2783,391],{"class":208},[202,2785,2786],{"class":394},"capacity",[202,2788,1368],{"class":421},[202,2790,418],{"class":208},[202,2792,2793],{"class":394}," rate",[202,2795,2796],{"class":222}," time",[202,2798,403],{"class":208},[202,2800,2801],{"class":222},"Duration",[202,2803,409],{"class":208},[202,2805,219],{"class":208},[202,2807,2808],{"class":222},"BucketLimiter\n",[202,2810,2811,2813,2816,2818,2820,2822,2824,2826,2828,2831,2833,2835,2837,2839,2841],{"class":204,"line":601},[202,2812,209],{"class":208},[202,2814,2815],{"class":212}," NewMemoryLimiter",[202,2817,391],{"class":208},[202,2819,2786],{"class":394},[202,2821,1368],{"class":421},[202,2823,418],{"class":208},[202,2825,2793],{"class":394},[202,2827,418],{"class":208},[202,2829,2830],{"class":394}," cleanup",[202,2832,2796],{"class":222},[202,2834,403],{"class":208},[202,2836,2801],{"class":222},[202,2838,409],{"class":208},[202,2840,219],{"class":208},[202,2842,2843],{"class":222},"MemoryLimiter\n",[202,2845,2846],{"class":204,"line":612},[202,2847,438],{"emptyLinePlaceholder":437},[202,2849,2850,2852,2855,2857,2860,2862,2864,2867,2869,2871,2873,2875,2877,2879,2881,2883,2885],{"class":204,"line":620},[202,2851,209],{"class":208},[202,2853,2854],{"class":212}," RateLimitMiddleware",[202,2856,391],{"class":208},[202,2858,2859],{"class":394},"limiter",[202,2861,2733],{"class":222},[202,2863,418],{"class":208},[202,2865,2866],{"class":394}," keyFunc",[202,2868,1165],{"class":208},[202,2870,400],{"class":222},[202,2872,403],{"class":208},[202,2874,406],{"class":222},[202,2876,409],{"class":208},[202,2878,908],{"class":421},[202,2880,409],{"class":208},[202,2882,2643],{"class":222},[202,2884,403],{"class":208},[202,2886,2648],{"class":222},[202,2888,2889,2891,2894,2896,2899,2901,2903,2905,2907],{"class":204,"line":629},[202,2890,209],{"class":208},[202,2892,2893],{"class":212}," IPRateLimit",[202,2895,391],{"class":208},[202,2897,2898],{"class":394},"requestsPerMinute",[202,2900,1368],{"class":421},[202,2902,409],{"class":208},[202,2904,2643],{"class":222},[202,2906,403],{"class":208},[202,2908,2648],{"class":222},[202,2910,2911,2913,2916,2918,2920,2922,2924,2927,2929,2931,2933,2935,2937,2939,2941,2943,2945],{"class":204,"line":643},[202,2912,209],{"class":208},[202,2914,2915],{"class":212}," UserRateLimitMiddleware",[202,2917,391],{"class":208},[202,2919,2898],{"class":394},[202,2921,1368],{"class":421},[202,2923,418],{"class":208},[202,2925,2926],{"class":394}," userIDFunc",[202,2928,1165],{"class":208},[202,2930,400],{"class":222},[202,2932,403],{"class":208},[202,2934,406],{"class":222},[202,2936,409],{"class":208},[202,2938,908],{"class":421},[202,2940,409],{"class":208},[202,2942,2643],{"class":222},[202,2944,403],{"class":208},[202,2946,2648],{"class":222},[202,2948,2949,2951,2954,2956,2958,2960,2962,2964,2966],{"class":204,"line":655},[202,2950,209],{"class":208},[202,2952,2953],{"class":212}," APIKeyRateLimitMiddleware",[202,2955,391],{"class":208},[202,2957,2898],{"class":394},[202,2959,1368],{"class":421},[202,2961,409],{"class":208},[202,2963,2643],{"class":222},[202,2965,403],{"class":208},[202,2967,2648],{"class":222},[202,2969,2970,2972,2975,2977,2979,2981,2983,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014],{"class":204,"line":673},[202,2971,209],{"class":208},[202,2973,2974],{"class":212}," CustomRateLimitMiddleware",[202,2976,391],{"class":208},[202,2978,2786],{"class":394},[202,2980,1368],{"class":421},[202,2982,418],{"class":208},[202,2984,2985],{"class":394}," refillRate",[202,2987,2796],{"class":222},[202,2989,403],{"class":208},[202,2991,2801],{"class":222},[202,2993,418],{"class":208},[202,2995,2866],{"class":394},[202,2997,1165],{"class":208},[202,2999,400],{"class":222},[202,3001,403],{"class":208},[202,3003,406],{"class":222},[202,3005,409],{"class":208},[202,3007,908],{"class":421},[202,3009,409],{"class":208},[202,3011,2643],{"class":222},[202,3013,403],{"class":208},[202,3015,2648],{"class":222},[178,3017,466,3018,403],{},[468,3019,63],{"href":64},[182,3021,3023],{"id":3022},"package-ezzopenapi","Package ezz\u002Fopenapi",[192,3025,3027],{"className":194,"code":3026,"language":196,"meta":197,"style":197},"func NewGenerator() *Generator\nfunc (g *Generator) GenerateFromApp(app *ezz.App) *Spec\nfunc MustJSON(spec *Spec) string\n\nfunc ServeScalar(app *ezz.App, specPath, docsPath string, config ...ScalarConfig)\nfunc SetupDocsEndpoints(app *ezz.App, config ...ScalarConfig)\nfunc DefaultScalarConfig() ScalarConfig\nfunc AddSecurityScheme(generator *Generator, name string, scheme SecurityScheme)\nfunc ApplyScalarOptions(config *ScalarConfig, options ...func(*ScalarConfig))\nfunc WithCustomTheme(theme string) func(*ScalarConfig)\nfunc WithDarkMode(enabled bool) func(*ScalarConfig)\nfunc WithLayout(layout string) func(*ScalarConfig)\n",[199,3028,3029,3043,3082,3104,3108,3151,3180,3192,3225,3253,3275,3297],{"__ignoreMap":197},[202,3030,3031,3033,3036,3038,3040],{"class":204,"line":205},[202,3032,209],{"class":208},[202,3034,3035],{"class":212}," NewGenerator",[202,3037,216],{"class":208},[202,3039,219],{"class":208},[202,3041,3042],{"class":222},"Generator\n",[202,3044,3045,3047,3049,3052,3054,3057,3059,3062,3064,3066,3068,3071,3073,3075,3077,3079],{"class":204,"line":385},[202,3046,209],{"class":208},[202,3048,412],{"class":208},[202,3050,3051],{"class":394},"g ",[202,3053,1394],{"class":208},[202,3055,3056],{"class":222},"Generator",[202,3058,409],{"class":208},[202,3060,3061],{"class":212}," GenerateFromApp",[202,3063,391],{"class":208},[202,3065,189],{"class":394},[202,3067,219],{"class":208},[202,3069,3070],{"class":222},"ezz",[202,3072,403],{"class":208},[202,3074,190],{"class":222},[202,3076,409],{"class":208},[202,3078,219],{"class":208},[202,3080,3081],{"class":222},"Spec\n",[202,3083,3084,3086,3089,3091,3094,3096,3099,3101],{"class":204,"line":428},[202,3085,209],{"class":208},[202,3087,3088],{"class":212}," MustJSON",[202,3090,391],{"class":208},[202,3092,3093],{"class":394},"spec",[202,3095,219],{"class":208},[202,3097,3098],{"class":222},"Spec",[202,3100,409],{"class":208},[202,3102,3103],{"class":421}," string\n",[202,3105,3106],{"class":204,"line":434},[202,3107,438],{"emptyLinePlaceholder":437},[202,3109,3110,3112,3115,3117,3119,3121,3123,3125,3127,3129,3132,3134,3137,3139,3141,3144,3146,3149],{"class":204,"line":441},[202,3111,209],{"class":208},[202,3113,3114],{"class":212}," ServeScalar",[202,3116,391],{"class":208},[202,3118,189],{"class":394},[202,3120,219],{"class":208},[202,3122,3070],{"class":222},[202,3124,403],{"class":208},[202,3126,190],{"class":222},[202,3128,418],{"class":208},[202,3130,3131],{"class":394}," specPath",[202,3133,418],{"class":208},[202,3135,3136],{"class":394}," docsPath",[202,3138,908],{"class":421},[202,3140,418],{"class":208},[202,3142,3143],{"class":394}," config",[202,3145,2635],{"class":208},[202,3147,3148],{"class":222},"ScalarConfig",[202,3150,425],{"class":208},[202,3152,3153,3155,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178],{"class":204,"line":593},[202,3154,209],{"class":208},[202,3156,3157],{"class":212}," SetupDocsEndpoints",[202,3159,391],{"class":208},[202,3161,189],{"class":394},[202,3163,219],{"class":208},[202,3165,3070],{"class":222},[202,3167,403],{"class":208},[202,3169,190],{"class":222},[202,3171,418],{"class":208},[202,3173,3143],{"class":394},[202,3175,2635],{"class":208},[202,3177,3148],{"class":222},[202,3179,425],{"class":208},[202,3181,3182,3184,3187,3189],{"class":204,"line":601},[202,3183,209],{"class":208},[202,3185,3186],{"class":212}," DefaultScalarConfig",[202,3188,216],{"class":208},[202,3190,3191],{"class":222}," ScalarConfig\n",[202,3193,3194,3196,3199,3201,3204,3206,3208,3210,3213,3215,3217,3220,3223],{"class":204,"line":612},[202,3195,209],{"class":208},[202,3197,3198],{"class":212}," AddSecurityScheme",[202,3200,391],{"class":208},[202,3202,3203],{"class":394},"generator",[202,3205,219],{"class":208},[202,3207,3056],{"class":222},[202,3209,418],{"class":208},[202,3211,3212],{"class":394}," name",[202,3214,908],{"class":421},[202,3216,418],{"class":208},[202,3218,3219],{"class":394}," scheme",[202,3221,3222],{"class":222}," SecurityScheme",[202,3224,425],{"class":208},[202,3226,3227,3229,3232,3234,3236,3238,3240,3242,3245,3248,3250],{"class":204,"line":620},[202,3228,209],{"class":208},[202,3230,3231],{"class":212}," ApplyScalarOptions",[202,3233,391],{"class":208},[202,3235,1908],{"class":394},[202,3237,219],{"class":208},[202,3239,3148],{"class":222},[202,3241,418],{"class":208},[202,3243,3244],{"class":394}," options",[202,3246,3247],{"class":208}," ...func(*",[202,3249,3148],{"class":222},[202,3251,3252],{"class":208},"))\n",[202,3254,3255,3257,3260,3262,3265,3267,3269,3271,3273],{"class":204,"line":629},[202,3256,209],{"class":208},[202,3258,3259],{"class":212}," WithCustomTheme",[202,3261,391],{"class":208},[202,3263,3264],{"class":394},"theme",[202,3266,908],{"class":421},[202,3268,409],{"class":208},[202,3270,1165],{"class":208},[202,3272,3148],{"class":222},[202,3274,425],{"class":208},[202,3276,3277,3279,3282,3284,3287,3289,3291,3293,3295],{"class":204,"line":643},[202,3278,209],{"class":208},[202,3280,3281],{"class":212}," WithDarkMode",[202,3283,391],{"class":208},[202,3285,3286],{"class":394},"enabled",[202,3288,913],{"class":421},[202,3290,409],{"class":208},[202,3292,1165],{"class":208},[202,3294,3148],{"class":222},[202,3296,425],{"class":208},[202,3298,3299,3301,3304,3306,3309,3311,3313,3315,3317],{"class":204,"line":655},[202,3300,209],{"class":208},[202,3302,3303],{"class":212}," WithLayout",[202,3305,391],{"class":208},[202,3307,3308],{"class":394},"layout",[202,3310,908],{"class":421},[202,3312,409],{"class":208},[202,3314,1165],{"class":208},[202,3316,3148],{"class":222},[202,3318,425],{"class":208},[178,3320,3321,3322,1422,3324,1422,3327,1422,3330,1422,3333,1422,3336,1422,3339,1422,3342,1422,3345,1422,3348,1422,3351,1422,3353,1422,3355,1422,3358,1422,3361,1422,3364,1422,3367,1422,3370,1422,3373,1422,3376,403],{},"Spec types: ",[199,3323,3098],{},[199,3325,3326],{},"Info",[199,3328,3329],{},"Contact",[199,3331,3332],{},"License",[199,3334,3335],{},"Server",[199,3337,3338],{},"ServerVariable",[199,3340,3341],{},"PathItem",[199,3343,3344],{},"Operation",[199,3346,3347],{},"Parameter",[199,3349,3350],{},"RequestBody",[199,3352,1578],{},[199,3354,2221],{},[199,3356,3357],{},"MediaType",[199,3359,3360],{},"ExampleValue",[199,3362,3363],{},"Schema",[199,3365,3366],{},"Components",[199,3368,3369],{},"SecurityScheme",[199,3371,3372],{},"OAuthFlows",[199,3374,3375],{},"OAuthFlow",[199,3377,3378],{},"SecurityRequirement",[192,3380,3382],{"className":194,"code":3381,"language":196,"meta":197,"style":197},"type ScalarConfig struct {\n    Title       string\n    Theme       string\n    Layout      string\n    DarkMode    bool\n    HideModels  bool\n    ShowSidebar bool\n    CustomCSS   string\n    FavIcon     string\n}\n",[199,3383,3384,3395,3402,3409,3416,3423,3430,3437,3444,3451],{"__ignoreMap":197},[202,3385,3386,3388,3391,3393],{"class":204,"line":205},[202,3387,373],{"class":208},[202,3389,3390],{"class":222}," ScalarConfig",[202,3392,547],{"class":208},[202,3394,382],{"class":208},[202,3396,3397,3400],{"class":204,"line":385},[202,3398,3399],{"class":554},"    Title       ",[202,3401,563],{"class":421},[202,3403,3404,3407],{"class":204,"line":428},[202,3405,3406],{"class":554},"    Theme       ",[202,3408,563],{"class":421},[202,3410,3411,3414],{"class":204,"line":434},[202,3412,3413],{"class":554},"    Layout      ",[202,3415,563],{"class":421},[202,3417,3418,3421],{"class":204,"line":441},[202,3419,3420],{"class":554},"    DarkMode    ",[202,3422,626],{"class":421},[202,3424,3425,3428],{"class":204,"line":593},[202,3426,3427],{"class":554},"    HideModels  ",[202,3429,626],{"class":421},[202,3431,3432,3435],{"class":204,"line":601},[202,3433,3434],{"class":554},"    ShowSidebar ",[202,3436,626],{"class":421},[202,3438,3439,3442],{"class":204,"line":612},[202,3440,3441],{"class":554},"    CustomCSS   ",[202,3443,563],{"class":421},[202,3445,3446,3449],{"class":204,"line":620},[202,3447,3448],{"class":554},"    FavIcon     ",[202,3450,563],{"class":421},[202,3452,3453],{"class":204,"line":629},[202,3454,431],{"class":208},[178,3456,466,3457,470,3459,403],{},[468,3458,131],{"href":132},[468,3460,136],{"href":137},[182,3462,3464],{"id":3463},"package-ezzauth","Package ezz\u002Fauth",[187,3466,3468],{"id":3467},"providers-and-claims","Providers and claims",[192,3470,3472],{"className":194,"code":3471,"language":196,"meta":197,"style":197},"type JWTProvider interface {\n    ValidateToken(token string) (*Claims, error)\n    GenerateToken(claims *Claims) (string, error)\n}\n\ntype Claims struct {\n    Subject, Issuer, Audience, ID string\n    ExpiresAt, IssuedAt, NotBefore int64\n    Custom map[string]any\n}\n\nfunc (c *Claims) Valid() error\n\nfunc NewHMACProvider(secret, issuer string) *HMACProvider\nfunc NewGoTrueProvider(serverURL, jwtSecret string) *GoTrueProvider\nfunc (g *GoTrueProvider) GetUser(token string) (*GoTrueUser, error)\n\nfunc NewJWTAuthProvider(provider JWTProvider) *JWTAuthProvider\nfunc (p *JWTAuthProvider) WithResolver(AuthorizationResolver) *JWTAuthProvider\nfunc (p *JWTAuthProvider) WithAuditLogger(AuditLogger) *JWTAuthProvider\nfunc (p *JWTAuthProvider) Authenticate(r *http.Request) (any, error)\n",[199,3473,3474,3485,3510,3536,3540,3544,3555,3577,3595,3608,3612,3616,3638,3642,3668,3694,3731,3735,3756,3786,3814],{"__ignoreMap":197},[202,3475,3476,3478,3481,3483],{"class":204,"line":205},[202,3477,373],{"class":208},[202,3479,3480],{"class":222}," JWTProvider",[202,3482,379],{"class":208},[202,3484,382],{"class":208},[202,3486,3487,3490,3492,3494,3496,3498,3501,3504,3506,3508],{"class":204,"line":385},[202,3488,3489],{"class":212},"    ValidateToken",[202,3491,391],{"class":208},[202,3493,2119],{"class":394},[202,3495,908],{"class":421},[202,3497,409],{"class":208},[202,3499,3500],{"class":208}," (*",[202,3502,3503],{"class":222},"Claims",[202,3505,418],{"class":208},[202,3507,422],{"class":421},[202,3509,425],{"class":208},[202,3511,3512,3515,3517,3520,3522,3524,3526,3528,3530,3532,3534],{"class":204,"line":428},[202,3513,3514],{"class":212},"    GenerateToken",[202,3516,391],{"class":208},[202,3518,3519],{"class":394},"claims",[202,3521,219],{"class":208},[202,3523,3503],{"class":222},[202,3525,409],{"class":208},[202,3527,412],{"class":208},[202,3529,2129],{"class":421},[202,3531,418],{"class":208},[202,3533,422],{"class":421},[202,3535,425],{"class":208},[202,3537,3538],{"class":204,"line":434},[202,3539,431],{"class":208},[202,3541,3542],{"class":204,"line":441},[202,3543,438],{"emptyLinePlaceholder":437},[202,3545,3546,3548,3551,3553],{"class":204,"line":593},[202,3547,373],{"class":208},[202,3549,3550],{"class":222}," Claims",[202,3552,547],{"class":208},[202,3554,382],{"class":208},[202,3556,3557,3560,3562,3565,3567,3570,3572,3575],{"class":204,"line":601},[202,3558,3559],{"class":554},"    Subject",[202,3561,418],{"class":208},[202,3563,3564],{"class":554}," Issuer",[202,3566,418],{"class":208},[202,3568,3569],{"class":554}," Audience",[202,3571,418],{"class":208},[202,3573,3574],{"class":554}," ID ",[202,3576,563],{"class":421},[202,3578,3579,3582,3584,3587,3589,3592],{"class":204,"line":612},[202,3580,3581],{"class":554},"    ExpiresAt",[202,3583,418],{"class":208},[202,3585,3586],{"class":554}," IssuedAt",[202,3588,418],{"class":208},[202,3590,3591],{"class":554}," NotBefore ",[202,3593,3594],{"class":421},"int64\n",[202,3596,3597,3600,3602,3604,3606],{"class":204,"line":620},[202,3598,3599],{"class":554},"    Custom ",[202,3601,661],{"class":208},[202,3603,2129],{"class":421},[202,3605,667],{"class":208},[202,3607,721],{"class":222},[202,3609,3610],{"class":204,"line":629},[202,3611,431],{"class":208},[202,3613,3614],{"class":204,"line":643},[202,3615,438],{"emptyLinePlaceholder":437},[202,3617,3618,3620,3622,3625,3627,3629,3631,3634,3636],{"class":204,"line":655},[202,3619,209],{"class":208},[202,3621,412],{"class":208},[202,3623,3624],{"class":394},"c ",[202,3626,1394],{"class":208},[202,3628,3503],{"class":222},[202,3630,409],{"class":208},[202,3632,3633],{"class":212}," Valid",[202,3635,216],{"class":208},[202,3637,867],{"class":421},[202,3639,3640],{"class":204,"line":673},[202,3641,438],{"emptyLinePlaceholder":437},[202,3643,3644,3646,3649,3651,3654,3656,3659,3661,3663,3665],{"class":204,"line":678},[202,3645,209],{"class":208},[202,3647,3648],{"class":212}," NewHMACProvider",[202,3650,391],{"class":208},[202,3652,3653],{"class":394},"secret",[202,3655,418],{"class":208},[202,3657,3658],{"class":394}," issuer",[202,3660,908],{"class":421},[202,3662,409],{"class":208},[202,3664,219],{"class":208},[202,3666,3667],{"class":222},"HMACProvider\n",[202,3669,3670,3672,3675,3677,3680,3682,3685,3687,3689,3691],{"class":204,"line":683},[202,3671,209],{"class":208},[202,3673,3674],{"class":212}," NewGoTrueProvider",[202,3676,391],{"class":208},[202,3678,3679],{"class":394},"serverURL",[202,3681,418],{"class":208},[202,3683,3684],{"class":394}," jwtSecret",[202,3686,908],{"class":421},[202,3688,409],{"class":208},[202,3690,219],{"class":208},[202,3692,3693],{"class":222},"GoTrueProvider\n",[202,3695,3696,3698,3700,3702,3704,3707,3709,3712,3714,3716,3718,3720,3722,3725,3727,3729],{"class":204,"line":695},[202,3697,209],{"class":208},[202,3699,412],{"class":208},[202,3701,3051],{"class":394},[202,3703,1394],{"class":208},[202,3705,3706],{"class":222},"GoTrueProvider",[202,3708,409],{"class":208},[202,3710,3711],{"class":212}," GetUser",[202,3713,391],{"class":208},[202,3715,2119],{"class":394},[202,3717,908],{"class":421},[202,3719,409],{"class":208},[202,3721,3500],{"class":208},[202,3723,3724],{"class":222},"GoTrueUser",[202,3726,418],{"class":208},[202,3728,422],{"class":421},[202,3730,425],{"class":208},[202,3732,3733],{"class":204,"line":703},[202,3734,438],{"emptyLinePlaceholder":437},[202,3736,3737,3739,3742,3744,3747,3749,3751,3753],{"class":204,"line":715},[202,3738,209],{"class":208},[202,3740,3741],{"class":212}," NewJWTAuthProvider",[202,3743,391],{"class":208},[202,3745,3746],{"class":394},"provider",[202,3748,3480],{"class":222},[202,3750,409],{"class":208},[202,3752,219],{"class":208},[202,3754,3755],{"class":222},"JWTAuthProvider\n",[202,3757,3758,3760,3762,3765,3767,3770,3772,3775,3777,3780,3782,3784],{"class":204,"line":724},[202,3759,209],{"class":208},[202,3761,412],{"class":208},[202,3763,3764],{"class":394},"p ",[202,3766,1394],{"class":208},[202,3768,3769],{"class":222},"JWTAuthProvider",[202,3771,409],{"class":208},[202,3773,3774],{"class":212}," WithResolver",[202,3776,391],{"class":208},[202,3778,3779],{"class":222},"AuthorizationResolver",[202,3781,409],{"class":208},[202,3783,219],{"class":208},[202,3785,3755],{"class":222},[202,3787,3788,3790,3792,3794,3796,3798,3800,3803,3805,3808,3810,3812],{"class":204,"line":2567},[202,3789,209],{"class":208},[202,3791,412],{"class":208},[202,3793,3764],{"class":394},[202,3795,1394],{"class":208},[202,3797,3769],{"class":222},[202,3799,409],{"class":208},[202,3801,3802],{"class":212}," WithAuditLogger",[202,3804,391],{"class":208},[202,3806,3807],{"class":222},"AuditLogger",[202,3809,409],{"class":208},[202,3811,219],{"class":208},[202,3813,3755],{"class":222},[202,3815,3817,3819,3821,3823,3825,3827,3829,3832,3834,3836,3838,3840,3842,3844,3846,3848,3850,3852,3854],{"class":204,"line":3816},21,[202,3818,209],{"class":208},[202,3820,412],{"class":208},[202,3822,3764],{"class":394},[202,3824,1394],{"class":208},[202,3826,3769],{"class":222},[202,3828,409],{"class":208},[202,3830,3831],{"class":212}," Authenticate",[202,3833,391],{"class":208},[202,3835,395],{"class":394},[202,3837,219],{"class":208},[202,3839,400],{"class":222},[202,3841,403],{"class":208},[202,3843,406],{"class":222},[202,3845,409],{"class":208},[202,3847,412],{"class":208},[202,3849,415],{"class":222},[202,3851,418],{"class":208},[202,3853,422],{"class":421},[202,3855,425],{"class":208},[178,3857,3858,470,3861,3864,3865,403],{},[199,3859,3860],{},"WithRoleExtractor",[199,3862,3863],{},"WithPermissionChecker"," exist but are not consulted during authentication. See ",[468,3866,3867],{"href":85},"JWT providers",[187,3869,3871],{"id":3870},"users","Users",[192,3873,3875],{"className":194,"code":3874,"language":196,"meta":197,"style":197},"type User interface {\n    ID() string\n    GetClaims() *Claims\n    GetAttribute(key string) (any, bool)\n}\n\nfunc NewBasicUser(claims *Claims) *BasicUser\nfunc (u *BasicUser) HasRole(role string) bool\n\nfunc NewAuthorizedUser(ctx context.Context, claims *Claims, resolver AuthorizationResolver) *AuthorizedUser\nfunc (u *AuthorizedUser) HasRole(role string) bool\nfunc (u *AuthorizedUser) HasPermission(permission string) bool\nfunc (u *AuthorizedUser) AuthzError() error\n\nfunc UserFromContext(ctx context.Context) User\n",[199,3876,3877,3888,3897,3909,3932,3936,3940,3962,3990,3994,4035,4062,4088,4109,4113],{"__ignoreMap":197},[202,3878,3879,3881,3884,3886],{"class":204,"line":205},[202,3880,373],{"class":208},[202,3882,3883],{"class":222}," User",[202,3885,379],{"class":208},[202,3887,382],{"class":208},[202,3889,3890,3893,3895],{"class":204,"line":385},[202,3891,3892],{"class":212},"    ID",[202,3894,216],{"class":208},[202,3896,3103],{"class":421},[202,3898,3899,3902,3904,3906],{"class":204,"line":428},[202,3900,3901],{"class":212},"    GetClaims",[202,3903,216],{"class":208},[202,3905,219],{"class":208},[202,3907,3908],{"class":222},"Claims\n",[202,3910,3911,3914,3916,3918,3920,3922,3924,3926,3928,3930],{"class":204,"line":434},[202,3912,3913],{"class":212},"    GetAttribute",[202,3915,391],{"class":208},[202,3917,2747],{"class":394},[202,3919,908],{"class":421},[202,3921,409],{"class":208},[202,3923,412],{"class":208},[202,3925,415],{"class":222},[202,3927,418],{"class":208},[202,3929,913],{"class":421},[202,3931,425],{"class":208},[202,3933,3934],{"class":204,"line":441},[202,3935,431],{"class":208},[202,3937,3938],{"class":204,"line":593},[202,3939,438],{"emptyLinePlaceholder":437},[202,3941,3942,3944,3947,3949,3951,3953,3955,3957,3959],{"class":204,"line":601},[202,3943,209],{"class":208},[202,3945,3946],{"class":212}," NewBasicUser",[202,3948,391],{"class":208},[202,3950,3519],{"class":394},[202,3952,219],{"class":208},[202,3954,3503],{"class":222},[202,3956,409],{"class":208},[202,3958,219],{"class":208},[202,3960,3961],{"class":222},"BasicUser\n",[202,3963,3964,3966,3968,3971,3973,3976,3978,3980,3982,3984,3986,3988],{"class":204,"line":612},[202,3965,209],{"class":208},[202,3967,412],{"class":208},[202,3969,3970],{"class":394},"u ",[202,3972,1394],{"class":208},[202,3974,3975],{"class":222},"BasicUser",[202,3977,409],{"class":208},[202,3979,900],{"class":212},[202,3981,391],{"class":208},[202,3983,905],{"class":394},[202,3985,908],{"class":421},[202,3987,409],{"class":208},[202,3989,877],{"class":421},[202,3991,3992],{"class":204,"line":620},[202,3993,438],{"emptyLinePlaceholder":437},[202,3995,3996,3998,4001,4003,4005,4007,4009,4011,4013,4016,4018,4020,4022,4025,4028,4030,4032],{"class":204,"line":629},[202,3997,209],{"class":208},[202,3999,4000],{"class":212}," NewAuthorizedUser",[202,4002,391],{"class":208},[202,4004,451],{"class":394},[202,4006,454],{"class":222},[202,4008,403],{"class":208},[202,4010,53],{"class":222},[202,4012,418],{"class":208},[202,4014,4015],{"class":394}," claims",[202,4017,219],{"class":208},[202,4019,3503],{"class":222},[202,4021,418],{"class":208},[202,4023,4024],{"class":394}," resolver",[202,4026,4027],{"class":222}," AuthorizationResolver",[202,4029,409],{"class":208},[202,4031,219],{"class":208},[202,4033,4034],{"class":222},"AuthorizedUser\n",[202,4036,4037,4039,4041,4043,4045,4048,4050,4052,4054,4056,4058,4060],{"class":204,"line":643},[202,4038,209],{"class":208},[202,4040,412],{"class":208},[202,4042,3970],{"class":394},[202,4044,1394],{"class":208},[202,4046,4047],{"class":222},"AuthorizedUser",[202,4049,409],{"class":208},[202,4051,900],{"class":212},[202,4053,391],{"class":208},[202,4055,905],{"class":394},[202,4057,908],{"class":421},[202,4059,409],{"class":208},[202,4061,877],{"class":421},[202,4063,4064,4066,4068,4070,4072,4074,4076,4078,4080,4082,4084,4086],{"class":204,"line":655},[202,4065,209],{"class":208},[202,4067,412],{"class":208},[202,4069,3970],{"class":394},[202,4071,1394],{"class":208},[202,4073,4047],{"class":222},[202,4075,409],{"class":208},[202,4077,931],{"class":212},[202,4079,391],{"class":208},[202,4081,936],{"class":394},[202,4083,908],{"class":421},[202,4085,409],{"class":208},[202,4087,877],{"class":421},[202,4089,4090,4092,4094,4096,4098,4100,4102,4105,4107],{"class":204,"line":673},[202,4091,209],{"class":208},[202,4093,412],{"class":208},[202,4095,3970],{"class":394},[202,4097,1394],{"class":208},[202,4099,4047],{"class":222},[202,4101,409],{"class":208},[202,4103,4104],{"class":212}," AuthzError",[202,4106,216],{"class":208},[202,4108,867],{"class":421},[202,4110,4111],{"class":204,"line":678},[202,4112,438],{"emptyLinePlaceholder":437},[202,4114,4115,4117,4119,4121,4123,4125,4127,4129,4131],{"class":204,"line":683},[202,4116,209],{"class":208},[202,4118,446],{"class":212},[202,4120,391],{"class":208},[202,4122,451],{"class":394},[202,4124,454],{"class":222},[202,4126,403],{"class":208},[202,4128,53],{"class":222},[202,4130,409],{"class":208},[202,4132,4133],{"class":222}," User\n",[187,4135,4137],{"id":4136},"authorization","Authorization",[192,4139,4141],{"className":194,"code":4140,"language":196,"meta":197,"style":197},"type AuthorizationResolver interface {\n    Resolve(ctx context.Context, user User) (Authorization, error)\n}\n\ntype Authorization struct {\n    Roles       []string\n    Permissions []string\n}\n\nfunc ClaimRoles(claims *Claims) []string\n\nfunc Cached(inner AuthorizationResolver, ttl time.Duration) *CachedResolver\nfunc (c *CachedResolver) Invalidate(userID string)\nfunc (c *CachedResolver) InvalidateAll()\n",[199,4142,4143,4153,4187,4191,4195,4206,4215,4224,4228,4232,4253,4257,4289,4316],{"__ignoreMap":197},[202,4144,4145,4147,4149,4151],{"class":204,"line":205},[202,4146,373],{"class":208},[202,4148,4027],{"class":222},[202,4150,379],{"class":208},[202,4152,382],{"class":208},[202,4154,4155,4158,4160,4162,4164,4166,4168,4170,4173,4175,4177,4179,4181,4183,4185],{"class":204,"line":385},[202,4156,4157],{"class":212},"    Resolve",[202,4159,391],{"class":208},[202,4161,451],{"class":394},[202,4163,454],{"class":222},[202,4165,403],{"class":208},[202,4167,53],{"class":222},[202,4169,418],{"class":208},[202,4171,4172],{"class":394}," user",[202,4174,3883],{"class":222},[202,4176,409],{"class":208},[202,4178,412],{"class":208},[202,4180,4137],{"class":222},[202,4182,418],{"class":208},[202,4184,422],{"class":421},[202,4186,425],{"class":208},[202,4188,4189],{"class":204,"line":428},[202,4190,431],{"class":208},[202,4192,4193],{"class":204,"line":434},[202,4194,438],{"emptyLinePlaceholder":437},[202,4196,4197,4199,4202,4204],{"class":204,"line":441},[202,4198,373],{"class":208},[202,4200,4201],{"class":222}," Authorization",[202,4203,547],{"class":208},[202,4205,382],{"class":208},[202,4207,4208,4211,4213],{"class":204,"line":593},[202,4209,4210],{"class":554},"    Roles       ",[202,4212,607],{"class":208},[202,4214,563],{"class":421},[202,4216,4217,4220,4222],{"class":204,"line":601},[202,4218,4219],{"class":554},"    Permissions ",[202,4221,607],{"class":208},[202,4223,563],{"class":421},[202,4225,4226],{"class":204,"line":612},[202,4227,431],{"class":208},[202,4229,4230],{"class":204,"line":620},[202,4231,438],{"emptyLinePlaceholder":437},[202,4233,4234,4236,4239,4241,4243,4245,4247,4249,4251],{"class":204,"line":629},[202,4235,209],{"class":208},[202,4237,4238],{"class":212}," ClaimRoles",[202,4240,391],{"class":208},[202,4242,3519],{"class":394},[202,4244,219],{"class":208},[202,4246,3503],{"class":222},[202,4248,409],{"class":208},[202,4250,1738],{"class":208},[202,4252,563],{"class":421},[202,4254,4255],{"class":204,"line":643},[202,4256,438],{"emptyLinePlaceholder":437},[202,4258,4259,4261,4264,4266,4269,4271,4273,4276,4278,4280,4282,4284,4286],{"class":204,"line":655},[202,4260,209],{"class":208},[202,4262,4263],{"class":212}," Cached",[202,4265,391],{"class":208},[202,4267,4268],{"class":394},"inner",[202,4270,4027],{"class":222},[202,4272,418],{"class":208},[202,4274,4275],{"class":394}," ttl",[202,4277,2796],{"class":222},[202,4279,403],{"class":208},[202,4281,2801],{"class":222},[202,4283,409],{"class":208},[202,4285,219],{"class":208},[202,4287,4288],{"class":222},"CachedResolver\n",[202,4290,4291,4293,4295,4297,4299,4302,4304,4307,4309,4312,4314],{"class":204,"line":673},[202,4292,209],{"class":208},[202,4294,412],{"class":208},[202,4296,3624],{"class":394},[202,4298,1394],{"class":208},[202,4300,4301],{"class":222},"CachedResolver",[202,4303,409],{"class":208},[202,4305,4306],{"class":212}," Invalidate",[202,4308,391],{"class":208},[202,4310,4311],{"class":394},"userID",[202,4313,908],{"class":421},[202,4315,425],{"class":208},[202,4317,4318,4320,4322,4324,4326,4328,4330,4333],{"class":204,"line":678},[202,4319,209],{"class":208},[202,4321,412],{"class":208},[202,4323,3624],{"class":394},[202,4325,1394],{"class":208},[202,4327,4301],{"class":222},[202,4329,409],{"class":208},[202,4331,4332],{"class":212}," InvalidateAll",[202,4334,1773],{"class":208},[178,4336,466,4337,403],{},[468,4338,4339],{"href":90},"Roles and permissions",[187,4341,4343],{"id":4342},"role-hierarchies","Role hierarchies",[192,4345,4347],{"className":194,"code":4346,"language":196,"meta":197,"style":197},"func BuildHierarchy() *HierarchyBuilder\nfunc NewHierarchy() *Hierarchy\nfunc NewCommonRoleHierarchy() *Hierarchy\nfunc DefaultWebAppHierarchy() *Hierarchy\n\nfunc (h *Hierarchy) GetImpliedRoles(role string) []string\nfunc (h *Hierarchy) AddRoleImplication(parent, child string)\nfunc (h *Hierarchy) RemoveRoleImplication(parent, child string)\nfunc (h *Hierarchy) HasImplication(parent, child string) bool\n",[199,4348,4349,4363,4377,4390,4403,4407,4438,4469,4498],{"__ignoreMap":197},[202,4350,4351,4353,4356,4358,4360],{"class":204,"line":205},[202,4352,209],{"class":208},[202,4354,4355],{"class":212}," BuildHierarchy",[202,4357,216],{"class":208},[202,4359,219],{"class":208},[202,4361,4362],{"class":222},"HierarchyBuilder\n",[202,4364,4365,4367,4370,4372,4374],{"class":204,"line":385},[202,4366,209],{"class":208},[202,4368,4369],{"class":212}," NewHierarchy",[202,4371,216],{"class":208},[202,4373,219],{"class":208},[202,4375,4376],{"class":222},"Hierarchy\n",[202,4378,4379,4381,4384,4386,4388],{"class":204,"line":428},[202,4380,209],{"class":208},[202,4382,4383],{"class":212}," NewCommonRoleHierarchy",[202,4385,216],{"class":208},[202,4387,219],{"class":208},[202,4389,4376],{"class":222},[202,4391,4392,4394,4397,4399,4401],{"class":204,"line":434},[202,4393,209],{"class":208},[202,4395,4396],{"class":212}," DefaultWebAppHierarchy",[202,4398,216],{"class":208},[202,4400,219],{"class":208},[202,4402,4376],{"class":222},[202,4404,4405],{"class":204,"line":441},[202,4406,438],{"emptyLinePlaceholder":437},[202,4408,4409,4411,4413,4416,4418,4421,4423,4426,4428,4430,4432,4434,4436],{"class":204,"line":593},[202,4410,209],{"class":208},[202,4412,412],{"class":208},[202,4414,4415],{"class":394},"h ",[202,4417,1394],{"class":208},[202,4419,4420],{"class":222},"Hierarchy",[202,4422,409],{"class":208},[202,4424,4425],{"class":212}," GetImpliedRoles",[202,4427,391],{"class":208},[202,4429,905],{"class":394},[202,4431,908],{"class":421},[202,4433,409],{"class":208},[202,4435,1738],{"class":208},[202,4437,563],{"class":421},[202,4439,4440,4442,4444,4446,4448,4450,4452,4455,4457,4460,4462,4465,4467],{"class":204,"line":601},[202,4441,209],{"class":208},[202,4443,412],{"class":208},[202,4445,4415],{"class":394},[202,4447,1394],{"class":208},[202,4449,4420],{"class":222},[202,4451,409],{"class":208},[202,4453,4454],{"class":212}," AddRoleImplication",[202,4456,391],{"class":208},[202,4458,4459],{"class":394},"parent",[202,4461,418],{"class":208},[202,4463,4464],{"class":394}," child",[202,4466,908],{"class":421},[202,4468,425],{"class":208},[202,4470,4471,4473,4475,4477,4479,4481,4483,4486,4488,4490,4492,4494,4496],{"class":204,"line":612},[202,4472,209],{"class":208},[202,4474,412],{"class":208},[202,4476,4415],{"class":394},[202,4478,1394],{"class":208},[202,4480,4420],{"class":222},[202,4482,409],{"class":208},[202,4484,4485],{"class":212}," RemoveRoleImplication",[202,4487,391],{"class":208},[202,4489,4459],{"class":394},[202,4491,418],{"class":208},[202,4493,4464],{"class":394},[202,4495,908],{"class":421},[202,4497,425],{"class":208},[202,4499,4500,4502,4504,4506,4508,4510,4512,4515,4517,4519,4521,4523,4525,4527],{"class":204,"line":620},[202,4501,209],{"class":208},[202,4503,412],{"class":208},[202,4505,4415],{"class":394},[202,4507,1394],{"class":208},[202,4509,4420],{"class":222},[202,4511,409],{"class":208},[202,4513,4514],{"class":212}," HasImplication",[202,4516,391],{"class":208},[202,4518,4459],{"class":394},[202,4520,418],{"class":208},[202,4522,4464],{"class":394},[202,4524,908],{"class":421},[202,4526,409],{"class":208},[202,4528,877],{"class":421},[178,4530,4531,4532,1422,4535,1422,4538,1422,4540,1422,4543,1422,4546,1422,4549,403],{},"Builder methods: ",[199,4533,4534],{},"Role",[199,4536,4537],{},"Admin",[199,4539,1620],{},[199,4541,4542],{},"Moderator",[199,4544,4545],{},"Implies",[199,4547,4548],{},"ImpliesAll",[199,4550,4551],{},"Build",[187,4553,4555],{"id":4554},"audit","Audit",[192,4557,4559],{"className":194,"code":4558,"language":196,"meta":197,"style":197},"type AuditLogger interface {\n    LogAuthEvent(ctx context.Context, event AuditEvent)\n    LogLoginAttempt(ctx context.Context, userID, result string, details map[string]any)\n    LogAccessAttempt(ctx context.Context, userID, resource, action, result string, details map[string]any)\n    LogRoleCheck(ctx context.Context, userID, role, result string, details map[string]any)\n    LogPermissionCheck(ctx context.Context, userID, permission, result string, details map[string]any)\n}\n\nfunc NewSlogAuditLogger(logger *slog.Logger) *SlogAuditLogger\nfunc NewNoOpAuditLogger() *NoOpAuditLogger\n",[199,4560,4561,4572,4597,4639,4688,4732,4776,4780,4784,4810],{"__ignoreMap":197},[202,4562,4563,4565,4568,4570],{"class":204,"line":205},[202,4564,373],{"class":208},[202,4566,4567],{"class":222}," AuditLogger",[202,4569,379],{"class":208},[202,4571,382],{"class":208},[202,4573,4574,4577,4579,4581,4583,4585,4587,4589,4592,4595],{"class":204,"line":385},[202,4575,4576],{"class":212},"    LogAuthEvent",[202,4578,391],{"class":208},[202,4580,451],{"class":394},[202,4582,454],{"class":222},[202,4584,403],{"class":208},[202,4586,53],{"class":222},[202,4588,418],{"class":208},[202,4590,4591],{"class":394}," event",[202,4593,4594],{"class":222}," AuditEvent",[202,4596,425],{"class":208},[202,4598,4599,4602,4604,4606,4608,4610,4612,4614,4617,4619,4622,4624,4626,4629,4631,4633,4635,4637],{"class":204,"line":428},[202,4600,4601],{"class":212},"    LogLoginAttempt",[202,4603,391],{"class":208},[202,4605,451],{"class":394},[202,4607,454],{"class":222},[202,4609,403],{"class":208},[202,4611,53],{"class":222},[202,4613,418],{"class":208},[202,4615,4616],{"class":394}," userID",[202,4618,418],{"class":208},[202,4620,4621],{"class":394}," result",[202,4623,908],{"class":421},[202,4625,418],{"class":208},[202,4627,4628],{"class":394}," details",[202,4630,2126],{"class":208},[202,4632,2129],{"class":421},[202,4634,667],{"class":208},[202,4636,415],{"class":222},[202,4638,425],{"class":208},[202,4640,4641,4644,4646,4648,4650,4652,4654,4656,4658,4660,4663,4665,4668,4670,4672,4674,4676,4678,4680,4682,4684,4686],{"class":204,"line":434},[202,4642,4643],{"class":212},"    LogAccessAttempt",[202,4645,391],{"class":208},[202,4647,451],{"class":394},[202,4649,454],{"class":222},[202,4651,403],{"class":208},[202,4653,53],{"class":222},[202,4655,418],{"class":208},[202,4657,4616],{"class":394},[202,4659,418],{"class":208},[202,4661,4662],{"class":394}," resource",[202,4664,418],{"class":208},[202,4666,4667],{"class":394}," action",[202,4669,418],{"class":208},[202,4671,4621],{"class":394},[202,4673,908],{"class":421},[202,4675,418],{"class":208},[202,4677,4628],{"class":394},[202,4679,2126],{"class":208},[202,4681,2129],{"class":421},[202,4683,667],{"class":208},[202,4685,415],{"class":222},[202,4687,425],{"class":208},[202,4689,4690,4693,4695,4697,4699,4701,4703,4705,4707,4709,4712,4714,4716,4718,4720,4722,4724,4726,4728,4730],{"class":204,"line":441},[202,4691,4692],{"class":212},"    LogRoleCheck",[202,4694,391],{"class":208},[202,4696,451],{"class":394},[202,4698,454],{"class":222},[202,4700,403],{"class":208},[202,4702,53],{"class":222},[202,4704,418],{"class":208},[202,4706,4616],{"class":394},[202,4708,418],{"class":208},[202,4710,4711],{"class":394}," role",[202,4713,418],{"class":208},[202,4715,4621],{"class":394},[202,4717,908],{"class":421},[202,4719,418],{"class":208},[202,4721,4628],{"class":394},[202,4723,2126],{"class":208},[202,4725,2129],{"class":421},[202,4727,667],{"class":208},[202,4729,415],{"class":222},[202,4731,425],{"class":208},[202,4733,4734,4737,4739,4741,4743,4745,4747,4749,4751,4753,4756,4758,4760,4762,4764,4766,4768,4770,4772,4774],{"class":204,"line":593},[202,4735,4736],{"class":212},"    LogPermissionCheck",[202,4738,391],{"class":208},[202,4740,451],{"class":394},[202,4742,454],{"class":222},[202,4744,403],{"class":208},[202,4746,53],{"class":222},[202,4748,418],{"class":208},[202,4750,4616],{"class":394},[202,4752,418],{"class":208},[202,4754,4755],{"class":394}," permission",[202,4757,418],{"class":208},[202,4759,4621],{"class":394},[202,4761,908],{"class":421},[202,4763,418],{"class":208},[202,4765,4628],{"class":394},[202,4767,2126],{"class":208},[202,4769,2129],{"class":421},[202,4771,667],{"class":208},[202,4773,415],{"class":222},[202,4775,425],{"class":208},[202,4777,4778],{"class":204,"line":601},[202,4779,431],{"class":208},[202,4781,4782],{"class":204,"line":612},[202,4783,438],{"emptyLinePlaceholder":437},[202,4785,4786,4788,4791,4793,4795,4797,4799,4801,4803,4805,4807],{"class":204,"line":620},[202,4787,209],{"class":208},[202,4789,4790],{"class":212}," NewSlogAuditLogger",[202,4792,391],{"class":208},[202,4794,1847],{"class":394},[202,4796,219],{"class":208},[202,4798,1852],{"class":222},[202,4800,403],{"class":208},[202,4802,1857],{"class":222},[202,4804,409],{"class":208},[202,4806,219],{"class":208},[202,4808,4809],{"class":222},"SlogAuditLogger\n",[202,4811,4812,4814,4817,4819,4821],{"class":204,"line":629},[202,4813,209],{"class":208},[202,4815,4816],{"class":212}," NewNoOpAuditLogger",[202,4818,216],{"class":208},[202,4820,219],{"class":208},[202,4822,4823],{"class":222},"NoOpAuditLogger\n",[178,4825,466,4826,403],{},[468,4827,4828],{"href":95},"Audit logging",[187,4830,99],{"id":4831},"gotrue",[192,4833,4835],{"className":194,"code":4834,"language":196,"meta":197,"style":197},"func NewGoTrue(cfg GoTrueConfig) *GoTrue\nfunc (gt *GoTrue) AuthProvider() *JWTAuthProvider\nfunc (gt *GoTrue) Mount(app *ezz.App, prefix string)\n\ntype GoTrueConfig struct {\n    InternalURL    string\n    JWTSecret      string\n    AuditLogger    AuditLogger\n    RateLimiter    RateLimiter\n    ServerHeaders  map[string]string\n    HTTPClient     *http.Client\n    TrustedProxies []string\n}\n\ntype RateLimiter interface {\n    Allow(ctx context.Context, key string) (bool, error)\n}\n",[199,4836,4837,4859,4882,4920,4924,4934,4941,4948,4956,4964,4977,4991,5000,5004,5008,5018,5052],{"__ignoreMap":197},[202,4838,4839,4841,4844,4846,4849,4852,4854,4856],{"class":204,"line":205},[202,4840,209],{"class":208},[202,4842,4843],{"class":212}," NewGoTrue",[202,4845,391],{"class":208},[202,4847,4848],{"class":394},"cfg",[202,4850,4851],{"class":222}," GoTrueConfig",[202,4853,409],{"class":208},[202,4855,219],{"class":208},[202,4857,4858],{"class":222},"GoTrue\n",[202,4860,4861,4863,4865,4868,4870,4872,4874,4876,4878,4880],{"class":204,"line":385},[202,4862,209],{"class":208},[202,4864,412],{"class":208},[202,4866,4867],{"class":394},"gt ",[202,4869,1394],{"class":208},[202,4871,99],{"class":222},[202,4873,409],{"class":208},[202,4875,376],{"class":212},[202,4877,216],{"class":208},[202,4879,219],{"class":208},[202,4881,3755],{"class":222},[202,4883,4884,4886,4888,4890,4892,4894,4896,4899,4901,4903,4905,4907,4909,4911,4913,4916,4918],{"class":204,"line":428},[202,4885,209],{"class":208},[202,4887,412],{"class":208},[202,4889,4867],{"class":394},[202,4891,1394],{"class":208},[202,4893,99],{"class":222},[202,4895,409],{"class":208},[202,4897,4898],{"class":212}," Mount",[202,4900,391],{"class":208},[202,4902,189],{"class":394},[202,4904,219],{"class":208},[202,4906,3070],{"class":222},[202,4908,403],{"class":208},[202,4910,190],{"class":222},[202,4912,418],{"class":208},[202,4914,4915],{"class":394}," prefix",[202,4917,908],{"class":421},[202,4919,425],{"class":208},[202,4921,4922],{"class":204,"line":434},[202,4923,438],{"emptyLinePlaceholder":437},[202,4925,4926,4928,4930,4932],{"class":204,"line":441},[202,4927,373],{"class":208},[202,4929,4851],{"class":222},[202,4931,547],{"class":208},[202,4933,382],{"class":208},[202,4935,4936,4939],{"class":204,"line":593},[202,4937,4938],{"class":554},"    InternalURL    ",[202,4940,563],{"class":421},[202,4942,4943,4946],{"class":204,"line":601},[202,4944,4945],{"class":554},"    JWTSecret      ",[202,4947,563],{"class":421},[202,4949,4950,4953],{"class":204,"line":612},[202,4951,4952],{"class":554},"    AuditLogger    ",[202,4954,4955],{"class":222},"AuditLogger\n",[202,4957,4958,4961],{"class":204,"line":620},[202,4959,4960],{"class":554},"    RateLimiter    ",[202,4962,4963],{"class":222},"RateLimiter\n",[202,4965,4966,4969,4971,4973,4975],{"class":204,"line":629},[202,4967,4968],{"class":554},"    ServerHeaders  ",[202,4970,661],{"class":208},[202,4972,2129],{"class":421},[202,4974,667],{"class":208},[202,4976,563],{"class":421},[202,4978,4979,4982,4984,4986,4988],{"class":204,"line":643},[202,4980,4981],{"class":554},"    HTTPClient     ",[202,4983,1394],{"class":208},[202,4985,400],{"class":222},[202,4987,403],{"class":208},[202,4989,4990],{"class":222},"Client\n",[202,4992,4993,4996,4998],{"class":204,"line":655},[202,4994,4995],{"class":554},"    TrustedProxies ",[202,4997,607],{"class":208},[202,4999,563],{"class":421},[202,5001,5002],{"class":204,"line":673},[202,5003,431],{"class":208},[202,5005,5006],{"class":204,"line":678},[202,5007,438],{"emptyLinePlaceholder":437},[202,5009,5010,5012,5014,5016],{"class":204,"line":683},[202,5011,373],{"class":208},[202,5013,2733],{"class":222},[202,5015,379],{"class":208},[202,5017,382],{"class":208},[202,5019,5020,5022,5024,5026,5028,5030,5032,5034,5037,5039,5041,5043,5046,5048,5050],{"class":204,"line":695},[202,5021,2742],{"class":212},[202,5023,391],{"class":208},[202,5025,451],{"class":394},[202,5027,454],{"class":222},[202,5029,403],{"class":208},[202,5031,53],{"class":222},[202,5033,418],{"class":208},[202,5035,5036],{"class":394}," key",[202,5038,908],{"class":421},[202,5040,409],{"class":208},[202,5042,412],{"class":208},[202,5044,5045],{"class":421},"bool",[202,5047,418],{"class":208},[202,5049,422],{"class":421},[202,5051,425],{"class":208},[202,5053,5054],{"class":204,"line":703},[202,5055,431],{"class":208},[178,5057,5058,5059,1422,5062,1422,5065,1422,5068,1422,5071,1422,5074,1422,5077,1422,5080,1422,5083,1422,5086,1422,5089,1422,5092,1422,5095,1422,5098,1422,5101,1422,5104,1422,5107,1422,5110,1422,5113,1422,5116,5119,5120,5123],{},"Endpoint types: ",[199,5060,5061],{},"HealthResponse",[199,5063,5064],{},"SettingsResponse",[199,5066,5067],{},"SignupRequest",[199,5069,5070],{},"TokenRequest",[199,5072,5073],{},"UserObject",[199,5075,5076],{},"SessionResponse",[199,5078,5079],{},"OTPRequest",[199,5081,5082],{},"VerifyRequest",[199,5084,5085],{},"RecoverRequest",[199,5087,5088],{},"ResendRequest",[199,5090,5091],{},"MessageResponse",[199,5093,5094],{},"UpdateUserRequest",[199,5096,5097],{},"ReauthenticateRequest",[199,5099,5100],{},"OAuthServerMetadata",[199,5102,5103],{},"JWKSResponse",[199,5105,5106],{},"OAuthTokenRequest",[199,5108,5109],{},"OAuthTokenResponse",[199,5111,5112],{},"ClientRegistrationRequest",[199,5114,5115],{},"ClientRegistrationResponse",[199,5117,5118],{},"OAuthUserInfo",", and the ",[199,5121,5122],{},"Passkey*"," types.",[178,5125,466,5126,470,5129,403],{},[468,5127,5128],{"href":106},"GoTrue proxy",[468,5130,110],{"href":111},[187,5132,5134],{"id":5133},"middleware-and-context-helpers","Middleware and context helpers",[192,5136,5138],{"className":194,"code":5137,"language":196,"meta":197,"style":197},"func JWTMiddleware(provider JWTProvider) ezz.Middleware\nfunc OptionalJWTMiddleware(provider JWTProvider) ezz.Middleware\nfunc GetClaims(ctx context.Context) *Claims\nfunc GetUserID(ctx context.Context) string\nfunc BatchValidateTokens(provider JWTProvider, tokens []string) ([]*Claims, []error)\n",[199,5139,5140,5161,5182,5205,5226],{"__ignoreMap":197},[202,5141,5142,5144,5147,5149,5151,5153,5155,5157,5159],{"class":204,"line":205},[202,5143,209],{"class":208},[202,5145,5146],{"class":212}," JWTMiddleware",[202,5148,391],{"class":208},[202,5150,3746],{"class":394},[202,5152,3480],{"class":222},[202,5154,409],{"class":208},[202,5156,2643],{"class":222},[202,5158,403],{"class":208},[202,5160,2648],{"class":222},[202,5162,5163,5165,5168,5170,5172,5174,5176,5178,5180],{"class":204,"line":385},[202,5164,209],{"class":208},[202,5166,5167],{"class":212}," OptionalJWTMiddleware",[202,5169,391],{"class":208},[202,5171,3746],{"class":394},[202,5173,3480],{"class":222},[202,5175,409],{"class":208},[202,5177,2643],{"class":222},[202,5179,403],{"class":208},[202,5181,2648],{"class":222},[202,5183,5184,5186,5189,5191,5193,5195,5197,5199,5201,5203],{"class":204,"line":428},[202,5185,209],{"class":208},[202,5187,5188],{"class":212}," GetClaims",[202,5190,391],{"class":208},[202,5192,451],{"class":394},[202,5194,454],{"class":222},[202,5196,403],{"class":208},[202,5198,53],{"class":222},[202,5200,409],{"class":208},[202,5202,219],{"class":208},[202,5204,3908],{"class":222},[202,5206,5207,5209,5212,5214,5216,5218,5220,5222,5224],{"class":204,"line":434},[202,5208,209],{"class":208},[202,5210,5211],{"class":212}," GetUserID",[202,5213,391],{"class":208},[202,5215,451],{"class":394},[202,5217,454],{"class":222},[202,5219,403],{"class":208},[202,5221,53],{"class":222},[202,5223,409],{"class":208},[202,5225,3103],{"class":421},[202,5227,5228,5230,5233,5235,5237,5239,5241,5244,5246,5248,5250,5253,5255,5257,5259,5262],{"class":204,"line":441},[202,5229,209],{"class":208},[202,5231,5232],{"class":212}," BatchValidateTokens",[202,5234,391],{"class":208},[202,5236,3746],{"class":394},[202,5238,3480],{"class":222},[202,5240,418],{"class":208},[202,5242,5243],{"class":394}," tokens",[202,5245,1738],{"class":208},[202,5247,2129],{"class":421},[202,5249,409],{"class":208},[202,5251,5252],{"class":208}," ([]*",[202,5254,3503],{"class":222},[202,5256,418],{"class":208},[202,5258,1738],{"class":208},[202,5260,5261],{"class":421},"error",[202,5263,425],{"class":208},[187,5265,5267],{"id":5266},"extractors-checkers-and-caches","Extractors, checkers, and caches",[178,5269,5270],{},"Building blocks from the pre-resolver design. They are still exported and useful inside your own resolver, but the app does not call them.",[192,5272,5274],{"className":194,"code":5273,"language":196,"meta":197,"style":197},"type RoleExtractor interface {\n    ExtractRoles(ctx context.Context, user User) ([]string, error)\n    HasRole(ctx context.Context, user User, role string) (bool, error)\n}\n\ntype PermissionChecker interface {\n    HasPermission(ctx context.Context, user User, permission string) (bool, error)\n    GetPermissions(ctx context.Context, user User) ([]string, error)\n}\n",[199,5275,5276,5287,5321,5360,5364,5368,5378,5417,5450],{"__ignoreMap":197},[202,5277,5278,5280,5283,5285],{"class":204,"line":205},[202,5279,373],{"class":208},[202,5281,5282],{"class":222}," RoleExtractor",[202,5284,379],{"class":208},[202,5286,382],{"class":208},[202,5288,5289,5292,5294,5296,5298,5300,5302,5304,5306,5308,5310,5313,5315,5317,5319],{"class":204,"line":385},[202,5290,5291],{"class":212},"    ExtractRoles",[202,5293,391],{"class":208},[202,5295,451],{"class":394},[202,5297,454],{"class":222},[202,5299,403],{"class":208},[202,5301,53],{"class":222},[202,5303,418],{"class":208},[202,5305,4172],{"class":394},[202,5307,3883],{"class":222},[202,5309,409],{"class":208},[202,5311,5312],{"class":208}," ([]",[202,5314,2129],{"class":421},[202,5316,418],{"class":208},[202,5318,422],{"class":421},[202,5320,425],{"class":208},[202,5322,5323,5326,5328,5330,5332,5334,5336,5338,5340,5342,5344,5346,5348,5350,5352,5354,5356,5358],{"class":204,"line":428},[202,5324,5325],{"class":212},"    HasRole",[202,5327,391],{"class":208},[202,5329,451],{"class":394},[202,5331,454],{"class":222},[202,5333,403],{"class":208},[202,5335,53],{"class":222},[202,5337,418],{"class":208},[202,5339,4172],{"class":394},[202,5341,3883],{"class":222},[202,5343,418],{"class":208},[202,5345,4711],{"class":394},[202,5347,908],{"class":421},[202,5349,409],{"class":208},[202,5351,412],{"class":208},[202,5353,5045],{"class":421},[202,5355,418],{"class":208},[202,5357,422],{"class":421},[202,5359,425],{"class":208},[202,5361,5362],{"class":204,"line":434},[202,5363,431],{"class":208},[202,5365,5366],{"class":204,"line":441},[202,5367,438],{"emptyLinePlaceholder":437},[202,5369,5370,5372,5374,5376],{"class":204,"line":593},[202,5371,373],{"class":208},[202,5373,923],{"class":222},[202,5375,379],{"class":208},[202,5377,382],{"class":208},[202,5379,5380,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5403,5405,5407,5409,5411,5413,5415],{"class":204,"line":601},[202,5381,5382],{"class":212},"    HasPermission",[202,5384,391],{"class":208},[202,5386,451],{"class":394},[202,5388,454],{"class":222},[202,5390,403],{"class":208},[202,5392,53],{"class":222},[202,5394,418],{"class":208},[202,5396,4172],{"class":394},[202,5398,3883],{"class":222},[202,5400,418],{"class":208},[202,5402,4755],{"class":394},[202,5404,908],{"class":421},[202,5406,409],{"class":208},[202,5408,412],{"class":208},[202,5410,5045],{"class":421},[202,5412,418],{"class":208},[202,5414,422],{"class":421},[202,5416,425],{"class":208},[202,5418,5419,5422,5424,5426,5428,5430,5432,5434,5436,5438,5440,5442,5444,5446,5448],{"class":204,"line":612},[202,5420,5421],{"class":212},"    GetPermissions",[202,5423,391],{"class":208},[202,5425,451],{"class":394},[202,5427,454],{"class":222},[202,5429,403],{"class":208},[202,5431,53],{"class":222},[202,5433,418],{"class":208},[202,5435,4172],{"class":394},[202,5437,3883],{"class":222},[202,5439,409],{"class":208},[202,5441,5312],{"class":208},[202,5443,2129],{"class":421},[202,5445,418],{"class":208},[202,5447,422],{"class":421},[202,5449,425],{"class":208},[202,5451,5452],{"class":204,"line":620},[202,5453,431],{"class":208},[178,5455,5456,5457,1422,5460,1422,5463,1422,5466,1422,5469,1422,5472,1422,5475,1422,5478,403],{},"Implementations: ",[199,5458,5459],{},"ClaimsExtractor",[199,5461,5462],{},"GoTrueExtractor",[199,5464,5465],{},"CompositeExtractor",[199,5467,5468],{},"StaticExtractor",[199,5470,5471],{},"HierarchyExtractor",[199,5473,5474],{},"RolePermissionChecker",[199,5476,5477],{},"CachedExtractor",[199,5479,5480],{},"CachedChecker",[178,5482,5483,5484,1422,5487,1422,5490,1422,5493,1422,5496,1422,5499,1422,5502,403],{},"Caching primitives: ",[199,5485,5486],{},"Cache",[199,5488,5489],{},"NewLRUCache",[199,5491,5492],{},"CacheConfig",[199,5494,5495],{},"DefaultCacheConfig",[199,5497,5498],{},"CacheManager",[199,5500,5501],{},"OptimizedCacheConfig",[199,5503,5504],{},"CacheStats",[178,5506,5507,5508,5511,5512,5515,5516,1422,5519,5522,5523,1422,5526,1422,5529,1422,5531,1422,5534,1422,5537,1422,5540,1422,5543,1422,5546,1422,5549,403],{},"Legacy configuration: ",[199,5509,5510],{},"AuthConfig"," (aliased as ",[199,5513,5514],{},"Config",") with ",[199,5517,5518],{},"ToAuthProvider()",[199,5520,5521],{},"AuthRule"," with ",[199,5524,5525],{},"Public",[199,5527,5528],{},"Authenticated",[199,5530,4534],{},[199,5532,5533],{},"AnyRole",[199,5535,5536],{},"AllRoles",[199,5538,5539],{},"RequirePermission",[199,5541,5542],{},"JWTConfig",[199,5544,5545],{},"DefaultJWTConfig",[199,5547,5548],{},"RequestCache",[199,5550,5551],{},"GetRequestCache",[182,5553,5555],{"id":5554},"package-ezzauthratelimit","Package ezz\u002Fauth\u002Fratelimit",[192,5557,5559],{"className":194,"code":5558,"language":196,"meta":197,"style":197},"func NewRedis(client redis.UniversalClient, limit int, window time.Duration) *Redis\nfunc (r *Redis) Allow(ctx context.Context, key string) (bool, error)\n",[199,5560,5561,5606],{"__ignoreMap":197},[202,5562,5563,5565,5568,5570,5573,5576,5578,5581,5583,5586,5588,5590,5593,5595,5597,5599,5601,5603],{"class":204,"line":205},[202,5564,209],{"class":208},[202,5566,5567],{"class":212}," NewRedis",[202,5569,391],{"class":208},[202,5571,5572],{"class":394},"client",[202,5574,5575],{"class":222}," redis",[202,5577,403],{"class":208},[202,5579,5580],{"class":222},"UniversalClient",[202,5582,418],{"class":208},[202,5584,5585],{"class":394}," limit",[202,5587,1368],{"class":421},[202,5589,418],{"class":208},[202,5591,5592],{"class":394}," window",[202,5594,2796],{"class":222},[202,5596,403],{"class":208},[202,5598,2801],{"class":222},[202,5600,409],{"class":208},[202,5602,219],{"class":208},[202,5604,5605],{"class":222},"Redis\n",[202,5607,5608,5610,5612,5615,5617,5620,5622,5625,5627,5629,5631,5633,5635,5637,5639,5641,5643,5645,5647,5649,5651],{"class":204,"line":385},[202,5609,209],{"class":208},[202,5611,412],{"class":208},[202,5613,5614],{"class":394},"r ",[202,5616,1394],{"class":208},[202,5618,5619],{"class":222},"Redis",[202,5621,409],{"class":208},[202,5623,5624],{"class":212}," Allow",[202,5626,391],{"class":208},[202,5628,451],{"class":394},[202,5630,454],{"class":222},[202,5632,403],{"class":208},[202,5634,53],{"class":222},[202,5636,418],{"class":208},[202,5638,5036],{"class":394},[202,5640,908],{"class":421},[202,5642,409],{"class":208},[202,5644,412],{"class":208},[202,5646,5045],{"class":421},[202,5648,418],{"class":208},[202,5650,422],{"class":421},[202,5652,425],{"class":208},[178,5654,5655,5656,1439,5659,403],{},"A fixed-window counter satisfying ",[199,5657,5658],{},"auth.RateLimiter",[468,5660,5661],{"href":116},"Client IP and rate limits",[5663,5664,5665],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":197,"searchDepth":385,"depth":385,"links":5667},[5668,5679,5680,5681,5682,5692],{"id":184,"depth":385,"text":185,"children":5669},[5670,5671,5672,5673,5674,5675,5676,5677,5678],{"id":189,"depth":428,"text":190},{"id":476,"depth":428,"text":477},{"id":531,"depth":428,"text":532},{"id":832,"depth":428,"text":833},{"id":1131,"depth":428,"text":38},{"id":1307,"depth":428,"text":58},{"id":1444,"depth":428,"text":53},{"id":1801,"depth":428,"text":63},{"id":1994,"depth":428,"text":1995},{"id":2245,"depth":385,"text":2246},{"id":2615,"depth":385,"text":2616},{"id":3022,"depth":385,"text":3023},{"id":3463,"depth":385,"text":3464,"children":5683},[5684,5685,5686,5687,5688,5689,5690,5691],{"id":3467,"depth":428,"text":3468},{"id":3870,"depth":428,"text":3871},{"id":4136,"depth":428,"text":4137},{"id":4342,"depth":428,"text":4343},{"id":4554,"depth":428,"text":4555},{"id":4831,"depth":428,"text":99},{"id":5133,"depth":428,"text":5134},{"id":5266,"depth":428,"text":5267},{"id":5554,"depth":385,"text":5555},"Every exported type and function, package by package.","md",null,{},{"icon":171},{"title":168,"description":5693},"T25ZfMaVJyFsHZESYnFc_bzO8edv1Pdcn6BkKd9eUzI",[5701,5695],{"title":157,"path":158,"stem":159,"description":5702,"icon":160,"children":-1},"Cut a version of ezz that consuming services can actually resolve, and know when a change forces a major version.",1784970049072]