KK(e){return HK.has(e)}var sN=Xt({name:"zIndex",initialState:qK,reducers:{registerZIndexPortal:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]?e.zIndexMap[r].consumers+=1:e.zIndexMap[r]={consumers:1,element:void 0,panoramaElement:void 0}},prepare:Je()},unregisterZIndexPortal:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]&&(e.zIndexMap[r].consumers-=1,e.zIndexMap[r].consumers<=0&&!KK(r)&&delete e.zIndexMap[r])},prepare:Je()},registerZIndexPortalElement:{reducer:(e,t)=>{var{zIndex:r,element:n,isPanorama:i}=t.payload;e.zIndexMap[r]?i?e.zIndexMap[r].panoramaElement=n:e.zIndexMap[r].element=n:e.zIndexMap[r]={consumers:0,element:i?void 0:n,panoramaElement:i?n:void 0}},prepare:Je()},unregisterZIndexPortalElement:{reducer:(e,t)=>{var{zIndex:r}=t.payload;e.zIndexMap[r]&&(t.payload.isPanorama?e.zIndexMap[r].panoramaElement=void 0:e.zIndexMap[r].element=void 0)},prepare:Je()}}}),{registerZIndexPortal:VK,unregisterZIndexPortal:Wm,registerZIndexPortalElement:GK,unregisterZIndexPortalElement:YK}=sN.actions,XK=sN.reducer;function Hr(e){var{zIndex:t,children:r}=e,n=l5(),i=n&&t!==void 0&&t!==0,a=Jt(),s=x.useRef(void 0),u=x.useRef(new Set),c=at(),d=ve(p=>LK(p,t,a));if(x.useLayoutEffect(()=>{if(!i){var p=u.current;p.forEach(g=>{c(Wm({zIndex:g}))}),p.clear(),s.current=void 0;return}if(u.current.has(t)||(c(VK({zIndex:t})),u.current.add(t)),d){s.current=d;var m=u.current;m.forEach(g=>{g!==t&&(c(Wm({zIndex:g})),m.delete(g))})}},[c,t,i,d]),x.useLayoutEffect(()=>{var p=u.current;return()=>{p.forEach(m=>{c(Wm({zIndex:m}))}),p.clear()}},[c]),!i)return r;var h=d??s.current;return h?dO.createPortal(r,h):null}function ly(){return ly=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},ly.apply(null,arguments)}function zP(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 rd(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?zP(Object(r),!0).forEach(function(n){JK(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):zP(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function JK(e,t,r){return(t=QK(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function QK(e){var t=ZK(e,"string");return typeof t=="symbol"?t:t+""}function ZK(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 e9(e){var{cursor:t,cursorComp:r,cursorProps:n}=e;return x.isValidElement(t)?x.cloneElement(t,n):x.createElement(r,n)}function t9(e){var t,{coordinate:r,payload:n,index:i,offset:a,tooltipAxisBandSize:s,layout:u,cursor:c,tooltipEventType:d,chartName:h}=e,p=r,m=n,g=i;if(!c||!p||h!=="ScatterChart"&&d!=="axis")return null;var b,w,S;if(h==="ScatterChart")b=p,w=wF,S=jt.cursorLine;else if(h==="BarChart")b=bF(u,p,a,s),w=qC,S=jt.cursorRectangle;else if(u==="radial"&&AA(p)){var{cx:k,cy:A,radius:P,startAngle:C,endAngle:N}=HC(p);b={cx:k,cy:A,startAngle:C,endAngle:N,innerRadius:P,outerRadius:P},w=VC,S=jt.cursorLine}else b={points:uW(u,p,a)},w=zC,S=jt.cursorLine;var j=typeof c=="object"&&"className"in c?c.className:void 0,M=rd(rd(rd(rd({stroke:"#ccc",pointerEvents:"none"},a),b),ou(c)),{},{payload:m,payloadIndex:g,className:Fe("recharts-tooltip-cursor",j)});return x.createElement(Hr,{zIndex:(t=e.zIndex)!==null&&t!==void 0?t:S},x.createElement(e9,{cursor:c,cursorComp:w,cursorProps:M}))}function r9(e){var t=_K(),r=PC(),n=Va(),i=CK();return t==null||r==null||n==null||i==null?null:x.createElement(t9,ly({},e,{offset:r,layout:n,tooltipAxisBandSize:t,chartName:i}))}var lN=x.createContext(null),n9=()=>x.useContext(lN),qm={exports:{}},UP;function i9(){return UP||(UP=1,function(e){var t=Object.prototype.hasOwnProperty,r="~";function n(){}Object.create&&(n.prototype=Object.create(null),new n().__proto__||(r=!1));function i(c,d,h){this.fn=c,this.context=d,this.once=h||!1}function a(c,d,h,p,m){if(typeof h!="function")throw new TypeError("The listener must be a function");var g=new i(h,p||c,m),b=r?r+d:d;return c._events[b]?c._events[b].fn?c._events[b]=[c._events[b],g]:c._events[b].push(g):(c._events[b]=g,c._eventsCount++),c}function s(c,d){--c._eventsCount===0?c._events=new n:delete c._events[d]}function u(){this._events=new n,this._eventsCount=0}u.prototype.eventNames=function(){var d=[],h,p;if(this._eventsCount===0)return d;for(p in h=this._events)t.call(h,p)&&d.push(r?p.slice(1):p);return Object.getOwnPropertySymbols?d.concat(Object.getOwnPropertySymbols(h)):d},u.prototype.listeners=function(d){var h=r?r+d:d,p=this._events[h];if(!p)return[];if(p.fn)return[p.fn];for(var m=0,g=p.length,b=new Array(g);m<g;m++)b[m]=p[m].fn;return b},u.prototype.listenerCount=function(d){var h=r?r+d:d,p=this._events[h];return p?p.fn?1:p.length:0},u.prototype.emit=function(d,h,p,m,g,b){var w=r?r+d:d;if(!this._events[w])return!1;var S=this._events[w],k=arguments.length,A,P;if(S.fn){switch(S.once&&this.removeListener(d,S.fn,void 0,!0),k){case 1:return S.fn.call(S.context),!0;case 2:return S.fn.call(S.context,h),!0;case 3:return S.fn.call(S.context,h,p),!0;case 4:return S.fn.call(S.context,h,p,m),!0;case 5:return S.fn.call(S.context,h,p,m,g),!0;case 6:return S.fn.call(S.context,h,p,m,g,b),!0}for(P=1,A=new Array(k-1);P<k;P++)A[P-1]=arguments[P];S.fn.apply(S.context,A)}else{var C=S.length,N;for(P=0;P<C;P++)switch(S[P].once&&this.removeListener(d,S[P].fn,void 0,!0),k){case 1:S[P].fn.call(S[P].context);break;case 2:S[P].fn.call(S[P].context,h);break;case 3:S[P].fn.call(S[P].context,h,p);break;case 4:S[P].fn.call(S[P].context,h,p,m);break;default:if(!A)for(N=1,A=new Array(k-1);N<k;N++)A[N-1]=arguments[N];S[P].fn.apply(S[P].context,A)}}return!0},u.prototype.on=function(d,h,p){return a(this,d,h,p,!1)},u.prototype.once=function(d,h,p){return a(this,d,h,p,!0)},u.prototype.removeListener=function(d,h,p,m){var g=r?r+d:d;if(!this._events[g])return this;if(!h)return s(this,g),this;var b=this._events[g];if(b.fn)b.fn===h&&(!m||b.once)&&(!p||b.context===p)&&s(this,g);else{for(var w=0,S=[],k=b.length;w<k;w++)(b[w].fn!==h||m&&!b[w].once||p&&b[w].context!==p)&&S.push(b[w]);S.length?this._events[g]=S.length===1?S[0]:S:s(this,g)}return this},u.prototype.removeAllListeners=function(d){var h;return d?(h=r?r+d:d,this._events[h]&&s(this,h)):(this._events=new n,this._eventsCount=0),this},u.prototype.off=u.prototype.removeListener,u.prototype.addListener=u.prototype.on,u.prefixed=r,u.EventEmitter=u,e.exports=u}(qm)),qm.exports}var a9=i9();const o9=ai(a9);var ru=new o9,uy="recharts.syncEvent.tooltip",BP="recharts.syncEvent.brush",uN=(e,t)=>{if(t&&Array.isArray(e)){var r=Number.parseInt(t,10);if(!Nn(r))return e[r]}},s9={chartName:"",tooltipPayloadSearcher:()=>{},eventEmitter:void 0,defaultTooltipEventType:"axis"},cN=Xt({name:"options",initialState:s9,reducers:{createEventEmitter:e=>{e.eventEmitter==null&&(e.eventEmitter=Symbol("rechartsEventEmitter"))}}}),l9=cN.reducer,{createEventEmitter:u9}=cN.actions;function c9(e){return e.tooltip.syncInteraction}var d9={chartData:void 0,computedData:void 0,dataStartIndex:0,dataEndIndex:0},dN=Xt({name:"chartData",initialState:d9,reducers:{setChartData(e,t){if(e.chartData=t.payload,t.payload==null){e.dataStartIndex=0,e.dataEndIndex=0;return}t.payload.length>0&&e.dataEndIndex!==t.payload.length-1&&(e.dataEndIndex=t.payload.length-1)},setComputedData(e,t){e.computedData=t.payload},setDataStartEndIndexes(e,t){var{startIndex:r,endIndex:n}=t.payload;r!=null&&(e.dataStartIndex=r),n!=null&&(e.dataEndIndex=n)}}}),{setChartData:FP,setDataStartEndIndexes:f9,setComputedData:Pee}=dN.actions,h9=dN.reducer,p9=["x","y"];function WP(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 Ro(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?WP(Object(r),!0).forEach(function(n){v9(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):WP(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function v9(e,t,r){return(t=m9(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function m9(e){var t=g9(e,"string");return typeof t=="symbol"?t:t+""}function g9(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 y9(e,t){if(e==null)return{};var r,n,i=w9(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 w9(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 b9(){var e=ve(n0),t=ve(i0),r=at(),n=ve(uj),i=ve(vi),a=Va(),s=Kf(),u=ve(c=>c.rootProps.className);x.useEffect(()=>{if(e==null)return Ka;var c=(d,h,p)=>{if(t!==p&&e===d){if(h.payload.active===!1){r(El({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(n==="index"){var m;if(s&&h!==null&&h!==void 0&&(m=h.payload)!==null&&m!==void 0&&m.coordinate&&h.payload.sourceViewBox){var g=h.payload.coordinate,{x:b,y:w}=g,S=y9(g,p9),{x:k,y:A,width:P,height:C}=h.payload.sourceViewBox,N=Ro(Ro({},S),{},{x:s.x+(P?(b-k)/P:0)*s.width,y:s.y+(C?(w-A)/C:0)*s.height});r(Ro(Ro({},h),{},{payload:Ro(Ro({},h.payload),{},{coordinate:N})}))}else r(h);return}if(i!=null){var j;if(typeof n=="function"){var M={activeTooltipIndex:h.payload.index==null?void 0:Number(h.payload.index),isTooltipActive:h.payload.active,activeIndex:h.payload.index==null?void 0:Number(h.payload.index),activeLabel:h.payload.label,activeDataKey:h.payload.dataKey,activeCoordinate:h.payload.coordinate},F=n(i,M);j=i[F]}else n==="value"&&(j=i.find(_e=>String(_e.value)===h.payload.label));var{coordinate:W}=h.payload;if(W==null||s==null){r(El({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:void 0,graphicalItemId:void 0}));return}if(j==null){r(El({active:!1,coordinate:void 0,dataKey:void 0,index:null,label:void 0,sourceViewBox:h.payload.sourceViewBox,graphicalItemId:void 0}));return}var{x:H,y:Y}=W,B=Math.min(H,s.x+s.width),pe=Math.min(Y,s.y+s.height),ie={x:a==="horizontal"?j.coordinate:B,y:a==="horizontal"?pe:j.coordinate},me=El({active:h.payload.active,coordinate:ie,dataKey:h.payload.dataKey,index:String(j.index),label:h.payload.label,sourceViewBox:h.payload.sourceViewBox,graphicalItemId:h.payload.graphicalItemId});r(me)}}};return ru.on(uy,c),()=>{ru.off(uy,c)}},[u,r,t,e,n,i,a,s])}function x9(){var e=ve(n0),t=ve(i0),r=at();x.useEffect(()=>{if(e==null)return Ka;var n=(i,a,s)=>{t!==s&&e===i&&r(f9(a))};return ru.on(BP,n),()=>{ru.off(BP,n)}},[r,t,e])}function _9(){var e=at();x.useEffect(()=>{e(u9())},[e]),b9(),x9()}function S9(e,t,r,n,i,a){var s=ve(b=>TK(b,e,t)),u=ve(fK),c=ve(i0),d=ve(n0),h=ve(uj),p=ve(c9),m=(p==null?void 0:p.sourceViewBox)!=null,g=Kf();x.useEffect(()=>{if(!m&&d!=null&&c!=null){var b=El({active:a,coordinate:r,dataKey:s,index:i,label:typeof n=="number"?String(n):n,sourceViewBox:g,graphicalItemId:u});ru.emit(uy,d,b,c)}},[m,r,s,u,i,n,c,d,h,a,g])}function qP(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 HP(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?qP(Object(r),!0).forEach(function(n){k9(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):qP(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function k9(e,t,r){return(t=P9(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P9(e){var t=E9(e,"string");return typeof t=="symbol"?t:t+""}function E9(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 O9(e){return e.dataKey}function A9(e,t){return x.isValidElement(e)?x.cloneElement(e,t):typeof e=="function"?x.createElement(e,t):x.createElement(G5,t)}var KP=[],C9={allowEscapeViewBox:{x:!1,y:!1},animationDuration:400,animationEasing:"ease",axisId:0,contentStyle:{},cursor:!0,filterNull:!0,includeHidden:!1,isAnimationActive:"auto",itemSorter:"name",itemStyle:{},labelStyle:{},offset:10,reverseDirection:{x:!1,y:!1},separator:" : ",trigger:"hover",useTranslate3d:!1,wrapperStyle:{}};function fN(e){var t,r,n=or(e,C9),{active:i,allowEscapeViewBox:a,animationDuration:s,animationEasing:u,content:c,filterNull:d,isAnimationActive:h,offset:p,payloadUniqBy:m,position:g,reverseDirection:b,useTranslate3d:w,wrapperStyle:S,cursor:k,shared:A,trigger:P,defaultIndex:C,portal:N,axisId:j}=n,M=at(),F=typeof C=="number"?String(C):C;x.useEffect(()=>{M(bH({shared:A,trigger:P,axisId:j,active:i,defaultIndex:F}))},[M,A,P,j,i,F]);var W=Kf(),H=LC(),Y=pH(A),{activeIndex:B,isActive:pe}=(t=ve(ke=>RK(ke,Y,P,F)))!==null&&t!==void 0?t:{},ie=ve(ke=>IK(ke,Y,P,F)),me=ve(ke=>oN(ke,Y,P,F)),_e=ve(ke=>NK(ke,Y,P,F)),he=ie,K=n9(),Q=(r=i??pe)!==null&&r!==void 0?r:!1,[X,D]=hU([he,Q]),q=Y==="axis"?me:void 0;S9(Y,P,_e,q,B,Q);var ge=N??K;if(ge==null||W==null||Y==null)return null;var ye=he??KP;Q||(ye=KP),d&&ye.length&&(ye=z4(ye.filter(ke=>ke.value!=null&&(ke.hide!==!0||n.includeHidden)),m,O9));var Pe=ye.length>0,Ee=HP(HP({},n),{},{payload:ye,label:q,active:Q,activeIndex:B,coordinate:_e,accessibilityLayer:H}),Ne=x.createElement(aF,{allowEscapeViewBox:a,animationDuration:s,animationEasing:u,isAnimationActive:h,active:Q,coordinate:_e,hasPayload:Pe,offset:p,position:g,reverseDirection:b,useTranslate3d:w,viewBox:W,wrapperStyle:S,lastBoundingBox:X,innerRef:D,hasPortalFromProps:!!N},A9(c,Ee));return x.createElement(x.Fragment,null,dO.createPortal(Ne,ge),Q&&x.createElement(r9,{cursor:k,tooltipEventType:Y,coordinate:_e,payload:ye,index:B}))}var hN=e=>null;hN.displayName="Cell";function j9(e,t,r){return(t=T9(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function T9(e){var t=N9(e,"string");return typeof t=="symbol"?t:t+""}function N9(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)}class I9{constructor(t){j9(this,"cache",new Map),this.maxSize=t}get(t){var r=this.cache.get(t);return r!==void 0&&(this.cache.delete(t),this.cache.set(t,r)),r}set(t,r){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){var n=this.cache.keys().next().value;n!=null&&this.cache.delete(n)}this.cache.set(t,r)}clear(){this.cache.clear()}size(){return this.cache.size}}function VP(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 R9(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?VP(Object(r),!0).forEach(function(n){D9(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):VP(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function D9(e,t,r){return(t=M9(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function M9(e){var t=$9(e,"string");return typeof t=="symbol"?t:t+""}function $9(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 L9={cacheSize:2e3,enableCache:!0},pN=R9({},L9),GP=new I9(pN.cacheSize),z9={position:"absolute",top:"-20000px",left:0,padding:0,margin:0,border:"none",whiteSpace:"pre"},YP="recharts_measurement_span";function U9(e,t){var r=t.fontSize||"",n=t.fontFamily||"",i=t.fontWeight||"",a=t.fontStyle||"",s=t.letterSpacing||"",u=t.textTransform||"";return"".concat(e,"|").concat(r,"|").concat(n,"|").concat(i,"|").concat(a,"|").concat(s,"|").concat(u)}var XP=(e,t)=>{try{var r=document.getElementById(YP);r||(r=document.createElement("span"),r.setAttribute("id",YP),r.setAttribute("aria-hidden","true"),document.body.appendChild(r)),Object.assign(r.style,z9,t),r.textContent="".concat(e);var n=r.getBoundingClientRect();return{width:n.width,height:n.height}}catch{return{width:0,height:0}}},Il=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(t==null||pu.isSsr)return{width:0,height:0};if(!pN.enableCache)return XP(t,r);var n=U9(t,r),i=GP.get(n);if(i)return i;var a=XP(t,r);return GP.set(n,a),a},vN;function B9(e,t,r){return(t=F9(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function F9(e){var t=W9(e,"string");return typeof t=="symbol"?t:t+""}function W9(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 JP=/(-?\d+(?:\.\d+)?[a-zA-Z%]*)([*/])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/,QP=/(-?\d+(?:\.\d+)?[a-zA-Z%]*)([+-])(-?\d+(?:\.\d+)?[a-zA-Z%]*)/,q9=/^(px|cm|vh|vw|em|rem|%|mm|in|pt|pc|ex|ch|vmin|vmax|Q)$/,H9=/(-?\d+(?:\.\d+)?)([a-zA-Z%]+)?/,K9={cm:96/2.54,mm:96/25.4,pt:96/72,pc:96/6,in:96,Q:96/(2.54*40),px:1},V9=["cm","mm","pt","pc","in","Q","px"];function G9(e){return V9.includes(e)}var Vo="NaN";function Y9(e,t){return e*K9[t]}class Ut{static parse(t){var r,[,n,i]=(r=H9.exec(t))!==null&&r!==void 0?r:[];return n==null?Ut.NaN:new Ut(parseFloat(n),i??"")}constructor(t,r){this.num=t,this.unit=r,this.num=t,this.unit=r,Nn(t)&&(this.unit=""),r!==""&&!q9.test(r)&&(this.num=NaN,this.unit=""),G9(r)&&(this.num=Y9(t,r),this.unit="px")}add(t){return this.unit!==t.unit?new Ut(NaN,""):new Ut(this.num+t.num,this.unit)}subtract(t){return this.unit!==t.unit?new Ut(NaN,""):new Ut(this.num-t.num,this.unit)}multiply(t){return this.unit!==""&&t.unit!==""&&this.unit!==t.unit?new Ut(NaN,""):new Ut(this.num*t.num,this.unit||t.unit)}divide(t){return this.unit!==""&&t.unit!==""&&this.unit!==t.unit?new Ut(NaN,""):new Ut(this.num/t.num,this.unit||t.unit)}toString(){return"".concat(this.num).concat(this.unit)}isNaN(){return Nn(this.num)}}vN=Ut;B9(Ut,"NaN",new vN(NaN,""));function mN(e){if(e==null||e.includes(Vo))return Vo;for(var t=e;t.includes("*")||t.includes("/");){var r,[,n,i,a]=(r=JP.exec(t))!==null&&r!==void 0?r:[],s=Ut.parse(n??""),u=Ut.parse(a??""),c=i==="*"?s.multiply(u):s.divide(u);if(c.isNaN())return Vo;t=t.replace(JP,c.toString())}for(;t.includes("+")||/.-\d+(?:\.\d+)?/.test(t);){var d,[,h,p,m]=(d=QP.exec(t))!==null&&d!==void 0?d:[],g=Ut.parse(h??""),b=Ut.parse(m??""),w=p==="+"?g.add(b):g.subtract(b);if(w.isNaN())return Vo;t=t.replace(QP,w.toString())}return t}var ZP=/\(([^()]*)\)/;function X9(e){for(var t=e,r;(r=ZP.exec(t))!=null;){var[,n]=r;t=t.replace(ZP,mN(n))}return t}function J9(e){var t=e.replace(/\s+/g,"");return t=X9(t),t=mN(t),t}function Q9(e){try{return J9(e)}catch{return Vo}}function Hm(e){var t=Q9(e.slice(5,-1));return t===Vo?"":t}var Z9=["x","y","lineHeight","capHeight","fill","scaleToFit","textAnchor","verticalAnchor"],eV=["dx","dy","angle","className","breakAll"];function cy(){return cy=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},cy.apply(null,arguments)}function eE(e,t){if(e==null)return{};var r,n,i=tV(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 tV(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 gN=/[ \f\n\r\t\v\u2028\u2029]+/,yN=e=>{var{children:t,breakAll:r,style:n}=e;try{var i=[];tt(t)||(r?i=t.toString().split(""):i=t.toString().split(gN));var a=i.map(u=>({word:u,width:Il(u,n).width})),s=r?0:Il("Â ",n).width;return{wordsWithComputedWidth:a,spaceWidth:s}}catch{return null}};function wN(e){return e==="start"||e==="middle"||e==="end"||e==="inherit"}function rV(e){return tt(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean"}var bN=(e,t,r,n)=>e.reduce((i,a)=>{var{word:s,width:u}=a,c=i[i.length-1];if(c&&u!=null&&(t==null||n||c.width+u+r<Number(t)))c.words.push(s),c.width+=u+r;else{var d={words:[s],width:u};i.push(d)}return i},[]),xN=e=>e.reduce((t,r)=>t.width>r.width?t:r),nV="â€¦",tE=(e,t,r,n,i,a,s,u)=>{var c=e.slice(0,t),d=yN({breakAll:r,style:n,children:c+nV});if(!d)return[!1,[]];var h=bN(d.wordsWithComputedWidth,a,s,u),p=h.length>i||xN(h).width>Number(a);return[p,h]},iV=(e,t,r,n,i)=>{var{maxLines:a,children:s,style:u,breakAll:c}=e,d=ce(a),h=String(s),p=bN(t,n,r,i);if(!d||i)return p;var m=p.length>a||xN(p).width>Number(n);if(!m)return p;for(var g=0,b=h.length-1,w=0,S;g<=b&&w<=h.length-1;){var k=Math.floor((g+b)/2),A=k-1,[P,C]=tE(h,A,c,u,a,n,r,i),[N]=tE(h,k,c,u,a,n,r,i);if(!P&&!N&&(g=k+1),P&&N&&(b=k-1),!P&&N){S=C;break}w++}return S||p},rE=e=>{var t=tt(e)?[]:e.toString().split(gN);return[{words:t,width:void 0}]},aV=e=>{var{width:t,scaleToFit:r,children:n,style:i,breakAll:a,maxLines:s}=e;if((t||r)&&!pu.isSsr){var u,c,d=yN({breakAll:a,children:n,style:i});if(d){var{wordsWithComputedWidth:h