0,margin:0},j=V5(a,u),M=j.map((F,W)=>{if(!F||F.type==="none")return null;var H=F.formatter||s||K5,{value:Y,name:B}=F,pe=Y,ie=B;if(H){var me=H(Y,B,F,W,a);if(Array.isArray(me))[pe,ie]=me;else if(me!=null)pe=me;else return null}var _e=dl(dl({},jo.itemStyle),{},{color:F.color||jo.itemStyle.color},n);return x.createElement("li",{className:"recharts-tooltip-item",key:"tooltip-item-".concat(W),style:_e},In(ie)?x.createElement("span",{className:"recharts-tooltip-item-name"},ie):null,In(ie)?x.createElement("span",{className:"recharts-tooltip-item-separator"},t):null,x.createElement("span",{className:"recharts-tooltip-item-value"},pe),x.createElement("span",{className:"recharts-tooltip-item-unit"},F.unit||""))});return x.createElement("ul",{className:"recharts-tooltip-item-list",style:N},M)}return null},b=dl(dl({},jo.contentStyle),r),w=dl({margin:0},i),S=!tt(h),k=S?h:"",A=Fe("recharts-default-tooltip",c),P=Fe("recharts-tooltip-label",d);S&&p&&a!==void 0&&a!==null&&(k=p(h,a));var C=m?{role:"status","aria-live":"assertive"}:{};return x.createElement("div",Gg({className:A,style:b},C),x.createElement("p",{className:P,style:w},x.isValidElement(k)?k:"".concat(k)),g())},fl="recharts-tooltip-wrapper",Y5={visibility:"hidden"};function X5(e){var{coordinate:t,translateX:r,translateY:n}=e;return Fe(fl,{["".concat(fl,"-right")]:ce(r)&&t&&ce(t.x)&&r>=t.x,["".concat(fl,"-left")]:ce(r)&&t&&ce(t.x)&&r<t.x,["".concat(fl,"-bottom")]:ce(n)&&t&&ce(t.y)&&n>=t.y,["".concat(fl,"-top")]:ce(n)&&t&&ce(t.y)&&n<t.y})}function KS(e){var{allowEscapeViewBox:t,coordinate:r,key:n,offset:i,position:a,reverseDirection:s,tooltipDimension:u,viewBox:c,viewBoxDimension:d}=e;if(a&&ce(a[n]))return a[n];var h=r[n]-u-(i>0?i:0),p=r[n]+i;if(t[n])return s[n]?h:p;var m=c[n];if(m==null)return 0;if(s[n]){var g=h,b=m;return g<b?Math.max(p,m):Math.max(h,m)}if(d==null)return 0;var w=p+u,S=m+d;return w>S?Math.max(h,m):Math.max(p,m)}function J5(e){var{translateX:t,translateY:r,useTranslate3d:n}=e;return{transform:n?"translate3d(".concat(t,"px, ").concat(r,"px, 0)"):"translate(".concat(t,"px, ").concat(r,"px)")}}function Q5(e){var{allowEscapeViewBox:t,coordinate:r,offsetTop:n,offsetLeft:i,position:a,reverseDirection:s,tooltipBox:u,useTranslate3d:c,viewBox:d}=e,h,p,m;return u.height>0&&u.width>0&&r?(p=KS({allowEscapeViewBox:t,coordinate:r,key:"x",offset:i,position:a,reverseDirection:s,tooltipDimension:u.width,viewBox:d,viewBoxDimension:d.width}),m=KS({allowEscapeViewBox:t,coordinate:r,key:"y",offset:n,position:a,reverseDirection:s,tooltipDimension:u.height,viewBox:d,viewBoxDimension:d.height}),h=J5({translateX:p,translateY:m,useTranslate3d:c})):h=Y5,{cssProperties:h,cssClasses:X5({translateX:p,translateY:m,coordinate:r})}}var Z5=()=>!(typeof window<"u"&&window.document&&window.document.createElement&&window.setTimeout),pu={isSsr:Z5()};function $C(){var[e,t]=x.useState(()=>pu.isSsr||!window.matchMedia?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return x.useEffect(()=>{if(window.matchMedia){var r=window.matchMedia("(prefers-reduced-motion: reduce)"),n=()=>{t(r.matches)};return r.addEventListener("change",n),()=>{r.removeEventListener("change",n)}}},[]),e}function VS(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 To(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?VS(Object(r),!0).forEach(function(n){eF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):VS(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function eF(e,t,r){return(t=tF(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function tF(e){var t=rF(e,"string");return typeof t=="symbol"?t:t+""}function rF(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 nF(e){if(!(e.prefersReducedMotion&&e.isAnimationActive==="auto")&&e.isAnimationActive&&e.active)return"transform ".concat(e.animationDuration,"ms ").concat(e.animationEasing)}function iF(e){var t,r,n,i,a,s,u=$C(),[c,d]=x.useState(()=>({dismissed:!1,dismissedAtCoordinate:{x:0,y:0}}));x.useEffect(()=>{var b=w=>{if(w.key==="Escape"){var S,k,A,P;d({dismissed:!0,dismissedAtCoordinate:{x:(S=(k=e.coordinate)===null||k===void 0?void 0:k.x)!==null&&S!==void 0?S:0,y:(A=(P=e.coordinate)===null||P===void 0?void 0:P.y)!==null&&A!==void 0?A:0}})}};return document.addEventListener("keydown",b),()=>{document.removeEventListener("keydown",b)}},[(t=e.coordinate)===null||t===void 0?void 0:t.x,(r=e.coordinate)===null||r===void 0?void 0:r.y]),c.dismissed&&(((n=(i=e.coordinate)===null||i===void 0?void 0:i.x)!==null&&n!==void 0?n:0)!==c.dismissedAtCoordinate.x||((a=(s=e.coordinate)===null||s===void 0?void 0:s.y)!==null&&a!==void 0?a:0)!==c.dismissedAtCoordinate.y)&&d(To(To({},c),{},{dismissed:!1}));var{cssClasses:h,cssProperties:p}=Q5({allowEscapeViewBox:e.allowEscapeViewBox,coordinate:e.coordinate,offsetLeft:typeof e.offset=="number"?e.offset:e.offset.x,offsetTop:typeof e.offset=="number"?e.offset:e.offset.y,position:e.position,reverseDirection:e.reverseDirection,tooltipBox:{height:e.lastBoundingBox.height,width:e.lastBoundingBox.width},useTranslate3d:e.useTranslate3d,viewBox:e.viewBox}),m=e.hasPortalFromProps?{}:To(To({transition:nF({prefersReducedMotion:u,isAnimationActive:e.isAnimationActive,active:e.active,animationDuration:e.animationDuration,animationEasing:e.animationEasing})},p),{},{pointerEvents:"none",position:"absolute",top:0,left:0}),g=To(To({},m),{},{visibility:!c.dismissed&&e.active&&e.hasPayload?"visible":"hidden"},e.wrapperStyle);return x.createElement("div",{xmlns:"http://www.w3.org/1999/xhtml",tabIndex:-1,className:h,style:g,ref:e.innerRef},e.children)}var aF=x.memo(iF),LC=()=>{var e;return(e=ve(t=>t.rootProps.accessibilityLayer))!==null&&e!==void 0?e:!0};function Yg(){return Yg=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},Yg.apply(null,arguments)}function GS(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 YS(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?GS(Object(r),!0).forEach(function(n){oF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):GS(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function oF(e,t,r){return(t=sF(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function sF(e){var t=lF(e,"string");return typeof t=="symbol"?t:t+""}function lF(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 XS={curveBasisClosed:D3,curveBasisOpen:M3,curveBasis:R3,curveBumpX:b3,curveBumpY:x3,curveLinearClosed:$3,curveLinear:Cf,curveMonotoneX:L3,curveMonotoneY:z3,curveNatural:U3,curveStep:B3,curveStepAfter:W3,curveStepBefore:F3},Bd=e=>je(e.x)&&je(e.y),JS=e=>e.base!=null&&Bd(e.base)&&Bd(e),hl=e=>e.x,pl=e=>e.y,uF=(e,t)=>{if(typeof e=="function")return e;var r="curve".concat(su(e));if((r==="curveMonotone"||r==="curveBump")&&t){var n=XS["".concat(r).concat(t==="vertical"?"Y":"X")];if(n)return n}return XS[r]||Cf},QS={connectNulls:!1,type:"linear"},cF=e=>{var{type:t=QS.type,points:r=[],baseLine:n,layout:i,connectNulls:a=QS.connectNulls}=e,s=uF(t,i),u=a?r.filter(Bd):r;if(Array.isArray(n)){var c,d=r.map((b,w)=>YS(YS({},b),{},{base:n[w]}));i==="vertical"?c=Wc().y(pl).x1(hl).x0(b=>b.base.x):c=Wc().x(hl).y1(pl).y0(b=>b.base.y);var h=c.defined(JS).curve(s),p=a?d.filter(JS):d;return h(p)}var m;i==="vertical"&&ce(n)?m=Wc().y(pl).x1(hl).x0(n):ce(n)?m=Wc().x(hl).y1(pl).y0(n):m=fA().x(hl).y(pl);var g=m.defined(Bd).curve(s);return g(u)},zC=e=>{var{className:t,points:r,path:n,pathRef:i}=e,a=Va();if((!r||!r.length)&&!n)return null;var s={type:e.type,points:e.points,baseLine:e.baseLine,layout:e.layout||a,connectNulls:e.connectNulls},u=r&&r.length?cF(s):n;return x.createElement("path",Yg({},un(e),$y(e),{className:Fe("recharts-curve",t),d:u===null?void 0:u,ref:i}))},dF=["x","y","top","left","width","height","className"];function Xg(){return Xg=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},Xg.apply(null,arguments)}function ZS(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 fF(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?ZS(Object(r),!0).forEach(function(n){hF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ZS(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function hF(e,t,r){return(t=pF(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function pF(e){var t=vF(e,"string");return typeof t=="symbol"?t:t+""}function vF(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 mF(e,t){if(e==null)return{};var r,n,i=gF(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 gF(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 yF=(e,t,r,n,i,a)=>"M".concat(e,",").concat(i,"v").concat(n,"M").concat(a,",").concat(t,"h").concat(r),wF=e=>{var{x:t=0,y:r=0,top:n=0,left:i=0,width:a=0,height:s=0,className:u}=e,c=mF(e,dF),d=fF({x:t,y:r,top:n,left:i,width:a,height:s},c);return!ce(t)||!ce(r)||!ce(a)||!ce(s)||!ce(n)||!ce(i)?null:x.createElement("path",Xg({},nr(d),{className:Fe("recharts-cross",u),d:yF(t,r,a,s,n,i)}))};function bF(e,t,r,n){var i=n/2;return{stroke:"none",fill:"#ccc",x:e==="horizontal"?t.x-i:r.left+.5,y:e==="horizontal"?r.top+.5:t.y-i,width:e==="horizontal"?n:r.width-1,height:e==="horizontal"?r.height-1:n}}function ek(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 tk(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?ek(Object(r),!0).forEach(function(n){xF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ek(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function xF(e,t,r){return(t=_F(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function _F(e){var t=SF(e,"string");return typeof t=="symbol"?t:t+""}function SF(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 kF=e=>e.replace(/([A-Z])/g,t=>"-".concat(t.toLowerCase())),UC=(e,t,r)=>e.map(n=>"".concat(kF(n)," ").concat(t,"ms ").concat(r)).join(","),PF=(e,t)=>[Object.keys(e),Object.keys(t)].reduce((r,n)=>r.filter(i=>n.includes(i))),Xl=(e,t)=>Object.keys(t).reduce((r,n)=>tk(tk({},r),{},{[n]:e(n,t[n])}),{});function rk(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 _t(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?rk(Object(r),!0).forEach(function(n){EF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):rk(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function EF(e,t,r){return(t=OF(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function OF(e){var t=AF(e,"string");return typeof t=="symbol"?t:t+""}function AF(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 Fd=(e,t,r)=>e+(t-e)*r,Jg=e=>{var{from:t,to:r}=e;return t!==r},BC=(e,t,r)=>{var n=Xl((i,a)=>{if(Jg(a)){var[s,u]=e(a.from,a.to,a.velocity);return _t(_t({},a),{},{from:s,velocity:u})}return a},t);return r<1?Xl((i,a)=>Jg(a)&&n[i]!=null?_t(_t({},a),{},{velocity:Fd(a.velocity,n[i].velocity,r),from:Fd(a.from,n[i].from,r)}):a,t):BC(e,n,r-1)};function CF(e,t,r,n,i,a){var s,u=n.reduce((m,g)=>_t(_t({},m),{},{[g]:{from:e[g],velocity:0,to:t[g]}}),{}),c=()=>Xl((m,g)=>g.from,u),d=()=>!Object.values(u).filter(Jg).length,h=null,p=m=>{s||(s=m);var g=m-s,b=g/r.dt;u=BC(r,u,b),i(_t(_t(_t({},e),t),c())),s=m,d()||(h=a.setTimeout(p))};return()=>(h=a.setTimeout(p),()=>{var m;(m=h)===null||m===void 0||m()})}function jF(e,t,r,n,i,a,s){var u=null,c=i.reduce((p,m)=>{var g=e[m],b=t[m];return g==null||b==null?p:_t(_t({},p),{},{[m]:[g,b]})},{}),d,h=p=>{d||(d=p);var m=(p-d)/n,g=Xl((w,S)=>Fd(...S,r(m)),c);if(a(_t(_t(_t({},e),t),g)),m<1)u=s.setTimeout(h);else{var b=Xl((w,S)=>Fd(...S,r(1)),c);a(_t(_t(_t({},e),t),b))}};return()=>(u=s.setTimeout(h),()=>{var p;(p=u)===null||p===void 0||p()})}const TF=(e,t,r,n,i,a)=>{var s=PF(e,t);return r==null?()=>(i(_t(_t({},e),t)),()=>{}):r.isStepper===!0?CF(e,t,r,s,i,a):jF(e,t,r,n,s,i,a)};var Wd=1e-4,FC=(e,t)=>[0,3*e,3*t-6*e,3*e-3*t+1],WC=(e,t)=>e.map((r,n)=>r*t**n).reduce((r,n)=>r+n),nk=(e,t)=>r=>{var n=FC(e,t);return WC(n,r)},NF=(e,t)=>r=>{var n=FC(e,t),i=[...n.map((a,s)=>a*s).slice(1),0];return WC(i,r)},IF=e=>{var t,r=e.split("(");if(r.length!==2||r[0]!=="cubic-bezier")return null;var n=(t=r[1])===null||t===void 0||(t=t.split(")")[0])===null||t===void 0?void 0:t.split(",");if(n==null||n.length!==4)return null;var i=n.map(a=>parseFloat(a));return[i[0],i[1],i[2],i[3]]},RF=function(){for(var t=arguments.length,r=new Array(t),n=0;n<t;n++)r[n]=arguments[n];if(r.length===1)switch(r[0]){case"linear":return[0,0,1,1];case"ease":return[.25,.1,.25,1];case"ease-in":return[.42,0,1,1];case"ease-out":return[.42,0,.58,1];case"ease-in-out":return[0,0,.58,1];default:{var i=IF(r[0]);if(i)return i}}return r.length===4?r:[0,0,1,1]},DF=(e,t,r,n)=>{var i=nk(e,r),a=nk(t,n),s=NF(e,r),u=d=>d>1?1:d<0?0:d,c=d=>{for(var h=d>1?1:d,p=h,m=0;m<8;++m){var g=i(p)-h,b=s(p);if(Math.abs(g-h)<Wd||b<Wd)return a(p);p=u(p-g/b)}return a(p)};return c.isStepper=!1,c},ik=function(){return DF(...RF(...arguments))},MF=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},{stiff:r=100,damping:n=8,dt:i=17}=t,a=(s,u,c)=>{var d=-(s-u)*r,h=c*n,p=c+(d-h)*i/1e3,m=c*i/1e3+s;return Math.abs(m-u)<Wd&&Math.abs(p)<Wd?[u,0]:[m,p]};return a.isStepper=!0,a.dt=i,a},$F=e=>{if(typeof e=="string")switch(e){case"ease":case"ease-in-out":case"ease-out":case"ease-in":case"linear":return ik(e);case"spring":return MF();default:if(e.split("(")[0]==="cubic-bezier")return ik(e)}return typeof e=="function"?e:null};function LF(e){var t,r=()=>null,n=!1,i=null,a=s=>{if(!n){if(Array.isArray(s)){if(!s.length)return;var u=s,[c,...d]=u;if(typeof c=="number"){i=e.setTimeout(a.bind(null,d),c);return}a(c),i=e.setTimeout(a.bind(null,d));return}typeof s=="string"&&(t=s,r(t)),typeof s=="object"&&(t=s,r(t)),typeof s=="function"&&s()}};return{stop:()=>{n=!0},start:s=>{n=!1,i&&(i(),i=null),a(s)},subscribe:s=>(r=s,()=>{r=()=>null}),getTimeoutController:()=>e}}class zF{setTimeout(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,n=performance.now(),i=null,a=s=>{s-n>=r?t(s):typeof requestAnimationFrame=="function"&&(i=requestAnimationFrame(a))};return i=requestAnimationFrame(a),()=>{i!=null&&cancelAnimationFrame(i)}}}function UF(){return LF(new zF)}var BF=x.createContext(UF);function FF(e,t){var r=x.useContext(BF);return x.useMemo(()=>t??r(e),[e,t,r])}var WF={begin:0,duration:1e3,easing:"ease",isActive:!0,canBegin:!0,onAnimationEnd:()=>{},onAnimationStart:()=>{}},ak={t:0},jm={t:1};function Xf(e){var t=or(e,WF),{isActive:r,canBegin:n,duration:i,easing:a,begin:s,onAnimationEnd:u,onAnimationStart:c,children:d}=t,h=$C(),p=r==="auto"?!pu.isSsr&&!h:r,m=FF(t.animationId,t.animationManager),[g,b]=x.useState(p?ak:jm),w=x.useRef(null);return x.useEffect(()=>{p||b(jm)},[p]),x.useEffect(()=>{if(!p||!n)return Ka;var S=TF(ak,jm,$F(a),i,b,m.getTimeoutController()),k=()=>{w.current=S()};return m.start([c,s,k,i,u]),()=>{m.stop(),w.current&&w.current(),u()}},[p,n,i,a,s,c,u,m]),d(g.t)}function Jf(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"animation-",r=x.useRef(Wl(t)),n=x.useRef(e);return n.current!==e&&(r.current=Wl(t),n.current=e),r.current}var qF=["radius"],HF=["radius"],ok,sk,lk,uk,ck,dk,fk,hk,pk,vk;function mk(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 gk(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?mk(Object(r),!0).forEach(function(n){KF(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):mk(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function KF(e,t,r){return(t=VF(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function VF(e){var t=GF(e,"string");return typeof t=="symbol"?t:t+""}function GF(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 qd(){return qd=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},qd.apply(null,arguments)}function yk(e,t){if(e==null)return{};var r,n,i=YF(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 YF(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 bn(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var wk=(e,t,r,n,i)=>{var a=qi(r),s=qi(n),u=Math.min(Math.abs(a)/2,Math.abs(s)/2),c=s>=0?1:-1,d=a>=0?1:-1,h=s>=0&&a>=0||s<0&&a<0?1:0,p;if(u>0&&Array.isArray(i)){for(var m=[0,0,0,0],g=0,b=4;g<b;g++){var w,S=(w=i[g])!==null&&w!==void 0?w:0;m[g]=S>u?u:S}p=ut(ok||(ok=bn(["M",",",""])),e,t+c*m[0]),m[0]>0&&(p+=ut(sk||(sk=bn(["A ",",",",0,0,",",",",",""])),m[0],m[0],h,e+d*m[0],t)),p+=ut(lk||(lk=bn(["L ",",",""])),e+r-d*m[1],t),m[1]>0&&(p+=ut(uk||(uk=bn(["A ",",",",0,0,",`,
        `,",",""])),m[1],m[1],h,e+r,t+c*m[1])),p+=ut(ck||(ck=bn(["L ",",",""])),e+r,t+n-c*m[2]),m[2]>0&&(p+=ut(dk||(dk=bn(["A ",",",",0,0,",`,
        `,",",""])),m[2],m[2],h,e+r-d*m[2],t+n)),p+=ut(fk||(fk=bn(["L ",",",""])),e+d*m[3],t+n),m[3]>0&&(p+=ut(hk||(hk=bn(["A ",",",",0,0,",`,
        `,",",""])),m[3],m[3],h,e,t+n-c*m[3])),p+="Z"}else if(u>0&&i===+i&&i>0){var k=Math.min(u,i);p=ut(pk||(pk=bn(["M ",",",`
            A `,",",",0,0,",",",",",`
            L `,",",`
            A `,",",",0,0,",",",",",`
            L `,",",`
            A `,",",",0,0,",",",",",`
            L `,",",`
            A `,",",",0,0,",",",","," Z"])),e,t+c*k,k,k,h,e+d*k,t,e+r-d*k,t,k,k,h,e+r,t+c*k,e+r,t+n-c*k,k,k,h,e+r-d*k,t+n,e+d*k,t+n,k,k,h,e,t+n-c*k)}else p=ut(vk||(vk=bn(["M ",","," h "," v "," h "," Z"])),e,t,r,n,-r);return p},bk={x:0,y:0,width:0,height:0,radius:0,isAnimationActive:!1,isUpdateAnimationActive:!1,animationBegin:0,animationDuration:1500,animationEasing:"ease"},qC=e=>{var t=or(e,bk),r=x.useRef(null),[n,i]=x.useState(-1);x.useEffect(()=>{if(r.current&&r.current.getTotalLength)try{var he=r.current.getTotalLength();he&&i(he)}catch{}},[]);var{x:a,y:s,width:u,height:c,radius:d,className:h}=t,{animationEasing:p,animationDuration:m,animationBegin:g,isAnimationActive:b,isUpdateAnimationActive:w}=t,S=x.useRef(u),k=x.useRef(c),A=x.useRef(a),P=x.useRef(s),C=x.useMemo(()=>({x:a,y:s,width:u,height:c,radius:d}),[a,s,u,c,d]),N=Jf(C,"rectangle-");if(a!==+a||s!==+s||u!==+u||c!==+c||u===0||c===0)return null;var j=Fe("recharts-rectangle",h);if(!w){var M=nr(t),{radius:F}=M,W=yk(M,qF);return x.createElement("path",qd({},W,{x:qi(a),y:qi(s),width:qi(u),height:qi(c),radius:typeof d=="number"?d:void 0,className:j,d:wk(a,s,u,c,d)}))}var H=S.current,Y=k.current,B=A.current,pe=P.current,ie="0px ".concat(n===-1?1:n,"px"),me="".concat(n,"px ").concat(n,"px"),_e=UC(["strokeDasharray"],m,typeof p=="string"?p:bk.animationEasing);return x.createElement(Xf,{animationId:N,key:N,canBegin:n>0,duration:m,easing:p,isActive:w,begin:g},he=>{var K=ct(H,u,he),Q=ct(Y,c,he),X=ct(B,a,he),D=ct(pe,s,he);r.current&&(S.current=K,k.current=Q,A.current=X,P.current=D);var q;b?he>0?q={transition:_e,strokeDasharray:me}:q={strokeDasharray:ie}:q={strokeDasharray:me};var ge=nr(t),{radius:ye}=ge,Pe=yk(ge,HF);return x.createElement("path",qd({},Pe,{radius:typeof d=="number"?d:void 0,className:j,d:w