,spaceWidth:p}=d;u=h,c=p}else return rE(n);return iV({breakAll:a,children:n,maxLines:s,style:i},u,c,t,!!r)}return rE(n)},_N="#808080",oV={angle:0,breakAll:!1,capHeight:"0.71em",fill:_N,lineHeight:"1em",scaleToFit:!1,textAnchor:"start",verticalAnchor:"end",x:0,y:0},J0=x.forwardRef((e,t)=>{var r=or(e,oV),{x:n,y:i,lineHeight:a,capHeight:s,fill:u,scaleToFit:c,textAnchor:d,verticalAnchor:h}=r,p=eE(r,Z9),m=x.useMemo(()=>aV({breakAll:p.breakAll,children:p.children,maxLines:p.maxLines,scaleToFit:c,style:p.style,width:p.width}),[p.breakAll,p.children,p.maxLines,c,p.style,p.width]),{dx:g,dy:b,angle:w,className:S,breakAll:k}=p,A=eE(p,eV);if(!In(n)||!In(i)||m.length===0)return null;var P=Number(n)+(ce(g)?g:0),C=Number(i)+(ce(b)?b:0);if(!je(P)||!je(C))return null;var N;switch(h){case"start":N=Hm("calc(".concat(s,")"));break;case"middle":N=Hm("calc(".concat((m.length-1)/2," * -").concat(a," + (").concat(s," / 2))"));break;default:N=Hm("calc(".concat(m.length-1," * -").concat(a,")"));break}var j=[],M=m[0];if(c&&M!=null){var F=M.width,{width:W}=p;j.push("scale(".concat(ce(W)&&ce(F)?W/F:1,")"))}return w&&j.push("rotate(".concat(w,", ").concat(P,", ").concat(C,")")),j.length&&(A.transform=j.join(" ")),x.createElement("text",cy({},nr(A),{ref:t,x:P,y:C,className:Fe("recharts-text",S),textAnchor:d,fill:u.includes("url")?_N:u}),m.map((H,Y)=>{var B=H.words.join(k?"":" ");return x.createElement("tspan",{x:P,dy:Y===0?N:a,key:"".concat(B,"-").concat(Y)},B)}))});J0.displayName="Text";function nE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function _n(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?nE(Object(r),!0).forEach(function(n){sV(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):nE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function sV(e,t,r){return(t=lV(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function lV(e){var t=uV(e,"string");return typeof t=="symbol"?t:t+""}function uV(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var cV=e=>{var{viewBox:t,position:r,offset:n=0,parentViewBox:i}=e,{x:a,y:s,height:u,upperWidth:c,lowerWidth:d}=Yy(t),h=a,p=a+(c-d)/2,m=(h+p)/2,g=(c+d)/2,b=h+c/2,w=u>=0?1:-1,S=w*n,k=w>0?"end":"start",A=w>0?"start":"end",P=c>=0?1:-1,C=P*n,N=P>0?"end":"start",j=P>0?"start":"end",M=i;if(r==="top"){var F={x:h+c/2,y:s-S,horizontalAnchor:"middle",verticalAnchor:k};return M&&(F.height=Math.max(s-M.y,0),F.width=c),F}if(r==="bottom"){var W={x:p+d/2,y:s+u+S,horizontalAnchor:"middle",verticalAnchor:A};return M&&(W.height=Math.max(M.y+M.height-(s+u),0),W.width=d),W}if(r==="left"){var H={x:m-C,y:s+u/2,horizontalAnchor:N,verticalAnchor:"middle"};return M&&(H.width=Math.max(H.x-M.x,0),H.height=u),H}if(r==="right"){var Y={x:m+g+C,y:s+u/2,horizontalAnchor:j,verticalAnchor:"middle"};return M&&(Y.width=Math.max(M.x+M.width-Y.x,0),Y.height=u),Y}var B=M?{width:g,height:u}:{};return r==="insideLeft"?_n({x:m+C,y:s+u/2,horizontalAnchor:j,verticalAnchor:"middle"},B):r==="insideRight"?_n({x:m+g-C,y:s+u/2,horizontalAnchor:N,verticalAnchor:"middle"},B):r==="insideTop"?_n({x:h+c/2,y:s+S,horizontalAnchor:"middle",verticalAnchor:A},B):r==="insideBottom"?_n({x:p+d/2,y:s+u-S,horizontalAnchor:"middle",verticalAnchor:k},B):r==="insideTopLeft"?_n({x:h+C,y:s+S,horizontalAnchor:j,verticalAnchor:A},B):r==="insideTopRight"?_n({x:h+c-C,y:s+S,horizontalAnchor:N,verticalAnchor:A},B):r==="insideBottomLeft"?_n({x:p+C,y:s+u-S,horizontalAnchor:j,verticalAnchor:k},B):r==="insideBottomRight"?_n({x:p+d-C,y:s+u-S,horizontalAnchor:N,verticalAnchor:k},B):r&&typeof r=="object"&&(ce(r.x)||Da(r.x))&&(ce(r.y)||Da(r.y))?_n({x:a+cn(r.x,g),y:s+cn(r.y,u),horizontalAnchor:"end",verticalAnchor:"end"},B):_n({x:b,y:s+u/2,horizontalAnchor:"middle",verticalAnchor:"middle"},B)},dV=["labelRef"],fV=["content"];function iE(e,t){if(e==null)return{};var r,n,i=hV(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function hV(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}function aE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ol(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?aE(Object(r),!0).forEach(function(n){pV(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):aE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function pV(e,t,r){return(t=vV(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function vV(e){var t=mV(e,"string");return typeof t=="symbol"?t:t+""}function mV(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function Xn(){return Xn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Xn.apply(null,arguments)}var SN=x.createContext(null),gV=e=>{var{x:t,y:r,upperWidth:n,lowerWidth:i,width:a,height:s,children:u}=e,c=x.useMemo(()=>({x:t,y:r,upperWidth:n,lowerWidth:i,width:a,height:s}),[t,r,n,i,a,s]);return x.createElement(SN.Provider,{value:c},u)},kN=()=>{var e=x.useContext(SN),t=Kf();return e||(t?Yy(t):void 0)},yV=x.createContext(null),wV=()=>{var e=x.useContext(yV),t=ve(pj);return e||t},bV=e=>{var{value:t,formatter:r}=e,n=tt(e.children)?t:e.children;return typeof r=="function"?r(n):n},Q0=e=>e!=null&&typeof e=="function",xV=(e,t)=>{var r=vr(t-e),n=Math.min(Math.abs(t-e),360);return r*n},_V=(e,t,r,n,i)=>{var{offset:a,className:s}=e,{cx:u,cy:c,innerRadius:d,outerRadius:h,startAngle:p,endAngle:m,clockWise:g}=i,b=(d+h)/2,w=xV(p,m),S=w>=0?1:-1,k,A;switch(t){case"insideStart":k=p+S*a,A=g;break;case"insideEnd":k=m-S*a,A=!g;break;case"end":k=m+S*a,A=g;break;default:throw new Error("Unsupported position ".concat(t))}A=w<=0?A:!A;var P=Bt(u,c,b,k),C=Bt(u,c,b,k+(A?1:-1)*359),N="M".concat(P.x,",").concat(P.y,`
    A`).concat(b,",").concat(b,",0,1,").concat(A?0:1,`,
    `).concat(C.x,",").concat(C.y),j=tt(e.id)?Wl("recharts-radial-line-"):e.id;return x.createElement("text",Xn({},n,{dominantBaseline:"central",className:Fe("recharts-radial-bar-label",s)}),x.createElement("defs",null,x.createElement("path",{id:j,d:N})),x.createElement("textPath",{xlinkHref:"#".concat(j)},r))},SV=(e,t,r)=>{var{cx:n,cy:i,innerRadius:a,outerRadius:s,startAngle:u,endAngle:c}=e,d=(u+c)/2;if(r==="outside"){var{x:h,y:p}=Bt(n,i,s+t,d);return{x:h,y:p,textAnchor:h>=n?"start":"end",verticalAnchor:"middle"}}if(r==="center")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"middle"};if(r==="centerTop")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"start"};if(r==="centerBottom")return{x:n,y:i,textAnchor:"middle",verticalAnchor:"end"};var m=(a+s)/2,{x:g,y:b}=Bt(n,i,m,d);return{x:g,y:b,textAnchor:"middle",verticalAnchor:"middle"}},dd=e=>e!=null&&"cx"in e&&ce(e.cx),kV={angle:0,offset:5,zIndex:jt.label,position:"middle",textBreakAll:!1};function PV(e){if(!dd(e))return e;var{cx:t,cy:r,outerRadius:n}=e,i=n*2;return{x:t-n,y:r-n,width:i,upperWidth:i,lowerWidth:i,height:i}}function zi(e){var t=or(e,kV),{viewBox:r,parentViewBox:n,position:i,value:a,children:s,content:u,className:c="",textBreakAll:d,labelRef:h}=t,p=wV(),m=kN(),g=i==="center"?m:p??m,b,w,S;r==null?b=g:dd(r)?b=r:b=Yy(r);var k=PV(b);if(!b||tt(a)&&tt(s)&&!x.isValidElement(u)&&typeof u!="function")return null;var A=Ol(Ol({},t),{},{viewBox:b});if(x.isValidElement(u)){var{labelRef:P}=A,C=iE(A,dV);return x.cloneElement(u,C)}if(typeof u=="function"){var{content:N}=A,j=iE(A,fV);if(w=x.createElement(u,j),x.isValidElement(w))return w}else w=bV(t);var M=nr(t);if(dd(b)){if(i==="insideStart"||i==="insideEnd"||i==="end")return _V(t,i,w,M,b);S=SV(b,t.offset,t.position)}else{if(!k)return null;var F=cV({viewBox:k,position:i,offset:t.offset,parentViewBox:dd(n)?void 0:n});S=Ol(Ol({x:F.x,y:F.y,textAnchor:F.horizontalAnchor,verticalAnchor:F.verticalAnchor},F.width!==void 0?{width:F.width}:{}),F.height!==void 0?{height:F.height}:{})}return x.createElement(Hr,{zIndex:t.zIndex},x.createElement(J0,Xn({ref:h,className:Fe("recharts-label",c)},M,S,{textAnchor:wN(M.textAnchor)?M.textAnchor:S.textAnchor,breakAll:d}),w))}zi.displayName="Label";var EV=(e,t,r)=>{if(!e)return null;var n={viewBox:t,labelRef:r};return e===!0?x.createElement(zi,Xn({key:"label-implicit"},n)):In(e)?x.createElement(zi,Xn({key:"label-implicit",value:e},n)):x.isValidElement(e)?e.type===zi?x.cloneElement(e,Ol({key:"label-implicit"},n)):x.createElement(zi,Xn({key:"label-implicit",content:e},n)):Q0(e)?x.createElement(zi,Xn({key:"label-implicit",content:e},n)):e&&typeof e=="object"?x.createElement(zi,Xn({},e,{key:"label-implicit"},n)):null};function OV(e){var{label:t,labelRef:r}=e,n=kN();return EV(t,n,r)||null}var AV=["valueAccessor"],CV=["dataKey","clockWise","id","textBreakAll","zIndex"];function uf(){return uf=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},uf.apply(null,arguments)}function oE(e,t){if(e==null)return{};var r,n,i=jV(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function jV(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}var TV=e=>{var t=Array.isArray(e.value)?e.value[e.value.length-1]:e.value;if(rV(t))return t},PN=x.createContext(void 0),EN=PN.Provider,ON=x.createContext(void 0);ON.Provider;function NV(){return x.useContext(PN)}function IV(){return x.useContext(ON)}function fd(e){var{valueAccessor:t=TV}=e,r=oE(e,AV),{dataKey:n,clockWise:i,id:a,textBreakAll:s,zIndex:u}=r,c=oE(r,CV),d=NV(),h=IV(),p=d||h;return!p||!p.length?null:x.createElement(Hr,{zIndex:u??jt.label},x.createElement(Or,{className:"recharts-label-list"},p.map((m,g)=>{var b,w=tt(n)?t(m,g):ht(m.payload,n),S=tt(a)?{}:{id:"".concat(a,"-").concat(g)};return x.createElement(zi,uf({key:"label-".concat(g)},nr(m),c,S,{fill:(b=r.fill)!==null&&b!==void 0?b:m.fill,parentViewBox:m.parentViewBox,value:w,textBreakAll:s,viewBox:m.viewBox,index:g,zIndex:0}))})))}fd.displayName="LabelList";function AN(e){var{label:t}=e;return t?t===!0?x.createElement(fd,{key:"labelList-implicit"}):x.isValidElement(t)||Q0(t)?x.createElement(fd,{key:"labelList-implicit",content:t}):typeof t=="object"?x.createElement(fd,uf({key:"labelList-implicit"},t,{type:String(t.type)})):null:null}function dy(){return dy=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},dy.apply(null,arguments)}var CN=e=>{var{cx:t,cy:r,r:n,className:i}=e,a=Fe("recharts-dot",i);return ce(t)&&ce(r)&&ce(n)?x.createElement("circle",dy({},un(e),$y(e),{className:a,cx:t,cy:r,r:n})):null},RV={radiusAxis:{},angleAxis:{}},jN=Xt({name:"polarAxis",initialState:RV,reducers:{addRadiusAxis(e,t){e.radiusAxis[t.payload.id]=t.payload},removeRadiusAxis(e,t){delete e.radiusAxis[t.payload.id]},addAngleAxis(e,t){e.angleAxis[t.payload.id]=t.payload},removeAngleAxis(e,t){delete e.angleAxis[t.payload.id]}}}),{addRadiusAxis:Eee,removeRadiusAxis:Oee,addAngleAxis:Aee,removeAngleAxis:Cee}=jN.actions,DV=jN.reducer;function MV(e){return e&&typeof e=="object"&&"className"in e&&typeof e.className=="string"?e.className:""}var Km={exports:{}},Ue={};/**
 * @license React
 * react-is.production.js
 *
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */var sE;function $V(){if(sE)return Ue;sE=1;var e=Symbol.for("react.transitional.element"),t=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),a=Symbol.for("react.consumer"),s=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),d=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),m=Symbol.for("react.view_transition"),g=Symbol.for("react.client.reference");function b(w){if(typeof w=="object"&&w!==null){var S=w.$$typeof;switch(S){case e:switch(w=w.type,w){case r:case i:case n:case c:case d:case m:return w;default:switch(w=w&&w.$$typeof,w){case s:case u:case p:case h:return w;case a:return w;default:return S}}case t:return S}}}return Ue.ContextConsumer=a,Ue.ContextProvider=s,Ue.Element=e,Ue.ForwardRef=u,Ue.Fragment=r,Ue.Lazy=p,Ue.Memo=h,Ue.Portal=t,Ue.Profiler=i,Ue.StrictMode=n,Ue.Suspense=c,Ue.SuspenseList=d,Ue.isContextConsumer=function(w){return b(w)===a},Ue.isContextProvider=function(w){return b(w)===s},Ue.isElement=function(w){return typeof w=="object"&&w!==null&&w.$$typeof===e},Ue.isForwardRef=function(w){return b(w)===u},Ue.isFragment=function(w){return b(w)===r},Ue.isLazy=function(w){return b(w)===p},Ue.isMemo=function(w){return b(w)===h},Ue.isPortal=function(w){return b(w)===t},Ue.isProfiler=function(w){return b(w)===i},Ue.isStrictMode=function(w){return b(w)===n},Ue.isSuspense=function(w){return b(w)===c},Ue.isSuspenseList=function(w){return b(w)===d},Ue.isValidElementType=function(w){return typeof w=="string"||typeof w=="function"||w===r||w===i||w===n||w===c||w===d||typeof w=="object"&&w!==null&&(w.$$typeof===p||w.$$typeof===h||w.$$typeof===s||w.$$typeof===a||w.$$typeof===u||w.$$typeof===g||w.getModuleId!==void 0)},Ue.typeOf=b,Ue}var lE;function LV(){return lE||(lE=1,Km.exports=$V()),Km.exports}var zV=LV(),uE=e=>typeof e=="string"?e:e?e.displayName||e.name||"Component":"",cE=null,Vm=null,TN=e=>{if(e===cE&&Array.isArray(Vm))return Vm;var t=[];return x.Children.forEach(e,r=>{tt(r)||(zV.isFragment(r)?t=t.concat(TN(r.props.children)):t.push(r))}),Vm=t,cE=e,t};function UV(e,t){var r=[],n=[];return Array.isArray(t)?n=t.map(i=>uE(i)):n=[uE(t)],TN(e).forEach(i=>{var a=ts(i,"type.displayName")||ts(i,"type.name");a&&n.indexOf(a)!==-1&&r.push(i)}),r}var NN=e=>e&&typeof e=="object"&&"clipDot"in e?!!e.clipDot:!0,Gm={},dE;function BV(){if(dE)return Gm;dE=1;function e(t){var n;if(typeof t!="object"||t==null)return!1;if(Object.getPrototypeOf(t)===null)return!0;if(Object.prototype.toString.call(t)!=="[object Object]"){const i=t[Symbol.toStringTag];return i==null||!((n=Object.getOwnPropertyDescriptor(t,Symbol.toStringTag))!=null&&n.writable)?!1:t.toString()===`[object ${i}]`}let r=t;for(;Object.getPrototypeOf(r)!==null;)r=Object.getPrototypeOf(r);return Object.getPrototypeOf(t)===r}return Gm.isPlainObject=e,Gm}var Ym,fE;function FV(){return fE||(fE=1,Ym=BV().isPlainObject),Ym}var WV=FV();const qV=ai(WV);var hE,pE,vE,mE,gE;function yE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function wE(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?yE(Object(r),!0).forEach(function(n){HV(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):yE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function HV(e,t,r){return(t=KV(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function KV(e){var t=VV(e,"string");return typeof t=="symbol"?t:t+""}function VV(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function cf(){return cf=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},cf.apply(null,arguments)}function wl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var bE=(e,t,r,n,i)=>{var a=r-n,s;return s=ut(hE||(hE=wl(["M ",",",""])),e,t),s+=ut(pE||(pE=wl(["L ",",",""])),e+r,t),s+=ut(vE||(vE=wl(["L ",",",""])),e+r-a/2,t+i),s+=ut(mE||(mE=wl(["L ",",",""])),e+r-a/2-n,t+i),s+=ut(gE||(gE=wl(["L ",","," Z"])),e,t),s},GV={x:0,y:0,upperWidth:0,lowerWidth:0,height:0,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},YV=e=>{var t=or(e,GV),{x:r,y:n,upperWidth:i,lowerWidth:a,height:s,className:u}=t,{animationEasing:c,animationDuration:d,animationBegin:h,isUpdateAnimationActive:p}=t,m=x.useRef(null),[g,b]=x.useState(-1),w=x.useRef(i),S=x.useRef(a),k=x.useRef(s),A=x.useRef(r),P=x.useRef(n),C=Jf(e,"trapezoid-");if(x.useEffect(()=>{if(m.current&&m.current.getTotalLength)try{var ie=m.current.getTotalLength();ie&&b(ie)}catch{}},[]),r!==+r||n!==+n||i!==+i||a!==+a||s!==+s||i===0&&a===0||s===0)return null;var N=Fe("recharts-trapezoid",u);if(!p)return x.createElement("g",null,x.createElement("path",cf({},nr(t),{className:N,d:bE(r,n,i,a,s)})));var j=w.current,M=S.current,F=k.current,W=A.current,H=P.current,Y="0px ".concat(g===-1?1:g,"px"),B="".concat(g,"px ").concat(g,"px"),pe=UC(["strokeDasharray"],d,c);return x.createElement(Xf,{animationId:C,key:C,canBegin:g>0,duration:d,easing:c,isActive:p,begin:h},ie=>{var me=ct(j,i,ie),_e=ct(M,a,ie),he=ct(F,s,ie),K=ct(W,r,ie),Q=ct(H,n,ie);m.current&&(w.current=me,S.current=_e,k.current=he,A.current=K,P.current=Q);var X=ie>0?{transition:pe,strokeDasharray:B}:{strokeDasharray:Y};return x.createElement("path",cf({},nr(t),{className:N,d:bE(K,Q,me,_e,he),ref:m,style:wE(wE({},X),t.style)}))})},XV=["option","shapeType","activeClassName","inActiveClassName"];function JV(e,t){if(e==null)return{};var r,n,i=QV(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function QV(e,t){if(e==null)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(t.indexOf(n)!==-1)continue;r[n]=e[n]}return r}function xE(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function df(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?xE(Object(r),!0).forEach(function(n){ZV(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):xE(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function ZV(e,t,r){return(t=e7(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function e7(e){var t=t7(e,"string");return typeof t=="symbol"?t:t+""}function t7(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function r7(e,t){return df(df({},t),e)}function n7(e,t){return e==="symbols"}function _E(e){var{shapeType:t,elementProps:r}=e;switch(t){case"rectangle":return x.createElement(qC,r);case"trapezoid":return x.createElement(YV,r);case"sector":return x.createElement(VC,r);case"symbols":if(n7(t))return x.createElement(OA,r);break;case"curve":return x.createElement(zC,r);default:return null}}function i7(e){return x.isValidElement(e)?e.props:e}function IN(e){var{option:t,shapeType:r,activeClassName:n="recharts-active-shape",inActiveClassName:i="recharts-shape"}=e,a=JV(e,XV),s;if(x.isValidElement(t))s=x.cloneElement(t,df(df({},a),i7(t)));else if(typeof t=="function")s=t(a,a.index);else if(qV(t)&&typeof t!="boolean"){var u=r7(t,a);s=x.createElement(_E,{shapeType:r,elementProps:u})}else{var c=a;s=x.createElement(_E,{shapeType:r,elementProps:c})}return a.isActive?x.createElement(Or,{className:n},s):x.createElement(Or,{className:i},s)}var RN=(e,t,r)=>{var n=at();return(i,a)=>s=>{e==null||e(i,a,s),n(zT({activeIndex:String(a),activeDataKey:t,activeCoordinate:i.tooltipPosition,activeGraphicalItemId:r}))}},DN=e=>{var t=at();return(r,n)=>i=>{e==null||e(r,n,i),t(xH())}},MN=(e,t,r)=>{var n=at();return(i,a)=>s=>{e==null||e(i,a,s),n(_H({activeIndex:String(a),activeDataKey:t,activeCoordinate:i.tooltipPosition,activeGraphicalItemId:r}))}};function $N(e){var{tooltipEntrySettings:t}=e,r=at(),n=Jt(),i=x.useRef(null);return x.useLayoutEffect(()=>{n||(i.current===null?r(gH(t)):i.current!==t&&r(yH({prev:i.current,next:t})),i.current=t)},[t,r,n]),x.useLayoutEffect(()=>()=>{i.current&&(r(wH(i.current)),i.current=null)},[r]),null}function LN(e){var{legendPayload:t}=e,r=at(),n=Jt(),i=x.useRef(null);return x.useLayoutEffect(()=>{n||(i.current===null?r(x5(t)):i.current!==t&&r(_5({prev:i.current,next:t})),i.current=t)},[r,n,t]),x.useLayoutEffect(()=>()=>{i.current&&(r(S5(i.current)),i.current=null)},[r]),null}var Xm,a7=()=>{var[e]=x.useState(()=>Wl("uid-"));return e},o7=(Xm=uO.useId)!==null&&Xm!==void 0?Xm:a7;function s7(e,t){var r=o7();return t||(e?"".concat(e,"-").concat(r):r)}var l7=x.createContext(void 0),zN=e=>{var{id:t,type:r,children:n}=e,i=s7("recharts-".concat(r),t);return x.createElement(l7.Provider,{value:i},n(i))},u7={cartesianItems:[],polarItems:[]},UN=Xt({name:"graphicalItems",initialState:u7,reducers:{addCartesianGraphicalItem:{reducer(e,t){e.cartesianItems.push(t.payload)},pr