summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorteh_coderer <me@tehcoderer.com>2023-05-04 15:29:52 -0400
committerteh_coderer <me@tehcoderer.com>2023-05-04 15:29:52 -0400
commitc252a9e87af8eddd5e5fca4ca7ad7308285b2cd7 (patch)
treebecfc52b9d136c6c15e0b45c3409cf8c750fb4a4
parent2b7793857b66e1f34ba346c1b3c423686f1980f8 (diff)
update tables
-rw-r--r--frontend-components/tables/src/components/Table/ColumnHeader.tsx26
-rw-r--r--frontend-components/tables/src/components/Table/index.tsx49
-rw-r--r--frontend-components/tables/src/utils/utils.ts42
-rw-r--r--openbb_terminal/core/plots/table.html100
4 files changed, 142 insertions, 75 deletions
diff --git a/frontend-components/tables/src/components/Table/ColumnHeader.tsx b/frontend-components/tables/src/components/Table/ColumnHeader.tsx
index 511dcec7e9a..f0126efbf69 100644
--- a/frontend-components/tables/src/components/Table/ColumnHeader.tsx
+++ b/frontend-components/tables/src/components/Table/ColumnHeader.tsx
@@ -1,7 +1,7 @@
import { flexRender } from "@tanstack/react-table";
import clsx from "clsx";
import { FC } from "react";
-import { includesDateNames } from "../../utils/utils";
+import { formatNumberMagnitude, includesDateNames } from "../../utils/utils";
import { useDrag, useDrop } from "react-dnd";
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
@@ -16,24 +16,34 @@ function Filter({
}) {
const values = table
.getPreFilteredRowModel()
- .flatRows.map((row) => row.getValue(column.id));
+ .flatRows.map((row: { getValue: (arg0: any) => any }) =>
+ row.getValue(column.id)
+ );
const areAllValuesString = values.every(
- (value) => typeof value === "string" || value === null
+ (value: null) => typeof value === "string" || value === null
);
const areAllValuesNumber = values.every(
- (value) => typeof value === "number" || value === null
+ (value: null | number | string) =>
+ typeof value === "number" ||
+ value === null ||
+ ((value.toString().replace(/[^0-9]/g, "") ?? "").trim().length !== 0 &&
+ value
+ .toString()
+ .replace(/[^a-zA-Z]/g, "" ?? "")
+ .trim().length === 1)
);
const valuesContainStringWithSpaces = values.some(
- (value) => typeof value === "string" && value.includes(" ")
+ (value: string | string[]) =>
+ typeof value === "string" && value.includes(" ")
);
const columnFilterValue = column.getFilterValue();
- const isProbablyDate = values.every((value) => {
+ const isProbablyDate = values.every((value: string) => {
if (typeof value !== "string") return false;
- const only_numbers = value.replace(/[^0-9]/g, "");
+ const only_numbers = value.replace(/[^0-9]/g, "").trim();
return (
only_numbers.length >= 4 &&
(includesDateNames(column.id) ||
@@ -42,7 +52,7 @@ function Filter({
});
if (isProbablyDate) {
- function getTime(value) {
+ function getTime(value: string | number | Date) {
if (!value) return null;
const date = new Date(value);
const year = date.getFullYear();
diff --git a/frontend-components/tables/src/components/Table/index.tsx b/frontend-components/tables/src/components/Table/index.tsx
index dfa7e8e6dac..abfe9759499 100644
--- a/frontend-components/tables/src/components/Table/index.tsx
+++ b/frontend-components/tables/src/components/Table/index.tsx
@@ -16,6 +16,8 @@ import {
fuzzyFilter,
isEqual,
includesDateNames,
+ formatNumberNoMagnitude,
+ includesPriceNames,
} from "../../utils/utils";
import DraggableColumnHeader from "./ColumnHeader";
import Pagination, { validatePageSize } from "./Pagination";
@@ -180,7 +182,7 @@ export default function Table({
const indexValue = indexLabel ? row.original[indexLabel] : null;
const value = row.original[column];
const valueType = typeof value;
- const only_numbers = value?.toString().replace(/[^0-9]/g, "");
+ const only_numbers = value?.toString().replace(/[^0-9]/g, "") ?? "";
const probablyDate =
only_numbers.length >= 4 &&
(includesDateNames(column) ||
@@ -207,7 +209,7 @@ export default function Table({
</a>
);
}
- if (probablyDate) {
+ if (probablyDate && typeof value !== "number") {
if (typeof value === "string") {
const date = value.split("T")[0];
const time = value.split("T")[1]?.split(".")[0];
@@ -221,12 +223,6 @@ export default function Table({
);
}
- if (typeof value === "number") {
- if (value < 1000000000000) {
- return <p>{value}</p>;
- }
- }
-
try {
const date = new Date(value);
let dateFormatted = "";
@@ -250,19 +246,42 @@ export default function Table({
return <p>{value}</p>;
}
}
- if (valueType === "number") {
- const valueFormatted = formatNumberMagnitude(value);
+ if (
+ valueType === "number" ||
+ value
+ ?.toString()
+ .replace(/[^a-zA-Z]/g, "")
+ .trim().length === 1
+ ) {
+ let valueFormatted = formatNumberMagnitude(value, column);
+ const valueFormattedNoMagnitude = Number(
+ formatNumberNoMagnitude(value)
+ );
+
+ if (
+ typeof indexValue === "string" &&
+ includesPriceNames(indexValue)
+ ) {
+ valueFormatted = Number(formatNumberNoMagnitude(value));
+ if (valueFormatted > 1000) {
+ valueFormatted = valueFormatted.toLocaleString("en-US", {
+ maximumFractionDigits: 2,
+ minimumFractionDigits: 2,
+ });
+ }
+ }
+
return (
<p
className={clsx("whitespace-nowrap", {
"text-black dark:text-white": !colors,
- "text-[#16A34A]": value > 0 && colors,
- "text-[#F87171]": value < 0 && colors,
- "text-[#404040]": value === 0 && colors,
+ "text-[#16A34A]": valueFormattedNoMagnitude > 0 && colors,
+ "text-[#F87171]": valueFormattedNoMagnitude < 0 && colors,
+ "text-[#404040]": valueFormattedNoMagnitude === 0 && colors,
})}
>
- {value !== 0
- ? value > 0
+ {valueFormattedNoMagnitude !== 0
+ ? valueFormattedNoMagnitude > 0
? `${valueFormatted}`
: `${valueFormatted}`
: valueFormatted}
diff --git a/frontend-components/tables/src/utils/utils.ts b/frontend-components/tables/src/utils/utils.ts
index 68e6db700a5..72248a166f8 100644
--- a/frontend-components/tables/src/utils/utils.ts
+++ b/frontend-components/tables/src/utils/utils.ts
@@ -2,7 +2,28 @@ import { rankItem } from "@tanstack/match-sorter-utils";
import domtoimage from "dom-to-image";
import { utils, writeFile } from "xlsx";
-export function formatNumberMagnitude(number: number) {
+export function formatNumberNoMagnitude(number: number | string) {
+ if (typeof number === "string") {
+ const suffix = number.replace(/[^a-zA-Z]/g, "").trim();
+ const magnitude = ["", "K", "M", "B", "T"].indexOf(
+ suffix.replace(/\s/g, "")
+ );
+ number =
+ Number(number.replace(/[^0-9.]/g, "").trim()) *
+ Math.pow(10, magnitude * 3);
+ }
+
+ return number;
+}
+
+export function formatNumberMagnitude(
+ number: number | string,
+ column?: string
+) {
+ if (typeof number === "string") {
+ number = Number(formatNumberNoMagnitude(number));
+ }
+
if (number % 1 !== 0) {
const decimalPlaces = Math.max(2, number.toString().split(".")[1].length);
const toFixed = Math.min(4, decimalPlaces);
@@ -11,13 +32,17 @@ export function formatNumberMagnitude(number: number) {
}
}
- if (number > 10_000) {
+ if (number > 1000 && !includesPriceNames(column || "")) {
const magnitude = Math.min(4, Math.floor(Math.log10(Math.abs(number)) / 3));
const suffix = ["", "K", "M", "B", "T"][magnitude];
const formatted = (number / 10 ** (magnitude * 3)).toFixed(2);
return `${formatted} ${suffix}`;
}
+ if (number > 1000) {
+ return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+ }
+
return number;
}
@@ -27,6 +52,19 @@ export function includesDateNames(column: string) {
);
}
+export function includesPriceNames(column: string) {
+ return [
+ "price",
+ "value",
+ "cost",
+ "amount",
+ "open",
+ "close",
+ "high",
+ "low",
+ ].some((priceName) => column.toLowerCase().includes(priceName));
+}
+
function loadingOverlay(message?: string, is_close?: boolean) {
const loading = window.document.getElementById("loading") as HTMLElement;
const loading_text = window.document.getElementById(
diff --git a/openbb_terminal/core/plots/table.html b/openbb_terminal/core/plots/table.html
index c608901c048..2fb789c2c33 100644
--- a/openbb_terminal/core/plots/table.html
+++ b/openbb_terminal/core/plots/table.html
@@ -79,47 +79,47 @@
}
</script>
<script type="module" crossorigin>
-function py(e,t){for(var r=0;r<t.length;r++){const n=t[r];if(typeof n!="string"&&!Array.isArray(n)){for(const i in n)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(n,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>n[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();function _1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ya={},gy={get exports(){return ya},set exports(e){ya=e}},Wa={};/*
+function my(e,t){for(var r=0;r<t.length;r++){const n=t[r];if(typeof n!="string"&&!Array.isArray(n)){for(const i in n)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(n,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>n[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();function S1(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ya={},vy={get exports(){return ya},set exports(e){ya=e}},Wa={};/*
object-assign
(c) Sindre Sorhus
@license MIT
-*/var ph=Object.getOwnPropertySymbols,my=Object.prototype.hasOwnProperty,vy=Object.prototype.propertyIsEnumerable;function xy(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function wy(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(n.join("")!=="0123456789")return!1;var i={};return"abcdefghijklmnopqrst".split("").forEach(function(o){i[o]=o}),Object.keys(Object.assign({},i)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var S1=wy()?Object.assign:function(e,t){for(var r,n=xy(e),i,o=1;o<arguments.length;o++){r=Object(arguments[o]);for(var a in r)my.call(r,a)&&(n[a]=r[a]);if(ph){i=ph(r);for(var s=0;s<i.length;s++)vy.call(r,i[s])&&(n[i[s]]=r[i[s]])}}return n},v={},yy={get exports(){return v},set exports(e){v=e}},Ie={};/** @license React v17.0.2
+*/var gh=Object.getOwnPropertySymbols,xy=Object.prototype.hasOwnProperty,wy=Object.prototype.propertyIsEnumerable;function yy(e){if(e==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function Ey(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de",Object.getOwnPropertyNames(e)[0]==="5")return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(t).map(function(o){return t[o]});if(n.join("")!=="0123456789")return!1;var i={};return"abcdefghijklmnopqrst".split("").forEach(function(o){i[o]=o}),Object.keys(Object.assign({},i)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}var T1=Ey()?Object.assign:function(e,t){for(var r,n=yy(e),i,o=1;o<arguments.length;o++){r=Object(arguments[o]);for(var a in r)xy.call(r,a)&&(n[a]=r[a]);if(gh){i=gh(r);for(var s=0;s<i.length;s++)wy.call(r,i[s])&&(n[i[s]]=r[i[s]])}}return n},v={},_y={get exports(){return v},set exports(e){v=e}},Ie={};/** @license React v17.0.2
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */var f0=S1,po=60103,T1=60106;Ie.Fragment=60107;Ie.StrictMode=60108;Ie.Profiler=60114;var C1=60109,A1=60110,R1=60112;Ie.Suspense=60113;var O1=60115,F1=60116;if(typeof Symbol=="function"&&Symbol.for){var gr=Symbol.for;po=gr("react.element"),T1=gr("react.portal"),Ie.Fragment=gr("react.fragment"),Ie.StrictMode=gr("react.strict_mode"),Ie.Profiler=gr("react.profiler"),C1=gr("react.provider"),A1=gr("react.context"),R1=gr("react.forward_ref"),Ie.Suspense=gr("react.suspense"),O1=gr("react.memo"),F1=gr("react.lazy")}var gh=typeof Symbol=="function"&&Symbol.iterator;function Ey(e){return e===null||typeof e!="object"?null:(e=gh&&e[gh]||e["@@iterator"],typeof e=="function"?e:null)}function za(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var D1={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},P1={};function go(e,t,r){this.props=e,this.context=t,this.refs=P1,this.updater=r||D1}go.prototype.isReactComponent={};go.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error(za(85));this.updater.enqueueSetState(this,e,t,"setState")};go.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function I1(){}I1.prototype=go.prototype;function d0(e,t,r){this.props=e,this.context=t,this.refs=P1,this.updater=r||D1}var h0=d0.prototype=new I1;h0.constructor=d0;f0(h0,go.prototype);h0.isPureReactComponent=!0;var p0={current:null},b1=Object.prototype.hasOwnProperty,k1={key:!0,ref:!0,__self:!0,__source:!0};function $1(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)b1.call(t,n)&&!k1.hasOwnProperty(n)&&(i[n]=t[n]);var s=arguments.length-2;if(s===1)i.children=r;else if(1<s){for(var l=Array(s),u=0;u<s;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(n in s=e.defaultProps,s)i[n]===void 0&&(i[n]=s[n]);return{$$typeof:po,type:e,key:o,ref:a,props:i,_owner:p0.current}}function _y(e,t){return{$$typeof:po,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function g0(e){return typeof e=="object"&&e!==null&&e.$$typeof===po}function Sy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(r){return t[r]})}var mh=/\/+/g;function Vu(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Sy(""+e.key):t.toString(36)}function Vs(e,t,r,n,i){var o=typeof e;(o==="undefined"||o==="boolean")&&(e=null);var a=!1;if(e===null)a=!0;else switch(o){case"string":case"number":a=!0;break;case"object":switch(e.$$typeof){case po:case T1:a=!0}}if(a)return a=e,i=i(a),e=n===""?"."+Vu(a,0):n,Array.isArray(i)?(r="",e!=null&&(r=e.replace(mh,"$&/")+"/"),Vs(i,t,r,"",function(u){return u})):i!=null&&(g0(i)&&(i=_y(i,r+(!i.key||a&&a.key===i.key?"":(""+i.key).replace(mh,"$&/")+"/")+e)),t.push(i)),1;if(a=0,n=n===""?".":n+":",Array.isArray(e))for(var s=0;s<e.length;s++){o=e[s];var l=n+Vu(o,s);a+=Vs(o,t,r,l,i)}else if(l=Ey(e),typeof l=="function")for(e=l.call(e),s=0;!(o=e.next()).done;)o=o.value,l=n+Vu(o,s++),a+=Vs(o,t,r,l,i);else if(o==="object")throw t=""+e,Error(za(31,t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t));return a}function ss(e,t,r){if(e==null)return e;var n=[],i=0;return Vs(e,n,"","",function(o){return t.call(r,o,i++)}),n}function Ty(e){if(e._status===-1){var t=e._result;t=t(),e._status=0,e._result=t,t.then(function(r){e._status===0&&(r=r.default,e._status=1,e._result=r)},function(r){e._status===0&&(e._status=2,e._result=r)})}if(e._status===1)return e._result;throw e._result}var N1={current:null};function nn(){var e=N1.current;if(e===null)throw Error(za(321));return e}var Cy={ReactCurrentDispatcher:N1,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:p0,IsSomeRendererActing:{current:!1},assign:f0};Ie.Children={map:ss,forEach:function(e,t,r){ss(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return ss(e,function(){t++}),t},toArray:function(e){return ss(e,function(t){return t})||[]},only:function(e){if(!g0(e))throw Error(za(143));return e}};Ie.Component=go;Ie.PureComponent=d0;Ie.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Cy;Ie.cloneElement=function(e,t,r){if(e==null)throw Error(za(267,e));var n=f0({},e.props),i=e.key,o=e.ref,a=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,a=p0.current),t.key!==void 0&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)b1.call(t,l)&&!k1.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&s!==void 0?s[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=r;else if(1<l){s=Array(l);for(var u=0;u<l;u++)s[u]=arguments[u+2];n.children=s}return{$$typeof:po,type:e.type,key:i,ref:o,props:n,_owner:a}};Ie.createContext=function(e,t){return t===void 0&&(t=null),e={$$typeof:A1,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider={$$typeof:C1,_context:e},e.Consumer=e};Ie.createElement=$1;Ie.createFactory=function(e){var t=$1.bind(null,e);return t.type=e,t};Ie.createRef=function(){return{current:null}};Ie.forwardRef=function(e){return{$$typeof:R1,render:e}};Ie.isValidElement=g0;Ie.lazy=function(e){return{$$typeof:F1,_payload:{_status:-1,_result:e},_init:Ty}};Ie.memo=function(e,t){return{$$typeof:O1,type:e,compare:t===void 0?null:t}};Ie.useCallback=function(e,t){return nn().useCallback(e,t)};Ie.useContext=function(e,t){return nn().useContext(e,t)};Ie.useDebugValue=function(){};Ie.useEffect=function(e,t){return nn().useEffect(e,t)};Ie.useImperativeHandle=function(e,t,r){return nn().useImperativeHandle(e,t,r)};Ie.useLayoutEffect=function(e,t){return nn().useLayoutEffect(e,t)};Ie.useMemo=function(e,t){return nn().useMemo(e,t)};Ie.useReducer=function(e,t,r){return nn().useReducer(e,t,r)};Ie.useRef=function(e){return nn().useRef(e)};Ie.useState=function(e){return nn().useState(e)};Ie.version="17.0.2";(function(e){e.exports=Ie})(yy);const ir=_1(v),Ay=py({__proto__:null,default:ir},[v]);/** @license React v17.0.2
+ */var d0=T1,po=60103,C1=60106;Ie.Fragment=60107;Ie.StrictMode=60108;Ie.Profiler=60114;var A1=60109,R1=60110,O1=60112;Ie.Suspense=60113;var F1=60115,D1=60116;if(typeof Symbol=="function"&&Symbol.for){var gr=Symbol.for;po=gr("react.element"),C1=gr("react.portal"),Ie.Fragment=gr("react.fragment"),Ie.StrictMode=gr("react.strict_mode"),Ie.Profiler=gr("react.profiler"),A1=gr("react.provider"),R1=gr("react.context"),O1=gr("react.forward_ref"),Ie.Suspense=gr("react.suspense"),F1=gr("react.memo"),D1=gr("react.lazy")}var mh=typeof Symbol=="function"&&Symbol.iterator;function Sy(e){return e===null||typeof e!="object"?null:(e=mh&&e[mh]||e["@@iterator"],typeof e=="function"?e:null)}function za(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var P1={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},I1={};function go(e,t,r){this.props=e,this.context=t,this.refs=I1,this.updater=r||P1}go.prototype.isReactComponent={};go.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error(za(85));this.updater.enqueueSetState(this,e,t,"setState")};go.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function b1(){}b1.prototype=go.prototype;function h0(e,t,r){this.props=e,this.context=t,this.refs=I1,this.updater=r||P1}var p0=h0.prototype=new b1;p0.constructor=h0;d0(p0,go.prototype);p0.isPureReactComponent=!0;var g0={current:null},k1=Object.prototype.hasOwnProperty,$1={key:!0,ref:!0,__self:!0,__source:!0};function N1(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)k1.call(t,n)&&!$1.hasOwnProperty(n)&&(i[n]=t[n]);var s=arguments.length-2;if(s===1)i.children=r;else if(1<s){for(var l=Array(s),u=0;u<s;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(n in s=e.defaultProps,s)i[n]===void 0&&(i[n]=s[n]);return{$$typeof:po,type:e,key:o,ref:a,props:i,_owner:g0.current}}function Ty(e,t){return{$$typeof:po,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function m0(e){return typeof e=="object"&&e!==null&&e.$$typeof===po}function Cy(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(r){return t[r]})}var vh=/\/+/g;function Vu(e,t){return typeof e=="object"&&e!==null&&e.key!=null?Cy(""+e.key):t.toString(36)}function Vs(e,t,r,n,i){var o=typeof e;(o==="undefined"||o==="boolean")&&(e=null);var a=!1;if(e===null)a=!0;else switch(o){case"string":case"number":a=!0;break;case"object":switch(e.$$typeof){case po:case C1:a=!0}}if(a)return a=e,i=i(a),e=n===""?"."+Vu(a,0):n,Array.isArray(i)?(r="",e!=null&&(r=e.replace(vh,"$&/")+"/"),Vs(i,t,r,"",function(u){return u})):i!=null&&(m0(i)&&(i=Ty(i,r+(!i.key||a&&a.key===i.key?"":(""+i.key).replace(vh,"$&/")+"/")+e)),t.push(i)),1;if(a=0,n=n===""?".":n+":",Array.isArray(e))for(var s=0;s<e.length;s++){o=e[s];var l=n+Vu(o,s);a+=Vs(o,t,r,l,i)}else if(l=Sy(e),typeof l=="function")for(e=l.call(e),s=0;!(o=e.next()).done;)o=o.value,l=n+Vu(o,s++),a+=Vs(o,t,r,l,i);else if(o==="object")throw t=""+e,Error(za(31,t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t));return a}function ss(e,t,r){if(e==null)return e;var n=[],i=0;return Vs(e,n,"","",function(o){return t.call(r,o,i++)}),n}function Ay(e){if(e._status===-1){var t=e._result;t=t(),e._status=0,e._result=t,t.then(function(r){e._status===0&&(r=r.default,e._status=1,e._result=r)},function(r){e._status===0&&(e._status=2,e._result=r)})}if(e._status===1)return e._result;throw e._result}var M1={current:null};function nn(){var e=M1.current;if(e===null)throw Error(za(321));return e}var Ry={ReactCurrentDispatcher:M1,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:g0,IsSomeRendererActing:{current:!1},assign:d0};Ie.Children={map:ss,forEach:function(e,t,r){ss(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return ss(e,function(){t++}),t},toArray:function(e){return ss(e,function(t){return t})||[]},only:function(e){if(!m0(e))throw Error(za(143));return e}};Ie.Component=go;Ie.PureComponent=h0;Ie.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Ry;Ie.cloneElement=function(e,t,r){if(e==null)throw Error(za(267,e));var n=d0({},e.props),i=e.key,o=e.ref,a=e._owner;if(t!=null){if(t.ref!==void 0&&(o=t.ref,a=g0.current),t.key!==void 0&&(i=""+t.key),e.type&&e.type.defaultProps)var s=e.type.defaultProps;for(l in t)k1.call(t,l)&&!$1.hasOwnProperty(l)&&(n[l]=t[l]===void 0&&s!==void 0?s[l]:t[l])}var l=arguments.length-2;if(l===1)n.children=r;else if(1<l){s=Array(l);for(var u=0;u<l;u++)s[u]=arguments[u+2];n.children=s}return{$$typeof:po,type:e.type,key:i,ref:o,props:n,_owner:a}};Ie.createContext=function(e,t){return t===void 0&&(t=null),e={$$typeof:R1,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider={$$typeof:A1,_context:e},e.Consumer=e};Ie.createElement=N1;Ie.createFactory=function(e){var t=N1.bind(null,e);return t.type=e,t};Ie.createRef=function(){return{current:null}};Ie.forwardRef=function(e){return{$$typeof:O1,render:e}};Ie.isValidElement=m0;Ie.lazy=function(e){return{$$typeof:D1,_payload:{_status:-1,_result:e},_init:Ay}};Ie.memo=function(e,t){return{$$typeof:F1,type:e,compare:t===void 0?null:t}};Ie.useCallback=function(e,t){return nn().useCallback(e,t)};Ie.useContext=function(e,t){return nn().useContext(e,t)};Ie.useDebugValue=function(){};Ie.useEffect=function(e,t){return nn().useEffect(e,t)};Ie.useImperativeHandle=function(e,t,r){return nn().useImperativeHandle(e,t,r)};Ie.useLayoutEffect=function(e,t){return nn().useLayoutEffect(e,t)};Ie.useMemo=function(e,t){return nn().useMemo(e,t)};Ie.useReducer=function(e,t,r){return nn().useReducer(e,t,r)};Ie.useRef=function(e){return nn().useRef(e)};Ie.useState=function(e){return nn().useState(e)};Ie.version="17.0.2";(function(e){e.exports=Ie})(_y);const ir=S1(v),Oy=my({__proto__:null,default:ir},[v]);/** @license React v17.0.2
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */var Ry=v,M1=60103;Wa.Fragment=60107;if(typeof Symbol=="function"&&Symbol.for){var vh=Symbol.for;M1=vh("react.element"),Wa.Fragment=vh("react.fragment")}var Oy=Ry.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Fy=Object.prototype.hasOwnProperty,Dy={key:!0,ref:!0,__self:!0,__source:!0};function L1(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)Fy.call(t,n)&&!Dy.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:M1,type:e,key:o,ref:a,props:i,_owner:Oy.current}}Wa.jsx=L1;Wa.jsxs=L1;(function(e){e.exports=Wa})(gy);const B1=ya.Fragment,K=ya.jsx,Se=ya.jsxs;var Jr={},Py={get exports(){return Jr},set exports(e){Jr=e}},hr={},Vc={},Iy={get exports(){return Vc},set exports(e){Vc=e}},U1={};/** @license React v0.20.2
+ */var Fy=v,L1=60103;Wa.Fragment=60107;if(typeof Symbol=="function"&&Symbol.for){var xh=Symbol.for;L1=xh("react.element"),Wa.Fragment=xh("react.fragment")}var Dy=Fy.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Py=Object.prototype.hasOwnProperty,Iy={key:!0,ref:!0,__self:!0,__source:!0};function B1(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)Py.call(t,n)&&!Iy.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:L1,type:e,key:o,ref:a,props:i,_owner:Dy.current}}Wa.jsx=B1;Wa.jsxs=B1;(function(e){e.exports=Wa})(vy);const U1=ya.Fragment,K=ya.jsx,Se=ya.jsxs;var Jr={},by={get exports(){return Jr},set exports(e){Jr=e}},hr={},Vc={},ky={get exports(){return Vc},set exports(e){Vc=e}},H1={};/** @license React v0.20.2
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */(function(e){var t,r,n,i;if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,s=a.now();e.unstable_now=function(){return a.now()-s}}if(typeof window>"u"||typeof MessageChannel!="function"){var l=null,u=null,c=function(){if(l!==null)try{var ee=e.unstable_now();l(!0,ee),l=null}catch(O){throw setTimeout(c,0),O}};t=function(ee){l!==null?setTimeout(t,0,ee):(l=ee,setTimeout(c,0))},r=function(ee,O){u=setTimeout(ee,O)},n=function(){clearTimeout(u)},e.unstable_shouldYield=function(){return!1},i=e.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,d=window.clearTimeout;if(typeof console<"u"){var h=window.cancelAnimationFrame;typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof h!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,p=null,g=-1,x=5,w=0;e.unstable_shouldYield=function(){return e.unstable_now()>=w},i=function(){},e.unstable_forceFrameRate=function(ee){0>ee||125<ee?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):x=0<ee?Math.floor(1e3/ee):5};var y=new MessageChannel,_=y.port2;y.port1.onmessage=function(){if(p!==null){var ee=e.unstable_now();w=ee+x;try{p(!0,ee)?_.postMessage(null):(m=!1,p=null)}catch(O){throw _.postMessage(null),O}}else m=!1},t=function(ee){p=ee,m||(m=!0,_.postMessage(null))},r=function(ee,O){g=f(function(){ee(e.unstable_now())},O)},n=function(){d(g),g=-1}}function N(ee,O){var k=ee.length;ee.push(O);e:for(;;){var b=k-1>>>1,D=ee[b];if(D!==void 0&&0<C(D,O))ee[b]=O,ee[k]=D,k=b;else break e}}function M(ee){return ee=ee[0],ee===void 0?null:ee}function S(ee){var O=ee[0];if(O!==void 0){var k=ee.pop();if(k!==O){ee[0]=k;e:for(var b=0,D=ee.length;b<D;){var H=2*(b+1)-1,G=ee[H],J=H+1,W=ee[J];if(G!==void 0&&0>C(G,k))W!==void 0&&0>C(W,G)?(ee[b]=W,ee[J]=k,b=J):(ee[b]=G,ee[H]=k,b=H);else if(W!==void 0&&0>C(W,k))ee[b]=W,ee[J]=k,b=J;else break e}}return O}return null}function C(ee,O){var k=ee.sortIndex-O.sortIndex;return k!==0?k:ee.id-O.id}var A=[],L=[],U=1,B=null,V=3,Q=!1,ne=!1,ye=!1;function ve(ee){for(var O=M(L);O!==null;){if(O.callback===null)S(L);else if(O.startTime<=ee)S(L),O.sortIndex=O.expirationTime,N(A,O);else break;O=M(L)}}function Te(ee){if(ye=!1,ve(ee),!ne)if(M(A)!==null)ne=!0,t(ie);else{var O=M(L);O!==null&&r(Te,O.startTime-ee)}}function ie(ee,O){ne=!1,ye&&(ye=!1,n()),Q=!0;var k=V;try{for(ve(O),B=M(A);B!==null&&(!(B.expirationTime>O)||ee&&!e.unstable_shouldYield());){var b=B.callback;if(typeof b=="function"){B.callback=null,V=B.priorityLevel;var D=b(B.expirationTime<=O);O=e.unstable_now(),typeof D=="function"?B.callback=D:B===M(A)&&S(A),ve(O)}else S(A);B=M(A)}if(B!==null)var H=!0;else{var G=M(L);G!==null&&r(Te,G.startTime-O),H=!1}return H}finally{B=null,V=k,Q=!1}}var Ee=i;e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(ee){ee.callback=null},e.unstable_continueExecution=function(){ne||Q||(ne=!0,t(ie))},e.unstable_getCurrentPriorityLevel=function(){return V},e.unstable_getFirstCallbackNode=function(){return M(A)},e.unstable_next=function(ee){switch(V){case 1:case 2:case 3:var O=3;break;default:O=V}var k=V;V=O;try{return ee()}finally{V=k}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=Ee,e.unstable_runWithPriority=function(ee,O){switch(ee){case 1:case 2:case 3:case 4:case 5:break;default:ee=3}var k=V;V=ee;try{return O()}finally{V=k}},e.unstable_scheduleCallback=function(ee,O,k){var b=e.unstable_now();switch(typeof k=="object"&&k!==null?(k=k.delay,k=typeof k=="number"&&0<k?b+k:b):k=b,ee){case 1:var D=-1;break;case 2:D=250;break;case 5:D=1073741823;break;case 4:D=1e4;break;default:D=5e3}return D=k+D,ee={id:U++,callback:O,priorityLevel:ee,startTime:k,expirationTime:D,sortIndex:-1},k>b?(ee.sortIndex=k,N(L,ee),M(A)===null&&ee===M(L)&&(ye?n():ye=!0,r(Te,k-b))):(ee.sortIndex=D,N(A,ee),ne||Q||(ne=!0,t(ie))),ee},e.unstable_wrapCallback=function(ee){var O=V;return function(){var k=V;V=O;try{return ee.apply(this,arguments)}finally{V=k}}}})(U1);(function(e){e.exports=U1})(Iy);/** @license React v17.0.2
+ */(function(e){var t,r,n,i;if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,s=a.now();e.unstable_now=function(){return a.now()-s}}if(typeof window>"u"||typeof MessageChannel!="function"){var l=null,u=null,c=function(){if(l!==null)try{var ee=e.unstable_now();l(!0,ee),l=null}catch(O){throw setTimeout(c,0),O}};t=function(ee){l!==null?setTimeout(t,0,ee):(l=ee,setTimeout(c,0))},r=function(ee,O){u=setTimeout(ee,O)},n=function(){clearTimeout(u)},e.unstable_shouldYield=function(){return!1},i=e.unstable_forceFrameRate=function(){}}else{var f=window.setTimeout,d=window.clearTimeout;if(typeof console<"u"){var h=window.cancelAnimationFrame;typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof h!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var m=!1,p=null,g=-1,x=5,w=0;e.unstable_shouldYield=function(){return e.unstable_now()>=w},i=function(){},e.unstable_forceFrameRate=function(ee){0>ee||125<ee?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):x=0<ee?Math.floor(1e3/ee):5};var y=new MessageChannel,_=y.port2;y.port1.onmessage=function(){if(p!==null){var ee=e.unstable_now();w=ee+x;try{p(!0,ee)?_.postMessage(null):(m=!1,p=null)}catch(O){throw _.postMessage(null),O}}else m=!1},t=function(ee){p=ee,m||(m=!0,_.postMessage(null))},r=function(ee,O){g=f(function(){ee(e.unstable_now())},O)},n=function(){d(g),g=-1}}function N(ee,O){var k=ee.length;ee.push(O);e:for(;;){var b=k-1>>>1,D=ee[b];if(D!==void 0&&0<C(D,O))ee[b]=O,ee[k]=D,k=b;else break e}}function M(ee){return ee=ee[0],ee===void 0?null:ee}function S(ee){var O=ee[0];if(O!==void 0){var k=ee.pop();if(k!==O){ee[0]=k;e:for(var b=0,D=ee.length;b<D;){var H=2*(b+1)-1,G=ee[H],J=H+1,W=ee[J];if(G!==void 0&&0>C(G,k))W!==void 0&&0>C(W,G)?(ee[b]=W,ee[J]=k,b=J):(ee[b]=G,ee[H]=k,b=H);else if(W!==void 0&&0>C(W,k))ee[b]=W,ee[J]=k,b=J;else break e}}return O}return null}function C(ee,O){var k=ee.sortIndex-O.sortIndex;return k!==0?k:ee.id-O.id}var A=[],L=[],U=1,B=null,V=3,Q=!1,ne=!1,ye=!1;function ve(ee){for(var O=M(L);O!==null;){if(O.callback===null)S(L);else if(O.startTime<=ee)S(L),O.sortIndex=O.expirationTime,N(A,O);else break;O=M(L)}}function Ce(ee){if(ye=!1,ve(ee),!ne)if(M(A)!==null)ne=!0,t(ie);else{var O=M(L);O!==null&&r(Ce,O.startTime-ee)}}function ie(ee,O){ne=!1,ye&&(ye=!1,n()),Q=!0;var k=V;try{for(ve(O),B=M(A);B!==null&&(!(B.expirationTime>O)||ee&&!e.unstable_shouldYield());){var b=B.callback;if(typeof b=="function"){B.callback=null,V=B.priorityLevel;var D=b(B.expirationTime<=O);O=e.unstable_now(),typeof D=="function"?B.callback=D:B===M(A)&&S(A),ve(O)}else S(A);B=M(A)}if(B!==null)var H=!0;else{var G=M(L);G!==null&&r(Ce,G.startTime-O),H=!1}return H}finally{B=null,V=k,Q=!1}}var Ee=i;e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(ee){ee.callback=null},e.unstable_continueExecution=function(){ne||Q||(ne=!0,t(ie))},e.unstable_getCurrentPriorityLevel=function(){return V},e.unstable_getFirstCallbackNode=function(){return M(A)},e.unstable_next=function(ee){switch(V){case 1:case 2:case 3:var O=3;break;default:O=V}var k=V;V=O;try{return ee()}finally{V=k}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=Ee,e.unstable_runWithPriority=function(ee,O){switch(ee){case 1:case 2:case 3:case 4:case 5:break;default:ee=3}var k=V;V=ee;try{return O()}finally{V=k}},e.unstable_scheduleCallback=function(ee,O,k){var b=e.unstable_now();switch(typeof k=="object"&&k!==null?(k=k.delay,k=typeof k=="number"&&0<k?b+k:b):k=b,ee){case 1:var D=-1;break;case 2:D=250;break;case 5:D=1073741823;break;case 4:D=1e4;break;default:D=5e3}return D=k+D,ee={id:U++,callback:O,priorityLevel:ee,startTime:k,expirationTime:D,sortIndex:-1},k>b?(ee.sortIndex=k,N(L,ee),M(A)===null&&ee===M(L)&&(ye?n():ye=!0,r(Ce,k-b))):(ee.sortIndex=D,N(A,ee),ne||Q||(ne=!0,t(ie))),ee},e.unstable_wrapCallback=function(ee){var O=V;return function(){var k=V;V=O;try{return ee.apply(this,arguments)}finally{V=k}}}})(H1);(function(e){e.exports=H1})(ky);/** @license React v17.0.2
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */var Yl=v,Ke=S1,pt=Vc;function se(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r<arguments.length;r++)t+="&args[]="+encodeURIComponent(arguments[r]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!Yl)throw Error(se(227));var H1=new Set,Ea={};function ui(e,t){oo(e,t),oo(e+"Capture",t)}function oo(e,t){for(Ea[e]=t,e=0;e<t.length;e++)H1.add(t[e])}var en=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),by=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF