From dececb84c1912c7adea72f9798a136abbc15e366 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 29 May 2025 07:50:41 -0700 Subject: [PATCH 01/77] docs(image_edits.md): clarify proxy version support for image edits --- docs/my-website/docs/image_edits.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/my-website/docs/image_edits.md b/docs/my-website/docs/image_edits.md index 8e71764c094..f0254032964 100644 --- a/docs/my-website/docs/image_edits.md +++ b/docs/my-website/docs/image_edits.md @@ -14,7 +14,8 @@ LiteLLM provides image editing functionality that maps to OpenAI's `/images/edit | Fallbacks | ✅ | Works between supported models | | Loadbalancing | ✅ | Works between supported models | | Supported operations | Create image edits | | -| Supported LiteLLM Versions | 1.63.8+ | | +| Supported LiteLLM SDK Versions | 1.63.8+ | | +| Supported LiteLLM Proxy Versions | 1.71.1+ | | | Supported LLM providers | **OpenAI** | Currently only `openai` is supported | ## Usage From 7dcfde2a1c5d14be018763d5468543cf5f865ef0 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Thu, 29 May 2025 18:27:14 +0300 Subject: [PATCH 02/77] fix the litellm CLA reference (#11230) Signed-off-by: Emmanuel Ferdman --- docs/my-website/docs/extras/contributing_code.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/my-website/docs/extras/contributing_code.md b/docs/my-website/docs/extras/contributing_code.md index 747df5b60fc..8a617431960 100644 --- a/docs/my-website/docs/extras/contributing_code.md +++ b/docs/my-website/docs/extras/contributing_code.md @@ -13,7 +13,7 @@ Here are the core requirements for any PR submitted to LiteLLM ## **Contributor License Agreement (CLA)** -Before contributing code to LiteLLM, you must sign our [Contributor License Agreement (CLA)](<(https://cla-assistant.io/BerriAI/litellm)>). This is a legal requirement for all contributions to be merged into the main repository. The CLA helps protect both you and the project by clearly defining the terms under which your contributions are made. +Before contributing code to LiteLLM, you must sign our [Contributor License Agreement (CLA)](https://cla-assistant.io/BerriAI/litellm). This is a legal requirement for all contributions to be merged into the main repository. The CLA helps protect both you and the project by clearly defining the terms under which your contributions are made. **Important:** We strongly recommend reviewing and signing the CLA before starting work on your contribution to avoid any delays in the PR process. You can find the CLA [here](https://cla-assistant.io/BerriAI/litellm) and sign it through our CLA management system when you submit your first PR. From 974c9286729a690f7f193fbc0ec8e39397735ebd Mon Sep 17 00:00:00 2001 From: VigneshwarRajasekaran <91361461+VigneshwarRajasekaran@users.noreply.github.com> Date: Fri, 30 May 2025 00:57:56 +0930 Subject: [PATCH 03/77] changed model name is request and updating to latest response format in proxy quick start guide as 3.5 turbo is retired and leads to error when a call is made using liteLLM to respective Azure-openAI endpoints. (#11223) --- .../docs/proxy/docker_quick_start.md | 101 ++++++++++++------ 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/docs/my-website/docs/proxy/docker_quick_start.md b/docs/my-website/docs/proxy/docker_quick_start.md index c5f28effa46..3a48f8a28f4 100644 --- a/docs/my-website/docs/proxy/docker_quick_start.md +++ b/docs/my-website/docs/proxy/docker_quick_start.md @@ -45,12 +45,12 @@ Setup your config.yaml with your azure model. ```yaml model_list: - - model_name: gpt-3.5-turbo + - model_name: gpt-4o litellm_params: model: azure/my_azure_deployment api_base: os.environ/AZURE_API_BASE api_key: "os.environ/AZURE_API_KEY" - api_version: "2024-07-01-preview" # [OPTIONAL] litellm uses the latest azure api_version by default + api_version: "2025-01-01-preview" # [OPTIONAL] litellm uses the latest azure api_version by default ``` --- @@ -127,15 +127,15 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer sk-1234' \ -d '{ - "model": "gpt-3.5-turbo", + "model": "gpt-4o", "messages": [ { "role": "system", - "content": "You are a helpful math tutor. Guide the user through the solution step by step." + "content": "You are an LLM named gpt-4o" }, { "role": "user", - "content": "how can I solve 8x + 7 = -23" + "content": "what is your name?" } ] }' @@ -145,28 +145,63 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ ```bash { - "id": "chatcmpl-2076f062-3095-4052-a520-7c321c115c68", - "choices": [ - { - "finish_reason": "stop", - "index": 0, - "message": { - "content": "I am gpt-3.5-turbo", - "role": "assistant", - "tool_calls": null, - "function_call": null - } - } - ], - "created": 1724962831, - "model": "gpt-3.5-turbo", - "object": "chat.completion", - "system_fingerprint": null, - "usage": { - "completion_tokens": 20, - "prompt_tokens": 10, - "total_tokens": 30 + "id": "chatcmpl-BcO8tRQmQV6Dfw6onqMufxPkLLkA8", + "created": 1748488967, + "model": "gpt-4o-2024-11-20", + "object": "chat.completion", + "system_fingerprint": "fp_ee1d74bde0", + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "content": "My name is **gpt-4o**! How can I assist you today?", + "role": "assistant", + "tool_calls": null, + "function_call": null, + "annotations": [] + } } + ], + "usage": { + "completion_tokens": 19, + "prompt_tokens": 28, + "total_tokens": 47, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + } + }, + "service_tier": null, + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": { + "hate": { + "filtered": false, + "severity": "safe" + }, + "self_harm": { + "filtered": false, + "severity": "safe" + }, + "sexual": { + "filtered": false, + "severity": "safe" + }, + "violence": { + "filtered": false, + "severity": "safe" + } + } + } + ] } ``` @@ -191,12 +226,12 @@ Track Spend, and control model access via virtual keys for the proxy ```yaml model_list: - - model_name: gpt-3.5-turbo + - model_name: gpt-4o litellm_params: model: azure/my_azure_deployment api_base: os.environ/AZURE_API_BASE api_key: "os.environ/AZURE_API_KEY" - api_version: "2024-07-01-preview" # [OPTIONAL] litellm uses the latest azure api_version by default + api_version: "2025-01-01-preview" # [OPTIONAL] litellm uses the latest azure api_version by default general_settings: master_key: sk-1234 @@ -276,7 +311,7 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer sk-12...' \ -d '{ - "model": "gpt-3.5-turbo", + "model": "gpt-4o", "messages": [ { "role": "system", @@ -312,7 +347,7 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer sk-12...' \ -d '{ - "model": "gpt-3.5-turbo", + "model": "gpt-4o", "messages": [ { "role": "system", @@ -331,7 +366,7 @@ curl -X POST 'http://0.0.0.0:4000/chat/completions' \ ```bash { "error": { - "message": "Max parallel request limit reached. Hit limit for api_key: daa1b272072a4c6841470a488c5dad0f298ff506e1cc935f4a181eed90c182ad. tpm_limit: 100, current_tpm: 29, rpm_limit: 1, current_rpm: 2.", + "message": "LiteLLM Rate Limit Handler for rate limit type = key. Crossed TPM / RPM / Max Parallel Request Limit. current rpm: 1, rpm limit: 1, current tpm: 348, tpm limit: 9223372036854775807, current max_parallel_requests: 0, max_parallel_requests: 9223372036854775807", "type": "None", "param": "None", "code": "429" @@ -371,12 +406,12 @@ You can disable ssl verification with: ```yaml model_list: - - model_name: gpt-3.5-turbo + - model_name: gpt-4o litellm_params: model: azure/my_azure_deployment api_base: os.environ/AZURE_API_BASE api_key: "os.environ/AZURE_API_KEY" - api_version: "2024-07-01-preview" + api_version: "2025-01-01-preview" litellm_settings: ssl_verify: false # 👈 KEY CHANGE From 9a82a695930b9ed960d792e4d8fc73f80d30e2ce Mon Sep 17 00:00:00 2001 From: AnilAren <124668281+AnilAren@users.noreply.github.com> Date: Thu, 29 May 2025 21:01:05 +0530 Subject: [PATCH 04/77] fix: bedrock ai21 jamba models will work now (#11233) --- litellm/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/litellm/__init__.py b/litellm/__init__.py index 787c553b6ea..f84d214059d 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -376,6 +376,8 @@ BEDROCK_CONVERSE_MODELS = [ "anthropic.claude-v1", "anthropic.claude-instant-v1", "ai21.jamba-instruct-v1:0", + "ai21.jamba-1-5-mini-v1:0", + "ai21.jamba-1-5-large-v1:0", "meta.llama3-70b-instruct-v1:0", "meta.llama3-8b-instruct-v1:0", "meta.llama3-1-8b-instruct-v1:0", From 368e59181d1a23ca2b9357bfd5c3d194b0dfb862 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 29 May 2025 10:59:59 -0700 Subject: [PATCH 05/77] docs(entity_usage.tsx): fix bad link --- docs/my-website/img/enterprise_vs_oss.png | Bin 62493 -> 427728 bytes .../src/components/entity_usage.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/my-website/img/enterprise_vs_oss.png b/docs/my-website/img/enterprise_vs_oss.png index f2b58fbc14a82d18077ba777b9e97d6a136bf8e2..2b88bdd33ef17f08a36244ae3470aa4758eb1aea 100644 GIT binary patch literal 427728 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

_>g2a@Km2STnIY)8-+S#bjn)dNZu~;pH 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

DI?qkD$9}G-XD%qH#2PgbOq%L(nalv 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

|=(>F4D(qw9k-ir~mLUXMp4) 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 o1%L4BBq(fkfzMy0BeA&0RR91 literal 62493 zcmd?R_g53&_wP?H(gH|_gd#=hAU$*tK@co7K{_JRMIcD%EfAV?q$Aisx^$5eLX{xW zrG};;flws$JG|cIe(oReU3cB}{XtzOGjk?$&faJ5{dn$)Gr6lrcZKr`5fKrc{%xK6 zL_}m^L`1}RDhl8e7F=%*@DH{3ZA)JwA{yq)Kg2|@^Voq8iGAeZL*}As zq)9|nlT34JPfkR%SF5k1`4C3@C!aF?YR_Q<%^oICfI{c$5b?c-s02%C${}Lit5TF# zr6aDeOAEv^g2;P_;u(jCSy))4C{cL=3u=dZ!(SVI=j7)Y)zxkL4(Cnh<0>m}{xJ2L z3o6&YZND~@Lu1~?^9cXU7XPRb`}sadi;6GmUw@VL#j;dQirNU|-gK2w+=>$FXSjhX zoD-e*`~VZ@{`Wz^;X2yb?s)Ui?dcuEZ4fzkm7wH?_up4+J?Uk@5cbK!l7QNy>lkLMKOn`1XIt zD;au4bnU-axwrQJ;&3iWCK0D6+h6~__Gp;y8p@IF{!@o3ID!x=^wWfv3PaEPt(Vu2 zl?svy8LXKvwkLafH%Ks{riFs~nZi~%%NLu<$#SOhu?@yHg`2Yuy!i_uC*r4s<>bu2 zr+XL(tA$;-!I_}=Mc&|g+d1&@&JSbt>5~W=3HG)8fO*4tKJ)z3v%>}dEy=H^4u@-U zz1+Sl!Cvi@vjLUOYXjE8QJ|935rRnma|lGRS0zP$Z3$Y1WFN@iR4WLX`8>U||E%Ti z-iNgNf`uU#=0_v!_o!Ya3d#N`xN$(sjJ=z$Jk7wCw(B|961~;%vvO1^P1u-TIRC|c zi>JlWf8auM3bWqYWw8{xD*GeavT44?>r;-&bPMpkM5E)A{ol+J7LJJ~lhD6Yj`ma4 z_Di7`C$<*P`vtpmTncg~{nGKBl#qJJ;o0Axm&x8FI?zE@c=58W#JH4y_#ti6MQ%~xtqqV_%b+j z|GVB2n#+sUs||l^Eu04GWYy@&qa1+aX0?Um$B2(H>KELeEx+GNg`C1Rks;#SqE&6R z2S3Kmti(-;1U@mS5jrY`8Q{ii1wo#hcXB;jToo6?NbmQ^0%ky$g_crlIl;Ad15@XL zY5qKEqrx4$|2^=rdF8UeZs?G7Z`5}CiNui7dfs0SkI=J&$yn#C#|@*+38L(fnv|=d zXp46r`!C9?+Mg{;9UGaR9!%QG-z|a4$)O3r8tLBtdf~ZT7&8>Op3i0zdggcHdGPDI zfP39H`C^Ihz=Ymo5&TVp){fVtWMw=>NH^cz#UdqVbn@BMZ44Jf2}`jC>pRtXYQZf$ z>y$qEeiQu_Njun?N zv$Z(yTTkGSeRiho#pPvw9{Rg1>xokGu@*Opy28Tlad%Qk4KP=+ospDQR#J<_3wRBu z>Y>P>Un9l#RbT$rc5bH5nTv>z?ie}Z2=OYmh({PiXX*X#n@`aCI9 zuCaKy5VZZph-#(14H``GcHd=&(Wn2%K~Nei>6}0^RHh9W<*(g3H^p7rB3#R+#Gt}f z5oIe#E1e%@fRp|Z;we=98Yid*^T>|2V7|2tA%plOK*%q>$ch3>Ki;mHe5am!o zO0CnK=5g{&z6vu9xKVH?FTET%&CvFHKjlUgrFvD<-4I}2M`|4P%CpL{Y+7y&+-mO= zsL~p`h5V94`Kpm7^hZ0DM!%+r^NSy5>R&;JlHizFNJ!J;WIuXR*YkP1NII=n|1HBX z`)b2NO#NGO_Eh?fEa=yMvO2{k_8~TTY^0fax^PMYa!aSYrxQWf|-!k&?K` zat_i5l}j^#$547;Gupm4tm0uR(XPOHry@n(V`j|E_0q_^0i%hr`SLQS2XtWk1rjjp zvjnVrTEMRl!~#qBwM#*uJMF!`x-Zg+$xlzrZ33M$_t+)9lO51{_@*oDUrlUXtDG|} z(G~h1X%3a~DCTbwxp)h{<)!=NOR+WPwU7yNPJt_YyTwlVnv;**#83E^_2OBG!Hb@w z15r8SX}YYIC^O#EUfQ%fLZibf+ii}nJETo`G?#g8*L(f=gH4I6;2V!yUPwQ%D}vI( zL{vg$i!>f~K+ zKE^F4t9z1~bVS5WmLMgbF)UbleHlOZmm1W2QBvrrf71bls6Id5bV;%e+WKr?)5BWV zmL_REo|h;;(`R@geWW|p)%CQOC*Yq48F`-rvMT%cJK_CWF*G6E+eO<6q06iz(RjO( zejiz0*>YoB?UiwBZ((n5pk9>I5SEXKw=mo2XkI}`e9pm9QLq?Oqxft2K2CdKzsAw% zu&jRn=B=w*4|V&mXjDLVI{wCD03*rDA*;iZ(|Vd&*ptgTu7vjv=y4Mg_F%VV6dwi5 z`MESxy87n15g1qCAr&0f9-qg}a`u`EsMQ&SzzthJ8ynk{a7cCgF0zw6ebx3kIaRww z;$2+pc1*JR`PA-wTcGcrb8jBIf*^+3Ot(q+UZs)zG>Rg|XEsOL5j~ZB@rT9Pqvdqh z9x2`+MO^ZbLTRPgwA@U-iP-vmpMXhYwxaB!>-UoA&#KM?3Xh}MD7q@FgHN^^*C=jP zgt2dYGRl=-n)Sudz03E1osaw=FHL=_xxuQsPkDTU)L^^3?T4h&;a1~90}C6tp8n7; zOY-pd&awQm44IL-Fl*X-u8oLV*;`sv9CFXn6DONu zT9(>pW6!_2j7>NBEO!Cs?D`v@zvJ`nU7^=Zg5{Bo_wZ}CO4m%q#bw1~He`bJ9Uf_l z(yuZ$0etctpxix++ocjm3DNqvWH~cW+0GQIzQj-1zWLEcDxJxk1_) zg3mjNY6<(W`y^v7&l;7lIH}|ZB4GmSVrlpuCwReL@=g)ZyWSkAq zy%1R#crm(zDB|XImEcHTjQ%OHVdxtMhiIJzyOCccBOl8vpSem&m7f0=AUt$r-8$$U zxMN*-uE6k;LaH6x6R5}S6Gi=KULIOR&CO1kM6v7hO>WW&OI%8KRYbtqQEG5e0|?oV zObnIalo62mKn82{;M@36K&JKr@{YAw6_%R20=Tbuqo(14*;11TH>xc#!Xd<`8=L zT=Mt_5T|+Zvv#I21}G*s$qDCqYoT8vgTBkxLm~uRQI32SpFgk-FU^xVuPJYkhsQ2X z?=zzfth>)t6&21ReScS#Vqi!arK8fs6BZJN<+i$EWl;g5?*Yeux7;Fbg!<;4$cDTq zm#7SwRF-5$7Noy=eo|>OTd1qWDiwFIy#6dfB&shqHIbN%mLFy(1&V_>RmdMP$S|mx zvCMXLeY%xhzvtM`0A7E4)`wRjWxMJP&a5nz4O{9&B`fYM->tR{@wN=qjy8^H>Pm*H zFScu&dMvUEw9P)ur0nIUhIs9Ao&+;@uL0q&Jj88yy>s9SB?IX|(6n>bG|~HZN`;Qd ztFNLo$viL`z2-ISv&v+j#KuB%G$mbk7oEeHte*D}NYg?(iKb7A)+348MIY@O@AeO{ z@zayy&d*L_f!zlUu9Oh!`56WrPc(FcDHwDQ*-7u|h(I!^?x&D<8sa!v*9T|XN^FH7 zf2iQJB#)a6ar6Q}1ibX%# z8YR4UfHNj1gHjFb;V4+t-|BBdH)cfUMMwvk11JUF@~yMdEXTeQ(0gr?`nLs$T8(y) zy+UIuNQW_1EW=rJ4gJ<#^)d!&3de-y$q{ z;pyDLjwF|#!2ugLre4lb#&&<1d$h!s2@(sJZg*j12v2vb!D_<7VQES5(KT+Hu{Yg! z-4W?4LCvd~b$bj`p`pmb+tW>yzKM!W^2<78w>MH6%IK%!olB+hB%7qo}+@mt^aV#>rYP&WSR`&gxKd#_yNng6uBcsG!ce4}7|@51H4WQgz!aMaaX zb(=wOoz{^`i&0QtF56b0Qvv=JW%iRl5wKK`SLHWuGl*8XZ|OYdLrLL`y0Q`N8lgU$ z5E4}ZA#A1&#J-z`b?H|wLTumaSRYe2EYtWw>4N$0uh8_I+L3i?Cqvt=kBQmFi0e&T zTNi~XOx?jXB6=@M8K8%=zO1Cef%IAo!TyJH0gagVdaQ=}xoTm3F{UqzU4=C(_>IJJ zs)yc4ERJ;3*IA^)6$q908tWl`7{xTa;9=Ly2OxLxr!%|P3l6F{uoBDY3u?gIG)VJX zq1+Ngbe2m?#lzUe2pdH4isf{t?2)b1;U`tSt^D3#Qc&d`SucvvslCWeQA(Y`fW7-k zC+k$A?{V#^=*8Z^D9D@VIuEr}fj6UL1< zaxyrNiAZ%QbfHc)A01Nus3eAO*M=AM6(PczCS{8F9)thZGkc(mV&wbfEY{dXbu5^q zr%D!NI{eZCfFx^G*AJ~nbxTbRtCV|-Z&^TI%Wn6ZG;XWXwWBmE2v56jSLerZM_5+v z7!&cPI61lP3nQ+NdDY%JYFx?#i?c-pj0?^)N^E6(;$fTy30t2oK{qnmHS>S45%OwA zPcOF2*7qjmjVPvpX!dnhg@mf9o_HVTb*8Vv)CW;+s%CQa;w8+E zE$rwFIHmPzu^PuFGn%+Krl%FwW_x=^-x^wav80S9fbemc8Z6&0c|PJ<@`RH*-rFrJ zGzyB8OY32z^wry{ei8386WtwkLbQPhuf*s6D60mv$#QjZX(;(>_z!jqscgHVCADoR zH+$)hcAs_%W#P&0a~pYLDgrTOXbN7Nv)4T?lsjPBnazrNF+4h_j^PQ~l-8S&02x1y ze_MFUm>ht12wT>S?H6Wvs32XIWPP=mp8a<9@%@FJYGKgLKSoZ{m^Y~A7 z+5pR+RcN+C?Yr0S$qK3(WqJ3h>I%_hl#`v^Kv8(RI&5drAoI>;ihk*p>yNghzXMUaw0qAI!v`Jz!atSL3g;=x!Rk8Uc17mhvybA?eQl@Fv)GE+cL9 zZ>zidESnU9578&|e!nA}XQsYkkb8+KsEak686PSEqOO((IacymuY7>|V9;g3$Pi}j zeb>Et`HYL0WsrZ=7%7)yJfja{mi)4Rzg(fc5!Zs|=bdoo7WT|QK0#=wr|ky5CvJS{ z@~59Y^W~~aVpAGjB4ad2-{27u3576p7FM(f?!LnMOfi$SVp#FiVj*B5_-~l~PG@A~ zSB?aypxc^%3Tf2(lg{FJbSQD(XoS*nQDT zfqZvTKOJFQX8?(>z3NmnP%gS&hG(3>P-!4UEClR6b!c&8l!kjgc0IN+h>KBFb6`r2 zmc+nja;1qJ!g>{SxNp1&7o&CrM|C@$mcsQnRicxopC%_bo9J?ZoRk~-*1&4FcJbD< z>rycl@izzaqeanvVD*6j8f5Roqqke$s%Bd0aT=pzlqH!oiin#DN1zA((@{FH^_Vn^eTV3W9Jon&d(Sr&PNR&Nu!(){TQmJ4C6{Qr+!i;KI@} zbh$G~Elf!3H^g2oA+8A{6#s>Z(|SVHXmQE~p1~=zFUObodM*$*s2*mo?RJn2EWK?= zk6s)s3v1Qq+pmu3yCB4$Xje?ZM+<-HL3b>r9dt3`$kc<_j^5_|>$vIm;FE+SxwnmD z9FBpM;FkLhGnCEUxqE zypn_rZFWik{>tcjVlwP46LX9Y<1*6q$J=RCnh&!h^0+q1f4~(^wt{3=wn*i@Dn-92 zJCold!(eVAhRZa~-z=wDR`n7^E0DP*{X~n`Dy?aLO}iHT{#t3WpLHta1{$956^@tu z1T`(=={_ip{Y(G{{jv9ShN~m48!YS*t)Ws-*jyjJi<3&*`b}N7$LTdh&xsRmUjN#f zSXO*l;n44=(ExAue7kk@-NB)NwhtXSqDu+}ofizYaa;-RkVe=GCWc>K%btx4X9(OC z@1iMtOC}(BM@DrP0hdF>c9>atnEqCL@)mKm{Yq+sj7gt=k(^I{M^iG$j4Q}&1s7E`?!!F#H`bwN1h*aFa+s;|YlHT@JJY-Sh zd|D#?=B-3d=k|5A6yjvzp0KoV)!%E6l$=dgR9aA-Z=-=ik7Sv=T36T7(RyK{%QYHy z=sLT(6urpUWAt`mGP!{orY#1lHbAi~Al5N^g~O+V?c>KgZN9FLQzq09zU>D}&Tc;& zJOqnlrI{qH-($DKmV?#U5(akeE4K>j;_-g|}Ijddd-whJgJ=1$|gi{}HMIu8mQE+4OKSkz4RRO~I7RV+pl zC3~3A?!VJ!P#yDcv|H?rWOw5l8vo$9t1U*Jv^U(HE#qz}EmFF5*4ZDK-QwU(byyj4 zc5K;UxRFCC?gO9VPp6b6^%(fYPd~}eDgD&G`Y!L&2(DwZwlTJ@hixtCqBtT=`QOR3 z4-pSc4a(C2XZ|eqJ{Lrq9;?(FL6OTY~9FUHaJUsH{})|{}o3g))OlB zZwpOFvROse3F4L-=;*WyB}ytfjg#dFbW`e-ss)Jnpj)CIuKu28b~&}H>dk-bpo2GB z{8r7>VsT%$&=w`IhgiG8!@3!M1MwmIGfuF~q_wXR`bD-ryk_lNI=M5XZrPoId9-)S zJ)FDM>=nJFEuF@Q-HsMF=SFfYnw-trE|RSws8Gs2f{vT|c`T??J8IFleOWJ$&8&S2 zn>t188mQBOB}V(_OZV8Ybw_$HU13~Xh!2l>cQ2oq{wy|w#esRpMCXM)sQXGBrO1lr z;78EbV8`p14nP0GxDHhhXMgy6+tHYTN3-`*3mBZ-vufh~7p+Hmsc!D5;~f5Qhi|eA zt!J;-=0>0N`G$&xve!H6>R1h5EckzRO<_RYp!m$?)m8(>X;FQ@EduNUu1qvfSNdLY zl#>v(t# zYo)tb6CJnWNJSOnou_O%NkBk4 z^BUKyknm}ilyk|(`tW0EShwKY-WM*UAT^iMTeD)gZ?KfPzhUjS7S?;@5D&$mb-aDq zKg3_cR%@$&T(XN&O~vqC$6fi3znL;p;upAL7KNc(+PoPS4Z?HaSJ?Vpw;_R z(oL^2v=JT4E_$Pa8^3rB0=2GoAP!yh9op<_+!_*29{-Y5D@`EYZ86h5c_5K=Pa+id z%5&E2h)nf``kw;Tpc(B9WvuR*w8nnG255=GKABkGT2g|9Z$nDT4%9Uezs-bh^`bFW zkuBO6pPnvdi zTXW5^&e~goD}eW{J+%(4=thRWo<%bOi`;^;h3@LBcse!~m8c;unx>!RPG`Sr5%?v$ zJox>Mo|Wb8G;b38Vf40wnK3GSMV5?LtnX-{@k4L0Se9bhKV}zMP1J>rWZ|L^J-zMl z_caAW7m)YO1fKqS+x%^32VI(_Nu(ZMaRX&{W#}U%1JU7^#HHfi$e6`A!sc^&tK7Fe zDgETmMTSS#dX}e9T(qr}I(CI`c=Dbek25I?g`{=&$ArlYBt4Jvi)vGG!=QeZa)t^j zUOPbuZH3uRpy}EdXrIGosY6vaK#2gwV@Wl*UgBVh8#b`FgzUW|Q#I@442-9GWx=Qg#Z5_A`~U%w58;t(y1#NnJ3! zH;KnX7eU;{022{7eD}#R`s08t7gC7g;mQ|zv3UT6rV9a^7?u;wf)Fz_nR{If3gEy_ zNrm8Dg5|N<;wHZceV^i%@r-7?7V~SeYW%?s32Ljf!>$VY7wHQrUy8aWZcZ%gtrr7JG3uK#1c+Gt-tEpK*k)sXh*e5d%je)?x}pd&;im9dX}ZO zjZB?xcl=jOmou%gx_Hxf2(ETVMR=0I<&m9oNPQev_e$Q^X*22h=by9N%ypj^rDd8m zyg1v_BKgXarf2)<c56bHmABUf*WZRhjUO!O=f#d zzcN!SQV3kZksD%ay5NS~3Q*>ct>1Yv_u`J|{ z0w_pg^0N^5L(`nJ-hb{5KJJmbvG(TUi`_5AH4DWn!%ofbe@mBLmUM1%RuDa$1VQna zMK)jaA#>?hJ&7N^7TW#W8ls6VnLFZsWLUj>LO7D$^NyiZ+`Z=jj+^mGOuqbTRFlM{ zpqh&`lGEnv`7ZL4XFgC9u}?FSf2CA*N$5ER6OuuJ?3DK8C=!m`Yt_qTXuXoF_OuuY zThtG{kseS^sTr|zBpR2ab&&E!zssLeC#xS+Fe$h^Sw|^C1-dLiLSV|v)EFTn%_ImI zyjqcPBYWvj`~bK%>Hn!0=$`}5`8WFi|CL_g|F#-pOhwjZcxbau3&Zl+xZ&^ZlhcLJ z3%Z`SfKotfg@3ZHQLNGN66ncvSzC@lk_&&P%YLtRp&M2jDu< z&1_cD@j6gE_3C|Vn8PGw^!nx4tF**@Hq@%oPTn(= zoA;$sLA%`SQx~UO#VgCU+ezi8N4;(vV;}r4s=l5pp91XN{`_d2VNkp=Z?16NI?o(f z&?Q%0WggsN6^vw1t8CjH*xBi3__-30q_kGuNmY2Uhfx=TNj+8iU7DtqEAKI&Rdflr zyL@_i*jO!{7)2r50G=~9^P%Zn1GFBEFA2Zj6?R?nM+Z$cSTNtIH5}g~&s&-lNX$35OV443S2&nrmT_)phaG&r^*xKGB03>Qv*?ciHjK^=PU!3}? zoPXDYIHPI%Z(2Z=_l9IW+)H`{fM-+||HM=<0;x`G0}fnyRgGf069s4&6l9w;qZXs3 zI*YLB@!=ythT|E!zWnIHfK;dLvkzrmS~TKLt7zcd_7???3&O^T&t3Z2nb(>;mp0pK+*`kpXsb`1Qh4CD&ZRXh39lhA&FP{YJwn!A~9Txl4-z zrj^e0oLH0?p5grZDiqLa(n$s29wi9#^i10bv7yXnnQ`vZDW*4gw+Wq}k1x)%k6n6H0w z9KPJ`7w!g@{xcGk%%B+aU6rkybx!?)FVj^3F^ev{ihsp;Y*jt_Ps?Vd{hLJjT1P-x z^77J!Ka1Cc1dmx)fuL~;?WHwzW1afj96%NFXNG-8GvzB}%%M{BtrK8ZoJ95UCqfqBgdTD~#yB`AOy213HXxH^nl@#9v1A&OvN zVaa>i4MnJMy4H5Q02ZWKZ8{4uya742h9FTF*^_T5Rr}PlZU*(JZwd>us91I#Qc!6O{Tj0LH@=gOM0b>_FL;7ON*bZLXqQ6TJo~y@nV+Fgf=0Zpx-5U+&A64# z8+=Gop#WzQ%SG%F9FwP|;YS>XOOu$6KR}fLLztYrc6M^8;1jFK8QBle_m88ziQ!9t z1j*s;n#CtL;EtB!gbS#CdbWD3-twDCK^(Ji44wQ`2gUWX8)SSWS7oM}mtwevDvoLg zC1j<&K~v9 zVaKR|Y9_DZ!LR@ZMO+fxPg?lBopx;R2#gMg{&pFAx1QgAOa0APeKIC3#79?=Wr2e5 z1Y`CKyP9s_OnhoLKM}^Faifejsdss4TK9;(4uyHqF_*iphACAn;63Q-;&!}R5C{l& z^5fL|UoJJzv}h4MGq3SJ1UAN>s)6lT`ibmMv6qE0A?Guv-PoJ0YSquW$;Lmi!A1^o zb3ZAR4|rCxPMCGrL}@5E3=wrX^bg*Co_I7!MhfUKta*i`V8jD`>$DN@)a}kv{lXx= zD^iTx0QnajOn8%|JRtPjlXHugicf6z`Ji~im36|GKGDN2OhJ&h`Y7+WLCLSP6wm&Q zWspfz+>2qkIqWr2Vfl2S{Y!JRxXE`lhKDQp`oTt@>9lf?0xNMunEvp*!(>31Bw0GH z+ADn^)Fgc*#G`X{v~2dz6EqRaVVh$1wer+4mV?;$GB5X^mW$4i<0JgHzrTt7tSU`= zJIitZfsTNgxb$^BUXtCuU{{yQo*M~G`e3)%Hoj{$&*Sx5t$bc#e20~KllXRF3+wEM zaKLXGb?|4BxC(H~JWUEvC{Fe^Zq(2cb6Wfs^cu@}IrKC~;Qr79qX|#JqisX#Sz^I)JiTQDeR;NVs zcCYt87Wx8*wnA|X%d}{9i$C6~zjqB+Ex&1*Gl|s&p0|A71a?}lLg7Mj8+AYoQ)mgo zi>+G5wq|d~U%&JUSDbm~GGq4vO^CZWg-`-maq96i5Of~!zb_%PQq>(FJA2|_2RGsv zpgS%ue(~XS#FRX2{1%Mbh()NwY#!hqggB)|EbXIN3_I*baZiR3WTo8(Z2Tl?PlxS; z9*%0cH!Vic`~l<57DK844bkN6MD;U(g5}nFhoXw>HO9$8pD-n7cf^B#Hy`wIv;4k$ zalDz=Sws^Z{$`s~i)Sa`_3e~T>fRFNrRLT?(R3TPDH*BV#3~#_1P*!+EV^JOu0;jb zh&RSE1Rd_~aauO9jc`W`%6sc$st3PVb@r_`6l3-{o;oB(9k5K?w2Q+VNQ^;t~b1FuP0Bs1bEFv7g8SJ(ih&d`0-QNcH7%~DZ$a!P<37iC3Q^aB z;t=&%@>oLMM|r^_oWr3Dn)@;v`fzW81Vlo~;4id^PonjtA6j8<%srmh9gJqTt6uG- z@eR-Jwu^br%X_WZ5TQ*aLnT|0z9ipGM9~?i%&z?6eg0rkTqkq6osA2b#WgB9QsIRj z>dh+w+wq!GyzFu%jCfxQ({8o`xHO?F{#t_w37H^;Hx)hAbx%Ij1?}IySjxy4xc`s$ z8{APs8_1UHPUaukQ8W>nsS|+A)&0pj!n_G=f1s_zQN-V7x0)7JTiJw-H>;|s9F<4# z&Bs_H5#5>f6;Ju=7q7(htwnx!%K307BHEEWiiVBUA&O^q7Ni?P$MvKOGSVmk0JA|^ zPvo#Lh2RbP9>j#DvU^1fZF<5HqF43CU0|3-LYZHF^feD`-}z3Jl-o zkR{0~TmT@JA&1vll;y4kb8z&5*i)&>C0)yA3dT6{cy`>fO1;dJ_ZvB}Qmfu{m}{3& z`Iv|sF@l{hL-k*G&Hio&cj zEMU~ZBq}8m6xFoy7K0#@SX-=2i|P*^g>%-qNwRHIL8L8$d4-x-=t{yObL1k(NhO9p z^n0nX@_><4<{t<>F6ljUMbI_PV%`u&6DDc&T&)AUVQPTR)hIEt%4=ieK>YpSw=9Zw zR2%xJQL96<9xwk!eAZy_llLfZN?G@3DrMZR9vAi*Wj)QII*>6Kit!sAtK&1P3zj&C z13IZ3@WYW%Hj+tZUt;`q|8HGilAk{)toUP=A+biN=L>!%lahJ(U?U+!C-CTQYZxGg za4_Q>AW&J8X_a=W=D0}GJcPPgx-W4=f>6F;J;GvsbI<$dW-LS&AF+P4fG;+8el86s zzaGI>`CY6-QLSNj-OCj7ex*((N%&H;f9a4&5gFjVCmdMmd)eHwffbUo8EDEIYL>>` z!Xt*+If}9(c%m=TxRBM~%Cyf3g>H-?ipc?^tFpL6xjS%mHND#oa*1}t3+ZL8Y0i)Pv8q8txV#L~@~H(f&w zN0ega(Yt-yk-1l~oUC#cWC9=URJB$1LXBRZ2{e=)=u-T_$;U|DI$57NNDNyWqdbT` z;f*|k9V*R??-^P3NM{2-{}e)J55KDZ<}8054QN%}C0TEH&pG76{5Mx}hI|v~q^elopfXzk4lxxXtQT#E~s_Qa7y^lo_OMhlCdu4q?QmYeO^pX5( z0r#$1y{<7KZpQvfIZReN?lapY6e_B_|Kzmo=1o44Arg3E)ZSU7I&pVbb~m{-#mZ26 z$8jh7=I_6n+dzuxIqC8B?C)B9wA9i8cHK$TR_6VSU08#u=4ifb8O~SpC9UC)V*~ez z?Oymh3DngpQ3{m%>fKx@(2$Vh=5__+IJ4foaf5nm)y%6+c=Nlt%LkfA{5eT@7VUh_ zO#vZ${;f1uHbZN&-Eb2>F`epje7_0_YoLDoT?;Pz-<^S|cFk)gYR@}6JR0Zxb9Kiw z6?u6olg*iHl(j741G=!j{$Kb-q<`}wK<_!qMZ^qdOJYx7dAbLZB1CMyT6`%Tf1rj> zxDp=3hwUj(oF%2XHejR{EX?GfHX;eC|E1u5gkyb5mV+)4vyuKp-A8(WJ=&GG`#iRM zPkN{FMmx!bTa&om^(fH}K!K}vN4*Sp1}>`(N(3yBpUxSM@>0alvvcuL@L^L9OUWfA zzO|e5v|c0z$(pHox*CjZ5~e#A#BSkf4J2M%3Z9>^pf0$D-#P%54_UKTyaOka+XCzZ z#@s^{T2E;GvkdP|)CmZ!8_oys{%-Q_(#htHm2=%P5u;)QyQdISss!+n2ntvKdEXO8 z@xTSeT%mv!Z{ZOlxGxMV`5bxYYg*WAEL+7p2BQ|E$8X~Ld9TlZj?b58p8|RW&<-RI zUG9JDpt={W$rPz%-CEg-YZC{@3g|E(B}RN2OTH{KRN>}YbNe)v zX~FoDcjpvzoaxl;)MLz8k_q)ONCa6RZzj`@LU{xj&J`fL)1vp3Z!M*fjyQSq%4{*V zt$J1UVDsnXaprb~d#d{GOQ6JI@dY*6M8$mgZt8yQ-#$6l+mZhEx|u<}!LNuGN_7j1 zB+bUFsu!`=$MnIBa7r1qcXL1|LFEpR`8>)IJO>uE^5rA1Yx3KikXN&>=q53hk>JG$ zqG_RDVQK=igf0qcTFWRq&6uf3R130@?(|!B{JP*WPi26)XA(ZoX(_=mfnmyy4{VMf zzDQ6F+f#%f`TwaJU3a756{^{q`Aidh^7pg3yLd-Y#N*uThnW#&M5I}lVQa%O`cY&j zJt>`GN{w}A7isy`)4w@G0*fYKvpU{yj?=Etx zNm<;TFgud#&mls;-B|{&fd|>K_=l8c*x7@4|Bl+2pts@4>Q?D>yS+t;nzn6&w^FT1 zP1R#~qm-0Ll}4SVlz`0tr(l%wEfC3WEID1PY0uAmS#~GU=QC8{iJAf=j1yv12A<(s z7Y^p1T8IWA{>RvPDr@hAJ~ap#!3cI^VQKyl5EpUuI5`&w?N zue;#EVkE;%Sk~WumO5dyFjrHdeT4B)OpRmjBZz?dA2Bl)GMrP2vD&X*sx)^~!}FjpH&ZisMMFm*{0Lgkbl3POCbFt7Sk`6k_?a3Tqmhne4Fc8 zyL&IWUs=d&jF^P<@cE$F_8nSfjz5e#980v{6Y{kcV~_XqwVL#1aPFUp4?80$M0v4- zuZ&URI-F5#I->6!dy^XSB}gaDZG+{Qceu($+S#bo5yAM6QhquMK5k-S4T_;aacJNU zk;CHLTO%&!d2daD;EmVN`-gCKtIy9&SM741rv^A^NbTrV^BeJomflhMZVV)wPVa!Y zt*?8=t%@f}5ldC4gT9ir4$4HeKe&$J3%Otn1;G(>Y`r&Eaykex>ty^REB$F(O2a;A zUMLdw_7$r`_GI!xVSXp6kSvxKQxuLHT2 ztshR`T>PX*1{6oD(4?A@ zwVyMNzr&*`v`8|qTcoUzh;q-q2Ngcmn=OYfO1q}YABxl$Fg~k}d2S!|0*Ypg)IgDo zJq5J$O$G;dzy!zxFN&xNiu>y0r_5(f`#&Yy($`Wj>+A3OcRj9rfm7(gLggeV>WJwh&V{fh^Tjgm($;~C@DD20u& zpD}IH`b7-B$xS%mkq#LEocPG16zKPA_!Z3p!th-rt~YnUVx?(WKUv)G#dst!_x=K^ zxtt- zV@ATlG&tK?p2@tgY*iKv$cZO4dq@83AUtOamLUj9T1XDhTqt}2y``DwUlS=_+53rJ znq(8ABWFgo{K>j*m4+Sh()t=jj_3EQS)%5TkJiCsKW#&3e^C}>S~>H*Wu(fYn(W2zT?4k2C=us@8S;wa?l3a9t2R9#8al%%$59HA za}Lsv_2Ld`;mp2EZzrW)t?Jh~MUGTQ8;q*1AKt(v6LpCm1)3g_u&s`c8mXuQ^j)vE z?3Kq)LVXZlgxyh^zt}KMrW2S9s+O6_aFL*VIEPB@tz8w}QVfUsK3+Z?@Z%ocP@}gH zzZ6O%LMLl9jDkGZeS_Pw&BlXkgNJ=H&G{y20N+;@k=YL{l7ADs0d7m8436w;%fnGf z1_|2|C?2K@?$#^F`_BQ-`H0^S*-^%`ia)ZT%@{YgRYmMZg=M)XBCoeO%>Re`y}v>p zE+H`5@V)Yxo5ww{$WH0MM?hHrpN+syoczEN`qydyZ#D`4--dqwdE}t~Pdlzftj>WJ z7fZEVCEvGSp1uA!I^+ip6cb;V9wn?7hJJ)f{`|6xajU&syZW{A$9vq_hB5w16rjlalI}8d@{BGN?%&Qro6RR zU!MjC2+$JHg-l%tKlLHt0m|04H_Y`~&W#ngY+W@#A6*7g(R2#4Ab{qX+w=TM()CL)lqtL+`Q&*2_djyP zn_(@h7fw9Rkx=ovAsPS2e5b%~vi~zx;}6+wn18uxX*Euvc2>-j>TwM8KF0v%iIHJ^ z3yT)wxqTAAFM$W66NjBp1`2DsFrf4Evc(*{mhDKNTfe6?Aqnhe#uiRX(cN*v`B!J^ zU1gDdGS9|Dm|tf95vXV)x(R^Sk$1+0)!sdyr+Lo=GcEXEY)*&+Wc6ic{bR$$HeynW zC_tPgmZmp<#BJ}m*b#n-3F$8zls-~Lc|X56JB+mrJ(Ig6Mtp3Sgfjc4YigX39*r*4C3Caz{U+B9RM}W1 z+6ma|K7M2rT;rj3$BlbeE9 ztnYttPrm?mp*nvREJEP&g#-gvn#2BiEde4G)l=x0q$C90?Gq3}+1=Zlv<;mmSWc`SiP~Np@o+N>=Q()aJp_q+n1#Tr| z3wrQM>VX5D*cCkURvE*iF(5yf&joM~GC-dt=@LK-8*irGB0xeWa=Qaey3q4=B71rOIdO0BW)*?keVa)di|Mv#}@Q)g2@p z_XI;$k(1p(t@#_acP~cn2N0H-zQHDEkxJu=BI&O{fPQhYOr!dY$>odl!>_=SSd9`3 z``5zgUn=PW#)YVz?LS~PtA6APG-&=B`|!ZRwJgJM1P07x7XaJ6*7=TyEsZ&XH#)*wGe3o4_u%hOuUwk6J>U$} z_~0l+Bnu-p6Uj?uWv$0!(pX+mYhdBi!_o~jLO=6#4AY4IOfNb7=J7Ce&#>+mNtEP3 zzT_ChFOpsR(QH=GD`Bz5YVVKw-U8gpFP>U>Hm`OWtDij-ttkRFt%v`4e}n;jR5)Ok z>d=F+2TvGx|IH4ed4RwrV_19N6-ak~&3rCzruXr@2s!K83YfLeR6L3(8>ZlLH|h6? zKiLBKD?W2tPTD(sMmoG$F1{A~1HWIzu}@I% z6t@U-cndXs8u3PJtfFi4IFsZ#hV|$5yO1R+pZJ!g*RTDJfTC%OhJ@We8)YJG;S~Qf zUML7c>6W#EKc*liA|@$kB0~ZR^}B-JsB<8tZO~UP88~Ed_zt{wL7Pu1M=$JlS5%>e zk_D2N-kvX#eU;b7jwO-8Phxo0b*ewwb7Je(X@uTpmmT^%Nd0RpCn?r5~K?aVj( zu2%!a{#^3=vv>6bG zXeEPH-BXdEbk_B^l}qOq6TFqY?Vz^l<+;l$Jmik#mwL<3ysS0Lrbgi+k#^m|uwK7` zy}rtORH6tLEBBh{;DW2_P4qtRZNG*HwJ$zm(T0P`uIa>IMmSdo0hx&X_6no)YU_4; z-36lp=n-rQtfvMviPVE)xCeSZuS7p?+K5;$2pT36oS{=tneCm*Pmq7NMcqfMUlV)I7Oew*?o?y*q`l_ zWI)@t-U=yS1WzMTIB|fW4)gBspFJ*vw(`~In$<;g-m;>sVvoFw`Nca_>AWv?Px+Yw zi=H(;eI6e5l~GB=(NFBvl}_>ZQ>yNtqo;81H90}kYI=-i=84IZ&q2+mI5_^k=b*?|Kjc~ADV36_+gsS8%PPrMk9@M zGg?AGg;7dKNk~Wv(lA0okQM|n2}h4mVGNN*q$H$4Ndb`*pL2fi`+k1Ef8crXyzrem z*ma%faU7pI3Y5x@9H!H^dJpHt(dyi7moOcxfl_b?xtv>)~A|oH+U_+ocDC69KeP>u<#up5)Jbz8wup z|B&qu75n{d=KZ^%PF~c z(7I%fM7NS1qKVqPZO|kjD8%oj#Pl+Ca98+?iwX(dimR-QM9siHSi%>`l{CxM*eWdJ zC2IVd<4;#Rvv*&vl*{$Ss3)*!41KA$Pi^#ArH$+K66VnFKuPot^d<`^uco5Y30$o{ zTFGMF&^|)YD1)$UF}Av^Xt(UT$;2SdWX(vvA|~;h;y)1A zcHYxOWr0kh^Nj!K@y^5WDp8)qp5cvr4VT_rA^u2Cm8PeCzh<84?n29Wugg{bvU*nOH4wCgZM^9h7m7NRJn5sUcpZrFbTiB+7RhVb21Y+ z)j!bQPlfi?%F~~kNr%cn4TH@DY||GuzuQI5wU+HuyTe}}T5N+~wRV(>hk9ySxmUc! z^TWlDL9|-5$jDbzhJ3@z%w4OAe?BlikmFr}9o+-XrI06gvPY6wJygAsw z6=ti~xgeflP($33U9}Cc(gCmo0SS+K<$05Al6WFAeRz{nA;d)Xd6_HaO3E3E_&r3MH1Xr#qX2|6lDreG&Z|INYUvgqo+01*OM`yMIEg3ikGCY_Dh2^ZPICj^Wlh z5)H)1q?gEHk&nwme{HafW9LZx{gX7Wg@9VumrqvC7)vK=>*$g3T0_*p`m@jPOM@y* zpzgEO>bBc?0G;2fIxf{evw-;y8SiD1#fN!jm)h;JK?;K;MKT;;dD!|a z+xnu@_iLgf&M! z;+jMXKug&dkkp1Z`gTR_=oXV6Gzzn;p`m$A(?~<(iHfH$LmV2F^)_hxYo0VOCp;b@ zp5D+B$rbja{ZSR~m?SC`^&3HE(x39Mzt2S6Kmk1r_cdh+7w zDgqrRs*~XTw(>wiF%??$6PD=%fQd>O4=xhTF6XY_9xa;<1<%w}=+m{>sXo}+?Ywz? zUn~9gfM#9E*G3>ks#x`-^+5EbKmqKQkT(=#x*XMHP!72A693hKF>g`|TFG_9q!<;h z;AYn>DARA22@oPmJntx4th($oo;p;Tr;1OZ*aLs0vOcObbIKPP-X|mzh<%-tE zK4>C}>+A!07rC$qpM>UxBoXr<<&NXTd%;!;>cYQ>EVQ#|<`Zfj&gP^4TxBM^_nZ^u zu?Zrj6bGMqCoph(dvQ_5JeL@fFAD!<#T4_BTeKV+8SKmDl}=Vo*DHSv#SH?zOyxFa zrUgWzX*cl}bTRVK3w2S$V(2W2P%}xEt36^rI7tO>WM!}}_tuvq!@Lo1%wIJkd)LSL zdP|97K{uDw*~tYSoetqEAF6RSWQurl&9M-R>KvN~vsjMtDLb!}+=AlAOE4I5dz=@} zmz)<;v)u={ZxXuI-A1kRXzEslR3cc-Gn^RM{Lw0%7HROh3+K=m`$V#E^ zJf5aWoPbMr-OhyBEI@cY<&SUM8)bb1zH+aX2$Y_ z>y%AA>W2DKVuO}G?+;liG_?DptKWK%D1JJiFUI+v;=;R!tpg`CT_Hz@wxCc^8@t?Q zv0^-=rfa98a{QQN+S)-}uAnlM#CkK#cTK|tAR|ISY?P9|f`PP5LE7v$ zz5whlZy}C})$;U_N25^cDs?UwlMOwBF7U7{VR)BkFN-r-`)Ml`!!t zF9)N}T_i10>}>5Aj^hP{U&emi0fSv`6(Ki6ArTdztqRn$KW z`Kd8|Uv(QhET!w1VibNNHTd+sZN=W>51?Y6!L;6fJym@tKJfm}=9nclwOFj1&`0tL zvL6ZK7>AC&x?Ex+QgRC(6*z)qXrkJQFgJQFKLsw*l0tno({iO8;_IHfM!!2rAvc@+ z72apn4NOoA&4%$;#uFNp50JqK+xx-GTGwe@+{LeTLX(M77K4|S(p;Oi1y=qD#*zIg z_JvRN3wB$`{b_w&bK=YTVizHtbS}DU#^6MSqiOfscoQU7B|BU1Ps*Y}&YRb3Vm4>M zIb8DOCWbK*_{odI7zwJqJ%bNRS3f;vt&izefv?>@ z{&@0$`(x9bLJYidWoHy_R2r^B341_U_hxRXh1t!n{c_$N|NQOOurXxCef}VVQW3Dq zyaf|LwSydCVT`;?)*#;bjB4ivNDXR`^-zJ@C(tysYm?zD3pIi^EYfx5{O3GZ>W}Uh z1>Pt*cufU0_F?zOGLSG#VR#D75>Vz2JX|(Ce0x{j!msHVXDN!&$=AOFQby_J68dSr zW+ktOVuSAPBQ6Eh{{yIEU)r62Omyywr=dI2&__em0<%RJv@hmSb^vt5L-Ppj-0`af zg!p-_SmV2!wtcyEyDAHK@e5Mg)c?LH2`4x5*rY(FZPDj_^6LL(s1 zV@F! zkX*?lnZ2v{SXBp>SpWVcI#HYYL4u3t@ zYr>xB4s-_J;vm-wT7>NtM_YpK^orP&GhR*f(ucK9JbD_kw<1u7h$rai^2DsWGf(a< zJ|73_=JGDK9vnRawbF(-HR-76=&WWUzO2Zuj2_kCUr)4m|u3+?(S?+6WO zH{l0*$}sHDVZ%+^z~1!#QZwmtYGx^l5|3bdoG`#!v8e&vv=(jOMILD8$aC{z``v0r z-*N`BL;zySbNYQmG;pw#l3MT^4TM{gqDe;`j$-Pm#uU&*XespN!ZfHxdJE`p`$Uyg zTKRwH(`owW2WmOF6_|+?_&dc~vNHytB0?NqsaX|Jc zYbgWCv_OHUqlG0}*j5?jbS29#nSRK;qV~m6wpvWY`KbwX@1?|7gFS#P4>nz;Y<~+I z!pxP3!${n<)J@*Q|Fk+L3*&j#&cW!$703#~EI!i{)7B-WeTD3a!hI+b;f1s=>sQW3 z)@{Btds@NpP~gB{3XGfJ&B>$OKrR_IfIhFi9({NxCNWsENuQ~me4TDOR_IbToRF0D>^D&0 z7LYTPk~?+*b@HuoqH+8F=uwdAGN#{s&)0MN?EyU@o#l60+ZbrqQ*!@WG{hPva0A>* zp1D*gi1t$Ay`updV1;Q(a~- zDeqz=$w22=M&&WW8{PXvGsY-|w4!9HuH+@ovr>=uV7A|ZV=rVv2|*t|(dPR`b?GUxAP;et2Nm zFA+T=)y0`vErfIS1j&@u_cU$aKsX_ScqOINA05WuepC)A2dv#9v1^bXr9cVJACH0l zs21sWP!WFcrHhQ?2Do(WSHe;q_?K8@MjmMOU6_ooaj1?vT(nRoV7n7wWbA)N>ru`( z@(1t*4lM2?R8=Un#82{|&poVbX)+)PCbS~*BSROoq~F$5-n{$}2SeX`<9!UB=v?dWx;#&7MT=m2pwx|z+w0BqmXnb{kV z-I89}#~+OdIhtbae zDp%O+>RqX$v3+>HCrLrq)Z?Gp2c;{nVTs&*U}K(BrRRQFR@kl1L&p>-uwc{{0uaMd z6N3B4vrUKUfK$|c0VQel1IFm+&?)#6qK1m_p?9QR=mVF^Z4&bRy8wts`OF_$Z^b;L zVL?JDs)@9VU=k1U(FHF$-})Hu`5~(KG|OK16Aei%rOD~l8QeEH!_?q(9!T>%G&R{Z z2_I4u=OjTwk>`(At=HZ|v6SQXaUJ0=IY_QAKDT@c!5_JMJ#6U6w;>_k%=*Qp(N|tB z2m4=1f|#{r)e~t~FwI_8?tc_FSUm|JyBr=3_Xmjf)GS(T1C^cf78%Aq?KfdZgNTOX zv&4#~Pkt>!#MMfIU{QO*5)n-P@$X?``W>XsEgac2oM^=nhBsv>l4^Js%`nekkz5EL zgA|0Z{w+=JBGSOzcK#251eI+;KIF<}9j;H}s8M^dSRpMHf!R^om!y;NN~LL^?(cY8 zO(*-k80Ai<&$a}pTJENroYMzdnw|%;*G_(IYL%2Fs=D(qdTnEWd|P;Qz<&IUQh@cJ z-{=!Yc-^iI3}x=r>zPY@6M|noSM6q_ysHP=sVNV51Xc(X(OL+ERNO_%>I##6Zr`F3 zg?D1i+=BOIPC)_M@1oZcILRj0-S;2Pd&B~>llTU}5?I_q3%nYrJSyugK;U1@sF@rw zFE^AQD|o=Oy=8Ik&ZATs>-_!8Ug=^DsoSlcCO1deH4DDba~%i`=uI0mx9$uaK{S3! zIhu4jYuP?ENvsBjHCE>ZUd3rw&;v1mKgCTy9lq;Cz~PtNS*|vOsXbMlu}fP-U!h-~ zYuN$4#&}CW;lH;|en|y6T%ZB_*}f#onLN{1&57}B^yhaMMC^6r@R;N#QI))l2O&$gLWDhFt73N5222d&wr+m{1p}Lp?(X#fGN^K*uu|%t&)yul8 z9I6$fXhwh=&Z#8=VSDa;nt%a8BDduQ02q3JIaqz*Nt}6uk?S5WeJP+X!axF*NF!e& zpGh z8f@y^99q<*h^roS2T0xBn*Jg%heaY#GlaCET`GlWQtxYMRI7qIov0kzpu_tbnT>7= z+&Gs1OzqF<-lf%=sR`hz@^t5wo{z5sS%=o??j%=g*O{kEwgIVHqGZ|y-qe;RO9b+h z0IFrqI__iV*iu&0yH1L=D$oL1xKud(rD^&!eY7SL#S+32E~#}mt^tx%R$du@AyAi> zYwcWAT%Fp{64TUo5h~~Bs&*AluF|sxDaVd_656$s-(H~P>9~|e$OIiV5kC>M^EL6# zP?ozWRe}xXZ&gOeU$L?w>cl(?`g8WX1K9m85E2d-7_xenSk_rZ!+hj%=Ygf9TcJv+ zbq^<&aKPb>ZLbI(ZfMZ6RRkEAQE>29)2eifIzj_FNKr1BmY{77sKB=~92pQZCy+xO z_;}kpPDlfO`#rdJK2cQ1)MeT?;od5CHC}#^+QgczkIMBC8{@}@8yBg3skni`9|ITX zCaSeF^quL=>CfAbS@shB^^5(3`AhoHYSYEXPegwo?_XLM3N(9qhOsTB1qxiZ=bpCm zpqZ(Cmv8n-7h-_c_iop@_fR~#a5cGkML~iLo^Ys%T|kWa76aR!ODf_+dPLO@*I4A9 zikN7|!y%KeF1{+ z=y|AYQh8JDyJNn^U@*Y>IBBtumqB7Q_4SjTVla_d9iw93#SeMP43040FwA9x8wtyF zV`c=ziC{xD;%jpxM?~Mna3+b})F-W`_!Oza-~JjxBeE4^nA!0MTMV0pu*%1B_f!My z%BB#37Z7#DGT^jIO!Xi)A@-1q?!J#9e*KCNnQ3L=+omS57b+Y-^77Dr=ZVbFJEkY0 z!BK6aCAS)Mrx4<5M|h_BWy>4g8=>+1X%QR5lcW*Cvq-#IO;9oaGfnx4k~l$5 z5d>*VYrcDBNXaVQkT1BoH1-PvC=~1a*nzZr>TovsF=PA*I3Gcx#UOY4Ra5hW^Rhj= z`0}cSOaG?TzvRmA6J_QWa=675=oi(?BJP0Q@llO7$sf9IG+Di`m(Qy^oM$HV;ECE*&3EJFW>&$)<}`+8*$1F_4^dWGtNl?m+YJt-zLSHH%|R!kTwN z{QtRy5tn0h9f(KLUsioH`|RFDqL)7bdy$uYU+tjc;*8^~%Z0)tmBM*1kX31eV$X}H zn*?U%+M7K=z>3S;r7dp)xh5~ECg@YoZCES%-!kqhtw9Js1LILSAtiOLS%bT<8c4879F*bESB z9iHukzP1!n630R|>9?%)DVKn*q(P3D4%?}(+K^*Oo z|F|$vwmu%X6LN-ETv;ZPwxOo1mfv4iZrPYpgw=-rhU-0jTF#Fa?EWpPC8m zs&{ev_wkH@yF!TWp9L3aikM_|Fnir&lf8Wn<&x)Yq-_Pf*;=5x-3T^6?G`*Uo>c56 zgo0Rl9s_?VPWVNk<59{?E%rirK8#m4w|t5amH+_B`XNAtUEIq7LcBpBIdZM?M=kT& z4ej!q6aKyoMa?@4-4h>{W7Pm~McPz}Ay zCgWy`3jE^SA9ov=z-d`;1Us0(R>7=Hbwy<-wiAM*e&O7kP4HPe5Y|6rMF9PR0|3um zI&0cUXktMmxm)%>{YYn`7gx*b?;a=nM!%E=6<^0D^g7TK|Zm06FQdubdA7 zcTho#pKG6_=)KT0ROkM=Pcdr|^cr*^ts%atlNi|t#)!UQH<0v=kv=&p>`D$@y3}Kw zCpYcWVWb9LrxQuv1?}V$t>ZGoKJJPXG-(}x*z*n9s)F4ERu6av@w}lxT_k2aU<1Ga zqYXc)z7xbBbs+Xxx!4szu(nbe+{#RObiI(mJFw93ozN6v3kHjw zXEjFWX3# z0)Yj8d6U($<-EbaK4XmLVY_tPpwJ1>b}s9$aT)9e3zAM2i67;8Usp z{+Vg@6Z)jN8H>^kgU7OKJkig-2b5D56a$(=z9Jm4m|x7L6u$RcPdgGA{z7n6x4vcr zmvGcFM|GUc*(?2n*u^vk0*;(0cS8ajI0N`B7pnkJhvPvt8^_mP8c^V^z~HC@#aE%V z-vInWs~Y-Kk{CUqgLhguy>4N}&r1|?26k=q57oL}VY;i|u@?$15$h0l%2-kL;;@_H z`=ev>N3@!2pp~Z~DCDU03NLw1Nc#V20lx5x$J58_K=VTdE|vznuHO|!B5R&oNq#r& zKCOWFr#^D(+0sR!SZF}h{hhxT{CRexq%@%DW@09QOiap95+LGoOx`n3(hRFUY*R{L zQ-^REeT9kDY|1S=!;9#V?I3x=tGM#*ugL~OW*#zcBM@QLaHxp^Ge+({P1RKhH9$qf zp2?^mf8(t!)x>E0oCscgp!Lq@PTHRsei{if!Qu7KFVdDNg)(iJn>50#FoC0 zpVLMxu+8(tYb^Slf_wyO0tPcGLIShT&^kK(4O|FvzJe^b6m&zgPI8@6r7YE>!z8Nl zjDba6_XzdG|^R`!N zVpi;>`?V+I7zGZEQmJ2(rtm>w?P{zAPiS3aYB=h%lapw=W z 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 diff --git a/ui/litellm-dashboard/src/components/entity_usage.tsx b/ui/litellm-dashboard/src/components/entity_usage.tsx index a9a13b38479..4b159fb310c 100644 --- a/ui/litellm-dashboard/src/components/entity_usage.tsx +++ b/ui/litellm-dashboard/src/components/entity_usage.tsx @@ -407,7 +407,7 @@ const EntityUsage: React.FC = ({ Spend Per {entityType === 'tag' ? 'Tag' : 'Team'}

From dd8d23be6249678b2d44714868a0a549050d3e27 Mon Sep 17 00:00:00 2001 From: Fadil Rahman <87557055+fadil4u@users.noreply.github.com> Date: Fri, 30 May 2025 04:04:16 +0530 Subject: [PATCH 06/77] Removed syntax error from docs (#11242) --- docs/my-website/docs/batches.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/my-website/docs/batches.md b/docs/my-website/docs/batches.md index 4918e30d1fd..7029697699c 100644 --- a/docs/my-website/docs/batches.md +++ b/docs/my-website/docs/batches.md @@ -78,8 +78,9 @@ curl http://localhost:4000/v1/batches \ **Create File for Batch Completion** ```python -from litellm +import litellm import os +import asyncio os.environ["OPENAI_API_KEY"] = "sk-.." @@ -97,8 +98,9 @@ print("Response from creating file=", file_obj) **Create Batch Request** ```python -from litellm +import litellm import os +import asyncio create_batch_response = await litellm.acreate_batch( completion_window="24h", From 5e6f6ddc520f696ac6ccac4551e2c6bb88736e8c Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 16:48:55 -0700 Subject: [PATCH 07/77] [Feat]: Add Bedrock InvokeAgents as a /chat/completions route on LiteLLM (#11239) * feat: init structure for bedrock AGENTs * feat: add basic routing for bedrock AGENTs * feat: add basic transforms for bedrock AGENTs * fix: url for bedrock agent runtime * fix: working agents request * feat: working agents non-streaming request * feat: bedrock agents * feat: add streaming for bedrock agents * feat: add cost tracking for bedrock agents * docs litellm with bedrock agents * fix: linting errors * test: invoke agents tests --- .../docs/providers/bedrock_agents.md | 202 +++++++ docs/my-website/sidebars.js | 1 + litellm/llms/bedrock/base_aws_llm.py | 19 +- .../chat/invoke_agent/transformation.py | 527 ++++++++++++++++++ litellm/llms/bedrock/common_utils.py | 6 +- litellm/llms/custom_httpx/llm_http_handler.py | 9 +- litellm/types/llms/bedrock_invoke_agents.py | 127 +++++ litellm/utils.py | 6 + tests/llm_translation/test_bedrock_agents.py | 64 +++ .../test_bedrock_agent_transformation.py | 272 +++++++++ 10 files changed, 1230 insertions(+), 3 deletions(-) create mode 100644 docs/my-website/docs/providers/bedrock_agents.md create mode 100644 litellm/llms/bedrock/chat/invoke_agent/transformation.py create mode 100644 litellm/types/llms/bedrock_invoke_agents.py create mode 100644 tests/llm_translation/test_bedrock_agents.py create mode 100644 tests/test_litellm/llms/bedrock/invoke_agent/test_bedrock_agent_transformation.py diff --git a/docs/my-website/docs/providers/bedrock_agents.md b/docs/my-website/docs/providers/bedrock_agents.md new file mode 100644 index 00000000000..e6368705feb --- /dev/null +++ b/docs/my-website/docs/providers/bedrock_agents.md @@ -0,0 +1,202 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Bedrock Agents + +Call Bedrock Agents in the OpenAI Request/Response format. + + +| Property | Details | +|----------|---------| +| Description | Amazon Bedrock Agents use the reasoning of foundation models (FMs), APIs, and data to break down user requests, gather relevant information, and efficiently complete tasks. | +| Provider Route on LiteLLM | `bedrock/agent/{AGENT_ID}/{ALIAS_ID}` | +| Provider Doc | [AWS Bedrock Agents ↗](https://aws.amazon.com/bedrock/agents/) | + +## Quick Start + +### Model Format to LiteLLM + +To call a bedrock agent through LiteLLM, you need to use the following model format to call the agent. + +Here the `model=bedrock/agent/` tells LiteLLM to call the bedrock `InvokeAgent` API. + +```shell showLineNumbers title="Model Format to LiteLLM" +bedrock/agent/{AGENT_ID}/{ALIAS_ID} +``` + +**Example:** +- `bedrock/agent/L1RT58GYRW/MFPSBCXYTW` +- `bedrock/agent/ABCD1234/LIVE` + +You can find these IDs in your AWS Bedrock console under Agents. + + +### LiteLLM Python SDK + +```python showLineNumbers title="Basic Agent Completion" +import litellm + +# Make a completion request to your Bedrock Agent +response = litellm.completion( + model="bedrock/agent/L1RT58GYRW/MFPSBCXYTW", # agent/{AGENT_ID}/{ALIAS_ID} + messages=[ + { + "role": "user", + "content": "Hi, I need help with analyzing our Q3 sales data and generating a summary report" + } + ], +) + +print(response.choices[0].message.content) +print(f"Response cost: ${response._hidden_params['response_cost']}") +``` + +```python showLineNumbers title="Streaming Agent Responses" +import litellm + +# Stream responses from your Bedrock Agent +response = litellm.completion( + model="bedrock/agent/L1RT58GYRW/MFPSBCXYTW", + messages=[ + { + "role": "user", + "content": "Can you help me plan a marketing campaign and provide step-by-step execution details?" + } + ], + stream=True, +) + +for chunk in response: + if chunk.choices[0].delta.content: + print(chunk.choices[0].delta.content, end="") +``` + + +### LiteLLM Proxy + +#### 1. Configure your model in config.yaml + + + + +```yaml showLineNumbers title="LiteLLM Proxy Configuration" +model_list: + - model_name: bedrock-agent-1 + litellm_params: + model: bedrock/agent/L1RT58GYRW/MFPSBCXYTW + aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID + aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY + aws_region_name: us-west-2 + + - model_name: bedrock-agent-2 + litellm_params: + model: bedrock/agent/AGENT456/ALIAS789 + aws_access_key_id: os.environ/AWS_ACCESS_KEY_ID + aws_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY + aws_region_name: us-east-1 +``` + + + + +#### 2. Start the LiteLLM Proxy + +```bash showLineNumbers title="Start LiteLLM Proxy" +litellm --config config.yaml +``` + +#### 3. Make requests to your Bedrock Agents + + + + +```bash showLineNumbers title="Basic Agent Request" +curl http://localhost:4000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $LITELLM_API_KEY" \ + -d '{ + "model": "bedrock-agent-1", + "messages": [ + { + "role": "user", + "content": "Analyze our customer data and suggest retention strategies" + } + ] + }' +``` + +```bash showLineNumbers title="Streaming Agent Request" +curl http://localhost:4000/v1/chat/completions \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $LITELLM_API_KEY" \ + -d '{ + "model": "bedrock-agent-2", + "messages": [ + { + "role": "user", + "content": "Create a comprehensive social media strategy for our new product" + } + ], + "stream": true + }' +``` + + + + + +```python showLineNumbers title="Using OpenAI SDK with LiteLLM Proxy" +from openai import OpenAI + +# Initialize client with your LiteLLM proxy URL +client = OpenAI( + base_url="http://localhost:4000", + api_key="your-litellm-api-key" +) + +# Make a completion request to your agent +response = client.chat.completions.create( + model="bedrock-agent-1", + messages=[ + { + "role": "user", + "content": "Help me prepare for the quarterly business review meeting" + } + ] +) + +print(response.choices[0].message.content) +``` + +```python showLineNumbers title="Streaming with OpenAI SDK" +from openai import OpenAI + +client = OpenAI( + base_url="http://localhost:4000", + api_key="your-litellm-api-key" +) + +# Stream agent responses +stream = client.chat.completions.create( + model="bedrock-agent-2", + messages=[ + { + "role": "user", + "content": "Walk me through launching a new feature beta program" + } + ], + stream=True +) + +for chunk in stream: + if chunk.choices[0].delta.content is not None: + print(chunk.choices[0].delta.content, end="") +``` + + + + +## Further Reading + +- [AWS Bedrock Agents Documentation](https://aws.amazon.com/bedrock/agents/) +- [LiteLLM Authentication to Bedrock](https://docs.litellm.ai/docs/providers/bedrock#boto3---authentication) diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 60073bc1e25..8383503e872 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -328,6 +328,7 @@ const sidebars = { label: "Bedrock", items: [ "providers/bedrock", + "providers/bedrock_agents", "providers/bedrock_vector_store", ] }, diff --git a/litellm/llms/bedrock/base_aws_llm.py b/litellm/llms/bedrock/base_aws_llm.py index a2832e69eb5..fea2072a0f7 100644 --- a/litellm/llms/bedrock/base_aws_llm.py +++ b/litellm/llms/bedrock/base_aws_llm.py @@ -527,6 +527,7 @@ class BaseAWSLLM: api_base: Optional[str], aws_bedrock_runtime_endpoint: Optional[str], aws_region_name: str, + endpoint_type: Optional[Literal["runtime", "agent"]] = "runtime", ) -> Tuple[str, str]: env_aws_bedrock_runtime_endpoint = get_secret("AWS_BEDROCK_RUNTIME_ENDPOINT") if api_base is not None: @@ -540,7 +541,10 @@ class BaseAWSLLM: ): endpoint_url = env_aws_bedrock_runtime_endpoint else: - endpoint_url = f"https://bedrock-runtime.{aws_region_name}.amazonaws.com" + endpoint_url = self._select_default_endpoint_url( + endpoint_type=endpoint_type, + aws_region_name=aws_region_name, + ) # Determine proxy_endpoint_url if env_aws_bedrock_runtime_endpoint and isinstance( @@ -556,6 +560,19 @@ class BaseAWSLLM: return endpoint_url, proxy_endpoint_url + def _select_default_endpoint_url( + self, endpoint_type: Optional[Literal["runtime", "agent"]], aws_region_name: str + ) -> str: + """ + Select the default endpoint url based on the endpoint type + + Default endpoint url is https://bedrock-runtime.{aws_region_name}.amazonaws.com + """ + if endpoint_type == "agent": + return f"https://bedrock-agent-runtime.{aws_region_name}.amazonaws.com" + else: + return f"https://bedrock-runtime.{aws_region_name}.amazonaws.com" + def _get_boto_credentials_from_optional_params( self, optional_params: dict, model: Optional[str] = None ) -> Boto3CredentialsInfo: diff --git a/litellm/llms/bedrock/chat/invoke_agent/transformation.py b/litellm/llms/bedrock/chat/invoke_agent/transformation.py new file mode 100644 index 00000000000..aa57bb7feb3 --- /dev/null +++ b/litellm/llms/bedrock/chat/invoke_agent/transformation.py @@ -0,0 +1,527 @@ +""" +Transformation for Bedrock Invoke Agent + +https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeAgent.html +""" +import base64 +import json +import uuid +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union + +import httpx + +from litellm._logging import verbose_logger +from litellm.litellm_core_utils.prompt_templates.common_utils import ( + convert_content_list_to_str, +) +from litellm.llms.base_llm.chat.transformation import BaseConfig, BaseLLMException +from litellm.llms.bedrock.base_aws_llm import BaseAWSLLM +from litellm.llms.bedrock.common_utils import BedrockError +from litellm.types.llms.bedrock_invoke_agents import ( + InvokeAgentChunkPayload, + InvokeAgentEvent, + InvokeAgentEventHeaders, + InvokeAgentEventList, + InvokeAgentTrace, + InvokeAgentTracePayload, + InvokeAgentUsage, +) +from litellm.types.llms.openai import AllMessageValues +from litellm.types.utils import Choices, Message, ModelResponse + +if TYPE_CHECKING: + from litellm.litellm_core_utils.litellm_logging import Logging as _LiteLLMLoggingObj + + LiteLLMLoggingObj = _LiteLLMLoggingObj +else: + LiteLLMLoggingObj = Any + + +class AmazonInvokeAgentConfig(BaseConfig, BaseAWSLLM): + def __init__(self, **kwargs): + BaseConfig.__init__(self, **kwargs) + BaseAWSLLM.__init__(self, **kwargs) + + def get_supported_openai_params(self, model: str) -> List[str]: + """ + This is a base invoke agent model mapping. For Invoke Agent - define a bedrock provider specific config that extends this class. + + Bedrock Invoke Agents has 0 OpenAI compatible params + + As of May 29th, 2025 - they don't support streaming. + """ + return [] + + def map_openai_params( + self, + non_default_params: dict, + optional_params: dict, + model: str, + drop_params: bool, + ) -> dict: + """ + This is a base invoke agent model mapping. For Invoke Agent - define a bedrock provider specific config that extends this class. + """ + return optional_params + + def get_complete_url( + self, + api_base: Optional[str], + api_key: Optional[str], + model: str, + optional_params: dict, + litellm_params: dict, + stream: Optional[bool] = None, + ) -> str: + """ + Get the complete url for the request + """ + ### SET RUNTIME ENDPOINT ### + aws_bedrock_runtime_endpoint = optional_params.get( + "aws_bedrock_runtime_endpoint", None + ) # https://bedrock-runtime.{region_name}.amazonaws.com + endpoint_url, _ = self.get_runtime_endpoint( + api_base=api_base, + aws_bedrock_runtime_endpoint=aws_bedrock_runtime_endpoint, + aws_region_name=self._get_aws_region_name( + optional_params=optional_params, model=model + ), + endpoint_type="agent", + ) + + agent_id, agent_alias_id = self._get_agent_id_and_alias_id(model) + session_id = self._get_session_id(optional_params) + + endpoint_url = f"{endpoint_url}/agents/{agent_id}/agentAliases/{agent_alias_id}/sessions/{session_id}/text" + + return endpoint_url + + def sign_request( + self, + headers: dict, + optional_params: dict, + request_data: dict, + api_base: str, + model: Optional[str] = None, + stream: Optional[bool] = None, + fake_stream: Optional[bool] = None, + ) -> Tuple[dict, Optional[bytes]]: + return self._sign_request( + service_name="bedrock", + headers=headers, + optional_params=optional_params, + request_data=request_data, + api_base=api_base, + model=model, + stream=stream, + fake_stream=fake_stream, + ) + + def _get_agent_id_and_alias_id(self, model: str) -> tuple[str, str]: + """ + model = "agent/L1RT58GYRW/MFPSBCXYTW" + agent_id = "L1RT58GYRW" + agent_alias_id = "MFPSBCXYTW" + """ + # Split the model string by '/' and extract components + parts = model.split("/") + if len(parts) != 3 or parts[0] != "agent": + raise ValueError( + "Invalid model format. Expected format: 'model=agent/AGENT_ID/ALIAS_ID'" + ) + + return parts[1], parts[2] # Return (agent_id, agent_alias_id) + + def _get_session_id(self, optional_params: dict) -> str: + """ """ + return optional_params.get("sessionID", None) or str(uuid.uuid4()) + + def transform_request( + self, + model: str, + messages: List[AllMessageValues], + optional_params: dict, + litellm_params: dict, + headers: dict, + ) -> dict: + # use the last message content as the query + query: str = convert_content_list_to_str(messages[-1]) + return { + "inputText": query, + "enableTrace": True, + **optional_params, + } + + def _parse_aws_event_stream(self, raw_content: bytes) -> InvokeAgentEventList: + """ + Parse AWS event stream format using boto3/botocore's built-in parser. + This is the same approach used in the existing AWSEventStreamDecoder. + """ + try: + from botocore.eventstream import EventStreamBuffer + from botocore.parsers import EventStreamJSONParser + except ImportError: + raise ImportError("boto3/botocore is required for AWS event stream parsing") + + events: InvokeAgentEventList = [] + parser = EventStreamJSONParser() + event_stream_buffer = EventStreamBuffer() + + # Add the entire response to the buffer + event_stream_buffer.add_data(raw_content) + + # Process all events in the buffer + for event in event_stream_buffer: + try: + headers = self._extract_headers_from_event(event) + + event_type = headers.get("event_type", "") + + if event_type == "chunk": + # Handle chunk events specially - they contain decoded content, not JSON + message = self._parse_message_from_event(event, parser) + parsed_event: InvokeAgentEvent = InvokeAgentEvent() + if message: + # For chunk events, create a payload with the decoded content + parsed_event = { + "headers": headers, + "payload": { + "bytes": base64.b64encode( + message.encode("utf-8") + ).decode("utf-8") + }, # Re-encode for consistency + } + events.append(parsed_event) + + elif event_type == "trace": + # Handle trace events normally - they contain JSON + message = self._parse_message_from_event(event, parser) + + if message: + try: + event_data = json.loads(message) + parsed_event = { + "headers": headers, + "payload": event_data, + } + events.append(parsed_event) + except json.JSONDecodeError as e: + verbose_logger.warning( + f"Failed to parse trace event JSON: {e}" + ) + else: + verbose_logger.debug(f"Unknown event type: {event_type}") + + except Exception as e: + verbose_logger.error(f"Error processing event: {e}") + continue + + return events + + def _parse_message_from_event(self, event, parser) -> Optional[str]: + """Extract message content from an AWS event, adapted from AWSEventStreamDecoder.""" + try: + response_dict = event.to_response_dict() + verbose_logger.debug(f"Response dict: {response_dict}") + + # Use the same response shape parsing as the existing decoder + parsed_response = parser.parse( + response_dict, self._get_response_stream_shape() + ) + verbose_logger.debug(f"Parsed response: {parsed_response}") + + if response_dict["status_code"] != 200: + decoded_body = response_dict["body"].decode() + if isinstance(decoded_body, dict): + error_message = decoded_body.get("message") + elif isinstance(decoded_body, str): + error_message = decoded_body + else: + error_message = "" + exception_status = response_dict["headers"].get(":exception-type") + error_message = exception_status + " " + error_message + raise BedrockError( + status_code=response_dict["status_code"], + message=( + json.dumps(error_message) + if isinstance(error_message, dict) + else error_message + ), + ) + + if "chunk" in parsed_response: + chunk = parsed_response.get("chunk") + if not chunk: + return None + return chunk.get("bytes").decode() + else: + chunk = response_dict.get("body") + if not chunk: + return None + return chunk.decode() + + except Exception as e: + verbose_logger.debug(f"Error parsing message from event: {e}") + return None + + def _extract_headers_from_event(self, event) -> InvokeAgentEventHeaders: + """Extract headers from an AWS event for categorization.""" + try: + response_dict = event.to_response_dict() + headers = response_dict.get("headers", {}) + + # Extract the event-type and content-type headers that we care about + return InvokeAgentEventHeaders( + event_type=headers.get(":event-type", ""), + content_type=headers.get(":content-type", ""), + message_type=headers.get(":message-type", ""), + ) + except Exception as e: + verbose_logger.debug(f"Error extracting headers: {e}") + return InvokeAgentEventHeaders( + event_type="", content_type="", message_type="" + ) + + def _get_response_stream_shape(self): + """Get the response stream shape for parsing, reusing existing logic.""" + try: + # Try to reuse the cached shape from the existing decoder + from litellm.llms.bedrock.chat.invoke_handler import ( + get_response_stream_shape, + ) + + return get_response_stream_shape() + except ImportError: + # Fallback: create our own shape + try: + from botocore.loaders import Loader + from botocore.model import ServiceModel + + loader = Loader() + bedrock_service_dict = loader.load_service_model( + "bedrock-runtime", "service-2" + ) + bedrock_service_model = ServiceModel(bedrock_service_dict) + return bedrock_service_model.shape_for("ResponseStream") + except Exception as e: + verbose_logger.warning(f"Could not load response stream shape: {e}") + return None + + def _extract_response_content(self, events: InvokeAgentEventList) -> str: + """Extract the final response content from parsed events.""" + response_parts = [] + + for event in events: + headers = event.get("headers", {}) + payload = event.get("payload") + + event_type = headers.get( + "event_type" + ) # Note: using event_type not event-type + + if event_type == "chunk" and payload: + # Extract base64 encoded content from chunk events + chunk_payload: InvokeAgentChunkPayload = payload # type: ignore + encoded_bytes = chunk_payload.get("bytes", "") + if encoded_bytes: + try: + decoded_content = base64.b64decode(encoded_bytes).decode( + "utf-8" + ) + response_parts.append(decoded_content) + except Exception as e: + verbose_logger.warning(f"Failed to decode chunk content: {e}") + + return "".join(response_parts) + + def _extract_usage_info(self, events: InvokeAgentEventList) -> InvokeAgentUsage: + """Extract token usage information from trace events.""" + usage_info = InvokeAgentUsage( + inputTokens=0, + outputTokens=0, + model=None, + ) + + response_model: Optional[str] = None + + for event in events: + if not self._is_trace_event(event): + continue + + trace_data = self._get_trace_data(event) + if not trace_data: + continue + + verbose_logger.debug(f"Trace event: {trace_data}") + + # Extract usage from pre-processing trace + self._extract_and_update_preprocessing_usage( + trace_data=trace_data, + usage_info=usage_info, + ) + + # Extract model from orchestration trace + if response_model is None: + response_model = self._extract_orchestration_model(trace_data) + + usage_info["model"] = response_model + return usage_info + + def _is_trace_event(self, event: InvokeAgentEvent) -> bool: + """Check if the event is a trace event.""" + headers = event.get("headers", {}) + event_type = headers.get("event_type") + payload = event.get("payload") + return event_type == "trace" and payload is not None + + def _get_trace_data(self, event: InvokeAgentEvent) -> Optional[InvokeAgentTrace]: + """Extract trace data from a trace event.""" + payload = event.get("payload") + if not payload: + return None + + trace_payload: InvokeAgentTracePayload = payload # type: ignore + return trace_payload.get("trace", {}) + + def _extract_and_update_preprocessing_usage( + self, trace_data: InvokeAgentTrace, usage_info: InvokeAgentUsage + ) -> None: + """Extract usage information from preprocessing trace.""" + pre_processing = trace_data.get("preProcessingTrace", {}) + if not pre_processing: + return + + model_output = pre_processing.get("modelInvocationOutput", {}) + if not model_output: + return + + metadata = model_output.get("metadata", {}) + if not metadata: + return + + usage: Optional[Union[InvokeAgentUsage, Dict]] = metadata.get("usage", {}) + if not usage: + return + + usage_info["inputTokens"] += usage.get("inputTokens", 0) + usage_info["outputTokens"] += usage.get("outputTokens", 0) + + def _extract_orchestration_model( + self, trace_data: InvokeAgentTrace + ) -> Optional[str]: + """Extract model information from orchestration trace.""" + orchestration_trace = trace_data.get("orchestrationTrace", {}) + if not orchestration_trace: + return None + + model_invocation = orchestration_trace.get("modelInvocationInput", {}) + if not model_invocation: + return None + + return model_invocation.get("foundationModel") + + def _build_model_response( + self, + content: str, + model: str, + usage_info: InvokeAgentUsage, + model_response: ModelResponse, + ) -> ModelResponse: + """Build the final ModelResponse object.""" + + # Create the message content + message = Message(content=content, role="assistant") + + # Create choices + choice = Choices(finish_reason="stop", index=0, message=message) + + # Update model response + model_response.choices = [choice] + model_response.model = usage_info.get("model", model) + + # Add usage information if available + if usage_info: + from litellm.types.utils import Usage + + usage = Usage( + prompt_tokens=usage_info.get("inputTokens", 0), + completion_tokens=usage_info.get("outputTokens", 0), + total_tokens=usage_info.get("inputTokens", 0) + + usage_info.get("outputTokens", 0), + ) + setattr(model_response, "usage", usage) + + return model_response + + def transform_response( + self, + model: str, + raw_response: httpx.Response, + model_response: ModelResponse, + logging_obj: LiteLLMLoggingObj, + request_data: dict, + messages: List[AllMessageValues], + optional_params: dict, + litellm_params: dict, + encoding: Any, + api_key: Optional[str] = None, + json_mode: Optional[bool] = None, + ) -> ModelResponse: + try: + # Get the raw binary content + raw_content = raw_response.content + verbose_logger.debug( + f"Processing {len(raw_content)} bytes of AWS event stream data" + ) + + # Parse the AWS event stream format + events = self._parse_aws_event_stream(raw_content) + verbose_logger.debug(f"Parsed {len(events)} events from stream") + + # Extract response content from chunk events + content = self._extract_response_content(events) + + # Extract usage information from trace events + usage_info = self._extract_usage_info(events) + + # Build and return the model response + return self._build_model_response( + content=content, + model=model, + usage_info=usage_info, + model_response=model_response, + ) + + except Exception as e: + verbose_logger.error( + f"Error processing Bedrock Invoke Agent response: {str(e)}" + ) + raise BedrockError( + message=f"Error processing response: {str(e)}", + status_code=raw_response.status_code, + ) + + def validate_environment( + self, + headers: dict, + model: str, + messages: List[AllMessageValues], + optional_params: dict, + litellm_params: dict, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + ) -> dict: + return headers + + def get_error_class( + self, error_message: str, status_code: int, headers: Union[dict, httpx.Headers] + ) -> BaseLLMException: + return BedrockError(status_code=status_code, message=error_message) + + def should_fake_stream( + self, + model: Optional[str], + stream: Optional[bool], + custom_llm_provider: Optional[str] = None, + ) -> bool: + return True diff --git a/litellm/llms/bedrock/common_utils.py b/litellm/llms/bedrock/common_utils.py index 69a249b8424..fc6f52233e1 100644 --- a/litellm/llms/bedrock/common_utils.py +++ b/litellm/llms/bedrock/common_utils.py @@ -402,7 +402,9 @@ class BedrockModelInfo(BaseLLMModelInfo): return ["us", "eu", "apac"] @staticmethod - def get_bedrock_route(model: str) -> Literal["converse", "invoke", "converse_like"]: + def get_bedrock_route( + model: str, + ) -> Literal["converse", "invoke", "converse_like", "agent"]: """ Get the bedrock route for the given model. """ @@ -414,6 +416,8 @@ class BedrockModelInfo(BaseLLMModelInfo): return "converse_like" elif "converse/" in model: return "converse" + elif "agent/" in model: + return "agent" elif ( base_model in litellm.bedrock_converse_models or alt_model in litellm.bedrock_converse_models diff --git a/litellm/llms/custom_httpx/llm_http_handler.py b/litellm/llms/custom_httpx/llm_http_handler.py index 6dfc68f724e..6523184c08c 100644 --- a/litellm/llms/custom_httpx/llm_http_handler.py +++ b/litellm/llms/custom_httpx/llm_http_handler.py @@ -271,7 +271,6 @@ class BaseLLMHTTPHandler: ): json_mode: bool = optional_params.pop("json_mode", False) extra_body: Optional[dict] = optional_params.pop("extra_body", None) - fake_stream = fake_stream or optional_params.pop("fake_stream", False) provider_config = ( provider_config @@ -284,6 +283,14 @@ class BaseLLMHTTPHandler: f"Provider config not found for model: {model} and provider: {custom_llm_provider}" ) + fake_stream = ( + fake_stream + or optional_params.pop("fake_stream", False) + or provider_config.should_fake_stream( + model=model, custom_llm_provider=custom_llm_provider, stream=stream + ) + ) + # get config from model, custom llm provider headers = provider_config.validate_environment( api_key=api_key, diff --git a/litellm/types/llms/bedrock_invoke_agents.py b/litellm/types/llms/bedrock_invoke_agents.py new file mode 100644 index 00000000000..dde9405a720 --- /dev/null +++ b/litellm/types/llms/bedrock_invoke_agents.py @@ -0,0 +1,127 @@ +""" +Type definitions for AWS Bedrock Invoke Agent API responses. + +https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeAgent.html +""" + +from typing import Any, Dict, List, Optional, TypedDict, Union + + +class InvokeAgentEventHeaders(TypedDict, total=False): + """Headers for AWS Invoke Agent events.""" + + event_type: str # 'trace', 'chunk', etc. + content_type: str # 'application/json', etc. + message_type: str # 'event', etc. + + +class InvokeAgentUsage(TypedDict): + """Token usage information from trace events.""" + + inputTokens: int + outputTokens: int + model: Optional[str] + + +class InvokeAgentMetadata(TypedDict, total=False): + """Metadata from model invocation.""" + + clientRequestId: Optional[str] + endTime: Optional[str] + startTime: Optional[str] + totalTimeMs: Optional[int] + usage: Optional[InvokeAgentUsage] + + +class InvokeAgentModelInvocationInput(TypedDict, total=False): + """Model invocation input details.""" + + foundationModel: Optional[str] + inferenceConfiguration: Optional[Dict[str, Any]] + text: Optional[str] + traceId: Optional[str] + type: Optional[str] + + +class InvokeAgentModelInvocationOutput(TypedDict, total=False): + """Model invocation output details.""" + + metadata: Optional[InvokeAgentMetadata] + parsedResponse: Optional[Dict[str, Any]] + rawResponse: Optional[Dict[str, Any]] + reasoningContent: Optional[Dict[str, Any]] + traceId: Optional[str] + + +class InvokeAgentOrchestrationTrace(TypedDict, total=False): + """Orchestration trace information.""" + + modelInvocationInput: Optional[InvokeAgentModelInvocationInput] + modelInvocationOutput: Optional[InvokeAgentModelInvocationOutput] + + +class InvokeAgentPreProcessingTrace(TypedDict, total=False): + """Pre-processing trace information.""" + + modelInvocationInput: Optional[InvokeAgentModelInvocationInput] + modelInvocationOutput: Optional[InvokeAgentModelInvocationOutput] + + +class InvokeAgentTrace(TypedDict, total=False): + """Trace information container.""" + + orchestrationTrace: Optional[InvokeAgentOrchestrationTrace] + preProcessingTrace: Optional[InvokeAgentPreProcessingTrace] + + +class InvokeAgentCallerChain(TypedDict, total=False): + """Caller chain information.""" + + agentAliasArn: str + + +class InvokeAgentTracePayload(TypedDict, total=False): + """Payload for trace events.""" + + agentAliasId: str + agentId: str + agentVersion: str + callerChain: List[InvokeAgentCallerChain] + eventTime: str + sessionId: str + trace: InvokeAgentTrace + + +class InvokeAgentChunkPayload(TypedDict, total=False): + """Payload for chunk events containing response content.""" + + bytes: str # Base64 encoded response content + + +class InvokeAgentEventPayload(TypedDict, total=False): + """Union type for different event payload types.""" + + # Trace event fields + agentAliasId: Optional[str] + agentId: Optional[str] + agentVersion: Optional[str] + callerChain: Optional[List[InvokeAgentCallerChain]] + eventTime: Optional[str] + sessionId: Optional[str] + trace: Optional[InvokeAgentTrace] + + # Chunk event fields + bytes: Optional[str] + + +class InvokeAgentEvent(TypedDict, total=False): + """Complete event structure for AWS Invoke Agent responses.""" + + headers: InvokeAgentEventHeaders + payload: Optional[InvokeAgentEventPayload] + + +# Type aliases for convenience +InvokeAgentEventList = List[InvokeAgentEvent] +InvokeAgentTraceEvent = InvokeAgentEvent # When headers.event_type == 'trace' +InvokeAgentChunkEvent = InvokeAgentEvent # When headers.event_type == 'chunk' diff --git a/litellm/utils.py b/litellm/utils.py index 632f2151e0e..47638afd11b 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -6515,6 +6515,12 @@ class ProviderConfigManager: if bedrock_route == "converse" or bedrock_route == "converse_like": return litellm.AmazonConverseConfig() + elif bedrock_route == "agent": + from litellm.llms.bedrock.chat.invoke_agent.transformation import ( + AmazonInvokeAgentConfig, + ) + + return AmazonInvokeAgentConfig() elif bedrock_invoke_provider == "amazon": # amazon titan llms return litellm.AmazonTitanConfig() elif bedrock_invoke_provider == "anthropic": diff --git a/tests/llm_translation/test_bedrock_agents.py b/tests/llm_translation/test_bedrock_agents.py new file mode 100644 index 00000000000..5b0de570c36 --- /dev/null +++ b/tests/llm_translation/test_bedrock_agents.py @@ -0,0 +1,64 @@ +import os +import sys +import traceback + +from dotenv import load_dotenv + +import litellm.types + +load_dotenv() +import io +import os +import json + +sys.path.insert( + 0, os.path.abspath("../..") +) # Adds the parent directory to the system path +from unittest.mock import AsyncMock, Mock, patch + +import pytest + +@pytest.mark.asyncio +async def test_bedrock_agents(): + litellm._turn_on_debug() + response = litellm.completion( + model="bedrock/agent/L1RT58GYRW/MFPSBCXYTW", + messages=[ + { + "role": "user", + "content": "Hi just respond with a ping message" + } + ], + ) + + ######################################################### + ######################################################### + print("response from agent=", response.model_dump_json(indent=4)) + + # assert that the message content has a response with some length + assert len(response.choices[0].message.content) > 0 + + + # assert we were able to get the response cost + assert response._hidden_params["response_cost"] is not None and response._hidden_params["response_cost"] > 0 + + pass + +@pytest.mark.asyncio +async def test_bedrock_agents_with_streaming(): + # litellm._turn_on_debug() + response = litellm.completion( + model="bedrock/agent/L1RT58GYRW/MFPSBCXYTW", + messages=[ + { + "role": "user", + "content": "Hi who is ishaan cto of litellm, tell me 10 things about him" + } + ], + stream=True, + ) + + for chunk in response: + print("final chunk=", chunk) + + pass \ No newline at end of file diff --git a/tests/test_litellm/llms/bedrock/invoke_agent/test_bedrock_agent_transformation.py b/tests/test_litellm/llms/bedrock/invoke_agent/test_bedrock_agent_transformation.py new file mode 100644 index 00000000000..ef2bb3757fc --- /dev/null +++ b/tests/test_litellm/llms/bedrock/invoke_agent/test_bedrock_agent_transformation.py @@ -0,0 +1,272 @@ +import base64 +import json +import os +import sys +import uuid +from unittest.mock import MagicMock, Mock, patch + +import pytest +from fastapi.testclient import TestClient + +sys.path.insert( + 0, os.path.abspath("../../../..") +) # Adds the parent directory to the system path + +from litellm.llms.bedrock.chat.invoke_agent.transformation import ( + AmazonInvokeAgentConfig, +) +from litellm.types.llms.bedrock_invoke_agents import ( + InvokeAgentEvent, + InvokeAgentEventHeaders, + InvokeAgentUsage, +) +from litellm.types.utils import Message, ModelResponse, Usage + + +class TestAmazonInvokeAgentConfig: + """Test suite for AmazonInvokeAgentConfig methods""" + + @pytest.fixture + def config(self): + """Create a test instance of AmazonInvokeAgentConfig""" + return AmazonInvokeAgentConfig() + + @pytest.fixture + def sample_messages(self): + """Sample messages for testing""" + return [ + {"role": "user", "content": "Hello, how can you help me?"}, + {"role": "assistant", "content": "I can help with various tasks."}, + {"role": "user", "content": "What is the weather like?"}, + ] + + @pytest.fixture + def sample_events(self): + """Sample events for testing event parsing""" + return [ + { + "headers": {"event_type": "chunk"}, + "payload": { + "bytes": base64.b64encode("Hello ".encode("utf-8")).decode("utf-8") + }, + }, + { + "headers": {"event_type": "chunk"}, + "payload": { + "bytes": base64.b64encode("world!".encode("utf-8")).decode("utf-8") + }, + }, + { + "headers": {"event_type": "trace"}, + "payload": { + "trace": { + "preProcessingTrace": { + "modelInvocationOutput": { + "metadata": { + "usage": {"inputTokens": 10, "outputTokens": 20} + } + } + }, + "orchestrationTrace": { + "modelInvocationInput": { + "foundationModel": "anthropic.claude-v2" + } + }, + } + }, + }, + ] + + def test_get_agent_id_and_alias_id_valid(self, config): + """Test parsing valid agent model string""" + model = "agent/L1RT58GYRW/MFPSBCXYTW" + agent_id, agent_alias_id = config._get_agent_id_and_alias_id(model) + + assert agent_id == "L1RT58GYRW" + assert agent_alias_id == "MFPSBCXYTW" + + def test_get_agent_id_and_alias_id_invalid_format(self, config): + """Test parsing invalid agent model string""" + invalid_models = [ + "invalid/L1RT58GYRW/MFPSBCXYTW", # Wrong prefix + "agent/L1RT58GYRW", # Missing alias + "agent/L1RT58GYRW/MFPSBCXYTW/extra", # Too many parts + "L1RT58GYRW/MFPSBCXYTW", # Missing prefix + ] + + for invalid_model in invalid_models: + with pytest.raises(ValueError, match="Invalid model format"): + config._get_agent_id_and_alias_id(invalid_model) + + @patch( + "litellm.llms.bedrock.chat.invoke_agent.transformation.convert_content_list_to_str" + ) + def test_transform_request(self, mock_convert, config, sample_messages): + """Test transform_request method""" + mock_convert.return_value = "What is the weather like?" + + model = "agent/TEST123/ALIAS456" + optional_params = {} + litellm_params = {} + headers = {} + + result = config.transform_request( + model, sample_messages, optional_params, litellm_params, headers + ) + + expected = { + "inputText": "What is the weather like?", + "enableTrace": True, + } + assert result == expected + mock_convert.assert_called_once_with(sample_messages[-1]) + + def test_extract_response_content(self, config, sample_events): + """Test _extract_response_content method""" + result = config._extract_response_content(sample_events) + assert result == "Hello world!" + + def test_extract_response_content_empty_events(self, config): + """Test _extract_response_content with empty events""" + result = config._extract_response_content([]) + assert result == "" + + def test_extract_response_content_no_chunk_events(self, config): + """Test _extract_response_content with no chunk events""" + events = [{"headers": {"event_type": "trace"}, "payload": {"some": "data"}}] + result = config._extract_response_content(events) + assert result == "" + + def test_is_trace_event(self, config): + """Test _is_trace_event method""" + trace_event = {"headers": {"event_type": "trace"}, "payload": {"some": "data"}} + chunk_event = {"headers": {"event_type": "chunk"}, "payload": {"bytes": "data"}} + invalid_event = {"headers": {"event_type": "trace"}, "payload": None} + + assert config._is_trace_event(trace_event) is True + assert config._is_trace_event(chunk_event) is False + assert config._is_trace_event(invalid_event) is False + + def test_get_trace_data(self, config): + """Test _get_trace_data method""" + event = {"payload": {"trace": {"preProcessingTrace": {"some": "data"}}}} + result = config._get_trace_data(event) + assert result == {"preProcessingTrace": {"some": "data"}} + + def test_get_trace_data_no_payload(self, config): + """Test _get_trace_data with no payload""" + event = {"payload": None} + result = config._get_trace_data(event) + assert result is None + + def test_extract_usage_info(self, config, sample_events): + """Test _extract_usage_info method""" + result = config._extract_usage_info(sample_events) + + assert result["inputTokens"] == 10 + assert result["outputTokens"] == 20 + assert result["model"] == "anthropic.claude-v2" + + def test_extract_usage_info_empty_events(self, config): + """Test _extract_usage_info with empty events""" + result = config._extract_usage_info([]) + + assert result["inputTokens"] == 0 + assert result["outputTokens"] == 0 + assert result["model"] is None + + def test_extract_and_update_preprocessing_usage(self, config): + """Test _extract_and_update_preprocessing_usage method""" + trace_data = { + "preProcessingTrace": { + "modelInvocationOutput": { + "metadata": {"usage": {"inputTokens": 15, "outputTokens": 25}} + } + } + } + usage_info = {"inputTokens": 5, "outputTokens": 10, "model": None} + + config._extract_and_update_preprocessing_usage(trace_data, usage_info) + + assert usage_info["inputTokens"] == 20 # 5 + 15 + assert usage_info["outputTokens"] == 35 # 10 + 25 + + def test_extract_and_update_preprocessing_usage_no_data(self, config): + """Test _extract_and_update_preprocessing_usage with missing data""" + trace_data = {} + usage_info = {"inputTokens": 5, "outputTokens": 10, "model": None} + + config._extract_and_update_preprocessing_usage(trace_data, usage_info) + + # Should remain unchanged + assert usage_info["inputTokens"] == 5 + assert usage_info["outputTokens"] == 10 + + def test_extract_orchestration_model(self, config): + """Test _extract_orchestration_model method""" + trace_data = { + "orchestrationTrace": { + "modelInvocationInput": {"foundationModel": "anthropic.claude-v2"} + } + } + result = config._extract_orchestration_model(trace_data) + assert result == "anthropic.claude-v2" + + def test_extract_orchestration_model_no_data(self, config): + """Test _extract_orchestration_model with missing data""" + trace_data = {} + result = config._extract_orchestration_model(trace_data) + assert result is None + + def test_build_model_response(self, config): + """Test _build_model_response method""" + content = "Hello, world!" + model = "agent/TEST123/ALIAS456" + usage_info = { + "inputTokens": 10, + "outputTokens": 20, + "model": "anthropic.claude-v2", + } + model_response = ModelResponse() + + result = config._build_model_response( + content, model, usage_info, model_response + ) + + assert len(result.choices) == 1 + assert result.choices[0].message.content == content + assert result.choices[0].message.role == "assistant" + assert result.choices[0].finish_reason == "stop" + assert result.model == "anthropic.claude-v2" + assert hasattr(result, "usage") + assert result.usage.prompt_tokens == 10 + assert result.usage.completion_tokens == 20 + assert result.usage.total_tokens == 30 + + @patch( + "litellm.llms.bedrock.chat.invoke_agent.transformation.convert_content_list_to_str" + ) + @patch.object(AmazonInvokeAgentConfig, "get_runtime_endpoint") + @patch.object(AmazonInvokeAgentConfig, "_get_aws_region_name") + def test_get_complete_url(self, mock_region, mock_endpoint, mock_convert, config): + """Test get_complete_url method""" + mock_endpoint.return_value = ( + "https://bedrock-runtime.us-east-1.amazonaws.com", + None, + ) + mock_region.return_value = "us-east-1" + + api_base = None + api_key = None + model = "agent/L1RT58GYRW/MFPSBCXYTW" + optional_params = {} + litellm_params = {} + + result = config.get_complete_url( + api_base, api_key, model, optional_params, litellm_params + ) + + assert ( + "https://bedrock-runtime.us-east-1.amazonaws.com/agents/L1RT58GYRW/agentAliases/MFPSBCXYTW/sessions" + in result + ) From deb257dc107fc72bdee932953ee803023b73c838 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 17:48:34 -0700 Subject: [PATCH 08/77] fix: import session handling --- .../enterprise_callbacks}/session_handler.py | 84 +++++++++++-------- litellm/proxy/proxy_config.yaml | 8 +- .../transformation.py | 20 ++--- 3 files changed, 65 insertions(+), 47 deletions(-) rename enterprise/{enterprise_hooks => litellm_enterprise/enterprise_callbacks}/session_handler.py (73%) diff --git a/enterprise/enterprise_hooks/session_handler.py b/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py similarity index 73% rename from enterprise/enterprise_hooks/session_handler.py rename to enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py index b9d7eab877e..62e1b5b0a70 100644 --- a/enterprise/enterprise_hooks/session_handler.py +++ b/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py @@ -1,17 +1,19 @@ -from litellm.proxy._types import SpendLogsPayload -from litellm._logging import verbose_proxy_logger -from typing import Optional, List, Union import json -from litellm.types.utils import ModelResponse, Message +from typing import List, Optional, Union, cast + +from litellm._logging import verbose_proxy_logger +from litellm.proxy._types import SpendLogsPayload +from litellm.responses.litellm_completion_transformation.transformation import ( + ChatCompletionSession, +) +from litellm.responses.utils import ResponsesAPIRequestUtils from litellm.types.llms.openai import ( AllMessageValues, ChatCompletionResponseMessage, GenericChatCompletionMessage, ResponseInputParam, ) -from litellm.types.utils import ChatCompletionMessageToolCall -from litellm.responses.utils import ResponsesAPIRequestUtils -from litellm.responses.litellm_completion_transformation.transformation import ChatCompletionSession +from litellm.types.utils import ChatCompletionMessageToolCall, Message, ModelResponse class _ENTERPRISE_ResponsesSessionHandler: @@ -22,9 +24,16 @@ class _ENTERPRISE_ResponsesSessionHandler: """ Return the chat completion message history for a previous response id """ - from litellm.responses.litellm_completion_transformation.transformation import LiteLLMCompletionResponsesConfig - all_spend_logs: List[SpendLogsPayload] = await _ENTERPRISE_ResponsesSessionHandler.get_all_spend_logs_for_previous_response_id(previous_response_id) - + from litellm.responses.litellm_completion_transformation.transformation import ( + LiteLLMCompletionResponsesConfig, + ) + + all_spend_logs: List[ + SpendLogsPayload + ] = await _ENTERPRISE_ResponsesSessionHandler.get_all_spend_logs_for_previous_response_id( + previous_response_id + ) + litellm_session_id: Optional[str] = None if len(all_spend_logs) > 0: litellm_session_id = all_spend_logs[0].get("session_id") @@ -39,14 +48,16 @@ class _ENTERPRISE_ResponsesSessionHandler: ] ] = [] for spend_log in all_spend_logs: - proxy_server_request: Union[str, dict] = spend_log.get("proxy_server_request") or "{}" + proxy_server_request: Union[str, dict] = ( + spend_log.get("proxy_server_request") or "{}" + ) proxy_server_request_dict: Optional[dict] = None response_input_param: Optional[Union[str, ResponseInputParam]] = None if isinstance(proxy_server_request, dict): proxy_server_request_dict = proxy_server_request else: proxy_server_request_dict = json.loads(proxy_server_request) - + ############################################################ # Add Input messages for this Spend Log ############################################################ @@ -55,15 +66,17 @@ class _ENTERPRISE_ResponsesSessionHandler: if isinstance(_response_input_param, str): response_input_param = _response_input_param elif isinstance(_response_input_param, dict): - response_input_param = ResponseInputParam(**_response_input_param) - + response_input_param = cast( + ResponseInputParam, _response_input_param + ) + if response_input_param: chat_completion_messages = LiteLLMCompletionResponsesConfig.transform_responses_api_input_to_messages( input=response_input_param, - responses_api_request=proxy_server_request_dict or {} + responses_api_request=proxy_server_request_dict or {}, ) chat_completion_message_history.extend(chat_completion_messages) - + ############################################################ # Add Output messages for this Spend Log ############################################################ @@ -73,17 +86,22 @@ class _ENTERPRISE_ResponsesSessionHandler: model_response = ModelResponse(**_response_output) for choice in model_response.choices: if hasattr(choice, "message"): - chat_completion_message_history.append(choice.message) - - verbose_proxy_logger.debug("chat_completion_message_history %s", json.dumps(chat_completion_message_history, indent=4, default=str)) + chat_completion_message_history.append( + getattr(choice, "message") + ) + + verbose_proxy_logger.debug( + "chat_completion_message_history %s", + json.dumps(chat_completion_message_history, indent=4, default=str), + ) return ChatCompletionSession( messages=chat_completion_message_history, - litellm_session_id=litellm_session_id + litellm_session_id=litellm_session_id, ) @staticmethod async def get_all_spend_logs_for_previous_response_id( - previous_response_id: str + previous_response_id: str, ) -> List[SpendLogsPayload]: """ Get all spend logs for a previous response id @@ -94,8 +112,15 @@ class _ENTERPRISE_ResponsesSessionHandler: SELECT session_id FROM spend_logs WHERE response_id = previous_response_id, SELECT * FROM spend_logs WHERE session_id = session_id """ from litellm.proxy.proxy_server import prisma_client - decoded_response_id = ResponsesAPIRequestUtils._decode_responses_api_response_id(previous_response_id) - previous_response_id = decoded_response_id.get("response_id", previous_response_id) + + decoded_response_id = ( + ResponsesAPIRequestUtils._decode_responses_api_response_id( + previous_response_id + ) + ) + previous_response_id = decoded_response_id.get( + "response_id", previous_response_id + ) if prisma_client is None: return [] @@ -111,21 +136,12 @@ class _ENTERPRISE_ResponsesSessionHandler: ORDER BY "endTime" ASC; """ - spend_logs = await prisma_client.db.query_raw( - query, - previous_response_id - ) + spend_logs = await prisma_client.db.query_raw(query, previous_response_id) verbose_proxy_logger.debug( "Found the following spend logs for previous response id %s: %s", previous_response_id, - json.dumps(spend_logs, indent=4, default=str) + json.dumps(spend_logs, indent=4, default=str), ) - return spend_logs - - - - - diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index 5af761a96de..c8a2eb38993 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -1,4 +1,8 @@ model_list: - - model_name: openai/* + - model_name: anthropic/* litellm_params: - model: openai/* \ No newline at end of file + model: anthropic/* + + +general_settings: + store_prompts_in_spend_logs: true \ No newline at end of file diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index baffca3ac68..c7b8ed88efc 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -7,16 +7,17 @@ from typing import Any, Dict, List, Optional, Union from openai.types.responses.tool_param import FunctionToolParam from typing_extensions import TypedDict -HAS_ENTERPRISE_DIRECTORY = False +from litellm._logging import verbose_logger + try: - from enterprise.enterprise_hooks.session_handler import ( + from litellm_enterprise.enterprise_callbacks.session_handler import ( _ENTERPRISE_ResponsesSessionHandler, ) - - HAS_ENTERPRISE_DIRECTORY = True -except ImportError: - _ENTERPRISE_ResponsesSessionHandler = None # type: ignore - HAS_ENTERPRISE_DIRECTORY = False +except Exception as e: + verbose_logger.debug( + f"[Non-Blocking] Unable to import _ENTERPRISE_ResponsesSessionHandler - LiteLLM Enterprise Feature - {str(e)}" + ) + _ENTERPRISE_ResponsesSessionHandler = None from litellm.caching import InMemoryCache from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj @@ -197,10 +198,7 @@ class LiteLLMCompletionResponsesConfig: """ Async hook to get the chain of previous input and output pairs and return a list of Chat Completion messages """ - if ( - HAS_ENTERPRISE_DIRECTORY is True - and _ENTERPRISE_ResponsesSessionHandler is not None - ): + if _ENTERPRISE_ResponsesSessionHandler is not None: chat_completion_session = ChatCompletionSession( messages=[], litellm_session_id=None ) From 0d4c85c419a2a360c8b2a9b303c02490d8310a30 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 17:54:24 -0700 Subject: [PATCH 09/77] Revert "fix: import session handling" This reverts commit deb257dc107fc72bdee932953ee803023b73c838. --- .../session_handler.py | 84 ++++++++----------- litellm/proxy/proxy_config.yaml | 8 +- .../transformation.py | 20 +++-- 3 files changed, 47 insertions(+), 65 deletions(-) rename enterprise/{litellm_enterprise/enterprise_callbacks => enterprise_hooks}/session_handler.py (73%) diff --git a/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py b/enterprise/enterprise_hooks/session_handler.py similarity index 73% rename from enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py rename to enterprise/enterprise_hooks/session_handler.py index 62e1b5b0a70..b9d7eab877e 100644 --- a/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py +++ b/enterprise/enterprise_hooks/session_handler.py @@ -1,19 +1,17 @@ -import json -from typing import List, Optional, Union, cast - -from litellm._logging import verbose_proxy_logger from litellm.proxy._types import SpendLogsPayload -from litellm.responses.litellm_completion_transformation.transformation import ( - ChatCompletionSession, -) -from litellm.responses.utils import ResponsesAPIRequestUtils +from litellm._logging import verbose_proxy_logger +from typing import Optional, List, Union +import json +from litellm.types.utils import ModelResponse, Message from litellm.types.llms.openai import ( AllMessageValues, ChatCompletionResponseMessage, GenericChatCompletionMessage, ResponseInputParam, ) -from litellm.types.utils import ChatCompletionMessageToolCall, Message, ModelResponse +from litellm.types.utils import ChatCompletionMessageToolCall +from litellm.responses.utils import ResponsesAPIRequestUtils +from litellm.responses.litellm_completion_transformation.transformation import ChatCompletionSession class _ENTERPRISE_ResponsesSessionHandler: @@ -24,16 +22,9 @@ class _ENTERPRISE_ResponsesSessionHandler: """ Return the chat completion message history for a previous response id """ - from litellm.responses.litellm_completion_transformation.transformation import ( - LiteLLMCompletionResponsesConfig, - ) - - all_spend_logs: List[ - SpendLogsPayload - ] = await _ENTERPRISE_ResponsesSessionHandler.get_all_spend_logs_for_previous_response_id( - previous_response_id - ) - + from litellm.responses.litellm_completion_transformation.transformation import LiteLLMCompletionResponsesConfig + all_spend_logs: List[SpendLogsPayload] = await _ENTERPRISE_ResponsesSessionHandler.get_all_spend_logs_for_previous_response_id(previous_response_id) + litellm_session_id: Optional[str] = None if len(all_spend_logs) > 0: litellm_session_id = all_spend_logs[0].get("session_id") @@ -48,16 +39,14 @@ class _ENTERPRISE_ResponsesSessionHandler: ] ] = [] for spend_log in all_spend_logs: - proxy_server_request: Union[str, dict] = ( - spend_log.get("proxy_server_request") or "{}" - ) + proxy_server_request: Union[str, dict] = spend_log.get("proxy_server_request") or "{}" proxy_server_request_dict: Optional[dict] = None response_input_param: Optional[Union[str, ResponseInputParam]] = None if isinstance(proxy_server_request, dict): proxy_server_request_dict = proxy_server_request else: proxy_server_request_dict = json.loads(proxy_server_request) - + ############################################################ # Add Input messages for this Spend Log ############################################################ @@ -66,17 +55,15 @@ class _ENTERPRISE_ResponsesSessionHandler: if isinstance(_response_input_param, str): response_input_param = _response_input_param elif isinstance(_response_input_param, dict): - response_input_param = cast( - ResponseInputParam, _response_input_param - ) - + response_input_param = ResponseInputParam(**_response_input_param) + if response_input_param: chat_completion_messages = LiteLLMCompletionResponsesConfig.transform_responses_api_input_to_messages( input=response_input_param, - responses_api_request=proxy_server_request_dict or {}, + responses_api_request=proxy_server_request_dict or {} ) chat_completion_message_history.extend(chat_completion_messages) - + ############################################################ # Add Output messages for this Spend Log ############################################################ @@ -86,22 +73,17 @@ class _ENTERPRISE_ResponsesSessionHandler: model_response = ModelResponse(**_response_output) for choice in model_response.choices: if hasattr(choice, "message"): - chat_completion_message_history.append( - getattr(choice, "message") - ) - - verbose_proxy_logger.debug( - "chat_completion_message_history %s", - json.dumps(chat_completion_message_history, indent=4, default=str), - ) + chat_completion_message_history.append(choice.message) + + verbose_proxy_logger.debug("chat_completion_message_history %s", json.dumps(chat_completion_message_history, indent=4, default=str)) return ChatCompletionSession( messages=chat_completion_message_history, - litellm_session_id=litellm_session_id, + litellm_session_id=litellm_session_id ) @staticmethod async def get_all_spend_logs_for_previous_response_id( - previous_response_id: str, + previous_response_id: str ) -> List[SpendLogsPayload]: """ Get all spend logs for a previous response id @@ -112,15 +94,8 @@ class _ENTERPRISE_ResponsesSessionHandler: SELECT session_id FROM spend_logs WHERE response_id = previous_response_id, SELECT * FROM spend_logs WHERE session_id = session_id """ from litellm.proxy.proxy_server import prisma_client - - decoded_response_id = ( - ResponsesAPIRequestUtils._decode_responses_api_response_id( - previous_response_id - ) - ) - previous_response_id = decoded_response_id.get( - "response_id", previous_response_id - ) + decoded_response_id = ResponsesAPIRequestUtils._decode_responses_api_response_id(previous_response_id) + previous_response_id = decoded_response_id.get("response_id", previous_response_id) if prisma_client is None: return [] @@ -136,12 +111,21 @@ class _ENTERPRISE_ResponsesSessionHandler: ORDER BY "endTime" ASC; """ - spend_logs = await prisma_client.db.query_raw(query, previous_response_id) + spend_logs = await prisma_client.db.query_raw( + query, + previous_response_id + ) verbose_proxy_logger.debug( "Found the following spend logs for previous response id %s: %s", previous_response_id, - json.dumps(spend_logs, indent=4, default=str), + json.dumps(spend_logs, indent=4, default=str) ) + return spend_logs + + + + + diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index c8a2eb38993..5af761a96de 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -1,8 +1,4 @@ model_list: - - model_name: anthropic/* + - model_name: openai/* litellm_params: - model: anthropic/* - - -general_settings: - store_prompts_in_spend_logs: true \ No newline at end of file + model: openai/* \ No newline at end of file diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index c7b8ed88efc..baffca3ac68 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -7,17 +7,16 @@ from typing import Any, Dict, List, Optional, Union from openai.types.responses.tool_param import FunctionToolParam from typing_extensions import TypedDict -from litellm._logging import verbose_logger - +HAS_ENTERPRISE_DIRECTORY = False try: - from litellm_enterprise.enterprise_callbacks.session_handler import ( + from enterprise.enterprise_hooks.session_handler import ( _ENTERPRISE_ResponsesSessionHandler, ) -except Exception as e: - verbose_logger.debug( - f"[Non-Blocking] Unable to import _ENTERPRISE_ResponsesSessionHandler - LiteLLM Enterprise Feature - {str(e)}" - ) - _ENTERPRISE_ResponsesSessionHandler = None + + HAS_ENTERPRISE_DIRECTORY = True +except ImportError: + _ENTERPRISE_ResponsesSessionHandler = None # type: ignore + HAS_ENTERPRISE_DIRECTORY = False from litellm.caching import InMemoryCache from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj @@ -198,7 +197,10 @@ class LiteLLMCompletionResponsesConfig: """ Async hook to get the chain of previous input and output pairs and return a list of Chat Completion messages """ - if _ENTERPRISE_ResponsesSessionHandler is not None: + if ( + HAS_ENTERPRISE_DIRECTORY is True + and _ENTERPRISE_ResponsesSessionHandler is not None + ): chat_completion_session = ChatCompletionSession( messages=[], litellm_session_id=None ) From 62a083de0237c97a64b5539bc48c426aebdf9d88 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 19:58:31 -0700 Subject: [PATCH 10/77] fix: linting pin mypy --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8ad7e52683e..30738443d51 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -79,7 +79,7 @@ jobs: pip install "pytest-retry==1.6.3" pip install "pytest-asyncio==0.21.1" pip install "pytest-cov==5.0.0" - pip install mypy + pip install "mypy==1.15.0" pip install "google-generativeai==0.3.2" pip install "google-cloud-aiplatform==1.43.0" pip install pyarrow From f24d8919c4ccb4eebcfaa8d81555cdf8898eee4b Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 20:01:44 -0700 Subject: [PATCH 11/77] [Feat]: Guardrails - Add streaming for bedrock post guard (#11247) * feat: add streaming for bedrock post guard * fix: bedrock guardrails * fix: add clear comments * Update litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: clean up bedrock guardrails --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../guardrail_hooks/bedrock_guardrails.py | 54 +++- litellm/proxy/proxy_config.yaml | 12 +- .../test_bedrock_guardrails.py | 242 +++++++++++++++++- 3 files changed, 291 insertions(+), 17 deletions(-) diff --git a/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py b/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py index d3d3692dd35..f4d1076ae26 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py +++ b/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py @@ -13,7 +13,7 @@ sys.path.insert( ) # Adds the parent directory to the system path import json import sys -from typing import Any, List, Literal, Optional, Tuple, Union +from typing import Any, AsyncGenerator, List, Literal, Optional, Tuple, Union from fastapi import HTTPException @@ -40,7 +40,7 @@ from litellm.types.proxy.guardrails.guardrail_hooks.bedrock_guardrails import ( BedrockRequest, BedrockTextContent, ) -from litellm.types.utils import ModelResponse +from litellm.types.utils import ModelResponse, ModelResponseStream GUARDRAIL_NAME = "bedrock" @@ -475,6 +475,56 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): messages=messages, masked_texts=masked_texts ) + async def async_post_call_streaming_iterator_hook( + self, + user_api_key_dict: UserAPIKeyAuth, + response: Any, + request_data: dict, + ) -> AsyncGenerator[ModelResponseStream, None]: + """ + Process streaming response chunks. + + Collect content from the stream and make a bedrock api request to get the guardrail response. + """ + # Import here to avoid circular imports + from litellm.llms.base_llm.base_model_iterator import MockResponseIterator + from litellm.main import stream_chunk_builder + from litellm.types.utils import TextCompletionResponse + + # Collect all chunks to process them together + all_chunks: List[ModelResponseStream] = [] + async for chunk in response: + all_chunks.append(chunk) + + assembled_model_response: Optional[ + Union[ModelResponse, TextCompletionResponse] + ] = stream_chunk_builder( + chunks=all_chunks, + ) + if isinstance(assembled_model_response, ModelResponse): + #################################################################### + ########## 1. Make the Bedrock Apply Guardrail API request ########## + + # Bedrock will raise an exception if this violates the guardrail policy + ################################################################### + await self.make_bedrock_api_request( + kwargs=request_data, response=assembled_model_response + ) + + ######################################################################### + ########## If guardrail passed, then return the collected chunks ########## + ######################################################################### + mock_response = MockResponseIterator( + model_response=assembled_model_response + ) + + # Return the reconstructed stream + async for chunk in mock_response: + yield chunk + else: + for chunk in all_chunks: + yield chunk + def _extract_masked_texts_from_response( self, bedrock_guardrail_response: BedrockGuardrailResponse ) -> List[str]: diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index 5af761a96de..df7bc294a0c 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -1,4 +1,14 @@ model_list: - model_name: openai/* litellm_params: - model: openai/* \ No newline at end of file + model: openai/* + +guardrails: + - guardrail_name: "bedrock-pre-guard" + litellm_params: + guardrail: bedrock # supported values: "aporia", "bedrock", "lakera" + mode: "post_call" + guardrailIdentifier: wf0hkdb5x07f # your guardrail ID on bedrock + guardrailVersion: "DRAFT" # your guardrail version on bedrock + default_on: true + \ No newline at end of file diff --git a/tests/guardrails_tests/test_bedrock_guardrails.py b/tests/guardrails_tests/test_bedrock_guardrails.py index 9252a0dffc2..bd537b73096 100644 --- a/tests/guardrails_tests/test_bedrock_guardrails.py +++ b/tests/guardrails_tests/test_bedrock_guardrails.py @@ -5,16 +5,21 @@ import pytest sys.path.insert(0, os.path.abspath("../..")) import litellm from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import BedrockGuardrail +from litellm.proxy._types import UserAPIKeyAuth +from litellm.caching import DualCache +from unittest.mock import MagicMock @pytest.mark.asyncio async def test_bedrock_guardrails(): + # Create proper mock objects + mock_user_api_key_dict = UserAPIKeyAuth() + guardrail = BedrockGuardrail( guardrailIdentifier="wf0hkdb5x07f", guardrailVersion="DRAFT", mask_request_content=True, ) - request_data = { "model": "gpt-4o", "messages": [ @@ -27,20 +32,23 @@ async def test_bedrock_guardrails(): response = await guardrail.async_moderation_hook( data=request_data, - user_api_key_dict={}, + user_api_key_dict=mock_user_api_key_dict, call_type="completion" ) print(response) - - assert response["messages"][0]["content"] == "Hello, my phone number is {PHONE}" - assert response["messages"][1]["content"] == "Hello, how can I help you today?" - assert response["messages"][2]["content"] == "I need to cancel my order" - assert response["messages"][3]["content"] == "ok, my credit card number is {CREDIT_DEBIT_CARD_NUMBER}" + if response: # Only assert if response is not None + assert response["messages"][0]["content"] == "Hello, my phone number is {PHONE}" + assert response["messages"][1]["content"] == "Hello, how can I help you today?" + assert response["messages"][2]["content"] == "I need to cancel my order" + assert response["messages"][3]["content"] == "ok, my credit card number is {CREDIT_DEBIT_CARD_NUMBER}" @pytest.mark.asyncio async def test_bedrock_guardrails_content_list(): + # Create proper mock objects + mock_user_api_key_dict = UserAPIKeyAuth() + guardrail = BedrockGuardrail( guardrailIdentifier="wf0hkdb5x07f", guardrailVersion="DRAFT", @@ -64,16 +72,222 @@ async def test_bedrock_guardrails_content_list(): response = await guardrail.async_moderation_hook( data=request_data, - user_api_key_dict={}, + user_api_key_dict=mock_user_api_key_dict, call_type="completion" ) print(response) - # Verify that the list content is properly masked - assert isinstance(response["messages"][0]["content"], list) - assert response["messages"][0]["content"][0]["text"] == "Hello, my phone number is {PHONE}" - assert response["messages"][0]["content"][1]["text"] == "what time is it?" - assert response["messages"][1]["content"] == "Hello, how can I help you today?" - assert response["messages"][2]["content"] == "who is the president of the united states?" + if response: # Only assert if response is not None + # Verify that the list content is properly masked + assert isinstance(response["messages"][0]["content"], list) + assert response["messages"][0]["content"][0]["text"] == "Hello, my phone number is {PHONE}" + assert response["messages"][0]["content"][1]["text"] == "what time is it?" + assert response["messages"][1]["content"] == "Hello, how can I help you today?" + assert response["messages"][2]["content"] == "who is the president of the united states?" + + + +@pytest.mark.asyncio +async def test_bedrock_guardrails_with_streaming(): + from litellm.proxy.utils import ProxyLogging + from litellm.types.guardrails import GuardrailEventHooks + + # Create proper mock objects + mock_user_api_key_cache = MagicMock(spec=DualCache) + mock_user_api_key_dict = UserAPIKeyAuth() + + with pytest.raises(Exception): # Assert that this raises an exception + proxy_logging_obj = ProxyLogging( + user_api_key_cache=mock_user_api_key_cache, + premium_user=True, + ) + + guardrail = BedrockGuardrail( + guardrailIdentifier="wf0hkdb5x07f", + guardrailVersion="DRAFT", + supported_event_hooks=[GuardrailEventHooks.post_call], + guardrail_name="bedrock-post-guard", + ) + + litellm.callbacks.append(guardrail) + + request_data = { + "model": "gpt-4o", + "messages": [ + { + "role": "user", + "content": "My name is ishaan@gmail.com" + } + ], + "stream": True, + "metadata": {"guardrails": ["bedrock-post-guard"]} + } + + response = await litellm.acompletion( + **request_data, + ) + + response = proxy_logging_obj.async_post_call_streaming_iterator_hook( + user_api_key_dict=mock_user_api_key_dict, + response=response, + request_data=request_data, + ) + + async for chunk in response: + print(chunk) + + +@pytest.mark.asyncio +async def test_bedrock_guardrails_with_streaming_no_violation(): + from litellm.proxy.utils import ProxyLogging + from litellm.types.guardrails import GuardrailEventHooks + + # Create proper mock objects + mock_user_api_key_cache = MagicMock(spec=DualCache) + mock_user_api_key_dict = UserAPIKeyAuth() + + proxy_logging_obj = ProxyLogging( + user_api_key_cache=mock_user_api_key_cache, + premium_user=True, + ) + + guardrail = BedrockGuardrail( + guardrailIdentifier="wf0hkdb5x07f", + guardrailVersion="DRAFT", + supported_event_hooks=[GuardrailEventHooks.post_call], + guardrail_name="bedrock-post-guard", + ) + + litellm.callbacks.append(guardrail) + + + request_data = { + "model": "gpt-4o", + "messages": [ + { + "role": "user", + "content": "hi" + } + ], + "stream": True, + "metadata": {"guardrails": ["bedrock-post-guard"]} + } + + response = await litellm.acompletion( + **request_data, + ) + + response = proxy_logging_obj.async_post_call_streaming_iterator_hook( + user_api_key_dict=mock_user_api_key_dict, + response=response, + request_data=request_data, + ) + + + async for chunk in response: + print(chunk) + + +@pytest.mark.asyncio +async def test_bedrock_guardrails_streaming_request_body_mock(): + """Test that the exact request body sent to Bedrock matches expected format when using streaming""" + import json + from unittest.mock import AsyncMock, MagicMock, patch + from litellm.proxy._types import UserAPIKeyAuth + from litellm.caching import DualCache + from litellm.types.guardrails import GuardrailEventHooks + + # Create mock objects + mock_user_api_key_dict = UserAPIKeyAuth() + mock_cache = MagicMock(spec=DualCache) + + # Create the guardrail + guardrail = BedrockGuardrail( + guardrailIdentifier="wf0hkdb5x07f", + guardrailVersion="DRAFT", + supported_event_hooks=[GuardrailEventHooks.post_call], + guardrail_name="bedrock-post-guard", + ) + + # Mock the assembled response from streaming + mock_response = litellm.ModelResponse( + id="test-id", + choices=[ + litellm.Choices( + index=0, + message=litellm.Message( + role="assistant", + content="The capital of Spain is Madrid." + ), + finish_reason="stop" + ) + ], + created=1234567890, + model="gpt-4o", + object="chat.completion" + ) + + # Mock Bedrock API response + mock_bedrock_response = MagicMock() + mock_bedrock_response.status_code = 200 + mock_bedrock_response.json.return_value = { + "action": "NONE", + "outputs": [] + } + + # Patch the async_handler.post method to capture the request body + with patch.object(guardrail, 'async_handler') as mock_async_handler: + mock_async_handler.post = AsyncMock(return_value=mock_bedrock_response) + + # Test data - simulating request data and assembled response + request_data = { + "model": "gpt-4o", + "messages": [ + { + "role": "user", + "content": "what's the capital of spain?" + } + ], + "stream": True, + "metadata": {"guardrails": ["bedrock-post-guard"]} + } + + # Call the method that should make the Bedrock API request + await guardrail.make_bedrock_api_request( + kwargs=request_data, + response=mock_response + ) + + # Verify the API call was made + mock_async_handler.post.assert_called_once() + + # Get the request data that was passed + call_args = mock_async_handler.post.call_args + + # The data should be in the 'data' parameter of the prepared request + # We need to parse the JSON from the prepared request body + prepared_request_body = call_args.kwargs.get('data') + + # Parse the JSON body + if isinstance(prepared_request_body, bytes): + actual_body = json.loads(prepared_request_body.decode('utf-8')) + else: + actual_body = json.loads(prepared_request_body) + + # Expected body based on the convert_to_bedrock_format method behavior + expected_body = { + 'source': 'OUTPUT', + 'content': [ + {'text': {'text': "what's the capital of spain?"}}, + {'text': {'text': 'The capital of Spain is Madrid.'}} + ] + } + + print("Actual Bedrock request body:", json.dumps(actual_body, indent=2)) + print("Expected Bedrock request body:", json.dumps(expected_body, indent=2)) + + # Assert the request body matches exactly + assert actual_body == expected_body, f"Request body mismatch. Expected: {expected_body}, Got: {actual_body}" + \ No newline at end of file From 7fcbb38d910616184a90b2e9c5ecade1bd10c9d5 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 20:36:02 -0700 Subject: [PATCH 12/77] [Fix] Responses API - Session management (#11254) * fix: import session handling * fix: imports for session handler * tests: tests for session handler * Update enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../enterprise_callbacks}/session_handler.py | 97 ++++++---- litellm/proxy/proxy_config.yaml | 10 +- .../transformation.py | 21 +- .../test_session_handler.py | 182 ++++++++++++++++++ 4 files changed, 261 insertions(+), 49 deletions(-) rename enterprise/{enterprise_hooks => litellm_enterprise/enterprise_callbacks}/session_handler.py (66%) create mode 100644 tests/enterprise/litellm_enterprise/enterprise_callbacks/test_session_handler.py diff --git a/enterprise/enterprise_hooks/session_handler.py b/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py similarity index 66% rename from enterprise/enterprise_hooks/session_handler.py rename to enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py index b9d7eab877e..1a08a8f9101 100644 --- a/enterprise/enterprise_hooks/session_handler.py +++ b/enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py @@ -1,17 +1,23 @@ -from litellm.proxy._types import SpendLogsPayload -from litellm._logging import verbose_proxy_logger -from typing import Optional, List, Union import json -from litellm.types.utils import ModelResponse, Message +from typing import TYPE_CHECKING, Any, List, Optional, Union, cast + +from litellm._logging import verbose_proxy_logger +from litellm.proxy._types import SpendLogsPayload +from litellm.responses.utils import ResponsesAPIRequestUtils from litellm.types.llms.openai import ( AllMessageValues, ChatCompletionResponseMessage, GenericChatCompletionMessage, ResponseInputParam, ) -from litellm.types.utils import ChatCompletionMessageToolCall -from litellm.responses.utils import ResponsesAPIRequestUtils -from litellm.responses.litellm_completion_transformation.transformation import ChatCompletionSession +from litellm.types.utils import ChatCompletionMessageToolCall, Message, ModelResponse + +if TYPE_CHECKING: + from litellm.responses.litellm_completion_transformation.transformation import ( + ChatCompletionSession, + ) +else: + ChatCompletionSession = Any class _ENTERPRISE_ResponsesSessionHandler: @@ -22,9 +28,23 @@ class _ENTERPRISE_ResponsesSessionHandler: """ Return the chat completion message history for a previous response id """ - from litellm.responses.litellm_completion_transformation.transformation import LiteLLMCompletionResponsesConfig - all_spend_logs: List[SpendLogsPayload] = await _ENTERPRISE_ResponsesSessionHandler.get_all_spend_logs_for_previous_response_id(previous_response_id) - + from litellm.responses.litellm_completion_transformation.transformation import ( + ChatCompletionSession, + LiteLLMCompletionResponsesConfig, + ) + + verbose_proxy_logger.debug( + "inside get_chat_completion_message_history_for_previous_response_id" + ) + all_spend_logs: List[ + SpendLogsPayload + ] = await _ENTERPRISE_ResponsesSessionHandler.get_all_spend_logs_for_previous_response_id( + previous_response_id + ) + verbose_proxy_logger.debug( + "found %s spend logs for this response id", len(all_spend_logs) + ) + litellm_session_id: Optional[str] = None if len(all_spend_logs) > 0: litellm_session_id = all_spend_logs[0].get("session_id") @@ -39,14 +59,16 @@ class _ENTERPRISE_ResponsesSessionHandler: ] ] = [] for spend_log in all_spend_logs: - proxy_server_request: Union[str, dict] = spend_log.get("proxy_server_request") or "{}" + proxy_server_request: Union[str, dict] = ( + spend_log.get("proxy_server_request") or "{}" + ) proxy_server_request_dict: Optional[dict] = None response_input_param: Optional[Union[str, ResponseInputParam]] = None if isinstance(proxy_server_request, dict): proxy_server_request_dict = proxy_server_request else: proxy_server_request_dict = json.loads(proxy_server_request) - + ############################################################ # Add Input messages for this Spend Log ############################################################ @@ -55,15 +77,17 @@ class _ENTERPRISE_ResponsesSessionHandler: if isinstance(_response_input_param, str): response_input_param = _response_input_param elif isinstance(_response_input_param, dict): - response_input_param = ResponseInputParam(**_response_input_param) - + response_input_param = cast( + ResponseInputParam, _response_input_param + ) + if response_input_param: chat_completion_messages = LiteLLMCompletionResponsesConfig.transform_responses_api_input_to_messages( input=response_input_param, - responses_api_request=proxy_server_request_dict or {} + responses_api_request=proxy_server_request_dict or {}, ) chat_completion_message_history.extend(chat_completion_messages) - + ############################################################ # Add Output messages for this Spend Log ############################################################ @@ -73,17 +97,22 @@ class _ENTERPRISE_ResponsesSessionHandler: model_response = ModelResponse(**_response_output) for choice in model_response.choices: if hasattr(choice, "message"): - chat_completion_message_history.append(choice.message) - - verbose_proxy_logger.debug("chat_completion_message_history %s", json.dumps(chat_completion_message_history, indent=4, default=str)) + chat_completion_message_history.append( + getattr(choice, "message") + ) + + verbose_proxy_logger.debug( + "chat_completion_message_history %s", + json.dumps(chat_completion_message_history, indent=4, default=str), + ) return ChatCompletionSession( messages=chat_completion_message_history, - litellm_session_id=litellm_session_id + litellm_session_id=litellm_session_id, ) @staticmethod async def get_all_spend_logs_for_previous_response_id( - previous_response_id: str + previous_response_id: str, ) -> List[SpendLogsPayload]: """ Get all spend logs for a previous response id @@ -94,8 +123,17 @@ class _ENTERPRISE_ResponsesSessionHandler: SELECT session_id FROM spend_logs WHERE response_id = previous_response_id, SELECT * FROM spend_logs WHERE session_id = session_id """ from litellm.proxy.proxy_server import prisma_client - decoded_response_id = ResponsesAPIRequestUtils._decode_responses_api_response_id(previous_response_id) - previous_response_id = decoded_response_id.get("response_id", previous_response_id) + + verbose_proxy_logger.debug("decoding response id=%s", previous_response_id) + + decoded_response_id = ( + ResponsesAPIRequestUtils._decode_responses_api_response_id( + previous_response_id + ) + ) + previous_response_id = decoded_response_id.get( + "response_id", previous_response_id + ) if prisma_client is None: return [] @@ -111,21 +149,12 @@ class _ENTERPRISE_ResponsesSessionHandler: ORDER BY "endTime" ASC; """ - spend_logs = await prisma_client.db.query_raw( - query, - previous_response_id - ) + spend_logs = await prisma_client.db.query_raw(query, previous_response_id) verbose_proxy_logger.debug( "Found the following spend logs for previous response id %s: %s", previous_response_id, - json.dumps(spend_logs, indent=4, default=str) + json.dumps(spend_logs, indent=4, default=str), ) - return spend_logs - - - - - diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index df7bc294a0c..af3dc2b908a 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -1,7 +1,11 @@ model_list: - - model_name: openai/* + - model_name: anthropic/* litellm_params: - model: openai/* + model: anthropic/* + + +general_settings: + store_prompts_in_spend_logs: true guardrails: - guardrail_name: "bedrock-pre-guard" @@ -11,4 +15,4 @@ guardrails: guardrailIdentifier: wf0hkdb5x07f # your guardrail ID on bedrock guardrailVersion: "DRAFT" # your guardrail version on bedrock default_on: true - \ No newline at end of file + diff --git a/litellm/responses/litellm_completion_transformation/transformation.py b/litellm/responses/litellm_completion_transformation/transformation.py index baffca3ac68..ef9a635aec9 100644 --- a/litellm/responses/litellm_completion_transformation/transformation.py +++ b/litellm/responses/litellm_completion_transformation/transformation.py @@ -7,17 +7,17 @@ from typing import Any, Dict, List, Optional, Union from openai.types.responses.tool_param import FunctionToolParam from typing_extensions import TypedDict -HAS_ENTERPRISE_DIRECTORY = False +from litellm._logging import verbose_logger + try: - from enterprise.enterprise_hooks.session_handler import ( + from litellm_enterprise.enterprise_callbacks.session_handler import ( _ENTERPRISE_ResponsesSessionHandler, ) - - HAS_ENTERPRISE_DIRECTORY = True -except ImportError: - _ENTERPRISE_ResponsesSessionHandler = None # type: ignore - HAS_ENTERPRISE_DIRECTORY = False - +except Exception as e: + verbose_logger.debug( + f"[Non-Blocking] Unable to import _ENTERPRISE_ResponsesSessionHandler - LiteLLM Enterprise Feature - {str(e)}" + ) + _ENTERPRISE_ResponsesSessionHandler = None from litellm.caching import InMemoryCache from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.types.llms.openai import ( @@ -197,10 +197,7 @@ class LiteLLMCompletionResponsesConfig: """ Async hook to get the chain of previous input and output pairs and return a list of Chat Completion messages """ - if ( - HAS_ENTERPRISE_DIRECTORY is True - and _ENTERPRISE_ResponsesSessionHandler is not None - ): + if _ENTERPRISE_ResponsesSessionHandler is not None: chat_completion_session = ChatCompletionSession( messages=[], litellm_session_id=None ) diff --git a/tests/enterprise/litellm_enterprise/enterprise_callbacks/test_session_handler.py b/tests/enterprise/litellm_enterprise/enterprise_callbacks/test_session_handler.py new file mode 100644 index 00000000000..dbe163560b0 --- /dev/null +++ b/tests/enterprise/litellm_enterprise/enterprise_callbacks/test_session_handler.py @@ -0,0 +1,182 @@ +import json +import os +import sys +from unittest.mock import AsyncMock, patch + +import pytest +from fastapi import HTTPException +from fastapi.testclient import TestClient + +sys.path.insert( + 0, os.path.abspath("../../..") +) # Adds the parent directory to the system path + + +from enterprise.litellm_enterprise.enterprise_callbacks.session_handler import ( + _ENTERPRISE_ResponsesSessionHandler, +) + + +@pytest.mark.asyncio +async def test_get_chat_completion_message_history_for_previous_response_id(): + """ + Test get_chat_completion_message_history_for_previous_response_id with mock data + """ + # Mock data based on the provided spend logs (simplified version) + mock_spend_logs = [ + { + "request_id": "chatcmpl-935b8dad-fdc2-466e-a8ca-e26e5a8a21bb", + "call_type": "aresponses", + "api_key": "88dc28d0f030c55ed4ab77ed8faf098196cb1c05df778539800c9f1243fe6b4b", + "spend": 0.004803, + "total_tokens": 329, + "prompt_tokens": 11, + "completion_tokens": 318, + "startTime": "2025-05-30T03:17:06.703+00:00", + "endTime": "2025-05-30T03:17:11.894+00:00", + "model": "claude-3-5-sonnet-latest", + "session_id": "a96757c4-c6dc-4c76-b37e-e7dfa526b701", + "proxy_server_request": { + "input": "who is Michael Jordan", + "model": "anthropic/claude-3-5-sonnet-latest", + }, + "response": { + "id": "chatcmpl-935b8dad-fdc2-466e-a8ca-e26e5a8a21bb", + "model": "claude-3-5-sonnet-20241022", + "object": "chat.completion", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Michael Jordan (born February 17, 1963) is widely considered the greatest basketball player of all time. Here are some key points about him...", + "tool_calls": None, + "function_call": None, + }, + "finish_reason": "stop", + } + ], + "created": 1748575031, + "usage": { + "total_tokens": 329, + "prompt_tokens": 11, + "completion_tokens": 318, + }, + }, + "status": "success", + }, + { + "request_id": "chatcmpl-370760c9-39fa-4db7-b034-d1f8d933c935", + "call_type": "aresponses", + "api_key": "88dc28d0f030c55ed4ab77ed8faf098196cb1c05df778539800c9f1243fe6b4b", + "spend": 0.010437, + "total_tokens": 967, + "prompt_tokens": 339, + "completion_tokens": 628, + "startTime": "2025-05-30T03:17:28.600+00:00", + "endTime": "2025-05-30T03:17:39.921+00:00", + "model": "claude-3-5-sonnet-latest", + "session_id": "a96757c4-c6dc-4c76-b37e-e7dfa526b701", + "proxy_server_request": { + "input": "can you tell me more about him", + "model": "anthropic/claude-3-5-sonnet-latest", + "previous_response_id": "resp_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOmFudGhyb3BpYzttb2RlbF9pZDplMGYzMDJhMTQxMmU3ODQ3MGViYjI4Y2JlZDAxZmZmNWY4OGMwZDMzMWM2NjdlOWYyYmE0YjQxM2M2ZmJkMjgyO3Jlc3BvbnNlX2lkOmNoYXRjbXBsLTkzNWI4ZGFkLWZkYzItNDY2ZS1hOGNhLWUyNmU1YThhMjFiYg==", + }, + "response": { + "id": "chatcmpl-370760c9-39fa-4db7-b034-d1f8d933c935", + "model": "claude-3-5-sonnet-20241022", + "object": "chat.completion", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "Here's more detailed information about Michael Jordan...", + "tool_calls": None, + "function_call": None, + }, + "finish_reason": "stop", + } + ], + "created": 1748575059, + "usage": { + "total_tokens": 967, + "prompt_tokens": 339, + "completion_tokens": 628, + }, + }, + "status": "success", + }, + ] + + # Mock the get_all_spend_logs_for_previous_response_id method + with patch.object( + _ENTERPRISE_ResponsesSessionHandler, + "get_all_spend_logs_for_previous_response_id", + new_callable=AsyncMock, + ) as mock_get_spend_logs: + mock_get_spend_logs.return_value = mock_spend_logs + + # Test the function + previous_response_id = "chatcmpl-935b8dad-fdc2-466e-a8ca-e26e5a8a21bb" + result = await _ENTERPRISE_ResponsesSessionHandler.get_chat_completion_message_history_for_previous_response_id( + previous_response_id + ) + + # Verify the mock was called with correct parameters + mock_get_spend_logs.assert_called_once_with(previous_response_id) + + # Verify the returned ChatCompletionSession structure + assert "messages" in result + assert "litellm_session_id" in result + + # Verify session_id is extracted correctly + assert result["litellm_session_id"] == "a96757c4-c6dc-4c76-b37e-e7dfa526b701" + + # Verify messages structure + messages = result["messages"] + assert len(messages) == 4 # 2 user messages + 2 assistant messages + + # Check the message sequence + # First user message + assert messages[0].get("role") == "user" + assert messages[0].get("content") == "who is Michael Jordan" + + # First assistant response + assert messages[1].get("role") == "assistant" + content_1 = messages[1].get("content", "") + if isinstance(content_1, str): + assert "Michael Jordan" in content_1 + assert content_1.startswith("Michael Jordan (born February 17, 1963)") + + # Second user message + assert messages[2].get("role") == "user" + assert messages[2].get("content") == "can you tell me more about him" + + # Second assistant response + assert messages[3].get("role") == "assistant" + content_3 = messages[3].get("content", "") + if isinstance(content_3, str): + assert "Here's more detailed information about Michael Jordan" in content_3 + + +@pytest.mark.asyncio +async def test_get_chat_completion_message_history_empty_spend_logs(): + """ + Test get_chat_completion_message_history_for_previous_response_id with empty spend logs + """ + with patch.object( + _ENTERPRISE_ResponsesSessionHandler, + "get_all_spend_logs_for_previous_response_id", + new_callable=AsyncMock, + ) as mock_get_spend_logs: + mock_get_spend_logs.return_value = [] + + previous_response_id = "non-existent-id" + result = await _ENTERPRISE_ResponsesSessionHandler.get_chat_completion_message_history_for_previous_response_id( + previous_response_id + ) + + # Verify empty result structure + assert result.get("messages") == [] + assert result.get("litellm_session_id") is None From afb75dc50cc4cff214fc988430b026ea7601822f Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 20:41:03 -0700 Subject: [PATCH 13/77] bump: bump litellm enterprise --- .../litellm_enterprise-0.1.7-py3-none-any.whl | Bin 0 -> 90175 bytes enterprise/dist/litellm_enterprise-0.1.7.tar.gz | Bin 0 -> 32369 bytes enterprise/pyproject.toml | 4 ++-- poetry.lock | 7 +++---- pyproject.toml | 2 +- requirements.txt | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 enterprise/dist/litellm_enterprise-0.1.7-py3-none-any.whl create mode 100644 enterprise/dist/litellm_enterprise-0.1.7.tar.gz diff --git a/enterprise/dist/litellm_enterprise-0.1.7-py3-none-any.whl b/enterprise/dist/litellm_enterprise-0.1.7-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..248e1ca294d9ad0d92818e43f515162010b87e1a GIT binary patch literal 90175 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 literal 0 HcmV?d00001 diff --git a/enterprise/dist/litellm_enterprise-0.1.7.tar.gz b/enterprise/dist/litellm_enterprise-0.1.7.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7c28d3a36afff7465f91c360bdf0bf73f5d307a5 GIT binary patch literal 32369 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®0&TM@(vyqdIWQ(H9}X4y0t40rfQQysD%}xV;pWF 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 D*clw{ literal 0 HcmV?d00001 diff --git a/enterprise/pyproject.toml b/enterprise/pyproject.toml index 6fe012679cd..c2fee99912e 100644 --- a/enterprise/pyproject.toml +++ b/enterprise/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "litellm-enterprise" -version = "0.1.6" +version = "0.1.7" description = "Package for LiteLLM Enterprise features" authors = ["BerriAI"] readme = "README.md" @@ -22,7 +22,7 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.commitizen] -version = "0.1.6" +version = "0.1.7" version_files = [ "pyproject.toml:version", "../requirements.txt:litellm-enterprise==", diff --git a/poetry.lock b/poetry.lock index d7d57631f49..576870fb190 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1820,15 +1820,14 @@ openai = ["openai (>=0.27.8)"] [[package]] name = "litellm-enterprise" -version = "0.1.6" +version = "0.1.7" description = "Package for LiteLLM Enterprise features" optional = true python-versions = "!=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*,>=3.8" groups = ["main"] markers = "extra == \"proxy\"" files = [ - {file = "litellm_enterprise-0.1.6-py3-none-any.whl", hash = "sha256:21f251cb7c777c94842446bcda88f469dea42461bcf09fd5e4715d1d4b746f2d"}, - {file = "litellm_enterprise-0.1.6.tar.gz", hash = "sha256:cb5ec15a9a63d3eac964c8957a5a0daa558d322c297661ee05bc57e3b5d6c5bb"}, + {file = "litellm_enterprise-0.1.7.tar.gz", hash = "sha256:1feb5b799bdbd27df1e02a31fa4d18351b945b6f72e337805cf80a64dd2ec870"}, ] [[package]] @@ -4980,4 +4979,4 @@ utils = ["numpydoc"] [metadata] lock-version = "2.1" python-versions = ">=3.8.1,<4.0, !=3.9.7" -content-hash = "c8967e35498a7267309599fd6dbef60a69c2b59304172c49d855e735abb444c1" +content-hash = "0b84eb714745b61246855fb11308c7ee61fb185fd4b9a6166b55dd1992b2efe7" diff --git a/pyproject.toml b/pyproject.toml index 340cd209665..9e7178ca5a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ redisvl = {version = "^0.4.1", optional = true, markers = "python_version >= '3. mcp = {version = "1.5.0", optional = true, python = ">=3.10"} litellm-proxy-extras = {version = "0.2.2", optional = true} rich = {version = "13.7.1", optional = true} -litellm-enterprise = {version = "0.1.6", optional = true} +litellm-enterprise = {version = "0.1.7", optional = true} [tool.poetry.extras] proxy = [ diff --git a/requirements.txt b/requirements.txt index 949e6066510..af7a559f0cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -56,4 +56,4 @@ websockets==13.1.0 # for realtime API ######################## # LITELLM ENTERPRISE DEPENDENCIES ######################## -litellm-enterprise==0.1.6 +litellm-enterprise==0.1.7 From c9062ac044535a07dd5734b7042570d585c762e6 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 29 May 2025 21:12:28 -0700 Subject: [PATCH 14/77] fixes: test_create_user_default_budget --- litellm/proxy/management_endpoints/key_management_endpoints.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index df5c5aae6b4..71fead9a925 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -1490,9 +1490,6 @@ async def generate_key_helper_fn( # noqa: PLR0915 key_data["litellm_budget_table"] = getattr( create_key_response, "litellm_budget_table", None ) - key_data["object_permission"] = getattr( - create_key_response, "object_permission", None - ) key_data["created_at"] = getattr(create_key_response, "created_at", None) key_data["updated_at"] = getattr(create_key_response, "updated_at", None) except Exception as e: From 5d4ae9aa4dae85eae3d02deb9c56441bb2717228 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Thu, 29 May 2025 23:42:48 -0700 Subject: [PATCH 15/77] Support dropping non-openai params when specified in `additional_drop_params` + Add VertexAI Anthropic support on `/v1/messages` (#11246) * feat(utils.py): support dropping non-openai params when specified via additional drop params Closes https://github.com/BerriAI/litellm/issues/11205 * fix(utils.py): fix linting error * refactor(handler.py): add custom llm provider to anthropic messages provider config exception * feat: initial commit adding vertex ai anthropic support on `/v1/messages` * test: add working unit test * test(vertex_ai_partner_models/anthropic): add /v1/messages support for anthropic api Adds vertex ai auth * feat(vertex_ai/anthropic): return correct url when calling via `/v1/messages` * fix: more alignment to expected anthropic request format * fix: fix ruff linting check * Removed syntax error from docs (#11242) * [Feat]: Add Bedrock InvokeAgents as a /chat/completions route on LiteLLM (#11239) * feat: init structure for bedrock AGENTs * feat: add basic routing for bedrock AGENTs * feat: add basic transforms for bedrock AGENTs * fix: url for bedrock agent runtime * fix: working agents request * feat: working agents non-streaming request * feat: bedrock agents * feat: add streaming for bedrock agents * feat: add cost tracking for bedrock agents * docs litellm with bedrock agents * fix: linting errors * test: invoke agents tests * fix: import session handling * Revert "fix: import session handling" This reverts commit deb257dc107fc72bdee932953ee803023b73c838. * fix: linting pin mypy * [Feat]: Guardrails - Add streaming for bedrock post guard (#11247) * feat: add streaming for bedrock post guard * fix: bedrock guardrails * fix: add clear comments * Update litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: clean up bedrock guardrails --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * [Fix] Responses API - Session management (#11254) * fix: import session handling * fix: imports for session handler * tests: tests for session handler * Update enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * bump: bump litellm enterprise * fixes: test_create_user_default_budget * fix: fix linting error * fix: fix linting error --------- Co-authored-by: Fadil Rahman <87557055+fadil4u@users.noreply.github.com> Co-authored-by: Ishaan Jaff Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../llm_response_utils/get_api_base.py | 8 +- .../messages/handler.py | 2 +- .../messages/transformation.py | 10 +- .../anthropic_messages/transformation.py | 10 +- .../anthropic_claude3_transformation.py | 24 ++--- litellm/llms/custom_httpx/llm_http_handler.py | 5 +- litellm/llms/vertex_ai/batches/handler.py | 6 +- .../transformation.py | 96 +++++++++++++++++++ .../vertex_ai_partner_models/main.py | 79 +-------------- litellm/llms/vertex_ai/vertex_llm_base.py | 70 +++++++++++++- .../proxy/_experimental/out/onboarding.html | 1 - litellm/proxy/_new_secret_config.yaml | 8 +- litellm/types/llms/vertex_ai.py | 7 ++ litellm/utils.py | 20 +++- tests/llm_translation/test_optional_params.py | 14 ++- .../test_amazing_vertex_completion.py | 57 +++++++++++ 16 files changed, 304 insertions(+), 113 deletions(-) create mode 100644 litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py delete mode 100644 litellm/proxy/_experimental/out/onboarding.html diff --git a/litellm/litellm_core_utils/llm_response_utils/get_api_base.py b/litellm/litellm_core_utils/llm_response_utils/get_api_base.py index 6f9fa36591f..c23bbb936b9 100644 --- a/litellm/litellm_core_utils/llm_response_utils/get_api_base.py +++ b/litellm/litellm_core_utils/llm_response_utils/get_api_base.py @@ -72,13 +72,11 @@ def get_api_base( _optional_params.vertex_location is not None and _optional_params.vertex_project is not None ): - from litellm.llms.vertex_ai.vertex_ai_partner_models.main import ( - VertexPartnerProvider, - create_vertex_url, - ) + from litellm.llms.vertex_ai.vertex_llm_base import VertexBase + from litellm.types.llms.vertex_ai import VertexPartnerProvider if "claude" in model: - _api_base = create_vertex_url( + _api_base = VertexBase.create_vertex_url( vertex_location=_optional_params.vertex_location, vertex_project=_optional_params.vertex_project, model=model, diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/handler.py b/litellm/llms/anthropic/experimental_pass_through/messages/handler.py index b7c8fb56502..daec92a3bd8 100644 --- a/litellm/llms/anthropic/experimental_pass_through/messages/handler.py +++ b/litellm/llms/anthropic/experimental_pass_through/messages/handler.py @@ -140,7 +140,7 @@ def anthropic_messages_handler( ) if anthropic_messages_provider_config is None: raise ValueError( - f"Anthropic messages provider config not found for model: {model}" + f"Anthropic messages provider config not found for model: {model}, custom_llm_provider: {custom_llm_provider}" ) if custom_llm_provider is None: raise ValueError( diff --git a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py index 5b5e2e6f36d..aee56dc6f94 100644 --- a/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py +++ b/litellm/llms/anthropic/experimental_pass_through/messages/transformation.py @@ -1,4 +1,4 @@ -from typing import Any, AsyncIterator, Dict, List, Optional +from typing import Any, AsyncIterator, Dict, List, Optional, Tuple import httpx @@ -50,7 +50,7 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig): api_base = f"{api_base}/v1/messages" return api_base - def validate_environment( + def validate_anthropic_messages_environment( self, headers: dict, model: str, @@ -59,14 +59,14 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig): litellm_params: dict, api_key: Optional[str] = None, api_base: Optional[str] = None, - ) -> dict: - if "x-api-key" not in headers: + ) -> Tuple[dict, Optional[str]]: + if "x-api-key" not in headers and api_key: headers["x-api-key"] = api_key if "anthropic-version" not in headers: headers["anthropic-version"] = DEFAULT_ANTHROPIC_API_VERSION if "content-type" not in headers: headers["content-type"] = "application/json" - return headers + return headers, api_base def transform_anthropic_messages_request( self, diff --git a/litellm/llms/base_llm/anthropic_messages/transformation.py b/litellm/llms/base_llm/anthropic_messages/transformation.py index 710a1076887..5bf16eb3cf0 100644 --- a/litellm/llms/base_llm/anthropic_messages/transformation.py +++ b/litellm/llms/base_llm/anthropic_messages/transformation.py @@ -18,7 +18,7 @@ else: class BaseAnthropicMessagesConfig(ABC): @abstractmethod - def validate_environment( + def validate_anthropic_messages_environment( # use different name because return type is different from base config's validate_environment self, headers: dict, model: str, @@ -27,13 +27,17 @@ class BaseAnthropicMessagesConfig(ABC): litellm_params: dict, api_key: Optional[str] = None, api_base: Optional[str] = None, - ) -> dict: + ) -> Tuple[dict, Optional[str]]: """ OPTIONAL Validate the environment for the request + + Returns: + - headers: dict + - api_base: Optional[str] - If the provider needs to update the api_base, return it here. Otherwise, return None. """ - return headers + return headers, api_base @abstractmethod def get_complete_url( diff --git a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py index ff475a95db0..03623bf86dc 100644 --- a/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py +++ b/litellm/llms/bedrock/messages/invoke_transformations/anthropic_claude3_transformation.py @@ -38,6 +38,18 @@ class AmazonAnthropicClaude3MessagesConfig( BaseAnthropicMessagesConfig.__init__(self, **kwargs) AmazonInvokeConfig.__init__(self, **kwargs) + def validate_anthropic_messages_environment( + self, + headers: dict, + model: str, + messages: List[Any], + optional_params: dict, + litellm_params: dict, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + ) -> Tuple[dict, Optional[str]]: + return headers, api_base + def sign_request( self, headers: dict, @@ -59,18 +71,6 @@ class AmazonAnthropicClaude3MessagesConfig( fake_stream=fake_stream, ) - def validate_environment( - self, - headers: dict, - model: str, - messages: List[Any], - optional_params: dict, - litellm_params: dict, - api_key: Optional[str] = None, - api_base: Optional[str] = None, - ) -> dict: - return headers - def get_complete_url( self, api_base: Optional[str], diff --git a/litellm/llms/custom_httpx/llm_http_handler.py b/litellm/llms/custom_httpx/llm_http_handler.py index 6523184c08c..2d337c5c9ef 100644 --- a/litellm/llms/custom_httpx/llm_http_handler.py +++ b/litellm/llms/custom_httpx/llm_http_handler.py @@ -1097,7 +1097,10 @@ class BaseLLMHTTPHandler: if provider_specific_header else {} ) - headers = anthropic_messages_provider_config.validate_environment( + ( + headers, + api_base, + ) = anthropic_messages_provider_config.validate_anthropic_messages_environment( headers=extra_headers or {}, model=model, messages=messages, diff --git a/litellm/llms/vertex_ai/batches/handler.py b/litellm/llms/vertex_ai/batches/handler.py index dc3f93857aa..7932881f482 100644 --- a/litellm/llms/vertex_ai/batches/handler.py +++ b/litellm/llms/vertex_ai/batches/handler.py @@ -43,7 +43,7 @@ class VertexAIBatchPrediction(VertexLLM): custom_llm_provider="vertex_ai", ) - default_api_base = self.create_vertex_url( + default_api_base = self.create_vertex_batch_url( vertex_location=vertex_location or "us-central1", vertex_project=vertex_project or project_id, ) @@ -117,7 +117,7 @@ class VertexAIBatchPrediction(VertexLLM): ) return vertex_batch_response - def create_vertex_url( + def create_vertex_batch_url( self, vertex_location: str, vertex_project: str, @@ -145,7 +145,7 @@ class VertexAIBatchPrediction(VertexLLM): custom_llm_provider="vertex_ai", ) - default_api_base = self.create_vertex_url( + default_api_base = self.create_vertex_batch_url( vertex_location=vertex_location or "us-central1", vertex_project=vertex_project or project_id, ) diff --git a/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py new file mode 100644 index 00000000000..2545fe0ed7d --- /dev/null +++ b/litellm/llms/vertex_ai/vertex_ai_partner_models/anthropic/experimental_pass_through/transformation.py @@ -0,0 +1,96 @@ +from typing import Any, Dict, List, Optional, Tuple + +import litellm +from litellm.llms.anthropic.experimental_pass_through.messages.transformation import ( + AnthropicMessagesConfig, +) +from litellm.secret_managers.main import get_secret_str +from litellm.types.llms.vertex_ai import VertexPartnerProvider +from litellm.types.router import GenericLiteLLMParams + +from ....vertex_llm_base import VertexBase + + +class VertexAIPartnerModelsAnthropicMessagesConfig(AnthropicMessagesConfig, VertexBase): + def validate_anthropic_messages_environment( + self, + headers: dict, + model: str, + messages: List[Any], + optional_params: dict, + litellm_params: dict, + api_key: Optional[str] = None, + api_base: Optional[str] = None, + ) -> Tuple[dict, Optional[str]]: + """ + OPTIONAL + + Validate the environment for the request + """ + if "Authorization" not in headers: + vertex_ai_project = ( + optional_params.pop("vertex_project", None) + or optional_params.pop("vertex_ai_project", None) + or litellm.vertex_project + or get_secret_str("VERTEXAI_PROJECT") + ) + vertex_credentials = ( + optional_params.pop("vertex_credentials", None) + or optional_params.pop("vertex_ai_credentials", None) + or get_secret_str("VERTEXAI_CREDENTIALS") + ) + + access_token, project_id = self._ensure_access_token( + credentials=vertex_credentials, + project_id=vertex_ai_project, + custom_llm_provider="vertex_ai", + ) + + headers["Authorization"] = f"Bearer {access_token}" + + api_base = self.get_complete_vertex_url( + custom_api_base=api_base, + vertex_location=optional_params.pop("vertex_location", None), + vertex_project=vertex_ai_project, + project_id=project_id, + partner=VertexPartnerProvider.claude, + stream=optional_params.get("stream", False), + model=model, + ) + + headers["content-type"] = "application/json" + return headers, api_base + + def get_complete_url( + self, + api_base: Optional[str], + api_key: Optional[str], + model: str, + optional_params: dict, + litellm_params: dict, + stream: Optional[bool] = None, + ) -> str: + if api_base is None: + raise ValueError( + "api_base is required. Unable to determine the correct api_base for the request." + ) + return api_base # no transformation is needed - handled in validate_environment + + def transform_anthropic_messages_request( + self, + model: str, + messages: List[Dict], + anthropic_messages_optional_request_params: Dict, + litellm_params: GenericLiteLLMParams, + headers: dict, + ) -> Dict: + anthropic_messages_request = super().transform_anthropic_messages_request( + model=model, + messages=messages, + anthropic_messages_optional_request_params=anthropic_messages_optional_request_params, + litellm_params=litellm_params, + headers=headers, + ) + + anthropic_messages_request["anthropic_version"] = "vertex-2023-10-16" + return anthropic_messages_request diff --git a/litellm/llms/vertex_ai/vertex_ai_partner_models/main.py b/litellm/llms/vertex_ai/vertex_ai_partner_models/main.py index bcfdcb69ca5..36c1704439c 100644 --- a/litellm/llms/vertex_ai/vertex_ai_partner_models/main.py +++ b/litellm/llms/vertex_ai/vertex_ai_partner_models/main.py @@ -1,12 +1,12 @@ # What is this? ## API Handler for calling Vertex AI Partner Models -from enum import Enum from typing import Callable, Optional, Union import httpx # type: ignore import litellm from litellm import LlmProviders +from litellm.types.llms.vertex_ai import VertexPartnerProvider from litellm.utils import ModelResponse from ...custom_httpx.llm_http_handler import BaseLLMHTTPHandler @@ -15,13 +15,6 @@ from ..vertex_llm_base import VertexBase base_llm_http_handler = BaseLLMHTTPHandler() -class VertexPartnerProvider(str, Enum): - mistralai = "mistralai" - llama = "llama" - ai21 = "ai21" - claude = "claude" - - class VertexAIError(Exception): def __init__(self, status_code, message): self.status_code = status_code @@ -35,78 +28,10 @@ class VertexAIError(Exception): ) # Call the base class constructor with the parameters it needs -def create_vertex_url( - vertex_location: str, - vertex_project: str, - partner: VertexPartnerProvider, - stream: Optional[bool], - model: str, - api_base: Optional[str] = None, -) -> str: - """Return the base url for the vertex partner models""" - - api_base = api_base or f"https://{vertex_location}-aiplatform.googleapis.com" - if partner == VertexPartnerProvider.llama: - return f"{api_base}/v1beta1/projects/{vertex_project}/locations/{vertex_location}/endpoints/openapi/chat/completions" - elif partner == VertexPartnerProvider.mistralai: - if stream: - return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/mistralai/models/{model}:streamRawPredict" - else: - return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/mistralai/models/{model}:rawPredict" - elif partner == VertexPartnerProvider.ai21: - if stream: - return f"{api_base}/v1beta1/projects/{vertex_project}/locations/{vertex_location}/publishers/ai21/models/{model}:streamRawPredict" - else: - return f"{api_base}/v1beta1/projects/{vertex_project}/locations/{vertex_location}/publishers/ai21/models/{model}:rawPredict" - elif partner == VertexPartnerProvider.claude: - if stream: - return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/anthropic/models/{model}:streamRawPredict" - else: - return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/anthropic/models/{model}:rawPredict" - - class VertexAIPartnerModels(VertexBase): def __init__(self) -> None: pass - def get_complete_url( - self, - custom_api_base: Optional[str], - vertex_location: Optional[str], - vertex_project: Optional[str], - project_id: str, - partner: VertexPartnerProvider, - stream: Optional[bool], - model: str, - ) -> str: - api_base = self.get_api_base( - api_base=custom_api_base, vertex_location=vertex_location - ) - default_api_base = create_vertex_url( - vertex_location=vertex_location or "us-central1", - vertex_project=vertex_project or project_id, - partner=partner, # type: ignore - stream=stream, - model=model, - api_base=api_base, - ) - - if len(default_api_base.split(":")) > 1: - endpoint = default_api_base.split(":")[-1] - else: - endpoint = "" - - _, api_base = self._check_custom_proxy( - api_base=custom_api_base, - custom_llm_provider="vertex_ai", - gemini_api_key=None, - endpoint=endpoint, - stream=stream, - auth_header=None, - url=default_api_base, - ) - return api_base - def completion( self, model: str, @@ -181,7 +106,7 @@ class VertexAIPartnerModels(VertexBase): else: raise ValueError(f"Unknown partner model: {model}") - api_base = self.get_complete_url( + api_base = self.get_complete_vertex_url( custom_api_base=api_base, vertex_location=vertex_location, vertex_project=vertex_project, diff --git a/litellm/llms/vertex_ai/vertex_llm_base.py b/litellm/llms/vertex_ai/vertex_llm_base.py index 6d118cc658a..261b0876ff7 100644 --- a/litellm/llms/vertex_ai/vertex_llm_base.py +++ b/litellm/llms/vertex_ai/vertex_llm_base.py @@ -11,7 +11,7 @@ from typing import TYPE_CHECKING, Any, Dict, Literal, Optional, Tuple from litellm._logging import verbose_logger from litellm.litellm_core_utils.asyncify import asyncify from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler -from litellm.types.llms.vertex_ai import VERTEX_CREDENTIALS_TYPES +from litellm.types.llms.vertex_ai import VERTEX_CREDENTIALS_TYPES, VertexPartnerProvider from .common_utils import _get_gemini_url, _get_vertex_url, all_gemini_url_modes @@ -150,6 +150,74 @@ class VertexBase: else: return f"https://{self.get_default_vertex_location()}-aiplatform.googleapis.com" + @staticmethod + def create_vertex_url( + vertex_location: str, + vertex_project: str, + partner: VertexPartnerProvider, + stream: Optional[bool], + model: str, + api_base: Optional[str] = None, + ) -> str: + """Return the base url for the vertex partner models""" + + api_base = api_base or f"https://{vertex_location}-aiplatform.googleapis.com" + if partner == VertexPartnerProvider.llama: + return f"{api_base}/v1beta1/projects/{vertex_project}/locations/{vertex_location}/endpoints/openapi/chat/completions" + elif partner == VertexPartnerProvider.mistralai: + if stream: + return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/mistralai/models/{model}:streamRawPredict" + else: + return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/mistralai/models/{model}:rawPredict" + elif partner == VertexPartnerProvider.ai21: + if stream: + return f"{api_base}/v1beta1/projects/{vertex_project}/locations/{vertex_location}/publishers/ai21/models/{model}:streamRawPredict" + else: + return f"{api_base}/v1beta1/projects/{vertex_project}/locations/{vertex_location}/publishers/ai21/models/{model}:rawPredict" + elif partner == VertexPartnerProvider.claude: + if stream: + return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/anthropic/models/{model}:streamRawPredict" + else: + return f"{api_base}/v1/projects/{vertex_project}/locations/{vertex_location}/publishers/anthropic/models/{model}:rawPredict" + + def get_complete_vertex_url( + self, + custom_api_base: Optional[str], + vertex_location: Optional[str], + vertex_project: Optional[str], + project_id: str, + partner: VertexPartnerProvider, + stream: Optional[bool], + model: str, + ) -> str: + api_base = self.get_api_base( + api_base=custom_api_base, vertex_location=vertex_location + ) + default_api_base = VertexBase.create_vertex_url( + vertex_location=vertex_location or "us-central1", + vertex_project=vertex_project or project_id, + partner=partner, + stream=stream, + model=model, + api_base=api_base, + ) + + if len(default_api_base.split(":")) > 1: + endpoint = default_api_base.split(":")[-1] + else: + endpoint = "" + + _, api_base = self._check_custom_proxy( + api_base=custom_api_base, + custom_llm_provider="vertex_ai", + gemini_api_key=None, + endpoint=endpoint, + stream=stream, + auth_header=None, + url=default_api_base, + ) + return api_base + def refresh_auth(self, credentials: Any) -> None: from google.auth.transport.requests import ( Request, # type: ignore[import-untyped] diff --git a/litellm/proxy/_experimental/out/onboarding.html b/litellm/proxy/_experimental/out/onboarding.html deleted file mode 100644 index 11a85a5cf65..00000000000 --- a/litellm/proxy/_experimental/out/onboarding.html +++ /dev/null @@ -1 +0,0 @@ -LiteLLM Dashboard \ No newline at end of file diff --git a/litellm/proxy/_new_secret_config.yaml b/litellm/proxy/_new_secret_config.yaml index 18784428003..6a12bc98a71 100644 --- a/litellm/proxy/_new_secret_config.yaml +++ b/litellm/proxy/_new_secret_config.yaml @@ -8,6 +8,12 @@ model_list: litellm_params: model: text-embedding-3-small api_key: os.environ/OPENAI_API_KEY - + - model_name: openai:gpt-4o + litellm_params: + model: openai/gpt-4o + api_key: os.environ/OPENAI_API_KEY + drop_params: true + additional_drop_params: + - red litellm_settings: cache: true \ No newline at end of file diff --git a/litellm/types/llms/vertex_ai.py b/litellm/types/llms/vertex_ai.py index be43a7969ef..3cca1c099b1 100644 --- a/litellm/types/llms/vertex_ai.py +++ b/litellm/types/llms/vertex_ai.py @@ -577,3 +577,10 @@ class VertexBatchPredictionResponse(TypedDict, total=False): VERTEX_CREDENTIALS_TYPES = Union[str, Dict[str, str]] + + +class VertexPartnerProvider(str, Enum): + mistralai = "mistralai" + llama = "llama" + ai21 = "ai21" + claude = "claude" diff --git a/litellm/utils.py b/litellm/utils.py index 47638afd11b..4d6356cea0c 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -3688,13 +3688,22 @@ def add_provider_specific_params_to_optional_params( if k not in openai_params: extra_body[k] = passed_params[k] optional_params.setdefault("extra_body", {}) - optional_params["extra_body"] = { + initial_extra_body = { **optional_params["extra_body"], **extra_body, } + if additional_drop_params is not None: + processed_extra_body = { + k: v + for k, v in initial_extra_body.items() + if k not in additional_drop_params + } + else: + processed_extra_body = initial_extra_body + optional_params["extra_body"] = _ensure_extra_body_is_safe( - extra_body=optional_params["extra_body"] + extra_body=processed_extra_body ) else: for k in passed_params.keys(): @@ -6608,6 +6617,13 @@ class ProviderConfigManager: # This mapping ensures that the correct configuration is returned for BEDROCK. elif litellm.LlmProviders.BEDROCK == provider: return litellm.AmazonAnthropicClaude3MessagesConfig() + elif litellm.LlmProviders.VERTEX_AI == provider: + if "claude" in model: + from litellm.llms.vertex_ai.vertex_ai_partner_models.anthropic.experimental_pass_through.transformation import ( + VertexAIPartnerModelsAnthropicMessagesConfig, + ) + + return VertexAIPartnerModelsAnthropicMessagesConfig() return None @staticmethod diff --git a/tests/llm_translation/test_optional_params.py b/tests/llm_translation/test_optional_params.py index 4ce18be8adb..6e5a7f0ac26 100644 --- a/tests/llm_translation/test_optional_params.py +++ b/tests/llm_translation/test_optional_params.py @@ -1487,4 +1487,16 @@ def test_cohere_embed_dimensions_param(): custom_llm_provider="cohere", encoding_format="float", ) - assert optional_params["embedding_types"] == ["float"] \ No newline at end of file + assert optional_params["embedding_types"] == ["float"] + +def test_optional_params_with_additional_drop_params(): + optional_params = get_optional_params( + model="gpt-4o", + custom_llm_provider="openai", + additional_drop_params=["red"], + drop_params=True, + red="blue" + ) + print(f"optional_params: {optional_params}") + assert "red" not in optional_params + assert "red" not in optional_params["extra_body"] \ No newline at end of file diff --git a/tests/local_testing/test_amazing_vertex_completion.py b/tests/local_testing/test_amazing_vertex_completion.py index e36b57e5570..109e9b5ce50 100644 --- a/tests/local_testing/test_amazing_vertex_completion.py +++ b/tests/local_testing/test_amazing_vertex_completion.py @@ -1530,6 +1530,61 @@ async def test_gemini_pro_json_schema_args_sent_httpx( assert resp.model == model.split("/")[1] +@pytest.mark.asyncio +async def test_anthropic_message_via_anthropic_messages(): + from litellm.llms.custom_httpx.llm_http_handler import AsyncHTTPHandler + from unittest.mock import MagicMock, AsyncMock + + load_vertex_ai_credentials() + os.environ["LITELLM_LOCAL_MODEL_COST_MAP"] = "True" + litellm.model_cost = litellm.get_model_cost_map(url="") + litellm.set_verbose = True + client = AsyncHTTPHandler() + + httpx_response = AsyncMock() + httpx_response.side_effect = vertex_httpx_mock_post_valid_response_anthropic + + call_1_kwargs = {} + call_2_kwargs = {} + with patch.object(client, "post", new=httpx_response) as mock_call: + messages = [{"role": "user", "content": "List 5 cookie recipes"}] + response = await litellm.anthropic_messages(model="vertex_ai/claude-3-5-sonnet@20240620", messages=messages, max_tokens=100, client=client) + + print(f"response: {response}") + assert mock_call.call_count == 1 + call_1_kwargs = mock_call.call_args.kwargs + + with patch.object(client, "post", new=httpx_response) as mock_call: + response_2 = await litellm.acompletion(model="vertex_ai/claude-3-5-sonnet@20240620", messages=messages, max_tokens=100, client=client) + print(f"response_2: {response_2}") + call_args = mock_call.call_args + print(f"call_args: {call_args}") + call_2_kwargs = mock_call.call_args.kwargs + call_2_kwargs["url"] = call_args[0][0] + + """ + Compare Call 1 and Call 2 + + Expect: + - url + - headers + - data / json + + to be the same, except for the Authorization header. + """ + print(f"call_1_kwargs: {call_1_kwargs}") + print(f"call_2_kwargs: {call_2_kwargs}") + assert call_1_kwargs["url"] == call_2_kwargs["url"], f"Expected url to be the same, but got {call_1_kwargs['url']} and Expected {call_2_kwargs['url']}" + assert "Authorization".lower() in [k.lower() for k in call_1_kwargs["headers"].keys()], f"Expected Authorization header to be present in call_1_kwargs, but got {call_1_kwargs['headers'].keys()}" + assert "content-type".lower() in [k.lower() for k in call_1_kwargs["headers"].keys()], f"Expected Content-Type header to be present in call_1_kwargs, but got {call_1_kwargs['headers'].keys()}" + + ## validate request body + print(f"call 1 kwargs keys: {call_1_kwargs.keys()}") + print(f"call_2_kwargs['json']: {type(call_2_kwargs['json'])}") + print(f"call_1_kwargs['data']: {type(call_1_kwargs['data'])}") + call_1_kwargs_data = json.loads(call_1_kwargs["data"]) + for k, v in call_2_kwargs["json"].items(): + assert k in call_1_kwargs_data, f"Expected {k} to be present in call_1_kwargs['data'], but got {call_1_kwargs_data.keys()}" @pytest.mark.parametrize( "model, vertex_location, supports_response_schema", @@ -3781,3 +3836,5 @@ def test_vertex_schema_test(): ) print(response) + + From 44a69421ead8dcde0f2a5c9be995c49eaa9a1fea Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Thu, 29 May 2025 23:54:24 -0700 Subject: [PATCH 16/77] Anthropic - Files API w/ form-data support on passthrough + File ID support on `/chat/completion` (#11256) * fix(anthropic/chat): support passing 'file_id' param to anthropic Partial fix for LIT-200 * feat(anthropic/chat): use correct anthropic content block based on file object * fix(anthropic/chat): fix file id for container_upload message type * fix(anthropic/chat/transformation.py): fix check for adding code execution to tool calls - needed for 'container_upload' message type * fix(llm_passthrough_endpoints.py): support reading form data for anthropic passthrough * refactor(llm_passthrough_endpoints.py): refactor block into function for easier testing * test: add unit test * fix: don't pass in empty tools list * [Fix] Responses API - Session management (#11254) * fix: import session handling * fix: imports for session handler * tests: tests for session handler * Update enterprise/litellm_enterprise/enterprise_callbacks/session_handler.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * bump: bump litellm enterprise * fixes: test_create_user_default_budget * fix: fix linting error --------- Co-authored-by: Ishaan Jaff Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../prompt_templates/common_utils.py | 21 ++++ .../prompt_templates/factory.py | 99 +++++++++++++++---- litellm/llms/anthropic/chat/transformation.py | 48 +++++++++ litellm/llms/anthropic/common_utils.py | 20 +++- litellm/proxy/_new_secret_config.yaml | 1 + .../llm_passthrough_endpoints.py | 23 +++-- litellm/types/llms/anthropic.py | 27 ++++- .../test_anthropic_chat_transformation.py | 22 +++++ .../test_llm_pass_through_endpoints.py | 13 +++ 9 files changed, 247 insertions(+), 27 deletions(-) diff --git a/litellm/litellm_core_utils/prompt_templates/common_utils.py b/litellm/litellm_core_utils/prompt_templates/common_utils.py index a99a2677e8f..5e665a6e25c 100644 --- a/litellm/litellm_core_utils/prompt_templates/common_utils.py +++ b/litellm/litellm_core_utils/prompt_templates/common_utils.py @@ -582,3 +582,24 @@ def is_function_call(optional_params: dict) -> bool: if "functions" in optional_params and optional_params.get("functions"): return True return False + + +def get_file_ids_from_messages(messages: List[AllMessageValues]) -> List[str]: + """ + Gets file ids from messages + """ + file_ids = [] + for message in messages: + if message.get("role") == "user": + content = message.get("content") + if content: + if isinstance(content, str): + continue + for c in content: + if c["type"] == "file": + file_object = cast(ChatCompletionFileObject, c) + file_object_file_field = file_object["file"] + file_id = file_object_file_field.get("file_id") + if file_id: + file_ids.append(file_id) + return file_ids diff --git a/litellm/litellm_core_utils/prompt_templates/factory.py b/litellm/litellm_core_utils/prompt_templates/factory.py index 7d862af6ae6..c39739953e5 100644 --- a/litellm/litellm_core_utils/prompt_templates/factory.py +++ b/litellm/litellm_core_utils/prompt_templates/factory.py @@ -1385,6 +1385,84 @@ def _anthropic_content_element_factory( return _anthropic_content_element +def select_anthropic_content_block_type_for_file( + format: str, +) -> Literal["document", "image", "container_upload"]: + if format == "application/pdf" or format == "text/plain": + return "document" + elif format in ["image/jpeg", "image/png", "image/gif", "image/webp"]: + return "image" + else: + return "container_upload" + + +def anthropic_process_openai_file_message( + message: ChatCompletionFileObject, +) -> Union[ + AnthropicMessagesDocumentParam, + AnthropicMessagesImageParam, + AnthropicMessagesContainerUploadParam, +]: + file_message = cast(ChatCompletionFileObject, message) + file_data = file_message["file"].get("file_data") + file_id = file_message["file"].get("file_id") + format = file_message["file"].get("format") + if file_data: + image_chunk = convert_to_anthropic_image_obj( + openai_image_url=file_data, + format=format, + ) + anthropic_document_param = AnthropicMessagesDocumentParam( + type="document", + source=AnthropicContentParamSource( + type="base64", + media_type=image_chunk["media_type"], + data=image_chunk["data"], + ), + ) + return anthropic_document_param + elif file_id: + content_block_type = ( + select_anthropic_content_block_type_for_file(format) + if format + else "container_upload" + ) + return_block_param: Optional[ + Union[ + AnthropicMessagesDocumentParam, + AnthropicMessagesImageParam, + AnthropicMessagesContainerUploadParam, + ] + ] = None + if content_block_type == "document": + return_block_param = AnthropicMessagesDocumentParam( + type="document", + source=AnthropicContentParamSourceFileId( + type="file", + file_id=file_id, + ), + ) + elif content_block_type == "image": + return_block_param = AnthropicMessagesImageParam( + type="image", + source=AnthropicContentParamSourceFileId( + type="file", + file_id=file_id, + ), + ) + elif content_block_type == "container_upload": + return_block_param = AnthropicMessagesContainerUploadParam( + type="container_upload", file_id=file_id + ) + + if return_block_param is None: + raise Exception(f"Unable to parse anthropic file message: {message}") + return return_block_param + raise Exception( + f"Either file_data or file_id must be present in the file message: {message}" + ) + + def anthropic_messages_pt( # noqa: PLR0915 messages: List[AllMessageValues], model: str, @@ -1489,24 +1567,11 @@ def anthropic_messages_pt( # noqa: PLR0915 elif m.get("type", "") == "document": user_content.append(cast(AnthropicMessagesDocumentParam, m)) elif m.get("type", "") == "file": - file_message = cast(ChatCompletionFileObject, m) - file_data = file_message["file"].get("file_data") - if file_data: - image_chunk = convert_to_anthropic_image_obj( - openai_image_url=file_data, - format=file_message["file"].get("format"), + user_content.append( + anthropic_process_openai_file_message( + cast(ChatCompletionFileObject, m) ) - anthropic_document_param = ( - AnthropicMessagesDocumentParam( - type="document", - source=AnthropicContentParamSource( - type="base64", - media_type=image_chunk["media_type"], - data=image_chunk["data"], - ), - ) - ) - user_content.append(anthropic_document_param) + ) elif isinstance(user_message_types_block["content"], str): _anthropic_content_text_element: AnthropicMessagesTextParam = { "type": "text", diff --git a/litellm/llms/anthropic/chat/transformation.py b/litellm/llms/anthropic/chat/transformation.py index e7f421e75bf..bb3495ab825 100644 --- a/litellm/llms/anthropic/chat/transformation.py +++ b/litellm/llms/anthropic/chat/transformation.py @@ -18,7 +18,9 @@ from litellm.litellm_core_utils.prompt_templates.factory import anthropic_messag from litellm.llms.base_llm.base_utils import type_to_response_format_param from litellm.llms.base_llm.chat.transformation import BaseConfig, BaseLLMException from litellm.types.llms.anthropic import ( + AllAnthropicMessageValues, AllAnthropicToolsValues, + AnthropicCodeExecutionTool, AnthropicComputerTool, AnthropicHostedTools, AnthropicInputSchema, @@ -530,6 +532,40 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): return anthropic_system_message_list + def add_code_execution_tool( + self, + messages: List[AllAnthropicMessageValues], + tools: List[Union[AllAnthropicToolsValues, Dict]], + ) -> List[Union[AllAnthropicToolsValues, Dict]]: + """if 'container_upload' in messages, add code_execution tool""" + add_code_execution_tool = False + for message in messages: + message_content = message.get("content", None) + if message_content and isinstance(message_content, list): + for content in message_content: + content_type = content.get("type", None) + if content_type == "container_upload": + add_code_execution_tool = True + break + + if add_code_execution_tool: + ## check if code_execution tool is already in tools + for tool in tools: + tool_type = tool.get("type", None) + if ( + tool_type + and isinstance(tool_type, str) + and tool_type.startswith("code_execution") + ): + return tools + tools.append( + AnthropicCodeExecutionTool( + name="code_execution", + type="code_execution_20250522", + ) + ) + return tools + def transform_request( self, model: str, @@ -579,6 +615,18 @@ class AnthropicConfig(AnthropicModelInfo, BaseConfig): message="{}\nReceived Messages={}".format(str(e), messages), ) # don't use verbose_logger.exception, if exception is raised + ## Add code_execution tool if container_upload is in messages + _tools = ( + cast( + Optional[List[Union[AllAnthropicToolsValues, Dict]]], + optional_params.get("tools"), + ) + or [] + ) + tools = self.add_code_execution_tool(messages=anthropic_messages, tools=_tools) + if len(tools) > 1: + optional_params["tools"] = tools + ## Load Config config = litellm.AnthropicConfig.get_config() for k, v in config.items(): diff --git a/litellm/llms/anthropic/common_utils.py b/litellm/llms/anthropic/common_utils.py index bacd2a54d06..a531e9b6089 100644 --- a/litellm/llms/anthropic/common_utils.py +++ b/litellm/llms/anthropic/common_utils.py @@ -7,6 +7,9 @@ from typing import Dict, List, Optional, Union import httpx import litellm +from litellm.litellm_core_utils.prompt_templates.common_utils import ( + get_file_ids_from_messages, +) from litellm.llms.base_llm.base_utils import BaseLLMModelInfo from litellm.llms.base_llm.chat.transformation import BaseLLMException from litellm.secret_managers.main import get_secret_str @@ -42,6 +45,13 @@ class AnthropicModelInfo(BaseLLMModelInfo): return False + def is_file_id_used(self, messages: List[AllMessageValues]) -> bool: + """ + Return if {"source": {"type": "file", "file_id": ..}} in message content block + """ + file_ids = get_file_ids_from_messages(messages) + return len(file_ids) > 0 + def is_computer_tool_used( self, tools: Optional[List[AllAnthropicToolsValues]] ) -> bool: @@ -82,6 +92,7 @@ class AnthropicModelInfo(BaseLLMModelInfo): computer_tool_used: bool = False, prompt_caching_set: bool = False, pdf_used: bool = False, + file_id_used: bool = False, is_vertex_request: bool = False, user_anthropic_beta_headers: Optional[List[str]] = None, ) -> dict: @@ -90,8 +101,11 @@ class AnthropicModelInfo(BaseLLMModelInfo): betas.add("prompt-caching-2024-07-31") if computer_tool_used: betas.add("computer-use-2024-10-22") - if pdf_used: - betas.add("pdfs-2024-09-25") + # if pdf_used: + # betas.add("pdfs-2024-09-25") + if file_id_used: + betas.add("files-api-2025-04-14") + betas.add("code-execution-2025-05-22") headers = { "anthropic-version": anthropic_version or "2023-06-01", "x-api-key": api_key, @@ -131,6 +145,7 @@ class AnthropicModelInfo(BaseLLMModelInfo): prompt_caching_set = self.is_cache_control_set(messages=messages) computer_tool_used = self.is_computer_tool_used(tools=tools) pdf_used = self.is_pdf_used(messages=messages) + file_id_used = self.is_file_id_used(messages=messages) user_anthropic_beta_headers = self._get_user_anthropic_beta_headers( anthropic_beta_header=headers.get("anthropic-beta") ) @@ -139,6 +154,7 @@ class AnthropicModelInfo(BaseLLMModelInfo): prompt_caching_set=prompt_caching_set, pdf_used=pdf_used, api_key=api_key, + file_id_used=file_id_used, is_vertex_request=optional_params.get("is_vertex_request", False), user_anthropic_beta_headers=user_anthropic_beta_headers, ) diff --git a/litellm/proxy/_new_secret_config.yaml b/litellm/proxy/_new_secret_config.yaml index 6a12bc98a71..5ec557cd480 100644 --- a/litellm/proxy/_new_secret_config.yaml +++ b/litellm/proxy/_new_secret_config.yaml @@ -15,5 +15,6 @@ model_list: drop_params: true additional_drop_params: - red + litellm_settings: cache: true \ No newline at end of file diff --git a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py index 21df55c0840..5782c8e2cd1 100644 --- a/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py +++ b/litellm/proxy/pass_through_endpoints/llm_passthrough_endpoints.py @@ -19,6 +19,10 @@ from litellm.llms.vertex_ai.vertex_llm_base import VertexBase from litellm.proxy._types import * from litellm.proxy.auth.route_checks import RouteChecks from litellm.proxy.auth.user_api_key_auth import user_api_key_auth +from litellm.proxy.common_utils.http_parsing_utils import ( + _read_request_body, + get_form_data, +) from litellm.proxy.pass_through_endpoints.common_utils import get_litellm_virtual_key from litellm.proxy.pass_through_endpoints.pass_through_endpoints import ( create_pass_through_route, @@ -319,6 +323,18 @@ async def mistral_proxy_route( return received_value +async def is_streaming_request_fn(request: Request) -> bool: + if request.method == "POST": + content_type = request.headers.get("content-type", None) + if content_type and "multipart/form-data" in content_type: + _request_body = await get_form_data(request) + else: + _request_body = await _read_request_body(request) + if _request_body.get("stream"): + return True + return False + + @router.api_route( "/anthropic/{endpoint:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH"], @@ -351,12 +367,7 @@ async def anthropic_proxy_route( ) ## check for streaming - is_streaming_request = False - # anthropic is streaming when 'stream' = True is in the body - if request.method == "POST": - _request_body = await request.json() - if _request_body.get("stream"): - is_streaming_request = True + is_streaming_request = await is_streaming_request_fn(request) ## CREATE PASS-THROUGH endpoint_func = create_pass_through_route( diff --git a/litellm/types/llms/anthropic.py b/litellm/types/llms/anthropic.py index 468a1e0ffca..5c37b05f579 100644 --- a/litellm/types/llms/anthropic.py +++ b/litellm/types/llms/anthropic.py @@ -57,11 +57,18 @@ class AnthropicHostedTools(TypedDict, total=False): # for bash_tool and text_ed cache_control: Optional[Union[dict, ChatCompletionCachedContent]] +class AnthropicCodeExecutionTool(TypedDict, total=False): + type: Required[str] + name: Required[Literal["code_execution"]] + cache_control: Optional[Union[dict, ChatCompletionCachedContent]] + + AllAnthropicToolsValues = Union[ AnthropicComputerTool, AnthropicHostedTools, AnthropicMessagesTool, AnthropicWebSearchTool, + AnthropicCodeExecutionTool, ] @@ -107,9 +114,22 @@ class AnthropicContentParamSource(TypedDict): data: str +class AnthropicContentParamSourceFileId(TypedDict): + type: Literal["file"] + file_id: str + + +class AnthropicMessagesContainerUploadParam(TypedDict, total=False): + type: Required[Literal["container_upload"]] + file_id: str + cache_control: Optional[Union[dict, ChatCompletionCachedContent]] + + class AnthropicMessagesImageParam(TypedDict, total=False): type: Required[Literal["image"]] - source: Required[AnthropicContentParamSource] + source: Required[ + Union[AnthropicContentParamSource, AnthropicContentParamSourceFileId] + ] cache_control: Optional[Union[dict, ChatCompletionCachedContent]] @@ -119,7 +139,9 @@ class CitationsObject(TypedDict): class AnthropicMessagesDocumentParam(TypedDict, total=False): type: Required[Literal["document"]] - source: Required[AnthropicContentParamSource] + source: Required[ + Union[AnthropicContentParamSource, AnthropicContentParamSourceFileId] + ] cache_control: Optional[Union[dict, ChatCompletionCachedContent]] title: str context: str @@ -149,6 +171,7 @@ AnthropicMessagesUserMessageValues = Union[ AnthropicMessagesImageParam, AnthropicMessagesToolResultParam, AnthropicMessagesDocumentParam, + AnthropicMessagesContainerUploadParam, ] diff --git a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py index d35115e5241..e86430cdaeb 100644 --- a/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py +++ b/tests/test_litellm/llms/anthropic/chat/test_anthropic_chat_transformation.py @@ -185,3 +185,25 @@ def test_web_search_tool_transformation_with_search_context_size( assert anthropic_web_search_tool["user_location"]["type"] == "approximate" assert anthropic_web_search_tool["user_location"]["city"] == "San Francisco" assert anthropic_web_search_tool["max_uses"] == expected_max_uses + + +def test_add_code_execution_tool(): + config = AnthropicConfig() + + messages = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "What is in this sheet?"}, + { + "type": "container_upload", + "file_id": "file_011CPd1KVEsbD8MjfZSwBd1u", + }, + ], + } + ] + tools = [] + tools = config.add_code_execution_tool(messages=messages, tools=tools) + assert tools is not None + assert len(tools) == 1 + assert tools[0]["type"] == "code_execution_20250522" diff --git a/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py b/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py index 501b4364dac..9dcde87a594 100644 --- a/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py +++ b/tests/test_litellm/proxy/pass_through_endpoints/test_llm_pass_through_endpoints.py @@ -573,3 +573,16 @@ class TestVertexAIDiscoveryPassThroughHandler: mock_auth.assert_called_once() call_args = mock_auth.call_args[1] assert call_args["api_key"] == "Bearer test-key-123" + + +@pytest.mark.asyncio +async def test_is_streaming_request_fn(): + from litellm.proxy.pass_through_endpoints.llm_passthrough_endpoints import ( + is_streaming_request_fn, + ) + + mock_request = Mock() + mock_request.method = "POST" + mock_request.headers = {"content-type": "multipart/form-data"} + mock_request.form = AsyncMock(return_value={"stream": "true"}) + assert await is_streaming_request_fn(mock_request) is True From b13d1b3ff1d22086b1194d5e89e97b25cf448588 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 09:06:03 -0700 Subject: [PATCH 17/77] ci/cd: run again --- litellm/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/__init__.py b/litellm/__init__.py index f84d214059d..f02ff59c98d 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -133,7 +133,7 @@ langsmith_batch_size: Optional[int] = None prometheus_initialize_budget_metrics: Optional[bool] = False require_auth_for_metrics_endpoint: Optional[bool] = False argilla_batch_size: Optional[int] = None -datadog_use_v1: Optional[bool] = False # if you want to use v1 datadog logged payload +datadog_use_v1: Optional[bool] = False # if you want to use v1 datadog logged payload. gcs_pub_sub_use_v1: Optional[ bool ] = False # if you want to use v1 gcs pubsub logged payload From ea841eeb9bdc41881570dfe6fbae5a137320eba0 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 17:23:50 -0700 Subject: [PATCH 18/77] [Feat] UI - show vector store permissions for Key, Team, Org (#11277) * fix LiteLLM_ObjectPermissionTable * fix include object_permission for list key * fix key list to inclue obj permissions * fix object permissions for vector stores on key info * add key edit view with vector stores * allow editing vector stores permissions * fixes obj permissions * feat: add obj permission on UI * fix: add object_permission:true * ui show org vector stores on org info * fix: show object permissions on /org/info * feat: allow updating obj permissions for keys * fixes: key object permissions * fixes: team object permissions * fixes: org object permissions * fix vector store selector for Orgs --- litellm/proxy/_types.py | 4 + .../key_management_endpoints.py | 70 ++++- .../organization_endpoints.py | 91 ++++++- .../management_endpoints/team_endpoints.py | 66 ++++- tests/proxy_unit_tests/test_proxy_utils.py | 9 +- .../test_key_management_endpoints.py | 214 ++++++++++++++++ .../test_organization_endpoints.py | 242 ++++++++++++++++++ .../test_team_endpoints.py | 202 +++++++++++++++ .../src/components/key_edit_view.tsx | 14 +- .../src/components/key_info_view.tsx | 26 ++ .../components/key_team_helpers/key_list.tsx | 5 + .../src/components/networking.tsx | 5 + .../components/object_permissions_view.tsx | 150 +++++++++++ .../organization/organization_view.tsx | 35 ++- .../src/components/team/team_info.tsx | 40 ++- 15 files changed, 1160 insertions(+), 13 deletions(-) create mode 100644 tests/test_litellm/proxy/management_endpoints/test_organization_endpoints.py create mode 100644 ui/litellm-dashboard/src/components/object_permissions_view.tsx diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index a6858f0a166..b9ff051da74 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -1157,6 +1157,7 @@ class UpdateTeamRequest(LiteLLMPydanticObjectBase): tags: Optional[list] = None model_aliases: Optional[dict] = None guardrails: Optional[List[str]] = None + object_permission: Optional[LiteLLM_ObjectPermissionBase] = None class ResetTeamBudgetRequest(LiteLLMPydanticObjectBase): @@ -1254,6 +1255,7 @@ class LiteLLM_ObjectPermissionTable(LiteLLMPydanticObjectBase): object_permission_id: str mcp_servers: List[str] + vector_stores: List[str] class LiteLLM_TeamTable(TeamBase): @@ -1636,6 +1638,7 @@ class LiteLLM_VerificationToken(LiteLLMPydanticObjectBase): created_by: Optional[str] = None updated_at: Optional[datetime] = None updated_by: Optional[str] = None + object_permission_id: Optional[str] = None object_permission: Optional[LiteLLM_ObjectPermissionTable] = None model_config = ConfigDict(protected_namespaces=()) @@ -1757,6 +1760,7 @@ class LiteLLM_OrganizationTableUpdate(LiteLLMPydanticObjectBase): metadata: Optional[dict] = None models: Optional[List[str]] = None updated_by: Optional[str] = None + object_permission: Optional[LiteLLM_ObjectPermissionTable] = None class LiteLLM_UserTable(LiteLLMPydanticObjectBase): diff --git a/litellm/proxy/management_endpoints/key_management_endpoints.py b/litellm/proxy/management_endpoints/key_management_endpoints.py index 71fead9a925..2fee9edf1c2 100644 --- a/litellm/proxy/management_endpoints/key_management_endpoints.py +++ b/litellm/proxy/management_endpoints/key_management_endpoints.py @@ -673,8 +673,9 @@ async def _set_object_permission( return data_json -def prepare_key_update_data( - data: Union[UpdateKeyRequest, RegenerateKeyRequest], existing_key_row +async def prepare_key_update_data( + data: Union[UpdateKeyRequest, RegenerateKeyRequest], + existing_key_row: LiteLLM_VerificationToken, ): data_json: dict = data.model_dump(exclude_unset=True) data_json.pop("key", None) @@ -704,6 +705,12 @@ def prepare_key_update_data( non_default_values["budget_reset_at"] = key_reset_at non_default_values["budget_duration"] = budget_duration + if "object_permission" in non_default_values: + non_default_values = await _handle_update_object_permission( + data_json=non_default_values, + existing_key_row=existing_key_row, + ) + _metadata = existing_key_row.metadata or {} # validate model_max_budget @@ -717,6 +724,60 @@ def prepare_key_update_data( return non_default_values +async def _handle_update_object_permission( + data_json: dict, + existing_key_row: LiteLLM_VerificationToken, +) -> dict: + """ + Handle the update of object permission. + """ + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + raise ValueError("Prisma client not found") + + ######################################################### + # Ensure `object_permission` is not added to the data_json + # We need to update the entity at the object_permission_id level in the LiteLLM_ObjectPermissionTable + ######################################################### + new_object_permission = data_json.pop("object_permission") + if new_object_permission is None: + return data_json + + # lookup existing object permission ID and update that entry + existing_object_permission_id = existing_key_row.object_permission_id + existing_object_permission = ( + await prisma_client.db.litellm_objectpermissiontable.find_unique( + where={"object_permission_id": existing_object_permission_id}, + ) + ) + existing_object_permissions_dict: dict = {} + if existing_object_permission is not None: + # update the object permission + existing_object_permissions_dict = existing_object_permission.model_dump( + exclude_unset=True, exclude_none=True + ) + existing_object_permissions_dict.update(dict(new_object_permission)) + + ######################################################### + # Commit the update to the LiteLLM_ObjectPermissionTable + ######################################################### + new_object_permission_row = ( + await prisma_client.db.litellm_objectpermissiontable.upsert( + where={"object_permission_id": existing_object_permission_id}, + data={ + "create": existing_object_permissions_dict, + "update": existing_object_permissions_dict, + }, + ) + ) + verbose_proxy_logger.debug( + f"new_object_permission_row: {new_object_permission_row}" + ) + data_json["object_permission_id"] = new_object_permission_row.object_permission_id + return data_json + + def is_different_team( data: UpdateKeyRequest, existing_key_row: LiteLLM_VerificationToken ) -> bool: @@ -853,7 +914,7 @@ async def update_key_fn( change_initiated_by=user_api_key_dict, llm_router=llm_router, ) - non_default_values = prepare_key_update_data( + non_default_values = await prepare_key_update_data( data=data, existing_key_row=existing_key_row ) @@ -1945,7 +2006,7 @@ async def regenerate_key_fn( non_default_values = {} if data is not None: # Update with any provided parameters from GenerateKeyRequest - non_default_values = prepare_key_update_data( + non_default_values = await prepare_key_update_data( data=data, existing_key_row=_key_in_db ) verbose_proxy_logger.debug("non_default_values: %s", non_default_values) @@ -2372,6 +2433,7 @@ async def _list_key_helper( {"created_at": "desc"}, {"token": "desc"}, # fallback sort ], + include={"object_permission": True}, ) verbose_proxy_logger.debug(f"Fetched {len(keys)} keys") diff --git a/litellm/proxy/management_endpoints/organization_endpoints.py b/litellm/proxy/management_endpoints/organization_endpoints.py index f06620ebb53..e057ff32a14 100644 --- a/litellm/proxy/management_endpoints/organization_endpoints.py +++ b/litellm/proxy/management_endpoints/organization_endpoints.py @@ -273,6 +273,22 @@ async def update_organization( updated_organization_row = prisma_client.jsonify_object( data.model_dump(exclude_none=True) ) + existing_organization_row = ( + await prisma_client.db.litellm_organizationtable.find_unique( + where={"organization_id": data.organization_id}, + ) + ) + + if existing_organization_row is None: + raise ValueError( + f"Organization not found for organization_id={data.organization_id}" + ) + + if data.object_permission is not None: + updated_organization_row = await handle_update_object_permission( + data_json=updated_organization_row, + existing_organization_row=existing_organization_row, + ) response = await prisma_client.db.litellm_organizationtable.update( where={"organization_id": data.organization_id}, @@ -283,6 +299,74 @@ async def update_organization( return response +async def handle_update_object_permission( + data_json: dict, + existing_organization_row: LiteLLM_OrganizationTable, +) -> dict: + """ + Handle the update of object permission for an organization. + + - Upserts the new object permission into the LiteLLM_ObjectPermissionTable + - Adds object_permission_id to data_json (this gets added in the DB) + - Pops the object_permission from data_json + - + """ + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + raise ValueError("Prisma client not found") + + ######################################################### + # Ensure `object_permission` is not added to the data_json + # We need to update the entity at the object_permission_id level in the LiteLLM_ObjectPermissionTable + ######################################################### + new_object_permission: Union[dict, str] = data_json.pop("object_permission") or {} + if new_object_permission is None: + return data_json + + # lookup existing object permission ID and update that entry + existing_object_permission_id = existing_organization_row.object_permission_id + existing_object_permissions_dict = {} + + existing_object_permission = ( + await prisma_client.db.litellm_objectpermissiontable.find_unique( + where={"object_permission_id": existing_object_permission_id}, + ) + ) + + # update the object permission + if existing_object_permission is not None: + existing_object_permissions_dict = existing_object_permission.model_dump( + exclude_unset=True, exclude_none=True + ) + + if isinstance(new_object_permission, str): + new_object_permission = json.loads(new_object_permission) + + if isinstance(new_object_permission, dict): + existing_object_permissions_dict.update(new_object_permission) + + ######################################################### + # Commit the update to the LiteLLM_ObjectPermissionTable + ######################################################### + created_object_permission_row = ( + await prisma_client.db.litellm_objectpermissiontable.upsert( + where={"object_permission_id": existing_object_permission_id}, + data={ + "create": existing_object_permissions_dict, + "update": existing_object_permissions_dict, + }, + ) + ) + data_json[ + "object_permission_id" + ] = created_object_permission_row.object_permission_id + verbose_proxy_logger.debug( + f"created_object_permission_row: {created_object_permission_row}" + ) + return data_json + + @router.delete( "/organization/delete", tags=["organization management"], @@ -414,7 +498,12 @@ async def info_organization(organization_id: str): LiteLLM_OrganizationTableWithMembers ] = await prisma_client.db.litellm_organizationtable.find_unique( where={"organization_id": organization_id}, - include={"litellm_budget_table": True, "members": True, "teams": True}, + include={ + "litellm_budget_table": True, + "members": True, + "teams": True, + "object_permission": True, + }, ) if response is None: diff --git a/litellm/proxy/management_endpoints/team_endpoints.py b/litellm/proxy/management_endpoints/team_endpoints.py index 2d7f52386dc..1ced6c32185 100644 --- a/litellm/proxy/management_endpoints/team_endpoints.py +++ b/litellm/proxy/management_endpoints/team_endpoints.py @@ -663,6 +663,13 @@ async def update_team( # set the budget_reset_at in DB updated_kv["budget_reset_at"] = reset_at + # Check object permission + if data.object_permission is not None: + updated_kv = await handle_update_object_permission( + data_json=updated_kv, + existing_team_row=existing_team_row, + ) + # update team metadata fields _team_metadata_fields = LiteLLM_ManagementEndpoint_MetadataFields_Premium for field in _team_metadata_fields: @@ -734,6 +741,62 @@ async def update_team( return {"team_id": team_row.team_id, "data": team_row} +async def handle_update_object_permission( + data_json: dict, existing_team_row: LiteLLM_TeamTable +) -> dict: + """ + Handle the update of object permission for a team. + + - IF there's no object_permission_id, then create a new entry in LiteLLM_ObjectPermissionTable + - IF there's an object_permission_id, then update the entry in LiteLLM_ObjectPermissionTable + """ + from litellm.proxy.proxy_server import prisma_client + + if prisma_client is None: + raise ValueError("Prisma client not found") + + ######################################################### + # Ensure `object_permission` is not added to the data_json + # We need to update the entity at the object_permission_id level in the LiteLLM_ObjectPermissionTable + ######################################################### + new_object_permission = data_json.pop("object_permission") + if new_object_permission is None: + return data_json + + # lookup existing object permission ID and update that entry + existing_object_permission_id = existing_team_row.object_permission_id + existing_object_permission = ( + await prisma_client.db.litellm_objectpermissiontable.find_unique( + where={"object_permission_id": existing_object_permission_id}, + ) + ) + + existing_object_permissions_dict: Dict = {} + + # update the object permission + if existing_object_permission is not None: + existing_object_permissions_dict = existing_object_permission.model_dump( + exclude_unset=True, exclude_none=True + ) + existing_object_permissions_dict.update(dict(new_object_permission)) + created_object_permission_row = ( + await prisma_client.db.litellm_objectpermissiontable.upsert( + where={"object_permission_id": existing_object_permission_id}, + data={ + "create": existing_object_permissions_dict, + "update": existing_object_permissions_dict, + }, + ) + ) + data_json[ + "object_permission_id" + ] = created_object_permission_row.object_permission_id + verbose_proxy_logger.debug( + f"created_object_permission_row: {created_object_permission_row}" + ) + return data_json + + def _check_team_member_admin_add( member: Union[Member, List[Member]], premium_user: bool, @@ -1486,7 +1549,8 @@ async def team_info( team_info: Optional[ BaseModel ] = await prisma_client.db.litellm_teamtable.find_unique( - where={"team_id": team_id} + where={"team_id": team_id}, + include={"object_permission": True}, ) if team_info is None: raise Exception diff --git a/tests/proxy_unit_tests/test_proxy_utils.py b/tests/proxy_unit_tests/test_proxy_utils.py index e02d9acf3c2..91b64c09c02 100644 --- a/tests/proxy_unit_tests/test_proxy_utils.py +++ b/tests/proxy_unit_tests/test_proxy_utils.py @@ -639,7 +639,8 @@ async def test_proxy_config_update_from_db(): } -def test_prepare_key_update_data(): +@pytest.mark.asyncio +async def test_prepare_key_update_data(): from litellm.proxy.management_endpoints.key_management_endpoints import ( prepare_key_update_data, ) @@ -647,15 +648,15 @@ def test_prepare_key_update_data(): existing_key_row = MagicMock() data = UpdateKeyRequest(key="test_key", models=["gpt-4"], duration="120s") - updated_data = prepare_key_update_data(data, existing_key_row) + updated_data = await prepare_key_update_data(data, existing_key_row) assert "expires" in updated_data data = UpdateKeyRequest(key="test_key", metadata={}) - updated_data = prepare_key_update_data(data, existing_key_row) + updated_data = await prepare_key_update_data(data, existing_key_row) assert updated_data["metadata"] == {} data = UpdateKeyRequest(key="test_key", metadata=None) - updated_data = prepare_key_update_data(data, existing_key_row) + updated_data = await prepare_key_update_data(data, existing_key_row) assert updated_data["metadata"] is None diff --git a/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py index 755b833486a..f0a2f7cab70 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_key_management_endpoints.py @@ -251,3 +251,217 @@ async def test_key_generation_with_object_permission(monkeypatch): ] assert len(key_insert_calls) == 1 assert key_insert_calls[0]["data"].get("object_permission_id") == "objperm123" + + +@pytest.mark.asyncio +async def test_key_update_object_permissions_existing_permission(monkeypatch): + """ + Test updating object permissions when a key already has an existing object_permission_id. + + This test verifies that when updating vector stores for a key that already has an + object_permission_id, the existing LiteLLM_ObjectPermissionTable record is updated + with the new permissions and the object_permission_id remains the same. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import ( + LiteLLM_ObjectPermissionBase, + LiteLLM_VerificationToken, + ) + from litellm.proxy.management_endpoints.key_management_endpoints import ( + _handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + # Mock existing key with object_permission_id + existing_key_row = LiteLLM_VerificationToken( + token="test_token_hash", + object_permission_id="existing_perm_id_123", + user_id="user123", + team_id=None, + ) + + # Mock existing object permission record + existing_object_permission = MagicMock() + existing_object_permission.model_dump.return_value = { + "object_permission_id": "existing_perm_id_123", + "vector_stores": ["old_store_1", "old_store_2"], + } + + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=existing_object_permission + ) + + # Mock upsert operation + updated_permission = MagicMock() + updated_permission.object_permission_id = "existing_perm_id_123" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=updated_permission + ) + + # Test data with new object permission + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["new_store_1", "new_store_2", "new_store_3"] + ).model_dump(exclude_unset=True, exclude_none=True), + "user_id": "user123", + } + + # Call the function + result = await _handle_update_object_permission( + data_json=data_json, + existing_key_row=existing_key_row, + ) + + # Verify the object_permission was removed from data_json and object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "existing_perm_id_123" + + # Verify database operations were called correctly + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": "existing_perm_id_123"} + ) + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() + + +@pytest.mark.asyncio +async def test_key_update_object_permissions_no_existing_permission(monkeypatch): + """ + Test creating object permissions when a key has no existing object_permission_id. + + This test verifies that when updating object permissions for a key that has + object_permission_id set to None, a new entry is created in the + LiteLLM_ObjectPermissionTable and the key is updated with the new object_permission_id. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import ( + LiteLLM_ObjectPermissionBase, + LiteLLM_VerificationToken, + ) + from litellm.proxy.management_endpoints.key_management_endpoints import ( + _handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + existing_key_row_no_perm = LiteLLM_VerificationToken( + token="test_token_hash_2", + object_permission_id=None, + user_id="user456", + team_id=None, + ) + + # Mock find_unique to return None (no existing permission) + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=None + ) + + # Mock upsert to create new record + new_permission = MagicMock() + new_permission.object_permission_id = "new_perm_id_456" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=new_permission + ) + + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["brand_new_store"] + ).model_dump(exclude_unset=True, exclude_none=True), + "user_id": "user456", + } + + result = await _handle_update_object_permission( + data_json=data_json, + existing_key_row=existing_key_row_no_perm, + ) + + # Verify new object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "new_perm_id_456" + + # Verify find_unique was called with None + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": None} + ) + + # Verify upsert was called to create new record + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() + + +@pytest.mark.asyncio +async def test_key_update_object_permissions_missing_permission_record(monkeypatch): + """ + Test creating object permissions when existing object_permission_id record is not found. + + This test verifies that when updating object permissions for a key that has an + object_permission_id but the corresponding record cannot be found in the database, + a new entry is created in the LiteLLM_ObjectPermissionTable with the new permissions. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import ( + LiteLLM_ObjectPermissionBase, + LiteLLM_VerificationToken, + ) + from litellm.proxy.management_endpoints.key_management_endpoints import ( + _handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + existing_key_row_missing_perm = LiteLLM_VerificationToken( + token="test_token_hash_3", + object_permission_id="missing_perm_id_789", + user_id="user789", + team_id=None, + ) + + # Mock find_unique to return None (permission record not found) + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=None + ) + + # Mock upsert to create new record + new_permission = MagicMock() + new_permission.object_permission_id = "recreated_perm_id_789" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=new_permission + ) + + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["recreated_store"] + ).model_dump(exclude_unset=True, exclude_none=True), + "user_id": "user789", + } + + result = await _handle_update_object_permission( + data_json=data_json, + existing_key_row=existing_key_row_missing_perm, + ) + + # Verify new object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "recreated_perm_id_789" + + # Verify find_unique was called with the missing permission ID + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": "missing_perm_id_789"} + ) + + # Verify upsert was called to create new record + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() diff --git a/tests/test_litellm/proxy/management_endpoints/test_organization_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_organization_endpoints.py new file mode 100644 index 00000000000..a602a6e338a --- /dev/null +++ b/tests/test_litellm/proxy/management_endpoints/test_organization_endpoints.py @@ -0,0 +1,242 @@ +import asyncio +import json +import os +import sys +import uuid +from typing import Optional, cast +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest +from fastapi import HTTPException +from fastapi.testclient import TestClient + +sys.path.insert( + 0, os.path.abspath("../../../") +) # Adds the parent directory to the system path + + +@pytest.mark.asyncio +async def test_organization_update_object_permissions_existing_permission(monkeypatch): + """ + Test updating object permissions when an organization already has an existing object_permission_id. + + This test verifies that when updating vector stores for an organization that already has an + object_permission_id, the existing LiteLLM_ObjectPermissionTable record is updated + with the new permissions and the object_permission_id remains the same. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import ( + LiteLLM_ObjectPermissionBase, + LiteLLM_OrganizationTable, + ) + from litellm.proxy.management_endpoints.organization_endpoints import ( + handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + # Mock existing organization with object_permission_id + existing_organization_row = LiteLLM_OrganizationTable( + organization_id="test_org_id", + object_permission_id="existing_perm_id_123", + organization_alias="test_org", + budget_id="test_budget_id", + models=["test_model_1", "test_model_2"], + created_by="test_created_by", + updated_by="test_updated_by", + ) + + # Mock existing object permission record + existing_object_permission = MagicMock() + existing_object_permission.model_dump.return_value = { + "object_permission_id": "existing_perm_id_123", + "vector_stores": ["old_store_1", "old_store_2"], + } + + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=existing_object_permission + ) + + # Mock upsert operation + updated_permission = MagicMock() + updated_permission.object_permission_id = "existing_perm_id_123" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=updated_permission + ) + + # Test data with new object permission + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["new_store_1", "new_store_2", "new_store_3"] + ).model_dump(exclude_unset=True, exclude_none=True), + "organization_alias": "updated_org", + } + + # Call the function + result = await handle_update_object_permission( + data_json=data_json, + existing_organization_row=existing_organization_row, + ) + + # Verify the object_permission was removed from data_json and object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "existing_perm_id_123" + + # Verify database operations were called correctly + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": "existing_perm_id_123"} + ) + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() + + +@pytest.mark.asyncio +async def test_organization_update_object_permissions_no_existing_permission( + monkeypatch, +): + """ + Test creating object permissions when an organization has no existing object_permission_id. + + This test verifies that when updating object permissions for an organization that has + object_permission_id set to None, a new entry is created in the + LiteLLM_ObjectPermissionTable and the organization is updated with the new object_permission_id. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import ( + LiteLLM_ObjectPermissionBase, + LiteLLM_OrganizationTable, + ) + from litellm.proxy.management_endpoints.organization_endpoints import ( + handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + existing_organization_row_no_perm = LiteLLM_OrganizationTable( + organization_id="test_org_id_2", + object_permission_id=None, + organization_alias="test_org_2", + budget_id="test_budget_id_2", + models=["test_model_1", "test_model_2"], + created_by="test_created_by_2", + updated_by="test_updated_by_2", + ) + + # Mock find_unique to return None (no existing permission) + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=None + ) + + # Mock upsert to create new record + new_permission = MagicMock() + new_permission.object_permission_id = "new_perm_id_456" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=new_permission + ) + + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["brand_new_store"] + ).model_dump(exclude_unset=True, exclude_none=True), + "organization_alias": "updated_org_2", + } + + result = await handle_update_object_permission( + data_json=data_json, + existing_organization_row=existing_organization_row_no_perm, + ) + + # Verify new object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "new_perm_id_456" + + # Verify find_unique was called with None + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": None} + ) + + # Verify upsert was called to create new record + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() + + +@pytest.mark.asyncio +async def test_organization_update_object_permissions_missing_permission_record( + monkeypatch, +): + """ + Test creating object permissions when existing object_permission_id record is not found. + + This test verifies that when updating object permissions for an organization that has an + object_permission_id but the corresponding record cannot be found in the database, + a new entry is created in the LiteLLM_ObjectPermissionTable with the new permissions. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import ( + LiteLLM_ObjectPermissionBase, + LiteLLM_OrganizationTable, + ) + from litellm.proxy.management_endpoints.organization_endpoints import ( + handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + existing_organization_row_missing_perm = LiteLLM_OrganizationTable( + organization_id="test_org_id_3", + object_permission_id="missing_perm_id_789", + organization_alias="test_org_3", + budget_id="test_budget_id_3", + models=["test_model_1", "test_model_2"], + created_by="test_created_by_3", + updated_by="test_updated_by_3", + ) + + # Mock find_unique to return None (permission record not found) + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=None + ) + + # Mock upsert to create new record + new_permission = MagicMock() + new_permission.object_permission_id = "recreated_perm_id_789" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=new_permission + ) + + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["recreated_store"] + ).model_dump(exclude_unset=True, exclude_none=True), + "organization_alias": "updated_org_3", + } + + result = await handle_update_object_permission( + data_json=data_json, + existing_organization_row=existing_organization_row_missing_perm, + ) + + # Verify new object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "recreated_perm_id_789" + + # Verify find_unique was called with the missing permission ID + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": "missing_perm_id_789"} + ) + + # Verify upsert was called to create new record + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() diff --git a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py index 6e641d2e1c0..7b9acf42e12 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_team_endpoints.py @@ -313,3 +313,205 @@ async def test_new_team_with_object_permission(mock_db_client, mock_admin_auth): assert mock_team_create.call_count == 1 created_team_kwargs = mock_team_create.call_args.kwargs assert created_team_kwargs["data"].get("object_permission_id") == "objperm123" + + +@pytest.mark.asyncio +async def test_team_update_object_permissions_existing_permission(monkeypatch): + """ + Test updating object permissions when a team already has an existing object_permission_id. + + This test verifies that when updating vector stores for a team that already has an + object_permission_id, the existing LiteLLM_ObjectPermissionTable record is updated + with the new permissions and the object_permission_id remains the same. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import LiteLLM_ObjectPermissionBase, LiteLLM_TeamTable + from litellm.proxy.management_endpoints.team_endpoints import ( + handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + # Mock existing team with object_permission_id + existing_team_row = LiteLLM_TeamTable( + team_id="test_team_id", + object_permission_id="existing_perm_id_123", + team_alias="test_team", + ) + + # Mock existing object permission record + existing_object_permission = MagicMock() + existing_object_permission.model_dump.return_value = { + "object_permission_id": "existing_perm_id_123", + "vector_stores": ["old_store_1", "old_store_2"], + } + + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=existing_object_permission + ) + + # Mock upsert operation + updated_permission = MagicMock() + updated_permission.object_permission_id = "existing_perm_id_123" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=updated_permission + ) + + # Test data with new object permission + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["new_store_1", "new_store_2", "new_store_3"] + ).model_dump(exclude_unset=True, exclude_none=True), + "team_alias": "updated_team", + } + + # Call the function + result = await handle_update_object_permission( + data_json=data_json, + existing_team_row=existing_team_row, + ) + + # Verify the object_permission was removed from data_json and object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "existing_perm_id_123" + + # Verify database operations were called correctly + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": "existing_perm_id_123"} + ) + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() + + +@pytest.mark.asyncio +async def test_team_update_object_permissions_no_existing_permission(monkeypatch): + """ + Test creating object permissions when a team has no existing object_permission_id. + + This test verifies that when updating object permissions for a team that has + object_permission_id set to None, a new entry is created in the + LiteLLM_ObjectPermissionTable and the team is updated with the new object_permission_id. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import LiteLLM_ObjectPermissionBase, LiteLLM_TeamTable + from litellm.proxy.management_endpoints.team_endpoints import ( + handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + existing_team_row_no_perm = LiteLLM_TeamTable( + team_id="test_team_id_2", + object_permission_id=None, + team_alias="test_team_2", + ) + + # Mock find_unique to return None (no existing permission) + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=None + ) + + # Mock upsert to create new record + new_permission = MagicMock() + new_permission.object_permission_id = "new_perm_id_456" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=new_permission + ) + + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["brand_new_store"] + ).model_dump(exclude_unset=True, exclude_none=True), + "team_alias": "updated_team_2", + } + + result = await handle_update_object_permission( + data_json=data_json, + existing_team_row=existing_team_row_no_perm, + ) + + # Verify new object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "new_perm_id_456" + + # Verify find_unique was called with None + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": None} + ) + + # Verify upsert was called to create new record + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() + + +@pytest.mark.asyncio +async def test_team_update_object_permissions_missing_permission_record(monkeypatch): + """ + Test creating object permissions when existing object_permission_id record is not found. + + This test verifies that when updating object permissions for a team that has an + object_permission_id but the corresponding record cannot be found in the database, + a new entry is created in the LiteLLM_ObjectPermissionTable with the new permissions. + """ + from unittest.mock import AsyncMock, MagicMock + + import pytest + + from litellm.proxy._types import LiteLLM_ObjectPermissionBase, LiteLLM_TeamTable + from litellm.proxy.management_endpoints.team_endpoints import ( + handle_update_object_permission, + ) + + # Mock prisma client + mock_prisma_client = AsyncMock() + monkeypatch.setattr("litellm.proxy.proxy_server.prisma_client", mock_prisma_client) + + existing_team_row_missing_perm = LiteLLM_TeamTable( + team_id="test_team_id_3", + object_permission_id="missing_perm_id_789", + team_alias="test_team_3", + ) + + # Mock find_unique to return None (permission record not found) + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=None + ) + + # Mock upsert to create new record + new_permission = MagicMock() + new_permission.object_permission_id = "recreated_perm_id_789" + mock_prisma_client.db.litellm_objectpermissiontable.upsert = AsyncMock( + return_value=new_permission + ) + + data_json = { + "object_permission": LiteLLM_ObjectPermissionBase( + vector_stores=["recreated_store"] + ).model_dump(exclude_unset=True, exclude_none=True), + "team_alias": "updated_team_3", + } + + result = await handle_update_object_permission( + data_json=data_json, + existing_team_row=existing_team_row_missing_perm, + ) + + # Verify new object_permission_id was set + assert "object_permission" not in result + assert result["object_permission_id"] == "recreated_perm_id_789" + + # Verify find_unique was called with the missing permission ID + mock_prisma_client.db.litellm_objectpermissiontable.find_unique.assert_called_once_with( + where={"object_permission_id": "missing_perm_id_789"} + ) + + # Verify upsert was called to create new record + mock_prisma_client.db.litellm_objectpermissiontable.upsert.assert_called_once() diff --git a/ui/litellm-dashboard/src/components/key_edit_view.tsx b/ui/litellm-dashboard/src/components/key_edit_view.tsx index 2c7e3d30d1e..ed337cd5631 100644 --- a/ui/litellm-dashboard/src/components/key_edit_view.tsx +++ b/ui/litellm-dashboard/src/components/key_edit_view.tsx @@ -5,6 +5,8 @@ import { KeyResponse } from "./key_team_helpers/key_list"; import { fetchTeamModels } from "../components/create_key_button"; import { modelAvailableCall } from "./networking"; import NumericalInput from "./shared/numerical_input"; +import VectorStoreSelector from "./vector_store_management/VectorStoreSelector"; + interface KeyEditViewProps { keyData: KeyResponse; onCancel: () => void; @@ -92,7 +94,8 @@ export function KeyEditView({ ...keyData, budget_duration: getBudgetDuration(keyData.budget_duration), metadata: keyData.metadata ? JSON.stringify(keyData.metadata, null, 2) : "", - guardrails: keyData.metadata?.guardrails || [] + guardrails: keyData.metadata?.guardrails || [], + vector_stores: keyData.object_permission?.vector_stores || [] }; return ( @@ -165,6 +168,15 @@ export function KeyEditView({ /> + + form.setFieldValue('vector_stores', values)} + value={form.getFieldValue('vector_stores')} + accessToken={accessToken || ""} + placeholder="Select vector stores" + /> + + diff --git a/ui/litellm-dashboard/src/components/key_info_view.tsx b/ui/litellm-dashboard/src/components/key_info_view.tsx index b7ebdc651a0..0a5577badcf 100644 --- a/ui/litellm-dashboard/src/components/key_info_view.tsx +++ b/ui/litellm-dashboard/src/components/key_info_view.tsx @@ -22,6 +22,7 @@ import { Form, Input, InputNumber, message, Select } from "antd"; import { KeyEditView } from "./key_edit_view"; import { RegenerateKeyModal } from "./regenerate_key_modal"; import { rolesWithWriteAccess } from '../utils/roles'; +import ObjectPermissionsView from "./object_permissions_view"; interface KeyInfoViewProps { keyId: string; @@ -64,6 +65,16 @@ export default function KeyInfoView({ keyId, onClose, keyData, accessToken, user const currentKey = formValues.token; formValues.key = currentKey; + // Handle object_permission updates + if (formValues.vector_stores !== undefined) { + formValues.object_permission = { + ...keyData.object_permission, + vector_stores: formValues.vector_stores || [] + }; + // Remove vector_stores from the top level as it should be in object_permission + delete formValues.vector_stores; + } + // Convert metadata back to an object if it exists and is a string if (formValues.metadata && typeof formValues.metadata === "string") { try { @@ -249,6 +260,14 @@ export default function KeyInfoView({ keyId, onClose, keyData, accessToken, user )} + + + + @@ -354,6 +373,13 @@ export default function KeyInfoView({ keyId, onClose, keyData, accessToken, user {JSON.stringify(keyData.metadata, null, 2)} + + )} diff --git a/ui/litellm-dashboard/src/components/key_team_helpers/key_list.tsx b/ui/litellm-dashboard/src/components/key_team_helpers/key_list.tsx index 6de408dbb76..bd731820f46 100644 --- a/ui/litellm-dashboard/src/components/key_team_helpers/key_list.tsx +++ b/ui/litellm-dashboard/src/components/key_team_helpers/key_list.tsx @@ -75,6 +75,11 @@ export interface KeyResponse { user_tpm_limit: number; user_rpm_limit: number; user_email: string; + object_permission?: { + object_permission_id: string; + mcp_servers: string[]; + vector_stores: string[]; + }; } interface KeyListResponse { diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 0b0b55df144..35167fe7306 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -46,6 +46,11 @@ export interface Organization { teams: any[] | null; users: any[] | null; members: any[] | null; + object_permission?: { + object_permission_id: string; + mcp_servers: string[]; + vector_stores: string[]; + }; } export interface CredentialItem { diff --git a/ui/litellm-dashboard/src/components/object_permissions_view.tsx b/ui/litellm-dashboard/src/components/object_permissions_view.tsx new file mode 100644 index 00000000000..8329731c40f --- /dev/null +++ b/ui/litellm-dashboard/src/components/object_permissions_view.tsx @@ -0,0 +1,150 @@ +import React, { useState, useEffect } from "react"; +import { Card, Text, Badge } from "@tremor/react"; +import { ServerIcon, DatabaseIcon } from "@heroicons/react/outline"; +import { vectorStoreListCall } from "./networking"; + +interface VectorStoreDetails { + vector_store_id: string; + vector_store_name?: string; +} + +interface ObjectPermission { + object_permission_id: string; + mcp_servers: string[]; + vector_stores: string[]; +} + +interface ObjectPermissionsViewProps { + objectPermission?: ObjectPermission; + variant?: "card" | "inline"; + className?: string; + accessToken?: string | null; +} + +export function ObjectPermissionsView({ + objectPermission, + variant = "card", + className = "", + accessToken +}: ObjectPermissionsViewProps) { + const vectorStores = objectPermission?.vector_stores || []; + const mcpServers = objectPermission?.mcp_servers || []; + const [vectorStoreDetails, setVectorStoreDetails] = useState([]); + + // Fetch vector store details when component mounts + useEffect(() => { + const fetchVectorStores = async () => { + if (!accessToken || vectorStores.length === 0) return; + + try { + const response = await vectorStoreListCall(accessToken); + if (response.data) { + setVectorStoreDetails(response.data.map((store: any) => ({ + vector_store_id: store.vector_store_id, + vector_store_name: store.vector_store_name + }))); + } + } catch (error) { + console.error("Error fetching vector stores:", error); + } + }; + + fetchVectorStores(); + }, [accessToken, vectorStores.length]); + + // Function to get display name for vector store + const getVectorStoreDisplayName = (storeId: string) => { + const storeDetail = vectorStoreDetails.find(store => store.vector_store_id === storeId); + if (storeDetail) { + return `${storeDetail.vector_store_name || storeDetail.vector_store_id} (${storeDetail.vector_store_id})`; + } + return storeId; + }; + + const content = ( +
+ {/* Vector Stores Section */} +
+
+ + Vector Stores + + {vectorStores.length} + +
+ + {vectorStores.length > 0 ? ( +
+ {vectorStores.map((store, index) => ( +
+ {getVectorStoreDisplayName(store)} +
+ ))} +
+ ) : ( +
+ + No vector stores configured +
+ )} +
+ + {/* MCP Servers Section */} + {/*
+
+ + MCP Servers + + {mcpServers.length} + +
+ + {mcpServers.length > 0 ? ( +
+ {mcpServers.map((server, index) => ( +
+ {server} +
+ ))} +
+ ) : ( +
+ + No MCP servers configured +
+ )} +
*/} +
+ ); + + if (variant === "card") { + return ( +
+
+
+ Object Permissions + + Access control for Vector Stores + +
+
+ {content} +
+ ); + } + + return ( +
+ Object Permissions + {content} +
+ ); +} + +export default ObjectPermissionsView; \ No newline at end of file diff --git a/ui/litellm-dashboard/src/components/organization/organization_view.tsx b/ui/litellm-dashboard/src/components/organization/organization_view.tsx index 00cb2a82fd1..b80634b35eb 100644 --- a/ui/litellm-dashboard/src/components/organization/organization_view.tsx +++ b/ui/litellm-dashboard/src/components/organization/organization_view.tsx @@ -28,6 +28,8 @@ import { getModelDisplayName } from "../key_team_helpers/fetch_available_models_ import { Member, Organization, organizationInfoCall, organizationMemberAddCall, organizationMemberUpdateCall, organizationMemberDeleteCall, organizationUpdateCall } from "../networking"; import UserSearchModal from "../common_components/user_search_modal"; import MemberModal from "../team/edit_membership"; +import ObjectPermissionsView from "../object_permissions_view"; +import VectorStoreSelector from "../vector_store_management/VectorStoreSelector"; interface OrganizationInfoProps { organizationId: string; @@ -139,7 +141,7 @@ const OrganizationInfoView: React.FC = ({ try { if (!accessToken) return; - const updateData = { + const updateData: any = { organization_id: organizationId, organization_alias: values.organization_alias, models: values.models, @@ -151,6 +153,14 @@ const OrganizationInfoView: React.FC = ({ }, metadata: values.metadata ? JSON.parse(values.metadata) : null, }; + + // Handle object_permission updates + if (values.vector_stores !== undefined) { + updateData.object_permission = { + ...orgData?.object_permission, + vector_stores: values.vector_stores || [] + }; + } const response = await organizationUpdateCall(accessToken, updateData); @@ -247,6 +257,12 @@ const OrganizationInfoView: React.FC = ({ ))} + + @@ -346,6 +362,7 @@ const OrganizationInfoView: React.FC = ({ max_budget: orgData.litellm_budget_table.max_budget, budget_duration: orgData.litellm_budget_table.budget_duration, metadata: orgData.metadata ? JSON.stringify(orgData.metadata, null, 2) : "", + vector_stores: orgData.object_permission?.vector_stores || [] }} layout="vertical" > @@ -393,6 +410,15 @@ const OrganizationInfoView: React.FC = ({ + + form.setFieldValue('vector_stores', values)} + value={form.getFieldValue('vector_stores')} + accessToken={accessToken || ""} + placeholder="Select vector stores" + /> + + @@ -440,6 +466,13 @@ const OrganizationInfoView: React.FC = ({
Max: {orgData.litellm_budget_table.max_budget !== null ? `$${orgData.litellm_budget_table.max_budget}` : 'No Limit'}
Reset: {orgData.litellm_budget_table.budget_duration || 'Never'}
+ + )} diff --git a/ui/litellm-dashboard/src/components/team/team_info.tsx b/ui/litellm-dashboard/src/components/team/team_info.tsx index 1de0966f196..a3544484ecf 100644 --- a/ui/litellm-dashboard/src/components/team/team_info.tsx +++ b/ui/litellm-dashboard/src/components/team/team_info.tsx @@ -33,6 +33,8 @@ import MemberModal from "./edit_membership"; import UserSearchModal from "@/components/common_components/user_search_modal"; import { getModelDisplayName } from "../key_team_helpers/fetch_available_models_team_key"; import { isAdminRole } from "@/utils/roles"; +import ObjectPermissionsView from "../object_permissions_view"; +import VectorStoreSelector from "../vector_store_management/VectorStoreSelector"; export interface TeamData { team_id: string; @@ -58,6 +60,11 @@ export interface TeamData { model_aliases: Record; } | null; created_at: string; + object_permission?: { + object_permission_id: string; + mcp_servers: string[]; + vector_stores: string[]; + }; }; keys: any[]; team_memberships: any[]; @@ -209,7 +216,7 @@ const TeamInfoView: React.FC = ({ return; } - const updateData = { + const updateData: any = { team_id: teamId, team_alias: values.team_alias, models: values.models, @@ -223,6 +230,14 @@ const TeamInfoView: React.FC = ({ }, organization_id: values.organization_id, }; + + // Handle object_permission updates + if (values.vector_stores !== undefined) { + updateData.object_permission = { + ...teamData?.team_info.object_permission, + vector_stores: values.vector_stores || [] + }; + } const response = await teamUpdateCall(accessToken, updateData); @@ -306,6 +321,12 @@ const TeamInfoView: React.FC = ({ )} + + @@ -361,6 +382,7 @@ const TeamInfoView: React.FC = ({ guardrails: info.metadata?.guardrails || [], metadata: info.metadata ? JSON.stringify(info.metadata, null, 2) : "", organization_id: info.organization_id, + vector_stores: info.object_permission?.vector_stores || [] }} layout="vertical" > @@ -432,6 +454,15 @@ const TeamInfoView: React.FC = ({ placeholder="Select or enter guardrails" /> + + + form.setFieldValue('vector_stores', values)} + value={form.getFieldValue('vector_stores')} + accessToken={accessToken || ""} + placeholder="Select vector stores" + /> + @@ -495,6 +526,13 @@ const TeamInfoView: React.FC = ({ {info.blocked ? 'Blocked' : 'Active'} + + )} From a9d23f5d4ad8d1abf518618096977b9b5464edbd Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 17:24:03 -0700 Subject: [PATCH 19/77] [Fix] Bedrock Guard Auth Param Persistence (#11270) * fix: using bedrock guard * fix: bedrock guard param persistence --- .../guardrail_hooks/bedrock_guardrails.py | 22 ++++------ .../test_bedrock_guardrails.py | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py b/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py index f4d1076ae26..1432e44184e 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py +++ b/litellm/proxy/guardrails/guardrail_hooks/bedrock_guardrails.py @@ -116,21 +116,17 @@ class BedrockGuardrail(CustomGuardrail, BaseAWSLLM): except ImportError: raise ImportError("Missing boto3 to call bedrock. Run 'pip install boto3'.") ## CREDENTIALS ## - # pop aws_secret_access_key, aws_access_key_id, aws_session_token, aws_region_name from kwargs, since completion calls fail with them - aws_secret_access_key = self.optional_params.pop("aws_secret_access_key", None) - aws_access_key_id = self.optional_params.pop("aws_access_key_id", None) - aws_session_token = self.optional_params.pop("aws_session_token", None) - aws_region_name = self.optional_params.pop("aws_region_name", None) - aws_role_name = self.optional_params.pop("aws_role_name", None) - aws_session_name = self.optional_params.pop("aws_session_name", None) - aws_profile_name = self.optional_params.pop("aws_profile_name", None) - self.optional_params.pop( - "aws_bedrock_runtime_endpoint", None - ) # https://bedrock-runtime.{region_name}.amazonaws.com - aws_web_identity_token = self.optional_params.pop( + aws_secret_access_key = self.optional_params.get("aws_secret_access_key", None) + aws_access_key_id = self.optional_params.get("aws_access_key_id", None) + aws_session_token = self.optional_params.get("aws_session_token", None) + aws_region_name = self.optional_params.get("aws_region_name", None) + aws_role_name = self.optional_params.get("aws_role_name", None) + aws_session_name = self.optional_params.get("aws_session_name", None) + aws_profile_name = self.optional_params.get("aws_profile_name", None) + aws_web_identity_token = self.optional_params.get( "aws_web_identity_token", None ) - aws_sts_endpoint = self.optional_params.pop("aws_sts_endpoint", None) + aws_sts_endpoint = self.optional_params.get("aws_sts_endpoint", None) ### SET REGION NAME ### if aws_region_name is None: diff --git a/tests/guardrails_tests/test_bedrock_guardrails.py b/tests/guardrails_tests/test_bedrock_guardrails.py index bd537b73096..46e409f54c6 100644 --- a/tests/guardrails_tests/test_bedrock_guardrails.py +++ b/tests/guardrails_tests/test_bedrock_guardrails.py @@ -8,6 +8,7 @@ from litellm.proxy.guardrails.guardrail_hooks.bedrock_guardrails import BedrockG from litellm.proxy._types import UserAPIKeyAuth from litellm.caching import DualCache from unittest.mock import MagicMock +from unittest.mock import AsyncMock, patch @pytest.mark.asyncio async def test_bedrock_guardrails(): @@ -290,4 +291,47 @@ async def test_bedrock_guardrails_streaming_request_body_mock(): # Assert the request body matches exactly assert actual_body == expected_body, f"Request body mismatch. Expected: {expected_body}, Got: {actual_body}" + + +@pytest.mark.asyncio +async def test_bedrock_guardrail_aws_param_persistence(): + """Test that AWS auth params set on init are used for every request and not popped out.""" + from litellm.proxy._types import UserAPIKeyAuth + from litellm.types.guardrails import GuardrailEventHooks + + guardrail = BedrockGuardrail( + guardrailIdentifier="wf0hkdb5x07f", + guardrailVersion="DRAFT", + aws_access_key_id="test-access-key", + aws_secret_access_key="test-secret-key", + aws_region_name="us-east-1", + supported_event_hooks=[GuardrailEventHooks.post_call], + guardrail_name="bedrock-post-guard", + ) + + with patch.object(guardrail, "get_credentials", wraps=guardrail.get_credentials) as mock_get_creds: + for i in range(3): + request_data = { + "model": "gpt-4o", + "messages": [ + {"role": "user", "content": f"request {i}"} + ], + "stream": False, + "metadata": {"guardrails": ["bedrock-post-guard"]} + } + with patch.object(guardrail.async_handler, "post", new_callable=AsyncMock) as mock_post: + # Configure the mock response properly + mock_response = AsyncMock() + mock_response.status_code = 200 + mock_response.json = MagicMock(return_value={"action": "NONE", "outputs": []}) + mock_post.return_value = mock_response + await guardrail.make_bedrock_api_request(kwargs=request_data, response=None) + + assert mock_get_creds.call_count == 3 + for call in mock_get_creds.call_args_list: + kwargs = call.kwargs + print("used the following kwargs to get credentials=", kwargs) + assert kwargs["aws_access_key_id"] == "test-access-key" + assert kwargs["aws_secret_access_key"] == "test-secret-key" + assert kwargs["aws_region_name"] == "us-east-1" \ No newline at end of file From c698cc24aac5f1cb3062fb0370d1b9020b2e9d0e Mon Sep 17 00:00:00 2001 From: Isaac Whitfield Date: Fri, 30 May 2025 17:26:23 -0700 Subject: [PATCH 20/77] Streamline session expiration in UI (#11279) --- ui/litellm-dashboard/src/components/networking.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 35167fe7306..5edce01f7b0 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -67,13 +67,8 @@ export interface CredentialsResponse { credentials: CredentialItem[]; } - -const baseUrl = "/"; // Assuming the base URL is the root - - let lastErrorTime = 0; -const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); const handleError = async (errorData: string) => { const currentTime = Date.now(); @@ -81,9 +76,8 @@ const handleError = async (errorData: string) => { if (errorData.includes("Authentication Error - Expired Key")) { message.info("UI Session Expired. Logging out."); lastErrorTime = currentTime; - await sleep(3000); // 5 second sleep document.cookie = "token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; - window.location.href = baseUrl; + window.location.href = window.location.pathname; } lastErrorTime = currentTime; } else { From 2f8eb1dcc312416cf930f88796539c865a7a152b Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 22:19:53 -0700 Subject: [PATCH 21/77] fix: dont require mcp pip for proxy (#11282) --- litellm/proxy/_experimental/mcp_server/utils.py | 12 ++++++++++++ litellm/proxy/proxy_server.py | 8 ++++++++ 2 files changed, 20 insertions(+) create mode 100644 litellm/proxy/_experimental/mcp_server/utils.py diff --git a/litellm/proxy/_experimental/mcp_server/utils.py b/litellm/proxy/_experimental/mcp_server/utils.py new file mode 100644 index 00000000000..bad5f060fb8 --- /dev/null +++ b/litellm/proxy/_experimental/mcp_server/utils.py @@ -0,0 +1,12 @@ +import importlib + + +def is_mcp_available() -> bool: + """ + Returns True if the MCP module is available, False otherwise + """ + try: + importlib.import_module("mcp") + return True + except ImportError: + return False diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 633e6d086f4..c54d3c08dc9 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -2786,6 +2786,14 @@ class ProxyConfig: ) async def _init_mcp_servers_in_db(self): + from litellm.proxy._experimental.mcp_server.utils import is_mcp_available + + if not is_mcp_available(): + verbose_proxy_logger.debug( + "MCP module not available, skipping MCP server initialization" + ) + return + from litellm.proxy._experimental.mcp_server.mcp_server_manager import ( global_mcp_server_manager, ) From 7e49b4e2a016743e97a60777d49e67d0076bf867 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 22:20:11 -0700 Subject: [PATCH 22/77] [Feat] Enforce Vector Store Access Controls on LiteLLM Auth (#11281) * fix LiteLLM_ObjectPermissionTable * fix include object_permission for list key * fix key list to inclue obj permissions * fix object permissions for vector stores on key info * add key edit view with vector stores * allow editing vector stores permissions * fixes obj permissions * feat: add obj permission on UI * fix: add object_permission:true * ui show org vector stores on org info * fix: show object permissions on /org/info * feat: allow updating obj permissions for keys * fixes: key object permissions * fixes: team object permissions * fixes: org object permissions * fix vector store selector for Orgs * feat: add auth checks for vector store permissions * feat: working auth checks for vector store permissions * test vector stores auth checks * Update litellm/proxy/_types.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: linting --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- litellm/proxy/_types.py | 33 +++- litellm/proxy/auth/auth_checks.py | 110 ++++++++++++ litellm/proxy/proxy_config.yaml | 11 -- .../proxy/auth/test_auth_checks.py | 158 +++++++++++++++++- 4 files changed, 298 insertions(+), 14 deletions(-) diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index b9ff051da74..ffd399ae839 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -1254,8 +1254,8 @@ class LiteLLM_ObjectPermissionTable(LiteLLMPydanticObjectBase): """Represents a LiteLLM_ObjectPermissionTable record""" object_permission_id: str - mcp_servers: List[str] - vector_stores: List[str] + mcp_servers: Optional[List[str]] = [] + vector_stores: Optional[List[str]] = [] class LiteLLM_TeamTable(TeamBase): @@ -2364,6 +2364,21 @@ class ProxyErrorTypes(str, enum.Enum): Team member permission error """ + key_vector_store_access_denied = "key_vector_store_access_denied" + """ + Key does not have access to the vector store + """ + + team_vector_store_access_denied = "team_vector_store_access_denied" + """ + Team does not have access to the vector store + """ + + org_vector_store_access_denied = "org_vector_store_access_denied" + """ + Organization does not have access to the vector store + """ + @classmethod def get_model_access_error_type_for_object( cls, object_type: Literal["key", "user", "team", "org"] @@ -2380,6 +2395,20 @@ class ProxyErrorTypes(str, enum.Enum): elif object_type == "org": return cls.org_model_access_denied + @classmethod + def get_vector_store_access_error_type_for_object( + cls, object_type: Literal["key", "team", "org"] + ) -> "ProxyErrorTypes": + """ + Get the vector store access error type for object_type + """ + if object_type == "key": + return cls.key_vector_store_access_denied + elif object_type == "team": + return cls.team_vector_store_access_denied + elif object_type == "org": + return cls.org_vector_store_access_denied + DB_CONNECTION_ERROR_TYPES = ( httpx.ConnectError, diff --git a/litellm/proxy/auth/auth_checks.py b/litellm/proxy/auth/auth_checks.py index 50212471450..2cb60649890 100644 --- a/litellm/proxy/auth/auth_checks.py +++ b/litellm/proxy/auth/auth_checks.py @@ -32,6 +32,7 @@ from litellm.proxy._types import ( LiteLLM_EndUserTable, Litellm_EntityType, LiteLLM_JWTAuth, + LiteLLM_ObjectPermissionTable, LiteLLM_OrganizationMembershipTable, LiteLLM_OrganizationTable, LiteLLM_TeamTable, @@ -94,6 +95,7 @@ async def common_checks( 8. [OPTIONAL] If guardrails modified - is request allowed to change this 9. Check if request body is safe 10. [OPTIONAL] Organization checks - is user_object.organization_id is set, run these checks + 11. [OPTIONAL] Vector store checks - is the object allowed to access the vector store """ _model: Optional[Union[str, List[str]]] = get_model_from_request( request_body, route @@ -219,6 +221,13 @@ async def common_checks( valid_token=valid_token, ) + # 11. [OPTIONAL] Vector store checks - is the object allowed to access the vector store + await vector_store_access_check( + request_body=request_body, + team_object=team_object, + valid_token=valid_token, + ) + return True @@ -1576,3 +1585,104 @@ def _is_wildcard_pattern(allowed_model_pattern: str) -> bool: Checks if `*` is in the pattern. """ return "*" in allowed_model_pattern + + +async def vector_store_access_check( + request_body: dict, + team_object: Optional[LiteLLM_TeamTable], + valid_token: Optional[UserAPIKeyAuth], +): + """ + Checks if the object (key, team, org) has access to the vector store. + + Raises ProxyException if the object (key, team, org) cannot access the specific vector store. + """ + from litellm.proxy.proxy_server import prisma_client + + ######################################################### + # Get the vector store the user is trying to access + ######################################################### + if prisma_client is None: + verbose_proxy_logger.debug( + "Prisma client not found, skipping vector store access check" + ) + return True + + if litellm.vector_store_registry is None: + verbose_proxy_logger.debug( + "Vector store registry not found, skipping vector store access check" + ) + return True + + vector_store_ids_to_run = litellm.vector_store_registry.get_vector_store_ids_to_run( + non_default_params=request_body, tools=request_body.get("tools", None) + ) + if vector_store_ids_to_run is None: + verbose_proxy_logger.debug( + "Vector store to run not found, skipping vector store access check" + ) + return True + + ######################################################### + # Check if the object (key, team, org) has access to the vector store + ######################################################### + # Check if the key can access the vector store + if valid_token is not None and valid_token.object_permission_id is not None: + key_object_permission = ( + await prisma_client.db.litellm_objectpermissiontable.find_unique( + where={"object_permission_id": valid_token.object_permission_id}, + ) + ) + if key_object_permission is not None: + _can_object_call_vector_stores( + object_type="key", + vector_store_ids_to_run=vector_store_ids_to_run, + object_permissions=key_object_permission, + ) + + # Check if the team can access the vector store + if team_object is not None and team_object.object_permission_id is not None: + team_object_permission = ( + await prisma_client.db.litellm_objectpermissiontable.find_unique( + where={"object_permission_id": team_object.object_permission_id}, + ) + ) + if team_object_permission is not None: + _can_object_call_vector_stores( + object_type="team", + vector_store_ids_to_run=vector_store_ids_to_run, + object_permissions=team_object_permission, + ) + return True + + +def _can_object_call_vector_stores( + object_type: Literal["key", "team", "org"], + vector_store_ids_to_run: List[str], + object_permissions: Optional[LiteLLM_ObjectPermissionTable], +): + """ + Raises ProxyException if the object (key, team, org) cannot access the specific vector store. + """ + if object_permissions is None: + return True + + if object_permissions.vector_stores is None: + return True + + # If length is 0, then the object has access to all vector stores. + if len(object_permissions.vector_stores) == 0: + return True + + for vector_store_id in vector_store_ids_to_run: + if vector_store_id not in object_permissions.vector_stores: + raise ProxyException( + message=f"User not allowed to access vector store. Tried to access {vector_store_id}. Only allowed to access {object_permissions.vector_stores}", + type=ProxyErrorTypes.get_vector_store_access_error_type_for_object( + object_type + ), + param="vector_store", + code=status.HTTP_401_UNAUTHORIZED, + ) + + return True diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index af3dc2b908a..ded872e0cea 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -3,16 +3,5 @@ model_list: litellm_params: model: anthropic/* - general_settings: store_prompts_in_spend_logs: true - -guardrails: - - guardrail_name: "bedrock-pre-guard" - litellm_params: - guardrail: bedrock # supported values: "aporia", "bedrock", "lakera" - mode: "post_call" - guardrailIdentifier: wf0hkdb5x07f # your guardrail ID on bedrock - guardrailVersion: "DRAFT" # your guardrail version on bedrock - default_on: true - diff --git a/tests/test_litellm/proxy/auth/test_auth_checks.py b/tests/test_litellm/proxy/auth/test_auth_checks.py index 97c952b63f5..9b7af1859e8 100644 --- a/tests/test_litellm/proxy/auth/test_auth_checks.py +++ b/tests/test_litellm/proxy/auth/test_auth_checks.py @@ -14,11 +14,21 @@ import pytest import litellm from litellm.proxy._types import ( + LiteLLM_ObjectPermissionTable, + LiteLLM_TeamTable, LiteLLM_UserTable, LitellmUserRoles, + ProxyErrorTypes, + ProxyException, SSOUserDefinedValues, + UserAPIKeyAuth, +) +from litellm.proxy.auth.auth_checks import ( + ExperimentalUIJWTToken, + _can_object_call_vector_stores, + get_user_object, + vector_store_access_check, ) -from litellm.proxy.auth.auth_checks import ExperimentalUIJWTToken, get_user_object from litellm.proxy.common_utils.encrypt_decrypt_utils import decrypt_value_helper from litellm.utils import get_utc_datetime @@ -178,3 +188,149 @@ async def test_default_internal_user_params_with_get_user_object(monkeypatch): assert creation_args["models"] == ["gpt-4", "claude-3-opus"] assert creation_args["max_budget"] == 200.0 assert creation_args["user_role"] == "internal_user" + + +# Vector Store Auth Check Tests + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "prisma_client,vector_store_registry,expected_result", + [ + (None, MagicMock(), True), # No prisma client + (MagicMock(), None, True), # No vector store registry + (MagicMock(), MagicMock(), True), # No vector stores to run + ], +) +async def test_vector_store_access_check_early_returns( + prisma_client, vector_store_registry, expected_result +): + """Test vector_store_access_check returns True for early exit conditions""" + request_body = {"messages": [{"role": "user", "content": "test"}]} + + if vector_store_registry: + vector_store_registry.get_vector_store_ids_to_run.return_value = None + + with patch("litellm.proxy.proxy_server.prisma_client", prisma_client), patch( + "litellm.vector_store_registry", vector_store_registry + ): + result = await vector_store_access_check( + request_body=request_body, + team_object=None, + valid_token=None, + ) + + assert result == expected_result + + +@pytest.mark.parametrize( + "object_permissions,vector_store_ids,should_raise,error_type", + [ + (None, ["store-1"], False, None), # None permissions - should pass + ( + {"vector_stores": []}, + ["store-1"], + False, + None, + ), # Empty vector_stores - should pass (access to all) + ( + {"vector_stores": ["store-1", "store-2"]}, + ["store-1"], + False, + None, + ), # Has access + ( + {"vector_stores": ["store-1", "store-2"]}, + ["store-3"], + True, + ProxyErrorTypes.key_vector_store_access_denied, + ), # No access + ( + {"vector_stores": ["store-1"]}, + ["store-1", "store-3"], + True, + ProxyErrorTypes.team_vector_store_access_denied, + ), # Partial access + ], +) +def test_can_object_call_vector_stores_scenarios( + object_permissions, vector_store_ids, should_raise, error_type +): + """Test _can_object_call_vector_stores with various permission scenarios""" + # Convert dict to object if not None + if object_permissions is not None: + mock_permissions = MagicMock() + mock_permissions.vector_stores = object_permissions["vector_stores"] + object_permissions = mock_permissions + + object_type = ( + "key" + if error_type == ProxyErrorTypes.key_vector_store_access_denied + else "team" + ) + + if should_raise: + with pytest.raises(ProxyException) as exc_info: + _can_object_call_vector_stores( + object_type=object_type, + vector_store_ids_to_run=vector_store_ids, + object_permissions=object_permissions, + ) + assert exc_info.value.type == error_type + else: + result = _can_object_call_vector_stores( + object_type=object_type, + vector_store_ids_to_run=vector_store_ids, + object_permissions=object_permissions, + ) + assert result is True + + +@pytest.mark.asyncio +async def test_vector_store_access_check_with_permissions(): + """Test vector_store_access_check with actual permission checking""" + request_body = {"tools": [{"type": "function", "function": {"name": "test"}}]} + + # Test with valid token that has access + valid_token = UserAPIKeyAuth( + token="test-token", + object_permission_id="perm-123", + models=["gpt-4"], + max_budget=100.0, + ) + + mock_prisma_client = MagicMock() + mock_permissions = MagicMock() + mock_permissions.vector_stores = ["store-1", "store-2"] + mock_prisma_client.db.litellm_objectpermissiontable.find_unique = AsyncMock( + return_value=mock_permissions + ) + + mock_vector_store_registry = MagicMock() + mock_vector_store_registry.get_vector_store_ids_to_run.return_value = ["store-1"] + + with patch("litellm.proxy.proxy_server.prisma_client", mock_prisma_client), patch( + "litellm.vector_store_registry", mock_vector_store_registry + ): + result = await vector_store_access_check( + request_body=request_body, + team_object=None, + valid_token=valid_token, + ) + + assert result is True + + # Test with denied access + mock_vector_store_registry.get_vector_store_ids_to_run.return_value = ["store-3"] + + with patch("litellm.proxy.proxy_server.prisma_client", mock_prisma_client), patch( + "litellm.vector_store_registry", mock_vector_store_registry + ): + with pytest.raises(ProxyException) as exc_info: + await vector_store_access_check( + request_body=request_body, + team_object=None, + valid_token=valid_token, + ) + + assert exc_info.value.type == ProxyErrorTypes.key_vector_store_access_denied From d7f19bbfe3db824c0635abfd644b16b1e474cb59 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 22:34:39 -0700 Subject: [PATCH 23/77] [Bug]: Performance Fix Max langfuse clients reached: 20 is greater than 20 (#11285) * fix: initializing langfuse clients * fix: initializing langfuse clients * tests: tests for langfuse cache --- litellm/caching/in_memory_cache.py | 39 ++++++--- litellm/constants.py | 2 +- .../specialty_caches/dynamic_logging_cache.py | 48 ++++++++++- .../test_dynamic_logging_cache.py | 81 +++++++++++++++++++ 4 files changed, 158 insertions(+), 12 deletions(-) create mode 100644 tests/test_litellm/litellm_core_utils/specialty_caches/test_dynamic_logging_cache.py diff --git a/litellm/caching/in_memory_cache.py b/litellm/caching/in_memory_cache.py index e9c3f7ba44b..a3ee8813449 100644 --- a/litellm/caching/in_memory_cache.py +++ b/litellm/caching/in_memory_cache.py @@ -84,6 +84,19 @@ class InMemoryCache(BaseCache): except Exception: return False + def _is_key_expired(self, key: str) -> bool: + """ + Check if a specific key is expired + """ + return key in self.ttl_dict and time.time() > self.ttl_dict[key] + + def _remove_key(self, key: str) -> None: + """ + Remove a key from both cache_dict and ttl_dict + """ + self.cache_dict.pop(key, None) + self.ttl_dict.pop(key, None) + def evict_cache(self): """ Eviction policy: @@ -97,9 +110,8 @@ class InMemoryCache(BaseCache): """ for key in list(self.ttl_dict.keys()): - if time.time() > self.ttl_dict[key]: - self.cache_dict.pop(key, None) - self.ttl_dict.pop(key, None) + if self._is_key_expired(key): + self._remove_key(key) # de-reference the removed item # https://www.geeksforgeeks.org/diagnosing-and-fixing-memory-leaks-in-python/ @@ -153,13 +165,21 @@ class InMemoryCache(BaseCache): self.set_cache(key, init_value, ttl=ttl) return value + def evict_element_if_expired(self, key: str) -> bool: + """ + Returns True if the element is expired and removed from the cache + + Returns False if the element is not expired + """ + if self._is_key_expired(key): + self._remove_key(key) + return True + return False + def get_cache(self, key, **kwargs): if key in self.cache_dict: - if key in self.ttl_dict: - if time.time() > self.ttl_dict[key]: - self.cache_dict.pop(key, None) - self.ttl_dict.pop(key, None) - return None + if self.evict_element_if_expired(key): + return None original_cached_response = self.cache_dict[key] try: cached_response = json.loads(original_cached_response) @@ -207,8 +227,7 @@ class InMemoryCache(BaseCache): pass def delete_cache(self, key): - self.cache_dict.pop(key, None) - self.ttl_dict.pop(key, None) + self._remove_key(key) async def async_get_ttl(self, key: str) -> Optional[int]: """ diff --git a/litellm/constants.py b/litellm/constants.py index da9778922b4..d36ad0f228a 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -154,7 +154,7 @@ FIREWORKS_AI_80_B = int(os.getenv("FIREWORKS_AI_80_B", 80)) #### Logging callback constants #### REDACTED_BY_LITELM_STRING = "REDACTED_BY_LITELM" MAX_LANGFUSE_INITIALIZED_CLIENTS = int( - os.getenv("MAX_LANGFUSE_INITIALIZED_CLIENTS", 20) + os.getenv("MAX_LANGFUSE_INITIALIZED_CLIENTS", 50) ) ############### LLM Provider Constants ############### diff --git a/litellm/litellm_core_utils/specialty_caches/dynamic_logging_cache.py b/litellm/litellm_core_utils/specialty_caches/dynamic_logging_cache.py index 704803c78bd..c2acc708bb5 100644 --- a/litellm/litellm_core_utils/specialty_caches/dynamic_logging_cache.py +++ b/litellm/litellm_core_utils/specialty_caches/dynamic_logging_cache.py @@ -1,10 +1,56 @@ +""" +This is a cache for LangfuseLoggers. + +Langfuse Python SDK initializes a thread for each client. + +This ensures we do +1. Proper cleanup of Langfuse initialized clients. +2. Re-use created langfuse clients. +""" import hashlib import json from typing import Any, Optional +import litellm +from litellm.constants import _DEFAULT_TTL_FOR_HTTPX_CLIENTS + from ...caching import InMemoryCache +class LangfuseInMemoryCache(InMemoryCache): + """ + Ensures we do proper cleanup of Langfuse initialized clients. + + Langfuse Python SDK initializes a thread for each client, we need to call Langfuse.shutdown() to properly cleanup. + + This ensures we do proper cleanup of Langfuse initialized clients. + """ + + def _remove_key(self, key: str) -> None: + """ + Override _remove_key in InMemoryCache to ensure we do proper cleanup of Langfuse initialized clients. + + LangfuseLoggers consume threads when initalized, this shuts them down when they are expired + + Relevant Issue: https://github.com/BerriAI/litellm/issues/11169 + """ + from litellm.integrations.langfuse.langfuse import LangFuseLogger + + if isinstance(self.cache_dict[key], LangFuseLogger): + _created_langfuse_logger: LangFuseLogger = self.cache_dict[key] + ######################################################### + # Clean up Langfuse initialized clients + ######################################################### + litellm.initialized_langfuse_clients -= 1 + _created_langfuse_logger.Langfuse.flush() + _created_langfuse_logger.Langfuse.shutdown() + + ######################################################### + # Call parent class to remove key from cache + ######################################################### + return super()._remove_key(key) + + class DynamicLoggingCache: """ Prevent memory leaks caused by initializing new logging clients on each request. @@ -13,7 +59,7 @@ class DynamicLoggingCache: """ def __init__(self) -> None: - self.cache = InMemoryCache() + self.cache = LangfuseInMemoryCache(default_ttl=_DEFAULT_TTL_FOR_HTTPX_CLIENTS) def get_cache_key(self, args: dict) -> str: args_str = json.dumps(args, sort_keys=True) diff --git a/tests/test_litellm/litellm_core_utils/specialty_caches/test_dynamic_logging_cache.py b/tests/test_litellm/litellm_core_utils/specialty_caches/test_dynamic_logging_cache.py new file mode 100644 index 00000000000..85fcc2700bc --- /dev/null +++ b/tests/test_litellm/litellm_core_utils/specialty_caches/test_dynamic_logging_cache.py @@ -0,0 +1,81 @@ +import json +import os +import sys +import time +from unittest.mock import MagicMock, patch + +import pytest + +sys.path.insert( + 0, os.path.abspath("../../..") +) # Adds the parent directory to the system path + +import litellm +from litellm.litellm_core_utils.specialty_caches.dynamic_logging_cache import ( + LangfuseInMemoryCache, +) + + +class TestLangfuseInMemoryCache: + """Simple tests to ensure langfuse client cleanup works correctly.""" + + def setup_method(self): + """Set up test fixtures before each test method.""" + self.cache = LangfuseInMemoryCache(max_size_in_memory=2, default_ttl=1) + + @patch("litellm.initialized_langfuse_clients", 5) + def test_langfuse_client_count_decrements_on_eviction(self): + """Test that langfuse client count decrements when elements get evicted from cache.""" + + # Create a mock LangFuseLogger class + class MockLangFuseLogger: + def __init__(self): + self.Langfuse = MagicMock() + self.Langfuse.flush = MagicMock() + self.Langfuse.shutdown = MagicMock() + + mock_logger = MockLangFuseLogger() + + # Patch the LangFuseLogger import to return our mock class + with patch( + "litellm.integrations.langfuse.langfuse.LangFuseLogger", MockLangFuseLogger + ): + # Add the mock logger to cache with expired TTL + self.cache.cache_dict["test_key"] = mock_logger + self.cache.ttl_dict["test_key"] = time.time() - 1 # Already expired + + initial_count = litellm.initialized_langfuse_clients + + # Trigger eviction + self.cache.evict_cache() + + # Verify client count was decremented + assert litellm.initialized_langfuse_clients == initial_count - 1 + + @patch("litellm.initialized_langfuse_clients", 3) + def test_langfuse_client_shutdown_called_on_eviction(self): + """Test that langfuse client shutdown is called to close the thread.""" + + # Create a mock LangFuseLogger class + class MockLangFuseLogger: + def __init__(self): + self.Langfuse = MagicMock() + self.Langfuse.flush = MagicMock() + self.Langfuse.shutdown = MagicMock() + + mock_logger = MockLangFuseLogger() + + # Patch the LangFuseLogger import to return our mock class + with patch( + "litellm.integrations.langfuse.langfuse.LangFuseLogger", MockLangFuseLogger + ): + # Add the mock logger to cache + self.cache.cache_dict["test_key"] = mock_logger + self.cache.ttl_dict["test_key"] = time.time() + 100 + + # Remove the key (this should trigger cleanup) + self.cache._remove_key("test_key") + + # Verify flush and shutdown were called + mock_logger.Langfuse.flush.assert_called_once() + mock_logger.Langfuse.shutdown.assert_called_once() From 310d97c982a9d89f5404080f5d530de9bb3dd258 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 22:51:10 -0700 Subject: [PATCH 24/77] fix: fix linting error --- litellm/proxy/_experimental/mcp_server/db.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/db.py b/litellm/proxy/_experimental/mcp_server/db.py index 6087458f9f4..605b1b6792d 100644 --- a/litellm/proxy/_experimental/mcp_server/db.py +++ b/litellm/proxy/_experimental/mcp_server/db.py @@ -73,13 +73,13 @@ async def get_mcp_servers_by_verificationtoken( ) ) - mcp_servers = [] + mcp_servers: Optional[List[str]] = [] if ( verification_token_record is not None and verification_token_record.object_permission is not None ): mcp_servers = verification_token_record.object_permission.mcp_servers - return mcp_servers + return mcp_servers or [] async def get_mcp_servers_by_team( @@ -99,10 +99,10 @@ async def get_mcp_servers_by_team( ) ) - mcp_servers = [] + mcp_servers: Optional[List[str]] = [] if team_record is not None and team_record.object_permission is not None: mcp_servers = team_record.object_permission.mcp_servers - return mcp_servers + return mcp_servers or [] async def get_all_mcp_servers_for_user( From c5873c6f1feee9797971117dfe299985acc854fc Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 30 May 2025 23:06:45 -0700 Subject: [PATCH 25/77] UI QA fixes/cleanup --- ui/litellm-dashboard/src/components/organizations.tsx | 6 ------ ui/litellm-dashboard/src/components/teams.tsx | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/ui/litellm-dashboard/src/components/organizations.tsx b/ui/litellm-dashboard/src/components/organizations.tsx index 3b2eddef9d9..6bb78ccee02 100644 --- a/ui/litellm-dashboard/src/components/organizations.tsx +++ b/ui/litellm-dashboard/src/components/organizations.tsx @@ -459,12 +459,6 @@ const OrganizationsTable: React.FC = ({ {(userRole === "Admin" || userRole === "Org Admin") && ( - = ({ { - userRole == "Admin" || userRole == "Org Admin"? + (userRole == "Admin" || userRole == "Org Admin") && !selectedTeamId? - +
+
+ + Cancel + + + Save Changes + +
); diff --git a/ui/litellm-dashboard/src/components/key_info_view.tsx b/ui/litellm-dashboard/src/components/key_info_view.tsx index 0a5577badcf..4154c616115 100644 --- a/ui/litellm-dashboard/src/components/key_info_view.tsx +++ b/ui/litellm-dashboard/src/components/key_info_view.tsx @@ -134,7 +134,7 @@ export default function KeyInfoView({ keyId, onClose, keyData, accessToken, user }; return ( -
+
- - Save Changes - +
+
+ + + Save Changes + +
) : ( diff --git a/ui/litellm-dashboard/src/components/team/team_info.tsx b/ui/litellm-dashboard/src/components/team/team_info.tsx index eebb4b8801e..084f58065ee 100644 --- a/ui/litellm-dashboard/src/components/team/team_info.tsx +++ b/ui/litellm-dashboard/src/components/team/team_info.tsx @@ -358,7 +358,7 @@ const TeamInfoView: React.FC = ({ {/* Settings Panel */} - +
Team Settings {(canEditTeam && !isEditing) && ( @@ -474,15 +474,16 @@ const TeamInfoView: React.FC = ({ - - -
- - - Save Changes - + +
+
+ + + Save Changes + +
) : ( From dd17661b13ae382a27c01238ce38a3fbd534e0c9 Mon Sep 17 00:00:00 2001 From: Matt Nitzken Date: Mon, 2 Jun 2025 11:37:21 -0400 Subject: [PATCH 63/77] Add support for DataRobot as a provider in LiteLLM (#10385) * Add support for DataRobot as a router in LiteLLM * Updates to logic * Changes to make things work better * Capitalize bearer * Revert change * Undo and simplify things * Add basic testing * Add some extra handling * More tests * Lowercase * Fix * Comment * Add local test_completion for datarobot * Sync repo to main * Update get_complete_url to accept deployments * Migrate to OpenAILike * Mock datarobot in test * Migrate everything to OpenAI LIke * Apply fixes and changes from review * Update docs * Update env vars * Move tests --- litellm/__init__.py | 7 ++ litellm/constants.py | 1 + .../get_llm_provider_logic.py | 8 ++ litellm/llms/datarobot/chat/transformation.py | 80 +++++++++++++++++ litellm/main.py | 20 +++++ litellm/types/utils.py | 1 + litellm/utils.py | 13 +++ .../test_datarobot_chat_transformation.py | 69 +++++++++++++++ .../llms/datarobot/test_datarobot.py | 85 +++++++++++++++++++ 9 files changed, 284 insertions(+) create mode 100644 litellm/llms/datarobot/chat/transformation.py create mode 100644 tests/test_litellm/llms/datarobot/chat/test_datarobot_chat_transformation.py create mode 100644 tests/test_litellm/llms/datarobot/test_datarobot.py diff --git a/litellm/__init__.py b/litellm/__init__.py index b99750b5928..841711f6e67 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -190,6 +190,7 @@ maritalk_key: Optional[str] = None ai21_key: Optional[str] = None ollama_key: Optional[str] = None openrouter_key: Optional[str] = None +datarobot_key: Optional[str] = None predibase_key: Optional[str] = None huggingface_key: Optional[str] = None vertex_project: Optional[str] = None @@ -402,6 +403,7 @@ mistral_chat_models: List = [] text_completion_codestral_models: List = [] anthropic_models: List = [] openrouter_models: List = [] +datarobot_models: List = [] vertex_language_models: List = [] vertex_vision_models: List = [] vertex_chat_models: List = [] @@ -509,6 +511,8 @@ def add_known_models(): empower_models.append(key) elif value.get("litellm_provider") == "openrouter": openrouter_models.append(key) + elif value.get("litellm_provider") == "datarobot": + datarobot_models.append(key) elif value.get("litellm_provider") == "vertex_ai-text-models": vertex_text_models.append(key) elif value.get("litellm_provider") == "vertex_ai-code-text-models": @@ -659,6 +663,7 @@ model_list = ( + anthropic_models + replicate_models + openrouter_models + + datarobot_models + huggingface_models + vertex_chat_models + vertex_text_models @@ -719,6 +724,7 @@ models_by_provider: dict = { "together_ai": together_ai_models, "baseten": baseten_models, "openrouter": openrouter_models, + "datarobot": datarobot_models, "vertex_ai": vertex_chat_models + vertex_text_models + vertex_anthropic_models @@ -869,6 +875,7 @@ from .llms.huggingface.embedding.transformation import HuggingFaceEmbeddingConfi from .llms.oobabooga.chat.transformation import OobaboogaConfig from .llms.maritalk import MaritalkConfig from .llms.openrouter.chat.transformation import OpenrouterConfig +from .llms.datarobot.chat.transformation import DataRobotConfig from .llms.anthropic.chat.transformation import AnthropicConfig from .llms.anthropic.common_utils import AnthropicModelInfo from .llms.groq.stt.transformation import GroqSTTConfig diff --git a/litellm/constants.py b/litellm/constants.py index d36ad0f228a..b4f1b3fec90 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -180,6 +180,7 @@ LITELLM_CHAT_PROVIDERS = [ "replicate", "huggingface", "together_ai", + "datarobot", "openrouter", "vertex_ai", "vertex_ai_beta", diff --git a/litellm/litellm_core_utils/get_llm_provider_logic.py b/litellm/litellm_core_utils/get_llm_provider_logic.py index 79e7020eb2a..33e0b47d840 100644 --- a/litellm/litellm_core_utils/get_llm_provider_logic.py +++ b/litellm/litellm_core_utils/get_llm_provider_logic.py @@ -514,6 +514,14 @@ def _get_openai_compatible_provider_info( # noqa: PLR0915 ) = litellm.LlamafileChatConfig()._get_openai_compatible_provider_info( api_base, api_key ) + elif custom_llm_provider == "datarobot": + # DataRobot is OpenAI compatible. + ( + api_base, + dynamic_api_key + ) = litellm.DataRobotConfig()._get_openai_compatible_provider_info( + api_base, api_key + ) elif custom_llm_provider == "lm_studio": # lm_studio is openai compatible, we just need to set this to custom_openai ( diff --git a/litellm/llms/datarobot/chat/transformation.py b/litellm/llms/datarobot/chat/transformation.py new file mode 100644 index 00000000000..e334c94e517 --- /dev/null +++ b/litellm/llms/datarobot/chat/transformation.py @@ -0,0 +1,80 @@ +""" +Support for OpenAI's `/v1/chat/completions` endpoint. + +Calls done in OpenAI/openai.py as DataRobot is openai-compatible. +""" + +from typing import Optional, Tuple +from litellm.secret_managers.main import get_secret_str +from ...openai_like.chat.transformation import OpenAILikeChatConfig + + +class DataRobotConfig(OpenAILikeChatConfig): + @staticmethod + def _resolve_api_key(api_key: Optional[str] = None) -> str: + """Attempt to ensure that the API key is set, preferring the user-provided key + over the secret manager key (``DATAROBOT_API_TOKEN``). + + If both are None, a fake API key is returned for testing. + """ + return api_key or get_secret_str("DATAROBOT_API_TOKEN") or "fake-api-key" + + @staticmethod + def _resolve_api_base(api_base: Optional[str] = None) -> Optional[str]: + """Attempt to ensure that the API base is set, preferring the user-provided key + over the secret manager key (``DATAROBOT_ENDPOINT``). + + If both are None, a default Llamafile server URL is returned. + See: https://github.com/Mozilla-Ocho/llamafile/blob/bd1bbe9aabb1ee12dbdcafa8936db443c571eb9d/README.md#L61 + """ + api_base = api_base or get_secret_str("DATAROBOT_ENDPOINT") + + if api_base is None: + api_base = "https://app.datarobot.com" + + # If the api_base is a deployment URL, we do not append the chat completions path + if "api/v2/deployments" not in api_base: + # If the api_base is not a deployment URL, we need to append the chat completions path + if "api/v2/genai/llmgw/chat/completions" not in api_base: + api_base += "/api/v2/genai/llmgw/chat/completions" + + # Ensure the url ends with a trailing slash + if not api_base.endswith("/"): + api_base += "/" + + return api_base # type: ignore + + def _get_openai_compatible_provider_info( + self, + api_base: Optional[str], + api_key: Optional[str] + ) -> Tuple[Optional[str], Optional[str]]: + """Attempts to ensure that the API base and key are set, preferring user-provided values, + before falling back to secret manager values (``DATAROBOT_ENDPOINT`` and ``DATAROBOT_API_TOKEN`` + respectively). + + If an API key cannot be resolved via either method, a fake key is returned. + """ + api_base = DataRobotConfig._resolve_api_base(api_base) + dynamic_api_key = DataRobotConfig._resolve_api_key(api_key) + + return api_base, dynamic_api_key + + def get_complete_url( + self, + api_base: Optional[str], + api_key: Optional[str], + model: str, + optional_params: dict, + litellm_params: dict, + stream: Optional[bool] = None, + ) -> str: + """ + Get the complete URL for the API call. Datarobot's API base is set to + the complete value, so it does not need to be updated to additionally add + chat completions. + + Returns: + str: The complete URL for the API call. + """ + return str(api_base) # type: ignore diff --git a/litellm/main.py b/litellm/main.py index 64039f357b3..73bc88a1098 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -2335,6 +2335,26 @@ def completion( # type: ignore # noqa: PLR0915 original_response=response, additional_args={"headers": headers}, ) + + elif custom_llm_provider == "datarobot": + response = base_llm_http_handler.completion( + model=model, + messages=messages, + headers=headers, + model_response=model_response, + api_key=api_key, + api_base=api_base, + acompletion=acompletion, + logging_obj=logging, + optional_params=optional_params, + litellm_params=litellm_params, + timeout=timeout, # type: ignore + client=client, + custom_llm_provider=custom_llm_provider, + encoding=encoding, + stream=stream, + provider_config=provider_config, + ) elif custom_llm_provider == "openrouter": api_base = ( api_base diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 84b7a7997ee..e94dbc225c6 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -2207,6 +2207,7 @@ class LlmProviders(str, Enum): HUGGINGFACE = "huggingface" TOGETHER_AI = "together_ai" OPENROUTER = "openrouter" + DATAROBOT = "datarobot" VERTEX_AI = "vertex_ai" VERTEX_AI_BETA = "vertex_ai_beta" GEMINI = "gemini" diff --git a/litellm/utils.py b/litellm/utils.py index 4bb4cb5e83c..63a01f3ad59 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -4933,6 +4933,11 @@ def validate_environment( # noqa: PLR0915 keys_in_environment = True else: missing_keys.append("OPENROUTER_API_KEY") + elif custom_llm_provider == "datarobot": + if "DATAROBOT_API_TOKEN" in os.environ: + keys_in_environment = True + else: + missing_keys.append("DATAROBOT_API_TOKEN") elif custom_llm_provider == "vertex_ai": if "VERTEXAI_PROJECT" in os.environ and "VERTEXAI_LOCATION" in os.environ: keys_in_environment = True @@ -5135,6 +5140,12 @@ def validate_environment( # noqa: PLR0915 keys_in_environment = True else: missing_keys.append("OPENROUTER_API_KEY") + ## datarobot + elif model in litellm.datarobot_models: + if "DATAROBOT_API_TOKEN" in os.environ: + keys_in_environment = True + else: + missing_keys.append("DATAROBOT_API_TOKEN") ## vertex - text + chat models elif ( model in litellm.vertex_chat_models @@ -6474,6 +6485,8 @@ class ProviderConfigManager: return litellm.TogetherAIConfig() elif litellm.LlmProviders.OPENROUTER == provider: return litellm.OpenrouterConfig() + elif litellm.LlmProviders.DATAROBOT == provider: + return litellm.DataRobotConfig() elif litellm.LlmProviders.GEMINI == provider: return litellm.GoogleAIStudioGeminiConfig() elif ( diff --git a/tests/test_litellm/llms/datarobot/chat/test_datarobot_chat_transformation.py b/tests/test_litellm/llms/datarobot/chat/test_datarobot_chat_transformation.py new file mode 100644 index 00000000000..4999b078caa --- /dev/null +++ b/tests/test_litellm/llms/datarobot/chat/test_datarobot_chat_transformation.py @@ -0,0 +1,69 @@ +import os +from unittest.mock import patch + +import pytest + +from litellm.llms.datarobot.chat.transformation import DataRobotConfig + + +@patch.dict(os.environ, {}, clear=True) +class TestDataRobotConfig: + @pytest.fixture + def handler(self): + return DataRobotConfig() + + @pytest.mark.parametrize( + "api_base, expected_url", + [ + (None, "https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/"), + ("http://localhost:5001", "http://localhost:5001/api/v2/genai/llmgw/chat/completions/"), + ("https://app.datarobot.com", "https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/"), + ("https://app.datarobot.com/api/v2/genai/llmgw/chat/completions", "https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/"), + ("https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/", "https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/"), + ("https://staging.datarobot.com", "https://staging.datarobot.com/api/v2/genai/llmgw/chat/completions/"), + ("https://app.datarobot.com/api/v2/deployments/deployment_id", "https://app.datarobot.com/api/v2/deployments/deployment_id/"), + ("https://app.datarobot.com/api/v2/deployments/deployment_id/", "https://app.datarobot.com/api/v2/deployments/deployment_id/"), + ] + ) + def test_resolve_api_base(self, api_base, expected_url, handler): + """Test that URLs properly resolve to the expected format.""" + assert handler._resolve_api_base(api_base) == expected_url + + # Check that the complete url with the resolution is expected + assert handler.get_complete_url( + api_base=handler._resolve_api_base(api_base), + api_key="PASSTHROUGH_KEY", + model="datarobot/vertex_ai/gemini-1.5-flash-002", + optional_params={}, + litellm_params={}, + ) == expected_url + + # Check that the complete url with the original api_base does not change the url + if api_base is not None: + assert handler.get_complete_url( + api_base=api_base, + api_key="PASSTHROUGH_KEY", + model="datarobot/vertex_ai/gemini-1.5-flash-002", + optional_params={}, + litellm_params={}, + ) == api_base + + def test_resolve_api_base_with_environment_variable(self, handler): + os.environ["DATAROBOT_ENDPOINT"] = "https://env.datarobot.com" + assert handler._resolve_api_base(None) == "https://env.datarobot.com/api/v2/genai/llmgw/chat/completions/" + del os.environ["DATAROBOT_ENDPOINT"] + + @pytest.mark.parametrize( + "api_key, expected_api_key", + [ + (None, "fake-api-key"), + ("PASSTHROUGH_KEY", "PASSTHROUGH_KEY"), + ] + ) + def test_resolve_api_key(self, api_key, expected_api_key, handler): + assert handler._resolve_api_key(api_key) == expected_api_key + + def test_resolve_api_key_with_environment_variable(self, handler): + os.environ["DATAROBOT_API_TOKEN"] = "env_key" + assert handler._resolve_api_key(None) == "env_key" + del os.environ["DATAROBOT_API_TOKEN"] diff --git a/tests/test_litellm/llms/datarobot/test_datarobot.py b/tests/test_litellm/llms/datarobot/test_datarobot.py new file mode 100644 index 00000000000..88bd047f9c7 --- /dev/null +++ b/tests/test_litellm/llms/datarobot/test_datarobot.py @@ -0,0 +1,85 @@ +import json +import os + +from unittest.mock import patch + +import pytest + +from litellm import completion +from litellm.llms.custom_httpx.http_handler import HTTPHandler + + +@patch.dict(os.environ, {}, clear=True) +def test_completion_datarobot(): + """Ensure that the completion function works with DataRobot API.""" + messages = [{"role": "user", "content": "What's the weather like in San Francisco?"}] + try: + client = HTTPHandler() + with patch.object(client, "post") as mock_post: + response = completion( + model="datarobot/vertex_ai/gemini-1.5-flash-002", + messages=messages, + client=client, + max_tokens=5, + clientId="custom-model", + ) + print(response) + + # Add any assertions here to check the response + mock_post.assert_called_once() + mocks_kwargs = mock_post.call_args.kwargs + assert mocks_kwargs["url"] == "https://app.datarobot.com/api/v2/genai/llmgw/chat/completions/" + assert mocks_kwargs["headers"]["Authorization"] == "Bearer fake-api-key" + json_data = json.loads(mock_post.call_args.kwargs["data"]) + assert json_data["clientId"] == "custom-model" + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +@patch.dict( + os.environ, {"DATAROBOT_ENDPOINT": "https://app.datarobot.com/api/v2/deployments/deployment_id/"}, clear=True +) +def test_completion_datarobot_with_deployment(): + """Ensure that deployment URL is used correctly.""" + messages = [{"role": "user", "content": "What's the weather like in San Francisco?"}] + try: + client = HTTPHandler() + with patch.object(client, "post") as mock_post: + response = completion( + model="datarobot/vertex_ai/gemini-1.5-flash-002", + messages=messages, + client=client, + max_tokens=5, + clientId="custom-model", + ) + print(response) + + # Add any assertions here to check the response + mock_post.assert_called_once() + mocks_kwargs = mock_post.call_args.kwargs + assert mocks_kwargs["url"] == "https://app.datarobot.com/api/v2/deployments/deployment_id/" + assert mocks_kwargs["headers"]["Authorization"] == "Bearer fake-api-key" + json_data = json.loads(mock_post.call_args.kwargs["data"]) + assert json_data["clientId"] == "custom-model" + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +def test_completion_datarobot_with_environment_variables(): + """Allow the test to run with environment variables if they are set for integrations.""" + # If keys are not set, the test will be skipped + if os.environ.get("DATAROBOT_API_TOKEN") is None: + return + + messages = [{"role": "user", "content": "What's the weather like in San Francisco?"}] + try: + response = completion( + model="datarobot/vertex_ai/gemini-1.5-flash-002", messages=messages, max_tokens=5, clientId="custom-model" + ) + print(response) + assert response["object"] == "chat.completion" + assert response["model"] == "gemini-1.5-flash-002" + assert len(response["choices"]) == 1 + assert len(response["choices"][0]["message"]["content"]) > 0 + except Exception as e: + pytest.fail(f"Error occurred: {e}") From 63d7f99e27e5b6ed2e4ecf2442dc68fec4699bb5 Mon Sep 17 00:00:00 2001 From: Tyler Wagner Date: Mon, 2 Jun 2025 18:04:55 +0200 Subject: [PATCH 64/77] fix: remove dupe server_id MCP config servers (#11327) --- litellm/proxy/_experimental/mcp_server/mcp_server_manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index c52e3ab29d8..c29d8814819 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -72,8 +72,9 @@ class MCPServerManager: mcp_info = MCPInfo(**_mcp_info) mcp_info["server_name"] = server_name mcp_info["description"] = server_config.get("description", None) + server_id = str(uuid.uuid4()) new_server = MCPServer( - server_id=str(uuid.uuid4()), + server_id=server_id, name=server_name, url=server_config["url"], # TODO: utility fn the default values @@ -82,7 +83,6 @@ class MCPServerManager: auth_type=server_config.get("auth_type", None), mcp_info=mcp_info, ) - server_id = str(uuid.uuid4()) self.config_mcp_servers[server_id] = new_server verbose_logger.debug( f"Loaded MCP Servers: {json.dumps(self.config_mcp_servers, indent=4, default=str)}" From 94650c10fe7a4c7ddfa5150d34faeae7f8688955 Mon Sep 17 00:00:00 2001 From: Cole McIntosh <82463175+colesmcintosh@users.noreply.github.com> Date: Mon, 2 Jun 2025 12:25:29 -0600 Subject: [PATCH 65/77] feat: Add support for Cohere Embed v4.0 model (#11329) - Updated model_prices_and_context_window.json to include embed-v4.0 with relevant pricing and metadata. - Added embed-v4.0 to cohere_embedding_models in constants.py. - Implemented comprehensive tests for Cohere Embed v4.0 in test_cohere.py, covering basic functionality, input types, error handling, and optional parameters. --- litellm/constants.py | 1 + model_prices_and_context_window.json | 14 ++ tests/llm_translation/test_cohere.py | 221 ++++++++++++++++++++++++++- 3 files changed, 235 insertions(+), 1 deletion(-) diff --git a/litellm/constants.py b/litellm/constants.py index b4f1b3fec90..990b9b053af 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -588,6 +588,7 @@ BEDROCK_INVOKE_PROVIDERS_LITERAL = Literal[ open_ai_embedding_models: List = ["text-embedding-ada-002"] cohere_embedding_models: List = [ + "embed-v4.0", "embed-english-v3.0", "embed-english-light-v3.0", "embed-multilingual-v3.0", diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 4432be88b60..4e620285bda 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -8750,6 +8750,20 @@ "notes": "'supports_image_input' is a deprecated field. Use 'supports_embedding_image_input' instead." } }, + "embed-v4.0": { + "max_tokens": 1024, + "max_input_tokens": 1024, + "input_cost_per_token": 1.2e-07, + "input_cost_per_image": 4.7e-07, + "output_cost_per_token": 0.0, + "litellm_provider": "cohere", + "mode": "embedding", + "supports_image_input": true, + "supports_embedding_image_input": true, + "metadata": { + "notes": "'supports_image_input' is a deprecated field. Use 'supports_embedding_image_input' instead." + } + }, "replicate/meta/llama-2-13b": { "max_tokens": 4096, "max_input_tokens": 4096, diff --git a/tests/llm_translation/test_cohere.py b/tests/llm_translation/test_cohere.py index af526adaf4d..41dc491d35d 100644 --- a/tests/llm_translation/test_cohere.py +++ b/tests/llm_translation/test_cohere.py @@ -288,4 +288,223 @@ def test_cohere_embedding_outout_dimensions(): litellm._turn_on_debug() response = embedding(model="cohere/embed-v4.0", input="Hello, world!", dimensions=512) print(f"response: {response}\n") - assert len(response.data[0]["embedding"]) == 512 \ No newline at end of file + assert len(response.data[0]["embedding"]) == 512 + + +# Comprehensive Cohere Embed v4 tests +@pytest.mark.parametrize("sync_mode", [True, False]) +@pytest.mark.asyncio +async def test_cohere_embed_v4_basic_text(sync_mode): + """Test basic text embedding functionality with Cohere Embed v4.""" + try: + data = { + "model": "cohere/embed-v4.0", + "input": ["Hello world!", "This is a test sentence."], + "input_type": "search_document" + } + + if sync_mode: + response = embedding(**data) + else: + response = await litellm.aembedding(**data) + + # Validate response structure + assert response.model is not None + assert len(response.data) == 2 + assert response.data[0]['object'] == 'embedding' + assert len(response.data[0]['embedding']) > 0 + assert response.usage.prompt_tokens > 0 + assert isinstance(response.usage, litellm.Usage) + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +@pytest.mark.parametrize("sync_mode", [True, False]) +@pytest.mark.asyncio +async def test_cohere_embed_v4_with_dimensions(sync_mode): + """Test Cohere Embed v4 with specific dimension parameter.""" + try: + data = { + "model": "cohere/embed-v4.0", + "input": ["Test with custom dimensions"], + "dimensions": 512, + "input_type": "search_query" + } + + if sync_mode: + response = embedding(**data) + else: + response = await litellm.aembedding(**data) + + # Validate dimension + assert len(response.data[0]['embedding']) == 512 + assert isinstance(response.usage, litellm.Usage) + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +@pytest.mark.parametrize("sync_mode", [True, False]) +@pytest.mark.asyncio +async def test_cohere_embed_v4_image_embedding(sync_mode): + """Test Cohere Embed v4 image embedding functionality (multimodal).""" + try: + import base64 + + # 1x1 pixel red PNG (base64 encoded) + test_image_data = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde\x00\x00\x00\tpHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x0cIDATx\x9cc\xf8\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00' + test_image_b64 = base64.b64encode(test_image_data).decode('utf-8') + + data = { + "model": "cohere/embed-v4.0", + "input": [test_image_b64], + "input_type": "image" + } + + if sync_mode: + response = embedding(**data) + else: + response = await litellm.aembedding(**data) + + # Validate response structure for image embedding + assert response.model is not None + assert len(response.data) == 1 + assert response.data[0]['object'] == 'embedding' + assert len(response.data[0]['embedding']) > 0 + assert isinstance(response.usage, litellm.Usage) + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +@pytest.mark.parametrize("input_type", ["search_document", "search_query", "classification", "clustering"]) +@pytest.mark.asyncio +async def test_cohere_embed_v4_input_types(input_type): + """Test Cohere Embed v4 with different input types.""" + try: + response = await litellm.aembedding( + model="cohere/embed-v4.0", + input=[f"Test text for {input_type}"], + input_type=input_type + ) + + assert response.model is not None + assert len(response.data) == 1 + assert response.data[0]['object'] == 'embedding' + assert len(response.data[0]['embedding']) > 0 + assert isinstance(response.usage, litellm.Usage) + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +def test_cohere_embed_v4_encoding_format(): + """Test Cohere Embed v4 with different encoding formats.""" + try: + response = embedding( + model="cohere/embed-v4.0", + input=["Test encoding format"], + encoding_format="float" + ) + + assert response.model is not None + assert len(response.data) == 1 + assert response.data[0]['object'] == 'embedding' + assert len(response.data[0]['embedding']) > 0 + # Validate that embeddings are floats + assert all(isinstance(x, float) for x in response.data[0]['embedding']) + assert isinstance(response.usage, litellm.Usage) + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +def test_cohere_embed_v4_error_handling(): + """Test error handling for Cohere Embed v4 with invalid inputs.""" + try: + # Test with empty input - should raise an error + try: + response = embedding( + model="cohere/embed-v4.0", + input=[] # Empty input + ) + pytest.fail("Should have failed with empty input") + except Exception: + pass # Expected to fail + + # Test with None input - should raise an error + try: + response = embedding( + model="cohere/embed-v4.0", + input=None + ) + pytest.fail("Should have failed with None input") + except Exception: + pass # Expected to fail + + except Exception as e: + pytest.fail(f"Error in error handling test: {e}") + + +@pytest.mark.parametrize("sync_mode", [True, False]) +@pytest.mark.asyncio +async def test_cohere_embed_v4_multiple_texts(sync_mode): + """Test Cohere Embed v4 with multiple text inputs.""" + try: + texts = [ + "The quick brown fox jumps over the lazy dog", + "Machine learning is transforming the world", + "Python is a versatile programming language", + "Natural language processing enables human-computer interaction" + ] + + data = { + "model": "cohere/embed-v4.0", + "input": texts, + "input_type": "search_document" + } + + if sync_mode: + response = embedding(**data) + else: + response = await litellm.aembedding(**data) + + # Validate response structure + assert response.model is not None + assert len(response.data) == len(texts) + + for i, data_item in enumerate(response.data): + assert data_item['object'] == 'embedding' + assert data_item['index'] == i + assert len(data_item['embedding']) > 0 + assert all(isinstance(x, float) for x in data_item['embedding']) + + assert isinstance(response.usage, litellm.Usage) + assert response.usage.prompt_tokens > 0 + + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +def test_cohere_embed_v4_with_optional_params(): + """Test Cohere Embed v4 with various optional parameters.""" + try: + response = embedding( + model="cohere/embed-v4.0", + input=["Test with optional parameters"], + input_type="search_query", + dimensions=256, + encoding_format="float" + ) + + # Validate response + assert response.model is not None + assert len(response.data) == 1 + assert response.data[0]['object'] == 'embedding' + assert len(response.data[0]['embedding']) == 256 # Custom dimensions + assert all(isinstance(x, float) for x in response.data[0]['embedding']) + assert isinstance(response.usage, litellm.Usage) + + except Exception as e: + pytest.fail(f"Error occurred: {e}") \ No newline at end of file From 702e399d944b89afa893358cbde092082b6a2706 Mon Sep 17 00:00:00 2001 From: Cole McIntosh <82463175+colesmcintosh@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:13:17 -0600 Subject: [PATCH 66/77] Add presidio_language yaml configuration support for guardrails (#11331) * feat: Add presidio_language parameter for PII analysis configuration via yaml config files - Introduced presidio_language parameter in guardrail_initializers and guardrail_hooks to allow language specification for Presidio PII analysis via yaml config files - Updated PresidioPresidioConfigModelUserInterface to include presidio_language with a default value of "en". - Added tests to verify language configuration functionality, ensuring correct language usage in analyze requests. * docs: Enhance PII masking documentation with language support details - Added information on configuring the default language for PII analysis using the `presidio_language` parameter in both the UI and YAML configuration. - Included supported language codes (English, Spanish, German) and their precedence in language settings. - Provided examples for default language configuration and per-request language overrides to clarify usage. --- .../docs/proxy/guardrails/pii_masking_v2.md | 94 ++++++++++++++++ .../guardrails/guardrail_hooks/presidio.py | 4 +- .../guardrails/guardrail_initializers.py | 2 + litellm/types/guardrails.py | 4 + tests/guardrails_tests/test_presidio_pii.py | 102 ++++++++++++++++++ 5 files changed, 205 insertions(+), 1 deletion(-) diff --git a/docs/my-website/docs/proxy/guardrails/pii_masking_v2.md b/docs/my-website/docs/proxy/guardrails/pii_masking_v2.md index c93eb52a2a7..74d26e7e178 100644 --- a/docs/my-website/docs/proxy/guardrails/pii_masking_v2.md +++ b/docs/my-website/docs/proxy/guardrails/pii_masking_v2.md @@ -13,6 +13,7 @@ import TabItem from '@theme/TabItem'; | Supported Entity Types | All Presidio Entity Types | | Supported Actions | `MASK`, `BLOCK` | | Supported Modes | `pre_call`, `during_call`, `post_call`, `logging_only` | +| Language Support | Configurable via `presidio_language` parameter (supports multiple languages including English, Spanish, German, etc.) | ## Deployment options @@ -48,6 +49,18 @@ Now select the entity types you want to mask. See the [supported actions here](# style={{width: '50%', display: 'block', margin: '0'}} /> +#### 1.3 Set Default Language (Optional) + +You can also configure a default language for PII analysis using the `presidio_language` field in the UI. This sets the default language that will be used for all requests unless overridden by a per-request language setting. + +**Supported language codes include:** +- `en` - English (default) +- `es` - Spanish +- `de` - German + + +If not specified, English (`en`) will be used as the default language. + @@ -67,6 +80,7 @@ guardrails: litellm_params: guardrail: presidio # supported values: "aporia", "bedrock", "lakera", "presidio" mode: "pre_call" + presidio_language: "en" # optional: set default language for PII analysis ``` Set the following env vars @@ -380,6 +394,86 @@ print(response) +### Set default `language` in config.yaml + +You can configure a default language for PII analysis in your YAML configuration using the `presidio_language` parameter. This language will be used for all requests unless overridden by a per-request language setting. + +```yaml title="Default Language Configuration" showLineNumbers +model_list: + - model_name: gpt-3.5-turbo + litellm_params: + model: openai/gpt-3.5-turbo + api_key: os.environ/OPENAI_API_KEY + +guardrails: + - guardrail_name: "presidio-german" + litellm_params: + guardrail: presidio + mode: "pre_call" + presidio_language: "de" # Default to German for PII analysis + pii_entities_config: + CREDIT_CARD: "MASK" + EMAIL_ADDRESS: "MASK" + PERSON: "MASK" + + - guardrail_name: "presidio-spanish" + litellm_params: + guardrail: presidio + mode: "pre_call" + presidio_language: "es" # Default to Spanish for PII analysis + pii_entities_config: + CREDIT_CARD: "MASK" + PHONE_NUMBER: "MASK" +``` + +#### Supported Language Codes + +Presidio supports multiple languages for PII detection. Common language codes include: + +- `en` - English (default) +- `es` - Spanish +- `de` - German + +For a complete list of supported languages, refer to the [Presidio documentation](https://microsoft.github.io/presidio/analyzer/languages/). + +#### Language Precedence + +The language setting follows this precedence order: + +1. **Per-request language** (via `guardrail_config.language`) - highest priority +2. **YAML config language** (via `presidio_language`) - medium priority +3. **Default language** (`en`) - lowest priority + +**Example with mixed languages:** + +```yaml title="Mixed Language Configuration" showLineNumbers +guardrails: + - guardrail_name: "presidio-multilingual" + litellm_params: + guardrail: presidio + mode: "pre_call" + presidio_language: "de" # Default to German + pii_entities_config: + CREDIT_CARD: "MASK" + PERSON: "MASK" +``` + +```shell title="Override with per-request language" showLineNumbers +curl http://localhost:4000/chat/completions \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer sk-1234" \ + -d '{ + "model": "gpt-3.5-turbo", + "messages": [ + {"role": "user", "content": "Mi tarjeta de crédito es 4111-1111-1111-1111"} + ], + "guardrails": ["presidio-multilingual"], + "guardrail_config": {"language": "es"} + }' +``` + +In this example, the request will use Spanish (`es`) for PII detection even though the guardrail is configured with German (`de`) as the default language. + ### Output parsing diff --git a/litellm/proxy/guardrails/guardrail_hooks/presidio.py b/litellm/proxy/guardrails/guardrail_hooks/presidio.py index 3c5ca3d9c23..c7ac00ee812 100644 --- a/litellm/proxy/guardrails/guardrail_hooks/presidio.py +++ b/litellm/proxy/guardrails/guardrail_hooks/presidio.py @@ -69,6 +69,7 @@ class _OPTIONAL_PresidioPIIMasking(CustomGuardrail): presidio_ad_hoc_recognizers: Optional[str] = None, logging_only: Optional[bool] = None, pii_entities_config: Optional[Dict[PiiEntityType, PiiAction]] = None, + presidio_language: Optional[str] = None, **kwargs, ): if logging_only is True: @@ -83,6 +84,7 @@ class _OPTIONAL_PresidioPIIMasking(CustomGuardrail): self.pii_entities_config: Dict[PiiEntityType, PiiAction] = ( pii_entities_config or {} ) + self.presidio_language = presidio_language or "en" if mock_testing is True: # for testing purposes only return @@ -161,7 +163,7 @@ class _OPTIONAL_PresidioPIIMasking(CustomGuardrail): """ analyze_payload: PresidioAnalyzeRequest = PresidioAnalyzeRequest( text=text, - language="en", + language=self.presidio_language, ) ################################################################## ###### Check if user has configured any params for this guardrail diff --git a/litellm/proxy/guardrails/guardrail_initializers.py b/litellm/proxy/guardrails/guardrail_initializers.py index 9cd952e6849..03673350d0f 100644 --- a/litellm/proxy/guardrails/guardrail_initializers.py +++ b/litellm/proxy/guardrails/guardrail_initializers.py @@ -113,6 +113,7 @@ def initialize_presidio(litellm_params: LitellmParams, guardrail: Guardrail): pii_entities_config=litellm_params.pii_entities_config, presidio_analyzer_api_base=litellm_params.presidio_analyzer_api_base, presidio_anonymizer_api_base=litellm_params.presidio_anonymizer_api_base, + presidio_language=litellm_params.presidio_language, ) litellm.logging_callback_manager.add_litellm_callback(_presidio_callback) @@ -125,6 +126,7 @@ def initialize_presidio(litellm_params: LitellmParams, guardrail: Guardrail): default_on=litellm_params.default_on, presidio_analyzer_api_base=litellm_params.presidio_analyzer_api_base, presidio_anonymizer_api_base=litellm_params.presidio_anonymizer_api_base, + presidio_language=litellm_params.presidio_language, ) litellm.logging_callback_manager.add_litellm_callback(_success_callback) diff --git a/litellm/types/guardrails.py b/litellm/types/guardrails.py index 7b24f6340df..baabfa0a178 100644 --- a/litellm/types/guardrails.py +++ b/litellm/types/guardrails.py @@ -234,6 +234,10 @@ class PresidioPresidioConfigModelUserInterface(BaseModel): # extra param to let the ui know this is a boolean json_schema_extra={"ui_type": GuardrailParamUITypes.BOOL}, ) + presidio_language: Optional[str] = Field( + default="en", + description="Language code for Presidio PII analysis (e.g., 'en', 'de', 'es', 'fr')", + ) class PresidioConfigModel(PresidioPresidioConfigModelUserInterface): diff --git a/tests/guardrails_tests/test_presidio_pii.py b/tests/guardrails_tests/test_presidio_pii.py index 25e027c0c2f..e3f811ba7df 100644 --- a/tests/guardrails_tests/test_presidio_pii.py +++ b/tests/guardrails_tests/test_presidio_pii.py @@ -490,3 +490,105 @@ async def test_presidio_pii_masking_logging_output_only_logged_response_guardrai assert pii_masking_obj.should_run_guardrail( data={}, event_type=GuardrailEventHooks.logging_only ) + + +@pytest.mark.asyncio +async def test_presidio_language_configuration(): + """Test that presidio_language parameter is properly set and used in analyze requests""" + litellm._turn_on_debug() + + # Test with German language using mock testing to avoid API calls + presidio_guardrail_de = _OPTIONAL_PresidioPIIMasking( + pii_entities_config={}, + presidio_language="de", + mock_testing=True # This bypasses the API validation + ) + + test_text = "Meine Telefonnummer ist +49 30 12345678" + + # Test the analyze request configuration + analyze_request = presidio_guardrail_de._get_presidio_analyze_request_payload( + text=test_text, + presidio_config=None, + request_data={} + ) + + # Verify the language is set to German + assert analyze_request["language"] == "de" + assert analyze_request["text"] == test_text + + # Test with Spanish language + presidio_guardrail_es = _OPTIONAL_PresidioPIIMasking( + pii_entities_config={}, + presidio_language="es", + mock_testing=True + ) + + test_text_es = "Mi número de teléfono es +34 912 345 678" + + analyze_request_es = presidio_guardrail_es._get_presidio_analyze_request_payload( + text=test_text_es, + presidio_config=None, + request_data={} + ) + + # Verify the language is set to Spanish + assert analyze_request_es["language"] == "es" + assert analyze_request_es["text"] == test_text_es + + # Test default language (English) when not specified + presidio_guardrail_default = _OPTIONAL_PresidioPIIMasking( + pii_entities_config={}, + mock_testing=True + ) + + test_text_en = "My phone number is +1 555-123-4567" + + analyze_request_default = presidio_guardrail_default._get_presidio_analyze_request_payload( + text=test_text_en, + presidio_config=None, + request_data={} + ) + + # Verify the language defaults to English + assert analyze_request_default["language"] == "en" + assert analyze_request_default["text"] == test_text_en + + +@pytest.mark.asyncio +async def test_presidio_language_configuration_with_per_request_override(): + """Test that per-request language configuration overrides the default configured language""" + litellm._turn_on_debug() + + # Set up guardrail with German as default language + presidio_guardrail = _OPTIONAL_PresidioPIIMasking( + pii_entities_config={}, + presidio_language="de", + mock_testing=True + ) + + test_text = "Test text with PII" + + # Test with per-request config overriding the default language + presidio_config = PresidioPerRequestConfig(language="fr") + + analyze_request = presidio_guardrail._get_presidio_analyze_request_payload( + text=test_text, + presidio_config=presidio_config, + request_data={} + ) + + # Verify the per-request language (French) overrides the default (German) + assert analyze_request["language"] == "fr" + assert analyze_request["text"] == test_text + + # Test without per-request config - should use default language + analyze_request_default = presidio_guardrail._get_presidio_analyze_request_payload( + text=test_text, + presidio_config=None, + request_data={} + ) + + # Verify the default language (German) is used + assert analyze_request_default["language"] == "de" + assert analyze_request_default["text"] == test_text From f247f1031b874bc3133f5bd200f4dcc0a5befa18 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Mon, 2 Jun 2025 13:53:26 -0700 Subject: [PATCH 67/77] [Fix] Fix SCIM running patch operation case sensitivity (#11335) * fix: fix SCIM patch op * test: test SCIM patch op --- .../proxy/management_endpoints/scim_v2.py | 14 ++++- .../scim/test_scim_transformations.py | 62 ++++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/litellm/types/proxy/management_endpoints/scim_v2.py b/litellm/types/proxy/management_endpoints/scim_v2.py index 0c2f16e0252..fa78b8b6505 100644 --- a/litellm/types/proxy/management_endpoints/scim_v2.py +++ b/litellm/types/proxy/management_endpoints/scim_v2.py @@ -1,7 +1,7 @@ from typing import Any, Dict, List, Literal, Optional, Union from fastapi import HTTPException -from pydantic import BaseModel, EmailStr +from pydantic import BaseModel, EmailStr, field_validator class LiteLLM_UserScimMetadata(BaseModel): @@ -72,10 +72,20 @@ class SCIMListResponse(BaseModel): # SCIM PATCH Operation Models class SCIMPatchOperation(BaseModel): - op: Literal["add", "remove", "replace"] + op: str path: Optional[str] = None value: Optional[Any] = None + @field_validator("op", mode="before") + @classmethod + def normalize_op(cls, v): + if isinstance(v, str): + v_lower = v.lower() + if v_lower not in {"add", "remove", "replace"}: + raise ValueError("op must be add, remove, or replace") + return v_lower + return v + class SCIMPatchOp(BaseModel): schemas: List[str] = ["urn:ietf:params:scim:api:messages:2.0:PatchOp"] diff --git a/tests/test_litellm/proxy/management_endpoints/scim/test_scim_transformations.py b/tests/test_litellm/proxy/management_endpoints/scim/test_scim_transformations.py index 9432fab68fe..f2b374657e6 100644 --- a/tests/test_litellm/proxy/management_endpoints/scim/test_scim_transformations.py +++ b/tests/test_litellm/proxy/management_endpoints/scim/test_scim_transformations.py @@ -18,7 +18,12 @@ from litellm.proxy._types import LiteLLM_TeamTable, LiteLLM_UserTable, Member from litellm.proxy.management_endpoints.scim.scim_transformations import ( ScimTransformations, ) -from litellm.types.proxy.management_endpoints.scim_v2 import SCIMGroup, SCIMUser +from litellm.types.proxy.management_endpoints.scim_v2 import ( + SCIMGroup, + SCIMPatchOp, + SCIMPatchOperation, + SCIMUser, +) # Mock data @@ -223,3 +228,58 @@ class TestScimTransformations: member_without_email = Member(user_id="user-456", user_email=None, role="user") result = ScimTransformations._get_scim_member_value(member_without_email) assert result == ScimTransformations.DEFAULT_SCIM_MEMBER_VALUE + + +class TestSCIMPatchOperations: + """Test SCIM PATCH operation validation and case-insensitive handling""" + + def test_scim_patch_operation_lowercase(self): + """Test that lowercase operations are accepted""" + op = SCIMPatchOperation(op="add", path="members", value=[{"value": "user123"}]) + assert op.op == "add" + + op = SCIMPatchOperation(op="remove", path='members[value eq "user123"]') + assert op.op == "remove" + + op = SCIMPatchOperation(op="replace", path="displayName", value="New Name") + assert op.op == "replace" + + def test_scim_patch_operation_uppercase(self): + """Test that uppercase operations are normalized to lowercase""" + op = SCIMPatchOperation(op="ADD", path="members", value=[{"value": "user123"}]) + assert op.op == "add" + + op = SCIMPatchOperation(op="REMOVE", path='members[value eq "user123"]') + assert op.op == "remove" + + op = SCIMPatchOperation(op="REPLACE", path="displayName", value="New Name") + assert op.op == "replace" + + def test_scim_patch_operation_mixed_case(self): + """Test that mixed case operations are normalized to lowercase""" + op = SCIMPatchOperation(op="Add", path="members", value=[{"value": "user123"}]) + assert op.op == "add" + + op = SCIMPatchOperation(op="Remove", path='members[value eq "user123"]') + assert op.op == "remove" + + op = SCIMPatchOperation(op="Replace", path="displayName", value="New Name") + assert op.op == "replace" + + def test_scim_patch_operation_with_optional_fields(self): + """Test SCIMPatchOperation with and without optional fields""" + # Operation with all fields + op_full = SCIMPatchOperation( + op="Add", + path="members", + value=[{"value": "user123", "display": "User 123"}], + ) + assert op_full.op == "add" + assert op_full.path == "members" + assert op_full.value == [{"value": "user123", "display": "User 123"}] + + # Operation with minimal fields (only op is required) + op_minimal = SCIMPatchOperation(op="Remove") + assert op_minimal.op == "remove" + assert op_minimal.path is None + assert op_minimal.value is None From 75dbb86d345964d287738bcf3cd13f66800915b0 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Mon, 2 Jun 2025 13:58:01 -0700 Subject: [PATCH 68/77] fix: use handle exception on proxy --- .../management_endpoints/scim/scim_v2.py | 85 +++++-------------- 1 file changed, 20 insertions(+), 65 deletions(-) diff --git a/litellm/proxy/management_endpoints/scim/scim_v2.py b/litellm/proxy/management_endpoints/scim/scim_v2.py index 62f4ab89c06..a80622cc3aa 100644 --- a/litellm/proxy/management_endpoints/scim/scim_v2.py +++ b/litellm/proxy/management_endpoints/scim/scim_v2.py @@ -32,6 +32,7 @@ from litellm.proxy.management_endpoints.scim.scim_transformations import ( ScimTransformations, ) from litellm.proxy.management_endpoints.team_endpoints import new_team +from litellm.proxy.utils import handle_exception_on_proxy from litellm.types.proxy.management_endpoints.scim_v2 import * scim_router = APIRouter( @@ -81,13 +82,13 @@ async def get_users( where_conditions["user_email"] = email # Get users from database - users: List[LiteLLM_UserTable] = ( - await prisma_client.db.litellm_usertable.find_many( - where=where_conditions, - skip=(startIndex - 1), - take=count, - order={"created_at": "desc"}, - ) + users: List[ + LiteLLM_UserTable + ] = await prisma_client.db.litellm_usertable.find_many( + where=where_conditions, + skip=(startIndex - 1), + take=count, + order={"created_at": "desc"}, ) # Get total count for pagination @@ -111,9 +112,7 @@ async def get_users( ) except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error retrieving users: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.get( @@ -147,12 +146,8 @@ async def get_user( scim_user = await ScimTransformations.transform_litellm_user_to_scim_user(user) return scim_user - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error retrieving user: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.post( @@ -213,13 +208,8 @@ async def create_user( user=created_user ) return scim_user - - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error creating user: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.put( @@ -241,12 +231,8 @@ async def update_user( raise HTTPException(status_code=500, detail={"error": "No database connected"}) try: return None - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error updating user: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.delete( @@ -299,13 +285,8 @@ async def delete_user( await prisma_client.db.litellm_usertable.delete(where={"user_id": user_id}) return Response(status_code=204) - - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error deleting user: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.patch( @@ -341,12 +322,8 @@ async def patch_user( return None - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error patching user: {str(e)}"} - ) + raise handle_exception_on_proxy(e) # Group Endpoints @@ -431,9 +408,7 @@ async def get_groups( ) except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error retrieving groups: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.get( @@ -469,12 +444,8 @@ async def get_group( ) return scim_group - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error retrieving group: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.post( @@ -535,12 +506,8 @@ async def create_group( created_team ) return scim_group - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error creating group: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.put( @@ -655,12 +622,8 @@ async def update_group( }, ) - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error updating group: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.delete( @@ -709,12 +672,8 @@ async def delete_group( return Response(status_code=204) - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error deleting group: {str(e)}"} - ) + raise handle_exception_on_proxy(e) @scim_router.patch( @@ -749,9 +708,5 @@ async def patch_group( detail={"error": f"Group not found with ID: {group_id}"}, ) return None - except HTTPException: - raise except Exception as e: - raise HTTPException( - status_code=500, detail={"error": f"Error patching group: {str(e)}"} - ) + raise handle_exception_on_proxy(e) From ba89d4f00f392e275e4ca391e2dd5bef8d14b6f3 Mon Sep 17 00:00:00 2001 From: Cole McIntosh <82463175+colesmcintosh@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:25:51 -0600 Subject: [PATCH 69/77] refactor: update model handling in Azure and OpenAI audio transcription classes (#11333) - Changed hardcoded model "whisper-1" to dynamic model extraction in AzureAudioTranscription and OpenAIAudioTranscription classes. - Added tests to ensure correct model mapping for various transcription models, including GPT-4o and Azure whisper-1. --- litellm/llms/azure/audio_transcriptions.py | 4 +- litellm/llms/openai/transcriptions/handler.py | 6 +- tests/local_testing/test_whisper.py | 69 +++++++++++++++++++ 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/litellm/llms/azure/audio_transcriptions.py b/litellm/llms/azure/audio_transcriptions.py index be7d0fa30da..1f09ac7574a 100644 --- a/litellm/llms/azure/audio_transcriptions.py +++ b/litellm/llms/azure/audio_transcriptions.py @@ -94,7 +94,7 @@ class AzureAudioTranscription(AzureChatCompletion): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - hidden_params = {"model": "whisper-1", "custom_llm_provider": "azure"} + hidden_params = {"model": model, "custom_llm_provider": "azure"} final_response: TranscriptionResponse = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore return final_response @@ -174,7 +174,7 @@ class AzureAudioTranscription(AzureChatCompletion): }, original_response=stringified_response, ) - hidden_params = {"model": "whisper-1", "custom_llm_provider": "azure"} + hidden_params = {"model": model, "custom_llm_provider": "azure"} response = convert_to_model_response_object( _response_headers=headers, response_object=stringified_response, diff --git a/litellm/llms/openai/transcriptions/handler.py b/litellm/llms/openai/transcriptions/handler.py index 78a913cbf38..c2747222fc0 100644 --- a/litellm/llms/openai/transcriptions/handler.py +++ b/litellm/llms/openai/transcriptions/handler.py @@ -155,7 +155,7 @@ class OpenAIAudioTranscription(OpenAIChatCompletion): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - hidden_params = {"model": "whisper-1", "custom_llm_provider": "openai"} + hidden_params = {"model": model, "custom_llm_provider": "openai"} final_response: TranscriptionResponse = convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore return final_response @@ -210,7 +210,9 @@ class OpenAIAudioTranscription(OpenAIChatCompletion): additional_args={"complete_input_dict": data}, original_response=stringified_response, ) - hidden_params = {"model": "whisper-1", "custom_llm_provider": "openai"} + # Extract the actual model from data instead of hardcoding "whisper-1" + actual_model = data.get("model", "whisper-1") + hidden_params = {"model": actual_model, "custom_llm_provider": "openai"} return convert_to_model_response_object(response_object=stringified_response, model_response_object=model_response, hidden_params=hidden_params, response_type="audio_transcription") # type: ignore except Exception as e: ## LOGGING diff --git a/tests/local_testing/test_whisper.py b/tests/local_testing/test_whisper.py index bca7ae2addd..54bbcaa93dc 100644 --- a/tests/local_testing/test_whisper.py +++ b/tests/local_testing/test_whisper.py @@ -164,3 +164,72 @@ async def test_gpt_4o_transcribe(): await litellm.atranscription( model="openai/gpt-4o-transcribe", file=audio_file, response_format="json" ) + + +@pytest.mark.asyncio +async def test_gpt_4o_transcribe_model_mapping(): + """Test that GPT-4o transcription models are correctly mapped and not hardcoded to whisper-1""" + + # Test GPT-4o mini transcribe + response = await litellm.atranscription( + model="openai/gpt-4o-mini-transcribe", + file=audio_file, + response_format="json" + ) + + # Check that the response contains the correct model in hidden params + assert response._hidden_params is not None + assert response._hidden_params["model"] == "gpt-4o-mini-transcribe" + assert response._hidden_params["custom_llm_provider"] == "openai" + assert response.text is not None + + # Test GPT-4o transcribe + response2 = await litellm.atranscription( + model="openai/gpt-4o-transcribe", + file=audio_file, + response_format="json" + ) + + # Check that the response contains the correct model in hidden params + assert response2._hidden_params is not None + assert response2._hidden_params["model"] == "gpt-4o-transcribe" + assert response2._hidden_params["custom_llm_provider"] == "openai" + assert response2.text is not None + + # Test traditional whisper-1 still works + response3 = await litellm.atranscription( + model="openai/whisper-1", + file=audio_file, + response_format="json" + ) + + # Check that the response contains the correct model in hidden params + assert response3._hidden_params is not None + assert response3._hidden_params["model"] == "whisper-1" + assert response3._hidden_params["custom_llm_provider"] == "openai" + assert response3.text is not None + + +@pytest.mark.asyncio +async def test_azure_transcribe_model_mapping(): + """Test that Azure transcription models are correctly mapped and not hardcoded to whisper-1""" + + # Test Azure whisper-1 + try: + response = await litellm.atranscription( + model="azure/whisper-1", + file=audio_file, + response_format="json", + api_key=os.getenv("AZURE_EUROPE_API_KEY"), + api_base="https://my-endpoint-europe-berri-992.openai.azure.com/", + drop_params=True + ) + + # Check that the response contains the correct model in hidden params + assert response._hidden_params is not None + assert response._hidden_params["model"] == "whisper-1" + assert response._hidden_params["custom_llm_provider"] == "azure" + assert response.text is not None + except Exception as e: + # If Azure credentials are not available, skip this test + pytest.skip(f"Azure credentials not available: {str(e)}") From 8a4b163453ca235ff9d8d5218407925ba9eec944 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Mon, 2 Jun 2025 16:48:39 -0700 Subject: [PATCH 70/77] [Feat] DD Trace - Add instrumentation for streaming chunks (#11338) * fix: add tracing for litellm.completion * fix: NULL span add trace * fix: add tracing for litellm.completion streaming * fix: add tracing for litellm.completion streaming * fix: use a constant for str --- docs/my-website/docs/proxy/config_settings.md | 1 + litellm/constants.py | 3 + litellm/main.py | 3 + ...odel_prices_and_context_window_backup.json | 14 +++ litellm/proxy/common_request_processing.py | 8 +- litellm/proxy/proxy_config.yaml | 19 +--- .../proxy/test_common_request_processing.py | 100 ++++++++++++++++++ 7 files changed, 132 insertions(+), 16 deletions(-) diff --git a/docs/my-website/docs/proxy/config_settings.md b/docs/my-website/docs/proxy/config_settings.md index a77a135079f..701200163c8 100644 --- a/docs/my-website/docs/proxy/config_settings.md +++ b/docs/my-website/docs/proxy/config_settings.md @@ -371,6 +371,7 @@ router_settings: | DD_API_KEY | API key for Datadog integration | DD_SITE | Site URL for Datadog (e.g., datadoghq.com) | DD_SOURCE | Source identifier for Datadog logs +| DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE | Resource name for Datadog tracing of streaming chunk yields. Default is "streaming.chunk.yield" | DD_ENV | Environment identifier for Datadog logs. Only supported for `datadog_llm_observability` callback | DD_SERVICE | Service identifier for Datadog logs. Defaults to "litellm-server" | DD_VERSION | Version identifier for Datadog logs. Defaults to "unknown" diff --git a/litellm/constants.py b/litellm/constants.py index 990b9b053af..b896a16e6cf 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -156,6 +156,9 @@ REDACTED_BY_LITELM_STRING = "REDACTED_BY_LITELM" MAX_LANGFUSE_INITIALIZED_CLIENTS = int( os.getenv("MAX_LANGFUSE_INITIALIZED_CLIENTS", 50) ) +DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE = os.getenv( + "DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE", "streaming.chunk.yield" +) ############### LLM Provider Constants ############### ### ANTHROPIC CONSTANTS ### diff --git a/litellm/main.py b/litellm/main.py index 73bc88a1098..dffa5d40cd5 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -59,6 +59,7 @@ from litellm.constants import ( from litellm.exceptions import LiteLLMUnknownProvider from litellm.integrations.custom_logger import CustomLogger from litellm.litellm_core_utils.audio_utils.utils import get_audio_file_for_health_check +from litellm.litellm_core_utils.dd_tracing import tracer from litellm.litellm_core_utils.health_check_utils import ( _create_health_check_response, _filter_model_params, @@ -314,6 +315,7 @@ class AsyncCompletions: return response +@tracer.wrap() @client async def acompletion( model: str, @@ -810,6 +812,7 @@ def mock_completion( raise Exception("Mock completion response failed - {}".format(e)) +@tracer.wrap() @client def completion( # type: ignore # noqa: PLR0915 model: str, diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 4432be88b60..4e620285bda 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -8750,6 +8750,20 @@ "notes": "'supports_image_input' is a deprecated field. Use 'supports_embedding_image_input' instead." } }, + "embed-v4.0": { + "max_tokens": 1024, + "max_input_tokens": 1024, + "input_cost_per_token": 1.2e-07, + "input_cost_per_image": 4.7e-07, + "output_cost_per_token": 0.0, + "litellm_provider": "cohere", + "mode": "embedding", + "supports_image_input": true, + "supports_embedding_image_input": true, + "metadata": { + "notes": "'supports_image_input' is a deprecated field. Use 'supports_embedding_image_input' instead." + } + }, "replicate/meta/llama-2-13b": { "max_tokens": 4096, "max_input_tokens": 4096, diff --git a/litellm/proxy/common_request_processing.py b/litellm/proxy/common_request_processing.py index d02ba77a440..5c9b3576586 100644 --- a/litellm/proxy/common_request_processing.py +++ b/litellm/proxy/common_request_processing.py @@ -20,6 +20,8 @@ from fastapi.responses import Response, StreamingResponse import litellm from litellm._logging import verbose_proxy_logger +from litellm.constants import DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE +from litellm.litellm_core_utils.dd_tracing import tracer from litellm.litellm_core_utils.litellm_logging import Logging as LiteLLMLoggingObj from litellm.proxy._types import ProxyException, UserAPIKeyAuth from litellm.proxy.auth.auth_utils import check_response_size_is_safe @@ -142,9 +144,11 @@ async def create_streaming_response( async def combined_generator() -> AsyncGenerator[str, None]: if first_chunk_value is not None: - yield first_chunk_value + with tracer.trace(DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE): + yield first_chunk_value async for chunk in generator: - yield chunk + with tracer.trace(DD_TRACER_STREAMING_CHUNK_YIELD_RESOURCE): + yield chunk return StreamingResponse( combined_generator(), diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index dd0c35ea842..25e31f108fd 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -1,18 +1,9 @@ model_list: - - model_name: anthropic/* + - model_name: openai/* litellm_params: - model: anthropic/* - -guardrails: - - guardrail_name: "bedrock-pre-guard" - litellm_params: - guardrail: bedrock # supported values: "aporia", "bedrock", "lakera" - mode: "post_call" - guardrailIdentifier: wf0hkdb5x07f # your guardrail ID on bedrock - guardrailVersion: "DRAFT" # your guardrail version on bedrock - default_on: true - + model: openai/* + + + -general_settings: - store_prompts_in_spend_logs: true diff --git a/tests/test_litellm/proxy/test_common_request_processing.py b/tests/test_litellm/proxy/test_common_request_processing.py index e46e0c28b13..e1bdccdde9d 100644 --- a/tests/test_litellm/proxy/test_common_request_processing.py +++ b/tests/test_litellm/proxy/test_common_request_processing.py @@ -281,3 +281,103 @@ class TestCommonRequestProcessingHelpers: 'data: {"content": "actual data"}\n\n', "data: [DONE]\n\n", ] + + async def test_create_streaming_response_all_chunks_have_dd_trace(self): + """Test that all stream chunks are wrapped with dd trace at the streaming generator level""" + import json + from unittest.mock import patch + + # Create a mock tracer + mock_tracer = MagicMock() + mock_span = MagicMock() + mock_tracer.trace.return_value.__enter__.return_value = mock_span + mock_tracer.trace.return_value.__exit__.return_value = None + + # Mock generator with multiple chunks + async def mock_generator(): + yield 'data: {"content": "chunk 1"}\n\n' + yield 'data: {"content": "chunk 2"}\n\n' + yield 'data: {"content": "chunk 3"}\n\n' + yield "data: [DONE]\n\n" + + # Patch the tracer in the common_request_processing module + with patch("litellm.proxy.common_request_processing.tracer", mock_tracer): + response = await create_streaming_response( + mock_generator(), "text/event-stream", {} + ) + + assert response.status_code == 200 + + # Consume the stream to trigger the tracer calls + content = await self.consume_stream(response) + + # Verify all chunks are present + assert len(content) == 4 + assert content[0] == 'data: {"content": "chunk 1"}\n\n' + assert content[1] == 'data: {"content": "chunk 2"}\n\n' + assert content[2] == 'data: {"content": "chunk 3"}\n\n' + assert content[3] == "data: [DONE]\n\n" + + # Verify that tracer.trace was called for each chunk (4 chunks total) + assert mock_tracer.trace.call_count == 4 + + # Verify that each call was made with the correct operation name + expected_calls = [ + (("streaming.chunk.yield",), {}), + (("streaming.chunk.yield",), {}), + (("streaming.chunk.yield",), {}), + (("streaming.chunk.yield",), {}), + ] + + actual_calls = mock_tracer.trace.call_args_list + assert len(actual_calls) == 4 + + for i, call in enumerate(actual_calls): + args, kwargs = call + assert ( + args[0] == "streaming.chunk.yield" + ), f"Call {i} should have operation name 'streaming.chunk.yield', got {args[0]}" + + async def test_create_streaming_response_dd_trace_with_error_chunk(self): + """Test that dd trace is applied even when the first chunk contains an error""" + from unittest.mock import patch + + # Create a mock tracer + mock_tracer = MagicMock() + mock_span = MagicMock() + mock_tracer.trace.return_value.__enter__.return_value = mock_span + mock_tracer.trace.return_value.__exit__.return_value = None + + # Mock generator with error in first chunk + async def mock_generator(): + yield 'data: {"error": {"code": 400, "message": "bad request"}}\n\n' + yield 'data: {"content": "chunk after error"}\n\n' + yield "data: [DONE]\n\n" + + # Patch the tracer in the common_request_processing module + with patch("litellm.proxy.common_request_processing.tracer", mock_tracer): + response = await create_streaming_response( + mock_generator(), "text/event-stream", {} + ) + + # Even with error, status should be set to error code but tracing should still work + assert response.status_code == 400 + + # Consume the stream to trigger the tracer calls + content = await self.consume_stream(response) + + # Verify all chunks are present + assert len(content) == 3 + + # Verify that tracer.trace was called for each chunk + assert mock_tracer.trace.call_count == 3 + + # Verify that each call was made with the correct operation name + actual_calls = mock_tracer.trace.call_args_list + assert len(actual_calls) == 3 + + for i, call in enumerate(actual_calls): + args, kwargs = call + assert ( + args[0] == "streaming.chunk.yield" + ), f"Call {i} should have operation name 'streaming.chunk.yield', got {args[0]}" From 00be76abf48d5854f87ab62218b1e16d9ba384e2 Mon Sep 17 00:00:00 2001 From: Krish Dholakia Date: Mon, 2 Jun 2025 17:48:03 -0700 Subject: [PATCH 71/77] UI - Custom Server Root Path (Multiple Fixes) (#11337) * fix(proxy_server.py): working swagger on custom base removes the swagger monkey patch - this seems to render the swagger on custom base paths * fix(ui/): working custom auth uptil login success event * fix(ui/): working custom server root path for login * fix(proxy_server.py): create typed dict for ui returned token allows better documentation of expected params * refactor(proxy_server.py): refactor all ui login endpoints to use same returned ui token object * feat(ui_sso.py): add server root path to ui token * feat(ui_sso.py): allows ui to call correct endpoint * fix(networking.tsx): update proxy base url with custom root path * fix(networking.tsx): handle updating proxy base url for non-local instances * refactor: remove uneccessary references to proxybaseurl in ui code - reduce potential for errors * fix: fix linting error * fix(onboarding_link.tsx): fix onboarding link when custom server path is set * feat(ui_discovery_endpoints.py): add new public .well-known/ route for litellm ui config returns the server root path and proxy base url for constructing api calls * feat(_types.py): add litellm well known config as public route allows ui to query it * fix(/_types.py): add .well-known config to as public route * fix(page.tsx): create pattern for loading in ui config before making network requests ensures requests are formatted correctly * fix(page.tsx): call credential endpoint once ui config is loaded * fix(page.tsx): route correctly to litellm dashboard from new user login * fix(page.tsx): remove hardcoded `/litellm` for /sso/key/generate request * fix(proxy_server.py): re-add moderations endpoint * fix(proxy_server.py): mount __next__ at / and /litellm allows it to work when proxy is mounted on root * docs(contributing.md): remove /ui on ui doc - it will now run on root * docs(custom_root_ui.md): add docs on custom root path --- docs/my-website/docs/contributing.md | 6 +- docs/my-website/docs/proxy/custom_root_ui.md | 59 +++ docs/my-website/docs/proxy/deploy.md | 95 +--- docs/my-website/sidebars.js | 1 + .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../static/chunks/117-1c5bfc45bfc4237d.js | 2 - .../static/chunks/117-c4922b1dd81b62ce.js | 2 + .../static/chunks/660-8945b6c12184d209.js | 6 +- .../chunks/app/layout-413324e69a201f65.js | 1 + .../chunks/app/layout-f6fbbcb965e8cc49.js | 1 - .../app/model_hub/page-38df01e06b8ad4aa.js | 2 +- .../app/onboarding/page-0aa6cc914ba0c59d.js | 1 + .../app/onboarding/page-c2a273e1698ea2da.js | 1 - .../chunks/app/page-600ab8b71da0074f.js | 1 - .../chunks/app/page-d16f3e78ac977ba3.js | 1 + .../static/chunks/main-8ee698634884314e.js | 1 - ...80647d.js => main-app-4f7318ae681a6d94.js} | 2 +- .../static/chunks/main-d44a021deddb5790.js | 1 + ...1d60261.js => webpack-388cb91d6ed7c357.js} | 2 +- .../out/_next/static/css/09251ed7200896b1.css | 1 - .../out/_next/static/css/abc9387b9f3a6dd9.css | 1 + litellm/proxy/_experimental/out/index.html | 2 +- litellm/proxy/_experimental/out/index.txt | 6 +- litellm/proxy/_experimental/out/model_hub.txt | 6 +- .../proxy/_experimental/out/onboarding.html | 1 - .../proxy/_experimental/out/onboarding.txt | 6 +- litellm/proxy/_types.py | 2 + .../proxy/common_utils/html_forms/ui_login.py | 3 + litellm/proxy/discovery_endpoints/README.md | 12 + litellm/proxy/discovery_endpoints/__init__.py | 3 + .../ui_discovery_endpoints.py | 20 + litellm/proxy/management_endpoints/ui_sso.py | 33 +- litellm/proxy/proxy_server.py | 434 ++++++++++-------- litellm/proxy/utils.py | 35 ++ .../ui_discovery_endpoints.py | 8 + litellm/types/proxy/ui_sso.py | 17 + tests/test_litellm/proxy/test_custom_proxy.py | 48 ++ ui/litellm-dashboard/next.config.mjs | 3 +- ui/litellm-dashboard/out/404.html | 2 +- .../_buildManifest.js | 0 .../_ssgManifest.js | 0 .../static/chunks/117-1c5bfc45bfc4237d.js | 2 - .../static/chunks/117-c4922b1dd81b62ce.js | 2 + .../static/chunks/660-8945b6c12184d209.js | 6 +- .../chunks/app/layout-413324e69a201f65.js | 1 + .../chunks/app/layout-f6fbbcb965e8cc49.js | 1 - .../app/model_hub/page-38df01e06b8ad4aa.js | 2 +- .../app/onboarding/page-0aa6cc914ba0c59d.js | 1 + .../app/onboarding/page-c2a273e1698ea2da.js | 1 - .../chunks/app/page-600ab8b71da0074f.js | 1 - .../chunks/app/page-d16f3e78ac977ba3.js | 1 + .../static/chunks/main-8ee698634884314e.js | 1 - ...80647d.js => main-app-4f7318ae681a6d94.js} | 2 +- .../static/chunks/main-d44a021deddb5790.js | 1 + ...1d60261.js => webpack-388cb91d6ed7c357.js} | 2 +- .../out/_next/static/css/09251ed7200896b1.css | 1 - .../out/_next/static/css/abc9387b9f3a6dd9.css | 1 + ui/litellm-dashboard/out/index.html | 2 +- ui/litellm-dashboard/out/index.txt | 6 +- ui/litellm-dashboard/out/model_hub.html | 2 +- ui/litellm-dashboard/out/model_hub.txt | 6 +- ui/litellm-dashboard/out/onboarding.html | 2 +- ui/litellm-dashboard/out/onboarding.txt | 6 +- .../src/app/onboarding/page.tsx | 24 +- ui/litellm-dashboard/src/app/page.tsx | 14 +- .../chat_ui/llm_calls/chat_completion.tsx | 6 +- .../chat_ui/llm_calls/image_edits.tsx | 5 +- .../chat_ui/llm_calls/image_generation.tsx | 5 +- .../chat_ui/llm_calls/responses_api.tsx | 6 +- .../src/components/create_user_button.tsx | 18 +- .../src/components/navbar.tsx | 6 +- .../src/components/networking.tsx | 49 +- .../src/components/onboarding_link.tsx | 9 +- .../src/components/request_model_access.tsx | 6 +- .../src/components/settings.tsx | 6 +- ui/litellm-dashboard/src/components/teams.tsx | 6 +- ui/litellm-dashboard/src/components/usage.tsx | 5 - .../src/components/user_dashboard.tsx | 34 +- .../src/components/view_key_table.tsx | 6 - .../src/components/view_user_spend.tsx | 5 - .../src/components/view_user_team.tsx | 5 - .../src/components/view_users.tsx | 5 - 83 files changed, 639 insertions(+), 459 deletions(-) create mode 100644 docs/my-website/docs/proxy/custom_root_ui.md rename litellm/proxy/_experimental/out/_next/static/{r2ZMk6yYhffAf5bReqgyb => 7KRhWm0H5-GRk_DHnLwnm}/_buildManifest.js (100%) rename litellm/proxy/_experimental/out/_next/static/{r2ZMk6yYhffAf5bReqgyb => 7KRhWm0H5-GRk_DHnLwnm}/_ssgManifest.js (100%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/117-1c5bfc45bfc4237d.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/117-c4922b1dd81b62ce.js rename ui/litellm-dashboard/out/_next/static/chunks/660-52b9dbb37b758151.js => litellm/proxy/_experimental/out/_next/static/chunks/660-8945b6c12184d209.js (68%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/layout-413324e69a201f65.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/layout-f6fbbcb965e8cc49.js rename ui/litellm-dashboard/out/_next/static/chunks/app/model_hub/page-ce40c5a05f3174ca.js => litellm/proxy/_experimental/out/_next/static/chunks/app/model_hub/page-38df01e06b8ad4aa.js (60%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/onboarding/page-0aa6cc914ba0c59d.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/onboarding/page-c2a273e1698ea2da.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-600ab8b71da0074f.js create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/app/page-d16f3e78ac977ba3.js delete mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/main-8ee698634884314e.js rename litellm/proxy/_experimental/out/_next/static/chunks/{main-app-475d6efe4080647d.js => main-app-4f7318ae681a6d94.js} (54%) create mode 100644 litellm/proxy/_experimental/out/_next/static/chunks/main-d44a021deddb5790.js rename litellm/proxy/_experimental/out/_next/static/chunks/{webpack-75a5453f51d60261.js => webpack-388cb91d6ed7c357.js} (76%) delete mode 100644 litellm/proxy/_experimental/out/_next/static/css/09251ed7200896b1.css create mode 100644 litellm/proxy/_experimental/out/_next/static/css/abc9387b9f3a6dd9.css delete mode 100644 litellm/proxy/_experimental/out/onboarding.html create mode 100644 litellm/proxy/discovery_endpoints/README.md create mode 100644 litellm/proxy/discovery_endpoints/__init__.py create mode 100644 litellm/proxy/discovery_endpoints/ui_discovery_endpoints.py create mode 100644 litellm/types/proxy/discovery_endpoints/ui_discovery_endpoints.py create mode 100644 litellm/types/proxy/ui_sso.py create mode 100644 tests/test_litellm/proxy/test_custom_proxy.py rename ui/litellm-dashboard/out/_next/static/{r2ZMk6yYhffAf5bReqgyb => 7KRhWm0H5-GRk_DHnLwnm}/_buildManifest.js (100%) rename ui/litellm-dashboard/out/_next/static/{r2ZMk6yYhffAf5bReqgyb => 7KRhWm0H5-GRk_DHnLwnm}/_ssgManifest.js (100%) delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/117-1c5bfc45bfc4237d.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/117-c4922b1dd81b62ce.js rename litellm/proxy/_experimental/out/_next/static/chunks/660-52b9dbb37b758151.js => ui/litellm-dashboard/out/_next/static/chunks/660-8945b6c12184d209.js (68%) create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/layout-413324e69a201f65.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/layout-f6fbbcb965e8cc49.js rename litellm/proxy/_experimental/out/_next/static/chunks/app/model_hub/page-ce40c5a05f3174ca.js => ui/litellm-dashboard/out/_next/static/chunks/app/model_hub/page-38df01e06b8ad4aa.js (60%) create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/onboarding/page-0aa6cc914ba0c59d.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/onboarding/page-c2a273e1698ea2da.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-600ab8b71da0074f.js create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/app/page-d16f3e78ac977ba3.js delete mode 100644 ui/litellm-dashboard/out/_next/static/chunks/main-8ee698634884314e.js rename ui/litellm-dashboard/out/_next/static/chunks/{main-app-475d6efe4080647d.js => main-app-4f7318ae681a6d94.js} (54%) create mode 100644 ui/litellm-dashboard/out/_next/static/chunks/main-d44a021deddb5790.js rename ui/litellm-dashboard/out/_next/static/chunks/{webpack-75a5453f51d60261.js => webpack-388cb91d6ed7c357.js} (76%) delete mode 100644 ui/litellm-dashboard/out/_next/static/css/09251ed7200896b1.css create mode 100644 ui/litellm-dashboard/out/_next/static/css/abc9387b9f3a6dd9.css diff --git a/docs/my-website/docs/contributing.md b/docs/my-website/docs/contributing.md index da5783d9c04..8fc64b8f287 100644 --- a/docs/my-website/docs/contributing.md +++ b/docs/my-website/docs/contributing.md @@ -33,11 +33,11 @@ cd litellm/ui/litellm-dashboard npm run dev -# starts on http://0.0.0.0:3000/ui +# starts on http://0.0.0.0:3000 ``` ## 3. Go to local UI -``` -http://0.0.0.0:3000/ui +```bash +http://0.0.0.0:3000 ``` \ No newline at end of file diff --git a/docs/my-website/docs/proxy/custom_root_ui.md b/docs/my-website/docs/proxy/custom_root_ui.md new file mode 100644 index 00000000000..82ea7db6b3b --- /dev/null +++ b/docs/my-website/docs/proxy/custom_root_ui.md @@ -0,0 +1,59 @@ +# UI - Custom Root Path + +💥 Use this when you want to serve LiteLLM on a custom base url path like `https://localhost:4000/api/v1` + +## Usage + +### 1. Set `SERVER_ROOT_PATH` in your .env + +👉 Set `SERVER_ROOT_PATH` in your .env and this will be set as your server root path + +``` +export SERVER_ROOT_PATH="/api/v1" +``` + +### 2. Run the Proxy + +```shell +litellm proxy --config /path/to/config.yaml +``` + +After running the proxy you can access it on `http://0.0.0.0:4000/api/v1/` (since we set `SERVER_ROOT_PATH="/api/v1"`) + + +### 3. Reserve the `/litellm` path + +LiteLLM uses the `/litellm` path to discover the custom root path. So you need to reserve this path in your proxy. + +If you are running the UI, it will query the `/litellm/.well-known/litellm-ui-config` endpoint to get the UI configuration. + +So you need to reserve the `/litellm` path in your proxy. + +You can see the results with: + +```bash +curl http://0.0.0.0:4000/litellm/.well-known/litellm-ui-config +``` + +Expected result: + +```json + +{ + "server_root_path": "/api/v1", + ... +} + +``` + + +### 4. Verify Running on correct path + + + +**That's it**, that's all you need to run the proxy on a custom root path + + +## Demo + +[Here's a demo video](https://drive.google.com/file/d/1zqAxI0lmzNp7IJH1dxlLuKqX2xi3F_R3/view?usp=sharing) of running the proxy on a custom root path \ No newline at end of file diff --git a/docs/my-website/docs/proxy/deploy.md b/docs/my-website/docs/proxy/deploy.md index 511a9dda087..35174114255 100644 --- a/docs/my-website/docs/proxy/deploy.md +++ b/docs/my-website/docs/proxy/deploy.md @@ -619,101 +619,8 @@ docker pull ghcr.io/berriai/litellm-non_root:main-stable ### 1. Custom server root path (Proxy base url) -💥 Use this when you want to serve LiteLLM on a custom base url path like `https://localhost:4000/api/v1` +Refer to [Custom Root Path](./custom_root_ui) for more details. -:::info - -In a Kubernetes deployment, it's possible to utilize a shared DNS to host multiple applications by modifying the virtual service - -::: - -Customize the root path to eliminate the need for employing multiple DNS configurations during deployment. - -Step 1. -👉 Set `SERVER_ROOT_PATH` in your .env and this will be set as your server root path -``` -export SERVER_ROOT_PATH="/api/v1" -``` - -**Step 2** (If you want the Proxy Admin UI to work with your root path you need to use this dockerfile) -- Use the dockerfile below (it uses litellm as a base image) -- 👉 Set `UI_BASE_PATH=$SERVER_ROOT_PATH/ui` in the Dockerfile, example `UI_BASE_PATH=/api/v1/ui` - -Dockerfile - -```shell -# Use the provided base image -FROM ghcr.io/berriai/litellm:main-latest - -# Set the working directory to /app -WORKDIR /app - -# Install Node.js and npm (adjust version as needed) -RUN apt-get update && apt-get install -y nodejs npm - -# Copy the UI source into the container -COPY ./ui/litellm-dashboard /app/ui/litellm-dashboard - -# Set an environment variable for UI_BASE_PATH -# This can be overridden at build time -# set UI_BASE_PATH to "/ui" -# 👇👇 Enter your UI_BASE_PATH here -ENV UI_BASE_PATH="/api/v1/ui" - -# Build the UI with the specified UI_BASE_PATH -WORKDIR /app/ui/litellm-dashboard -RUN npm install -RUN UI_BASE_PATH=$UI_BASE_PATH npm run build - -# Create the destination directory -RUN mkdir -p /app/litellm/proxy/_experimental/out - -# Move the built files to the appropriate location -# Assuming the build output is in ./out directory -RUN rm -rf /app/litellm/proxy/_experimental/out/* && \ - mv ./out/* /app/litellm/proxy/_experimental/out/ - -# Switch back to the main app directory -WORKDIR /app - -# Make sure your entrypoint.sh is executable -RUN chmod +x ./docker/entrypoint.sh - -# Expose the necessary port -EXPOSE 4000/tcp - -# Override the CMD instruction with your desired command and arguments -# only use --detailed_debug for debugging -CMD ["--port", "4000", "--config", "config.yaml"] -``` - -**Step 3** build this Dockerfile - -```shell -docker build -f Dockerfile -t litellm-prod-build . --progress=plain -``` - -**Step 4. Run Proxy with `SERVER_ROOT_PATH` set in your env ** - -```shell -docker run \ - -v $(pwd)/proxy_config.yaml:/app/config.yaml \ - -p 4000:4000 \ - -e LITELLM_LOG="DEBUG"\ - -e SERVER_ROOT_PATH="/api/v1"\ - -e DATABASE_URL=postgresql://:@:/ \ - -e LITELLM_MASTER_KEY="sk-1234"\ - litellm-prod-build \ - --config /app/config.yaml -``` - -After running the proxy you can access it on `http://0.0.0.0:4000/api/v1/` (since we set `SERVER_ROOT_PATH="/api/v1"`) - -**Step 5. Verify Running on correct path** - - - -**That's it**, that's all you need to run the proxy on a custom root path ### 2. SSL Certification diff --git a/docs/my-website/sidebars.js b/docs/my-website/sidebars.js index 5d810db003f..cc896a11dca 100644 --- a/docs/my-website/sidebars.js +++ b/docs/my-website/sidebars.js @@ -102,6 +102,7 @@ const sidebars = { items: [ "proxy/ui", "proxy/admin_ui_sso", + "proxy/custom_root_ui", "proxy/self_serve", "proxy/public_teams", "tutorials/scim_litellm", diff --git a/litellm/proxy/_experimental/out/_next/static/r2ZMk6yYhffAf5bReqgyb/_buildManifest.js b/litellm/proxy/_experimental/out/_next/static/7KRhWm0H5-GRk_DHnLwnm/_buildManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/r2ZMk6yYhffAf5bReqgyb/_buildManifest.js rename to litellm/proxy/_experimental/out/_next/static/7KRhWm0H5-GRk_DHnLwnm/_buildManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/r2ZMk6yYhffAf5bReqgyb/_ssgManifest.js b/litellm/proxy/_experimental/out/_next/static/7KRhWm0H5-GRk_DHnLwnm/_ssgManifest.js similarity index 100% rename from litellm/proxy/_experimental/out/_next/static/r2ZMk6yYhffAf5bReqgyb/_ssgManifest.js rename to litellm/proxy/_experimental/out/_next/static/7KRhWm0H5-GRk_DHnLwnm/_ssgManifest.js diff --git a/litellm/proxy/_experimental/out/_next/static/chunks/117-1c5bfc45bfc4237d.js b/litellm/proxy/_experimental/out/_next/static/chunks/117-1c5bfc45bfc4237d.js deleted file mode 100644 index 31fd397e116..00000000000 --- a/litellm/proxy/_experimental/out/_next/static/chunks/117-1c5bfc45bfc4237d.js +++ /dev/null @@ -1,2 +0,0 @@ -(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[117],{65157:function(e,t){"use strict";function n(){return""}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getDeploymentIdQueryOrEmptyString",{enumerable:!0,get:function(){return n}})},91572:function(){"trimStart"in String.prototype||(String.prototype.trimStart=String.prototype.trimLeft),"trimEnd"in String.prototype||(String.prototype.trimEnd=String.prototype.trimRight),"description"in Symbol.prototype||Object.defineProperty(Symbol.prototype,"description",{configurable:!0,get:function(){var e=/\((.*)\)/.exec(this.toString());return e?e[1]:void 0}}),Array.prototype.flat||(Array.prototype.flat=function(e,t){return t=this.concat.apply([],this),e>1&&t.some(Array.isArray)?t.flat(e-1):t},Array.prototype.flatMap=function(e,t){return this.map(e,t).flat()}),Promise.prototype.finally||(Promise.prototype.finally=function(e){if("function"!=typeof e)return this.then(e,e);var t=this.constructor||Promise;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){throw n})})}),Object.fromEntries||(Object.fromEntries=function(e){return Array.from(e).reduce(function(e,t){return e[t[0]]=t[1],e},{})}),Array.prototype.at||(Array.prototype.at=function(e){var t=Math.trunc(e)||0;if(t<0&&(t+=this.length),!(t<0||t>=this.length))return this[t]}),Object.hasOwn||(Object.hasOwn=function(e,t){if(null==e)throw TypeError("Cannot convert undefined or null to object");return Object.prototype.hasOwnProperty.call(Object(e),t)}),"canParse"in URL||(URL.canParse=function(e,t){try{return new URL(e,t),!0}catch(e){return!1}})},1634:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addBasePath",{enumerable:!0,get:function(){return u}});let r=n(68498),o=n(33068);function u(e,t){return(0,o.normalizePathTrailingSlash)((0,r.addPathPrefix)(e,"/ui"))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},75266:function(e,t){"use strict";function n(e){var t,n;t=self.__next_s,n=()=>{e()},t&&t.length?t.reduce((e,t)=>{let[n,r]=t;return e.then(()=>new Promise((e,t)=>{let o=document.createElement("script");if(r)for(let e in r)"children"!==e&&o.setAttribute(e,r[e]);n?(o.src=n,o.onload=()=>e(),o.onerror=t):r&&(o.innerHTML=r.children,setTimeout(e)),document.head.appendChild(o)}))},Promise.resolve()).catch(e=>{console.error(e)}).then(()=>{n()}):n()}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"appBootstrap",{enumerable:!0,get:function(){return n}}),window.next={version:"14.2.26",appDir:!0},("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},83079:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"callServer",{enumerable:!0,get:function(){return o}});let r=n(12846);async function o(e,t){let n=(0,r.getServerActionDispatcher)();if(!n)throw Error("Invariant: missing action dispatcher.");return new Promise((r,o)=>{n({actionId:e,actionArgs:t,resolve:r,reject:o})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},92304:function(e,t,n){"use strict";let r,o;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"hydrate",{enumerable:!0,get:function(){return x}});let u=n(47043),l=n(53099),a=n(57437);n(91572);let i=u._(n(34040)),c=l._(n(2265)),s=n(6671),f=n(48701),d=u._(n(61404)),p=n(83079),h=n(89721),y=n(2103);n(70647);let _=window.console.error;window.console.error=function(){for(var e=arguments.length,t=Array(e),n=0;n{if((0,h.isNextRouterError)(e.error)){e.preventDefault();return}});let v=document,b=new TextEncoder,g=!1,m=!1,R=null;function P(e){if(0===e[0])r=[];else if(1===e[0]){if(!r)throw Error("Unexpected server data: missing bootstrap script.");o?o.enqueue(b.encode(e[1])):r.push(e[1])}else 2===e[0]&&(R=e[1])}let j=function(){o&&!m&&(o.close(),m=!0,r=void 0),g=!0};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",j,!1):j();let O=self.__next_f=self.__next_f||[];O.forEach(P),O.push=P;let S=new ReadableStream({start(e){r&&(r.forEach(t=>{e.enqueue(b.encode(t))}),g&&!m&&(e.close(),m=!0,r=void 0)),o=e}}),E=(0,s.createFromReadableStream)(S,{callServer:p.callServer});function w(){return(0,c.use)(E)}let T=c.default.StrictMode;function M(e){let{children:t}=e;return t}function x(){let e=(0,y.createMutableActionQueue)(),t=(0,a.jsx)(T,{children:(0,a.jsx)(f.HeadManagerContext.Provider,{value:{appDir:!0},children:(0,a.jsx)(y.ActionQueueContext.Provider,{value:e,children:(0,a.jsx)(M,{children:(0,a.jsx)(w,{})})})})}),n=window.__next_root_layout_missing_tags,r=!!(null==n?void 0:n.length),o={onRecoverableError:d.default};"__next_error__"===document.documentElement.id||r?i.default.createRoot(v,o).render(t):c.default.startTransition(()=>i.default.hydrateRoot(v,t,{...o,formState:R}))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},54278:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(19506),(0,n(75266).appBootstrap)(()=>{let{hydrate:e}=n(92304);n(12846),n(4707),e()}),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},19506:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(65157);{let e=n.u;n.u=function(){for(var t=arguments.length,n=Array(t),r=0;r(l(function(){var e;let t=document.getElementsByName(u)[0];if(null==t?void 0:null==(e=t.shadowRoot)?void 0:e.childNodes[0])return t.shadowRoot.childNodes[0];{let e=document.createElement(u);e.style.cssText="position:absolute";let t=document.createElement("div");return t.ariaLive="assertive",t.id="__next-route-announcer__",t.role="alert",t.style.cssText="position:absolute;border:0;height:1px;margin:-1px;padding:0;width:1px;clip:rect(0 0 0 0);overflow:hidden;white-space:nowrap;word-wrap:normal",e.attachShadow({mode:"open"}).appendChild(t),document.body.appendChild(e),t}}()),()=>{let e=document.getElementsByTagName(u)[0];(null==e?void 0:e.isConnected)&&document.body.removeChild(e)}),[]);let[a,i]=(0,r.useState)(""),c=(0,r.useRef)();return(0,r.useEffect)(()=>{let e="";if(document.title)e=document.title;else{let t=document.querySelector("h1");t&&(e=t.innerText||t.textContent||"")}void 0!==c.current&&c.current!==e&&i(e),c.current=e},[t]),n?(0,o.createPortal)(a,n):null}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6866:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ACTION:function(){return r},FLIGHT_PARAMETERS:function(){return i},NEXT_DID_POSTPONE_HEADER:function(){return s},NEXT_ROUTER_PREFETCH_HEADER:function(){return u},NEXT_ROUTER_STATE_TREE:function(){return o},NEXT_RSC_UNION_QUERY:function(){return c},NEXT_URL:function(){return l},RSC_CONTENT_TYPE_HEADER:function(){return a},RSC_HEADER:function(){return n}});let n="RSC",r="Next-Action",o="Next-Router-State-Tree",u="Next-Router-Prefetch",l="Next-Url",a="text/x-component",i=[[n],[o],[u]],c="_rsc",s="x-nextjs-postponed";("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},12846:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{createEmptyCacheNode:function(){return C},default:function(){return I},getServerActionDispatcher:function(){return E},urlToUrlWithoutFlightMarker:function(){return T}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(61956),a=n(24673),i=n(33456),c=n(79060),s=n(47744),f=n(61060),d=n(82952),p=n(86146),h=n(1634),y=n(6495),_=n(4123),v=n(39320),b=n(38137),g=n(6866),m=n(35076),R=n(11283),P=n(84541),j="undefined"==typeof window,O=j?null:new Map,S=null;function E(){return S}let w={};function T(e){let t=new URL(e,location.origin);if(t.searchParams.delete(g.NEXT_RSC_UNION_QUERY),t.pathname.endsWith(".txt")){let{pathname:e}=t,n=e.endsWith("/index.txt")?10:4;t.pathname=e.slice(0,-n)}return t}function M(e){return e.origin!==window.location.origin}function x(e){let{appRouterState:t,sync:n}=e;return(0,u.useInsertionEffect)(()=>{let{tree:e,pushRef:r,canonicalUrl:o}=t,u={...r.preserveCustomHistoryState?window.history.state:{},__NA:!0,__PRIVATE_NEXTJS_INTERNALS_TREE:e};r.pendingPush&&(0,i.createHrefFromUrl)(new URL(window.location.href))!==o?(r.pendingPush=!1,window.history.pushState(u,"",o)):window.history.replaceState(u,"",o),n(t)},[t,n]),null}function C(){return{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null}}function A(e){null==e&&(e={});let t=window.history.state,n=null==t?void 0:t.__NA;n&&(e.__NA=n);let r=null==t?void 0:t.__PRIVATE_NEXTJS_INTERNALS_TREE;return r&&(e.__PRIVATE_NEXTJS_INTERNALS_TREE=r),e}function N(e){let{headCacheNode:t}=e,n=null!==t?t.head:null,r=null!==t?t.prefetchHead:null,o=null!==r?r:n;return(0,u.useDeferredValue)(n,o)}function D(e){let t,{buildId:n,initialHead:r,initialTree:i,urlParts:f,initialSeedData:g,couldBeIntercepted:E,assetPrefix:T,missingSlots:C}=e,D=(0,u.useMemo)(()=>(0,d.createInitialRouterState)({buildId:n,initialSeedData:g,urlParts:f,initialTree:i,initialParallelRoutes:O,location:j?null:window.location,initialHead:r,couldBeIntercepted:E}),[n,g,f,i,r,E]),[I,U,k]=(0,s.useReducerWithReduxDevtools)(D);(0,u.useEffect)(()=>{O=null},[]);let{canonicalUrl:F}=(0,s.useUnwrapState)(I),{searchParams:L,pathname:H}=(0,u.useMemo)(()=>{let e=new URL(F,"undefined"==typeof window?"http://n":window.location.href);return{searchParams:e.searchParams,pathname:(0,R.hasBasePath)(e.pathname)?(0,m.removeBasePath)(e.pathname):e.pathname}},[F]),$=(0,u.useCallback)(e=>{let{previousTree:t,serverResponse:n}=e;(0,u.startTransition)(()=>{U({type:a.ACTION_SERVER_PATCH,previousTree:t,serverResponse:n})})},[U]),G=(0,u.useCallback)((e,t,n)=>{let r=new URL((0,h.addBasePath)(e),location.href);return U({type:a.ACTION_NAVIGATE,url:r,isExternalUrl:M(r),locationSearch:location.search,shouldScroll:null==n||n,navigateType:t})},[U]);S=(0,u.useCallback)(e=>{(0,u.startTransition)(()=>{U({...e,type:a.ACTION_SERVER_ACTION})})},[U]);let z=(0,u.useMemo)(()=>({back:()=>window.history.back(),forward:()=>window.history.forward(),prefetch:(e,t)=>{let n;if(!(0,p.isBot)(window.navigator.userAgent)){try{n=new URL((0,h.addBasePath)(e),window.location.href)}catch(t){throw Error("Cannot prefetch '"+e+"' because it cannot be converted to a URL.")}M(n)||(0,u.startTransition)(()=>{var e;U({type:a.ACTION_PREFETCH,url:n,kind:null!=(e=null==t?void 0:t.kind)?e:a.PrefetchKind.FULL})})}},replace:(e,t)=>{void 0===t&&(t={}),(0,u.startTransition)(()=>{var n;G(e,"replace",null==(n=t.scroll)||n)})},push:(e,t)=>{void 0===t&&(t={}),(0,u.startTransition)(()=>{var n;G(e,"push",null==(n=t.scroll)||n)})},refresh:()=>{(0,u.startTransition)(()=>{U({type:a.ACTION_REFRESH,origin:window.location.origin})})},fastRefresh:()=>{throw Error("fastRefresh can only be used in development mode. Please use refresh instead.")}}),[U,G]);(0,u.useEffect)(()=>{window.next&&(window.next.router=z)},[z]),(0,u.useEffect)(()=>{function e(e){var t;e.persisted&&(null==(t=window.history.state)?void 0:t.__PRIVATE_NEXTJS_INTERNALS_TREE)&&(w.pendingMpaPath=void 0,U({type:a.ACTION_RESTORE,url:new URL(window.location.href),tree:window.history.state.__PRIVATE_NEXTJS_INTERNALS_TREE}))}return window.addEventListener("pageshow",e),()=>{window.removeEventListener("pageshow",e)}},[U]);let{pushRef:B}=(0,s.useUnwrapState)(I);if(B.mpaNavigation){if(w.pendingMpaPath!==F){let e=window.location;B.pendingPush?e.assign(F):e.replace(F),w.pendingMpaPath=F}(0,u.use)(b.unresolvedThenable)}(0,u.useEffect)(()=>{let e=window.history.pushState.bind(window.history),t=window.history.replaceState.bind(window.history),n=e=>{var t;let n=window.location.href,r=null==(t=window.history.state)?void 0:t.__PRIVATE_NEXTJS_INTERNALS_TREE;(0,u.startTransition)(()=>{U({type:a.ACTION_RESTORE,url:new URL(null!=e?e:n,n),tree:r})})};window.history.pushState=function(t,r,o){return(null==t?void 0:t.__NA)||(null==t?void 0:t._N)||(t=A(t),o&&n(o)),e(t,r,o)},window.history.replaceState=function(e,r,o){return(null==e?void 0:e.__NA)||(null==e?void 0:e._N)||(e=A(e),o&&n(o)),t(e,r,o)};let r=e=>{let{state:t}=e;if(t){if(!t.__NA){window.location.reload();return}(0,u.startTransition)(()=>{U({type:a.ACTION_RESTORE,url:new URL(window.location.href),tree:t.__PRIVATE_NEXTJS_INTERNALS_TREE})})}};return window.addEventListener("popstate",r),()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",r)}},[U]);let{cache:W,tree:K,nextUrl:V,focusAndScrollRef:Y}=(0,s.useUnwrapState)(I),X=(0,u.useMemo)(()=>(0,v.findHeadInCache)(W,K[1]),[W,K]),q=(0,u.useMemo)(()=>(function e(t,n){for(let r of(void 0===n&&(n={}),Object.values(t[1]))){let t=r[0],o=Array.isArray(t),u=o?t[1]:t;!u||u.startsWith(P.PAGE_SEGMENT_KEY)||(o&&("c"===t[2]||"oc"===t[2])?n[t[0]]=t[1].split("/"):o&&(n[t[0]]=t[1]),n=e(r,n))}return n})(K),[K]);if(null!==X){let[e,n]=X;t=(0,o.jsx)(N,{headCacheNode:e},n)}else t=null;let J=(0,o.jsxs)(_.RedirectBoundary,{children:[t,W.rsc,(0,o.jsx)(y.AppRouterAnnouncer,{tree:K})]});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(x,{appRouterState:(0,s.useUnwrapState)(I),sync:k}),(0,o.jsx)(c.PathParamsContext.Provider,{value:q,children:(0,o.jsx)(c.PathnameContext.Provider,{value:H,children:(0,o.jsx)(c.SearchParamsContext.Provider,{value:L,children:(0,o.jsx)(l.GlobalLayoutRouterContext.Provider,{value:{buildId:n,changeByServerResponse:$,tree:K,focusAndScrollRef:Y,nextUrl:V},children:(0,o.jsx)(l.AppRouterContext.Provider,{value:z,children:(0,o.jsx)(l.LayoutRouterContext.Provider,{value:{childNodes:W.parallelRoutes,tree:K,url:F,loading:W.loading},children:J})})})})})})]})}function I(e){let{globalErrorComponent:t,...n}=e;return(0,o.jsx)(f.ErrorBoundary,{errorComponent:t,children:(0,o.jsx)(D,{...n})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},96149:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"bailoutToClientRendering",{enumerable:!0,get:function(){return u}});let r=n(18993),o=n(51845);function u(e){let t=o.staticGenerationAsyncStorage.getStore();if((null==t||!t.forceStatic)&&(null==t?void 0:t.isStaticGeneration))throw new r.BailoutToCSRError(e)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},19107:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ClientPageRoot",{enumerable:!0,get:function(){return u}});let r=n(57437),o=n(54535);function u(e){let{Component:t,props:n}=e;return n.searchParams=(0,o.createDynamicallyTrackedSearchParams)(n.searchParams||{}),(0,r.jsx)(t,{...n})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},61060:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ErrorBoundary:function(){return h},ErrorBoundaryHandler:function(){return f},GlobalError:function(){return d},default:function(){return p}});let r=n(47043),o=n(57437),u=r._(n(2265)),l=n(35475),a=n(89721),i=n(51845),c={error:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},text:{fontSize:"14px",fontWeight:400,lineHeight:"28px",margin:"0 8px"}};function s(e){let{error:t}=e,n=i.staticGenerationAsyncStorage.getStore();if((null==n?void 0:n.isRevalidate)||(null==n?void 0:n.isStaticGeneration))throw console.error(t),t;return null}class f extends u.default.Component{static getDerivedStateFromError(e){if((0,a.isNextRouterError)(e))throw e;return{error:e}}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.error?{error:null,previousPathname:e.pathname}:{error:t.error,previousPathname:e.pathname}}render(){return this.state.error?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s,{error:this.state.error}),this.props.errorStyles,this.props.errorScripts,(0,o.jsx)(this.props.errorComponent,{error:this.state.error,reset:this.reset})]}):this.props.children}constructor(e){super(e),this.reset=()=>{this.setState({error:null})},this.state={error:null,previousPathname:this.props.pathname}}}function d(e){let{error:t}=e,n=null==t?void 0:t.digest;return(0,o.jsxs)("html",{id:"__next_error__",children:[(0,o.jsx)("head",{}),(0,o.jsxs)("body",{children:[(0,o.jsx)(s,{error:t}),(0,o.jsx)("div",{style:c.error,children:(0,o.jsxs)("div",{children:[(0,o.jsx)("h2",{style:c.text,children:"Application error: a "+(n?"server":"client")+"-side exception has occurred (see the "+(n?"server logs":"browser console")+" for more information)."}),n?(0,o.jsx)("p",{style:c.text,children:"Digest: "+n}):null]})})]})]})}let p=d;function h(e){let{errorComponent:t,errorStyles:n,errorScripts:r,children:u}=e,a=(0,l.usePathname)();return t?(0,o.jsx)(f,{pathname:a,errorComponent:t,errorStyles:n,errorScripts:r,children:u}):(0,o.jsx)(o.Fragment,{children:u})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},46177:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{DynamicServerError:function(){return r},isDynamicServerError:function(){return o}});let n="DYNAMIC_SERVER_USAGE";class r extends Error{constructor(e){super("Dynamic server usage: "+e),this.description=e,this.digest=n}}function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"==typeof e.digest&&e.digest===n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},89721:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isNextRouterError",{enumerable:!0,get:function(){return u}});let r=n(98200),o=n(88968);function u(e){return e&&e.digest&&((0,o.isRedirectError)(e)||(0,r.isNotFoundError)(e))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4707:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return S}});let r=n(47043),o=n(53099),u=n(57437),l=o._(n(2265)),a=r._(n(54887)),i=n(61956),c=n(44848),s=n(38137),f=n(61060),d=n(76015),p=n(7092),h=n(4123),y=n(80),_=n(73171),v=n(78505),b=n(28077),g=["bottom","height","left","right","top","width","x","y"];function m(e,t){let n=e.getBoundingClientRect();return n.top>=0&&n.top<=t}class R extends l.default.Component{componentDidMount(){this.handlePotentialScroll()}componentDidUpdate(){this.props.focusAndScrollRef.apply&&this.handlePotentialScroll()}render(){return this.props.children}constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focusAndScrollRef:e,segmentPath:t}=this.props;if(e.apply){var n;if(0!==e.segmentPaths.length&&!e.segmentPaths.some(e=>t.every((t,n)=>(0,d.matchSegment)(t,e[n]))))return;let r=null,o=e.hashFragment;if(o&&(r="top"===o?document.body:null!=(n=document.getElementById(o))?n:document.getElementsByName(o)[0]),r||(r="undefined"==typeof window?null:a.default.findDOMNode(this)),!(r instanceof Element))return;for(;!(r instanceof HTMLElement)||function(e){if(["sticky","fixed"].includes(getComputedStyle(e).position))return!0;let t=e.getBoundingClientRect();return g.every(e=>0===t[e])}(r);){if(null===r.nextElementSibling)return;r=r.nextElementSibling}e.apply=!1,e.hashFragment=null,e.segmentPaths=[],(0,p.handleSmoothScroll)(()=>{if(o){r.scrollIntoView();return}let e=document.documentElement,t=e.clientHeight;!m(r,t)&&(e.scrollTop=0,m(r,t)||r.scrollIntoView())},{dontForceLayout:!0,onlyHashChange:e.onlyHashChange}),e.onlyHashChange=!1,r.focus()}}}}function P(e){let{segmentPath:t,children:n}=e,r=(0,l.useContext)(i.GlobalLayoutRouterContext);if(!r)throw Error("invariant global layout router not mounted");return(0,u.jsx)(R,{segmentPath:t,focusAndScrollRef:r.focusAndScrollRef,children:n})}function j(e){let{parallelRouterKey:t,url:n,childNodes:r,segmentPath:o,tree:a,cacheKey:f}=e,p=(0,l.useContext)(i.GlobalLayoutRouterContext);if(!p)throw Error("invariant global layout router not mounted");let{buildId:h,changeByServerResponse:y,tree:_}=p,v=r.get(f);if(void 0===v){let e={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null};v=e,r.set(f,e)}let g=null!==v.prefetchRsc?v.prefetchRsc:v.rsc,m=(0,l.useDeferredValue)(v.rsc,g),R="object"==typeof m&&null!==m&&"function"==typeof m.then?(0,l.use)(m):m;if(!R){let e=v.lazyData;if(null===e){let t=function e(t,n){if(t){let[r,o]=t,u=2===t.length;if((0,d.matchSegment)(n[0],r)&&n[1].hasOwnProperty(o)){if(u){let t=e(void 0,n[1][o]);return[n[0],{...n[1],[o]:[t[0],t[1],t[2],"refetch"]}]}return[n[0],{...n[1],[o]:e(t.slice(2),n[1][o])}]}}return n}(["",...o],_),r=(0,b.hasInterceptionRouteInCurrentTree)(_);v.lazyData=e=(0,c.fetchServerResponse)(new URL(n,location.origin),t,r?p.nextUrl:null,h),v.lazyDataResolved=!1}let t=(0,l.use)(e);v.lazyDataResolved||(setTimeout(()=>{(0,l.startTransition)(()=>{y({previousTree:_,serverResponse:t})})}),v.lazyDataResolved=!0),(0,l.use)(s.unresolvedThenable)}return(0,u.jsx)(i.LayoutRouterContext.Provider,{value:{tree:a[1][t],childNodes:v.parallelRoutes,url:n,loading:v.loading},children:R})}function O(e){let{children:t,hasLoading:n,loading:r,loadingStyles:o,loadingScripts:a}=e;return n?(0,u.jsx)(l.Suspense,{fallback:(0,u.jsxs)(u.Fragment,{children:[o,a,r]}),children:t}):(0,u.jsx)(u.Fragment,{children:t})}function S(e){let{parallelRouterKey:t,segmentPath:n,error:r,errorStyles:o,errorScripts:a,templateStyles:c,templateScripts:s,template:d,notFound:p,notFoundStyles:b}=e,g=(0,l.useContext)(i.LayoutRouterContext);if(!g)throw Error("invariant expected layout router to be mounted");let{childNodes:m,tree:R,url:S,loading:E}=g,w=m.get(t);w||(w=new Map,m.set(t,w));let T=R[1][t][0],M=(0,_.getSegmentValue)(T),x=[T];return(0,u.jsx)(u.Fragment,{children:x.map(e=>{let l=(0,_.getSegmentValue)(e),g=(0,v.createRouterCacheKey)(e);return(0,u.jsxs)(i.TemplateContext.Provider,{value:(0,u.jsx)(P,{segmentPath:n,children:(0,u.jsx)(f.ErrorBoundary,{errorComponent:r,errorStyles:o,errorScripts:a,children:(0,u.jsx)(O,{hasLoading:!!E,loading:null==E?void 0:E[0],loadingStyles:null==E?void 0:E[1],loadingScripts:null==E?void 0:E[2],children:(0,u.jsx)(y.NotFoundBoundary,{notFound:p,notFoundStyles:b,children:(0,u.jsx)(h.RedirectBoundary,{children:(0,u.jsx)(j,{parallelRouterKey:t,url:S,tree:R,childNodes:w,segmentPath:n,cacheKey:g,isActive:M===l})})})})})}),children:[c,s,d]},(0,v.createRouterCacheKey)(e,!0))})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},76015:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{canSegmentBeOverridden:function(){return u},matchSegment:function(){return o}});let r=n(87417),o=(e,t)=>"string"==typeof e?"string"==typeof t&&e===t:"string"!=typeof t&&e[0]===t[0]&&e[1]===t[1],u=(e,t)=>{var n;return!Array.isArray(e)&&!!Array.isArray(t)&&(null==(n=(0,r.getSegmentParam)(e))?void 0:n.param)===t[0]};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},35475:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ReadonlyURLSearchParams:function(){return i.ReadonlyURLSearchParams},RedirectType:function(){return i.RedirectType},ServerInsertedHTMLContext:function(){return c.ServerInsertedHTMLContext},notFound:function(){return i.notFound},permanentRedirect:function(){return i.permanentRedirect},redirect:function(){return i.redirect},useParams:function(){return p},usePathname:function(){return f},useRouter:function(){return d},useSearchParams:function(){return s},useSelectedLayoutSegment:function(){return y},useSelectedLayoutSegments:function(){return h},useServerInsertedHTML:function(){return c.useServerInsertedHTML}});let r=n(2265),o=n(61956),u=n(79060),l=n(73171),a=n(84541),i=n(52646),c=n(55501);function s(){let e=(0,r.useContext)(u.SearchParamsContext),t=(0,r.useMemo)(()=>e?new i.ReadonlyURLSearchParams(e):null,[e]);if("undefined"==typeof window){let{bailoutToClientRendering:e}=n(96149);e("useSearchParams()")}return t}function f(){return(0,r.useContext)(u.PathnameContext)}function d(){let e=(0,r.useContext)(o.AppRouterContext);if(null===e)throw Error("invariant expected app router to be mounted");return e}function p(){return(0,r.useContext)(u.PathParamsContext)}function h(e){void 0===e&&(e="children");let t=(0,r.useContext)(o.LayoutRouterContext);return t?function e(t,n,r,o){let u;if(void 0===r&&(r=!0),void 0===o&&(o=[]),r)u=t[1][n];else{var i;let e=t[1];u=null!=(i=e.children)?i:Object.values(e)[0]}if(!u)return o;let c=u[0],s=(0,l.getSegmentValue)(c);return!s||s.startsWith(a.PAGE_SEGMENT_KEY)?o:(o.push(s),e(u,n,!1,o))}(t.tree,e):null}function y(e){void 0===e&&(e="children");let t=h(e);if(!t||0===t.length)return null;let n="children"===e?t[0]:t[t.length-1];return n===a.DEFAULT_SEGMENT_KEY?null:n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},52646:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ReadonlyURLSearchParams:function(){return l},RedirectType:function(){return r.RedirectType},notFound:function(){return o.notFound},permanentRedirect:function(){return r.permanentRedirect},redirect:function(){return r.redirect}});let r=n(88968),o=n(98200);class u extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class l extends URLSearchParams{append(){throw new u}delete(){throw new u}set(){throw new u}sort(){throw new u}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},80:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"NotFoundBoundary",{enumerable:!0,get:function(){return s}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(35475),a=n(98200);n(31765);let i=n(61956);class c extends u.default.Component{componentDidCatch(){}static getDerivedStateFromError(e){if((0,a.isNotFoundError)(e))return{notFoundTriggered:!0};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.notFoundTriggered?{notFoundTriggered:!1,previousPathname:e.pathname}:{notFoundTriggered:t.notFoundTriggered,previousPathname:e.pathname}}render(){return this.state.notFoundTriggered?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("meta",{name:"robots",content:"noindex"}),!1,this.props.notFoundStyles,this.props.notFound]}):this.props.children}constructor(e){super(e),this.state={notFoundTriggered:!!e.asNotFound,previousPathname:e.pathname}}}function s(e){let{notFound:t,notFoundStyles:n,asNotFound:r,children:a}=e,s=(0,l.usePathname)(),f=(0,u.useContext)(i.MissingSlotContext);return t?(0,o.jsx)(c,{pathname:s,notFound:t,notFoundStyles:n,asNotFound:r,missingSlots:f,children:a}):(0,o.jsx)(o.Fragment,{children:a})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},98200:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{isNotFoundError:function(){return o},notFound:function(){return r}});let n="NEXT_NOT_FOUND";function r(){let e=Error(n);throw e.digest=n,e}function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},29744:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"PromiseQueue",{enumerable:!0,get:function(){return c}});let r=n(2522),o=n(90675);var u=o._("_maxConcurrency"),l=o._("_runningCount"),a=o._("_queue"),i=o._("_processNext");class c{enqueue(e){let t,n;let o=new Promise((e,r)=>{t=e,n=r}),u=async()=>{try{r._(this,l)[l]++;let n=await e();t(n)}catch(e){n(e)}finally{r._(this,l)[l]--,r._(this,i)[i]()}};return r._(this,a)[a].push({promiseFn:o,task:u}),r._(this,i)[i](),o}bump(e){let t=r._(this,a)[a].findIndex(t=>t.promiseFn===e);if(t>-1){let e=r._(this,a)[a].splice(t,1)[0];r._(this,a)[a].unshift(e),r._(this,i)[i](!0)}}constructor(e=5){Object.defineProperty(this,i,{value:s}),Object.defineProperty(this,u,{writable:!0,value:void 0}),Object.defineProperty(this,l,{writable:!0,value:void 0}),Object.defineProperty(this,a,{writable:!0,value:void 0}),r._(this,u)[u]=e,r._(this,l)[l]=0,r._(this,a)[a]=[]}}function s(e){if(void 0===e&&(e=!1),(r._(this,l)[l]0){var t;null==(t=r._(this,a)[a].shift())||t.task()}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4123:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{RedirectBoundary:function(){return s},RedirectErrorBoundary:function(){return c}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(35475),a=n(88968);function i(e){let{redirect:t,reset:n,redirectType:r}=e,o=(0,l.useRouter)();return(0,u.useEffect)(()=>{u.default.startTransition(()=>{r===a.RedirectType.push?o.push(t,{}):o.replace(t,{}),n()})},[t,r,n,o]),null}class c extends u.default.Component{static getDerivedStateFromError(e){if((0,a.isRedirectError)(e))return{redirect:(0,a.getURLFromRedirectError)(e),redirectType:(0,a.getRedirectTypeFromError)(e)};throw e}render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&null!==t?(0,o.jsx)(i,{redirect:e,redirectType:t,reset:()=>this.setState({redirect:null})}):this.props.children}constructor(e){super(e),this.state={redirect:null,redirectType:null}}}function s(e){let{children:t}=e,n=(0,l.useRouter)();return(0,o.jsx)(c,{router:n,children:t})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5001:function(e,t){"use strict";var n,r;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"RedirectStatusCode",{enumerable:!0,get:function(){return n}}),(r=n||(n={}))[r.SeeOther=303]="SeeOther",r[r.TemporaryRedirect=307]="TemporaryRedirect",r[r.PermanentRedirect=308]="PermanentRedirect",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},88968:function(e,t,n){"use strict";var r,o;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{RedirectType:function(){return r},getRedirectError:function(){return c},getRedirectStatusCodeFromError:function(){return y},getRedirectTypeFromError:function(){return h},getURLFromRedirectError:function(){return p},isRedirectError:function(){return d},permanentRedirect:function(){return f},redirect:function(){return s}});let u=n(20544),l=n(90295),a=n(5001),i="NEXT_REDIRECT";function c(e,t,n){void 0===n&&(n=a.RedirectStatusCode.TemporaryRedirect);let r=Error(i);r.digest=i+";"+t+";"+e+";"+n+";";let o=u.requestAsyncStorage.getStore();return o&&(r.mutableCookies=o.mutableCookies),r}function s(e,t){void 0===t&&(t="replace");let n=l.actionAsyncStorage.getStore();throw c(e,t,(null==n?void 0:n.isAction)?a.RedirectStatusCode.SeeOther:a.RedirectStatusCode.TemporaryRedirect)}function f(e,t){void 0===t&&(t="replace");let n=l.actionAsyncStorage.getStore();throw c(e,t,(null==n?void 0:n.isAction)?a.RedirectStatusCode.SeeOther:a.RedirectStatusCode.PermanentRedirect)}function d(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let[t,n,r,o]=e.digest.split(";",4),u=Number(o);return t===i&&("replace"===n||"push"===n)&&"string"==typeof r&&!isNaN(u)&&u in a.RedirectStatusCode}function p(e){return d(e)?e.digest.split(";",3)[2]:null}function h(e){if(!d(e))throw Error("Not a redirect error");return e.digest.split(";",2)[1]}function y(e){if(!d(e))throw Error("Not a redirect error");return Number(e.digest.split(";",4)[3])}(o=r||(r={})).push="push",o.replace="replace",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},36423:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return a}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(61956);function a(){let e=(0,u.useContext)(l.TemplateContext);return(0,o.jsx)(o.Fragment,{children:e})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},20544:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{getExpectedRequestStore:function(){return o},requestAsyncStorage:function(){return r.requestAsyncStorage}});let r=n(25575);function o(e){let t=r.requestAsyncStorage.getStore();if(t)return t;throw Error("`"+e+"` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context")}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},22356:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"applyFlightData",{enumerable:!0,get:function(){return u}});let r=n(27420),o=n(92576);function u(e,t,n,u){let[l,a,i]=n.slice(-3);if(null===a)return!1;if(3===n.length){let n=a[2],o=a[3];t.loading=o,t.rsc=n,t.prefetchRsc=null,(0,r.fillLazyItemsTillLeafWithHead)(t,e,l,a,i,u)}else t.rsc=e.rsc,t.prefetchRsc=e.prefetchRsc,t.parallelRoutes=new Map(e.parallelRoutes),t.loading=e.loading,(0,o.fillCacheWithNewSubTreeData)(t,e,n,u);return!0}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},81935:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"applyRouterStatePatchToTree",{enumerable:!0,get:function(){return function e(t,n,r,a){let i;let[c,s,f,d,p]=n;if(1===t.length){let e=l(n,r,t);return(0,u.addRefreshMarkerToActiveParallelSegments)(e,a),e}let[h,y]=t;if(!(0,o.matchSegment)(h,c))return null;if(2===t.length)i=l(s[y],r,t);else if(null===(i=e(t.slice(2),s[y],r,a)))return null;let _=[t[0],{...s,[y]:i},f,d];return p&&(_[4]=!0),(0,u.addRefreshMarkerToActiveParallelSegments)(_,a),_}}});let r=n(84541),o=n(76015),u=n(50232);function l(e,t,n){let[u,a]=e,[i,c]=t;if(i===r.DEFAULT_SEGMENT_KEY&&u!==r.DEFAULT_SEGMENT_KEY)return e;if((0,o.matchSegment)(u,i)){let t={};for(let e in a)void 0!==c[e]?t[e]=l(a[e],c[e],n):t[e]=a[e];for(let e in c)t[e]||(t[e]=c[e]);let r=[u,t];return e[2]&&(r[2]=e[2]),e[3]&&(r[3]=e[3]),e[4]&&(r[4]=e[4]),r}return t}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},65556:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"clearCacheNodeDataForSegmentPath",{enumerable:!0,get:function(){return function e(t,n,o){let u=o.length<=2,[l,a]=o,i=(0,r.createRouterCacheKey)(a),c=n.parallelRoutes.get(l),s=t.parallelRoutes.get(l);s&&s!==c||(s=new Map(c),t.parallelRoutes.set(l,s));let f=null==c?void 0:c.get(i),d=s.get(i);if(u){d&&d.lazyData&&d!==f||s.set(i,{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null});return}if(!d||!f){d||s.set(i,{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null});return}return d===f&&(d={lazyData:d.lazyData,rsc:d.rsc,prefetchRsc:d.prefetchRsc,head:d.head,prefetchHead:d.prefetchHead,parallelRoutes:new Map(d.parallelRoutes),lazyDataResolved:d.lazyDataResolved,loading:d.loading},s.set(i,d)),e(d,f,o.slice(2))}}});let r=n(78505);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5410:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{computeChangedPath:function(){return s},extractPathFromFlightRouterState:function(){return c}});let r=n(91182),o=n(84541),u=n(76015),l=e=>"/"===e[0]?e.slice(1):e,a=e=>"string"==typeof e?"children"===e?"":e:e[1];function i(e){return e.reduce((e,t)=>""===(t=l(t))||(0,o.isGroupSegment)(t)?e:e+"/"+t,"")||"/"}function c(e){var t;let n=Array.isArray(e[0])?e[0][1]:e[0];if(n===o.DEFAULT_SEGMENT_KEY||r.INTERCEPTION_ROUTE_MARKERS.some(e=>n.startsWith(e)))return;if(n.startsWith(o.PAGE_SEGMENT_KEY))return"";let u=[a(n)],l=null!=(t=e[1])?t:{},s=l.children?c(l.children):void 0;if(void 0!==s)u.push(s);else for(let[e,t]of Object.entries(l)){if("children"===e)continue;let n=c(t);void 0!==n&&u.push(n)}return i(u)}function s(e,t){let n=function e(t,n){let[o,l]=t,[i,s]=n,f=a(o),d=a(i);if(r.INTERCEPTION_ROUTE_MARKERS.some(e=>f.startsWith(e)||d.startsWith(e)))return"";if(!(0,u.matchSegment)(o,i)){var p;return null!=(p=c(n))?p:""}for(let t in l)if(s[t]){let n=e(l[t],s[t]);if(null!==n)return a(i)+"/"+n}return null}(e,t);return null==n||"/"===n?n:i(n.split("/"))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},33456:function(e,t){"use strict";function n(e,t){return void 0===t&&(t=!0),e.pathname+e.search+(t?e.hash:"")}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createHrefFromUrl",{enumerable:!0,get:function(){return n}}),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},82952:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createInitialRouterState",{enumerable:!0,get:function(){return c}});let r=n(33456),o=n(27420),u=n(5410),l=n(60305),a=n(24673),i=n(50232);function c(e){var t;let{buildId:n,initialTree:c,initialSeedData:s,urlParts:f,initialParallelRoutes:d,location:p,initialHead:h,couldBeIntercepted:y}=e,_=f.join("/"),v=!p,b={lazyData:null,rsc:s[2],prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:v?new Map:d,lazyDataResolved:!1,loading:s[3]},g=p?(0,r.createHrefFromUrl)(p):_;(0,i.addRefreshMarkerToActiveParallelSegments)(c,g);let m=new Map;(null===d||0===d.size)&&(0,o.fillLazyItemsTillLeafWithHead)(b,void 0,c,s,h);let R={buildId:n,tree:c,cache:b,prefetchCache:m,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:{apply:!1,onlyHashChange:!1,hashFragment:null,segmentPaths:[]},canonicalUrl:g,nextUrl:null!=(t=(0,u.extractPathFromFlightRouterState)(c)||(null==p?void 0:p.pathname))?t:null};if(p){let e=new URL(""+p.pathname+p.search,p.origin),t=[["",c,null,null]];(0,l.createPrefetchCacheEntryForInitialLoad)({url:e,kind:a.PrefetchKind.AUTO,data:[t,void 0,!1,y],tree:R.tree,prefetchCache:R.prefetchCache,nextUrl:R.nextUrl})}return R}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},78505:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createRouterCacheKey",{enumerable:!0,get:function(){return o}});let r=n(84541);function o(e,t){return(void 0===t&&(t=!1),Array.isArray(e))?e[0]+"|"+e[1]+"|"+e[2]:t&&e.startsWith(r.PAGE_SEGMENT_KEY)?r.PAGE_SEGMENT_KEY:e}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},44848:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"fetchServerResponse",{enumerable:!0,get:function(){return s}});let r=n(6866),o=n(12846),u=n(83079),l=n(24673),a=n(37207),{createFromFetch:i}=n(6671);function c(e){return[(0,o.urlToUrlWithoutFlightMarker)(e).toString(),void 0,!1,!1]}async function s(e,t,n,s,f){let d={[r.RSC_HEADER]:"1",[r.NEXT_ROUTER_STATE_TREE]:encodeURIComponent(JSON.stringify(t))};f===l.PrefetchKind.AUTO&&(d[r.NEXT_ROUTER_PREFETCH_HEADER]="1"),n&&(d[r.NEXT_URL]=n);let p=(0,a.hexHash)([d[r.NEXT_ROUTER_PREFETCH_HEADER]||"0",d[r.NEXT_ROUTER_STATE_TREE],d[r.NEXT_URL]].join(","));try{var h;let t=new URL(e);t.pathname.endsWith("/")?t.pathname+="index.txt":t.pathname+=".txt",t.searchParams.set(r.NEXT_RSC_UNION_QUERY,p);let n=await fetch(t,{credentials:"same-origin",headers:d}),l=(0,o.urlToUrlWithoutFlightMarker)(n.url),a=n.redirected?l:void 0,f=n.headers.get("content-type")||"",y=!!n.headers.get(r.NEXT_DID_POSTPONE_HEADER),_=!!(null==(h=n.headers.get("vary"))?void 0:h.includes(r.NEXT_URL)),v=f===r.RSC_CONTENT_TYPE_HEADER;if(v||(v=f.startsWith("text/plain")),!v||!n.ok)return e.hash&&(l.hash=e.hash),c(l.toString());let[b,g]=await i(Promise.resolve(n),{callServer:u.callServer});if(s!==b)return c(n.url);return[g,a,y,_]}catch(t){return console.error("Failed to fetch RSC payload for "+e+". Falling back to browser navigation.",t),[e.toString(),void 0,!1,!1]}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},92576:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"fillCacheWithNewSubTreeData",{enumerable:!0,get:function(){return function e(t,n,l,a){let i=l.length<=5,[c,s]=l,f=(0,u.createRouterCacheKey)(s),d=n.parallelRoutes.get(c);if(!d)return;let p=t.parallelRoutes.get(c);p&&p!==d||(p=new Map(d),t.parallelRoutes.set(c,p));let h=d.get(f),y=p.get(f);if(i){if(!y||!y.lazyData||y===h){let e=l[3];y={lazyData:null,rsc:e[2],prefetchRsc:null,head:null,prefetchHead:null,loading:e[3],parallelRoutes:h?new Map(h.parallelRoutes):new Map,lazyDataResolved:!1},h&&(0,r.invalidateCacheByRouterState)(y,h,l[2]),(0,o.fillLazyItemsTillLeafWithHead)(y,h,l[2],e,l[4],a),p.set(f,y)}return}y&&h&&(y===h&&(y={lazyData:y.lazyData,rsc:y.rsc,prefetchRsc:y.prefetchRsc,head:y.head,prefetchHead:y.prefetchHead,parallelRoutes:new Map(y.parallelRoutes),lazyDataResolved:!1,loading:y.loading},p.set(f,y)),e(y,h,l.slice(2),a))}}});let r=n(94377),o=n(27420),u=n(78505);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},27420:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"fillLazyItemsTillLeafWithHead",{enumerable:!0,get:function(){return function e(t,n,u,l,a,i){if(0===Object.keys(u[1]).length){t.head=a;return}for(let c in u[1]){let s;let f=u[1][c],d=f[0],p=(0,r.createRouterCacheKey)(d),h=null!==l&&void 0!==l[1][c]?l[1][c]:null;if(n){let r=n.parallelRoutes.get(c);if(r){let n;let u=(null==i?void 0:i.kind)==="auto"&&i.status===o.PrefetchCacheEntryStatus.reusable,l=new Map(r),s=l.get(p);n=null!==h?{lazyData:null,rsc:h[2],prefetchRsc:null,head:null,prefetchHead:null,loading:h[3],parallelRoutes:new Map(null==s?void 0:s.parallelRoutes),lazyDataResolved:!1}:u&&s?{lazyData:s.lazyData,rsc:s.rsc,prefetchRsc:s.prefetchRsc,head:s.head,prefetchHead:s.prefetchHead,parallelRoutes:new Map(s.parallelRoutes),lazyDataResolved:s.lazyDataResolved,loading:s.loading}:{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map(null==s?void 0:s.parallelRoutes),lazyDataResolved:!1,loading:null},l.set(p,n),e(n,s,f,h||null,a,i),t.parallelRoutes.set(c,l);continue}}if(null!==h){let e=h[2],t=h[3];s={lazyData:null,rsc:e,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:t}}else s={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null};let y=t.parallelRoutes.get(c);y?y.set(p,s):t.parallelRoutes.set(c,new Map([[p,s]])),e(s,void 0,f,h,a,i)}}}});let r=n(78505),o=n(24673);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},44510:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"handleMutable",{enumerable:!0,get:function(){return u}});let r=n(5410);function o(e){return void 0!==e}function u(e,t){var n,u,l;let a=null==(u=t.shouldScroll)||u,i=e.nextUrl;if(o(t.patchedTree)){let n=(0,r.computeChangedPath)(e.tree,t.patchedTree);n?i=n:i||(i=e.canonicalUrl)}return{buildId:e.buildId,canonicalUrl:o(t.canonicalUrl)?t.canonicalUrl===e.canonicalUrl?e.canonicalUrl:t.canonicalUrl:e.canonicalUrl,pushRef:{pendingPush:o(t.pendingPush)?t.pendingPush:e.pushRef.pendingPush,mpaNavigation:o(t.mpaNavigation)?t.mpaNavigation:e.pushRef.mpaNavigation,preserveCustomHistoryState:o(t.preserveCustomHistoryState)?t.preserveCustomHistoryState:e.pushRef.preserveCustomHistoryState},focusAndScrollRef:{apply:!!a&&(!!o(null==t?void 0:t.scrollableSegments)||e.focusAndScrollRef.apply),onlyHashChange:!!t.hashFragment&&e.canonicalUrl.split("#",1)[0]===(null==(n=t.canonicalUrl)?void 0:n.split("#",1)[0]),hashFragment:a?t.hashFragment&&""!==t.hashFragment?decodeURIComponent(t.hashFragment.slice(1)):e.focusAndScrollRef.hashFragment:null,segmentPaths:a?null!=(l=null==t?void 0:t.scrollableSegments)?l:e.focusAndScrollRef.segmentPaths:[]},cache:t.cache?t.cache:e.cache,prefetchCache:t.prefetchCache?t.prefetchCache:e.prefetchCache,tree:o(t.patchedTree)?t.patchedTree:e.tree,nextUrl:i}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77831:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"handleSegmentMismatch",{enumerable:!0,get:function(){return o}});let r=n(95967);function o(e,t,n){return(0,r.handleExternalUrl)(e,{},e.canonicalUrl,!0)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77058:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"invalidateCacheBelowFlightSegmentPath",{enumerable:!0,get:function(){return function e(t,n,o){let u=o.length<=2,[l,a]=o,i=(0,r.createRouterCacheKey)(a),c=n.parallelRoutes.get(l);if(!c)return;let s=t.parallelRoutes.get(l);if(s&&s!==c||(s=new Map(c),t.parallelRoutes.set(l,s)),u){s.delete(i);return}let f=c.get(i),d=s.get(i);d&&f&&(d===f&&(d={lazyData:d.lazyData,rsc:d.rsc,prefetchRsc:d.prefetchRsc,head:d.head,prefetchHead:d.prefetchHead,parallelRoutes:new Map(d.parallelRoutes),lazyDataResolved:d.lazyDataResolved},s.set(i,d)),e(d,f,o.slice(2)))}}});let r=n(78505);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},94377:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"invalidateCacheByRouterState",{enumerable:!0,get:function(){return o}});let r=n(78505);function o(e,t,n){for(let o in n[1]){let u=n[1][o][0],l=(0,r.createRouterCacheKey)(u),a=t.parallelRoutes.get(o);if(a){let t=new Map(a);t.delete(l),e.parallelRoutes.set(o,t)}}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},63237:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isNavigatingToNewRootLayout",{enumerable:!0,get:function(){return function e(t,n){let r=t[0],o=n[0];if(Array.isArray(r)&&Array.isArray(o)){if(r[0]!==o[0]||r[2]!==o[2])return!0}else if(r!==o)return!0;if(t[4])return!n[4];if(n[4])return!0;let u=Object.values(t[1])[0],l=Object.values(n[1])[0];return!u||!l||e(u,l)}}}),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},56118:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{abortTask:function(){return c},listenForDynamicRequest:function(){return a},updateCacheNodeOnNavigation:function(){return function e(t,n,a,c,s){let f=n[1],d=a[1],p=c[1],h=t.parallelRoutes,y=new Map(h),_={},v=null;for(let t in d){let n;let a=d[t],c=f[t],b=h.get(t),g=p[t],m=a[0],R=(0,u.createRouterCacheKey)(m),P=void 0!==c?c[0]:void 0,j=void 0!==b?b.get(R):void 0;if(null!==(n=m===r.PAGE_SEGMENT_KEY?l(a,void 0!==g?g:null,s):m===r.DEFAULT_SEGMENT_KEY?void 0!==c?{route:c,node:null,children:null}:l(a,void 0!==g?g:null,s):void 0!==P&&(0,o.matchSegment)(m,P)&&void 0!==j&&void 0!==c?null!=g?e(j,c,a,g,s):function(e){let t=i(e,null,null);return{route:e,node:t,children:null}}(a):l(a,void 0!==g?g:null,s))){null===v&&(v=new Map),v.set(t,n);let e=n.node;if(null!==e){let n=new Map(b);n.set(R,e),y.set(t,n)}_[t]=n.route}else _[t]=a}if(null===v)return null;let b={lazyData:null,rsc:t.rsc,prefetchRsc:t.prefetchRsc,head:t.head,prefetchHead:t.prefetchHead,loading:t.loading,parallelRoutes:y,lazyDataResolved:!1};return{route:function(e,t){let n=[e[0],t];return 2 in e&&(n[2]=e[2]),3 in e&&(n[3]=e[3]),4 in e&&(n[4]=e[4]),n}(a,_),node:b,children:v}}},updateCacheNodeOnPopstateRestoration:function(){return function e(t,n){let r=n[1],o=t.parallelRoutes,l=new Map(o);for(let t in r){let n=r[t],a=n[0],i=(0,u.createRouterCacheKey)(a),c=o.get(t);if(void 0!==c){let r=c.get(i);if(void 0!==r){let o=e(r,n),u=new Map(c);u.set(i,o),l.set(t,u)}}}let a=t.rsc,i=d(a)&&"pending"===a.status;return{lazyData:null,rsc:a,head:t.head,prefetchHead:i?t.prefetchHead:null,prefetchRsc:i?t.prefetchRsc:null,loading:i?t.loading:null,parallelRoutes:l,lazyDataResolved:!1}}}});let r=n(84541),o=n(76015),u=n(78505);function l(e,t,n){let r=i(e,t,n);return{route:e,node:r,children:null}}function a(e,t){t.then(t=>{for(let n of t[0]){let t=n.slice(0,-3),r=n[n.length-3],l=n[n.length-2],a=n[n.length-1];"string"!=typeof t&&function(e,t,n,r,l){let a=e;for(let e=0;e{c(e,t)})}function i(e,t,n){let r=e[1],o=null!==t?t[1]:null,l=new Map;for(let e in r){let t=r[e],a=null!==o?o[e]:null,c=t[0],s=(0,u.createRouterCacheKey)(c),f=i(t,void 0===a?null:a,n),d=new Map;d.set(s,f),l.set(e,d)}let a=0===l.size,c=null!==t?t[2]:null,s=null!==t?t[3]:null;return{lazyData:null,parallelRoutes:l,prefetchRsc:void 0!==c?c:null,prefetchHead:a?n:null,loading:void 0!==s?s:null,rsc:p(),head:a?p():null,lazyDataResolved:!1}}function c(e,t){let n=e.node;if(null===n)return;let r=e.children;if(null===r)s(e.route,n,t);else for(let e of r.values())c(e,t);e.node=null}function s(e,t,n){let r=e[1],o=t.parallelRoutes;for(let e in r){let t=r[e],l=o.get(e);if(void 0===l)continue;let a=t[0],i=(0,u.createRouterCacheKey)(a),c=l.get(i);void 0!==c&&s(t,c,n)}let l=t.rsc;d(l)&&(null===n?l.resolve(null):l.reject(n));let a=t.head;d(a)&&a.resolve(null)}let f=Symbol();function d(e){return e&&e.tag===f}function p(){let e,t;let n=new Promise((n,r)=>{e=n,t=r});return n.status="pending",n.resolve=t=>{"pending"===n.status&&(n.status="fulfilled",n.value=t,e(t))},n.reject=e=>{"pending"===n.status&&(n.status="rejected",n.reason=e,t(e))},n.tag=f,n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},60305:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{createPrefetchCacheEntryForInitialLoad:function(){return c},getOrCreatePrefetchCacheEntry:function(){return i},prunePrefetchCache:function(){return f}});let r=n(33456),o=n(44848),u=n(24673),l=n(24819);function a(e,t){let n=(0,r.createHrefFromUrl)(e,!1);return t?t+"%"+n:n}function i(e){let t,{url:n,nextUrl:r,tree:o,buildId:l,prefetchCache:i,kind:c}=e,f=a(n,r),d=i.get(f);if(d)t=d;else{let e=a(n),r=i.get(e);r&&(t=r)}return t?(t.status=h(t),t.kind!==u.PrefetchKind.FULL&&c===u.PrefetchKind.FULL)?s({tree:o,url:n,buildId:l,nextUrl:r,prefetchCache:i,kind:null!=c?c:u.PrefetchKind.TEMPORARY}):(c&&t.kind===u.PrefetchKind.TEMPORARY&&(t.kind=c),t):s({tree:o,url:n,buildId:l,nextUrl:r,prefetchCache:i,kind:c||u.PrefetchKind.TEMPORARY})}function c(e){let{nextUrl:t,tree:n,prefetchCache:r,url:o,kind:l,data:i}=e,[,,,c]=i,s=c?a(o,t):a(o),f={treeAtTimeOfPrefetch:n,data:Promise.resolve(i),kind:l,prefetchTime:Date.now(),lastUsedTime:Date.now(),key:s,status:u.PrefetchCacheEntryStatus.fresh};return r.set(s,f),f}function s(e){let{url:t,kind:n,tree:r,nextUrl:i,buildId:c,prefetchCache:s}=e,f=a(t),d=l.prefetchQueue.enqueue(()=>(0,o.fetchServerResponse)(t,r,i,c,n).then(e=>{let[,,,n]=e;return n&&function(e){let{url:t,nextUrl:n,prefetchCache:r}=e,o=a(t),u=r.get(o);if(!u)return;let l=a(t,n);r.set(l,u),r.delete(o)}({url:t,nextUrl:i,prefetchCache:s}),e})),p={treeAtTimeOfPrefetch:r,data:d,kind:n,prefetchTime:Date.now(),lastUsedTime:null,key:f,status:u.PrefetchCacheEntryStatus.fresh};return s.set(f,p),p}function f(e){for(let[t,n]of e)h(n)===u.PrefetchCacheEntryStatus.expired&&e.delete(t)}let d=1e3*Number("30"),p=1e3*Number("300");function h(e){let{kind:t,prefetchTime:n,lastUsedTime:r}=e;return Date.now()<(null!=r?r:n)+d?r?u.PrefetchCacheEntryStatus.reusable:u.PrefetchCacheEntryStatus.fresh:"auto"===t&&Date.now(){let[n,f]=t,h=!1;if(S.lastUsedTime||(S.lastUsedTime=Date.now(),h=!0),"string"==typeof n)return _(e,R,n,O);if(document.getElementById("__next-page-redirect"))return _(e,R,j,O);let b=e.tree,g=e.cache,w=[];for(let t of n){let n=t.slice(0,-4),r=t.slice(-3)[0],c=["",...n],f=(0,u.applyRouterStatePatchToTree)(c,b,r,j);if(null===f&&(f=(0,u.applyRouterStatePatchToTree)(c,E,r,j)),null!==f){if((0,a.isNavigatingToNewRootLayout)(b,f))return _(e,R,j,O);let u=(0,d.createEmptyCacheNode)(),m=!1;for(let e of(S.status!==i.PrefetchCacheEntryStatus.stale||h?m=(0,s.applyFlightData)(g,u,t,S):(m=function(e,t,n,r){let o=!1;for(let u of(e.rsc=t.rsc,e.prefetchRsc=t.prefetchRsc,e.loading=t.loading,e.parallelRoutes=new Map(t.parallelRoutes),v(r).map(e=>[...n,...e])))(0,y.clearCacheNodeDataForSegmentPath)(e,t,u),o=!0;return o}(u,g,n,r),S.lastUsedTime=Date.now()),(0,l.shouldHardNavigate)(c,b)?(u.rsc=g.rsc,u.prefetchRsc=g.prefetchRsc,(0,o.invalidateCacheBelowFlightSegmentPath)(u,g,n),R.cache=u):m&&(R.cache=u,g=u),b=f,v(r))){let t=[...n,...e];t[t.length-1]!==p.DEFAULT_SEGMENT_KEY&&w.push(t)}}}return R.patchedTree=b,R.canonicalUrl=f?(0,r.createHrefFromUrl)(f):j,R.pendingPush=O,R.scrollableSegments=w,R.hashFragment=P,R.shouldScroll=m,(0,c.handleMutable)(e,R)},()=>e)};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},24819:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{prefetchQueue:function(){return l},prefetchReducer:function(){return a}});let r=n(6866),o=n(29744),u=n(60305),l=new o.PromiseQueue(5);function a(e,t){(0,u.prunePrefetchCache)(e.prefetchCache);let{url:n}=t;return n.searchParams.delete(r.NEXT_RSC_UNION_QUERY),(0,u.getOrCreatePrefetchCacheEntry)({url:n,nextUrl:e.nextUrl,prefetchCache:e.prefetchCache,kind:t.kind,tree:e.tree,buildId:e.buildId}),e}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},99601:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"refreshReducer",{enumerable:!0,get:function(){return h}});let r=n(44848),o=n(33456),u=n(81935),l=n(63237),a=n(95967),i=n(44510),c=n(27420),s=n(12846),f=n(77831),d=n(28077),p=n(50232);function h(e,t){let{origin:n}=t,h={},y=e.canonicalUrl,_=e.tree;h.preserveCustomHistoryState=!1;let v=(0,s.createEmptyCacheNode)(),b=(0,d.hasInterceptionRouteInCurrentTree)(e.tree);return v.lazyData=(0,r.fetchServerResponse)(new URL(y,n),[_[0],_[1],_[2],"refetch"],b?e.nextUrl:null,e.buildId),v.lazyData.then(async n=>{let[r,s]=n;if("string"==typeof r)return(0,a.handleExternalUrl)(e,h,r,e.pushRef.pendingPush);for(let n of(v.lazyData=null,r)){if(3!==n.length)return console.log("REFRESH FAILED"),e;let[r]=n,i=(0,u.applyRouterStatePatchToTree)([""],_,r,e.canonicalUrl);if(null===i)return(0,f.handleSegmentMismatch)(e,t,r);if((0,l.isNavigatingToNewRootLayout)(_,i))return(0,a.handleExternalUrl)(e,h,y,e.pushRef.pendingPush);let d=s?(0,o.createHrefFromUrl)(s):void 0;s&&(h.canonicalUrl=d);let[g,m]=n.slice(-2);if(null!==g){let e=g[2];v.rsc=e,v.prefetchRsc=null,(0,c.fillLazyItemsTillLeafWithHead)(v,void 0,r,g,m),h.prefetchCache=new Map}await (0,p.refreshInactiveParallelSegments)({state:e,updatedTree:i,updatedCache:v,includeNextUrl:b,canonicalUrl:h.canonicalUrl||e.canonicalUrl}),h.cache=v,h.patchedTree=i,h.canonicalUrl=y,_=i}return(0,i.handleMutable)(e,h)},()=>e)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77784:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"restoreReducer",{enumerable:!0,get:function(){return u}});let r=n(33456),o=n(5410);function u(e,t){var n;let{url:u,tree:l}=t,a=(0,r.createHrefFromUrl)(u),i=l||e.tree,c=e.cache;return{buildId:e.buildId,canonicalUrl:a,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:e.focusAndScrollRef,cache:c,prefetchCache:e.prefetchCache,tree:i,nextUrl:null!=(n=(0,o.extractPathFromFlightRouterState)(i))?n:u.pathname}}n(56118),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},13722:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"serverActionReducer",{enumerable:!0,get:function(){return g}});let r=n(83079),o=n(6866),u=n(1634),l=n(33456),a=n(95967),i=n(81935),c=n(63237),s=n(44510),f=n(27420),d=n(12846),p=n(28077),h=n(77831),y=n(50232),{createFromFetch:_,encodeReply:v}=n(6671);async function b(e,t,n){let l,{actionId:a,actionArgs:i}=n,c=await v(i),s=await fetch("",{method:"POST",headers:{Accept:o.RSC_CONTENT_TYPE_HEADER,[o.ACTION]:a,[o.NEXT_ROUTER_STATE_TREE]:encodeURIComponent(JSON.stringify(e.tree)),...t?{[o.NEXT_URL]:t}:{}},body:c}),f=s.headers.get("x-action-redirect");try{let e=JSON.parse(s.headers.get("x-action-revalidated")||"[[],0,0]");l={paths:e[0]||[],tag:!!e[1],cookie:e[2]}}catch(e){l={paths:[],tag:!1,cookie:!1}}let d=f?new URL((0,u.addBasePath)(f),new URL(e.canonicalUrl,window.location.href)):void 0;if(s.headers.get("content-type")===o.RSC_CONTENT_TYPE_HEADER){let e=await _(Promise.resolve(s),{callServer:r.callServer});if(f){let[,t]=null!=e?e:[];return{actionFlightData:t,redirectLocation:d,revalidatedParts:l}}let[t,[,n]]=null!=e?e:[];return{actionResult:t,actionFlightData:n,redirectLocation:d,revalidatedParts:l}}return{redirectLocation:d,revalidatedParts:l}}function g(e,t){let{resolve:n,reject:r}=t,o={},u=e.canonicalUrl,_=e.tree;o.preserveCustomHistoryState=!1;let v=e.nextUrl&&(0,p.hasInterceptionRouteInCurrentTree)(e.tree)?e.nextUrl:null;return o.inFlightServerAction=b(e,v,t),o.inFlightServerAction.then(async r=>{let{actionResult:p,actionFlightData:b,redirectLocation:g}=r;if(g&&(e.pushRef.pendingPush=!0,o.pendingPush=!0),!b)return(n(p),g)?(0,a.handleExternalUrl)(e,o,g.href,e.pushRef.pendingPush):e;if("string"==typeof b)return(0,a.handleExternalUrl)(e,o,b,e.pushRef.pendingPush);if(o.inFlightServerAction=null,g){let e=(0,l.createHrefFromUrl)(g,!1);o.canonicalUrl=e}for(let n of b){if(3!==n.length)return console.log("SERVER ACTION APPLY FAILED"),e;let[r]=n,s=(0,i.applyRouterStatePatchToTree)([""],_,r,g?(0,l.createHrefFromUrl)(g):e.canonicalUrl);if(null===s)return(0,h.handleSegmentMismatch)(e,t,r);if((0,c.isNavigatingToNewRootLayout)(_,s))return(0,a.handleExternalUrl)(e,o,u,e.pushRef.pendingPush);let[p,b]=n.slice(-2),m=null!==p?p[2]:null;if(null!==m){let t=(0,d.createEmptyCacheNode)();t.rsc=m,t.prefetchRsc=null,(0,f.fillLazyItemsTillLeafWithHead)(t,void 0,r,p,b),await (0,y.refreshInactiveParallelSegments)({state:e,updatedTree:s,updatedCache:t,includeNextUrl:!!v,canonicalUrl:o.canonicalUrl||e.canonicalUrl}),o.cache=t,o.prefetchCache=new Map}o.patchedTree=s,_=s}return n(p),(0,s.handleMutable)(e,o)},t=>(r(t),e))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},68448:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"serverPatchReducer",{enumerable:!0,get:function(){return f}});let r=n(33456),o=n(81935),u=n(63237),l=n(95967),a=n(22356),i=n(44510),c=n(12846),s=n(77831);function f(e,t){let{serverResponse:n}=t,[f,d]=n,p={};if(p.preserveCustomHistoryState=!1,"string"==typeof f)return(0,l.handleExternalUrl)(e,p,f,e.pushRef.pendingPush);let h=e.tree,y=e.cache;for(let n of f){let i=n.slice(0,-4),[f]=n.slice(-3,-2),_=(0,o.applyRouterStatePatchToTree)(["",...i],h,f,e.canonicalUrl);if(null===_)return(0,s.handleSegmentMismatch)(e,t,f);if((0,u.isNavigatingToNewRootLayout)(h,_))return(0,l.handleExternalUrl)(e,p,e.canonicalUrl,e.pushRef.pendingPush);let v=d?(0,r.createHrefFromUrl)(d):void 0;v&&(p.canonicalUrl=v);let b=(0,c.createEmptyCacheNode)();(0,a.applyFlightData)(y,b,n),p.patchedTree=_,p.cache=b,y=b,h=_}return(0,i.handleMutable)(e,p)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},50232:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{addRefreshMarkerToActiveParallelSegments:function(){return function e(t,n){let[r,o,,l]=t;for(let a in r.includes(u.PAGE_SEGMENT_KEY)&&"refresh"!==l&&(t[2]=n,t[3]="refresh"),o)e(o[a],n)}},refreshInactiveParallelSegments:function(){return l}});let r=n(22356),o=n(44848),u=n(84541);async function l(e){let t=new Set;await a({...e,rootTree:e.updatedTree,fetchedSegments:t})}async function a(e){let{state:t,updatedTree:n,updatedCache:u,includeNextUrl:l,fetchedSegments:i,rootTree:c=n,canonicalUrl:s}=e,[,f,d,p]=n,h=[];if(d&&d!==s&&"refresh"===p&&!i.has(d)){i.add(d);let e=(0,o.fetchServerResponse)(new URL(d,location.origin),[c[0],c[1],c[2],"refetch"],l?t.nextUrl:null,t.buildId).then(e=>{let t=e[0];if("string"!=typeof t)for(let e of t)(0,r.applyFlightData)(u,u,e)});h.push(e)}for(let e in f){let n=a({state:t,updatedTree:f[e],updatedCache:u,includeNextUrl:l,fetchedSegments:i,rootTree:c,canonicalUrl:s});h.push(n)}await Promise.all(h)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},24673:function(e,t){"use strict";var n,r,o,u;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ACTION_FAST_REFRESH:function(){return f},ACTION_NAVIGATE:function(){return a},ACTION_PREFETCH:function(){return s},ACTION_REFRESH:function(){return l},ACTION_RESTORE:function(){return i},ACTION_SERVER_ACTION:function(){return d},ACTION_SERVER_PATCH:function(){return c},PrefetchCacheEntryStatus:function(){return r},PrefetchKind:function(){return n},isThenable:function(){return p}});let l="refresh",a="navigate",i="restore",c="server-patch",s="prefetch",f="fast-refresh",d="server-action";function p(e){return e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}(o=n||(n={})).AUTO="auto",o.FULL="full",o.TEMPORARY="temporary",(u=r||(r={})).fresh="fresh",u.reusable="reusable",u.expired="expired",u.stale="stale",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},91450:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"reducer",{enumerable:!0,get:function(){return f}});let r=n(24673),o=n(95967),u=n(68448),l=n(77784),a=n(99601),i=n(24819),c=n(44529),s=n(13722),f="undefined"==typeof window?function(e,t){return e}:function(e,t){switch(t.type){case r.ACTION_NAVIGATE:return(0,o.navigateReducer)(e,t);case r.ACTION_SERVER_PATCH:return(0,u.serverPatchReducer)(e,t);case r.ACTION_RESTORE:return(0,l.restoreReducer)(e,t);case r.ACTION_REFRESH:return(0,a.refreshReducer)(e,t);case r.ACTION_FAST_REFRESH:return(0,c.fastRefreshReducer)(e,t);case r.ACTION_PREFETCH:return(0,i.prefetchReducer)(e,t);case r.ACTION_SERVER_ACTION:return(0,s.serverActionReducer)(e,t);default:throw Error("Unknown action")}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},53728:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"shouldHardNavigate",{enumerable:!0,get:function(){return function e(t,n){let[o,u]=n,[l,a]=t;return(0,r.matchSegment)(l,o)?!(t.length<=2)&&e(t.slice(2),u[a]):!!Array.isArray(l)}}});let r=n(76015);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},54535:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{createDynamicallyTrackedSearchParams:function(){return a},createUntrackedSearchParams:function(){return l}});let r=n(51845),o=n(86999),u=n(30650);function l(e){let t=r.staticGenerationAsyncStorage.getStore();return t&&t.forceStatic?{}:e}function a(e){let t=r.staticGenerationAsyncStorage.getStore();return t?t.forceStatic?{}:t.isStaticGeneration||t.dynamicShouldError?new Proxy({},{get:(e,n,r)=>("string"==typeof n&&(0,o.trackDynamicDataAccessed)(t,"searchParams."+n),u.ReflectAdapter.get(e,n,r)),has:(e,n)=>("string"==typeof n&&(0,o.trackDynamicDataAccessed)(t,"searchParams."+n),Reflect.has(e,n)),ownKeys:e=>((0,o.trackDynamicDataAccessed)(t,"searchParams"),Reflect.ownKeys(e))}):e:e}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},51845:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"staticGenerationAsyncStorage",{enumerable:!0,get:function(){return r.staticGenerationAsyncStorage}});let r=n(20030);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},36864:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{StaticGenBailoutError:function(){return r},isStaticGenBailoutError:function(){return o}});let n="NEXT_STATIC_GEN_BAILOUT";class r extends Error{constructor(...e){super(...e),this.code=n}}function o(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},38137:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"unresolvedThenable",{enumerable:!0,get:function(){return n}});let n={then:()=>{}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},47744:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{useReducerWithReduxDevtools:function(){return i},useUnwrapState:function(){return a}});let r=n(53099)._(n(2265)),o=n(24673),u=n(2103);function l(e){if(e instanceof Map){let t={};for(let[n,r]of e.entries()){if("function"==typeof r){t[n]="fn()";continue}if("object"==typeof r&&null!==r){if(r.$$typeof){t[n]=r.$$typeof.toString();continue}if(r._bundlerConfig){t[n]="FlightData";continue}}t[n]=l(r)}return t}if("object"==typeof e&&null!==e){let t={};for(let n in e){let r=e[n];if("function"==typeof r){t[n]="fn()";continue}if("object"==typeof r&&null!==r){if(r.$$typeof){t[n]=r.$$typeof.toString();continue}if(r.hasOwnProperty("_bundlerConfig")){t[n]="FlightData";continue}}t[n]=l(r)}return t}return Array.isArray(e)?e.map(l):e}function a(e){return(0,o.isThenable)(e)?(0,r.use)(e):e}let i="undefined"!=typeof window?function(e){let[t,n]=r.default.useState(e),o=(0,r.useContext)(u.ActionQueueContext);if(!o)throw Error("Invariant: Missing ActionQueueContext");let a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)(()=>{if(!a.current&&!1!==i.current){if(void 0===i.current&&void 0===window.__REDUX_DEVTOOLS_EXTENSION__){i.current=!1;return}return a.current=window.__REDUX_DEVTOOLS_EXTENSION__.connect({instanceId:8e3,name:"next-router"}),a.current&&(a.current.init(l(e)),o&&(o.devToolsInstance=a.current)),()=>{a.current=void 0}}},[e,o]),[t,(0,r.useCallback)(t=>{o.state||(o.state=e),o.dispatch(t,n)},[o,e]),(0,r.useCallback)(e=>{a.current&&a.current.send({type:"RENDER_SYNC"},l(e))},[])]}:function(e){return[e,()=>{},()=>{}]};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},11283:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"hasBasePath",{enumerable:!0,get:function(){return o}});let r=n(10580);function o(e){return(0,r.pathHasPrefix)(e,"/ui")}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},33068:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"normalizePathTrailingSlash",{enumerable:!0,get:function(){return u}});let r=n(26674),o=n(63381),u=e=>{if(!e.startsWith("/"))return e;let{pathname:t,query:n,hash:u}=(0,o.parsePath)(e);return""+(0,r.removeTrailingSlash)(t)+n+u};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},61404:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return o}});let r=n(18993);function o(e){let t="function"==typeof reportError?reportError:e=>{window.console.error(e)};(0,r.isBailoutToCSRError)(e)||t(e)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},35076:function(e,t,n){"use strict";function r(e){return(e=e.slice(3)).startsWith("/")||(e="/"+e),e}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"removeBasePath",{enumerable:!0,get:function(){return r}}),n(11283),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},12010:function(e,t){"use strict";function n(e,t){var n=e.length;for(e.push(t);0>>1,o=e[r];if(0>>1;ru(i,n))cu(s,i)?(e[r]=s,e[c]=n,r=c):(e[r]=i,e[a]=n,r=a);else if(cu(s,n))e[r]=s,e[c]=n,r=c;else break}}return t}function u(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var l,a=performance;t.unstable_now=function(){return a.now()}}else{var i=Date,c=i.now();t.unstable_now=function(){return i.now()-c}}var s=[],f=[],d=1,p=null,h=3,y=!1,_=!1,v=!1,b="function"==typeof setTimeout?setTimeout:null,g="function"==typeof clearTimeout?clearTimeout:null,m="undefined"!=typeof setImmediate?setImmediate:null;function R(e){for(var t=r(f);null!==t;){if(null===t.callback)o(f);else if(t.startTime<=e)o(f),t.sortIndex=t.expirationTime,n(s,t);else break;t=r(f)}}function P(e){if(v=!1,R(e),!_){if(null!==r(s))_=!0,C();else{var t=r(f);null!==t&&A(P,t.startTime-e)}}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var j=!1,O=-1,S=5,E=-1;function w(){return!(t.unstable_now()-Ee&&w());){var a=p.callback;if("function"==typeof a){p.callback=null,h=p.priorityLevel;var i=a(p.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof i){p.callback=i,R(e),n=!0;break t}p===r(s)&&o(s),R(e)}else o(s);p=r(s)}if(null!==p)n=!0;else{var c=r(f);null!==c&&A(P,c.startTime-e),n=!1}}break e}finally{p=null,h=u,y=!1}n=void 0}}finally{n?l():j=!1}}}if("function"==typeof m)l=function(){m(T)};else if("undefined"!=typeof MessageChannel){var M=new MessageChannel,x=M.port2;M.port1.onmessage=T,l=function(){x.postMessage(null)}}else l=function(){b(T,0)};function C(){j||(j=!0,l())}function A(e,n){O=b(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){_||y||(_=!0,C())},t.unstable_forceFrameRate=function(e){0>e||125l?(e.sortIndex=u,n(f,e),null===r(s)&&e===r(f)&&(v?(g(O),O=-1):v=!0,A(P,u-l))):(e.sortIndex=a,n(s,e),_||y||(_=!0,C())),e},t.unstable_shouldYield=w,t.unstable_wrapCallback=function(e){var t=h;return function(){var n=h;h=t;try{return e.apply(this,arguments)}finally{h=n}}}},71767:function(e,t,n){"use strict";e.exports=n(12010)},60934:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{getPathname:function(){return r},isFullStringUrl:function(){return o},parseUrl:function(){return u}});let n="http://n";function r(e){return new URL(e,n).pathname}function o(e){return/https?:\/\//.test(e)}function u(e){let t;try{t=new URL(e,n)}catch{}return t}},86999:function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{Postpone:function(){return d},createPostponedAbortSignal:function(){return b},createPrerenderState:function(){return c},formatDynamicAPIAccesses:function(){return _},markCurrentScopeAsDynamic:function(){return s},trackDynamicDataAccessed:function(){return f},trackDynamicFetch:function(){return p},usedDynamicAPIs:function(){return y}});let o=(r=n(2265))&&r.__esModule?r:{default:r},u=n(46177),l=n(36864),a=n(60934),i="function"==typeof o.default.unstable_postpone;function c(e){return{isDebugSkeleton:e,dynamicAccesses:[]}}function s(e,t){let n=(0,a.getPathname)(e.urlPathname);if(!e.isUnstableCacheCallback){if(e.dynamicShouldError)throw new l.StaticGenBailoutError(`Route ${n} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${t}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`);if(e.prerenderState)h(e.prerenderState,t,n);else if(e.revalidate=0,e.isStaticGeneration){let r=new u.DynamicServerError(`Route ${n} couldn't be rendered statically because it used ${t}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`);throw e.dynamicUsageDescription=t,e.dynamicUsageStack=r.stack,r}}}function f(e,t){let n=(0,a.getPathname)(e.urlPathname);if(e.isUnstableCacheCallback)throw Error(`Route ${n} used "${t}" inside a function cached with "unstable_cache(...)". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use "${t}" outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/app/api-reference/functions/unstable_cache`);if(e.dynamicShouldError)throw new l.StaticGenBailoutError(`Route ${n} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${t}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`);if(e.prerenderState)h(e.prerenderState,t,n);else if(e.revalidate=0,e.isStaticGeneration){let r=new u.DynamicServerError(`Route ${n} couldn't be rendered statically because it used \`${t}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`);throw e.dynamicUsageDescription=t,e.dynamicUsageStack=r.stack,r}}function d({reason:e,prerenderState:t,pathname:n}){h(t,e,n)}function p(e,t){e.prerenderState&&h(e.prerenderState,t,e.urlPathname)}function h(e,t,n){v();let r=`Route ${n} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`;e.dynamicAccesses.push({stack:e.isDebugSkeleton?Error().stack:void 0,expression:t}),o.default.unstable_postpone(r)}function y(e){return e.dynamicAccesses.length>0}function _(e){return e.dynamicAccesses.filter(e=>"string"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split("\n").slice(4).filter(e=>!(e.includes("node_modules/next/")||e.includes(" ()")||e.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${e}: -${t}`))}function v(){if(!i)throw Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js")}function b(e){v();let t=new AbortController;try{o.default.unstable_postpone(e)}catch(e){t.abort(e)}return t.signal}},87417:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getSegmentParam",{enumerable:!0,get:function(){return o}});let r=n(91182);function o(e){let t=r.INTERCEPTION_ROUTE_MARKERS.find(t=>e.startsWith(t));return(t&&(e=e.slice(t.length)),e.startsWith("[[...")&&e.endsWith("]]"))?{type:"optional-catchall",param:e.slice(5,-2)}:e.startsWith("[...")&&e.endsWith("]")?{type:t?"catchall-intercepted":"catchall",param:e.slice(4,-1)}:e.startsWith("[")&&e.endsWith("]")?{type:t?"dynamic-intercepted":"dynamic",param:e.slice(1,-1)}:null}},70647:function(e,t){"use strict";var n,r;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HMR_ACTIONS_SENT_TO_BROWSER",{enumerable:!0,get:function(){return n}}),(r=n||(n={})).ADDED_PAGE="addedPage",r.REMOVED_PAGE="removedPage",r.RELOAD_PAGE="reloadPage",r.SERVER_COMPONENT_CHANGES="serverComponentChanges",r.MIDDLEWARE_CHANGES="middlewareChanges",r.CLIENT_CHANGES="clientChanges",r.SERVER_ONLY_CHANGES="serverOnlyChanges",r.SYNC="sync",r.BUILT="built",r.BUILDING="building",r.DEV_PAGES_MANIFEST_UPDATE="devPagesManifestUpdate",r.TURBOPACK_MESSAGE="turbopack-message",r.SERVER_ERROR="serverError",r.TURBOPACK_CONNECTED="turbopack-connected"},91182:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{INTERCEPTION_ROUTE_MARKERS:function(){return o},extractInterceptionRouteInformation:function(){return l},isInterceptionRouteAppPath:function(){return u}});let r=n(20926),o=["(..)(..)","(.)","(..)","(...)"];function u(e){return void 0!==e.split("/").find(e=>o.find(t=>e.startsWith(t)))}function l(e){let t,n,u;for(let r of e.split("/"))if(n=o.find(e=>r.startsWith(e))){[t,u]=e.split(n,2);break}if(!t||!n||!u)throw Error(`Invalid interception route: ${e}. Must be in the format //(..|...|..)(..)/`);switch(t=(0,r.normalizeAppPath)(t),n){case"(.)":u="/"===t?`/${u}`:t+"/"+u;break;case"(..)":if("/"===t)throw Error(`Invalid interception route: ${e}. Cannot use (..) marker at the root level, use (.) instead.`);u=t.split("/").slice(0,-1).concat(u).join("/");break;case"(...)":u="/"+u;break;case"(..)(..)":let l=t.split("/");if(l.length<=2)throw Error(`Invalid interception route: ${e}. Cannot use (..)(..) marker at the root level or one level up.`);u=l.slice(0,-2).concat(u).join("/");break;default:throw Error("Invariant: unexpected marker")}return{interceptingRoute:t,interceptedRoute:u}}},30650:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ReflectAdapter",{enumerable:!0,get:function(){return n}});class n{static get(e,t,n){let r=Reflect.get(e,t,n);return"function"==typeof r?r.bind(e):r}static set(e,t,n,r){return Reflect.set(e,t,n,r)}static has(e,t){return Reflect.has(e,t)}static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}}},61956:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{AppRouterContext:function(){return o},GlobalLayoutRouterContext:function(){return l},LayoutRouterContext:function(){return u},MissingSlotContext:function(){return i},TemplateContext:function(){return a}});let r=n(47043)._(n(2265)),o=r.default.createContext(null),u=r.default.createContext(null),l=r.default.createContext(null),a=r.default.createContext(null),i=r.default.createContext(new Set)},37207:function(e,t){"use strict";function n(e){let t=5381;for(let n=0;n>>0}function r(e){return n(e).toString(36).slice(0,5)}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{djb2Hash:function(){return n},hexHash:function(){return r}})},48701:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HeadManagerContext",{enumerable:!0,get:function(){return r}});let r=n(47043)._(n(2265)).default.createContext({})},79060:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{PathParamsContext:function(){return l},PathnameContext:function(){return u},SearchParamsContext:function(){return o}});let r=n(2265),o=(0,r.createContext)(null),u=(0,r.createContext)(null),l=(0,r.createContext)(null)},18993:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{BailoutToCSRError:function(){return r},isBailoutToCSRError:function(){return o}});let n="BAILOUT_TO_CLIENT_SIDE_RENDERING";class r extends Error{constructor(e){super("Bail out to client-side rendering: "+e),this.reason=e,this.digest=n}}function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===n}},78162:function(e,t){"use strict";function n(e){return e.startsWith("/")?e:"/"+e}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ensureLeadingSlash",{enumerable:!0,get:function(){return n}})},2103:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ActionQueueContext:function(){return a},createMutableActionQueue:function(){return s}});let r=n(53099),o=n(24673),u=n(91450),l=r._(n(2265)),a=l.default.createContext(null);function i(e,t){null!==e.pending&&(e.pending=e.pending.next,null!==e.pending?c({actionQueue:e,action:e.pending,setState:t}):e.needsRefresh&&(e.needsRefresh=!1,e.dispatch({type:o.ACTION_REFRESH,origin:window.location.origin},t)))}async function c(e){let{actionQueue:t,action:n,setState:r}=e,u=t.state;if(!u)throw Error("Invariant: Router state not initialized");t.pending=n;let l=n.payload,a=t.action(u,l);function c(e){n.discarded||(t.state=e,t.devToolsInstance&&t.devToolsInstance.send(l,e),i(t,r),n.resolve(e))}(0,o.isThenable)(a)?a.then(c,e=>{i(t,r),n.reject(e)}):c(a)}function s(){let e={state:null,dispatch:(t,n)=>(function(e,t,n){let r={resolve:n,reject:()=>{}};if(t.type!==o.ACTION_RESTORE){let e=new Promise((e,t)=>{r={resolve:e,reject:t}});(0,l.startTransition)(()=>{n(e)})}let u={payload:t,next:null,resolve:r.resolve,reject:r.reject};null===e.pending?(e.last=u,c({actionQueue:e,action:u,setState:n})):t.type===o.ACTION_NAVIGATE||t.type===o.ACTION_RESTORE?(e.pending.discarded=!0,e.last=u,e.pending.payload.type===o.ACTION_SERVER_ACTION&&(e.needsRefresh=!0),c({actionQueue:e,action:u,setState:n})):(null!==e.last&&(e.last.next=u),e.last=u)})(e,t,n),action:async(e,t)=>{if(null===e)throw Error("Invariant: Router state not initialized");return(0,u.reducer)(e,t)},pending:null,last:null};return e}},68498:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addPathPrefix",{enumerable:!0,get:function(){return o}});let r=n(63381);function o(e,t){if(!e.startsWith("/")||!t)return e;let{pathname:n,query:o,hash:u}=(0,r.parsePath)(e);return""+t+n+o+u}},20926:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{normalizeAppPath:function(){return u},normalizeRscURL:function(){return l}});let r=n(78162),o=n(84541);function u(e){return(0,r.ensureLeadingSlash)(e.split("/").reduce((e,t,n,r)=>!t||(0,o.isGroupSegment)(t)||"@"===t[0]||("page"===t||"route"===t)&&n===r.length-1?e:e+"/"+t,""))}function l(e){return e.replace(/\.rsc($|\?)/,"$1")}},7092:function(e,t){"use strict";function n(e,t){if(void 0===t&&(t={}),t.onlyHashChange){e();return}let n=document.documentElement,r=n.style.scrollBehavior;n.style.scrollBehavior="auto",t.dontForceLayout||n.getClientRects(),e(),n.style.scrollBehavior=r}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"handleSmoothScroll",{enumerable:!0,get:function(){return n}})},86146:function(e,t){"use strict";function n(e){return/Googlebot|Mediapartners-Google|AdsBot-Google|googleweblight|Storebot-Google|Google-PageRenderer|Bingbot|BingPreview|Slurp|DuckDuckBot|baiduspider|yandex|sogou|LinkedInBot|bitlybot|tumblr|vkShare|quora link preview|facebookexternalhit|facebookcatalog|Twitterbot|applebot|redditbot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|ia_archiver/i.test(e)}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isBot",{enumerable:!0,get:function(){return n}})},63381:function(e,t){"use strict";function n(e){let t=e.indexOf("#"),n=e.indexOf("?"),r=n>-1&&(t<0||n-1?{pathname:e.substring(0,r?n:t),query:r?e.substring(n,t>-1?t:void 0):"",hash:t>-1?e.slice(t):""}:{pathname:e,query:"",hash:""}}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"parsePath",{enumerable:!0,get:function(){return n}})},10580:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"pathHasPrefix",{enumerable:!0,get:function(){return o}});let r=n(63381);function o(e,t){if("string"!=typeof e)return!1;let{pathname:n}=(0,r.parsePath)(e);return n===t||n.startsWith(t+"/")}},26674:function(e,t){"use strict";function n(e){return e.replace(/\/$/,"")||"/"}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return n}})},84541:function(e,t){"use strict";function n(e){return"("===e[0]&&e.endsWith(")")}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{DEFAULT_SEGMENT_KEY:function(){return o},PAGE_SEGMENT_KEY:function(){return r},isGroupSegment:function(){return n}});let r="__PAGE__",o="__DEFAULT__"},55501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ServerInsertedHTMLContext:function(){return o},useServerInsertedHTML:function(){return u}});let r=n(53099)._(n(2265)),o=r.default.createContext(null);function u(e){let t=(0,r.useContext)(o);t&&t(e)}},31765:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},47149:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"actionAsyncStorage",{enumerable:!0,get:function(){return r}});let r=(0,n(54832).createAsyncLocalStorage)();("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},54832:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createAsyncLocalStorage",{enumerable:!0,get:function(){return u}});let n=Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available");class r{disable(){throw n}getStore(){}run(){throw n}exit(){throw n}enterWith(){throw n}}let o=globalThis.AsyncLocalStorage;function u(){return o?new o:new r}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},25575:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"requestAsyncStorage",{enumerable:!0,get:function(){return r}});let r=(0,n(54832).createAsyncLocalStorage)();("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},20030:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"staticGenerationAsyncStorage",{enumerable:!0,get:function(){return r}});let r=(0,n(54832).createAsyncLocalStorage)();("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},34040:function(e,t,n){"use strict";var r=n(54887);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},54887:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(84417)},97950:function(e,t,n){"use strict";var r=n(54887),o={stream:!0},u=new Map;function l(e){var t=n(e);return"function"!=typeof t.then||"fulfilled"===t.status?null:(t.then(function(e){t.status="fulfilled",t.value=e},function(e){t.status="rejected",t.reason=e}),t)}function a(){}var i=new Map,c=n.u;n.u=function(e){var t=i.get(e);return void 0!==t?t:c(e)};var s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Dispatcher,f=Symbol.for("react.element"),d=Symbol.for("react.lazy"),p=Symbol.iterator,h=Array.isArray,y=Object.getPrototypeOf,_=Object.prototype,v=new WeakMap;function b(e,t,n,r){this.status=e,this.value=t,this.reason=n,this._response=r}function g(e){switch(e.status){case"resolved_model":E(e);break;case"resolved_module":w(e)}switch(e.status){case"fulfilled":return e.value;case"pending":case"blocked":case"cyclic":throw e;default:throw e.reason}}function m(e,t){for(var n=0;nh?(_=h,h=3,p++):(_=0,h=3);continue;case 2:44===(m=d[p++])?h=4:v=v<<4|(96d.length&&(m=-1)}var O=d.byteOffset+p;if(-11&&t.some(Array.isArray)?t.flat(e-1):t},Array.prototype.flatMap=function(e,t){return this.map(e,t).flat()}),Promise.prototype.finally||(Promise.prototype.finally=function(e){if("function"!=typeof e)return this.then(e,e);var t=this.constructor||Promise;return this.then(function(n){return t.resolve(e()).then(function(){return n})},function(n){return t.resolve(e()).then(function(){throw n})})}),Object.fromEntries||(Object.fromEntries=function(e){return Array.from(e).reduce(function(e,t){return e[t[0]]=t[1],e},{})}),Array.prototype.at||(Array.prototype.at=function(e){var t=Math.trunc(e)||0;if(t<0&&(t+=this.length),!(t<0||t>=this.length))return this[t]}),Object.hasOwn||(Object.hasOwn=function(e,t){if(null==e)throw TypeError("Cannot convert undefined or null to object");return Object.prototype.hasOwnProperty.call(Object(e),t)}),"canParse"in URL||(URL.canParse=function(e,t){try{return new URL(e,t),!0}catch(e){return!1}})},1634:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addBasePath",{enumerable:!0,get:function(){return u}});let r=n(68498),o=n(33068);function u(e,t){return(0,o.normalizePathTrailingSlash)((0,r.addPathPrefix)(e,""))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},75266:function(e,t){"use strict";function n(e){var t,n;t=self.__next_s,n=()=>{e()},t&&t.length?t.reduce((e,t)=>{let[n,r]=t;return e.then(()=>new Promise((e,t)=>{let o=document.createElement("script");if(r)for(let e in r)"children"!==e&&o.setAttribute(e,r[e]);n?(o.src=n,o.onload=()=>e(),o.onerror=t):r&&(o.innerHTML=r.children,setTimeout(e)),document.head.appendChild(o)}))},Promise.resolve()).catch(e=>{console.error(e)}).then(()=>{n()}):n()}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"appBootstrap",{enumerable:!0,get:function(){return n}}),window.next={version:"14.2.26",appDir:!0},("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},83079:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"callServer",{enumerable:!0,get:function(){return o}});let r=n(12846);async function o(e,t){let n=(0,r.getServerActionDispatcher)();if(!n)throw Error("Invariant: missing action dispatcher.");return new Promise((r,o)=>{n({actionId:e,actionArgs:t,resolve:r,reject:o})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},92304:function(e,t,n){"use strict";let r,o;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"hydrate",{enumerable:!0,get:function(){return x}});let u=n(47043),l=n(53099),a=n(57437);n(91572);let i=u._(n(34040)),c=l._(n(2265)),s=n(6671),f=n(48701),d=u._(n(61404)),p=n(83079),h=n(89721),y=n(2103);n(70647);let _=window.console.error;window.console.error=function(){for(var e=arguments.length,t=Array(e),n=0;n{if((0,h.isNextRouterError)(e.error)){e.preventDefault();return}});let v=document,b=new TextEncoder,g=!1,m=!1,R=null;function P(e){if(0===e[0])r=[];else if(1===e[0]){if(!r)throw Error("Unexpected server data: missing bootstrap script.");o?o.enqueue(b.encode(e[1])):r.push(e[1])}else 2===e[0]&&(R=e[1])}let j=function(){o&&!m&&(o.close(),m=!0,r=void 0),g=!0};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",j,!1):j();let O=self.__next_f=self.__next_f||[];O.forEach(P),O.push=P;let S=new ReadableStream({start(e){r&&(r.forEach(t=>{e.enqueue(b.encode(t))}),g&&!m&&(e.close(),m=!0,r=void 0)),o=e}}),E=(0,s.createFromReadableStream)(S,{callServer:p.callServer});function w(){return(0,c.use)(E)}let T=c.default.StrictMode;function M(e){let{children:t}=e;return t}function x(){let e=(0,y.createMutableActionQueue)(),t=(0,a.jsx)(T,{children:(0,a.jsx)(f.HeadManagerContext.Provider,{value:{appDir:!0},children:(0,a.jsx)(y.ActionQueueContext.Provider,{value:e,children:(0,a.jsx)(M,{children:(0,a.jsx)(w,{})})})})}),n=window.__next_root_layout_missing_tags,r=!!(null==n?void 0:n.length),o={onRecoverableError:d.default};"__next_error__"===document.documentElement.id||r?i.default.createRoot(v,o).render(t):c.default.startTransition(()=>i.default.hydrateRoot(v,t,{...o,formState:R}))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},54278:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(19506),(0,n(75266).appBootstrap)(()=>{let{hydrate:e}=n(92304);n(12846),n(4707),e()}),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},19506:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(65157);{let e=n.u;n.u=function(){for(var t=arguments.length,n=Array(t),r=0;r(l(function(){var e;let t=document.getElementsByName(u)[0];if(null==t?void 0:null==(e=t.shadowRoot)?void 0:e.childNodes[0])return t.shadowRoot.childNodes[0];{let e=document.createElement(u);e.style.cssText="position:absolute";let t=document.createElement("div");return t.ariaLive="assertive",t.id="__next-route-announcer__",t.role="alert",t.style.cssText="position:absolute;border:0;height:1px;margin:-1px;padding:0;width:1px;clip:rect(0 0 0 0);overflow:hidden;white-space:nowrap;word-wrap:normal",e.attachShadow({mode:"open"}).appendChild(t),document.body.appendChild(e),t}}()),()=>{let e=document.getElementsByTagName(u)[0];(null==e?void 0:e.isConnected)&&document.body.removeChild(e)}),[]);let[a,i]=(0,r.useState)(""),c=(0,r.useRef)();return(0,r.useEffect)(()=>{let e="";if(document.title)e=document.title;else{let t=document.querySelector("h1");t&&(e=t.innerText||t.textContent||"")}void 0!==c.current&&c.current!==e&&i(e),c.current=e},[t]),n?(0,o.createPortal)(a,n):null}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},6866:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ACTION:function(){return r},FLIGHT_PARAMETERS:function(){return i},NEXT_DID_POSTPONE_HEADER:function(){return s},NEXT_ROUTER_PREFETCH_HEADER:function(){return u},NEXT_ROUTER_STATE_TREE:function(){return o},NEXT_RSC_UNION_QUERY:function(){return c},NEXT_URL:function(){return l},RSC_CONTENT_TYPE_HEADER:function(){return a},RSC_HEADER:function(){return n}});let n="RSC",r="Next-Action",o="Next-Router-State-Tree",u="Next-Router-Prefetch",l="Next-Url",a="text/x-component",i=[[n],[o],[u]],c="_rsc",s="x-nextjs-postponed";("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},12846:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{createEmptyCacheNode:function(){return C},default:function(){return I},getServerActionDispatcher:function(){return E},urlToUrlWithoutFlightMarker:function(){return T}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(61956),a=n(24673),i=n(33456),c=n(79060),s=n(47744),f=n(61060),d=n(82952),p=n(86146),h=n(1634),y=n(6495),_=n(4123),v=n(39320),b=n(38137),g=n(6866),m=n(35076),R=n(11283),P=n(84541),j="undefined"==typeof window,O=j?null:new Map,S=null;function E(){return S}let w={};function T(e){let t=new URL(e,location.origin);if(t.searchParams.delete(g.NEXT_RSC_UNION_QUERY),t.pathname.endsWith(".txt")){let{pathname:e}=t,n=e.endsWith("/index.txt")?10:4;t.pathname=e.slice(0,-n)}return t}function M(e){return e.origin!==window.location.origin}function x(e){let{appRouterState:t,sync:n}=e;return(0,u.useInsertionEffect)(()=>{let{tree:e,pushRef:r,canonicalUrl:o}=t,u={...r.preserveCustomHistoryState?window.history.state:{},__NA:!0,__PRIVATE_NEXTJS_INTERNALS_TREE:e};r.pendingPush&&(0,i.createHrefFromUrl)(new URL(window.location.href))!==o?(r.pendingPush=!1,window.history.pushState(u,"",o)):window.history.replaceState(u,"",o),n(t)},[t,n]),null}function C(){return{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null}}function A(e){null==e&&(e={});let t=window.history.state,n=null==t?void 0:t.__NA;n&&(e.__NA=n);let r=null==t?void 0:t.__PRIVATE_NEXTJS_INTERNALS_TREE;return r&&(e.__PRIVATE_NEXTJS_INTERNALS_TREE=r),e}function N(e){let{headCacheNode:t}=e,n=null!==t?t.head:null,r=null!==t?t.prefetchHead:null,o=null!==r?r:n;return(0,u.useDeferredValue)(n,o)}function D(e){let t,{buildId:n,initialHead:r,initialTree:i,urlParts:f,initialSeedData:g,couldBeIntercepted:E,assetPrefix:T,missingSlots:C}=e,D=(0,u.useMemo)(()=>(0,d.createInitialRouterState)({buildId:n,initialSeedData:g,urlParts:f,initialTree:i,initialParallelRoutes:O,location:j?null:window.location,initialHead:r,couldBeIntercepted:E}),[n,g,f,i,r,E]),[I,U,k]=(0,s.useReducerWithReduxDevtools)(D);(0,u.useEffect)(()=>{O=null},[]);let{canonicalUrl:F}=(0,s.useUnwrapState)(I),{searchParams:L,pathname:H}=(0,u.useMemo)(()=>{let e=new URL(F,"undefined"==typeof window?"http://n":window.location.href);return{searchParams:e.searchParams,pathname:(0,R.hasBasePath)(e.pathname)?(0,m.removeBasePath)(e.pathname):e.pathname}},[F]),$=(0,u.useCallback)(e=>{let{previousTree:t,serverResponse:n}=e;(0,u.startTransition)(()=>{U({type:a.ACTION_SERVER_PATCH,previousTree:t,serverResponse:n})})},[U]),G=(0,u.useCallback)((e,t,n)=>{let r=new URL((0,h.addBasePath)(e),location.href);return U({type:a.ACTION_NAVIGATE,url:r,isExternalUrl:M(r),locationSearch:location.search,shouldScroll:null==n||n,navigateType:t})},[U]);S=(0,u.useCallback)(e=>{(0,u.startTransition)(()=>{U({...e,type:a.ACTION_SERVER_ACTION})})},[U]);let z=(0,u.useMemo)(()=>({back:()=>window.history.back(),forward:()=>window.history.forward(),prefetch:(e,t)=>{let n;if(!(0,p.isBot)(window.navigator.userAgent)){try{n=new URL((0,h.addBasePath)(e),window.location.href)}catch(t){throw Error("Cannot prefetch '"+e+"' because it cannot be converted to a URL.")}M(n)||(0,u.startTransition)(()=>{var e;U({type:a.ACTION_PREFETCH,url:n,kind:null!=(e=null==t?void 0:t.kind)?e:a.PrefetchKind.FULL})})}},replace:(e,t)=>{void 0===t&&(t={}),(0,u.startTransition)(()=>{var n;G(e,"replace",null==(n=t.scroll)||n)})},push:(e,t)=>{void 0===t&&(t={}),(0,u.startTransition)(()=>{var n;G(e,"push",null==(n=t.scroll)||n)})},refresh:()=>{(0,u.startTransition)(()=>{U({type:a.ACTION_REFRESH,origin:window.location.origin})})},fastRefresh:()=>{throw Error("fastRefresh can only be used in development mode. Please use refresh instead.")}}),[U,G]);(0,u.useEffect)(()=>{window.next&&(window.next.router=z)},[z]),(0,u.useEffect)(()=>{function e(e){var t;e.persisted&&(null==(t=window.history.state)?void 0:t.__PRIVATE_NEXTJS_INTERNALS_TREE)&&(w.pendingMpaPath=void 0,U({type:a.ACTION_RESTORE,url:new URL(window.location.href),tree:window.history.state.__PRIVATE_NEXTJS_INTERNALS_TREE}))}return window.addEventListener("pageshow",e),()=>{window.removeEventListener("pageshow",e)}},[U]);let{pushRef:B}=(0,s.useUnwrapState)(I);if(B.mpaNavigation){if(w.pendingMpaPath!==F){let e=window.location;B.pendingPush?e.assign(F):e.replace(F),w.pendingMpaPath=F}(0,u.use)(b.unresolvedThenable)}(0,u.useEffect)(()=>{let e=window.history.pushState.bind(window.history),t=window.history.replaceState.bind(window.history),n=e=>{var t;let n=window.location.href,r=null==(t=window.history.state)?void 0:t.__PRIVATE_NEXTJS_INTERNALS_TREE;(0,u.startTransition)(()=>{U({type:a.ACTION_RESTORE,url:new URL(null!=e?e:n,n),tree:r})})};window.history.pushState=function(t,r,o){return(null==t?void 0:t.__NA)||(null==t?void 0:t._N)||(t=A(t),o&&n(o)),e(t,r,o)},window.history.replaceState=function(e,r,o){return(null==e?void 0:e.__NA)||(null==e?void 0:e._N)||(e=A(e),o&&n(o)),t(e,r,o)};let r=e=>{let{state:t}=e;if(t){if(!t.__NA){window.location.reload();return}(0,u.startTransition)(()=>{U({type:a.ACTION_RESTORE,url:new URL(window.location.href),tree:t.__PRIVATE_NEXTJS_INTERNALS_TREE})})}};return window.addEventListener("popstate",r),()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",r)}},[U]);let{cache:W,tree:K,nextUrl:V,focusAndScrollRef:Y}=(0,s.useUnwrapState)(I),X=(0,u.useMemo)(()=>(0,v.findHeadInCache)(W,K[1]),[W,K]),q=(0,u.useMemo)(()=>(function e(t,n){for(let r of(void 0===n&&(n={}),Object.values(t[1]))){let t=r[0],o=Array.isArray(t),u=o?t[1]:t;!u||u.startsWith(P.PAGE_SEGMENT_KEY)||(o&&("c"===t[2]||"oc"===t[2])?n[t[0]]=t[1].split("/"):o&&(n[t[0]]=t[1]),n=e(r,n))}return n})(K),[K]);if(null!==X){let[e,n]=X;t=(0,o.jsx)(N,{headCacheNode:e},n)}else t=null;let J=(0,o.jsxs)(_.RedirectBoundary,{children:[t,W.rsc,(0,o.jsx)(y.AppRouterAnnouncer,{tree:K})]});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(x,{appRouterState:(0,s.useUnwrapState)(I),sync:k}),(0,o.jsx)(c.PathParamsContext.Provider,{value:q,children:(0,o.jsx)(c.PathnameContext.Provider,{value:H,children:(0,o.jsx)(c.SearchParamsContext.Provider,{value:L,children:(0,o.jsx)(l.GlobalLayoutRouterContext.Provider,{value:{buildId:n,changeByServerResponse:$,tree:K,focusAndScrollRef:Y,nextUrl:V},children:(0,o.jsx)(l.AppRouterContext.Provider,{value:z,children:(0,o.jsx)(l.LayoutRouterContext.Provider,{value:{childNodes:W.parallelRoutes,tree:K,url:F,loading:W.loading},children:J})})})})})})]})}function I(e){let{globalErrorComponent:t,...n}=e;return(0,o.jsx)(f.ErrorBoundary,{errorComponent:t,children:(0,o.jsx)(D,{...n})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},96149:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"bailoutToClientRendering",{enumerable:!0,get:function(){return u}});let r=n(18993),o=n(51845);function u(e){let t=o.staticGenerationAsyncStorage.getStore();if((null==t||!t.forceStatic)&&(null==t?void 0:t.isStaticGeneration))throw new r.BailoutToCSRError(e)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},19107:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ClientPageRoot",{enumerable:!0,get:function(){return u}});let r=n(57437),o=n(54535);function u(e){let{Component:t,props:n}=e;return n.searchParams=(0,o.createDynamicallyTrackedSearchParams)(n.searchParams||{}),(0,r.jsx)(t,{...n})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},61060:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ErrorBoundary:function(){return h},ErrorBoundaryHandler:function(){return f},GlobalError:function(){return d},default:function(){return p}});let r=n(47043),o=n(57437),u=r._(n(2265)),l=n(35475),a=n(89721),i=n(51845),c={error:{fontFamily:'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',height:"100vh",textAlign:"center",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center"},text:{fontSize:"14px",fontWeight:400,lineHeight:"28px",margin:"0 8px"}};function s(e){let{error:t}=e,n=i.staticGenerationAsyncStorage.getStore();if((null==n?void 0:n.isRevalidate)||(null==n?void 0:n.isStaticGeneration))throw console.error(t),t;return null}class f extends u.default.Component{static getDerivedStateFromError(e){if((0,a.isNextRouterError)(e))throw e;return{error:e}}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.error?{error:null,previousPathname:e.pathname}:{error:t.error,previousPathname:e.pathname}}render(){return this.state.error?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s,{error:this.state.error}),this.props.errorStyles,this.props.errorScripts,(0,o.jsx)(this.props.errorComponent,{error:this.state.error,reset:this.reset})]}):this.props.children}constructor(e){super(e),this.reset=()=>{this.setState({error:null})},this.state={error:null,previousPathname:this.props.pathname}}}function d(e){let{error:t}=e,n=null==t?void 0:t.digest;return(0,o.jsxs)("html",{id:"__next_error__",children:[(0,o.jsx)("head",{}),(0,o.jsxs)("body",{children:[(0,o.jsx)(s,{error:t}),(0,o.jsx)("div",{style:c.error,children:(0,o.jsxs)("div",{children:[(0,o.jsx)("h2",{style:c.text,children:"Application error: a "+(n?"server":"client")+"-side exception has occurred (see the "+(n?"server logs":"browser console")+" for more information)."}),n?(0,o.jsx)("p",{style:c.text,children:"Digest: "+n}):null]})})]})]})}let p=d;function h(e){let{errorComponent:t,errorStyles:n,errorScripts:r,children:u}=e,a=(0,l.usePathname)();return t?(0,o.jsx)(f,{pathname:a,errorComponent:t,errorStyles:n,errorScripts:r,children:u}):(0,o.jsx)(o.Fragment,{children:u})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},46177:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{DynamicServerError:function(){return r},isDynamicServerError:function(){return o}});let n="DYNAMIC_SERVER_USAGE";class r extends Error{constructor(e){super("Dynamic server usage: "+e),this.description=e,this.digest=n}}function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"==typeof e.digest&&e.digest===n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},89721:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isNextRouterError",{enumerable:!0,get:function(){return u}});let r=n(98200),o=n(88968);function u(e){return e&&e.digest&&((0,o.isRedirectError)(e)||(0,r.isNotFoundError)(e))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4707:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return S}});let r=n(47043),o=n(53099),u=n(57437),l=o._(n(2265)),a=r._(n(54887)),i=n(61956),c=n(44848),s=n(38137),f=n(61060),d=n(76015),p=n(7092),h=n(4123),y=n(80),_=n(73171),v=n(78505),b=n(28077),g=["bottom","height","left","right","top","width","x","y"];function m(e,t){let n=e.getBoundingClientRect();return n.top>=0&&n.top<=t}class R extends l.default.Component{componentDidMount(){this.handlePotentialScroll()}componentDidUpdate(){this.props.focusAndScrollRef.apply&&this.handlePotentialScroll()}render(){return this.props.children}constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focusAndScrollRef:e,segmentPath:t}=this.props;if(e.apply){var n;if(0!==e.segmentPaths.length&&!e.segmentPaths.some(e=>t.every((t,n)=>(0,d.matchSegment)(t,e[n]))))return;let r=null,o=e.hashFragment;if(o&&(r="top"===o?document.body:null!=(n=document.getElementById(o))?n:document.getElementsByName(o)[0]),r||(r="undefined"==typeof window?null:a.default.findDOMNode(this)),!(r instanceof Element))return;for(;!(r instanceof HTMLElement)||function(e){if(["sticky","fixed"].includes(getComputedStyle(e).position))return!0;let t=e.getBoundingClientRect();return g.every(e=>0===t[e])}(r);){if(null===r.nextElementSibling)return;r=r.nextElementSibling}e.apply=!1,e.hashFragment=null,e.segmentPaths=[],(0,p.handleSmoothScroll)(()=>{if(o){r.scrollIntoView();return}let e=document.documentElement,t=e.clientHeight;!m(r,t)&&(e.scrollTop=0,m(r,t)||r.scrollIntoView())},{dontForceLayout:!0,onlyHashChange:e.onlyHashChange}),e.onlyHashChange=!1,r.focus()}}}}function P(e){let{segmentPath:t,children:n}=e,r=(0,l.useContext)(i.GlobalLayoutRouterContext);if(!r)throw Error("invariant global layout router not mounted");return(0,u.jsx)(R,{segmentPath:t,focusAndScrollRef:r.focusAndScrollRef,children:n})}function j(e){let{parallelRouterKey:t,url:n,childNodes:r,segmentPath:o,tree:a,cacheKey:f}=e,p=(0,l.useContext)(i.GlobalLayoutRouterContext);if(!p)throw Error("invariant global layout router not mounted");let{buildId:h,changeByServerResponse:y,tree:_}=p,v=r.get(f);if(void 0===v){let e={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null};v=e,r.set(f,e)}let g=null!==v.prefetchRsc?v.prefetchRsc:v.rsc,m=(0,l.useDeferredValue)(v.rsc,g),R="object"==typeof m&&null!==m&&"function"==typeof m.then?(0,l.use)(m):m;if(!R){let e=v.lazyData;if(null===e){let t=function e(t,n){if(t){let[r,o]=t,u=2===t.length;if((0,d.matchSegment)(n[0],r)&&n[1].hasOwnProperty(o)){if(u){let t=e(void 0,n[1][o]);return[n[0],{...n[1],[o]:[t[0],t[1],t[2],"refetch"]}]}return[n[0],{...n[1],[o]:e(t.slice(2),n[1][o])}]}}return n}(["",...o],_),r=(0,b.hasInterceptionRouteInCurrentTree)(_);v.lazyData=e=(0,c.fetchServerResponse)(new URL(n,location.origin),t,r?p.nextUrl:null,h),v.lazyDataResolved=!1}let t=(0,l.use)(e);v.lazyDataResolved||(setTimeout(()=>{(0,l.startTransition)(()=>{y({previousTree:_,serverResponse:t})})}),v.lazyDataResolved=!0),(0,l.use)(s.unresolvedThenable)}return(0,u.jsx)(i.LayoutRouterContext.Provider,{value:{tree:a[1][t],childNodes:v.parallelRoutes,url:n,loading:v.loading},children:R})}function O(e){let{children:t,hasLoading:n,loading:r,loadingStyles:o,loadingScripts:a}=e;return n?(0,u.jsx)(l.Suspense,{fallback:(0,u.jsxs)(u.Fragment,{children:[o,a,r]}),children:t}):(0,u.jsx)(u.Fragment,{children:t})}function S(e){let{parallelRouterKey:t,segmentPath:n,error:r,errorStyles:o,errorScripts:a,templateStyles:c,templateScripts:s,template:d,notFound:p,notFoundStyles:b}=e,g=(0,l.useContext)(i.LayoutRouterContext);if(!g)throw Error("invariant expected layout router to be mounted");let{childNodes:m,tree:R,url:S,loading:E}=g,w=m.get(t);w||(w=new Map,m.set(t,w));let T=R[1][t][0],M=(0,_.getSegmentValue)(T),x=[T];return(0,u.jsx)(u.Fragment,{children:x.map(e=>{let l=(0,_.getSegmentValue)(e),g=(0,v.createRouterCacheKey)(e);return(0,u.jsxs)(i.TemplateContext.Provider,{value:(0,u.jsx)(P,{segmentPath:n,children:(0,u.jsx)(f.ErrorBoundary,{errorComponent:r,errorStyles:o,errorScripts:a,children:(0,u.jsx)(O,{hasLoading:!!E,loading:null==E?void 0:E[0],loadingStyles:null==E?void 0:E[1],loadingScripts:null==E?void 0:E[2],children:(0,u.jsx)(y.NotFoundBoundary,{notFound:p,notFoundStyles:b,children:(0,u.jsx)(h.RedirectBoundary,{children:(0,u.jsx)(j,{parallelRouterKey:t,url:S,tree:R,childNodes:w,segmentPath:n,cacheKey:g,isActive:M===l})})})})})}),children:[c,s,d]},(0,v.createRouterCacheKey)(e,!0))})})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},76015:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{canSegmentBeOverridden:function(){return u},matchSegment:function(){return o}});let r=n(87417),o=(e,t)=>"string"==typeof e?"string"==typeof t&&e===t:"string"!=typeof t&&e[0]===t[0]&&e[1]===t[1],u=(e,t)=>{var n;return!Array.isArray(e)&&!!Array.isArray(t)&&(null==(n=(0,r.getSegmentParam)(e))?void 0:n.param)===t[0]};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},35475:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ReadonlyURLSearchParams:function(){return i.ReadonlyURLSearchParams},RedirectType:function(){return i.RedirectType},ServerInsertedHTMLContext:function(){return c.ServerInsertedHTMLContext},notFound:function(){return i.notFound},permanentRedirect:function(){return i.permanentRedirect},redirect:function(){return i.redirect},useParams:function(){return p},usePathname:function(){return f},useRouter:function(){return d},useSearchParams:function(){return s},useSelectedLayoutSegment:function(){return y},useSelectedLayoutSegments:function(){return h},useServerInsertedHTML:function(){return c.useServerInsertedHTML}});let r=n(2265),o=n(61956),u=n(79060),l=n(73171),a=n(84541),i=n(52646),c=n(55501);function s(){let e=(0,r.useContext)(u.SearchParamsContext),t=(0,r.useMemo)(()=>e?new i.ReadonlyURLSearchParams(e):null,[e]);if("undefined"==typeof window){let{bailoutToClientRendering:e}=n(96149);e("useSearchParams()")}return t}function f(){return(0,r.useContext)(u.PathnameContext)}function d(){let e=(0,r.useContext)(o.AppRouterContext);if(null===e)throw Error("invariant expected app router to be mounted");return e}function p(){return(0,r.useContext)(u.PathParamsContext)}function h(e){void 0===e&&(e="children");let t=(0,r.useContext)(o.LayoutRouterContext);return t?function e(t,n,r,o){let u;if(void 0===r&&(r=!0),void 0===o&&(o=[]),r)u=t[1][n];else{var i;let e=t[1];u=null!=(i=e.children)?i:Object.values(e)[0]}if(!u)return o;let c=u[0],s=(0,l.getSegmentValue)(c);return!s||s.startsWith(a.PAGE_SEGMENT_KEY)?o:(o.push(s),e(u,n,!1,o))}(t.tree,e):null}function y(e){void 0===e&&(e="children");let t=h(e);if(!t||0===t.length)return null;let n="children"===e?t[0]:t[t.length-1];return n===a.DEFAULT_SEGMENT_KEY?null:n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},52646:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ReadonlyURLSearchParams:function(){return l},RedirectType:function(){return r.RedirectType},notFound:function(){return o.notFound},permanentRedirect:function(){return r.permanentRedirect},redirect:function(){return r.redirect}});let r=n(88968),o=n(98200);class u extends Error{constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams")}}class l extends URLSearchParams{append(){throw new u}delete(){throw new u}set(){throw new u}sort(){throw new u}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},80:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"NotFoundBoundary",{enumerable:!0,get:function(){return s}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(35475),a=n(98200);n(31765);let i=n(61956);class c extends u.default.Component{componentDidCatch(){}static getDerivedStateFromError(e){if((0,a.isNotFoundError)(e))return{notFoundTriggered:!0};throw e}static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPathname&&t.notFoundTriggered?{notFoundTriggered:!1,previousPathname:e.pathname}:{notFoundTriggered:t.notFoundTriggered,previousPathname:e.pathname}}render(){return this.state.notFoundTriggered?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("meta",{name:"robots",content:"noindex"}),!1,this.props.notFoundStyles,this.props.notFound]}):this.props.children}constructor(e){super(e),this.state={notFoundTriggered:!!e.asNotFound,previousPathname:e.pathname}}}function s(e){let{notFound:t,notFoundStyles:n,asNotFound:r,children:a}=e,s=(0,l.usePathname)(),f=(0,u.useContext)(i.MissingSlotContext);return t?(0,o.jsx)(c,{pathname:s,notFound:t,notFoundStyles:n,asNotFound:r,missingSlots:f,children:a}):(0,o.jsx)(o.Fragment,{children:a})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},98200:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{isNotFoundError:function(){return o},notFound:function(){return r}});let n="NEXT_NOT_FOUND";function r(){let e=Error(n);throw e.digest=n,e}function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},29744:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"PromiseQueue",{enumerable:!0,get:function(){return c}});let r=n(2522),o=n(90675);var u=o._("_maxConcurrency"),l=o._("_runningCount"),a=o._("_queue"),i=o._("_processNext");class c{enqueue(e){let t,n;let o=new Promise((e,r)=>{t=e,n=r}),u=async()=>{try{r._(this,l)[l]++;let n=await e();t(n)}catch(e){n(e)}finally{r._(this,l)[l]--,r._(this,i)[i]()}};return r._(this,a)[a].push({promiseFn:o,task:u}),r._(this,i)[i](),o}bump(e){let t=r._(this,a)[a].findIndex(t=>t.promiseFn===e);if(t>-1){let e=r._(this,a)[a].splice(t,1)[0];r._(this,a)[a].unshift(e),r._(this,i)[i](!0)}}constructor(e=5){Object.defineProperty(this,i,{value:s}),Object.defineProperty(this,u,{writable:!0,value:void 0}),Object.defineProperty(this,l,{writable:!0,value:void 0}),Object.defineProperty(this,a,{writable:!0,value:void 0}),r._(this,u)[u]=e,r._(this,l)[l]=0,r._(this,a)[a]=[]}}function s(e){if(void 0===e&&(e=!1),(r._(this,l)[l]0){var t;null==(t=r._(this,a)[a].shift())||t.task()}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4123:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{RedirectBoundary:function(){return s},RedirectErrorBoundary:function(){return c}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(35475),a=n(88968);function i(e){let{redirect:t,reset:n,redirectType:r}=e,o=(0,l.useRouter)();return(0,u.useEffect)(()=>{u.default.startTransition(()=>{r===a.RedirectType.push?o.push(t,{}):o.replace(t,{}),n()})},[t,r,n,o]),null}class c extends u.default.Component{static getDerivedStateFromError(e){if((0,a.isRedirectError)(e))return{redirect:(0,a.getURLFromRedirectError)(e),redirectType:(0,a.getRedirectTypeFromError)(e)};throw e}render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&null!==t?(0,o.jsx)(i,{redirect:e,redirectType:t,reset:()=>this.setState({redirect:null})}):this.props.children}constructor(e){super(e),this.state={redirect:null,redirectType:null}}}function s(e){let{children:t}=e,n=(0,l.useRouter)();return(0,o.jsx)(c,{router:n,children:t})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5001:function(e,t){"use strict";var n,r;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"RedirectStatusCode",{enumerable:!0,get:function(){return n}}),(r=n||(n={}))[r.SeeOther=303]="SeeOther",r[r.TemporaryRedirect=307]="TemporaryRedirect",r[r.PermanentRedirect=308]="PermanentRedirect",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},88968:function(e,t,n){"use strict";var r,o;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{RedirectType:function(){return r},getRedirectError:function(){return c},getRedirectStatusCodeFromError:function(){return y},getRedirectTypeFromError:function(){return h},getURLFromRedirectError:function(){return p},isRedirectError:function(){return d},permanentRedirect:function(){return f},redirect:function(){return s}});let u=n(20544),l=n(90295),a=n(5001),i="NEXT_REDIRECT";function c(e,t,n){void 0===n&&(n=a.RedirectStatusCode.TemporaryRedirect);let r=Error(i);r.digest=i+";"+t+";"+e+";"+n+";";let o=u.requestAsyncStorage.getStore();return o&&(r.mutableCookies=o.mutableCookies),r}function s(e,t){void 0===t&&(t="replace");let n=l.actionAsyncStorage.getStore();throw c(e,t,(null==n?void 0:n.isAction)?a.RedirectStatusCode.SeeOther:a.RedirectStatusCode.TemporaryRedirect)}function f(e,t){void 0===t&&(t="replace");let n=l.actionAsyncStorage.getStore();throw c(e,t,(null==n?void 0:n.isAction)?a.RedirectStatusCode.SeeOther:a.RedirectStatusCode.PermanentRedirect)}function d(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"!=typeof e.digest)return!1;let[t,n,r,o]=e.digest.split(";",4),u=Number(o);return t===i&&("replace"===n||"push"===n)&&"string"==typeof r&&!isNaN(u)&&u in a.RedirectStatusCode}function p(e){return d(e)?e.digest.split(";",3)[2]:null}function h(e){if(!d(e))throw Error("Not a redirect error");return e.digest.split(";",2)[1]}function y(e){if(!d(e))throw Error("Not a redirect error");return Number(e.digest.split(";",4)[3])}(o=r||(r={})).push="push",o.replace="replace",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},36423:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return a}});let r=n(53099),o=n(57437),u=r._(n(2265)),l=n(61956);function a(){let e=(0,u.useContext)(l.TemplateContext);return(0,o.jsx)(o.Fragment,{children:e})}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},20544:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{getExpectedRequestStore:function(){return o},requestAsyncStorage:function(){return r.requestAsyncStorage}});let r=n(25575);function o(e){let t=r.requestAsyncStorage.getStore();if(t)return t;throw Error("`"+e+"` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context")}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},22356:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"applyFlightData",{enumerable:!0,get:function(){return u}});let r=n(27420),o=n(92576);function u(e,t,n,u){let[l,a,i]=n.slice(-3);if(null===a)return!1;if(3===n.length){let n=a[2],o=a[3];t.loading=o,t.rsc=n,t.prefetchRsc=null,(0,r.fillLazyItemsTillLeafWithHead)(t,e,l,a,i,u)}else t.rsc=e.rsc,t.prefetchRsc=e.prefetchRsc,t.parallelRoutes=new Map(e.parallelRoutes),t.loading=e.loading,(0,o.fillCacheWithNewSubTreeData)(t,e,n,u);return!0}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},81935:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"applyRouterStatePatchToTree",{enumerable:!0,get:function(){return function e(t,n,r,a){let i;let[c,s,f,d,p]=n;if(1===t.length){let e=l(n,r,t);return(0,u.addRefreshMarkerToActiveParallelSegments)(e,a),e}let[h,y]=t;if(!(0,o.matchSegment)(h,c))return null;if(2===t.length)i=l(s[y],r,t);else if(null===(i=e(t.slice(2),s[y],r,a)))return null;let _=[t[0],{...s,[y]:i},f,d];return p&&(_[4]=!0),(0,u.addRefreshMarkerToActiveParallelSegments)(_,a),_}}});let r=n(84541),o=n(76015),u=n(50232);function l(e,t,n){let[u,a]=e,[i,c]=t;if(i===r.DEFAULT_SEGMENT_KEY&&u!==r.DEFAULT_SEGMENT_KEY)return e;if((0,o.matchSegment)(u,i)){let t={};for(let e in a)void 0!==c[e]?t[e]=l(a[e],c[e],n):t[e]=a[e];for(let e in c)t[e]||(t[e]=c[e]);let r=[u,t];return e[2]&&(r[2]=e[2]),e[3]&&(r[3]=e[3]),e[4]&&(r[4]=e[4]),r}return t}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},65556:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"clearCacheNodeDataForSegmentPath",{enumerable:!0,get:function(){return function e(t,n,o){let u=o.length<=2,[l,a]=o,i=(0,r.createRouterCacheKey)(a),c=n.parallelRoutes.get(l),s=t.parallelRoutes.get(l);s&&s!==c||(s=new Map(c),t.parallelRoutes.set(l,s));let f=null==c?void 0:c.get(i),d=s.get(i);if(u){d&&d.lazyData&&d!==f||s.set(i,{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null});return}if(!d||!f){d||s.set(i,{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null});return}return d===f&&(d={lazyData:d.lazyData,rsc:d.rsc,prefetchRsc:d.prefetchRsc,head:d.head,prefetchHead:d.prefetchHead,parallelRoutes:new Map(d.parallelRoutes),lazyDataResolved:d.lazyDataResolved,loading:d.loading},s.set(i,d)),e(d,f,o.slice(2))}}});let r=n(78505);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},5410:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{computeChangedPath:function(){return s},extractPathFromFlightRouterState:function(){return c}});let r=n(91182),o=n(84541),u=n(76015),l=e=>"/"===e[0]?e.slice(1):e,a=e=>"string"==typeof e?"children"===e?"":e:e[1];function i(e){return e.reduce((e,t)=>""===(t=l(t))||(0,o.isGroupSegment)(t)?e:e+"/"+t,"")||"/"}function c(e){var t;let n=Array.isArray(e[0])?e[0][1]:e[0];if(n===o.DEFAULT_SEGMENT_KEY||r.INTERCEPTION_ROUTE_MARKERS.some(e=>n.startsWith(e)))return;if(n.startsWith(o.PAGE_SEGMENT_KEY))return"";let u=[a(n)],l=null!=(t=e[1])?t:{},s=l.children?c(l.children):void 0;if(void 0!==s)u.push(s);else for(let[e,t]of Object.entries(l)){if("children"===e)continue;let n=c(t);void 0!==n&&u.push(n)}return i(u)}function s(e,t){let n=function e(t,n){let[o,l]=t,[i,s]=n,f=a(o),d=a(i);if(r.INTERCEPTION_ROUTE_MARKERS.some(e=>f.startsWith(e)||d.startsWith(e)))return"";if(!(0,u.matchSegment)(o,i)){var p;return null!=(p=c(n))?p:""}for(let t in l)if(s[t]){let n=e(l[t],s[t]);if(null!==n)return a(i)+"/"+n}return null}(e,t);return null==n||"/"===n?n:i(n.split("/"))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},33456:function(e,t){"use strict";function n(e,t){return void 0===t&&(t=!0),e.pathname+e.search+(t?e.hash:"")}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createHrefFromUrl",{enumerable:!0,get:function(){return n}}),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},82952:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createInitialRouterState",{enumerable:!0,get:function(){return c}});let r=n(33456),o=n(27420),u=n(5410),l=n(60305),a=n(24673),i=n(50232);function c(e){var t;let{buildId:n,initialTree:c,initialSeedData:s,urlParts:f,initialParallelRoutes:d,location:p,initialHead:h,couldBeIntercepted:y}=e,_=f.join("/"),v=!p,b={lazyData:null,rsc:s[2],prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:v?new Map:d,lazyDataResolved:!1,loading:s[3]},g=p?(0,r.createHrefFromUrl)(p):_;(0,i.addRefreshMarkerToActiveParallelSegments)(c,g);let m=new Map;(null===d||0===d.size)&&(0,o.fillLazyItemsTillLeafWithHead)(b,void 0,c,s,h);let R={buildId:n,tree:c,cache:b,prefetchCache:m,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:{apply:!1,onlyHashChange:!1,hashFragment:null,segmentPaths:[]},canonicalUrl:g,nextUrl:null!=(t=(0,u.extractPathFromFlightRouterState)(c)||(null==p?void 0:p.pathname))?t:null};if(p){let e=new URL(""+p.pathname+p.search,p.origin),t=[["",c,null,null]];(0,l.createPrefetchCacheEntryForInitialLoad)({url:e,kind:a.PrefetchKind.AUTO,data:[t,void 0,!1,y],tree:R.tree,prefetchCache:R.prefetchCache,nextUrl:R.nextUrl})}return R}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},78505:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createRouterCacheKey",{enumerable:!0,get:function(){return o}});let r=n(84541);function o(e,t){return(void 0===t&&(t=!1),Array.isArray(e))?e[0]+"|"+e[1]+"|"+e[2]:t&&e.startsWith(r.PAGE_SEGMENT_KEY)?r.PAGE_SEGMENT_KEY:e}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},44848:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"fetchServerResponse",{enumerable:!0,get:function(){return s}});let r=n(6866),o=n(12846),u=n(83079),l=n(24673),a=n(37207),{createFromFetch:i}=n(6671);function c(e){return[(0,o.urlToUrlWithoutFlightMarker)(e).toString(),void 0,!1,!1]}async function s(e,t,n,s,f){let d={[r.RSC_HEADER]:"1",[r.NEXT_ROUTER_STATE_TREE]:encodeURIComponent(JSON.stringify(t))};f===l.PrefetchKind.AUTO&&(d[r.NEXT_ROUTER_PREFETCH_HEADER]="1"),n&&(d[r.NEXT_URL]=n);let p=(0,a.hexHash)([d[r.NEXT_ROUTER_PREFETCH_HEADER]||"0",d[r.NEXT_ROUTER_STATE_TREE],d[r.NEXT_URL]].join(","));try{var h;let t=new URL(e);t.pathname.endsWith("/")?t.pathname+="index.txt":t.pathname+=".txt",t.searchParams.set(r.NEXT_RSC_UNION_QUERY,p);let n=await fetch(t,{credentials:"same-origin",headers:d}),l=(0,o.urlToUrlWithoutFlightMarker)(n.url),a=n.redirected?l:void 0,f=n.headers.get("content-type")||"",y=!!n.headers.get(r.NEXT_DID_POSTPONE_HEADER),_=!!(null==(h=n.headers.get("vary"))?void 0:h.includes(r.NEXT_URL)),v=f===r.RSC_CONTENT_TYPE_HEADER;if(v||(v=f.startsWith("text/plain")),!v||!n.ok)return e.hash&&(l.hash=e.hash),c(l.toString());let[b,g]=await i(Promise.resolve(n),{callServer:u.callServer});if(s!==b)return c(n.url);return[g,a,y,_]}catch(t){return console.error("Failed to fetch RSC payload for "+e+". Falling back to browser navigation.",t),[e.toString(),void 0,!1,!1]}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},92576:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"fillCacheWithNewSubTreeData",{enumerable:!0,get:function(){return function e(t,n,l,a){let i=l.length<=5,[c,s]=l,f=(0,u.createRouterCacheKey)(s),d=n.parallelRoutes.get(c);if(!d)return;let p=t.parallelRoutes.get(c);p&&p!==d||(p=new Map(d),t.parallelRoutes.set(c,p));let h=d.get(f),y=p.get(f);if(i){if(!y||!y.lazyData||y===h){let e=l[3];y={lazyData:null,rsc:e[2],prefetchRsc:null,head:null,prefetchHead:null,loading:e[3],parallelRoutes:h?new Map(h.parallelRoutes):new Map,lazyDataResolved:!1},h&&(0,r.invalidateCacheByRouterState)(y,h,l[2]),(0,o.fillLazyItemsTillLeafWithHead)(y,h,l[2],e,l[4],a),p.set(f,y)}return}y&&h&&(y===h&&(y={lazyData:y.lazyData,rsc:y.rsc,prefetchRsc:y.prefetchRsc,head:y.head,prefetchHead:y.prefetchHead,parallelRoutes:new Map(y.parallelRoutes),lazyDataResolved:!1,loading:y.loading},p.set(f,y)),e(y,h,l.slice(2),a))}}});let r=n(94377),o=n(27420),u=n(78505);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},27420:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"fillLazyItemsTillLeafWithHead",{enumerable:!0,get:function(){return function e(t,n,u,l,a,i){if(0===Object.keys(u[1]).length){t.head=a;return}for(let c in u[1]){let s;let f=u[1][c],d=f[0],p=(0,r.createRouterCacheKey)(d),h=null!==l&&void 0!==l[1][c]?l[1][c]:null;if(n){let r=n.parallelRoutes.get(c);if(r){let n;let u=(null==i?void 0:i.kind)==="auto"&&i.status===o.PrefetchCacheEntryStatus.reusable,l=new Map(r),s=l.get(p);n=null!==h?{lazyData:null,rsc:h[2],prefetchRsc:null,head:null,prefetchHead:null,loading:h[3],parallelRoutes:new Map(null==s?void 0:s.parallelRoutes),lazyDataResolved:!1}:u&&s?{lazyData:s.lazyData,rsc:s.rsc,prefetchRsc:s.prefetchRsc,head:s.head,prefetchHead:s.prefetchHead,parallelRoutes:new Map(s.parallelRoutes),lazyDataResolved:s.lazyDataResolved,loading:s.loading}:{lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map(null==s?void 0:s.parallelRoutes),lazyDataResolved:!1,loading:null},l.set(p,n),e(n,s,f,h||null,a,i),t.parallelRoutes.set(c,l);continue}}if(null!==h){let e=h[2],t=h[3];s={lazyData:null,rsc:e,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:t}}else s={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,lazyDataResolved:!1,loading:null};let y=t.parallelRoutes.get(c);y?y.set(p,s):t.parallelRoutes.set(c,new Map([[p,s]])),e(s,void 0,f,h,a,i)}}}});let r=n(78505),o=n(24673);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},44510:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"handleMutable",{enumerable:!0,get:function(){return u}});let r=n(5410);function o(e){return void 0!==e}function u(e,t){var n,u,l;let a=null==(u=t.shouldScroll)||u,i=e.nextUrl;if(o(t.patchedTree)){let n=(0,r.computeChangedPath)(e.tree,t.patchedTree);n?i=n:i||(i=e.canonicalUrl)}return{buildId:e.buildId,canonicalUrl:o(t.canonicalUrl)?t.canonicalUrl===e.canonicalUrl?e.canonicalUrl:t.canonicalUrl:e.canonicalUrl,pushRef:{pendingPush:o(t.pendingPush)?t.pendingPush:e.pushRef.pendingPush,mpaNavigation:o(t.mpaNavigation)?t.mpaNavigation:e.pushRef.mpaNavigation,preserveCustomHistoryState:o(t.preserveCustomHistoryState)?t.preserveCustomHistoryState:e.pushRef.preserveCustomHistoryState},focusAndScrollRef:{apply:!!a&&(!!o(null==t?void 0:t.scrollableSegments)||e.focusAndScrollRef.apply),onlyHashChange:!!t.hashFragment&&e.canonicalUrl.split("#",1)[0]===(null==(n=t.canonicalUrl)?void 0:n.split("#",1)[0]),hashFragment:a?t.hashFragment&&""!==t.hashFragment?decodeURIComponent(t.hashFragment.slice(1)):e.focusAndScrollRef.hashFragment:null,segmentPaths:a?null!=(l=null==t?void 0:t.scrollableSegments)?l:e.focusAndScrollRef.segmentPaths:[]},cache:t.cache?t.cache:e.cache,prefetchCache:t.prefetchCache?t.prefetchCache:e.prefetchCache,tree:o(t.patchedTree)?t.patchedTree:e.tree,nextUrl:i}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77831:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"handleSegmentMismatch",{enumerable:!0,get:function(){return o}});let r=n(95967);function o(e,t,n){return(0,r.handleExternalUrl)(e,{},e.canonicalUrl,!0)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77058:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"invalidateCacheBelowFlightSegmentPath",{enumerable:!0,get:function(){return function e(t,n,o){let u=o.length<=2,[l,a]=o,i=(0,r.createRouterCacheKey)(a),c=n.parallelRoutes.get(l);if(!c)return;let s=t.parallelRoutes.get(l);if(s&&s!==c||(s=new Map(c),t.parallelRoutes.set(l,s)),u){s.delete(i);return}let f=c.get(i),d=s.get(i);d&&f&&(d===f&&(d={lazyData:d.lazyData,rsc:d.rsc,prefetchRsc:d.prefetchRsc,head:d.head,prefetchHead:d.prefetchHead,parallelRoutes:new Map(d.parallelRoutes),lazyDataResolved:d.lazyDataResolved},s.set(i,d)),e(d,f,o.slice(2)))}}});let r=n(78505);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},94377:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"invalidateCacheByRouterState",{enumerable:!0,get:function(){return o}});let r=n(78505);function o(e,t,n){for(let o in n[1]){let u=n[1][o][0],l=(0,r.createRouterCacheKey)(u),a=t.parallelRoutes.get(o);if(a){let t=new Map(a);t.delete(l),e.parallelRoutes.set(o,t)}}}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},63237:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isNavigatingToNewRootLayout",{enumerable:!0,get:function(){return function e(t,n){let r=t[0],o=n[0];if(Array.isArray(r)&&Array.isArray(o)){if(r[0]!==o[0]||r[2]!==o[2])return!0}else if(r!==o)return!0;if(t[4])return!n[4];if(n[4])return!0;let u=Object.values(t[1])[0],l=Object.values(n[1])[0];return!u||!l||e(u,l)}}}),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},56118:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{abortTask:function(){return c},listenForDynamicRequest:function(){return a},updateCacheNodeOnNavigation:function(){return function e(t,n,a,c,s){let f=n[1],d=a[1],p=c[1],h=t.parallelRoutes,y=new Map(h),_={},v=null;for(let t in d){let n;let a=d[t],c=f[t],b=h.get(t),g=p[t],m=a[0],R=(0,u.createRouterCacheKey)(m),P=void 0!==c?c[0]:void 0,j=void 0!==b?b.get(R):void 0;if(null!==(n=m===r.PAGE_SEGMENT_KEY?l(a,void 0!==g?g:null,s):m===r.DEFAULT_SEGMENT_KEY?void 0!==c?{route:c,node:null,children:null}:l(a,void 0!==g?g:null,s):void 0!==P&&(0,o.matchSegment)(m,P)&&void 0!==j&&void 0!==c?null!=g?e(j,c,a,g,s):function(e){let t=i(e,null,null);return{route:e,node:t,children:null}}(a):l(a,void 0!==g?g:null,s))){null===v&&(v=new Map),v.set(t,n);let e=n.node;if(null!==e){let n=new Map(b);n.set(R,e),y.set(t,n)}_[t]=n.route}else _[t]=a}if(null===v)return null;let b={lazyData:null,rsc:t.rsc,prefetchRsc:t.prefetchRsc,head:t.head,prefetchHead:t.prefetchHead,loading:t.loading,parallelRoutes:y,lazyDataResolved:!1};return{route:function(e,t){let n=[e[0],t];return 2 in e&&(n[2]=e[2]),3 in e&&(n[3]=e[3]),4 in e&&(n[4]=e[4]),n}(a,_),node:b,children:v}}},updateCacheNodeOnPopstateRestoration:function(){return function e(t,n){let r=n[1],o=t.parallelRoutes,l=new Map(o);for(let t in r){let n=r[t],a=n[0],i=(0,u.createRouterCacheKey)(a),c=o.get(t);if(void 0!==c){let r=c.get(i);if(void 0!==r){let o=e(r,n),u=new Map(c);u.set(i,o),l.set(t,u)}}}let a=t.rsc,i=d(a)&&"pending"===a.status;return{lazyData:null,rsc:a,head:t.head,prefetchHead:i?t.prefetchHead:null,prefetchRsc:i?t.prefetchRsc:null,loading:i?t.loading:null,parallelRoutes:l,lazyDataResolved:!1}}}});let r=n(84541),o=n(76015),u=n(78505);function l(e,t,n){let r=i(e,t,n);return{route:e,node:r,children:null}}function a(e,t){t.then(t=>{for(let n of t[0]){let t=n.slice(0,-3),r=n[n.length-3],l=n[n.length-2],a=n[n.length-1];"string"!=typeof t&&function(e,t,n,r,l){let a=e;for(let e=0;e{c(e,t)})}function i(e,t,n){let r=e[1],o=null!==t?t[1]:null,l=new Map;for(let e in r){let t=r[e],a=null!==o?o[e]:null,c=t[0],s=(0,u.createRouterCacheKey)(c),f=i(t,void 0===a?null:a,n),d=new Map;d.set(s,f),l.set(e,d)}let a=0===l.size,c=null!==t?t[2]:null,s=null!==t?t[3]:null;return{lazyData:null,parallelRoutes:l,prefetchRsc:void 0!==c?c:null,prefetchHead:a?n:null,loading:void 0!==s?s:null,rsc:p(),head:a?p():null,lazyDataResolved:!1}}function c(e,t){let n=e.node;if(null===n)return;let r=e.children;if(null===r)s(e.route,n,t);else for(let e of r.values())c(e,t);e.node=null}function s(e,t,n){let r=e[1],o=t.parallelRoutes;for(let e in r){let t=r[e],l=o.get(e);if(void 0===l)continue;let a=t[0],i=(0,u.createRouterCacheKey)(a),c=l.get(i);void 0!==c&&s(t,c,n)}let l=t.rsc;d(l)&&(null===n?l.resolve(null):l.reject(n));let a=t.head;d(a)&&a.resolve(null)}let f=Symbol();function d(e){return e&&e.tag===f}function p(){let e,t;let n=new Promise((n,r)=>{e=n,t=r});return n.status="pending",n.resolve=t=>{"pending"===n.status&&(n.status="fulfilled",n.value=t,e(t))},n.reject=e=>{"pending"===n.status&&(n.status="rejected",n.reason=e,t(e))},n.tag=f,n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},60305:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{createPrefetchCacheEntryForInitialLoad:function(){return c},getOrCreatePrefetchCacheEntry:function(){return i},prunePrefetchCache:function(){return f}});let r=n(33456),o=n(44848),u=n(24673),l=n(24819);function a(e,t){let n=(0,r.createHrefFromUrl)(e,!1);return t?t+"%"+n:n}function i(e){let t,{url:n,nextUrl:r,tree:o,buildId:l,prefetchCache:i,kind:c}=e,f=a(n,r),d=i.get(f);if(d)t=d;else{let e=a(n),r=i.get(e);r&&(t=r)}return t?(t.status=h(t),t.kind!==u.PrefetchKind.FULL&&c===u.PrefetchKind.FULL)?s({tree:o,url:n,buildId:l,nextUrl:r,prefetchCache:i,kind:null!=c?c:u.PrefetchKind.TEMPORARY}):(c&&t.kind===u.PrefetchKind.TEMPORARY&&(t.kind=c),t):s({tree:o,url:n,buildId:l,nextUrl:r,prefetchCache:i,kind:c||u.PrefetchKind.TEMPORARY})}function c(e){let{nextUrl:t,tree:n,prefetchCache:r,url:o,kind:l,data:i}=e,[,,,c]=i,s=c?a(o,t):a(o),f={treeAtTimeOfPrefetch:n,data:Promise.resolve(i),kind:l,prefetchTime:Date.now(),lastUsedTime:Date.now(),key:s,status:u.PrefetchCacheEntryStatus.fresh};return r.set(s,f),f}function s(e){let{url:t,kind:n,tree:r,nextUrl:i,buildId:c,prefetchCache:s}=e,f=a(t),d=l.prefetchQueue.enqueue(()=>(0,o.fetchServerResponse)(t,r,i,c,n).then(e=>{let[,,,n]=e;return n&&function(e){let{url:t,nextUrl:n,prefetchCache:r}=e,o=a(t),u=r.get(o);if(!u)return;let l=a(t,n);r.set(l,u),r.delete(o)}({url:t,nextUrl:i,prefetchCache:s}),e})),p={treeAtTimeOfPrefetch:r,data:d,kind:n,prefetchTime:Date.now(),lastUsedTime:null,key:f,status:u.PrefetchCacheEntryStatus.fresh};return s.set(f,p),p}function f(e){for(let[t,n]of e)h(n)===u.PrefetchCacheEntryStatus.expired&&e.delete(t)}let d=1e3*Number("30"),p=1e3*Number("300");function h(e){let{kind:t,prefetchTime:n,lastUsedTime:r}=e;return Date.now()<(null!=r?r:n)+d?r?u.PrefetchCacheEntryStatus.reusable:u.PrefetchCacheEntryStatus.fresh:"auto"===t&&Date.now(){let[n,f]=t,h=!1;if(S.lastUsedTime||(S.lastUsedTime=Date.now(),h=!0),"string"==typeof n)return _(e,R,n,O);if(document.getElementById("__next-page-redirect"))return _(e,R,j,O);let b=e.tree,g=e.cache,w=[];for(let t of n){let n=t.slice(0,-4),r=t.slice(-3)[0],c=["",...n],f=(0,u.applyRouterStatePatchToTree)(c,b,r,j);if(null===f&&(f=(0,u.applyRouterStatePatchToTree)(c,E,r,j)),null!==f){if((0,a.isNavigatingToNewRootLayout)(b,f))return _(e,R,j,O);let u=(0,d.createEmptyCacheNode)(),m=!1;for(let e of(S.status!==i.PrefetchCacheEntryStatus.stale||h?m=(0,s.applyFlightData)(g,u,t,S):(m=function(e,t,n,r){let o=!1;for(let u of(e.rsc=t.rsc,e.prefetchRsc=t.prefetchRsc,e.loading=t.loading,e.parallelRoutes=new Map(t.parallelRoutes),v(r).map(e=>[...n,...e])))(0,y.clearCacheNodeDataForSegmentPath)(e,t,u),o=!0;return o}(u,g,n,r),S.lastUsedTime=Date.now()),(0,l.shouldHardNavigate)(c,b)?(u.rsc=g.rsc,u.prefetchRsc=g.prefetchRsc,(0,o.invalidateCacheBelowFlightSegmentPath)(u,g,n),R.cache=u):m&&(R.cache=u,g=u),b=f,v(r))){let t=[...n,...e];t[t.length-1]!==p.DEFAULT_SEGMENT_KEY&&w.push(t)}}}return R.patchedTree=b,R.canonicalUrl=f?(0,r.createHrefFromUrl)(f):j,R.pendingPush=O,R.scrollableSegments=w,R.hashFragment=P,R.shouldScroll=m,(0,c.handleMutable)(e,R)},()=>e)};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},24819:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{prefetchQueue:function(){return l},prefetchReducer:function(){return a}});let r=n(6866),o=n(29744),u=n(60305),l=new o.PromiseQueue(5);function a(e,t){(0,u.prunePrefetchCache)(e.prefetchCache);let{url:n}=t;return n.searchParams.delete(r.NEXT_RSC_UNION_QUERY),(0,u.getOrCreatePrefetchCacheEntry)({url:n,nextUrl:e.nextUrl,prefetchCache:e.prefetchCache,kind:t.kind,tree:e.tree,buildId:e.buildId}),e}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},99601:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"refreshReducer",{enumerable:!0,get:function(){return h}});let r=n(44848),o=n(33456),u=n(81935),l=n(63237),a=n(95967),i=n(44510),c=n(27420),s=n(12846),f=n(77831),d=n(28077),p=n(50232);function h(e,t){let{origin:n}=t,h={},y=e.canonicalUrl,_=e.tree;h.preserveCustomHistoryState=!1;let v=(0,s.createEmptyCacheNode)(),b=(0,d.hasInterceptionRouteInCurrentTree)(e.tree);return v.lazyData=(0,r.fetchServerResponse)(new URL(y,n),[_[0],_[1],_[2],"refetch"],b?e.nextUrl:null,e.buildId),v.lazyData.then(async n=>{let[r,s]=n;if("string"==typeof r)return(0,a.handleExternalUrl)(e,h,r,e.pushRef.pendingPush);for(let n of(v.lazyData=null,r)){if(3!==n.length)return console.log("REFRESH FAILED"),e;let[r]=n,i=(0,u.applyRouterStatePatchToTree)([""],_,r,e.canonicalUrl);if(null===i)return(0,f.handleSegmentMismatch)(e,t,r);if((0,l.isNavigatingToNewRootLayout)(_,i))return(0,a.handleExternalUrl)(e,h,y,e.pushRef.pendingPush);let d=s?(0,o.createHrefFromUrl)(s):void 0;s&&(h.canonicalUrl=d);let[g,m]=n.slice(-2);if(null!==g){let e=g[2];v.rsc=e,v.prefetchRsc=null,(0,c.fillLazyItemsTillLeafWithHead)(v,void 0,r,g,m),h.prefetchCache=new Map}await (0,p.refreshInactiveParallelSegments)({state:e,updatedTree:i,updatedCache:v,includeNextUrl:b,canonicalUrl:h.canonicalUrl||e.canonicalUrl}),h.cache=v,h.patchedTree=i,h.canonicalUrl=y,_=i}return(0,i.handleMutable)(e,h)},()=>e)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},77784:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"restoreReducer",{enumerable:!0,get:function(){return u}});let r=n(33456),o=n(5410);function u(e,t){var n;let{url:u,tree:l}=t,a=(0,r.createHrefFromUrl)(u),i=l||e.tree,c=e.cache;return{buildId:e.buildId,canonicalUrl:a,pushRef:{pendingPush:!1,mpaNavigation:!1,preserveCustomHistoryState:!0},focusAndScrollRef:e.focusAndScrollRef,cache:c,prefetchCache:e.prefetchCache,tree:i,nextUrl:null!=(n=(0,o.extractPathFromFlightRouterState)(i))?n:u.pathname}}n(56118),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},13722:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"serverActionReducer",{enumerable:!0,get:function(){return g}});let r=n(83079),o=n(6866),u=n(1634),l=n(33456),a=n(95967),i=n(81935),c=n(63237),s=n(44510),f=n(27420),d=n(12846),p=n(28077),h=n(77831),y=n(50232),{createFromFetch:_,encodeReply:v}=n(6671);async function b(e,t,n){let l,{actionId:a,actionArgs:i}=n,c=await v(i),s=await fetch("",{method:"POST",headers:{Accept:o.RSC_CONTENT_TYPE_HEADER,[o.ACTION]:a,[o.NEXT_ROUTER_STATE_TREE]:encodeURIComponent(JSON.stringify(e.tree)),...t?{[o.NEXT_URL]:t}:{}},body:c}),f=s.headers.get("x-action-redirect");try{let e=JSON.parse(s.headers.get("x-action-revalidated")||"[[],0,0]");l={paths:e[0]||[],tag:!!e[1],cookie:e[2]}}catch(e){l={paths:[],tag:!1,cookie:!1}}let d=f?new URL((0,u.addBasePath)(f),new URL(e.canonicalUrl,window.location.href)):void 0;if(s.headers.get("content-type")===o.RSC_CONTENT_TYPE_HEADER){let e=await _(Promise.resolve(s),{callServer:r.callServer});if(f){let[,t]=null!=e?e:[];return{actionFlightData:t,redirectLocation:d,revalidatedParts:l}}let[t,[,n]]=null!=e?e:[];return{actionResult:t,actionFlightData:n,redirectLocation:d,revalidatedParts:l}}return{redirectLocation:d,revalidatedParts:l}}function g(e,t){let{resolve:n,reject:r}=t,o={},u=e.canonicalUrl,_=e.tree;o.preserveCustomHistoryState=!1;let v=e.nextUrl&&(0,p.hasInterceptionRouteInCurrentTree)(e.tree)?e.nextUrl:null;return o.inFlightServerAction=b(e,v,t),o.inFlightServerAction.then(async r=>{let{actionResult:p,actionFlightData:b,redirectLocation:g}=r;if(g&&(e.pushRef.pendingPush=!0,o.pendingPush=!0),!b)return(n(p),g)?(0,a.handleExternalUrl)(e,o,g.href,e.pushRef.pendingPush):e;if("string"==typeof b)return(0,a.handleExternalUrl)(e,o,b,e.pushRef.pendingPush);if(o.inFlightServerAction=null,g){let e=(0,l.createHrefFromUrl)(g,!1);o.canonicalUrl=e}for(let n of b){if(3!==n.length)return console.log("SERVER ACTION APPLY FAILED"),e;let[r]=n,s=(0,i.applyRouterStatePatchToTree)([""],_,r,g?(0,l.createHrefFromUrl)(g):e.canonicalUrl);if(null===s)return(0,h.handleSegmentMismatch)(e,t,r);if((0,c.isNavigatingToNewRootLayout)(_,s))return(0,a.handleExternalUrl)(e,o,u,e.pushRef.pendingPush);let[p,b]=n.slice(-2),m=null!==p?p[2]:null;if(null!==m){let t=(0,d.createEmptyCacheNode)();t.rsc=m,t.prefetchRsc=null,(0,f.fillLazyItemsTillLeafWithHead)(t,void 0,r,p,b),await (0,y.refreshInactiveParallelSegments)({state:e,updatedTree:s,updatedCache:t,includeNextUrl:!!v,canonicalUrl:o.canonicalUrl||e.canonicalUrl}),o.cache=t,o.prefetchCache=new Map}o.patchedTree=s,_=s}return n(p),(0,s.handleMutable)(e,o)},t=>(r(t),e))}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},68448:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"serverPatchReducer",{enumerable:!0,get:function(){return f}});let r=n(33456),o=n(81935),u=n(63237),l=n(95967),a=n(22356),i=n(44510),c=n(12846),s=n(77831);function f(e,t){let{serverResponse:n}=t,[f,d]=n,p={};if(p.preserveCustomHistoryState=!1,"string"==typeof f)return(0,l.handleExternalUrl)(e,p,f,e.pushRef.pendingPush);let h=e.tree,y=e.cache;for(let n of f){let i=n.slice(0,-4),[f]=n.slice(-3,-2),_=(0,o.applyRouterStatePatchToTree)(["",...i],h,f,e.canonicalUrl);if(null===_)return(0,s.handleSegmentMismatch)(e,t,f);if((0,u.isNavigatingToNewRootLayout)(h,_))return(0,l.handleExternalUrl)(e,p,e.canonicalUrl,e.pushRef.pendingPush);let v=d?(0,r.createHrefFromUrl)(d):void 0;v&&(p.canonicalUrl=v);let b=(0,c.createEmptyCacheNode)();(0,a.applyFlightData)(y,b,n),p.patchedTree=_,p.cache=b,y=b,h=_}return(0,i.handleMutable)(e,p)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},50232:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{addRefreshMarkerToActiveParallelSegments:function(){return function e(t,n){let[r,o,,l]=t;for(let a in r.includes(u.PAGE_SEGMENT_KEY)&&"refresh"!==l&&(t[2]=n,t[3]="refresh"),o)e(o[a],n)}},refreshInactiveParallelSegments:function(){return l}});let r=n(22356),o=n(44848),u=n(84541);async function l(e){let t=new Set;await a({...e,rootTree:e.updatedTree,fetchedSegments:t})}async function a(e){let{state:t,updatedTree:n,updatedCache:u,includeNextUrl:l,fetchedSegments:i,rootTree:c=n,canonicalUrl:s}=e,[,f,d,p]=n,h=[];if(d&&d!==s&&"refresh"===p&&!i.has(d)){i.add(d);let e=(0,o.fetchServerResponse)(new URL(d,location.origin),[c[0],c[1],c[2],"refetch"],l?t.nextUrl:null,t.buildId).then(e=>{let t=e[0];if("string"!=typeof t)for(let e of t)(0,r.applyFlightData)(u,u,e)});h.push(e)}for(let e in f){let n=a({state:t,updatedTree:f[e],updatedCache:u,includeNextUrl:l,fetchedSegments:i,rootTree:c,canonicalUrl:s});h.push(n)}await Promise.all(h)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},24673:function(e,t){"use strict";var n,r,o,u;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ACTION_FAST_REFRESH:function(){return f},ACTION_NAVIGATE:function(){return a},ACTION_PREFETCH:function(){return s},ACTION_REFRESH:function(){return l},ACTION_RESTORE:function(){return i},ACTION_SERVER_ACTION:function(){return d},ACTION_SERVER_PATCH:function(){return c},PrefetchCacheEntryStatus:function(){return r},PrefetchKind:function(){return n},isThenable:function(){return p}});let l="refresh",a="navigate",i="restore",c="server-patch",s="prefetch",f="fast-refresh",d="server-action";function p(e){return e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}(o=n||(n={})).AUTO="auto",o.FULL="full",o.TEMPORARY="temporary",(u=r||(r={})).fresh="fresh",u.reusable="reusable",u.expired="expired",u.stale="stale",("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},91450:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"reducer",{enumerable:!0,get:function(){return f}});let r=n(24673),o=n(95967),u=n(68448),l=n(77784),a=n(99601),i=n(24819),c=n(44529),s=n(13722),f="undefined"==typeof window?function(e,t){return e}:function(e,t){switch(t.type){case r.ACTION_NAVIGATE:return(0,o.navigateReducer)(e,t);case r.ACTION_SERVER_PATCH:return(0,u.serverPatchReducer)(e,t);case r.ACTION_RESTORE:return(0,l.restoreReducer)(e,t);case r.ACTION_REFRESH:return(0,a.refreshReducer)(e,t);case r.ACTION_FAST_REFRESH:return(0,c.fastRefreshReducer)(e,t);case r.ACTION_PREFETCH:return(0,i.prefetchReducer)(e,t);case r.ACTION_SERVER_ACTION:return(0,s.serverActionReducer)(e,t);default:throw Error("Unknown action")}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},53728:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"shouldHardNavigate",{enumerable:!0,get:function(){return function e(t,n){let[o,u]=n,[l,a]=t;return(0,r.matchSegment)(l,o)?!(t.length<=2)&&e(t.slice(2),u[a]):!!Array.isArray(l)}}});let r=n(76015);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},54535:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{createDynamicallyTrackedSearchParams:function(){return a},createUntrackedSearchParams:function(){return l}});let r=n(51845),o=n(86999),u=n(30650);function l(e){let t=r.staticGenerationAsyncStorage.getStore();return t&&t.forceStatic?{}:e}function a(e){let t=r.staticGenerationAsyncStorage.getStore();return t?t.forceStatic?{}:t.isStaticGeneration||t.dynamicShouldError?new Proxy({},{get:(e,n,r)=>("string"==typeof n&&(0,o.trackDynamicDataAccessed)(t,"searchParams."+n),u.ReflectAdapter.get(e,n,r)),has:(e,n)=>("string"==typeof n&&(0,o.trackDynamicDataAccessed)(t,"searchParams."+n),Reflect.has(e,n)),ownKeys:e=>((0,o.trackDynamicDataAccessed)(t,"searchParams"),Reflect.ownKeys(e))}):e:e}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},51845:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"staticGenerationAsyncStorage",{enumerable:!0,get:function(){return r.staticGenerationAsyncStorage}});let r=n(20030);("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},36864:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{StaticGenBailoutError:function(){return r},isStaticGenBailoutError:function(){return o}});let n="NEXT_STATIC_GEN_BAILOUT";class r extends Error{constructor(...e){super(...e),this.code=n}}function o(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===n}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},38137:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"unresolvedThenable",{enumerable:!0,get:function(){return n}});let n={then:()=>{}};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},47744:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{useReducerWithReduxDevtools:function(){return i},useUnwrapState:function(){return a}});let r=n(53099)._(n(2265)),o=n(24673),u=n(2103);function l(e){if(e instanceof Map){let t={};for(let[n,r]of e.entries()){if("function"==typeof r){t[n]="fn()";continue}if("object"==typeof r&&null!==r){if(r.$$typeof){t[n]=r.$$typeof.toString();continue}if(r._bundlerConfig){t[n]="FlightData";continue}}t[n]=l(r)}return t}if("object"==typeof e&&null!==e){let t={};for(let n in e){let r=e[n];if("function"==typeof r){t[n]="fn()";continue}if("object"==typeof r&&null!==r){if(r.$$typeof){t[n]=r.$$typeof.toString();continue}if(r.hasOwnProperty("_bundlerConfig")){t[n]="FlightData";continue}}t[n]=l(r)}return t}return Array.isArray(e)?e.map(l):e}function a(e){return(0,o.isThenable)(e)?(0,r.use)(e):e}let i="undefined"!=typeof window?function(e){let[t,n]=r.default.useState(e),o=(0,r.useContext)(u.ActionQueueContext);if(!o)throw Error("Invariant: Missing ActionQueueContext");let a=(0,r.useRef)(),i=(0,r.useRef)();return(0,r.useEffect)(()=>{if(!a.current&&!1!==i.current){if(void 0===i.current&&void 0===window.__REDUX_DEVTOOLS_EXTENSION__){i.current=!1;return}return a.current=window.__REDUX_DEVTOOLS_EXTENSION__.connect({instanceId:8e3,name:"next-router"}),a.current&&(a.current.init(l(e)),o&&(o.devToolsInstance=a.current)),()=>{a.current=void 0}}},[e,o]),[t,(0,r.useCallback)(t=>{o.state||(o.state=e),o.dispatch(t,n)},[o,e]),(0,r.useCallback)(e=>{a.current&&a.current.send({type:"RENDER_SYNC"},l(e))},[])]}:function(e){return[e,()=>{},()=>{}]};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},11283:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"hasBasePath",{enumerable:!0,get:function(){return o}});let r=n(10580);function o(e){return(0,r.pathHasPrefix)(e,"")}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},33068:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"normalizePathTrailingSlash",{enumerable:!0,get:function(){return u}});let r=n(26674),o=n(63381),u=e=>{if(!e.startsWith("/"))return e;let{pathname:t,query:n,hash:u}=(0,o.parsePath)(e);return""+(0,r.removeTrailingSlash)(t)+n+u};("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},61404:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return o}});let r=n(18993);function o(e){let t="function"==typeof reportError?reportError:e=>{window.console.error(e)};(0,r.isBailoutToCSRError)(e)||t(e)}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},35076:function(e,t,n){"use strict";function r(e){return e}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"removeBasePath",{enumerable:!0,get:function(){return r}}),n(11283),("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},12010:function(e,t){"use strict";function n(e,t){var n=e.length;for(e.push(t);0>>1,o=e[r];if(0>>1;ru(i,n))cu(s,i)?(e[r]=s,e[c]=n,r=c):(e[r]=i,e[a]=n,r=a);else if(cu(s,n))e[r]=s,e[c]=n,r=c;else break}}return t}function u(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var l,a=performance;t.unstable_now=function(){return a.now()}}else{var i=Date,c=i.now();t.unstable_now=function(){return i.now()-c}}var s=[],f=[],d=1,p=null,h=3,y=!1,_=!1,v=!1,b="function"==typeof setTimeout?setTimeout:null,g="function"==typeof clearTimeout?clearTimeout:null,m="undefined"!=typeof setImmediate?setImmediate:null;function R(e){for(var t=r(f);null!==t;){if(null===t.callback)o(f);else if(t.startTime<=e)o(f),t.sortIndex=t.expirationTime,n(s,t);else break;t=r(f)}}function P(e){if(v=!1,R(e),!_){if(null!==r(s))_=!0,C();else{var t=r(f);null!==t&&A(P,t.startTime-e)}}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var j=!1,O=-1,S=5,E=-1;function w(){return!(t.unstable_now()-Ee&&w());){var a=p.callback;if("function"==typeof a){p.callback=null,h=p.priorityLevel;var i=a(p.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof i){p.callback=i,R(e),n=!0;break t}p===r(s)&&o(s),R(e)}else o(s);p=r(s)}if(null!==p)n=!0;else{var c=r(f);null!==c&&A(P,c.startTime-e),n=!1}}break e}finally{p=null,h=u,y=!1}n=void 0}}finally{n?l():j=!1}}}if("function"==typeof m)l=function(){m(T)};else if("undefined"!=typeof MessageChannel){var M=new MessageChannel,x=M.port2;M.port1.onmessage=T,l=function(){x.postMessage(null)}}else l=function(){b(T,0)};function C(){j||(j=!0,l())}function A(e,n){O=b(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){_||y||(_=!0,C())},t.unstable_forceFrameRate=function(e){0>e||125l?(e.sortIndex=u,n(f,e),null===r(s)&&e===r(f)&&(v?(g(O),O=-1):v=!0,A(P,u-l))):(e.sortIndex=a,n(s,e),_||y||(_=!0,C())),e},t.unstable_shouldYield=w,t.unstable_wrapCallback=function(e){var t=h;return function(){var n=h;h=t;try{return e.apply(this,arguments)}finally{h=n}}}},71767:function(e,t,n){"use strict";e.exports=n(12010)},60934:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{getPathname:function(){return r},isFullStringUrl:function(){return o},parseUrl:function(){return u}});let n="http://n";function r(e){return new URL(e,n).pathname}function o(e){return/https?:\/\//.test(e)}function u(e){let t;try{t=new URL(e,n)}catch{}return t}},86999:function(e,t,n){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{Postpone:function(){return d},createPostponedAbortSignal:function(){return b},createPrerenderState:function(){return c},formatDynamicAPIAccesses:function(){return _},markCurrentScopeAsDynamic:function(){return s},trackDynamicDataAccessed:function(){return f},trackDynamicFetch:function(){return p},usedDynamicAPIs:function(){return y}});let o=(r=n(2265))&&r.__esModule?r:{default:r},u=n(46177),l=n(36864),a=n(60934),i="function"==typeof o.default.unstable_postpone;function c(e){return{isDebugSkeleton:e,dynamicAccesses:[]}}function s(e,t){let n=(0,a.getPathname)(e.urlPathname);if(!e.isUnstableCacheCallback){if(e.dynamicShouldError)throw new l.StaticGenBailoutError(`Route ${n} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${t}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`);if(e.prerenderState)h(e.prerenderState,t,n);else if(e.revalidate=0,e.isStaticGeneration){let r=new u.DynamicServerError(`Route ${n} couldn't be rendered statically because it used ${t}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`);throw e.dynamicUsageDescription=t,e.dynamicUsageStack=r.stack,r}}}function f(e,t){let n=(0,a.getPathname)(e.urlPathname);if(e.isUnstableCacheCallback)throw Error(`Route ${n} used "${t}" inside a function cached with "unstable_cache(...)". Accessing Dynamic data sources inside a cache scope is not supported. If you need this data inside a cached function use "${t}" outside of the cached function and pass the required dynamic data in as an argument. See more info here: https://nextjs.org/docs/app/api-reference/functions/unstable_cache`);if(e.dynamicShouldError)throw new l.StaticGenBailoutError(`Route ${n} with \`dynamic = "error"\` couldn't be rendered statically because it used \`${t}\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`);if(e.prerenderState)h(e.prerenderState,t,n);else if(e.revalidate=0,e.isStaticGeneration){let r=new u.DynamicServerError(`Route ${n} couldn't be rendered statically because it used \`${t}\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`);throw e.dynamicUsageDescription=t,e.dynamicUsageStack=r.stack,r}}function d({reason:e,prerenderState:t,pathname:n}){h(t,e,n)}function p(e,t){e.prerenderState&&h(e.prerenderState,t,e.urlPathname)}function h(e,t,n){v();let r=`Route ${n} needs to bail out of prerendering at this point because it used ${t}. React throws this special object to indicate where. It should not be caught by your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`;e.dynamicAccesses.push({stack:e.isDebugSkeleton?Error().stack:void 0,expression:t}),o.default.unstable_postpone(r)}function y(e){return e.dynamicAccesses.length>0}function _(e){return e.dynamicAccesses.filter(e=>"string"==typeof e.stack&&e.stack.length>0).map(({expression:e,stack:t})=>(t=t.split("\n").slice(4).filter(e=>!(e.includes("node_modules/next/")||e.includes(" ()")||e.includes(" (node:"))).join("\n"),`Dynamic API Usage Debug - ${e}: +${t}`))}function v(){if(!i)throw Error("Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js")}function b(e){v();let t=new AbortController;try{o.default.unstable_postpone(e)}catch(e){t.abort(e)}return t.signal}},87417:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"getSegmentParam",{enumerable:!0,get:function(){return o}});let r=n(91182);function o(e){let t=r.INTERCEPTION_ROUTE_MARKERS.find(t=>e.startsWith(t));return(t&&(e=e.slice(t.length)),e.startsWith("[[...")&&e.endsWith("]]"))?{type:"optional-catchall",param:e.slice(5,-2)}:e.startsWith("[...")&&e.endsWith("]")?{type:t?"catchall-intercepted":"catchall",param:e.slice(4,-1)}:e.startsWith("[")&&e.endsWith("]")?{type:t?"dynamic-intercepted":"dynamic",param:e.slice(1,-1)}:null}},70647:function(e,t){"use strict";var n,r;Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HMR_ACTIONS_SENT_TO_BROWSER",{enumerable:!0,get:function(){return n}}),(r=n||(n={})).ADDED_PAGE="addedPage",r.REMOVED_PAGE="removedPage",r.RELOAD_PAGE="reloadPage",r.SERVER_COMPONENT_CHANGES="serverComponentChanges",r.MIDDLEWARE_CHANGES="middlewareChanges",r.CLIENT_CHANGES="clientChanges",r.SERVER_ONLY_CHANGES="serverOnlyChanges",r.SYNC="sync",r.BUILT="built",r.BUILDING="building",r.DEV_PAGES_MANIFEST_UPDATE="devPagesManifestUpdate",r.TURBOPACK_MESSAGE="turbopack-message",r.SERVER_ERROR="serverError",r.TURBOPACK_CONNECTED="turbopack-connected"},91182:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{INTERCEPTION_ROUTE_MARKERS:function(){return o},extractInterceptionRouteInformation:function(){return l},isInterceptionRouteAppPath:function(){return u}});let r=n(20926),o=["(..)(..)","(.)","(..)","(...)"];function u(e){return void 0!==e.split("/").find(e=>o.find(t=>e.startsWith(t)))}function l(e){let t,n,u;for(let r of e.split("/"))if(n=o.find(e=>r.startsWith(e))){[t,u]=e.split(n,2);break}if(!t||!n||!u)throw Error(`Invalid interception route: ${e}. Must be in the format //(..|...|..)(..)/`);switch(t=(0,r.normalizeAppPath)(t),n){case"(.)":u="/"===t?`/${u}`:t+"/"+u;break;case"(..)":if("/"===t)throw Error(`Invalid interception route: ${e}. Cannot use (..) marker at the root level, use (.) instead.`);u=t.split("/").slice(0,-1).concat(u).join("/");break;case"(...)":u="/"+u;break;case"(..)(..)":let l=t.split("/");if(l.length<=2)throw Error(`Invalid interception route: ${e}. Cannot use (..)(..) marker at the root level or one level up.`);u=l.slice(0,-2).concat(u).join("/");break;default:throw Error("Invariant: unexpected marker")}return{interceptingRoute:t,interceptedRoute:u}}},30650:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ReflectAdapter",{enumerable:!0,get:function(){return n}});class n{static get(e,t,n){let r=Reflect.get(e,t,n);return"function"==typeof r?r.bind(e):r}static set(e,t,n,r){return Reflect.set(e,t,n,r)}static has(e,t){return Reflect.has(e,t)}static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}}},61956:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{AppRouterContext:function(){return o},GlobalLayoutRouterContext:function(){return l},LayoutRouterContext:function(){return u},MissingSlotContext:function(){return i},TemplateContext:function(){return a}});let r=n(47043)._(n(2265)),o=r.default.createContext(null),u=r.default.createContext(null),l=r.default.createContext(null),a=r.default.createContext(null),i=r.default.createContext(new Set)},37207:function(e,t){"use strict";function n(e){let t=5381;for(let n=0;n>>0}function r(e){return n(e).toString(36).slice(0,5)}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{djb2Hash:function(){return n},hexHash:function(){return r}})},48701:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"HeadManagerContext",{enumerable:!0,get:function(){return r}});let r=n(47043)._(n(2265)).default.createContext({})},79060:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{PathParamsContext:function(){return l},PathnameContext:function(){return u},SearchParamsContext:function(){return o}});let r=n(2265),o=(0,r.createContext)(null),u=(0,r.createContext)(null),l=(0,r.createContext)(null)},18993:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{BailoutToCSRError:function(){return r},isBailoutToCSRError:function(){return o}});let n="BAILOUT_TO_CLIENT_SIDE_RENDERING";class r extends Error{constructor(e){super("Bail out to client-side rendering: "+e),this.reason=e,this.digest=n}}function o(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest===n}},78162:function(e,t){"use strict";function n(e){return e.startsWith("/")?e:"/"+e}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ensureLeadingSlash",{enumerable:!0,get:function(){return n}})},2103:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ActionQueueContext:function(){return a},createMutableActionQueue:function(){return s}});let r=n(53099),o=n(24673),u=n(91450),l=r._(n(2265)),a=l.default.createContext(null);function i(e,t){null!==e.pending&&(e.pending=e.pending.next,null!==e.pending?c({actionQueue:e,action:e.pending,setState:t}):e.needsRefresh&&(e.needsRefresh=!1,e.dispatch({type:o.ACTION_REFRESH,origin:window.location.origin},t)))}async function c(e){let{actionQueue:t,action:n,setState:r}=e,u=t.state;if(!u)throw Error("Invariant: Router state not initialized");t.pending=n;let l=n.payload,a=t.action(u,l);function c(e){n.discarded||(t.state=e,t.devToolsInstance&&t.devToolsInstance.send(l,e),i(t,r),n.resolve(e))}(0,o.isThenable)(a)?a.then(c,e=>{i(t,r),n.reject(e)}):c(a)}function s(){let e={state:null,dispatch:(t,n)=>(function(e,t,n){let r={resolve:n,reject:()=>{}};if(t.type!==o.ACTION_RESTORE){let e=new Promise((e,t)=>{r={resolve:e,reject:t}});(0,l.startTransition)(()=>{n(e)})}let u={payload:t,next:null,resolve:r.resolve,reject:r.reject};null===e.pending?(e.last=u,c({actionQueue:e,action:u,setState:n})):t.type===o.ACTION_NAVIGATE||t.type===o.ACTION_RESTORE?(e.pending.discarded=!0,e.last=u,e.pending.payload.type===o.ACTION_SERVER_ACTION&&(e.needsRefresh=!0),c({actionQueue:e,action:u,setState:n})):(null!==e.last&&(e.last.next=u),e.last=u)})(e,t,n),action:async(e,t)=>{if(null===e)throw Error("Invariant: Router state not initialized");return(0,u.reducer)(e,t)},pending:null,last:null};return e}},68498:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"addPathPrefix",{enumerable:!0,get:function(){return o}});let r=n(63381);function o(e,t){if(!e.startsWith("/")||!t)return e;let{pathname:n,query:o,hash:u}=(0,r.parsePath)(e);return""+t+n+o+u}},20926:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{normalizeAppPath:function(){return u},normalizeRscURL:function(){return l}});let r=n(78162),o=n(84541);function u(e){return(0,r.ensureLeadingSlash)(e.split("/").reduce((e,t,n,r)=>!t||(0,o.isGroupSegment)(t)||"@"===t[0]||("page"===t||"route"===t)&&n===r.length-1?e:e+"/"+t,""))}function l(e){return e.replace(/\.rsc($|\?)/,"$1")}},7092:function(e,t){"use strict";function n(e,t){if(void 0===t&&(t={}),t.onlyHashChange){e();return}let n=document.documentElement,r=n.style.scrollBehavior;n.style.scrollBehavior="auto",t.dontForceLayout||n.getClientRects(),e(),n.style.scrollBehavior=r}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"handleSmoothScroll",{enumerable:!0,get:function(){return n}})},86146:function(e,t){"use strict";function n(e){return/Googlebot|Mediapartners-Google|AdsBot-Google|googleweblight|Storebot-Google|Google-PageRenderer|Bingbot|BingPreview|Slurp|DuckDuckBot|baiduspider|yandex|sogou|LinkedInBot|bitlybot|tumblr|vkShare|quora link preview|facebookexternalhit|facebookcatalog|Twitterbot|applebot|redditbot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|ia_archiver/i.test(e)}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"isBot",{enumerable:!0,get:function(){return n}})},63381:function(e,t){"use strict";function n(e){let t=e.indexOf("#"),n=e.indexOf("?"),r=n>-1&&(t<0||n-1?{pathname:e.substring(0,r?n:t),query:r?e.substring(n,t>-1?t:void 0):"",hash:t>-1?e.slice(t):""}:{pathname:e,query:"",hash:""}}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"parsePath",{enumerable:!0,get:function(){return n}})},10580:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"pathHasPrefix",{enumerable:!0,get:function(){return o}});let r=n(63381);function o(e,t){if("string"!=typeof e)return!1;let{pathname:n}=(0,r.parsePath)(e);return n===t||n.startsWith(t+"/")}},26674:function(e,t){"use strict";function n(e){return e.replace(/\/$/,"")||"/"}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return n}})},84541:function(e,t){"use strict";function n(e){return"("===e[0]&&e.endsWith(")")}Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{DEFAULT_SEGMENT_KEY:function(){return o},PAGE_SEGMENT_KEY:function(){return r},isGroupSegment:function(){return n}});let r="__PAGE__",o="__DEFAULT__"},55501:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var n in t)Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}(t,{ServerInsertedHTMLContext:function(){return o},useServerInsertedHTML:function(){return u}});let r=n(53099)._(n(2265)),o=r.default.createContext(null);function u(e){let t=(0,r.useContext)(o);t&&t(e)}},31765:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},47149:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"actionAsyncStorage",{enumerable:!0,get:function(){return r}});let r=(0,n(54832).createAsyncLocalStorage)();("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},54832:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"createAsyncLocalStorage",{enumerable:!0,get:function(){return u}});let n=Error("Invariant: AsyncLocalStorage accessed in runtime where it is not available");class r{disable(){throw n}getStore(){}run(){throw n}exit(){throw n}enterWith(){throw n}}let o=globalThis.AsyncLocalStorage;function u(){return o?new o:new r}("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},25575:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"requestAsyncStorage",{enumerable:!0,get:function(){return r}});let r=(0,n(54832).createAsyncLocalStorage)();("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},20030:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"staticGenerationAsyncStorage",{enumerable:!0,get:function(){return r}});let r=(0,n(54832).createAsyncLocalStorage)();("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},34040:function(e,t,n){"use strict";var r=n(54887);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},54887:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(84417)},97950:function(e,t,n){"use strict";var r=n(54887),o={stream:!0},u=new Map;function l(e){var t=n(e);return"function"!=typeof t.then||"fulfilled"===t.status?null:(t.then(function(e){t.status="fulfilled",t.value=e},function(e){t.status="rejected",t.reason=e}),t)}function a(){}var i=new Map,c=n.u;n.u=function(e){var t=i.get(e);return void 0!==t?t:c(e)};var s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Dispatcher,f=Symbol.for("react.element"),d=Symbol.for("react.lazy"),p=Symbol.iterator,h=Array.isArray,y=Object.getPrototypeOf,_=Object.prototype,v=new WeakMap;function b(e,t,n,r){this.status=e,this.value=t,this.reason=n,this._response=r}function g(e){switch(e.status){case"resolved_model":E(e);break;case"resolved_module":w(e)}switch(e.status){case"fulfilled":return e.value;case"pending":case"blocked":case"cyclic":throw e;default:throw e.reason}}function m(e,t){for(var n=0;nh?(_=h,h=3,p++):(_=0,h=3);continue;case 2:44===(m=d[p++])?h=4:v=v<<4|(96d.length&&(m=-1)}var O=d.byteOffset+p;if(-1{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),o.createElement("path",{d:"M11.9999 13.1714L16.9497 8.22168L18.3639 9.63589L11.9999 15.9999L5.63599 9.63589L7.0502 8.22168L11.9999 13.1714Z"}))}},4537:function(e,t,n){"use strict";n.d(t,{Z:function(){return i}});var r=n(5853),o=n(2265);let i=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),o.createElement("path",{d:"M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM12 10.5858L9.17157 7.75736L7.75736 9.17157L10.5858 12L7.75736 14.8284L9.17157 16.2426L12 13.4142L14.8284 16.2426L16.2426 14.8284L13.4142 12L16.2426 9.17157L14.8284 7.75736L12 10.5858Z"}))}},75105:function(e,t,n){"use strict";n.d(t,{Z:function(){return et}});var r=n(5853),o=n(2265),i=n(47625),a=n(93765),l=n(87602),c=n(59221),s=n(86757),u=n.n(s),d=n(95645),f=n.n(d),p=n(77571),h=n.n(p),m=n(82559),g=n.n(m),v=n(21652),b=n.n(v),y=n(57165),x=n(81889),w=n(9841),S=n(58772),k=n(34067),E=n(16630),C=n(85355),O=n(82944),j=["layout","type","stroke","connectNulls","isRange","ref"];function P(e){return(P="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function I(){return(I=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(i,j));return o.createElement(w.m,{clipPath:n?"url(#clipPath-".concat(r,")"):null},o.createElement(y.H,I({},(0,O.L6)(d,!0),{points:e,connectNulls:s,type:l,baseLine:t,layout:a,stroke:"none",className:"recharts-area-area"})),"none"!==c&&o.createElement(y.H,I({},(0,O.L6)(this.props,!1),{className:"recharts-area-curve",layout:a,type:l,connectNulls:s,fill:"none",points:e})),"none"!==c&&u&&o.createElement(y.H,I({},(0,O.L6)(this.props,!1),{className:"recharts-area-curve",layout:a,type:l,connectNulls:s,fill:"none",points:t})))}},{key:"renderAreaWithAnimation",value:function(e,t){var n=this,r=this.props,i=r.points,a=r.baseLine,l=r.isAnimationActive,s=r.animationBegin,u=r.animationDuration,d=r.animationEasing,f=r.animationId,p=this.state,m=p.prevPoints,v=p.prevBaseLine;return o.createElement(c.ZP,{begin:s,duration:u,isActive:l,easing:d,from:{t:0},to:{t:1},key:"area-".concat(f),onAnimationEnd:this.handleAnimationEnd,onAnimationStart:this.handleAnimationStart},function(r){var l=r.t;if(m){var c,s=m.length/i.length,u=i.map(function(e,t){var n=Math.floor(t*s);if(m[n]){var r=m[n],o=(0,E.k4)(r.x,e.x),i=(0,E.k4)(r.y,e.y);return M(M({},e),{},{x:o(l),y:i(l)})}return e});return c=(0,E.hj)(a)&&"number"==typeof a?(0,E.k4)(v,a)(l):h()(a)||g()(a)?(0,E.k4)(v,0)(l):a.map(function(e,t){var n=Math.floor(t*s);if(v[n]){var r=v[n],o=(0,E.k4)(r.x,e.x),i=(0,E.k4)(r.y,e.y);return M(M({},e),{},{x:o(l),y:i(l)})}return e}),n.renderAreaStatically(u,c,e,t)}return o.createElement(w.m,null,o.createElement("defs",null,o.createElement("clipPath",{id:"animationClipPath-".concat(t)},n.renderClipRect(l))),o.createElement(w.m,{clipPath:"url(#animationClipPath-".concat(t,")")},n.renderAreaStatically(i,a,e,t)))})}},{key:"renderArea",value:function(e,t){var n=this.props,r=n.points,o=n.baseLine,i=n.isAnimationActive,a=this.state,l=a.prevPoints,c=a.prevBaseLine,s=a.totalLength;return i&&r&&r.length&&(!l&&s>0||!b()(l,r)||!b()(c,o))?this.renderAreaWithAnimation(e,t):this.renderAreaStatically(r,o,e,t)}},{key:"render",value:function(){var e,t=this.props,n=t.hide,r=t.dot,i=t.points,a=t.className,c=t.top,s=t.left,u=t.xAxis,d=t.yAxis,f=t.width,p=t.height,m=t.isAnimationActive,g=t.id;if(n||!i||!i.length)return null;var v=this.state.isAnimationFinished,b=1===i.length,y=(0,l.Z)("recharts-area",a),x=u&&u.allowDataOverflow,k=d&&d.allowDataOverflow,E=x||k,C=h()(g)?this.id:g,j=null!==(e=(0,O.L6)(r,!1))&&void 0!==e?e:{r:3,strokeWidth:2},P=j.r,I=j.strokeWidth,N=((0,O.$k)(r)?r:{}).clipDot,M=void 0===N||N,R=2*(void 0===P?3:P)+(void 0===I?2:I);return o.createElement(w.m,{className:y},x||k?o.createElement("defs",null,o.createElement("clipPath",{id:"clipPath-".concat(C)},o.createElement("rect",{x:x?s:s-f/2,y:k?c:c-p/2,width:x?f:2*f,height:k?p:2*p})),!M&&o.createElement("clipPath",{id:"clipPath-dots-".concat(C)},o.createElement("rect",{x:s-R/2,y:c-R/2,width:f+R,height:p+R}))):null,b?null:this.renderArea(E,C),(r||b)&&this.renderDots(E,M,C),(!m||v)&&S.e.renderCallByParent(this.props,i))}}],r=[{key:"getDerivedStateFromProps",value:function(e,t){return e.animationId!==t.prevAnimationId?{prevAnimationId:e.animationId,curPoints:e.points,curBaseLine:e.baseLine,prevPoints:t.curPoints,prevBaseLine:t.curBaseLine}:e.points!==t.curPoints||e.baseLine!==t.curBaseLine?{curPoints:e.points,curBaseLine:e.baseLine}:null}}],n&&R(a.prototype,n),r&&R(a,r),Object.defineProperty(a,"prototype",{writable:!1}),a}(o.PureComponent);D(L,"displayName","Area"),D(L,"defaultProps",{stroke:"#3182bd",fill:"#3182bd",fillOpacity:.6,xAxisId:0,yAxisId:0,legendType:"line",connectNulls:!1,points:[],dot:!1,activeDot:!0,hide:!1,isAnimationActive:!k.x.isSsr,animationBegin:0,animationDuration:1500,animationEasing:"ease"}),D(L,"getBaseValue",function(e,t,n,r){var o=e.layout,i=e.baseValue,a=t.props.baseValue,l=null!=a?a:i;if((0,E.hj)(l)&&"number"==typeof l)return l;var c="horizontal"===o?r:n,s=c.scale.domain();if("number"===c.type){var u=Math.max(s[0],s[1]),d=Math.min(s[0],s[1]);return"dataMin"===l?d:"dataMax"===l?u:u<0?u:Math.max(Math.min(s[0],s[1]),0)}return"dataMin"===l?s[0]:"dataMax"===l?s[1]:s[0]}),D(L,"getComposedData",function(e){var t,n=e.props,r=e.item,o=e.xAxis,i=e.yAxis,a=e.xAxisTicks,l=e.yAxisTicks,c=e.bandSize,s=e.dataKey,u=e.stackedData,d=e.dataStartIndex,f=e.displayedData,p=e.offset,h=n.layout,m=u&&u.length,g=L.getBaseValue(n,r,o,i),v="horizontal"===h,b=!1,y=f.map(function(e,t){m?n=u[d+t]:Array.isArray(n=(0,C.F$)(e,s))?b=!0:n=[g,n];var n,r=null==n[1]||m&&null==(0,C.F$)(e,s);return v?{x:(0,C.Hv)({axis:o,ticks:a,bandSize:c,entry:e,index:t}),y:r?null:i.scale(n[1]),value:n,payload:e}:{x:r?null:o.scale(n[1]),y:(0,C.Hv)({axis:i,ticks:l,bandSize:c,entry:e,index:t}),value:n,payload:e}});return t=m||b?y.map(function(e){var t=Array.isArray(e.value)?e.value[0]:null;return v?{x:e.x,y:null!=t&&null!=e.y?i.scale(t):null}:{x:null!=t?o.scale(t):null,y:e.y}}):v?i.scale(g):o.scale(g),M({points:y,baseLine:t,layout:h,isRange:b},p)}),D(L,"renderDotItem",function(e,t){return o.isValidElement(e)?o.cloneElement(e,t):u()(e)?e(t):o.createElement(x.o,I({},t,{className:"recharts-area-dot"}))});var z=n(97059),B=n(62994),F=n(25311),H=(0,a.z)({chartName:"AreaChart",GraphicalChild:L,axisComponents:[{axisType:"xAxis",AxisComp:z.K},{axisType:"yAxis",AxisComp:B.B}],formatAxisMap:F.t9}),q=n(56940),W=n(8147),K=n(22190),V=n(54061),U=n(65278),$=n(98593),G=n(69448),X=n(32644),Y=n(7084),Q=n(26898),J=n(97324),ee=n(1153);let et=o.forwardRef((e,t)=>{let{data:n=[],categories:a=[],index:l,stack:c=!1,colors:s=Q.s,valueFormatter:u=ee.Cj,startEndOnly:d=!1,showXAxis:f=!0,showYAxis:p=!0,yAxisWidth:h=56,intervalType:m="equidistantPreserveStart",showAnimation:g=!1,animationDuration:v=900,showTooltip:b=!0,showLegend:y=!0,showGridLines:w=!0,showGradient:S=!0,autoMinValue:k=!1,curveType:E="linear",minValue:C,maxValue:O,connectNulls:j=!1,allowDecimals:P=!0,noDataText:I,className:N,onValueChange:M,enableLegendSlider:R=!1,customTooltip:_,rotateLabelX:T,tickGap:A=5}=e,D=(0,r._T)(e,["data","categories","index","stack","colors","valueFormatter","startEndOnly","showXAxis","showYAxis","yAxisWidth","intervalType","showAnimation","animationDuration","showTooltip","showLegend","showGridLines","showGradient","autoMinValue","curveType","minValue","maxValue","connectNulls","allowDecimals","noDataText","className","onValueChange","enableLegendSlider","customTooltip","rotateLabelX","tickGap"]),Z=(f||p)&&(!d||p)?20:0,[F,et]=(0,o.useState)(60),[en,er]=(0,o.useState)(void 0),[eo,ei]=(0,o.useState)(void 0),ea=(0,X.me)(a,s),el=(0,X.i4)(k,C,O),ec=!!M;function es(e){ec&&(e===eo&&!en||(0,X.FB)(n,e)&&en&&en.dataKey===e?(ei(void 0),null==M||M(null)):(ei(e),null==M||M({eventType:"category",categoryClicked:e})),er(void 0))}return o.createElement("div",Object.assign({ref:t,className:(0,J.q)("w-full h-80",N)},D),o.createElement(i.h,{className:"h-full w-full"},(null==n?void 0:n.length)?o.createElement(H,{data:n,onClick:ec&&(eo||en)?()=>{er(void 0),ei(void 0),null==M||M(null)}:void 0},w?o.createElement(q.q,{className:(0,J.q)("stroke-1","stroke-tremor-border","dark:stroke-dark-tremor-border"),horizontal:!0,vertical:!1}):null,o.createElement(z.K,{padding:{left:Z,right:Z},hide:!f,dataKey:l,tick:{transform:"translate(0, 6)"},ticks:d?[n[0][l],n[n.length-1][l]]:void 0,fill:"",stroke:"",className:(0,J.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),interval:d?"preserveStartEnd":m,tickLine:!1,axisLine:!1,minTickGap:A,angle:null==T?void 0:T.angle,dy:null==T?void 0:T.verticalShift,height:null==T?void 0:T.xAxisHeight}),o.createElement(B.B,{width:h,hide:!p,axisLine:!1,tickLine:!1,type:"number",domain:el,tick:{transform:"translate(-3, 0)"},fill:"",stroke:"",className:(0,J.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickFormatter:u,allowDecimals:P}),o.createElement(W.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,cursor:{stroke:"#d1d5db",strokeWidth:1},content:b?e=>{let{active:t,payload:n,label:r}=e;return _?o.createElement(_,{payload:null==n?void 0:n.map(e=>{var t;return Object.assign(Object.assign({},e),{color:null!==(t=ea.get(e.dataKey))&&void 0!==t?t:Y.fr.Gray})}),active:t,label:r}):o.createElement($.ZP,{active:t,payload:n,label:r,valueFormatter:u,categoryColors:ea})}:o.createElement(o.Fragment,null),position:{y:0}}),y?o.createElement(K.D,{verticalAlign:"top",height:F,content:e=>{let{payload:t}=e;return(0,U.Z)({payload:t},ea,et,eo,ec?e=>es(e):void 0,R)}}):null,a.map(e=>{var t,n;return o.createElement("defs",{key:e},S?o.createElement("linearGradient",{className:(0,ee.bM)(null!==(t=ea.get(e))&&void 0!==t?t:Y.fr.Gray,Q.K.text).textColor,id:ea.get(e),x1:"0",y1:"0",x2:"0",y2:"1"},o.createElement("stop",{offset:"5%",stopColor:"currentColor",stopOpacity:en||eo&&eo!==e?.15:.4}),o.createElement("stop",{offset:"95%",stopColor:"currentColor",stopOpacity:0})):o.createElement("linearGradient",{className:(0,ee.bM)(null!==(n=ea.get(e))&&void 0!==n?n:Y.fr.Gray,Q.K.text).textColor,id:ea.get(e),x1:"0",y1:"0",x2:"0",y2:"1"},o.createElement("stop",{stopColor:"currentColor",stopOpacity:en||eo&&eo!==e?.1:.3})))}),a.map(e=>{var t;return o.createElement(L,{className:(0,ee.bM)(null!==(t=ea.get(e))&&void 0!==t?t:Y.fr.Gray,Q.K.text).strokeColor,strokeOpacity:en||eo&&eo!==e?.3:1,activeDot:e=>{var t;let{cx:r,cy:i,stroke:a,strokeLinecap:l,strokeLinejoin:c,strokeWidth:s,dataKey:u}=e;return o.createElement(x.o,{className:(0,J.q)("stroke-tremor-background dark:stroke-dark-tremor-background",M?"cursor-pointer":"",(0,ee.bM)(null!==(t=ea.get(u))&&void 0!==t?t:Y.fr.Gray,Q.K.text).fillColor),cx:r,cy:i,r:5,fill:"",stroke:a,strokeLinecap:l,strokeLinejoin:c,strokeWidth:s,onClick:(t,r)=>{r.stopPropagation(),ec&&(e.index===(null==en?void 0:en.index)&&e.dataKey===(null==en?void 0:en.dataKey)||(0,X.FB)(n,e.dataKey)&&eo&&eo===e.dataKey?(ei(void 0),er(void 0),null==M||M(null)):(ei(e.dataKey),er({index:e.index,dataKey:e.dataKey}),null==M||M(Object.assign({eventType:"dot",categoryClicked:e.dataKey},e.payload))))}})},dot:t=>{var r;let{stroke:i,strokeLinecap:a,strokeLinejoin:l,strokeWidth:c,cx:s,cy:u,dataKey:d,index:f}=t;return(0,X.FB)(n,e)&&!(en||eo&&eo!==e)||(null==en?void 0:en.index)===f&&(null==en?void 0:en.dataKey)===e?o.createElement(x.o,{key:f,cx:s,cy:u,r:5,stroke:i,fill:"",strokeLinecap:a,strokeLinejoin:l,strokeWidth:c,className:(0,J.q)("stroke-tremor-background dark:stroke-dark-tremor-background",M?"cursor-pointer":"",(0,ee.bM)(null!==(r=ea.get(d))&&void 0!==r?r:Y.fr.Gray,Q.K.text).fillColor)}):o.createElement(o.Fragment,{key:f})},key:e,name:e,type:E,dataKey:e,stroke:"",fill:"url(#".concat(ea.get(e),")"),strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round",isAnimationActive:g,animationDuration:v,stackId:c?"a":void 0,connectNulls:j})}),M?a.map(e=>o.createElement(V.x,{className:(0,J.q)("cursor-pointer"),strokeOpacity:0,key:e,name:e,type:E,dataKey:e,stroke:"transparent",fill:"transparent",legendType:"none",tooltipType:"none",strokeWidth:12,connectNulls:j,onClick:(e,t)=>{t.stopPropagation();let{name:n}=e;es(n)}})):null):o.createElement(G.Z,{noDataText:I})))});et.displayName="AreaChart"},40278:function(e,t,n){"use strict";n.d(t,{Z:function(){return k}});var r=n(5853),o=n(7084),i=n(26898),a=n(97324),l=n(1153),c=n(2265),s=n(47625),u=n(93765),d=n(31699),f=n(97059),p=n(62994),h=n(25311),m=(0,u.z)({chartName:"BarChart",GraphicalChild:d.$,defaultTooltipEventType:"axis",validateTooltipEventTypes:["axis","item"],axisComponents:[{axisType:"xAxis",AxisComp:f.K},{axisType:"yAxis",AxisComp:p.B}],formatAxisMap:h.t9}),g=n(56940),v=n(8147),b=n(22190),y=n(65278),x=n(98593),w=n(69448),S=n(32644);let k=c.forwardRef((e,t)=>{let{data:n=[],categories:u=[],index:h,colors:k=i.s,valueFormatter:E=l.Cj,layout:C="horizontal",stack:O=!1,relative:j=!1,startEndOnly:P=!1,animationDuration:I=900,showAnimation:N=!1,showXAxis:M=!0,showYAxis:R=!0,yAxisWidth:_=56,intervalType:T="equidistantPreserveStart",showTooltip:A=!0,showLegend:D=!0,showGridLines:Z=!0,autoMinValue:L=!1,minValue:z,maxValue:B,allowDecimals:F=!0,noDataText:H,onValueChange:q,enableLegendSlider:W=!1,customTooltip:K,rotateLabelX:V,tickGap:U=5,className:$}=e,G=(0,r._T)(e,["data","categories","index","colors","valueFormatter","layout","stack","relative","startEndOnly","animationDuration","showAnimation","showXAxis","showYAxis","yAxisWidth","intervalType","showTooltip","showLegend","showGridLines","autoMinValue","minValue","maxValue","allowDecimals","noDataText","onValueChange","enableLegendSlider","customTooltip","rotateLabelX","tickGap","className"]),X=M||R?20:0,[Y,Q]=(0,c.useState)(60),J=(0,S.me)(u,k),[ee,et]=c.useState(void 0),[en,er]=(0,c.useState)(void 0),eo=!!q;function ei(e,t,n){var r,o,i,a;n.stopPropagation(),q&&((0,S.vZ)(ee,Object.assign(Object.assign({},e.payload),{value:e.value}))?(er(void 0),et(void 0),null==q||q(null)):(er(null===(o=null===(r=e.tooltipPayload)||void 0===r?void 0:r[0])||void 0===o?void 0:o.dataKey),et(Object.assign(Object.assign({},e.payload),{value:e.value})),null==q||q(Object.assign({eventType:"bar",categoryClicked:null===(a=null===(i=e.tooltipPayload)||void 0===i?void 0:i[0])||void 0===a?void 0:a.dataKey},e.payload))))}let ea=(0,S.i4)(L,z,B);return c.createElement("div",Object.assign({ref:t,className:(0,a.q)("w-full h-80",$)},G),c.createElement(s.h,{className:"h-full w-full"},(null==n?void 0:n.length)?c.createElement(m,{data:n,stackOffset:O?"sign":j?"expand":"none",layout:"vertical"===C?"vertical":"horizontal",onClick:eo&&(en||ee)?()=>{et(void 0),er(void 0),null==q||q(null)}:void 0},Z?c.createElement(g.q,{className:(0,a.q)("stroke-1","stroke-tremor-border","dark:stroke-dark-tremor-border"),horizontal:"vertical"!==C,vertical:"vertical"===C}):null,"vertical"!==C?c.createElement(f.K,{padding:{left:X,right:X},hide:!M,dataKey:h,interval:P?"preserveStartEnd":T,tick:{transform:"translate(0, 6)"},ticks:P?[n[0][h],n[n.length-1][h]]:void 0,fill:"",stroke:"",className:(0,a.q)("mt-4 text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickLine:!1,axisLine:!1,angle:null==V?void 0:V.angle,dy:null==V?void 0:V.verticalShift,height:null==V?void 0:V.xAxisHeight,minTickGap:U}):c.createElement(f.K,{hide:!M,type:"number",tick:{transform:"translate(-3, 0)"},domain:ea,fill:"",stroke:"",className:(0,a.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickLine:!1,axisLine:!1,tickFormatter:E,minTickGap:U,allowDecimals:F,angle:null==V?void 0:V.angle,dy:null==V?void 0:V.verticalShift,height:null==V?void 0:V.xAxisHeight}),"vertical"!==C?c.createElement(p.B,{width:_,hide:!R,axisLine:!1,tickLine:!1,type:"number",domain:ea,tick:{transform:"translate(-3, 0)"},fill:"",stroke:"",className:(0,a.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickFormatter:j?e=>"".concat((100*e).toString()," %"):E,allowDecimals:F}):c.createElement(p.B,{width:_,hide:!R,dataKey:h,axisLine:!1,tickLine:!1,ticks:P?[n[0][h],n[n.length-1][h]]:void 0,type:"category",interval:"preserveStartEnd",tick:{transform:"translate(0, 6)"},fill:"",stroke:"",className:(0,a.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content")}),c.createElement(v.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,cursor:{fill:"#d1d5db",opacity:"0.15"},content:A?e=>{let{active:t,payload:n,label:r}=e;return K?c.createElement(K,{payload:null==n?void 0:n.map(e=>{var t;return Object.assign(Object.assign({},e),{color:null!==(t=J.get(e.dataKey))&&void 0!==t?t:o.fr.Gray})}),active:t,label:r}):c.createElement(x.ZP,{active:t,payload:n,label:r,valueFormatter:E,categoryColors:J})}:c.createElement(c.Fragment,null),position:{y:0}}),D?c.createElement(b.D,{verticalAlign:"top",height:Y,content:e=>{let{payload:t}=e;return(0,y.Z)({payload:t},J,Q,en,eo?e=>{eo&&(e!==en||ee?(er(e),null==q||q({eventType:"category",categoryClicked:e})):(er(void 0),null==q||q(null)),et(void 0))}:void 0,W)}}):null,u.map(e=>{var t;return c.createElement(d.$,{className:(0,a.q)((0,l.bM)(null!==(t=J.get(e))&&void 0!==t?t:o.fr.Gray,i.K.background).fillColor,q?"cursor-pointer":""),key:e,name:e,type:"linear",stackId:O||j?"a":void 0,dataKey:e,fill:"",isAnimationActive:N,animationDuration:I,shape:e=>((e,t,n,r)=>{let{fillOpacity:o,name:i,payload:a,value:l}=e,{x:s,width:u,y:d,height:f}=e;return"horizontal"===r&&f<0?(d+=f,f=Math.abs(f)):"vertical"===r&&u<0&&(s+=u,u=Math.abs(u)),c.createElement("rect",{x:s,y:d,width:u,height:f,opacity:t||n&&n!==i?(0,S.vZ)(t,Object.assign(Object.assign({},a),{value:l}))?o:.3:o})})(e,ee,en,C),onClick:ei})})):c.createElement(w.Z,{noDataText:H})))});k.displayName="BarChart"},14042:function(e,t,n){"use strict";n.d(t,{Z:function(){return ez}});var r=n(5853),o=n(7084),i=n(26898),a=n(97324),l=n(1153),c=n(2265),s=n(60474),u=n(47625),d=n(93765),f=n(86757),p=n.n(f),h=n(9841),m=n(81889),g=n(87602),v=n(82944),b=["points","className","baseLinePoints","connectNulls"];function y(){return(y=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);n0&&void 0!==arguments[0]?arguments[0]:[],t=[[]];return e.forEach(function(e){S(e)?t[t.length-1].push(e):t[t.length-1].length>0&&t.push([])}),S(e[0])&&t[t.length-1].push(e[0]),t[t.length-1].length<=0&&(t=t.slice(0,-1)),t},E=function(e,t){var n=k(e);t&&(n=[n.reduce(function(e,t){return[].concat(x(e),x(t))},[])]);var r=n.map(function(e){return e.reduce(function(e,t,n){return"".concat(e).concat(0===n?"M":"L").concat(t.x,",").concat(t.y)},"")}).join("");return 1===n.length?"".concat(r,"Z"):r},C=function(e,t,n){var r=E(e,n);return"".concat("Z"===r.slice(-1)?r.slice(0,-1):r,"L").concat(E(t.reverse(),n).slice(1))},O=function(e){var t=e.points,n=e.className,r=e.baseLinePoints,o=e.connectNulls,i=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,b);if(!t||!t.length)return null;var a=(0,g.Z)("recharts-polygon",n);if(r&&r.length){var l=i.stroke&&"none"!==i.stroke,s=C(t,r,o);return c.createElement("g",{className:a},c.createElement("path",y({},(0,v.L6)(i,!0),{fill:"Z"===s.slice(-1)?i.fill:"none",stroke:"none",d:s})),l?c.createElement("path",y({},(0,v.L6)(i,!0),{fill:"none",d:E(t,o)})):null,l?c.createElement("path",y({},(0,v.L6)(i,!0),{fill:"none",d:E(r,o)})):null)}var u=E(t,o);return c.createElement("path",y({},(0,v.L6)(i,!0),{fill:"Z"===u.slice(-1)?i.fill:"none",className:a,d:u}))},j=n(58811),P=n(41637),I=n(39206);function N(e){return(N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function M(){return(M=Object.assign?Object.assign.bind():function(e){for(var t=1;t1e-5?"outer"===t?"start":"end":n<-.00001?"outer"===t?"end":"start":"middle"}},{key:"renderAxisLine",value:function(){var e=this.props,t=e.cx,n=e.cy,r=e.radius,o=e.axisLine,i=e.axisLineType,a=_(_({},(0,v.L6)(this.props,!1)),{},{fill:"none"},(0,v.L6)(o,!1));if("circle"===i)return c.createElement(m.o,M({className:"recharts-polar-angle-axis-line"},a,{cx:t,cy:n,r:r}));var l=this.props.ticks.map(function(e){return(0,I.op)(t,n,r,e.coordinate)});return c.createElement(O,M({className:"recharts-polar-angle-axis-line"},a,{points:l}))}},{key:"renderTicks",value:function(){var e=this,t=this.props,n=t.ticks,r=t.tick,o=t.tickLine,a=t.tickFormatter,l=t.stroke,s=(0,v.L6)(this.props,!1),u=(0,v.L6)(r,!1),d=_(_({},s),{},{fill:"none"},(0,v.L6)(o,!1)),f=n.map(function(t,n){var f=e.getTickLineCoord(t),p=_(_(_({textAnchor:e.getTickTextAnchor(t)},s),{},{stroke:"none",fill:l},u),{},{index:n,payload:t,x:f.x2,y:f.y2});return c.createElement(h.m,M({className:"recharts-polar-angle-axis-tick",key:"tick-".concat(t.coordinate)},(0,P.bw)(e.props,t,n)),o&&c.createElement("line",M({className:"recharts-polar-angle-axis-tick-line"},d,f)),r&&i.renderTickItem(r,p,a?a(t.value,n):t.value))});return c.createElement(h.m,{className:"recharts-polar-angle-axis-ticks"},f)}},{key:"render",value:function(){var e=this.props,t=e.ticks,n=e.radius,r=e.axisLine;return!(n<=0)&&t&&t.length?c.createElement(h.m,{className:"recharts-polar-angle-axis"},r&&this.renderAxisLine(),this.renderTicks()):null}}],r=[{key:"renderTickItem",value:function(e,t,n){return c.isValidElement(e)?c.cloneElement(e,t):p()(e)?e(t):c.createElement(j.x,M({},t,{className:"recharts-polar-angle-axis-tick-value"}),n)}}],n&&T(i.prototype,n),r&&T(i,r),Object.defineProperty(i,"prototype",{writable:!1}),i}(c.PureComponent);Z(B,"displayName","PolarAngleAxis"),Z(B,"axisType","angleAxis"),Z(B,"defaultProps",{type:"category",angleAxisId:0,scale:"auto",cx:0,cy:0,orientation:"outer",axisLine:!0,tickLine:!0,tickSize:8,tick:!0,hide:!1,allowDuplicatedCategory:!0});var F=n(35802),H=n.n(F),q=n(37891),W=n.n(q),K=n(26680),V=["cx","cy","angle","ticks","axisLine"],U=["ticks","tick","angle","tickFormatter","stroke"];function $(e){return($="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function G(){return(G=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function J(e,t){for(var n=0;n0?el()(e,"paddingAngle",0):0;if(n){var l=(0,eg.k4)(n.endAngle-n.startAngle,e.endAngle-e.startAngle),c=ek(ek({},e),{},{startAngle:i+a,endAngle:i+l(r)+a});o.push(c),i=c.endAngle}else{var s=e.endAngle,d=e.startAngle,f=(0,eg.k4)(0,s-d)(r),p=ek(ek({},e),{},{startAngle:i+a,endAngle:i+f+a});o.push(p),i=p.endAngle}}),c.createElement(h.m,null,e.renderSectorsStatically(o))})}},{key:"attachKeyboardHandlers",value:function(e){var t=this;e.onkeydown=function(e){if(!e.altKey)switch(e.key){case"ArrowLeft":var n=++t.state.sectorToFocus%t.sectorRefs.length;t.sectorRefs[n].focus(),t.setState({sectorToFocus:n});break;case"ArrowRight":var r=--t.state.sectorToFocus<0?t.sectorRefs.length-1:t.state.sectorToFocus%t.sectorRefs.length;t.sectorRefs[r].focus(),t.setState({sectorToFocus:r});break;case"Escape":t.sectorRefs[t.state.sectorToFocus].blur(),t.setState({sectorToFocus:0})}}}},{key:"renderSectors",value:function(){var e=this.props,t=e.sectors,n=e.isAnimationActive,r=this.state.prevSectors;return n&&t&&t.length&&(!r||!es()(r,t))?this.renderSectorsWithAnimation():this.renderSectorsStatically(t)}},{key:"componentDidMount",value:function(){this.pieRef&&this.attachKeyboardHandlers(this.pieRef)}},{key:"render",value:function(){var e=this,t=this.props,n=t.hide,r=t.sectors,o=t.className,i=t.label,a=t.cx,l=t.cy,s=t.innerRadius,u=t.outerRadius,d=t.isAnimationActive,f=this.state.isAnimationFinished;if(n||!r||!r.length||!(0,eg.hj)(a)||!(0,eg.hj)(l)||!(0,eg.hj)(s)||!(0,eg.hj)(u))return null;var p=(0,g.Z)("recharts-pie",o);return c.createElement(h.m,{tabIndex:this.props.rootTabIndex,className:p,ref:function(t){e.pieRef=t}},this.renderSectors(),i&&this.renderLabels(r),K._.renderCallByParent(this.props,null,!1),(!d||f)&&ep.e.renderCallByParent(this.props,r,!1))}}],r=[{key:"getDerivedStateFromProps",value:function(e,t){return t.prevIsAnimationActive!==e.isAnimationActive?{prevIsAnimationActive:e.isAnimationActive,prevAnimationId:e.animationId,curSectors:e.sectors,prevSectors:[],isAnimationFinished:!0}:e.isAnimationActive&&e.animationId!==t.prevAnimationId?{prevAnimationId:e.animationId,curSectors:e.sectors,prevSectors:t.curSectors,isAnimationFinished:!0}:e.sectors!==t.curSectors?{curSectors:e.sectors,isAnimationFinished:!0}:null}},{key:"getTextAnchor",value:function(e,t){return e>t?"start":e=360?x:x-1)*u,S=i.reduce(function(e,t){var n=(0,ev.F$)(t,y,0);return e+((0,eg.hj)(n)?n:0)},0);return S>0&&(t=i.map(function(e,t){var r,o=(0,ev.F$)(e,y,0),i=(0,ev.F$)(e,f,t),a=((0,eg.hj)(o)?o:0)/S,s=(r=t?n.endAngle+(0,eg.uY)(v)*u*(0!==o?1:0):c)+(0,eg.uY)(v)*((0!==o?m:0)+a*w),d=(r+s)/2,p=(g.innerRadius+g.outerRadius)/2,b=[{name:i,value:o,payload:e,dataKey:y,type:h}],x=(0,I.op)(g.cx,g.cy,p,d);return n=ek(ek(ek({percent:a,cornerRadius:l,name:i,tooltipPayload:b,midAngle:d,middleRadius:p,tooltipPosition:x},e),g),{},{value:(0,ev.F$)(e,y),startAngle:r,endAngle:s,payload:e,paddingAngle:(0,eg.uY)(v)*u})})),ek(ek({},g),{},{sectors:t,data:i})});var eM=(0,d.z)({chartName:"PieChart",GraphicalChild:eN,validateTooltipEventTypes:["item"],defaultTooltipEventType:"item",legendContent:"children",axisComponents:[{axisType:"angleAxis",AxisComp:B},{axisType:"radiusAxis",AxisComp:eo}],formatAxisMap:I.t9,defaultProps:{layout:"centric",startAngle:0,endAngle:360,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}}),eR=n(8147),e_=n(69448),eT=n(98593);let eA=e=>{let{active:t,payload:n,valueFormatter:r}=e;if(t&&(null==n?void 0:n[0])){let e=null==n?void 0:n[0];return c.createElement(eT.$B,null,c.createElement("div",{className:(0,a.q)("px-4 py-2")},c.createElement(eT.zX,{value:r(e.value),name:e.name,color:e.payload.color})))}return null},eD=(e,t)=>e.map((e,n)=>{let r=ne||t((0,l.vP)(n.map(e=>e[r]))),eL=e=>{let{cx:t,cy:n,innerRadius:r,outerRadius:o,startAngle:i,endAngle:a,className:l}=e;return c.createElement("g",null,c.createElement(s.L,{cx:t,cy:n,innerRadius:r,outerRadius:o,startAngle:i,endAngle:a,className:l,fill:"",opacity:.3,style:{outline:"none"}}))},ez=c.forwardRef((e,t)=>{let{data:n=[],category:s="value",index:d="name",colors:f=i.s,variant:p="donut",valueFormatter:h=l.Cj,label:m,showLabel:g=!0,animationDuration:v=900,showAnimation:b=!1,showTooltip:y=!0,noDataText:x,onValueChange:w,customTooltip:S,className:k}=e,E=(0,r._T)(e,["data","category","index","colors","variant","valueFormatter","label","showLabel","animationDuration","showAnimation","showTooltip","noDataText","onValueChange","customTooltip","className"]),C="donut"==p,O=eZ(m,h,n,s),[j,P]=c.useState(void 0),I=!!w;return(0,c.useEffect)(()=>{let e=document.querySelectorAll(".recharts-pie-sector");e&&e.forEach(e=>{e.setAttribute("style","outline: none")})},[j]),c.createElement("div",Object.assign({ref:t,className:(0,a.q)("w-full h-40",k)},E),c.createElement(u.h,{className:"h-full w-full"},(null==n?void 0:n.length)?c.createElement(eM,{onClick:I&&j?()=>{P(void 0),null==w||w(null)}:void 0,margin:{top:0,left:0,right:0,bottom:0}},g&&C?c.createElement("text",{className:(0,a.q)("fill-tremor-content-emphasis","dark:fill-dark-tremor-content-emphasis"),x:"50%",y:"50%",textAnchor:"middle",dominantBaseline:"middle"},O):null,c.createElement(eN,{className:(0,a.q)("stroke-tremor-background dark:stroke-dark-tremor-background",w?"cursor-pointer":"cursor-default"),data:eD(n,f),cx:"50%",cy:"50%",startAngle:90,endAngle:-270,innerRadius:C?"75%":"0%",outerRadius:"100%",stroke:"",strokeLinejoin:"round",dataKey:s,nameKey:d,isAnimationActive:b,animationDuration:v,onClick:function(e,t,n){n.stopPropagation(),I&&(j===t?(P(void 0),null==w||w(null)):(P(t),null==w||w(Object.assign({eventType:"slice"},e.payload.payload))))},activeIndex:j,inactiveShape:eL,style:{outline:"none"}}),c.createElement(eR.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,content:y?e=>{var t;let{active:n,payload:r}=e;return S?c.createElement(S,{payload:null==r?void 0:r.map(e=>{var t,n,i;return Object.assign(Object.assign({},e),{color:null!==(i=null===(n=null===(t=null==r?void 0:r[0])||void 0===t?void 0:t.payload)||void 0===n?void 0:n.color)&&void 0!==i?i:o.fr.Gray})}),active:n,label:null===(t=null==r?void 0:r[0])||void 0===t?void 0:t.name}):c.createElement(eA,{active:n,payload:r,valueFormatter:h})}:c.createElement(c.Fragment,null)})):c.createElement(e_.Z,{noDataText:x})))});ez.displayName="DonutChart"},59664:function(e,t,n){"use strict";n.d(t,{Z:function(){return E}});var r=n(5853),o=n(2265),i=n(47625),a=n(93765),l=n(54061),c=n(97059),s=n(62994),u=n(25311),d=(0,a.z)({chartName:"LineChart",GraphicalChild:l.x,axisComponents:[{axisType:"xAxis",AxisComp:c.K},{axisType:"yAxis",AxisComp:s.B}],formatAxisMap:u.t9}),f=n(56940),p=n(8147),h=n(22190),m=n(81889),g=n(65278),v=n(98593),b=n(69448),y=n(32644),x=n(7084),w=n(26898),S=n(97324),k=n(1153);let E=o.forwardRef((e,t)=>{let{data:n=[],categories:a=[],index:u,colors:E=w.s,valueFormatter:C=k.Cj,startEndOnly:O=!1,showXAxis:j=!0,showYAxis:P=!0,yAxisWidth:I=56,intervalType:N="equidistantPreserveStart",animationDuration:M=900,showAnimation:R=!1,showTooltip:_=!0,showLegend:T=!0,showGridLines:A=!0,autoMinValue:D=!1,curveType:Z="linear",minValue:L,maxValue:z,connectNulls:B=!1,allowDecimals:F=!0,noDataText:H,className:q,onValueChange:W,enableLegendSlider:K=!1,customTooltip:V,rotateLabelX:U,tickGap:$=5}=e,G=(0,r._T)(e,["data","categories","index","colors","valueFormatter","startEndOnly","showXAxis","showYAxis","yAxisWidth","intervalType","animationDuration","showAnimation","showTooltip","showLegend","showGridLines","autoMinValue","curveType","minValue","maxValue","connectNulls","allowDecimals","noDataText","className","onValueChange","enableLegendSlider","customTooltip","rotateLabelX","tickGap"]),X=j||P?20:0,[Y,Q]=(0,o.useState)(60),[J,ee]=(0,o.useState)(void 0),[et,en]=(0,o.useState)(void 0),er=(0,y.me)(a,E),eo=(0,y.i4)(D,L,z),ei=!!W;function ea(e){ei&&(e===et&&!J||(0,y.FB)(n,e)&&J&&J.dataKey===e?(en(void 0),null==W||W(null)):(en(e),null==W||W({eventType:"category",categoryClicked:e})),ee(void 0))}return o.createElement("div",Object.assign({ref:t,className:(0,S.q)("w-full h-80",q)},G),o.createElement(i.h,{className:"h-full w-full"},(null==n?void 0:n.length)?o.createElement(d,{data:n,onClick:ei&&(et||J)?()=>{ee(void 0),en(void 0),null==W||W(null)}:void 0},A?o.createElement(f.q,{className:(0,S.q)("stroke-1","stroke-tremor-border","dark:stroke-dark-tremor-border"),horizontal:!0,vertical:!1}):null,o.createElement(c.K,{padding:{left:X,right:X},hide:!j,dataKey:u,interval:O?"preserveStartEnd":N,tick:{transform:"translate(0, 6)"},ticks:O?[n[0][u],n[n.length-1][u]]:void 0,fill:"",stroke:"",className:(0,S.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickLine:!1,axisLine:!1,minTickGap:$,angle:null==U?void 0:U.angle,dy:null==U?void 0:U.verticalShift,height:null==U?void 0:U.xAxisHeight}),o.createElement(s.B,{width:I,hide:!P,axisLine:!1,tickLine:!1,type:"number",domain:eo,tick:{transform:"translate(-3, 0)"},fill:"",stroke:"",className:(0,S.q)("text-tremor-label","fill-tremor-content","dark:fill-dark-tremor-content"),tickFormatter:C,allowDecimals:F}),o.createElement(p.u,{wrapperStyle:{outline:"none"},isAnimationActive:!1,cursor:{stroke:"#d1d5db",strokeWidth:1},content:_?e=>{let{active:t,payload:n,label:r}=e;return V?o.createElement(V,{payload:null==n?void 0:n.map(e=>{var t;return Object.assign(Object.assign({},e),{color:null!==(t=er.get(e.dataKey))&&void 0!==t?t:x.fr.Gray})}),active:t,label:r}):o.createElement(v.ZP,{active:t,payload:n,label:r,valueFormatter:C,categoryColors:er})}:o.createElement(o.Fragment,null),position:{y:0}}),T?o.createElement(h.D,{verticalAlign:"top",height:Y,content:e=>{let{payload:t}=e;return(0,g.Z)({payload:t},er,Q,et,ei?e=>ea(e):void 0,K)}}):null,a.map(e=>{var t;return o.createElement(l.x,{className:(0,S.q)((0,k.bM)(null!==(t=er.get(e))&&void 0!==t?t:x.fr.Gray,w.K.text).strokeColor),strokeOpacity:J||et&&et!==e?.3:1,activeDot:e=>{var t;let{cx:r,cy:i,stroke:a,strokeLinecap:l,strokeLinejoin:c,strokeWidth:s,dataKey:u}=e;return o.createElement(m.o,{className:(0,S.q)("stroke-tremor-background dark:stroke-dark-tremor-background",W?"cursor-pointer":"",(0,k.bM)(null!==(t=er.get(u))&&void 0!==t?t:x.fr.Gray,w.K.text).fillColor),cx:r,cy:i,r:5,fill:"",stroke:a,strokeLinecap:l,strokeLinejoin:c,strokeWidth:s,onClick:(t,r)=>{r.stopPropagation(),ei&&(e.index===(null==J?void 0:J.index)&&e.dataKey===(null==J?void 0:J.dataKey)||(0,y.FB)(n,e.dataKey)&&et&&et===e.dataKey?(en(void 0),ee(void 0),null==W||W(null)):(en(e.dataKey),ee({index:e.index,dataKey:e.dataKey}),null==W||W(Object.assign({eventType:"dot",categoryClicked:e.dataKey},e.payload))))}})},dot:t=>{var r;let{stroke:i,strokeLinecap:a,strokeLinejoin:l,strokeWidth:c,cx:s,cy:u,dataKey:d,index:f}=t;return(0,y.FB)(n,e)&&!(J||et&&et!==e)||(null==J?void 0:J.index)===f&&(null==J?void 0:J.dataKey)===e?o.createElement(m.o,{key:f,cx:s,cy:u,r:5,stroke:i,fill:"",strokeLinecap:a,strokeLinejoin:l,strokeWidth:c,className:(0,S.q)("stroke-tremor-background dark:stroke-dark-tremor-background",W?"cursor-pointer":"",(0,k.bM)(null!==(r=er.get(d))&&void 0!==r?r:x.fr.Gray,w.K.text).fillColor)}):o.createElement(o.Fragment,{key:f})},key:e,name:e,type:Z,dataKey:e,stroke:"",strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round",isAnimationActive:R,animationDuration:M,connectNulls:B})}),W?a.map(e=>o.createElement(l.x,{className:(0,S.q)("cursor-pointer"),strokeOpacity:0,key:e,name:e,type:Z,dataKey:e,stroke:"transparent",fill:"transparent",legendType:"none",tooltipType:"none",strokeWidth:12,connectNulls:B,onClick:(e,t)=>{t.stopPropagation();let{name:n}=e;ea(n)}})):null):o.createElement(b.Z,{noDataText:H})))});E.displayName="LineChart"},65278:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var r=n(2265);let o=(e,t)=>{let[n,o]=(0,r.useState)(t);(0,r.useEffect)(()=>{let t=()=>{o(window.innerWidth),e()};return t(),window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[e,n])};var i=n(5853),a=n(26898),l=n(97324),c=n(1153);let s=e=>{var t=(0,i._T)(e,[]);return r.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),r.createElement("path",{d:"M8 12L14 6V18L8 12Z"}))},u=e=>{var t=(0,i._T)(e,[]);return r.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"}),r.createElement("path",{d:"M16 12L10 18V6L16 12Z"}))},d=(0,c.fn)("Legend"),f=e=>{let{name:t,color:n,onClick:o,activeLegend:i}=e,s=!!o;return r.createElement("li",{className:(0,l.q)(d("legendItem"),"group inline-flex items-center px-2 py-0.5 rounded-tremor-small transition whitespace-nowrap",s?"cursor-pointer":"cursor-default","text-tremor-content",s?"hover:bg-tremor-background-subtle":"","dark:text-dark-tremor-content",s?"dark:hover:bg-dark-tremor-background-subtle":""),onClick:e=>{e.stopPropagation(),null==o||o(t,n)}},r.createElement("svg",{className:(0,l.q)("flex-none h-2 w-2 mr-1.5",(0,c.bM)(n,a.K.text).textColor,i&&i!==t?"opacity-40":"opacity-100"),fill:"currentColor",viewBox:"0 0 8 8"},r.createElement("circle",{cx:4,cy:4,r:4})),r.createElement("p",{className:(0,l.q)("whitespace-nowrap truncate text-tremor-default","text-tremor-content",s?"group-hover:text-tremor-content-emphasis":"","dark:text-dark-tremor-content",i&&i!==t?"opacity-40":"opacity-100",s?"dark:group-hover:text-dark-tremor-content-emphasis":"")},t))},p=e=>{let{icon:t,onClick:n,disabled:o}=e,[i,a]=r.useState(!1),c=r.useRef(null);return r.useEffect(()=>(i?c.current=setInterval(()=>{null==n||n()},300):clearInterval(c.current),()=>clearInterval(c.current)),[i,n]),(0,r.useEffect)(()=>{o&&(clearInterval(c.current),a(!1))},[o]),r.createElement("button",{type:"button",className:(0,l.q)(d("legendSliderButton"),"w-5 group inline-flex items-center truncate rounded-tremor-small transition",o?"cursor-not-allowed":"cursor-pointer",o?"text-tremor-content-subtle":"text-tremor-content hover:text-tremor-content-emphasis hover:bg-tremor-background-subtle",o?"dark:text-dark-tremor-subtle":"dark:text-dark-tremor dark:hover:text-tremor-content-emphasis dark:hover:bg-dark-tremor-background-subtle"),disabled:o,onClick:e=>{e.stopPropagation(),null==n||n()},onMouseDown:e=>{e.stopPropagation(),a(!0)},onMouseUp:e=>{e.stopPropagation(),a(!1)}},r.createElement(t,{className:"w-full"}))},h=r.forwardRef((e,t)=>{var n,o;let{categories:c,colors:h=a.s,className:m,onClickLegendItem:g,activeLegend:v,enableLegendSlider:b=!1}=e,y=(0,i._T)(e,["categories","colors","className","onClickLegendItem","activeLegend","enableLegendSlider"]),x=r.useRef(null),[w,S]=r.useState(null),[k,E]=r.useState(null),C=r.useRef(null),O=(0,r.useCallback)(()=>{let e=null==x?void 0:x.current;e&&S({left:e.scrollLeft>0,right:e.scrollWidth-e.clientWidth>e.scrollLeft})},[S]),j=(0,r.useCallback)(e=>{var t;let n=null==x?void 0:x.current,r=null!==(t=null==n?void 0:n.clientWidth)&&void 0!==t?t:0;n&&b&&(n.scrollTo({left:"left"===e?n.scrollLeft-r:n.scrollLeft+r,behavior:"smooth"}),setTimeout(()=>{O()},400))},[b,O]);r.useEffect(()=>{let e=e=>{"ArrowLeft"===e?j("left"):"ArrowRight"===e&&j("right")};return k?(e(k),C.current=setInterval(()=>{e(k)},300)):clearInterval(C.current),()=>clearInterval(C.current)},[k,j]);let P=e=>{e.stopPropagation(),"ArrowLeft"!==e.key&&"ArrowRight"!==e.key||(e.preventDefault(),E(e.key))},I=e=>{e.stopPropagation(),E(null)};return r.useEffect(()=>{let e=null==x?void 0:x.current;return b&&(O(),null==e||e.addEventListener("keydown",P),null==e||e.addEventListener("keyup",I)),()=>{null==e||e.removeEventListener("keydown",P),null==e||e.removeEventListener("keyup",I)}},[O,b]),r.createElement("ol",Object.assign({ref:t,className:(0,l.q)(d("root"),"relative overflow-hidden",m)},y),r.createElement("div",{ref:x,tabIndex:0,className:(0,l.q)("h-full flex",b?(null==w?void 0:w.right)||(null==w?void 0:w.left)?"pl-4 pr-12 items-center overflow-auto snap-mandatory [&::-webkit-scrollbar]:hidden [scrollbar-width:none]":"":"flex-wrap")},c.map((e,t)=>r.createElement(f,{key:"item-".concat(t),name:e,color:h[t],onClick:g,activeLegend:v}))),b&&((null==w?void 0:w.right)||(null==w?void 0:w.left))?r.createElement(r.Fragment,null,r.createElement("div",{className:(0,l.q)("from-tremor-background","dark:from-dark-tremor-background","absolute top-0 bottom-0 left-0 w-4 bg-gradient-to-r to-transparent pointer-events-none")}),r.createElement("div",{className:(0,l.q)("to-tremor-background","dark:to-dark-tremor-background","absolute top-0 bottom-0 right-10 w-4 bg-gradient-to-r from-transparent pointer-events-none")}),r.createElement("div",{className:(0,l.q)("bg-tremor-background","dark:bg-dark-tremor-background","absolute flex top-0 pr-1 bottom-0 right-0 items-center justify-center h-full")},r.createElement(p,{icon:s,onClick:()=>{E(null),j("left")},disabled:!(null==w?void 0:w.left)}),r.createElement(p,{icon:u,onClick:()=>{E(null),j("right")},disabled:!(null==w?void 0:w.right)}))):null)});h.displayName="Legend";let m=(e,t,n,i,a,l)=>{let{payload:c}=e,s=(0,r.useRef)(null);o(()=>{var e,t;n((t=null===(e=s.current)||void 0===e?void 0:e.clientHeight)?Number(t)+20:60)});let u=c.filter(e=>"none"!==e.type);return r.createElement("div",{ref:s,className:"flex items-center justify-end"},r.createElement(h,{categories:u.map(e=>e.value),colors:u.map(e=>t.get(e.value)),onClickLegendItem:a,activeLegend:i,enableLegendSlider:l}))}},98593:function(e,t,n){"use strict";n.d(t,{$B:function(){return c},ZP:function(){return u},zX:function(){return s}});var r=n(2265),o=n(7084),i=n(26898),a=n(97324),l=n(1153);let c=e=>{let{children:t}=e;return r.createElement("div",{className:(0,a.q)("rounded-tremor-default text-tremor-default border","bg-tremor-background shadow-tremor-dropdown border-tremor-border","dark:bg-dark-tremor-background dark:shadow-dark-tremor-dropdown dark:border-dark-tremor-border")},t)},s=e=>{let{value:t,name:n,color:o}=e;return r.createElement("div",{className:"flex items-center justify-between space-x-8"},r.createElement("div",{className:"flex items-center space-x-2"},r.createElement("span",{className:(0,a.q)("shrink-0 rounded-tremor-full border-2 h-3 w-3","border-tremor-background shadow-tremor-card","dark:border-dark-tremor-background dark:shadow-dark-tremor-card",(0,l.bM)(o,i.K.background).bgColor)}),r.createElement("p",{className:(0,a.q)("text-right whitespace-nowrap","text-tremor-content","dark:text-dark-tremor-content")},n)),r.createElement("p",{className:(0,a.q)("font-medium tabular-nums text-right whitespace-nowrap","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis")},t))},u=e=>{let{active:t,payload:n,label:i,categoryColors:l,valueFormatter:u}=e;if(t&&n){let e=n.filter(e=>"none"!==e.type);return r.createElement(c,null,r.createElement("div",{className:(0,a.q)("border-tremor-border border-b px-4 py-2","dark:border-dark-tremor-border")},r.createElement("p",{className:(0,a.q)("font-medium","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis")},i)),r.createElement("div",{className:(0,a.q)("px-4 py-2 space-y-1")},e.map((e,t)=>{var n;let{value:i,name:a}=e;return r.createElement(s,{key:"id-".concat(t),value:u(i),name:a,color:null!==(n=l.get(a))&&void 0!==n?n:o.fr.Blue})})))}return null}},69448:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var r=n(97324),o=n(2265),i=n(5853);let a=(0,n(1153).fn)("Flex"),l={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"},c={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"},s={row:"flex-row",col:"flex-col","row-reverse":"flex-row-reverse","col-reverse":"flex-col-reverse"},u=o.forwardRef((e,t)=>{let{flexDirection:n="row",justifyContent:u="between",alignItems:d="center",children:f,className:p}=e,h=(0,i._T)(e,["flexDirection","justifyContent","alignItems","children","className"]);return o.createElement("div",Object.assign({ref:t,className:(0,r.q)(a("root"),"flex w-full",s[n],l[u],c[d],p)},h),f)});u.displayName="Flex";var d=n(84264);let f=e=>{let{noDataText:t="No data"}=e;return o.createElement(u,{alignItems:"center",justifyContent:"center",className:(0,r.q)("w-full h-full border border-dashed rounded-tremor-default","border-tremor-border","dark:border-dark-tremor-border")},o.createElement(d.Z,{className:(0,r.q)("text-tremor-content","dark:text-dark-tremor-content")},t))}},32644:function(e,t,n){"use strict";n.d(t,{FB:function(){return i},i4:function(){return o},me:function(){return r},vZ:function(){return function e(t,n){if(t===n)return!0;if("object"!=typeof t||"object"!=typeof n||null===t||null===n)return!1;let r=Object.keys(t),o=Object.keys(n);if(r.length!==o.length)return!1;for(let i of r)if(!o.includes(i)||!e(t[i],n[i]))return!1;return!0}}});let r=(e,t)=>{let n=new Map;return e.forEach((e,r)=>{n.set(e,t[r])}),n},o=(e,t,n)=>[e?"auto":null!=t?t:0,null!=n?n:"auto"];function i(e,t){let n=[];for(let r of e)if(Object.prototype.hasOwnProperty.call(r,t)&&(n.push(r[t]),n.length>1))return!1;return!0}},41649:function(e,t,n){"use strict";n.d(t,{Z:function(){return p}});var r=n(5853),o=n(2265),i=n(1526),a=n(7084),l=n(26898),c=n(97324),s=n(1153);let u={xs:{paddingX:"px-2",paddingY:"py-0.5",fontSize:"text-xs"},sm:{paddingX:"px-2.5",paddingY:"py-0.5",fontSize:"text-sm"},md:{paddingX:"px-3",paddingY:"py-0.5",fontSize:"text-md"},lg:{paddingX:"px-3.5",paddingY:"py-0.5",fontSize:"text-lg"},xl:{paddingX:"px-4",paddingY:"py-1",fontSize:"text-xl"}},d={xs:{height:"h-4",width:"w-4"},sm:{height:"h-4",width:"w-4"},md:{height:"h-4",width:"w-4"},lg:{height:"h-5",width:"w-5"},xl:{height:"h-6",width:"w-6"}},f=(0,s.fn)("Badge"),p=o.forwardRef((e,t)=>{let{color:n,icon:p,size:h=a.u8.SM,tooltip:m,className:g,children:v}=e,b=(0,r._T)(e,["color","icon","size","tooltip","className","children"]),y=p||null,{tooltipProps:x,getReferenceProps:w}=(0,i.l)();return o.createElement("span",Object.assign({ref:(0,s.lq)([t,x.refs.setReference]),className:(0,c.q)(f("root"),"w-max flex-shrink-0 inline-flex justify-center items-center cursor-default rounded-tremor-full",n?(0,c.q)((0,s.bM)(n,l.K.background).bgColor,(0,s.bM)(n,l.K.text).textColor,"bg-opacity-20 dark:bg-opacity-25"):(0,c.q)("bg-tremor-brand-muted text-tremor-brand-emphasis","dark:bg-dark-tremor-brand-muted dark:text-dark-tremor-brand-emphasis"),u[h].paddingX,u[h].paddingY,u[h].fontSize,g)},w,b),o.createElement(i.Z,Object.assign({text:m},x)),y?o.createElement(y,{className:(0,c.q)(f("icon"),"shrink-0 -ml-1 mr-1.5",d[h].height,d[h].width)}):null,o.createElement("p",{className:(0,c.q)(f("text"),"text-sm whitespace-nowrap")},v))});p.displayName="Badge"},47323:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var r=n(5853),o=n(2265),i=n(1526),a=n(7084),l=n(97324),c=n(1153),s=n(26898);let u={xs:{paddingX:"px-1.5",paddingY:"py-1.5"},sm:{paddingX:"px-1.5",paddingY:"py-1.5"},md:{paddingX:"px-2",paddingY:"py-2"},lg:{paddingX:"px-2",paddingY:"py-2"},xl:{paddingX:"px-2.5",paddingY:"py-2.5"}},d={xs:{height:"h-3",width:"w-3"},sm:{height:"h-5",width:"w-5"},md:{height:"h-5",width:"w-5"},lg:{height:"h-7",width:"w-7"},xl:{height:"h-9",width:"w-9"}},f={simple:{rounded:"",border:"",ring:"",shadow:""},light:{rounded:"rounded-tremor-default",border:"",ring:"",shadow:""},shadow:{rounded:"rounded-tremor-default",border:"border",ring:"",shadow:"shadow-tremor-card dark:shadow-dark-tremor-card"},solid:{rounded:"rounded-tremor-default",border:"border-2",ring:"ring-1",shadow:""},outlined:{rounded:"rounded-tremor-default",border:"border",ring:"ring-2",shadow:""}},p=(e,t)=>{switch(e){case"simple":return{textColor:t?(0,c.bM)(t,s.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:"",borderColor:"",ringColor:""};case"light":return{textColor:t?(0,c.bM)(t,s.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.q)((0,c.bM)(t,s.K.background).bgColor,"bg-opacity-20"):"bg-tremor-brand-muted dark:bg-dark-tremor-brand-muted",borderColor:"",ringColor:""};case"shadow":return{textColor:t?(0,c.bM)(t,s.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.q)((0,c.bM)(t,s.K.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:"border-tremor-border dark:border-dark-tremor-border",ringColor:""};case"solid":return{textColor:t?(0,c.bM)(t,s.K.text).textColor:"text-tremor-brand-inverted dark:text-dark-tremor-brand-inverted",bgColor:t?(0,l.q)((0,c.bM)(t,s.K.background).bgColor,"bg-opacity-20"):"bg-tremor-brand dark:bg-dark-tremor-brand",borderColor:"border-tremor-brand-inverted dark:border-dark-tremor-brand-inverted",ringColor:"ring-tremor-ring dark:ring-dark-tremor-ring"};case"outlined":return{textColor:t?(0,c.bM)(t,s.K.text).textColor:"text-tremor-brand dark:text-dark-tremor-brand",bgColor:t?(0,l.q)((0,c.bM)(t,s.K.background).bgColor,"bg-opacity-20"):"bg-tremor-background dark:bg-dark-tremor-background",borderColor:t?(0,c.bM)(t,s.K.ring).borderColor:"border-tremor-brand-subtle dark:border-dark-tremor-brand-subtle",ringColor:t?(0,l.q)((0,c.bM)(t,s.K.ring).ringColor,"ring-opacity-40"):"ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted"}}},h=(0,c.fn)("Icon"),m=o.forwardRef((e,t)=>{let{icon:n,variant:s="simple",tooltip:m,size:g=a.u8.SM,color:v,className:b}=e,y=(0,r._T)(e,["icon","variant","tooltip","size","color","className"]),x=p(s,v),{tooltipProps:w,getReferenceProps:S}=(0,i.l)();return o.createElement("span",Object.assign({ref:(0,c.lq)([t,w.refs.setReference]),className:(0,l.q)(h("root"),"inline-flex flex-shrink-0 items-center",x.bgColor,x.textColor,x.borderColor,x.ringColor,f[s].rounded,f[s].border,f[s].shadow,f[s].ring,u[g].paddingX,u[g].paddingY,b)},S,y),o.createElement(i.Z,Object.assign({text:m},w)),o.createElement(n,{className:(0,l.q)(h("icon"),"shrink-0",d[g].height,d[g].width)}))});m.displayName="Icon"},53003:function(e,t,n){"use strict";let r,o,i;n.d(t,{Z:function(){return nF}});var a,l,c,s,u=n(5853),d=n(2265),f=n(54887),p=n(13323),h=n(64518),m=n(96822),g=n(40293);function v(){for(var e=arguments.length,t=Array(e),n=0;n(0,g.r)(...t),[...t])}var b=n(72238),y=n(93689);let x=(0,d.createContext)(!1);var w=n(61424),S=n(27847);let k=d.Fragment,E=d.Fragment,C=(0,d.createContext)(null),O=(0,d.createContext)(null);Object.assign((0,S.yV)(function(e,t){var n;let r,o,i=(0,d.useRef)(null),a=(0,y.T)((0,y.h)(e=>{i.current=e}),t),l=v(i),c=function(e){let t=(0,d.useContext)(x),n=(0,d.useContext)(C),r=v(e),[o,i]=(0,d.useState)(()=>{if(!t&&null!==n||w.O.isServer)return null;let e=null==r?void 0:r.getElementById("headlessui-portal-root");if(e)return e;if(null===r)return null;let o=r.createElement("div");return o.setAttribute("id","headlessui-portal-root"),r.body.appendChild(o)});return(0,d.useEffect)(()=>{null!==o&&(null!=r&&r.body.contains(o)||null==r||r.body.appendChild(o))},[o,r]),(0,d.useEffect)(()=>{t||null!==n&&i(n.current)},[n,i,t]),o}(i),[s]=(0,d.useState)(()=>{var e;return w.O.isServer?null:null!=(e=null==l?void 0:l.createElement("div"))?e:null}),u=(0,d.useContext)(O),g=(0,b.H)();return(0,h.e)(()=>{!c||!s||c.contains(s)||(s.setAttribute("data-headlessui-portal",""),c.appendChild(s))},[c,s]),(0,h.e)(()=>{if(s&&u)return u.register(s)},[u,s]),n=()=>{var e;c&&s&&(s instanceof Node&&c.contains(s)&&c.removeChild(s),c.childNodes.length<=0&&(null==(e=c.parentElement)||e.removeChild(c)))},r=(0,p.z)(n),o=(0,d.useRef)(!1),(0,d.useEffect)(()=>(o.current=!1,()=>{o.current=!0,(0,m.Y)(()=>{o.current&&r()})}),[r]),g&&c&&s?(0,f.createPortal)((0,S.sY)({ourProps:{ref:a},theirProps:e,defaultTag:k,name:"Portal"}),s):null}),{Group:(0,S.yV)(function(e,t){let{target:n,...r}=e,o={ref:(0,y.T)(t)};return d.createElement(C.Provider,{value:n},(0,S.sY)({ourProps:o,theirProps:r,defaultTag:E,name:"Popover.Group"}))})});var j=n(31948),P=n(17684),I=n(98505),N=n(80004),M=n(38198),R=n(3141),_=((r=_||{})[r.Forwards=0]="Forwards",r[r.Backwards=1]="Backwards",r);function T(){let e=(0,d.useRef)(0);return(0,R.s)("keydown",t=>{"Tab"===t.key&&(e.current=t.shiftKey?1:0)},!0),e}var A=n(37863),D=n(47634),Z=n(37105),L=n(24536),z=n(37388),B=((o=B||{})[o.Open=0]="Open",o[o.Closed=1]="Closed",o),F=((i=F||{})[i.TogglePopover=0]="TogglePopover",i[i.ClosePopover=1]="ClosePopover",i[i.SetButton=2]="SetButton",i[i.SetButtonId=3]="SetButtonId",i[i.SetPanel=4]="SetPanel",i[i.SetPanelId=5]="SetPanelId",i);let H={0:e=>{let t={...e,popoverState:(0,L.E)(e.popoverState,{0:1,1:0})};return 0===t.popoverState&&(t.__demoMode=!1),t},1:e=>1===e.popoverState?e:{...e,popoverState:1},2:(e,t)=>e.button===t.button?e:{...e,button:t.button},3:(e,t)=>e.buttonId===t.buttonId?e:{...e,buttonId:t.buttonId},4:(e,t)=>e.panel===t.panel?e:{...e,panel:t.panel},5:(e,t)=>e.panelId===t.panelId?e:{...e,panelId:t.panelId}},q=(0,d.createContext)(null);function W(e){let t=(0,d.useContext)(q);if(null===t){let t=Error("<".concat(e," /> is missing a parent component."));throw Error.captureStackTrace&&Error.captureStackTrace(t,W),t}return t}q.displayName="PopoverContext";let K=(0,d.createContext)(null);function V(e){let t=(0,d.useContext)(K);if(null===t){let t=Error("<".concat(e," /> is missing a parent component."));throw Error.captureStackTrace&&Error.captureStackTrace(t,V),t}return t}K.displayName="PopoverAPIContext";let U=(0,d.createContext)(null);function $(){return(0,d.useContext)(U)}U.displayName="PopoverGroupContext";let G=(0,d.createContext)(null);function X(e,t){return(0,L.E)(t.type,H,e,t)}G.displayName="PopoverPanelContext";let Y=S.AN.RenderStrategy|S.AN.Static,Q=S.AN.RenderStrategy|S.AN.Static,J=Object.assign((0,S.yV)(function(e,t){var n,r,o,i;let a,l,c,s,u,f;let{__demoMode:h=!1,...m}=e,g=(0,d.useRef)(null),b=(0,y.T)(t,(0,y.h)(e=>{g.current=e})),x=(0,d.useRef)([]),w=(0,d.useReducer)(X,{__demoMode:h,popoverState:h?0:1,buttons:x,button:null,buttonId:null,panel:null,panelId:null,beforePanelSentinel:(0,d.createRef)(),afterPanelSentinel:(0,d.createRef)()}),[{popoverState:k,button:E,buttonId:C,panel:P,panelId:N,beforePanelSentinel:R,afterPanelSentinel:_},T]=w,D=v(null!=(n=g.current)?n:E),z=(0,d.useMemo)(()=>{if(!E||!P)return!1;for(let e of document.querySelectorAll("body > *"))if(Number(null==e?void 0:e.contains(E))^Number(null==e?void 0:e.contains(P)))return!0;let e=(0,Z.GO)(),t=e.indexOf(E),n=(t+e.length-1)%e.length,r=(t+1)%e.length,o=e[n],i=e[r];return!P.contains(o)&&!P.contains(i)},[E,P]),B=(0,j.E)(C),F=(0,j.E)(N),H=(0,d.useMemo)(()=>({buttonId:B,panelId:F,close:()=>T({type:1})}),[B,F,T]),W=$(),V=null==W?void 0:W.registerPopover,U=(0,p.z)(()=>{var e;return null!=(e=null==W?void 0:W.isFocusWithinPopoverGroup())?e:(null==D?void 0:D.activeElement)&&((null==E?void 0:E.contains(D.activeElement))||(null==P?void 0:P.contains(D.activeElement)))});(0,d.useEffect)(()=>null==V?void 0:V(H),[V,H]);let[Y,Q]=(a=(0,d.useContext)(O),l=(0,d.useRef)([]),c=(0,p.z)(e=>(l.current.push(e),a&&a.register(e),()=>s(e))),s=(0,p.z)(e=>{let t=l.current.indexOf(e);-1!==t&&l.current.splice(t,1),a&&a.unregister(e)}),u=(0,d.useMemo)(()=>({register:c,unregister:s,portals:l}),[c,s,l]),[l,(0,d.useMemo)(()=>function(e){let{children:t}=e;return d.createElement(O.Provider,{value:u},t)},[u])]),J=function(){var e;let{defaultContainers:t=[],portals:n,mainTreeNodeRef:r}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=(0,d.useRef)(null!=(e=null==r?void 0:r.current)?e:null),i=v(o),a=(0,p.z)(()=>{var e,r,a;let l=[];for(let e of t)null!==e&&(e instanceof HTMLElement?l.push(e):"current"in e&&e.current instanceof HTMLElement&&l.push(e.current));if(null!=n&&n.current)for(let e of n.current)l.push(e);for(let t of null!=(e=null==i?void 0:i.querySelectorAll("html > *, body > *"))?e:[])t!==document.body&&t!==document.head&&t instanceof HTMLElement&&"headlessui-portal-root"!==t.id&&(t.contains(o.current)||t.contains(null==(a=null==(r=o.current)?void 0:r.getRootNode())?void 0:a.host)||l.some(e=>t.contains(e))||l.push(t));return l});return{resolveContainers:a,contains:(0,p.z)(e=>a().some(t=>t.contains(e))),mainTreeNodeRef:o,MainTreeNode:(0,d.useMemo)(()=>function(){return null!=r?null:d.createElement(M._,{features:M.A.Hidden,ref:o})},[o,r])}}({mainTreeNodeRef:null==W?void 0:W.mainTreeNodeRef,portals:Y,defaultContainers:[E,P]});r=null==D?void 0:D.defaultView,o="focus",i=e=>{var t,n,r,o;e.target!==window&&e.target instanceof HTMLElement&&0===k&&(U()||E&&P&&(J.contains(e.target)||null!=(n=null==(t=R.current)?void 0:t.contains)&&n.call(t,e.target)||null!=(o=null==(r=_.current)?void 0:r.contains)&&o.call(r,e.target)||T({type:1})))},f=(0,j.E)(i),(0,d.useEffect)(()=>{function e(e){f.current(e)}return(r=null!=r?r:window).addEventListener(o,e,!0),()=>r.removeEventListener(o,e,!0)},[r,o,!0]),(0,I.O)(J.resolveContainers,(e,t)=>{T({type:1}),(0,Z.sP)(t,Z.tJ.Loose)||(e.preventDefault(),null==E||E.focus())},0===k);let ee=(0,p.z)(e=>{T({type:1});let t=e?e instanceof HTMLElement?e:"current"in e&&e.current instanceof HTMLElement?e.current:E:E;null==t||t.focus()}),et=(0,d.useMemo)(()=>({close:ee,isPortalled:z}),[ee,z]),en=(0,d.useMemo)(()=>({open:0===k,close:ee}),[k,ee]);return d.createElement(G.Provider,{value:null},d.createElement(q.Provider,{value:w},d.createElement(K.Provider,{value:et},d.createElement(A.up,{value:(0,L.E)(k,{0:A.ZM.Open,1:A.ZM.Closed})},d.createElement(Q,null,(0,S.sY)({ourProps:{ref:b},theirProps:m,slot:en,defaultTag:"div",name:"Popover"}),d.createElement(J.MainTreeNode,null))))))}),{Button:(0,S.yV)(function(e,t){let n=(0,P.M)(),{id:r="headlessui-popover-button-".concat(n),...o}=e,[i,a]=W("Popover.Button"),{isPortalled:l}=V("Popover.Button"),c=(0,d.useRef)(null),s="headlessui-focus-sentinel-".concat((0,P.M)()),u=$(),f=null==u?void 0:u.closeOthers,h=null!==(0,d.useContext)(G);(0,d.useEffect)(()=>{if(!h)return a({type:3,buttonId:r}),()=>{a({type:3,buttonId:null})}},[h,r,a]);let[m]=(0,d.useState)(()=>Symbol()),g=(0,y.T)(c,t,h?null:e=>{if(e)i.buttons.current.push(m);else{let e=i.buttons.current.indexOf(m);-1!==e&&i.buttons.current.splice(e,1)}i.buttons.current.length>1&&console.warn("You are already using a but only 1 is supported."),e&&a({type:2,button:e})}),b=(0,y.T)(c,t),x=v(c),w=(0,p.z)(e=>{var t,n,r;if(h){if(1===i.popoverState)return;switch(e.key){case z.R.Space:case z.R.Enter:e.preventDefault(),null==(n=(t=e.target).click)||n.call(t),a({type:1}),null==(r=i.button)||r.focus()}}else switch(e.key){case z.R.Space:case z.R.Enter:e.preventDefault(),e.stopPropagation(),1===i.popoverState&&(null==f||f(i.buttonId)),a({type:0});break;case z.R.Escape:if(0!==i.popoverState)return null==f?void 0:f(i.buttonId);if(!c.current||null!=x&&x.activeElement&&!c.current.contains(x.activeElement))return;e.preventDefault(),e.stopPropagation(),a({type:1})}}),k=(0,p.z)(e=>{h||e.key===z.R.Space&&e.preventDefault()}),E=(0,p.z)(t=>{var n,r;(0,D.P)(t.currentTarget)||e.disabled||(h?(a({type:1}),null==(n=i.button)||n.focus()):(t.preventDefault(),t.stopPropagation(),1===i.popoverState&&(null==f||f(i.buttonId)),a({type:0}),null==(r=i.button)||r.focus()))}),C=(0,p.z)(e=>{e.preventDefault(),e.stopPropagation()}),O=0===i.popoverState,j=(0,d.useMemo)(()=>({open:O}),[O]),I=(0,N.f)(e,c),R=h?{ref:b,type:I,onKeyDown:w,onClick:E}:{ref:g,id:i.buttonId,type:I,"aria-expanded":0===i.popoverState,"aria-controls":i.panel?i.panelId:void 0,onKeyDown:w,onKeyUp:k,onClick:E,onMouseDown:C},A=T(),B=(0,p.z)(()=>{let e=i.panel;e&&(0,L.E)(A.current,{[_.Forwards]:()=>(0,Z.jA)(e,Z.TO.First),[_.Backwards]:()=>(0,Z.jA)(e,Z.TO.Last)})===Z.fE.Error&&(0,Z.jA)((0,Z.GO)().filter(e=>"true"!==e.dataset.headlessuiFocusGuard),(0,L.E)(A.current,{[_.Forwards]:Z.TO.Next,[_.Backwards]:Z.TO.Previous}),{relativeTo:i.button})});return d.createElement(d.Fragment,null,(0,S.sY)({ourProps:R,theirProps:o,slot:j,defaultTag:"button",name:"Popover.Button"}),O&&!h&&l&&d.createElement(M._,{id:s,features:M.A.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:B}))}),Overlay:(0,S.yV)(function(e,t){let n=(0,P.M)(),{id:r="headlessui-popover-overlay-".concat(n),...o}=e,[{popoverState:i},a]=W("Popover.Overlay"),l=(0,y.T)(t),c=(0,A.oJ)(),s=null!==c?(c&A.ZM.Open)===A.ZM.Open:0===i,u=(0,p.z)(e=>{if((0,D.P)(e.currentTarget))return e.preventDefault();a({type:1})}),f=(0,d.useMemo)(()=>({open:0===i}),[i]);return(0,S.sY)({ourProps:{ref:l,id:r,"aria-hidden":!0,onClick:u},theirProps:o,slot:f,defaultTag:"div",features:Y,visible:s,name:"Popover.Overlay"})}),Panel:(0,S.yV)(function(e,t){let n=(0,P.M)(),{id:r="headlessui-popover-panel-".concat(n),focus:o=!1,...i}=e,[a,l]=W("Popover.Panel"),{close:c,isPortalled:s}=V("Popover.Panel"),u="headlessui-focus-sentinel-before-".concat((0,P.M)()),f="headlessui-focus-sentinel-after-".concat((0,P.M)()),m=(0,d.useRef)(null),g=(0,y.T)(m,t,e=>{l({type:4,panel:e})}),b=v(m),x=(0,S.Y2)();(0,h.e)(()=>(l({type:5,panelId:r}),()=>{l({type:5,panelId:null})}),[r,l]);let w=(0,A.oJ)(),k=null!==w?(w&A.ZM.Open)===A.ZM.Open:0===a.popoverState,E=(0,p.z)(e=>{var t;if(e.key===z.R.Escape){if(0!==a.popoverState||!m.current||null!=b&&b.activeElement&&!m.current.contains(b.activeElement))return;e.preventDefault(),e.stopPropagation(),l({type:1}),null==(t=a.button)||t.focus()}});(0,d.useEffect)(()=>{var t;e.static||1===a.popoverState&&(null==(t=e.unmount)||t)&&l({type:4,panel:null})},[a.popoverState,e.unmount,e.static,l]),(0,d.useEffect)(()=>{if(a.__demoMode||!o||0!==a.popoverState||!m.current)return;let e=null==b?void 0:b.activeElement;m.current.contains(e)||(0,Z.jA)(m.current,Z.TO.First)},[a.__demoMode,o,m,a.popoverState]);let C=(0,d.useMemo)(()=>({open:0===a.popoverState,close:c}),[a,c]),O={ref:g,id:r,onKeyDown:E,onBlur:o&&0===a.popoverState?e=>{var t,n,r,o,i;let c=e.relatedTarget;c&&m.current&&(null!=(t=m.current)&&t.contains(c)||(l({type:1}),(null!=(r=null==(n=a.beforePanelSentinel.current)?void 0:n.contains)&&r.call(n,c)||null!=(i=null==(o=a.afterPanelSentinel.current)?void 0:o.contains)&&i.call(o,c))&&c.focus({preventScroll:!0})))}:void 0,tabIndex:-1},j=T(),I=(0,p.z)(()=>{let e=m.current;e&&(0,L.E)(j.current,{[_.Forwards]:()=>{var t;(0,Z.jA)(e,Z.TO.First)===Z.fE.Error&&(null==(t=a.afterPanelSentinel.current)||t.focus())},[_.Backwards]:()=>{var e;null==(e=a.button)||e.focus({preventScroll:!0})}})}),N=(0,p.z)(()=>{let e=m.current;e&&(0,L.E)(j.current,{[_.Forwards]:()=>{var e;if(!a.button)return;let t=(0,Z.GO)(),n=t.indexOf(a.button),r=t.slice(0,n+1),o=[...t.slice(n+1),...r];for(let t of o.slice())if("true"===t.dataset.headlessuiFocusGuard||null!=(e=a.panel)&&e.contains(t)){let e=o.indexOf(t);-1!==e&&o.splice(e,1)}(0,Z.jA)(o,Z.TO.First,{sorted:!1})},[_.Backwards]:()=>{var t;(0,Z.jA)(e,Z.TO.Previous)===Z.fE.Error&&(null==(t=a.button)||t.focus())}})});return d.createElement(G.Provider,{value:r},k&&s&&d.createElement(M._,{id:u,ref:a.beforePanelSentinel,features:M.A.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:I}),(0,S.sY)({mergeRefs:x,ourProps:O,theirProps:i,slot:C,defaultTag:"div",features:Q,visible:k,name:"Popover.Panel"}),k&&s&&d.createElement(M._,{id:f,ref:a.afterPanelSentinel,features:M.A.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:N}))}),Group:(0,S.yV)(function(e,t){let n;let r=(0,d.useRef)(null),o=(0,y.T)(r,t),[i,a]=(0,d.useState)([]),l={mainTreeNodeRef:n=(0,d.useRef)(null),MainTreeNode:(0,d.useMemo)(()=>function(){return d.createElement(M._,{features:M.A.Hidden,ref:n})},[n])},c=(0,p.z)(e=>{a(t=>{let n=t.indexOf(e);if(-1!==n){let e=t.slice();return e.splice(n,1),e}return t})}),s=(0,p.z)(e=>(a(t=>[...t,e]),()=>c(e))),u=(0,p.z)(()=>{var e;let t=(0,g.r)(r);if(!t)return!1;let n=t.activeElement;return!!(null!=(e=r.current)&&e.contains(n))||i.some(e=>{var r,o;return(null==(r=t.getElementById(e.buttonId.current))?void 0:r.contains(n))||(null==(o=t.getElementById(e.panelId.current))?void 0:o.contains(n))})}),f=(0,p.z)(e=>{for(let t of i)t.buttonId.current!==e&&t.close()}),h=(0,d.useMemo)(()=>({registerPopover:s,unregisterPopover:c,isFocusWithinPopoverGroup:u,closeOthers:f,mainTreeNodeRef:l.mainTreeNodeRef}),[s,c,u,f,l.mainTreeNodeRef]),m=(0,d.useMemo)(()=>({}),[]);return d.createElement(U.Provider,{value:h},(0,S.sY)({ourProps:{ref:o},theirProps:e,slot:m,defaultTag:"div",name:"Popover.Group"}),d.createElement(l.MainTreeNode,null))})});var ee=n(33044),et=n(28517);let en=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor"}),d.createElement("path",{fillRule:"evenodd",d:"M6 2a1 1 0 00-1 1v1H4a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-1V3a1 1 0 10-2 0v1H7V3a1 1 0 00-1-1zm0 5a1 1 0 000 2h8a1 1 0 100-2H6z",clipRule:"evenodd"}))};var er=n(4537),eo=n(99735),ei=n(7656);function ea(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return t.setHours(0,0,0,0),t}function el(){return ea(Date.now())}function ec(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return t.setDate(1),t.setHours(0,0,0,0),t}var es=n(97324),eu=n(96398),ed=n(41154);function ef(e){var t,n;if((0,ei.Z)(1,arguments),e&&"function"==typeof e.forEach)t=e;else{if("object"!==(0,ed.Z)(e)||null===e)return new Date(NaN);t=Array.prototype.slice.call(e)}return t.forEach(function(e){var t=(0,eo.Z)(e);(void 0===n||nt||isNaN(t.getDate()))&&(n=t)}),n||new Date(NaN)}var eh=n(25721),em=n(47869);function eg(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,eh.Z)(e,-n)}var ev=n(55463);function eb(e,t){if((0,ei.Z)(2,arguments),!t||"object"!==(0,ed.Z)(t))return new Date(NaN);var n=t.years?(0,em.Z)(t.years):0,r=t.months?(0,em.Z)(t.months):0,o=t.weeks?(0,em.Z)(t.weeks):0,i=t.days?(0,em.Z)(t.days):0,a=t.hours?(0,em.Z)(t.hours):0,l=t.minutes?(0,em.Z)(t.minutes):0,c=t.seconds?(0,em.Z)(t.seconds):0;return new Date(eg(function(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,ev.Z)(e,-n)}(e,r+12*n),i+7*o).getTime()-1e3*(c+60*(l+60*a)))}function ey(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=new Date(0);return n.setFullYear(t.getFullYear(),0,1),n.setHours(0,0,0,0),n}function ex(e){return(0,ei.Z)(1,arguments),e instanceof Date||"object"===(0,ed.Z)(e)&&"[object Date]"===Object.prototype.toString.call(e)}function ew(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getUTCDay();return t.setUTCDate(t.getUTCDate()-((n<1?7:0)+n-1)),t.setUTCHours(0,0,0,0),t}function eS(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getUTCFullYear(),r=new Date(0);r.setUTCFullYear(n+1,0,4),r.setUTCHours(0,0,0,0);var o=ew(r),i=new Date(0);i.setUTCFullYear(n,0,4),i.setUTCHours(0,0,0,0);var a=ew(i);return t.getTime()>=o.getTime()?n+1:t.getTime()>=a.getTime()?n:n-1}var ek={};function eE(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,c,s,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.weekStartsOn)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.weekStartsOn)&&void 0!==o?o:ek.weekStartsOn)&&void 0!==r?r:null===(c=ek.locale)||void 0===c?void 0:null===(s=c.options)||void 0===s?void 0:s.weekStartsOn)&&void 0!==n?n:0);if(!(u>=0&&u<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=(0,eo.Z)(e),f=d.getUTCDay();return d.setUTCDate(d.getUTCDate()-((f=1&&f<=7))throw RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var p=new Date(0);p.setUTCFullYear(d+1,0,f),p.setUTCHours(0,0,0,0);var h=eE(p,t),m=new Date(0);m.setUTCFullYear(d,0,f),m.setUTCHours(0,0,0,0);var g=eE(m,t);return u.getTime()>=h.getTime()?d+1:u.getTime()>=g.getTime()?d:d-1}function eO(e,t){for(var n=Math.abs(e).toString();n.length0?n:1-n;return eO("yy"===t?r%100:r,t.length)},M:function(e,t){var n=e.getUTCMonth();return"M"===t?String(n+1):eO(n+1,2)},d:function(e,t){return eO(e.getUTCDate(),t.length)},h:function(e,t){return eO(e.getUTCHours()%12||12,t.length)},H:function(e,t){return eO(e.getUTCHours(),t.length)},m:function(e,t){return eO(e.getUTCMinutes(),t.length)},s:function(e,t){return eO(e.getUTCSeconds(),t.length)},S:function(e,t){var n=t.length;return eO(Math.floor(e.getUTCMilliseconds()*Math.pow(10,n-3)),t.length)}},eP={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"};function eI(e,t){var n=e>0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=r%60;return 0===i?n+String(o):n+String(o)+(t||"")+eO(i,2)}function eN(e,t){return e%60==0?(e>0?"-":"+")+eO(Math.abs(e)/60,2):eM(e,t)}function eM(e,t){var n=Math.abs(e);return(e>0?"-":"+")+eO(Math.floor(n/60),2)+(t||"")+eO(n%60,2)}var eR={G:function(e,t,n){var r=e.getUTCFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if("yo"===t){var r=e.getUTCFullYear();return n.ordinalNumber(r>0?r:1-r,{unit:"year"})}return ej.y(e,t)},Y:function(e,t,n,r){var o=eC(e,r),i=o>0?o:1-o;return"YY"===t?eO(i%100,2):"Yo"===t?n.ordinalNumber(i,{unit:"year"}):eO(i,t.length)},R:function(e,t){return eO(eS(e),t.length)},u:function(e,t){return eO(e.getUTCFullYear(),t.length)},Q:function(e,t,n){var r=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return eO(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){var r=Math.ceil((e.getUTCMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return eO(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){var r=e.getUTCMonth();switch(t){case"M":case"MM":return ej.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){var r=e.getUTCMonth();switch(t){case"L":return String(r+1);case"LL":return eO(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){var o=function(e,t){(0,ei.Z)(1,arguments);var n=(0,eo.Z)(e);return Math.round((eE(n,t).getTime()-(function(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,c,s,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.firstWeekContainsDate)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.firstWeekContainsDate)&&void 0!==o?o:ek.firstWeekContainsDate)&&void 0!==r?r:null===(c=ek.locale)||void 0===c?void 0:null===(s=c.options)||void 0===s?void 0:s.firstWeekContainsDate)&&void 0!==n?n:1),d=eC(e,t),f=new Date(0);return f.setUTCFullYear(d,0,u),f.setUTCHours(0,0,0,0),eE(f,t)})(n,t).getTime())/6048e5)+1}(e,r);return"wo"===t?n.ordinalNumber(o,{unit:"week"}):eO(o,t.length)},I:function(e,t,n){var r=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return Math.round((ew(t).getTime()-(function(e){(0,ei.Z)(1,arguments);var t=eS(e),n=new Date(0);return n.setUTCFullYear(t,0,4),n.setUTCHours(0,0,0,0),ew(n)})(t).getTime())/6048e5)+1}(e);return"Io"===t?n.ordinalNumber(r,{unit:"week"}):eO(r,t.length)},d:function(e,t,n){return"do"===t?n.ordinalNumber(e.getUTCDate(),{unit:"date"}):ej.d(e,t)},D:function(e,t,n){var r=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getTime();return t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0),Math.floor((n-t.getTime())/864e5)+1}(e);return"Do"===t?n.ordinalNumber(r,{unit:"dayOfYear"}):eO(r,t.length)},E:function(e,t,n){var r=e.getUTCDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){var o=e.getUTCDay(),i=(o-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(i);case"ee":return eO(i,2);case"eo":return n.ordinalNumber(i,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){var o=e.getUTCDay(),i=(o-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(i);case"cc":return eO(i,t.length);case"co":return n.ordinalNumber(i,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){var r=e.getUTCDay(),o=0===r?7:r;switch(t){case"i":return String(o);case"ii":return eO(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){var r=e.getUTCHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},b:function(e,t,n){var r,o=e.getUTCHours();switch(r=12===o?eP.noon:0===o?eP.midnight:o/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},B:function(e,t,n){var r,o=e.getUTCHours();switch(r=o>=17?eP.evening:o>=12?eP.afternoon:o>=4?eP.morning:eP.night,t){case"B":case"BB":case"BBB":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},h:function(e,t,n){if("ho"===t){var r=e.getUTCHours()%12;return 0===r&&(r=12),n.ordinalNumber(r,{unit:"hour"})}return ej.h(e,t)},H:function(e,t,n){return"Ho"===t?n.ordinalNumber(e.getUTCHours(),{unit:"hour"}):ej.H(e,t)},K:function(e,t,n){var r=e.getUTCHours()%12;return"Ko"===t?n.ordinalNumber(r,{unit:"hour"}):eO(r,t.length)},k:function(e,t,n){var r=e.getUTCHours();return(0===r&&(r=24),"ko"===t)?n.ordinalNumber(r,{unit:"hour"}):eO(r,t.length)},m:function(e,t,n){return"mo"===t?n.ordinalNumber(e.getUTCMinutes(),{unit:"minute"}):ej.m(e,t)},s:function(e,t,n){return"so"===t?n.ordinalNumber(e.getUTCSeconds(),{unit:"second"}):ej.s(e,t)},S:function(e,t){return ej.S(e,t)},X:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();if(0===o)return"Z";switch(t){case"X":return eN(o);case"XXXX":case"XX":return eM(o);default:return eM(o,":")}},x:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();switch(t){case"x":return eN(o);case"xxxx":case"xx":return eM(o);default:return eM(o,":")}},O:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+eI(o,":");default:return"GMT"+eM(o,":")}},z:function(e,t,n,r){var o=(r._originalDate||e).getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+eI(o,":");default:return"GMT"+eM(o,":")}},t:function(e,t,n,r){return eO(Math.floor((r._originalDate||e).getTime()/1e3),t.length)},T:function(e,t,n,r){return eO((r._originalDate||e).getTime(),t.length)}},e_=function(e,t){switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});default:return t.date({width:"full"})}},eT=function(e,t){switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});default:return t.time({width:"full"})}},eA={p:eT,P:function(e,t){var n,r=e.match(/(P+)(p+)?/)||[],o=r[1],i=r[2];if(!i)return e_(e,t);switch(o){case"P":n=t.dateTime({width:"short"});break;case"PP":n=t.dateTime({width:"medium"});break;case"PPP":n=t.dateTime({width:"long"});break;default:n=t.dateTime({width:"full"})}return n.replace("{{date}}",e_(o,t)).replace("{{time}}",eT(i,t))}};function eD(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}var eZ=["D","DD"],eL=["YY","YYYY"];function ez(e,t,n){if("YYYY"===e)throw RangeError("Use `yyyy` instead of `YYYY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if("YY"===e)throw RangeError("Use `yy` instead of `YY` (in `".concat(t,"`) for formatting years to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if("D"===e)throw RangeError("Use `d` instead of `D` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));if("DD"===e)throw RangeError("Use `dd` instead of `DD` (in `".concat(t,"`) for formatting days of the month to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"))}var eB={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function eF(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}var eH={date:eF({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:eF({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:eF({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},eq={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function eW(e){return function(t,n){var r;if("formatting"===(null!=n&&n.context?String(n.context):"standalone")&&e.formattingValues){var o=e.defaultFormattingWidth||e.defaultWidth,i=null!=n&&n.width?String(n.width):o;r=e.formattingValues[i]||e.formattingValues[o]}else{var a=e.defaultWidth,l=null!=n&&n.width?String(n.width):e.defaultWidth;r=e.values[l]||e.values[a]}return r[e.argumentCallback?e.argumentCallback(t):t]}}function eK(e){return function(t){var n,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=r.width,i=o&&e.matchPatterns[o]||e.matchPatterns[e.defaultMatchWidth],a=t.match(i);if(!a)return null;var l=a[0],c=o&&e.parsePatterns[o]||e.parsePatterns[e.defaultParseWidth],s=Array.isArray(c)?function(e,t){for(var n=0;n0?"in "+r:r+" ago":r},formatLong:eH,formatRelative:function(e,t,n,r){return eq[e]},localize:{ordinalNumber:function(e,t){var n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},era:eW({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:eW({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:function(e){return e-1}}),month:eW({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:eW({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:eW({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaultFormattingWidth:"wide"})},match:{ordinalNumber:(a={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(e){return parseInt(e,10)}},function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.match(a.matchPattern);if(!n)return null;var r=n[0],o=e.match(a.parsePattern);if(!o)return null;var i=a.valueCallback?a.valueCallback(o[0]):o[0];return{value:i=t.valueCallback?t.valueCallback(i):i,rest:e.slice(r.length)}}),era:eK({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:eK({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(e){return e+1}}),month:eK({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:eK({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:eK({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},options:{weekStartsOn:0,firstWeekContainsDate:1}},eU=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,e$=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,eG=/^'([^]*?)'?$/,eX=/''/g,eY=/[a-zA-Z]/;function eQ(e,t,n){(0,ei.Z)(2,arguments);var r,o,i,a,l,c,s,u,d,f,p,h,m,g,v,b,y,x,w=String(t),S=null!==(r=null!==(o=null==n?void 0:n.locale)&&void 0!==o?o:ek.locale)&&void 0!==r?r:eV,k=(0,em.Z)(null!==(i=null!==(a=null!==(l=null!==(c=null==n?void 0:n.firstWeekContainsDate)&&void 0!==c?c:null==n?void 0:null===(s=n.locale)||void 0===s?void 0:null===(u=s.options)||void 0===u?void 0:u.firstWeekContainsDate)&&void 0!==l?l:ek.firstWeekContainsDate)&&void 0!==a?a:null===(d=ek.locale)||void 0===d?void 0:null===(f=d.options)||void 0===f?void 0:f.firstWeekContainsDate)&&void 0!==i?i:1);if(!(k>=1&&k<=7))throw RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var E=(0,em.Z)(null!==(p=null!==(h=null!==(m=null!==(g=null==n?void 0:n.weekStartsOn)&&void 0!==g?g:null==n?void 0:null===(v=n.locale)||void 0===v?void 0:null===(b=v.options)||void 0===b?void 0:b.weekStartsOn)&&void 0!==m?m:ek.weekStartsOn)&&void 0!==h?h:null===(y=ek.locale)||void 0===y?void 0:null===(x=y.options)||void 0===x?void 0:x.weekStartsOn)&&void 0!==p?p:0);if(!(E>=0&&E<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!S.localize)throw RangeError("locale must contain localize property");if(!S.formatLong)throw RangeError("locale must contain formatLong property");var C=(0,eo.Z)(e);if(!function(e){return(0,ei.Z)(1,arguments),(!!ex(e)||"number"==typeof e)&&!isNaN(Number((0,eo.Z)(e)))}(C))throw RangeError("Invalid time value");var O=eD(C),j=function(e,t){return(0,ei.Z)(2,arguments),function(e,t){return(0,ei.Z)(2,arguments),new Date((0,eo.Z)(e).getTime()+(0,em.Z)(t))}(e,-(0,em.Z)(t))}(C,O),P={firstWeekContainsDate:k,weekStartsOn:E,locale:S,_originalDate:C};return w.match(e$).map(function(e){var t=e[0];return"p"===t||"P"===t?(0,eA[t])(e,S.formatLong):e}).join("").match(eU).map(function(r){if("''"===r)return"'";var o,i=r[0];if("'"===i)return(o=r.match(eG))?o[1].replace(eX,"'"):r;var a=eR[i];if(a)return null!=n&&n.useAdditionalWeekYearTokens||-1===eL.indexOf(r)||ez(r,t,String(e)),null!=n&&n.useAdditionalDayOfYearTokens||-1===eZ.indexOf(r)||ez(r,t,String(e)),a(j,r,S.localize,P);if(i.match(eY))throw RangeError("Format string contains an unescaped latin alphabet character `"+i+"`");return r}).join("")}var eJ=n(1153);let e0=(0,eJ.fn)("DateRangePicker"),e1=(e,t,n,r)=>{var o;if(n&&(e=null===(o=r.get(n))||void 0===o?void 0:o.from),e)return ea(e&&!t?e:ef([e,t]))},e2=(e,t,n,r)=>{var o,i;if(n&&(e=ea(null!==(i=null===(o=r.get(n))||void 0===o?void 0:o.to)&&void 0!==i?i:el())),e)return ea(e&&!t?e:ep([e,t]))},e6=[{value:"tdy",text:"Today",from:el()},{value:"w",text:"Last 7 days",from:eb(el(),{days:7})},{value:"t",text:"Last 30 days",from:eb(el(),{days:30})},{value:"m",text:"Month to Date",from:ec(el())},{value:"y",text:"Year to Date",from:ey(el())}],e3=(e,t,n,r)=>{let o=(null==n?void 0:n.code)||"en-US";if(!e&&!t)return"";if(e&&!t)return r?eQ(e,r):e.toLocaleDateString(o,{year:"numeric",month:"short",day:"numeric"});if(e&&t){if(function(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return n.getTime()===r.getTime()}(e,t))return r?eQ(e,r):e.toLocaleDateString(o,{year:"numeric",month:"short",day:"numeric"});if(e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear())return r?"".concat(eQ(e,r)," - ").concat(eQ(t,r)):"".concat(e.toLocaleDateString(o,{month:"short",day:"numeric"})," - \n ").concat(t.getDate(),", ").concat(t.getFullYear());{if(r)return"".concat(eQ(e,r)," - ").concat(eQ(t,r));let n={year:"numeric",month:"short",day:"numeric"};return"".concat(e.toLocaleDateString(o,n)," - \n ").concat(t.toLocaleDateString(o,n))}}return""};function e4(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getMonth();return t.setFullYear(t.getFullYear(),n+1,0),t.setHours(23,59,59,999),t}function e5(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,em.Z)(t),o=n.getFullYear(),i=n.getDate(),a=new Date(0);a.setFullYear(o,r,15),a.setHours(0,0,0,0);var l=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getFullYear(),r=t.getMonth(),o=new Date(0);return o.setFullYear(n,r+1,0),o.setHours(0,0,0,0),o.getDate()}(a);return n.setMonth(r,Math.min(i,l)),n}function e8(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,em.Z)(t);return isNaN(n.getTime())?new Date(NaN):(n.setFullYear(r),n)}function e7(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return 12*(n.getFullYear()-r.getFullYear())+(n.getMonth()-r.getMonth())}function e9(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()}function te(e,t){(0,ei.Z)(2,arguments);var n=(0,eo.Z)(e),r=(0,eo.Z)(t);return n.getTime()=0&&u<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=(0,eo.Z)(e),f=d.getDay();return d.setDate(d.getDate()-((fr.getTime()}function ti(e,t){(0,ei.Z)(2,arguments);var n=ea(e),r=ea(t);return Math.round((n.getTime()-eD(n)-(r.getTime()-eD(r)))/864e5)}function ta(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,eh.Z)(e,7*n)}function tl(e,t){(0,ei.Z)(2,arguments);var n=(0,em.Z)(t);return(0,ev.Z)(e,12*n)}function tc(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,c,s,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.weekStartsOn)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.weekStartsOn)&&void 0!==o?o:ek.weekStartsOn)&&void 0!==r?r:null===(c=ek.locale)||void 0===c?void 0:null===(s=c.options)||void 0===s?void 0:s.weekStartsOn)&&void 0!==n?n:0);if(!(u>=0&&u<=6))throw RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=(0,eo.Z)(e),f=d.getDay();return d.setDate(d.getDate()+((fe7(l,a)&&(a=(0,ev.Z)(l,-1*((void 0===s?1:s)-1))),c&&0>e7(a,c)&&(a=c),u=ec(a),f=t.month,h=(p=(0,d.useState)(u))[0],m=[void 0===f?h:f,p[1]])[0],v=m[1],[g,function(e){if(!t.disableNavigation){var n,r=ec(e);v(r),null===(n=t.onMonthChange)||void 0===n||n.call(t,r)}}]),x=y[0],w=y[1],S=function(e,t){for(var n=t.reverseMonths,r=t.numberOfMonths,o=ec(e),i=e7(ec((0,ev.Z)(o,r)),o),a=[],l=0;l=e7(i,n)))return(0,ev.Z)(i,-(r?void 0===o?1:o:1))}}(x,b),C=function(e){return S.some(function(t){return e9(e,t)})};return th.jsx(tI.Provider,{value:{currentMonth:x,displayMonths:S,goToMonth:w,goToDate:function(e,t){C(e)||(t&&te(e,t)?w((0,ev.Z)(e,1+-1*b.numberOfMonths)):w(e))},previousMonth:E,nextMonth:k,isDateDisplayed:C},children:e.children})}function tM(){var e=(0,d.useContext)(tI);if(!e)throw Error("useNavigation must be used within a NavigationProvider");return e}function tR(e){var t,n=tk(),r=n.classNames,o=n.styles,i=n.components,a=tM().goToMonth,l=function(t){a((0,ev.Z)(t,e.displayIndex?-e.displayIndex:0))},c=null!==(t=null==i?void 0:i.CaptionLabel)&&void 0!==t?t:tE,s=th.jsx(c,{id:e.id,displayMonth:e.displayMonth});return th.jsxs("div",{className:r.caption_dropdowns,style:o.caption_dropdowns,children:[th.jsx("div",{className:r.vhidden,children:s}),th.jsx(tj,{onChange:l,displayMonth:e.displayMonth}),th.jsx(tP,{onChange:l,displayMonth:e.displayMonth})]})}function t_(e){return th.jsx("svg",tu({width:"16px",height:"16px",viewBox:"0 0 120 120"},e,{children:th.jsx("path",{d:"M69.490332,3.34314575 C72.6145263,0.218951416 77.6798462,0.218951416 80.8040405,3.34314575 C83.8617626,6.40086786 83.9268205,11.3179931 80.9992143,14.4548388 L80.8040405,14.6568542 L35.461,60 L80.8040405,105.343146 C83.8617626,108.400868 83.9268205,113.317993 80.9992143,116.454839 L80.8040405,116.656854 C77.7463184,119.714576 72.8291931,119.779634 69.6923475,116.852028 L69.490332,116.656854 L18.490332,65.6568542 C15.4326099,62.5991321 15.367552,57.6820069 18.2951583,54.5451612 L18.490332,54.3431458 L69.490332,3.34314575 Z",fill:"currentColor",fillRule:"nonzero"})}))}function tT(e){return th.jsx("svg",tu({width:"16px",height:"16px",viewBox:"0 0 120 120"},e,{children:th.jsx("path",{d:"M49.8040405,3.34314575 C46.6798462,0.218951416 41.6145263,0.218951416 38.490332,3.34314575 C35.4326099,6.40086786 35.367552,11.3179931 38.2951583,14.4548388 L38.490332,14.6568542 L83.8333725,60 L38.490332,105.343146 C35.4326099,108.400868 35.367552,113.317993 38.2951583,116.454839 L38.490332,116.656854 C41.5480541,119.714576 46.4651794,119.779634 49.602025,116.852028 L49.8040405,116.656854 L100.804041,65.6568542 C103.861763,62.5991321 103.926821,57.6820069 100.999214,54.5451612 L100.804041,54.3431458 L49.8040405,3.34314575 Z",fill:"currentColor"})}))}var tA=(0,d.forwardRef)(function(e,t){var n=tk(),r=n.classNames,o=n.styles,i=[r.button_reset,r.button];e.className&&i.push(e.className);var a=i.join(" "),l=tu(tu({},o.button_reset),o.button);return e.style&&Object.assign(l,e.style),th.jsx("button",tu({},e,{ref:t,type:"button",className:a,style:l}))});function tD(e){var t,n,r=tk(),o=r.dir,i=r.locale,a=r.classNames,l=r.styles,c=r.labels,s=c.labelPrevious,u=c.labelNext,d=r.components;if(!e.nextMonth&&!e.previousMonth)return th.jsx(th.Fragment,{});var f=s(e.previousMonth,{locale:i}),p=[a.nav_button,a.nav_button_previous].join(" "),h=u(e.nextMonth,{locale:i}),m=[a.nav_button,a.nav_button_next].join(" "),g=null!==(t=null==d?void 0:d.IconRight)&&void 0!==t?t:tT,v=null!==(n=null==d?void 0:d.IconLeft)&&void 0!==n?n:t_;return th.jsxs("div",{className:a.nav,style:l.nav,children:[!e.hidePrevious&&th.jsx(tA,{name:"previous-month","aria-label":f,className:p,style:l.nav_button_previous,disabled:!e.previousMonth,onClick:e.onPreviousClick,children:"rtl"===o?th.jsx(g,{className:a.nav_icon,style:l.nav_icon}):th.jsx(v,{className:a.nav_icon,style:l.nav_icon})}),!e.hideNext&&th.jsx(tA,{name:"next-month","aria-label":h,className:m,style:l.nav_button_next,disabled:!e.nextMonth,onClick:e.onNextClick,children:"rtl"===o?th.jsx(v,{className:a.nav_icon,style:l.nav_icon}):th.jsx(g,{className:a.nav_icon,style:l.nav_icon})})]})}function tZ(e){var t=tk().numberOfMonths,n=tM(),r=n.previousMonth,o=n.nextMonth,i=n.goToMonth,a=n.displayMonths,l=a.findIndex(function(t){return e9(e.displayMonth,t)}),c=0===l,s=l===a.length-1;return th.jsx(tD,{displayMonth:e.displayMonth,hideNext:t>1&&(c||!s),hidePrevious:t>1&&(s||!c),nextMonth:o,previousMonth:r,onPreviousClick:function(){r&&i(r)},onNextClick:function(){o&&i(o)}})}function tL(e){var t,n,r=tk(),o=r.classNames,i=r.disableNavigation,a=r.styles,l=r.captionLayout,c=r.components,s=null!==(t=null==c?void 0:c.CaptionLabel)&&void 0!==t?t:tE;return n=i?th.jsx(s,{id:e.id,displayMonth:e.displayMonth}):"dropdown"===l?th.jsx(tR,{displayMonth:e.displayMonth,id:e.id}):"dropdown-buttons"===l?th.jsxs(th.Fragment,{children:[th.jsx(tR,{displayMonth:e.displayMonth,displayIndex:e.displayIndex,id:e.id}),th.jsx(tZ,{displayMonth:e.displayMonth,displayIndex:e.displayIndex,id:e.id})]}):th.jsxs(th.Fragment,{children:[th.jsx(s,{id:e.id,displayMonth:e.displayMonth,displayIndex:e.displayIndex}),th.jsx(tZ,{displayMonth:e.displayMonth,id:e.id})]}),th.jsx("div",{className:o.caption,style:a.caption,children:n})}function tz(e){var t=tk(),n=t.footer,r=t.styles,o=t.classNames.tfoot;return n?th.jsx("tfoot",{className:o,style:r.tfoot,children:th.jsx("tr",{children:th.jsx("td",{colSpan:8,children:n})})}):th.jsx(th.Fragment,{})}function tB(){var e=tk(),t=e.classNames,n=e.styles,r=e.showWeekNumber,o=e.locale,i=e.weekStartsOn,a=e.ISOWeek,l=e.formatters.formatWeekdayName,c=e.labels.labelWeekday,s=function(e,t,n){for(var r=n?tn(new Date):tt(new Date,{locale:e,weekStartsOn:t}),o=[],i=0;i<7;i++){var a=(0,eh.Z)(r,i);o.push(a)}return o}(o,i,a);return th.jsxs("tr",{style:n.head_row,className:t.head_row,children:[r&&th.jsx("td",{style:n.head_cell,className:t.head_cell}),s.map(function(e,r){return th.jsx("th",{scope:"col",className:t.head_cell,style:n.head_cell,"aria-label":c(e,{locale:o}),children:l(e,{locale:o})},r)})]})}function tF(){var e,t=tk(),n=t.classNames,r=t.styles,o=t.components,i=null!==(e=null==o?void 0:o.HeadRow)&&void 0!==e?e:tB;return th.jsx("thead",{style:r.head,className:n.head,children:th.jsx(i,{})})}function tH(e){var t=tk(),n=t.locale,r=t.formatters.formatDay;return th.jsx(th.Fragment,{children:r(e.date,{locale:n})})}var tq=(0,d.createContext)(void 0);function tW(e){return tm(e.initialProps)?th.jsx(tK,{initialProps:e.initialProps,children:e.children}):th.jsx(tq.Provider,{value:{selected:void 0,modifiers:{disabled:[]}},children:e.children})}function tK(e){var t=e.initialProps,n=e.children,r=t.selected,o=t.min,i=t.max,a={disabled:[]};return r&&a.disabled.push(function(e){var t=i&&r.length>i-1,n=r.some(function(t){return tr(t,e)});return!!(t&&!n)}),th.jsx(tq.Provider,{value:{selected:r,onDayClick:function(e,n,a){if(null===(l=t.onDayClick)||void 0===l||l.call(t,e,n,a),(!n.selected||!o||(null==r?void 0:r.length)!==o)&&(n.selected||!i||(null==r?void 0:r.length)!==i)){var l,c,s=r?td([],r,!0):[];if(n.selected){var u=s.findIndex(function(t){return tr(e,t)});s.splice(u,1)}else s.push(e);null===(c=t.onSelect)||void 0===c||c.call(t,s,e,n,a)}},modifiers:a},children:n})}function tV(){var e=(0,d.useContext)(tq);if(!e)throw Error("useSelectMultiple must be used within a SelectMultipleProvider");return e}var tU=(0,d.createContext)(void 0);function t$(e){return tg(e.initialProps)?th.jsx(tG,{initialProps:e.initialProps,children:e.children}):th.jsx(tU.Provider,{value:{selected:void 0,modifiers:{range_start:[],range_end:[],range_middle:[],disabled:[]}},children:e.children})}function tG(e){var t=e.initialProps,n=e.children,r=t.selected,o=r||{},i=o.from,a=o.to,l=t.min,c=t.max,s={range_start:[],range_end:[],range_middle:[],disabled:[]};if(i?(s.range_start=[i],a?(s.range_end=[a],tr(i,a)||(s.range_middle=[{after:i,before:a}])):s.range_end=[i]):a&&(s.range_start=[a],s.range_end=[a]),l&&(i&&!a&&s.disabled.push({after:eg(i,l-1),before:(0,eh.Z)(i,l-1)}),i&&a&&s.disabled.push({after:i,before:(0,eh.Z)(i,l-1)}),!i&&a&&s.disabled.push({after:eg(a,l-1),before:(0,eh.Z)(a,l-1)})),c){if(i&&!a&&(s.disabled.push({before:(0,eh.Z)(i,-c+1)}),s.disabled.push({after:(0,eh.Z)(i,c-1)})),i&&a){var u=c-(ti(a,i)+1);s.disabled.push({before:eg(i,u)}),s.disabled.push({after:(0,eh.Z)(a,u)})}!i&&a&&(s.disabled.push({before:(0,eh.Z)(a,-c+1)}),s.disabled.push({after:(0,eh.Z)(a,c-1)}))}return th.jsx(tU.Provider,{value:{selected:r,onDayClick:function(e,n,o){null===(c=t.onDayClick)||void 0===c||c.call(t,e,n,o);var i,a,l,c,s,u=(a=(i=r||{}).from,l=i.to,a&&l?tr(l,e)&&tr(a,e)?void 0:tr(l,e)?{from:l,to:void 0}:tr(a,e)?void 0:to(a,e)?{from:e,to:l}:{from:a,to:e}:l?to(e,l)?{from:l,to:e}:{from:e,to:l}:a?te(e,a)?{from:e,to:a}:{from:a,to:e}:{from:e,to:void 0});null===(s=t.onSelect)||void 0===s||s.call(t,u,e,n,o)},modifiers:s},children:n})}function tX(){var e=(0,d.useContext)(tU);if(!e)throw Error("useSelectRange must be used within a SelectRangeProvider");return e}function tY(e){return Array.isArray(e)?td([],e,!0):void 0!==e?[e]:[]}(l=s||(s={})).Outside="outside",l.Disabled="disabled",l.Selected="selected",l.Hidden="hidden",l.Today="today",l.RangeStart="range_start",l.RangeEnd="range_end",l.RangeMiddle="range_middle";var tQ=s.Selected,tJ=s.Disabled,t0=s.Hidden,t1=s.Today,t2=s.RangeEnd,t6=s.RangeMiddle,t3=s.RangeStart,t4=s.Outside,t5=(0,d.createContext)(void 0);function t8(e){var t,n,r,o=tk(),i=tV(),a=tX(),l=((t={})[tQ]=tY(o.selected),t[tJ]=tY(o.disabled),t[t0]=tY(o.hidden),t[t1]=[o.today],t[t2]=[],t[t6]=[],t[t3]=[],t[t4]=[],o.fromDate&&t[tJ].push({before:o.fromDate}),o.toDate&&t[tJ].push({after:o.toDate}),tm(o)?t[tJ]=t[tJ].concat(i.modifiers[tJ]):tg(o)&&(t[tJ]=t[tJ].concat(a.modifiers[tJ]),t[t3]=a.modifiers[t3],t[t6]=a.modifiers[t6],t[t2]=a.modifiers[t2]),t),c=(n=o.modifiers,r={},Object.entries(n).forEach(function(e){var t=e[0],n=e[1];r[t]=tY(n)}),r),s=tu(tu({},l),c);return th.jsx(t5.Provider,{value:s,children:e.children})}function t7(){var e=(0,d.useContext)(t5);if(!e)throw Error("useModifiers must be used within a ModifiersProvider");return e}function t9(e,t,n){var r=Object.keys(t).reduce(function(n,r){return t[r].some(function(t){if("boolean"==typeof t)return t;if(ex(t))return tr(e,t);if(Array.isArray(t)&&t.every(ex))return t.includes(e);if(t&&"object"==typeof t&&"from"in t)return r=t.from,o=t.to,r&&o?(0>ti(o,r)&&(r=(n=[o,r])[0],o=n[1]),ti(e,r)>=0&&ti(o,e)>=0):o?tr(o,e):!!r&&tr(r,e);if(t&&"object"==typeof t&&"dayOfWeek"in t)return t.dayOfWeek.includes(e.getDay());if(t&&"object"==typeof t&&"before"in t&&"after"in t){var n,r,o,i=ti(t.before,e),a=ti(t.after,e),l=i>0,c=a<0;return to(t.before,t.after)?c&&l:l||c}return t&&"object"==typeof t&&"after"in t?ti(e,t.after)>0:t&&"object"==typeof t&&"before"in t?ti(t.before,e)>0:"function"==typeof t&&t(e)})&&n.push(r),n},[]),o={};return r.forEach(function(e){return o[e]=!0}),n&&!e9(e,n)&&(o.outside=!0),o}var ne=(0,d.createContext)(void 0);function nt(e){var t=tM(),n=t7(),r=(0,d.useState)(),o=r[0],i=r[1],a=(0,d.useState)(),l=a[0],c=a[1],s=function(e,t){for(var n,r,o=ec(e[0]),i=e4(e[e.length-1]),a=o;a<=i;){var l=t9(a,t);if(!(!l.disabled&&!l.hidden)){a=(0,eh.Z)(a,1);continue}if(l.selected)return a;l.today&&!r&&(r=a),n||(n=a),a=(0,eh.Z)(a,1)}return r||n}(t.displayMonths,n),u=(null!=o?o:l&&t.isDateDisplayed(l))?l:s,f=function(e){i(e)},p=tk(),h=function(e,r){if(o){var i=function e(t,n){var r=n.moveBy,o=n.direction,i=n.context,a=n.modifiers,l=n.retry,c=void 0===l?{count:0,lastFocused:t}:l,s=i.weekStartsOn,u=i.fromDate,d=i.toDate,f=i.locale,p=({day:eh.Z,week:ta,month:ev.Z,year:tl,startOfWeek:function(e){return i.ISOWeek?tn(e):tt(e,{locale:f,weekStartsOn:s})},endOfWeek:function(e){return i.ISOWeek?ts(e):tc(e,{locale:f,weekStartsOn:s})}})[r](t,"after"===o?1:-1);"before"===o&&u?p=ef([u,p]):"after"===o&&d&&(p=ep([d,p]));var h=!0;if(a){var m=t9(p,a);h=!m.disabled&&!m.hidden}return h?p:c.count>365?c.lastFocused:e(p,{moveBy:r,direction:o,context:i,modifiers:a,retry:tu(tu({},c),{count:c.count+1})})}(o,{moveBy:e,direction:r,context:p,modifiers:n});tr(o,i)||(t.goToDate(i,o),f(i))}};return th.jsx(ne.Provider,{value:{focusedDay:o,focusTarget:u,blur:function(){c(o),i(void 0)},focus:f,focusDayAfter:function(){return h("day","after")},focusDayBefore:function(){return h("day","before")},focusWeekAfter:function(){return h("week","after")},focusWeekBefore:function(){return h("week","before")},focusMonthBefore:function(){return h("month","before")},focusMonthAfter:function(){return h("month","after")},focusYearBefore:function(){return h("year","before")},focusYearAfter:function(){return h("year","after")},focusStartOfWeek:function(){return h("startOfWeek","before")},focusEndOfWeek:function(){return h("endOfWeek","after")}},children:e.children})}function nn(){var e=(0,d.useContext)(ne);if(!e)throw Error("useFocusContext must be used within a FocusProvider");return e}var nr=(0,d.createContext)(void 0);function no(e){return tv(e.initialProps)?th.jsx(ni,{initialProps:e.initialProps,children:e.children}):th.jsx(nr.Provider,{value:{selected:void 0},children:e.children})}function ni(e){var t=e.initialProps,n=e.children,r={selected:t.selected,onDayClick:function(e,n,r){var o,i,a;if(null===(o=t.onDayClick)||void 0===o||o.call(t,e,n,r),n.selected&&!t.required){null===(i=t.onSelect)||void 0===i||i.call(t,void 0,e,n,r);return}null===(a=t.onSelect)||void 0===a||a.call(t,e,e,n,r)}};return th.jsx(nr.Provider,{value:r,children:n})}function na(){var e=(0,d.useContext)(nr);if(!e)throw Error("useSelectSingle must be used within a SelectSingleProvider");return e}function nl(e){var t,n,r,o,i,a,l,c,u,f,p,h,m,g,v,b,y,x,w,S,k,E,C,O,j,P,I,N,M,R,_,T,A,D,Z,L,z,B,F,H,q,W,K=(0,d.useRef)(null),V=(t=e.date,n=e.displayMonth,a=tk(),l=nn(),c=t9(t,t7(),n),u=tk(),f=na(),p=tV(),h=tX(),g=(m=nn()).focusDayAfter,v=m.focusDayBefore,b=m.focusWeekAfter,y=m.focusWeekBefore,x=m.blur,w=m.focus,S=m.focusMonthBefore,k=m.focusMonthAfter,E=m.focusYearBefore,C=m.focusYearAfter,O=m.focusStartOfWeek,j=m.focusEndOfWeek,P={onClick:function(e){var n,r,o,i;tv(u)?null===(n=f.onDayClick)||void 0===n||n.call(f,t,c,e):tm(u)?null===(r=p.onDayClick)||void 0===r||r.call(p,t,c,e):tg(u)?null===(o=h.onDayClick)||void 0===o||o.call(h,t,c,e):null===(i=u.onDayClick)||void 0===i||i.call(u,t,c,e)},onFocus:function(e){var n;w(t),null===(n=u.onDayFocus)||void 0===n||n.call(u,t,c,e)},onBlur:function(e){var n;x(),null===(n=u.onDayBlur)||void 0===n||n.call(u,t,c,e)},onKeyDown:function(e){var n;switch(e.key){case"ArrowLeft":e.preventDefault(),e.stopPropagation(),"rtl"===u.dir?g():v();break;case"ArrowRight":e.preventDefault(),e.stopPropagation(),"rtl"===u.dir?v():g();break;case"ArrowDown":e.preventDefault(),e.stopPropagation(),b();break;case"ArrowUp":e.preventDefault(),e.stopPropagation(),y();break;case"PageUp":e.preventDefault(),e.stopPropagation(),e.shiftKey?E():S();break;case"PageDown":e.preventDefault(),e.stopPropagation(),e.shiftKey?C():k();break;case"Home":e.preventDefault(),e.stopPropagation(),O();break;case"End":e.preventDefault(),e.stopPropagation(),j()}null===(n=u.onDayKeyDown)||void 0===n||n.call(u,t,c,e)},onKeyUp:function(e){var n;null===(n=u.onDayKeyUp)||void 0===n||n.call(u,t,c,e)},onMouseEnter:function(e){var n;null===(n=u.onDayMouseEnter)||void 0===n||n.call(u,t,c,e)},onMouseLeave:function(e){var n;null===(n=u.onDayMouseLeave)||void 0===n||n.call(u,t,c,e)},onPointerEnter:function(e){var n;null===(n=u.onDayPointerEnter)||void 0===n||n.call(u,t,c,e)},onPointerLeave:function(e){var n;null===(n=u.onDayPointerLeave)||void 0===n||n.call(u,t,c,e)},onTouchCancel:function(e){var n;null===(n=u.onDayTouchCancel)||void 0===n||n.call(u,t,c,e)},onTouchEnd:function(e){var n;null===(n=u.onDayTouchEnd)||void 0===n||n.call(u,t,c,e)},onTouchMove:function(e){var n;null===(n=u.onDayTouchMove)||void 0===n||n.call(u,t,c,e)},onTouchStart:function(e){var n;null===(n=u.onDayTouchStart)||void 0===n||n.call(u,t,c,e)}},I=tk(),N=na(),M=tV(),R=tX(),_=tv(I)?N.selected:tm(I)?M.selected:tg(I)?R.selected:void 0,T=!!(a.onDayClick||"default"!==a.mode),(0,d.useEffect)(function(){var e;!c.outside&&l.focusedDay&&T&&tr(l.focusedDay,t)&&(null===(e=K.current)||void 0===e||e.focus())},[l.focusedDay,t,K,T,c.outside]),D=(A=[a.classNames.day],Object.keys(c).forEach(function(e){var t=a.modifiersClassNames[e];if(t)A.push(t);else if(Object.values(s).includes(e)){var n=a.classNames["day_".concat(e)];n&&A.push(n)}}),A).join(" "),Z=tu({},a.styles.day),Object.keys(c).forEach(function(e){var t;Z=tu(tu({},Z),null===(t=a.modifiersStyles)||void 0===t?void 0:t[e])}),L=Z,z=!!(c.outside&&!a.showOutsideDays||c.hidden),B=null!==(i=null===(o=a.components)||void 0===o?void 0:o.DayContent)&&void 0!==i?i:tH,F={style:L,className:D,children:th.jsx(B,{date:t,displayMonth:n,activeModifiers:c}),role:"gridcell"},H=l.focusTarget&&tr(l.focusTarget,t)&&!c.outside,q=l.focusedDay&&tr(l.focusedDay,t),W=tu(tu(tu({},F),((r={disabled:c.disabled,role:"gridcell"})["aria-selected"]=c.selected,r.tabIndex=q||H?0:-1,r)),P),{isButton:T,isHidden:z,activeModifiers:c,selectedDays:_,buttonProps:W,divProps:F});return V.isHidden?th.jsx("div",{role:"gridcell"}):V.isButton?th.jsx(tA,tu({name:"day",ref:K},V.buttonProps)):th.jsx("div",tu({},V.divProps))}function nc(e){var t=e.number,n=e.dates,r=tk(),o=r.onWeekNumberClick,i=r.styles,a=r.classNames,l=r.locale,c=r.labels.labelWeekNumber,s=(0,r.formatters.formatWeekNumber)(Number(t),{locale:l});if(!o)return th.jsx("span",{className:a.weeknumber,style:i.weeknumber,children:s});var u=c(Number(t),{locale:l});return th.jsx(tA,{name:"week-number","aria-label":u,className:a.weeknumber,style:i.weeknumber,onClick:function(e){o(t,n,e)},children:s})}function ns(e){var t,n,r,o=tk(),i=o.styles,a=o.classNames,l=o.showWeekNumber,c=o.components,s=null!==(t=null==c?void 0:c.Day)&&void 0!==t?t:nl,u=null!==(n=null==c?void 0:c.WeekNumber)&&void 0!==n?n:nc;return l&&(r=th.jsx("td",{className:a.cell,style:i.cell,children:th.jsx(u,{number:e.weekNumber,dates:e.dates})})),th.jsxs("tr",{className:a.row,style:i.row,children:[r,e.dates.map(function(t){return th.jsx("td",{className:a.cell,style:i.cell,role:"presentation",children:th.jsx(s,{displayMonth:e.displayMonth,date:t})},function(e){return(0,ei.Z)(1,arguments),Math.floor(function(e){return(0,ei.Z)(1,arguments),(0,eo.Z)(e).getTime()}(e)/1e3)}(t))})]})}function nu(e,t,n){for(var r=(null==n?void 0:n.ISOWeek)?ts(t):tc(t,n),o=(null==n?void 0:n.ISOWeek)?tn(e):tt(e,n),i=ti(r,o),a=[],l=0;l<=i;l++)a.push((0,eh.Z)(o,l));return a.reduce(function(e,t){var r=(null==n?void 0:n.ISOWeek)?function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e);return Math.round((tn(t).getTime()-(function(e){(0,ei.Z)(1,arguments);var t=function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getFullYear(),r=new Date(0);r.setFullYear(n+1,0,4),r.setHours(0,0,0,0);var o=tn(r),i=new Date(0);i.setFullYear(n,0,4),i.setHours(0,0,0,0);var a=tn(i);return t.getTime()>=o.getTime()?n+1:t.getTime()>=a.getTime()?n:n-1}(e),n=new Date(0);return n.setFullYear(t,0,4),n.setHours(0,0,0,0),tn(n)})(t).getTime())/6048e5)+1}(t):function(e,t){(0,ei.Z)(1,arguments);var n=(0,eo.Z)(e);return Math.round((tt(n,t).getTime()-(function(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,c,s,u=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.firstWeekContainsDate)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.firstWeekContainsDate)&&void 0!==o?o:ek.firstWeekContainsDate)&&void 0!==r?r:null===(c=ek.locale)||void 0===c?void 0:null===(s=c.options)||void 0===s?void 0:s.firstWeekContainsDate)&&void 0!==n?n:1),d=function(e,t){(0,ei.Z)(1,arguments);var n,r,o,i,a,l,c,s,u=(0,eo.Z)(e),d=u.getFullYear(),f=(0,em.Z)(null!==(n=null!==(r=null!==(o=null!==(i=null==t?void 0:t.firstWeekContainsDate)&&void 0!==i?i:null==t?void 0:null===(a=t.locale)||void 0===a?void 0:null===(l=a.options)||void 0===l?void 0:l.firstWeekContainsDate)&&void 0!==o?o:ek.firstWeekContainsDate)&&void 0!==r?r:null===(c=ek.locale)||void 0===c?void 0:null===(s=c.options)||void 0===s?void 0:s.firstWeekContainsDate)&&void 0!==n?n:1);if(!(f>=1&&f<=7))throw RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var p=new Date(0);p.setFullYear(d+1,0,f),p.setHours(0,0,0,0);var h=tt(p,t),m=new Date(0);m.setFullYear(d,0,f),m.setHours(0,0,0,0);var g=tt(m,t);return u.getTime()>=h.getTime()?d+1:u.getTime()>=g.getTime()?d:d-1}(e,t),f=new Date(0);return f.setFullYear(d,0,u),f.setHours(0,0,0,0),tt(f,t)})(n,t).getTime())/6048e5)+1}(t,n),o=e.find(function(e){return e.weekNumber===r});return o?o.dates.push(t):e.push({weekNumber:r,dates:[t]}),e},[])}function nd(e){var t,n,r,o=tk(),i=o.locale,a=o.classNames,l=o.styles,c=o.hideHead,s=o.fixedWeeks,u=o.components,d=o.weekStartsOn,f=o.firstWeekContainsDate,p=o.ISOWeek,h=function(e,t){var n=nu(ec(e),e4(e),t);if(null==t?void 0:t.useFixedWeeks){var r=function(e,t){return(0,ei.Z)(1,arguments),function(e,t,n){(0,ei.Z)(2,arguments);var r=tt(e,n),o=tt(t,n);return Math.round((r.getTime()-eD(r)-(o.getTime()-eD(o)))/6048e5)}(function(e){(0,ei.Z)(1,arguments);var t=(0,eo.Z)(e),n=t.getMonth();return t.setFullYear(t.getFullYear(),n+1,0),t.setHours(0,0,0,0),t}(e),ec(e),t)+1}(e,t);if(r<6){var o=n[n.length-1],i=o.dates[o.dates.length-1],a=ta(i,6-r),l=nu(ta(i,1),a,t);n.push.apply(n,l)}}return n}(e.displayMonth,{useFixedWeeks:!!s,ISOWeek:p,locale:i,weekStartsOn:d,firstWeekContainsDate:f}),m=null!==(t=null==u?void 0:u.Head)&&void 0!==t?t:tF,g=null!==(n=null==u?void 0:u.Row)&&void 0!==n?n:ns,v=null!==(r=null==u?void 0:u.Footer)&&void 0!==r?r:tz;return th.jsxs("table",{id:e.id,className:a.table,style:l.table,role:"grid","aria-labelledby":e["aria-labelledby"],children:[!c&&th.jsx(m,{}),th.jsx("tbody",{className:a.tbody,style:l.tbody,children:h.map(function(t){return th.jsx(g,{displayMonth:e.displayMonth,dates:t.dates,weekNumber:t.weekNumber},t.weekNumber)})}),th.jsx(v,{displayMonth:e.displayMonth})]})}var nf="undefined"!=typeof window&&window.document&&window.document.createElement?d.useLayoutEffect:d.useEffect,np=!1,nh=0;function nm(){return"react-day-picker-".concat(++nh)}function ng(e){var t,n,r,o,i,a,l,c,s=tk(),u=s.dir,f=s.classNames,p=s.styles,h=s.components,m=tM().displayMonths,g=(r=null!=(t=s.id?"".concat(s.id,"-").concat(e.displayIndex):void 0)?t:np?nm():null,i=(o=(0,d.useState)(r))[0],a=o[1],nf(function(){null===i&&a(nm())},[]),(0,d.useEffect)(function(){!1===np&&(np=!0)},[]),null!==(n=null!=t?t:i)&&void 0!==n?n:void 0),v=s.id?"".concat(s.id,"-grid-").concat(e.displayIndex):void 0,b=[f.month],y=p.month,x=0===e.displayIndex,w=e.displayIndex===m.length-1,S=!x&&!w;"rtl"===u&&(w=(l=[x,w])[0],x=l[1]),x&&(b.push(f.caption_start),y=tu(tu({},y),p.caption_start)),w&&(b.push(f.caption_end),y=tu(tu({},y),p.caption_end)),S&&(b.push(f.caption_between),y=tu(tu({},y),p.caption_between));var k=null!==(c=null==h?void 0:h.Caption)&&void 0!==c?c:tL;return th.jsxs("div",{className:b.join(" "),style:y,children:[th.jsx(k,{id:g,displayMonth:e.displayMonth,displayIndex:e.displayIndex}),th.jsx(nd,{id:v,"aria-labelledby":g,displayMonth:e.displayMonth})]},e.displayIndex)}function nv(e){var t=tk(),n=t.classNames,r=t.styles;return th.jsx("div",{className:n.months,style:r.months,children:e.children})}function nb(e){var t,n,r=e.initialProps,o=tk(),i=nn(),a=tM(),l=(0,d.useState)(!1),c=l[0],s=l[1];(0,d.useEffect)(function(){o.initialFocus&&i.focusTarget&&(c||(i.focus(i.focusTarget),s(!0)))},[o.initialFocus,c,i.focus,i.focusTarget,i]);var u=[o.classNames.root,o.className];o.numberOfMonths>1&&u.push(o.classNames.multiple_months),o.showWeekNumber&&u.push(o.classNames.with_weeknumber);var f=tu(tu({},o.styles.root),o.style),p=Object.keys(r).filter(function(e){return e.startsWith("data-")}).reduce(function(e,t){var n;return tu(tu({},e),((n={})[t]=r[t],n))},{}),h=null!==(n=null===(t=r.components)||void 0===t?void 0:t.Months)&&void 0!==n?n:nv;return th.jsx("div",tu({className:u.join(" "),style:f,dir:o.dir,id:o.id,nonce:r.nonce,title:r.title,lang:r.lang},p,{children:th.jsx(h,{children:a.displayMonths.map(function(e,t){return th.jsx(ng,{displayIndex:t,displayMonth:e},t)})})}))}function ny(e){var t=e.children,n=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&0>t.indexOf(r)&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);ot.indexOf(r[o])&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]]);return n}(e,["children"]);return th.jsx(tS,{initialProps:n,children:th.jsx(tN,{children:th.jsx(no,{initialProps:n,children:th.jsx(tW,{initialProps:n,children:th.jsx(t$,{initialProps:n,children:th.jsx(t8,{children:th.jsx(nt,{children:t})})})})})})})}function nx(e){return th.jsx(ny,tu({},e,{children:th.jsx(nb,{initialProps:e})}))}let nw=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z"}))},nS=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M13.1717 12.0007L8.22192 7.05093L9.63614 5.63672L16.0001 12.0007L9.63614 18.3646L8.22192 16.9504L13.1717 12.0007Z"}))},nk=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M4.83582 12L11.0429 18.2071L12.4571 16.7929L7.66424 12L12.4571 7.20712L11.0429 5.79291L4.83582 12ZM10.4857 12L16.6928 18.2071L18.107 16.7929L13.3141 12L18.107 7.20712L16.6928 5.79291L10.4857 12Z"}))},nE=e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M19.1642 12L12.9571 5.79291L11.5429 7.20712L16.3358 12L11.5429 16.7929L12.9571 18.2071L19.1642 12ZM13.5143 12L7.30722 5.79291L5.89301 7.20712L10.6859 12L5.89301 16.7929L7.30722 18.2071L13.5143 12Z"}))};var nC=n(84264);n(41649);var nO=n(1526),nj=n(7084),nP=n(26898);let nI={xs:{paddingX:"px-2",paddingY:"py-0.5",fontSize:"text-xs"},sm:{paddingX:"px-2.5",paddingY:"py-1",fontSize:"text-sm"},md:{paddingX:"px-3",paddingY:"py-1.5",fontSize:"text-md"},lg:{paddingX:"px-3.5",paddingY:"py-1.5",fontSize:"text-lg"},xl:{paddingX:"px-3.5",paddingY:"py-1.5",fontSize:"text-xl"}},nN={xs:{paddingX:"px-2",paddingY:"py-0.5",fontSize:"text-xs"},sm:{paddingX:"px-2.5",paddingY:"py-0.5",fontSize:"text-sm"},md:{paddingX:"px-3",paddingY:"py-0.5",fontSize:"text-md"},lg:{paddingX:"px-3.5",paddingY:"py-0.5",fontSize:"text-lg"},xl:{paddingX:"px-4",paddingY:"py-1",fontSize:"text-xl"}},nM={xs:{height:"h-4",width:"w-4"},sm:{height:"h-4",width:"w-4"},md:{height:"h-4",width:"w-4"},lg:{height:"h-5",width:"w-5"},xl:{height:"h-6",width:"w-6"}},nR={[nj.wu.Increase]:{bgColor:(0,eJ.bM)(nj.fr.Emerald,nP.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Emerald,nP.K.text).textColor},[nj.wu.ModerateIncrease]:{bgColor:(0,eJ.bM)(nj.fr.Emerald,nP.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Emerald,nP.K.text).textColor},[nj.wu.Decrease]:{bgColor:(0,eJ.bM)(nj.fr.Rose,nP.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Rose,nP.K.text).textColor},[nj.wu.ModerateDecrease]:{bgColor:(0,eJ.bM)(nj.fr.Rose,nP.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Rose,nP.K.text).textColor},[nj.wu.Unchanged]:{bgColor:(0,eJ.bM)(nj.fr.Orange,nP.K.background).bgColor,textColor:(0,eJ.bM)(nj.fr.Orange,nP.K.text).textColor}},n_={[nj.wu.Increase]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M13.0001 7.82843V20H11.0001V7.82843L5.63614 13.1924L4.22192 11.7782L12.0001 4L19.7783 11.7782L18.3641 13.1924L13.0001 7.82843Z"}))},[nj.wu.ModerateIncrease]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M16.0037 9.41421L7.39712 18.0208L5.98291 16.6066L14.5895 8H7.00373V6H18.0037V17H16.0037V9.41421Z"}))},[nj.wu.Decrease]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M13.0001 16.1716L18.3641 10.8076L19.7783 12.2218L12.0001 20L4.22192 12.2218L5.63614 10.8076L11.0001 16.1716V4H13.0001V16.1716Z"}))},[nj.wu.ModerateDecrease]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M14.5895 16.0032L5.98291 7.39664L7.39712 5.98242L16.0037 14.589V7.00324H18.0037V18.0032H7.00373V16.0032H14.5895Z"}))},[nj.wu.Unchanged]:e=>{var t=(0,u._T)(e,[]);return d.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),d.createElement("path",{d:"M16.1716 10.9999L10.8076 5.63589L12.2218 4.22168L20 11.9999L12.2218 19.778L10.8076 18.3638L16.1716 12.9999H4V10.9999H16.1716Z"}))}},nT=(0,eJ.fn)("BadgeDelta");d.forwardRef((e,t)=>{let{deltaType:n=nj.wu.Increase,isIncreasePositive:r=!0,size:o=nj.u8.SM,tooltip:i,children:a,className:l}=e,c=(0,u._T)(e,["deltaType","isIncreasePositive","size","tooltip","children","className"]),s=n_[n],f=(0,eJ.Fo)(n,r),p=a?nN:nI,{tooltipProps:h,getReferenceProps:m}=(0,nO.l)();return d.createElement("span",Object.assign({ref:(0,eJ.lq)([t,h.refs.setReference]),className:(0,es.q)(nT("root"),"w-max flex-shrink-0 inline-flex justify-center items-center cursor-default rounded-tremor-full bg-opacity-20 dark:bg-opacity-25",nR[f].bgColor,nR[f].textColor,p[o].paddingX,p[o].paddingY,p[o].fontSize,l)},m,c),d.createElement(nO.Z,Object.assign({text:i},h)),d.createElement(s,{className:(0,es.q)(nT("icon"),"shrink-0",a?(0,es.q)("-ml-1 mr-1.5"):nM[o].height,nM[o].width)}),a?d.createElement("p",{className:(0,es.q)(nT("text"),"text-sm whitespace-nowrap")},a):null)}).displayName="BadgeDelta";var nA=n(47323);let nD=e=>{var{onClick:t,icon:n}=e,r=(0,u._T)(e,["onClick","icon"]);return d.createElement("button",Object.assign({type:"button",className:(0,es.q)("flex items-center justify-center p-1 h-7 w-7 outline-none focus:ring-2 transition duration-100 border border-tremor-border dark:border-dark-tremor-border hover:bg-tremor-background-muted dark:hover:bg-dark-tremor-background-muted rounded-tremor-small focus:border-tremor-brand-subtle select-none dark:focus:border-dark-tremor-brand-subtle focus:ring-tremor-brand-muted dark:focus:ring-dark-tremor-brand-muted text-tremor-content-subtle dark:text-dark-tremor-content-subtle hover:text-tremor-content dark:hover:text-dark-tremor-content")},r),d.createElement(nA.Z,{onClick:t,icon:n,variant:"simple",color:"slate",size:"sm"}))};function nZ(e){var{mode:t,defaultMonth:n,selected:r,onSelect:o,locale:i,disabled:a,enableYearNavigation:l,classNames:c,weekStartsOn:s=0}=e,f=(0,u._T)(e,["mode","defaultMonth","selected","onSelect","locale","disabled","enableYearNavigation","classNames","weekStartsOn"]);return d.createElement(nx,Object.assign({showOutsideDays:!0,mode:t,defaultMonth:n,selected:r,onSelect:o,locale:i,disabled:a,weekStartsOn:s,classNames:Object.assign({months:"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",month:"space-y-4",caption:"flex justify-center pt-2 relative items-center",caption_label:"text-tremor-default text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis font-medium",nav:"space-x-1 flex items-center",nav_button:"flex items-center justify-center p-1 h-7 w-7 outline-none focus:ring-2 transition duration-100 border border-tremor-border dark:border-dark-tremor-border hover:bg-tremor-background-muted dark:hover:bg-dark-tremor-background-muted rounded-tremor-small focus:border-tremor-brand-subtle dark:focus:border-dark-tremor-brand-subtle focus:ring-tremor-brand-muted dark:focus:ring-dark-tremor-brand-muted text-tremor-content-subtle dark:text-dark-tremor-content-subtle hover:text-tremor-content dark:hover:text-dark-tremor-content",nav_button_previous:"absolute left-1",nav_button_next:"absolute right-1",table:"w-full border-collapse space-y-1",head_row:"flex",head_cell:"w-9 font-normal text-center text-tremor-content-subtle dark:text-dark-tremor-content-subtle",row:"flex w-full mt-0.5",cell:"text-center p-0 relative focus-within:relative text-tremor-default text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis",day:"h-9 w-9 p-0 hover:bg-tremor-background-subtle dark:hover:bg-dark-tremor-background-subtle outline-tremor-brand dark:outline-dark-tremor-brand rounded-tremor-default",day_today:"font-bold",day_selected:"aria-selected:bg-tremor-background-emphasis aria-selected:text-tremor-content-inverted dark:aria-selected:bg-dark-tremor-background-emphasis dark:aria-selected:text-dark-tremor-content-inverted ",day_disabled:"text-tremor-content-subtle dark:text-dark-tremor-content-subtle disabled:hover:bg-transparent",day_outside:"text-tremor-content-subtle dark:text-dark-tremor-content-subtle"},c),components:{IconLeft:e=>{var t=(0,u._T)(e,[]);return d.createElement(nw,Object.assign({className:"h-4 w-4"},t))},IconRight:e=>{var t=(0,u._T)(e,[]);return d.createElement(nS,Object.assign({className:"h-4 w-4"},t))},Caption:e=>{var t=(0,u._T)(e,[]);let{goToMonth:n,nextMonth:r,previousMonth:o,currentMonth:a}=tM();return d.createElement("div",{className:"flex justify-between items-center"},d.createElement("div",{className:"flex items-center space-x-1"},l&&d.createElement(nD,{onClick:()=>a&&n(tl(a,-1)),icon:nk}),d.createElement(nD,{onClick:()=>o&&n(o),icon:nw})),d.createElement(nC.Z,{className:"text-tremor-default tabular-nums capitalize text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis font-medium"},eQ(t.displayMonth,"LLLL yyy",{locale:i})),d.createElement("div",{className:"flex items-center space-x-1"},d.createElement(nD,{onClick:()=>r&&n(r),icon:nS}),l&&d.createElement(nD,{onClick:()=>a&&n(tl(a,1)),icon:nE})))}}},f))}nZ.displayName="DateRangePicker",n(27281);var nL=n(57365),nz=n(44140);let nB=el(),nF=d.forwardRef((e,t)=>{var n,r;let{value:o,defaultValue:i,onValueChange:a,enableSelect:l=!0,minDate:c,maxDate:s,placeholder:f="Select range",selectPlaceholder:p="Select range",disabled:h=!1,locale:m=eV,enableClear:g=!0,displayFormat:v,children:b,className:y,enableYearNavigation:x=!1,weekStartsOn:w=0,disabledDates:S}=e,k=(0,u._T)(e,["value","defaultValue","onValueChange","enableSelect","minDate","maxDate","placeholder","selectPlaceholder","disabled","locale","enableClear","displayFormat","children","className","enableYearNavigation","weekStartsOn","disabledDates"]),[E,C]=(0,nz.Z)(i,o),[O,j]=(0,d.useState)(!1),[P,I]=(0,d.useState)(!1),N=(0,d.useMemo)(()=>{let e=[];return c&&e.push({before:c}),s&&e.push({after:s}),[...e,...null!=S?S:[]]},[c,s,S]),M=(0,d.useMemo)(()=>{let e=new Map;return b?d.Children.forEach(b,t=>{var n;e.set(t.props.value,{text:null!==(n=(0,eu.qg)(t))&&void 0!==n?n:t.props.value,from:t.props.from,to:t.props.to})}):e6.forEach(t=>{e.set(t.value,{text:t.text,from:t.from,to:nB})}),e},[b]),R=(0,d.useMemo)(()=>{if(b)return(0,eu.sl)(b);let e=new Map;return e6.forEach(t=>e.set(t.value,t.text)),e},[b]),_=(null==E?void 0:E.selectValue)||"",T=e1(null==E?void 0:E.from,c,_,M),A=e2(null==E?void 0:E.to,s,_,M),D=T||A?e3(T,A,m,v):f,Z=ec(null!==(r=null!==(n=null!=A?A:T)&&void 0!==n?n:s)&&void 0!==r?r:nB),L=g&&!h;return d.createElement("div",Object.assign({ref:t,className:(0,es.q)("w-full min-w-[10rem] relative flex justify-between text-tremor-default max-w-sm shadow-tremor-input dark:shadow-dark-tremor-input rounded-tremor-default",y)},k),d.createElement(J,{as:"div",className:(0,es.q)("w-full",l?"rounded-l-tremor-default":"rounded-tremor-default",O&&"ring-2 ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted z-10")},d.createElement("div",{className:"relative w-full"},d.createElement(J.Button,{onFocus:()=>j(!0),onBlur:()=>j(!1),disabled:h,className:(0,es.q)("w-full outline-none text-left whitespace-nowrap truncate focus:ring-2 transition duration-100 rounded-l-tremor-default flex flex-nowrap border pl-3 py-2","rounded-l-tremor-default border-tremor-border text-tremor-content-emphasis focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:text-dark-tremor-content-emphasis dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",l?"rounded-l-tremor-default":"rounded-tremor-default",L?"pr-8":"pr-4",(0,eu.um)((0,eu.Uh)(T||A),h))},d.createElement(en,{className:(0,es.q)(e0("calendarIcon"),"flex-none shrink-0 h-5 w-5 -ml-0.5 mr-2","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle"),"aria-hidden":"true"}),d.createElement("p",{className:"truncate"},D)),L&&T?d.createElement("button",{type:"button",className:(0,es.q)("absolute outline-none inset-y-0 right-0 flex items-center transition duration-100 mr-4"),onClick:e=>{e.preventDefault(),null==a||a({}),C({})}},d.createElement(er.Z,{className:(0,es.q)(e0("clearIcon"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null),d.createElement(ee.u,{className:"absolute z-10 min-w-min left-0",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},d.createElement(J.Panel,{focus:!0,className:(0,es.q)("divide-y overflow-y-auto outline-none rounded-tremor-default p-3 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},d.createElement(nZ,Object.assign({mode:"range",showOutsideDays:!0,defaultMonth:Z,selected:{from:T,to:A},onSelect:e=>{null==a||a({from:null==e?void 0:e.from,to:null==e?void 0:e.to}),C({from:null==e?void 0:e.from,to:null==e?void 0:e.to})},locale:m,disabled:N,enableYearNavigation:x,classNames:{day_range_middle:(0,es.q)("!rounded-none aria-selected:!bg-tremor-background-subtle aria-selected:dark:!bg-dark-tremor-background-subtle aria-selected:!text-tremor-content aria-selected:dark:!bg-dark-tremor-background-subtle"),day_range_start:"rounded-r-none rounded-l-tremor-small aria-selected:text-tremor-brand-inverted dark:aria-selected:text-dark-tremor-brand-inverted",day_range_end:"rounded-l-none rounded-r-tremor-small aria-selected:text-tremor-brand-inverted dark:aria-selected:text-dark-tremor-brand-inverted"},weekStartsOn:w},e))))),l&&d.createElement(et.R,{as:"div",className:(0,es.q)("w-48 -ml-px rounded-r-tremor-default",P&&"ring-2 ring-tremor-brand-muted dark:ring-dark-tremor-brand-muted z-10"),value:_,onChange:e=>{let{from:t,to:n}=M.get(e),r=null!=n?n:nB;null==a||a({from:t,to:r,selectValue:e}),C({from:t,to:r,selectValue:e})},disabled:h},e=>{var t;let{value:n}=e;return d.createElement(d.Fragment,null,d.createElement(et.R.Button,{onFocus:()=>I(!0),onBlur:()=>I(!1),className:(0,es.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-r-tremor-default transition duration-100 border px-4 py-2","border-tremor-border shadow-tremor-input text-tremor-content-emphasis focus:border-tremor-brand-subtle","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:text-dark-tremor-content-emphasis dark:focus:border-dark-tremor-brand-subtle",(0,eu.um)((0,eu.Uh)(n),h))},n&&null!==(t=R.get(n))&&void 0!==t?t:p),d.createElement(ee.u,{className:"absolute z-10 w-full inset-x-0 right-0",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},d.createElement(et.R.Options,{className:(0,es.q)("divide-y overflow-y-auto outline-none border my-1","shadow-tremor-dropdown bg-tremor-background border-tremor-border divide-tremor-border rounded-tremor-default","dark:shadow-dark-tremor-dropdown dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border")},null!=b?b:e6.map(e=>d.createElement(nL.Z,{key:e.value,value:e.value},e.text)))))}))});nF.displayName="DateRangePicker"},92414:function(e,t,n){"use strict";n.d(t,{Z:function(){return v}});var r=n(5853),o=n(2265);n(42698),n(64016),n(8710);var i=n(33232),a=n(44140),l=n(58747);let c=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"currentColor"},t),o.createElement("path",{d:"M18.031 16.6168L22.3137 20.8995L20.8995 22.3137L16.6168 18.031C15.0769 19.263 13.124 20 11 20C6.032 20 2 15.968 2 11C2 6.032 6.032 2 11 2C15.968 2 20 6.032 20 11C20 13.124 19.263 15.0769 18.031 16.6168ZM16.0247 15.8748C17.2475 14.6146 18 12.8956 18 11C18 7.1325 14.8675 4 11 4C7.1325 4 4 7.1325 4 11C4 14.8675 7.1325 18 11 18C12.8956 18 14.6146 17.2475 15.8748 16.0247L16.0247 15.8748Z"}))};var s=n(4537),u=n(28517),d=n(33044);let f=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",width:"100%",height:"100%",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},t),o.createElement("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),o.createElement("line",{x1:"6",y1:"6",x2:"18",y2:"18"}))};var p=n(97324),h=n(1153),m=n(96398);let g=(0,h.fn)("MultiSelect"),v=o.forwardRef((e,t)=>{let{defaultValue:n,value:h,onValueChange:v,placeholder:b="Select...",placeholderSearch:y="Search",disabled:x=!1,icon:w,children:S,className:k}=e,E=(0,r._T)(e,["defaultValue","value","onValueChange","placeholder","placeholderSearch","disabled","icon","children","className"]),[C,O]=(0,a.Z)(n,h),{reactElementChildren:j,optionsAvailable:P}=(0,o.useMemo)(()=>{let e=o.Children.toArray(S).filter(o.isValidElement);return{reactElementChildren:e,optionsAvailable:(0,m.n0)("",e)}},[S]),[I,N]=(0,o.useState)(""),M=(null!=C?C:[]).length>0,R=(0,o.useMemo)(()=>I?(0,m.n0)(I,j):P,[I,j,P]),_=()=>{N("")};return o.createElement(u.R,Object.assign({as:"div",ref:t,defaultValue:C,value:C,onChange:e=>{null==v||v(e),O(e)},disabled:x,className:(0,p.q)("w-full min-w-[10rem] relative text-tremor-default",k)},E,{multiple:!0}),e=>{let{value:t}=e;return o.createElement(o.Fragment,null,o.createElement(u.R.Button,{className:(0,p.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-tremor-default focus:ring-2 transition duration-100 border pr-8 py-1.5","border-tremor-border shadow-tremor-input focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",w?"pl-11 -ml-0.5":"pl-3",(0,m.um)(t.length>0,x))},w&&o.createElement("span",{className:(0,p.q)("absolute inset-y-0 left-0 flex items-center ml-px pl-2.5")},o.createElement(w,{className:(0,p.q)(g("Icon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement("div",{className:"h-6 flex items-center"},t.length>0?o.createElement("div",{className:"flex flex-nowrap overflow-x-scroll [&::-webkit-scrollbar]:hidden [scrollbar-width:none] gap-x-1 mr-5 -ml-1.5 relative"},P.filter(e=>t.includes(e.props.value)).map((e,n)=>{var r;return o.createElement("div",{key:n,className:(0,p.q)("max-w-[100px] lg:max-w-[200px] flex justify-center items-center pl-2 pr-1.5 py-1 font-medium","rounded-tremor-small","bg-tremor-background-muted dark:bg-dark-tremor-background-muted","bg-tremor-background-subtle dark:bg-dark-tremor-background-subtle","text-tremor-content-default dark:text-dark-tremor-content-default","text-tremor-content-emphasis dark:text-dark-tremor-content-emphasis")},o.createElement("div",{className:"text-xs truncate "},null!==(r=e.props.children)&&void 0!==r?r:e.props.value),o.createElement("div",{onClick:n=>{n.preventDefault();let r=t.filter(t=>t!==e.props.value);null==v||v(r),O(r)}},o.createElement(f,{className:(0,p.q)(g("clearIconItem"),"cursor-pointer rounded-tremor-full w-3.5 h-3.5 ml-2","text-tremor-content-subtle hover:text-tremor-content","dark:text-dark-tremor-content-subtle dark:hover:text-tremor-content")})))})):o.createElement("span",null,b)),o.createElement("span",{className:(0,p.q)("absolute inset-y-0 right-0 flex items-center mr-2.5")},o.createElement(l.Z,{className:(0,p.q)(g("arrowDownIcon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}))),M&&!x?o.createElement("button",{type:"button",className:(0,p.q)("absolute inset-y-0 right-0 flex items-center mr-8"),onClick:e=>{e.preventDefault(),O([]),null==v||v([])}},o.createElement(s.Z,{className:(0,p.q)(g("clearIconAllItems"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null,o.createElement(d.u,{className:"absolute z-10 w-full",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},o.createElement(u.R.Options,{className:(0,p.q)("divide-y overflow-y-auto outline-none rounded-tremor-default max-h-[228px] left-0 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},o.createElement("div",{className:(0,p.q)("flex items-center w-full px-2.5","bg-tremor-background-muted","dark:bg-dark-tremor-background-muted")},o.createElement("span",null,o.createElement(c,{className:(0,p.q)("flex-none w-4 h-4 mr-2","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement("input",{name:"search",type:"input",autoComplete:"off",placeholder:y,className:(0,p.q)("w-full focus:outline-none focus:ring-none bg-transparent text-tremor-default py-2","text-tremor-content-emphasis","dark:text-dark-tremor-content-emphasis"),onKeyDown:e=>{"Space"===e.code&&""!==e.target.value&&e.stopPropagation()},onChange:e=>N(e.target.value),value:I})),o.createElement(i.Z.Provider,Object.assign({},{onBlur:{handleResetSearch:_}},{value:{selectedValue:t}}),R))))})});v.displayName="MultiSelect"},46030:function(e,t,n){"use strict";n.d(t,{Z:function(){return u}});var r=n(5853);n(42698),n(64016),n(8710);var o=n(33232),i=n(2265),a=n(97324),l=n(1153),c=n(28517);let s=(0,l.fn)("MultiSelectItem"),u=i.forwardRef((e,t)=>{let{value:n,className:u,children:d}=e,f=(0,r._T)(e,["value","className","children"]),{selectedValue:p}=(0,i.useContext)(o.Z),h=(0,l.NZ)(n,p);return i.createElement(c.R.Option,Object.assign({className:(0,a.q)(s("root"),"flex justify-start items-center cursor-default text-tremor-default p-2.5","ui-active:bg-tremor-background-muted ui-active:text-tremor-content-strong ui-selected:text-tremor-content-strong text-tremor-content-emphasis","dark:ui-active:bg-dark-tremor-background-muted dark:ui-active:text-dark-tremor-content-strong dark:ui-selected:text-dark-tremor-content-strong dark:ui-selected:bg-dark-tremor-background-muted dark:text-dark-tremor-content-emphasis",u),ref:t,key:n,value:n},f),i.createElement("input",{type:"checkbox",className:(0,a.q)(s("checkbox"),"flex-none focus:ring-none focus:outline-none cursor-pointer mr-2.5","accent-tremor-brand","dark:accent-dark-tremor-brand"),checked:h,readOnly:!0}),i.createElement("span",{className:"whitespace-nowrap truncate"},null!=d?d:n))});u.displayName="MultiSelectItem"},30150:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var r=n(5853),o=n(2265);let i=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2.5"}),o.createElement("path",{d:"M12 4v16m8-8H4"}))},a=e=>{var t=(0,r._T)(e,[]);return o.createElement("svg",Object.assign({},t,{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2.5"}),o.createElement("path",{d:"M20 12H4"}))};var l=n(97324),c=n(1153),s=n(69262);let u="flex mx-auto text-tremor-content-subtle dark:text-dark-tremor-content-subtle",d="cursor-pointer hover:text-tremor-content dark:hover:text-dark-tremor-content",f=o.forwardRef((e,t)=>{let{onSubmit:n,enableStepper:f=!0,disabled:p,onValueChange:h,onChange:m}=e,g=(0,r._T)(e,["onSubmit","enableStepper","disabled","onValueChange","onChange"]),v=(0,o.useRef)(null),[b,y]=o.useState(!1),x=o.useCallback(()=>{y(!0)},[]),w=o.useCallback(()=>{y(!1)},[]),[S,k]=o.useState(!1),E=o.useCallback(()=>{k(!0)},[]),C=o.useCallback(()=>{k(!1)},[]);return o.createElement(s.Z,Object.assign({type:"number",ref:(0,c.lq)([v,t]),disabled:p,makeInputClassName:(0,c.fn)("NumberInput"),onKeyDown:e=>{var t;if("Enter"===e.key&&!e.ctrlKey&&!e.altKey&&!e.shiftKey){let e=null===(t=v.current)||void 0===t?void 0:t.value;null==n||n(parseFloat(null!=e?e:""))}"ArrowDown"===e.key&&x(),"ArrowUp"===e.key&&E()},onKeyUp:e=>{"ArrowDown"===e.key&&w(),"ArrowUp"===e.key&&C()},onChange:e=>{p||(null==h||h(parseFloat(e.target.value)),null==m||m(e))},stepper:f?o.createElement("div",{className:(0,l.q)("flex justify-center align-middle")},o.createElement("div",{tabIndex:-1,onClick:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),onTouchStart:e=>{e.cancelable&&e.preventDefault()},onMouseUp:()=>{var e,t;p||(null===(e=v.current)||void 0===e||e.stepDown(),null===(t=v.current)||void 0===t||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,l.q)(!p&&d,u,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},o.createElement(a,{"data-testid":"step-down",className:(b?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"})),o.createElement("div",{tabIndex:-1,onClick:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),onTouchStart:e=>{e.cancelable&&e.preventDefault()},onMouseUp:()=>{var e,t;p||(null===(e=v.current)||void 0===e||e.stepUp(),null===(t=v.current)||void 0===t||t.dispatchEvent(new Event("input",{bubbles:!0})))},className:(0,l.q)(!p&&d,u,"group py-[10px] px-2.5 border-l border-tremor-border dark:border-dark-tremor-border")},o.createElement(i,{"data-testid":"step-up",className:(S?"scale-95":"")+" h-4 w-4 duration-75 transition group-active:scale-95"}))):null},g))});f.displayName="NumberInput"},27281:function(e,t,n){"use strict";n.d(t,{Z:function(){return h}});var r=n(5853),o=n(2265),i=n(58747),a=n(4537),l=n(97324),c=n(1153),s=n(96398),u=n(28517),d=n(33044),f=n(44140);let p=(0,c.fn)("Select"),h=o.forwardRef((e,t)=>{let{defaultValue:n,value:c,onValueChange:h,placeholder:m="Select...",disabled:g=!1,icon:v,enableClear:b=!0,children:y,className:x}=e,w=(0,r._T)(e,["defaultValue","value","onValueChange","placeholder","disabled","icon","enableClear","children","className"]),[S,k]=(0,f.Z)(n,c),E=(0,o.useMemo)(()=>{let e=o.Children.toArray(y).filter(o.isValidElement);return(0,s.sl)(e)},[y]);return o.createElement(u.R,Object.assign({as:"div",ref:t,defaultValue:S,value:S,onChange:e=>{null==h||h(e),k(e)},disabled:g,className:(0,l.q)("w-full min-w-[10rem] relative text-tremor-default",x)},w),e=>{var t;let{value:n}=e;return o.createElement(o.Fragment,null,o.createElement(u.R.Button,{className:(0,l.q)("w-full outline-none text-left whitespace-nowrap truncate rounded-tremor-default focus:ring-2 transition duration-100 border pr-8 py-2","border-tremor-border shadow-tremor-input focus:border-tremor-brand-subtle focus:ring-tremor-brand-muted","dark:border-dark-tremor-border dark:shadow-dark-tremor-input dark:focus:border-dark-tremor-brand-subtle dark:focus:ring-dark-tremor-brand-muted",v?"pl-10":"pl-3",(0,s.um)((0,s.Uh)(n),g))},v&&o.createElement("span",{className:(0,l.q)("absolute inset-y-0 left-0 flex items-center ml-px pl-2.5")},o.createElement(v,{className:(0,l.q)(p("Icon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})),o.createElement("span",{className:"w-[90%] block truncate"},n&&null!==(t=E.get(n))&&void 0!==t?t:m),o.createElement("span",{className:(0,l.q)("absolute inset-y-0 right-0 flex items-center mr-3")},o.createElement(i.Z,{className:(0,l.q)(p("arrowDownIcon"),"flex-none h-5 w-5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}))),b&&S?o.createElement("button",{type:"button",className:(0,l.q)("absolute inset-y-0 right-0 flex items-center mr-8"),onClick:e=>{e.preventDefault(),k(""),null==h||h("")}},o.createElement(a.Z,{className:(0,l.q)(p("clearIcon"),"flex-none h-4 w-4","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")})):null,o.createElement(d.u,{className:"absolute z-10 w-full",enter:"transition ease duration-100 transform",enterFrom:"opacity-0 -translate-y-4",enterTo:"opacity-100 translate-y-0",leave:"transition ease duration-100 transform",leaveFrom:"opacity-100 translate-y-0",leaveTo:"opacity-0 -translate-y-4"},o.createElement(u.R.Options,{className:(0,l.q)("divide-y overflow-y-auto outline-none rounded-tremor-default max-h-[228px] left-0 border my-1","bg-tremor-background border-tremor-border divide-tremor-border shadow-tremor-dropdown","dark:bg-dark-tremor-background dark:border-dark-tremor-border dark:divide-dark-tremor-border dark:shadow-dark-tremor-dropdown")},y)))})});h.displayName="Select"},57365:function(e,t,n){"use strict";n.d(t,{Z:function(){return c}});var r=n(5853),o=n(2265),i=n(28517),a=n(97324);let l=(0,n(1153).fn)("SelectItem"),c=o.forwardRef((e,t)=>{let{value:n,icon:c,className:s,children:u}=e,d=(0,r._T)(e,["value","icon","className","children"]);return o.createElement(i.R.Option,Object.assign({className:(0,a.q)(l("root"),"flex justify-start items-center cursor-default text-tremor-default px-2.5 py-2.5","ui-active:bg-tremor-background-muted ui-active:text-tremor-content-strong ui-selected:text-tremor-content-strong ui-selected:bg-tremor-background-muted text-tremor-content-emphasis","dark:ui-active:bg-dark-tremor-background-muted dark:ui-active:text-dark-tremor-content-strong dark:ui-selected:text-dark-tremor-content-strong dark:ui-selected:bg-dark-tremor-background-muted dark:text-dark-tremor-content-emphasis",s),ref:t,key:n,value:n},d),c&&o.createElement(c,{className:(0,a.q)(l("icon"),"flex-none w-5 h-5 mr-1.5","text-tremor-content-subtle","dark:text-dark-tremor-content-subtle")}),o.createElement("span",{className:"whitespace-nowrap truncate"},null!=u?u:n))});c.displayName="SelectItem"},92858:function(e,t,n){"use strict";n.d(t,{Z:function(){return N}});var r=n(5853),o=n(2265),i=n(62963),a=n(90945),l=n(13323),c=n(17684),s=n(80004),u=n(93689),d=n(38198),f=n(47634),p=n(56314),h=n(27847),m=n(64518);let g=(0,o.createContext)(null),v=Object.assign((0,h.yV)(function(e,t){let n=(0,c.M)(),{id:r="headlessui-description-".concat(n),...i}=e,a=function e(){let t=(0,o.useContext)(g);if(null===t){let t=Error("You used a component, but it is not inside a relevant parent.");throw Error.captureStackTrace&&Error.captureStackTrace(t,e),t}return t}(),l=(0,u.T)(t);(0,m.e)(()=>a.register(r),[r,a.register]);let s={ref:l,...a.props,id:r};return(0,h.sY)({ourProps:s,theirProps:i,slot:a.slot||{},defaultTag:"p",name:a.name||"Description"})}),{});var b=n(37388);let y=(0,o.createContext)(null),x=Object.assign((0,h.yV)(function(e,t){let n=(0,c.M)(),{id:r="headlessui-label-".concat(n),passive:i=!1,...a}=e,l=function e(){let t=(0,o.useContext)(y);if(null===t){let t=Error("You used a