Xianbao QIAN commited on
Commit
98f8d8e
1 Parent(s): 186881d

add /trend page

Browse files
package.json CHANGED
@@ -15,14 +15,15 @@
15
  "next": "14.2.5",
16
  "react": "^18",
17
  "react-activity-calendar": "^2.2.11",
18
- "react-dom": "^18"
 
19
  },
20
  "devDependencies": {
21
- "typescript": "^5",
22
  "@types/node": "^20",
23
  "@types/react": "^18",
24
  "@types/react-dom": "^18",
25
  "postcss": "^8",
26
- "tailwindcss": "^3.4.1"
 
27
  }
28
  }
 
15
  "next": "14.2.5",
16
  "react": "^18",
17
  "react-activity-calendar": "^2.2.11",
18
+ "react-dom": "^18",
19
+ "recharts": "^2.13.3"
20
  },
21
  "devDependencies": {
 
22
  "@types/node": "^20",
23
  "@types/react": "^18",
24
  "@types/react-dom": "^18",
25
  "postcss": "^8",
26
+ "tailwindcss": "^3.4.1",
27
+ "typescript": "^5"
28
  }
29
  }
src/pages/heatmap/index.tsx ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import ActivityCalendar from 'react-activity-calendar';
3
+ import { Tooltip } from '@mui/material';
4
+ import { PROVIDERS_MAP } from '../../utils/providers';
5
+ import { CalendarData, fetchAllModelData, generateCalendarData, aggregateCalendarData } from '../../utils/modelData';
6
+
7
+ interface OpenSourceHeatmapProps {
8
+ calendarData: CalendarData;
9
+ }
10
+
11
+ export const getStaticProps = async () => {
12
+ const allModels = await fetchAllModelData();
13
+ const calendarData = generateCalendarData(allModels);
14
+
15
+ return {
16
+ props: {
17
+ calendarData,
18
+ },
19
+ revalidate: 3600, // Revalidate every hour
20
+ };
21
+ };
22
+
23
+ const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ calendarData }) => {
24
+ const [isLoading, setIsLoading] = useState(true);
25
+ const aggregatedData = aggregateCalendarData(calendarData);
26
+
27
+ useEffect(() => {
28
+ if (calendarData && Object.keys(calendarData).length > 0) {
29
+ setIsLoading(false);
30
+ }
31
+ }, [calendarData]);
32
+
33
+ return (
34
+ <div className="w-full max-w-screen-lg mx-auto p-4">
35
+ <h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2">Chinese AI Open Source Heatmap 🤗</h1>
36
+ <p className="text-center text-sm mb-8">
37
+ The top AI labs and model releases from the awesome Chinese AI community.<br />
38
+ Huge thanks to Caleb for the excellent original work. <a href="https://huggingface.co/spaces/cfahlgren1/model-release-heatmap" target="_blank">Link</a> to the original repo
39
+ </p>
40
+ {isLoading ? (
41
+ <p className="text-center">Loading...</p>
42
+ ) : (
43
+ <div className="space-y-8 mx-10">
44
+ {/* Total Activity Heatmap */}
45
+ <div className="flex flex-col">
46
+ <h2 className="text-2xl font-bold mb-2">Total Activity</h2>
47
+ <div className="w-full overflow-x-auto">
48
+ <div className="inline-block mx-auto">
49
+ <ActivityCalendar
50
+ data={aggregatedData}
51
+ theme={{
52
+ dark: ['#161b22', '#4CAF50'],
53
+ light: ['#e0e0e0', '#4CAF50'],
54
+ }}
55
+ hideTotalCount
56
+ renderBlock={(block, activity) => (
57
+ <Tooltip
58
+ title={`${activity.count} total models created on ${activity.date}`}
59
+ arrow
60
+ >
61
+ {block}
62
+ </Tooltip>
63
+ )}
64
+ />
65
+ </div>
66
+ </div>
67
+ </div>
68
+
69
+ <h2 className="text-2xl font-bold mt-12 mb-6">Activity by Organization</h2>
70
+
71
+ {/* Individual Provider Heatmaps */}
72
+ {Object.entries(PROVIDERS_MAP)
73
+ .sort(([keyA], [keyB]) =>
74
+ calendarData[keyB].reduce((sum, day) => sum + day.count, 0) -
75
+ calendarData[keyA].reduce((sum, day) => sum + day.count, 0)
76
+ )
77
+ .map(([providerName, { color }]) => (
78
+ <div key={providerName} className="flex flex-col">
79
+ <h2 className="text-xl font-bold mb-2">{providerName}</h2>
80
+ <div className="w-full overflow-x-auto">
81
+ <div className="inline-block mx-auto">
82
+ <ActivityCalendar
83
+ data={calendarData[providerName]}
84
+ theme={{
85
+ dark: ['#161b22', color],
86
+ light: ['#e0e0e0', color],
87
+ }}
88
+ hideTotalCount
89
+ renderBlock={(block, activity) => (
90
+ <Tooltip
91
+ title={`${activity.count} models created on ${activity.date}`}
92
+ arrow
93
+ >
94
+ {block}
95
+ </Tooltip>
96
+ )}
97
+ />
98
+ </div>
99
+ </div>
100
+ </div>
101
+ ))}
102
+ </div>
103
+ )}
104
+ </div>
105
+ );
106
+ };
107
+
108
+ export default OpenSourceHeatmap;
src/pages/index.tsx CHANGED
@@ -1,145 +1,6 @@
1
- // pages/index.tsx
2
- import React, { useState, useEffect } from 'react';
3
- import ActivityCalendar from 'react-activity-calendar';
4
- import { Tooltip } from '@mui/material';
5
-
6
- interface ProviderInfo {
7
- color: string;
8
- authors: string[];
9
- }
10
-
11
- interface ModelData {
12
- createdAt: string;
13
- id: string;
14
- }
15
-
16
- interface Activity {
17
- date: string;
18
- count: number;
19
- level: number;
20
- }
21
-
22
- interface CalendarData {
23
- [key: string]: Activity[];
24
- }
25
-
26
- const PROVIDERS_MAP: Record<string, ProviderInfo> = {
27
- "BAAI": { color: "#FF7000", authors: ["BAAI"] },
28
- "DeepSeek": { color: "#1877F2", authors: ["deepseek-ai"] },
29
- "Shanghai AI Lab": { color: "#10A37F", authors: ["internlm", "OpenGVLab", "openmmlab", "Vchitect"] },
30
- "Alibaba": { color: "#FF6F00", authors: ["Qwen", "Alibaba-NLP", "alibaba-pai", "DAMO-NLP-SG", 'ali-vilab', 'modelscope', 'FunAudioLLM'] },
31
- "ZhipuAI / GLM": { color: "#4285F4", authors: ["THUDM"] },
32
- "Tencent": { color: "#1DA1F2", authors: ["TencentARC", "Tencent-Hunyuan", "h94"] },
33
- "Yi/01": { color: "#FF4500", authors: ["01-ai"] },
34
- "Multimodal Art Projection (m-a-p)": { color: "#5E35B1", authors: ["m-a-p"] }
35
- };
36
-
37
- // Generates calendar data from model data
38
- const generateCalendarData = (modelData: ModelData[]): CalendarData => {
39
- const data: CalendarData = Object.fromEntries(
40
- Object.keys(PROVIDERS_MAP).map(provider => [provider, []])
41
- );
42
-
43
- const today = new Date();
44
- const startDate = new Date(today);
45
- startDate.setMonth(today.getMonth() - 11);
46
- startDate.setDate(1);
47
-
48
- // Create a map to store counts for each provider and date
49
- const countMap: Record<string, Record<string, number>> = {};
50
-
51
- modelData.forEach(item => {
52
- console.log(item);
53
- const dateString = item.createdAt.split('T')[0];
54
- Object.entries(PROVIDERS_MAP).forEach(([provider, { authors }]) => {
55
- if (authors.some(author => item.id.startsWith(author))) {
56
- countMap[provider] = countMap[provider] || {};
57
- countMap[provider][dateString] = (countMap[provider][dateString] || 0) + 1;
58
- }
59
- });
60
- });
61
-
62
- // Fill in with 0s for days with no activity
63
- for (let d = new Date(startDate); d <= today; d.setDate(d.getDate() + 1)) {
64
- const dateString = d.toISOString().split('T')[0];
65
- Object.entries(PROVIDERS_MAP).forEach(([provider]) => {
66
- const count = countMap[provider]?.[dateString] || 0;
67
- data[provider].push({ date: dateString, count, level: 0 });
68
- });
69
- }
70
-
71
- // Calculate average counts for each provider
72
- const avgCounts = Object.fromEntries(
73
- Object.entries(data).map(([provider, days]) => [
74
- provider,
75
- days.reduce((sum, day) => sum + day.count, 0) / days.length || 0
76
- ])
77
- );
78
-
79
- // Assign levels based on count relative to average
80
- Object.entries(data).forEach(([provider, days]) => {
81
- const avgCount = avgCounts[provider];
82
- days.forEach(day => {
83
- day.level =
84
- day.count === 0 ? 0 :
85
- day.count <= avgCount * 0.5 ? 1 :
86
- day.count <= avgCount ? 2 :
87
- day.count <= avgCount * 1.5 ? 3 : 4;
88
- });
89
- });
90
-
91
- return data;
92
- };
93
-
94
- export async function getStaticProps() {
95
- try {
96
- const allAuthors = Object.values(PROVIDERS_MAP).flatMap(({ authors }) => authors);
97
- const uniqueAuthors = Array.from(new Set(allAuthors));
98
-
99
- const allModelData = await Promise.all(
100
- uniqueAuthors.map(async (author) => {
101
- const response = await fetch(`https://huggingface.co/api/models?author=${author}&sort=createdAt&direction=-1`);
102
- const data = await response.json();
103
- return data.map((item: any) => ({
104
- createdAt: item.createdAt,
105
- id: item.id,
106
- }));
107
- })
108
- );
109
-
110
- const flatModelData = allModelData.flat();
111
- const calendarData = generateCalendarData(flatModelData);
112
-
113
- return {
114
- props: {
115
- calendarData,
116
- },
117
- revalidate: 60, // Re-generate the page every hour (3600 seconds)
118
- };
119
- } catch (error) {
120
- console.error("Error fetching data:", error);
121
- return {
122
- props: {
123
- calendarData: {},
124
- },
125
- revalidate: 1,
126
- };
127
- }
128
- }
129
-
130
- interface OpenSourceHeatmapProps {
131
- calendarData: CalendarData;
132
- }
133
-
134
- const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ calendarData }) => {
135
- const [isLoading, setIsLoading] = useState(true);
136
-
137
- useEffect(() => {
138
- if (calendarData && Object.keys(calendarData).length > 0) {
139
- setIsLoading(false);
140
- }
141
- }, [calendarData]);
142
 
 
143
  return (
144
  <div className="w-full max-w-screen-lg mx-auto p-4">
145
  <h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2">Chinese AI Open Source Heatmap 🤗</h1>
@@ -147,45 +8,14 @@ const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ calendarData }) =
147
  The top AI labs and model releases from the awesome Chinese AI community.<br />
148
  Huge thanks to Caleb for the excellent original work. <a href="https://huggingface.co/spaces/cfahlgren1/model-release-heatmap" target="_blank">Link</a> to the original repo
149
  </p>
150
- {isLoading ? (
151
- <p className="text-center">Loading...</p>
152
- ) : (
153
- <div className="space-y-8 mx-10">
154
- {Object.entries(PROVIDERS_MAP)
155
- .sort(([keyA], [keyB]) =>
156
- calendarData[keyB].reduce((sum, day) => sum + day.count, 0) -
157
- calendarData[keyA].reduce((sum, day) => sum + day.count, 0)
158
- )
159
- .map(([providerName, { color }]) => (
160
- <div key={providerName} className="flex flex-col">
161
- <h2 className="text-xl font-bold mb-2">{providerName}</h2>
162
- <div className="w-full overflow-x-auto">
163
- <div className="inline-block mx-auto">
164
- <ActivityCalendar
165
- data={calendarData[providerName]}
166
- theme={{
167
- dark: ['#161b22', color],
168
- light: ['#e0e0e0', color],
169
- }}
170
- hideTotalCount
171
- renderBlock={(block, activity) => (
172
- <Tooltip
173
- title={`${activity.count} models created on ${activity.date}`}
174
- arrow
175
- >
176
- {block}
177
- </Tooltip>
178
- )}
179
- />
180
- </div>
181
- </div>
182
- </div>
183
- ))
184
- }
185
- </div>
186
- )}
187
  </div>
188
  );
189
  }
190
-
191
- export default OpenSourceHeatmap;
 
1
+ import Link from 'next/link';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ export default function Home() {
4
  return (
5
  <div className="w-full max-w-screen-lg mx-auto p-4">
6
  <h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2">Chinese AI Open Source Heatmap 🤗</h1>
 
8
  The top AI labs and model releases from the awesome Chinese AI community.<br />
9
  Huge thanks to Caleb for the excellent original work. <a href="https://huggingface.co/spaces/cfahlgren1/model-release-heatmap" target="_blank">Link</a> to the original repo
10
  </p>
11
+ <div className="flex justify-center mt-8">
12
+ <Link
13
+ href="/heatmap"
14
+ className="text-xl text-blue-600 hover:text-blue-800 hover:underline"
15
+ >
16
+ View Heatmap
17
+ </Link>
18
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </div>
20
  );
21
  }
 
 
src/pages/trend/index.tsx ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import {
3
+ LineChart,
4
+ Line,
5
+ XAxis,
6
+ YAxis,
7
+ CartesianGrid,
8
+ Tooltip,
9
+ Legend,
10
+ ResponsiveContainer
11
+ } from 'recharts';
12
+ import { PROVIDERS_MAP } from '../../utils/providers';
13
+ import {
14
+ fetchAllModelData,
15
+ generateMonthlyData,
16
+ getTotalMonthlyData,
17
+ processDetailedModelData,
18
+ MonthlyActivity,
19
+ DetailedModelData
20
+ } from '../../utils/modelData';
21
+
22
+ interface TrendProps {
23
+ monthlyData: MonthlyActivity[];
24
+ totalData: MonthlyActivity[];
25
+ detailedData: DetailedModelData[];
26
+ error?: string;
27
+ }
28
+
29
+ const COLORS = Object.fromEntries(
30
+ Object.entries(PROVIDERS_MAP).map(([provider, { color }]) => [provider, color])
31
+ );
32
+ COLORS['Total'] = '#4CAF50';
33
+
34
+ const CustomTooltip = ({ active, payload, label }: any) => {
35
+ if (active && payload && payload.length) {
36
+ return (
37
+ <div className="bg-white p-4 border border-gray-200 rounded shadow dark:bg-gray-800 dark:border-gray-700">
38
+ <p className="text-sm font-bold mb-2 dark:text-white">{label}</p>
39
+ {payload.map((entry: any) => (
40
+ <p
41
+ key={entry.name}
42
+ className="text-sm"
43
+ style={{ color: entry.color }}
44
+ >
45
+ {entry.name}: {entry.value} models
46
+ </p>
47
+ ))}
48
+ </div>
49
+ );
50
+ }
51
+ return null;
52
+ };
53
+
54
+ const formatDate = (dateStr: string) => {
55
+ const date = new Date(dateStr);
56
+ return date.toLocaleDateString('en-US', {
57
+ year: 'numeric',
58
+ month: 'short',
59
+ day: 'numeric'
60
+ });
61
+ };
62
+
63
+ const TrendPage: React.FC<TrendProps> = ({ monthlyData = [], totalData = [], detailedData = [], error }) => {
64
+ const [showTotal, setShowTotal] = useState(true);
65
+ const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
66
+ const [minLikes, setMinLikes] = useState(100);
67
+ const [isLoading, setIsLoading] = useState(false);
68
+
69
+ const toggleProvider = (provider: string) => {
70
+ setSelectedProviders(prev =>
71
+ prev.includes(provider)
72
+ ? prev.filter(p => p !== provider)
73
+ : [...prev, provider]
74
+ );
75
+ };
76
+
77
+ // Group data by provider
78
+ const providerData = Object.fromEntries(
79
+ Object.keys(PROVIDERS_MAP).map(provider => [
80
+ provider,
81
+ monthlyData.filter(d => d.provider === provider) || []
82
+ ])
83
+ );
84
+
85
+ // Filter and group detailed model data
86
+ const filteredModels = (detailedData || [])
87
+ .filter(model => {
88
+ console.log('Filtering model:', model.name, model.likes, model.provider);
89
+ return model.likes >= minLikes &&
90
+ (selectedProviders.length === 0 || selectedProviders.includes(model.provider));
91
+ })
92
+ .reduce<Record<string, DetailedModelData[]>>((acc, model) => {
93
+ if (!acc[model.monthKey]) {
94
+ acc[model.monthKey] = [];
95
+ }
96
+ acc[model.monthKey].push(model);
97
+ return acc;
98
+ }, {});
99
+
100
+ useEffect(() => {
101
+ console.log('Current filtered models:', filteredModels);
102
+ console.log('Selected providers:', selectedProviders);
103
+ console.log('Min likes:', minLikes);
104
+ }, [filteredModels, selectedProviders, minLikes]);
105
+
106
+ if (error) {
107
+ return (
108
+ <div className="w-full max-w-screen-xl mx-auto p-4">
109
+ <h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 dark:text-white">Chinese AI Model Release Trends 📈</h1>
110
+ <div className="text-center text-red-600 dark:text-red-400 mt-8">
111
+ <p>Error loading data: {error}</p>
112
+ <p className="mt-2">Please try again later.</p>
113
+ </div>
114
+ </div>
115
+ );
116
+ }
117
+
118
+ return (
119
+ <div className="w-full max-w-screen-xl mx-auto p-4">
120
+ <h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 dark:text-white">Chinese AI Model Release Trends 📈</h1>
121
+ <p className="text-center text-sm mb-8 dark:text-gray-300">
122
+ Historical trends of model releases from Chinese AI organizations
123
+ </p>
124
+
125
+ {/* Controls */}
126
+ <div className="flex flex-wrap gap-4 mb-6 justify-center items-center">
127
+ <div className="flex gap-2">
128
+ <button
129
+ onClick={() => setShowTotal(!showTotal)}
130
+ className={`px-4 py-2 rounded transition-colors ${
131
+ showTotal
132
+ ? 'bg-green-500 text-white dark:bg-green-600'
133
+ : 'bg-gray-200 dark:bg-gray-700 dark:text-gray-300'
134
+ }`}
135
+ >
136
+ Total
137
+ </button>
138
+ {Object.entries(PROVIDERS_MAP).map(([provider, { color }]) => (
139
+ <button
140
+ key={provider}
141
+ onClick={() => toggleProvider(provider)}
142
+ className={`px-4 py-2 rounded transition-colors ${
143
+ selectedProviders.includes(provider)
144
+ ? 'text-white'
145
+ : 'text-gray-900 dark:text-gray-300'
146
+ }`}
147
+ style={{
148
+ backgroundColor: selectedProviders.includes(provider)
149
+ ? color
150
+ : 'rgb(229, 231, 235)',
151
+ }}
152
+ >
153
+ {provider}
154
+ </button>
155
+ ))}
156
+ </div>
157
+ </div>
158
+
159
+ {/* Chart */}
160
+ <div className="w-full h-[600px] dark:bg-gray-900 p-4 rounded-lg">
161
+ <ResponsiveContainer width="100%" height="100%">
162
+ <LineChart
163
+ margin={{ top: 20, right: 30, left: 20, bottom: 20 }}
164
+ >
165
+ <CartesianGrid strokeDasharray="3 3" stroke="#374151" />
166
+ <XAxis
167
+ dataKey="date"
168
+ type="category"
169
+ allowDuplicatedCategory={false}
170
+ tick={{ fontSize: 12 }}
171
+ interval="preserveStartEnd"
172
+ stroke="#9CA3AF"
173
+ />
174
+ <YAxis stroke="#9CA3AF" />
175
+ <Tooltip content={<CustomTooltip />} />
176
+ <Legend />
177
+
178
+ {/* Total Line */}
179
+ {showTotal && (
180
+ <Line
181
+ data={totalData}
182
+ type="monotone"
183
+ dataKey="count"
184
+ stroke={COLORS['Total']}
185
+ name="Total"
186
+ strokeWidth={2}
187
+ dot={false}
188
+ />
189
+ )}
190
+
191
+ {/* Provider Lines */}
192
+ {selectedProviders.map(provider => (
193
+ <Line
194
+ key={provider}
195
+ data={providerData[provider]}
196
+ type="monotone"
197
+ dataKey="count"
198
+ stroke={COLORS[provider]}
199
+ name={provider}
200
+ strokeWidth={1.5}
201
+ dot={false}
202
+ />
203
+ ))}
204
+ </LineChart>
205
+ </ResponsiveContainer>
206
+ </div>
207
+
208
+ {/* Major Releases Section */}
209
+ <div className="mt-12">
210
+ <div className="flex items-center justify-between mb-6">
211
+ <h2 className="text-2xl font-bold dark:text-white">
212
+ Major Releases ({Object.values(filteredModels).flat().length})
213
+ </h2>
214
+ <div className="flex items-center gap-3 bg-white dark:bg-gray-800 px-4 py-2 rounded-lg shadow-sm">
215
+ <label className="text-sm font-medium dark:text-gray-300">Min Likes:</label>
216
+ <input
217
+ type="number"
218
+ value={minLikes}
219
+ onChange={(e) => setMinLikes(Math.max(0, parseInt(e.target.value) || 0))}
220
+ className="w-20 px-2 py-1 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white focus:outline-none focus:ring-2 focus:ring-green-500"
221
+ />
222
+ </div>
223
+ </div>
224
+ <div className="space-y-8">
225
+ {Object.entries(filteredModels)
226
+ .map(([monthKey, models]) => ({
227
+ monthKey,
228
+ models,
229
+ sortKey: models[0]?.sortKey || '' // Use the first model's sortKey
230
+ }))
231
+ .sort((a, b) => b.sortKey.localeCompare(a.sortKey)) // Sort by sortKey in descending order
232
+ .map(({ monthKey, models }) => (
233
+ <div key={monthKey} className="border-b border-gray-200 dark:border-gray-700 pb-4">
234
+ <h3 className="text-xl font-semibold mb-3 dark:text-white">{monthKey}</h3>
235
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
236
+ {models
237
+ .sort((a, b) => b.likes - a.likes) // Sort models within each month by likes
238
+ .map(model => (
239
+ <div
240
+ key={model.id}
241
+ className="p-4 rounded-lg border dark:border-gray-700 hover:shadow-md transition-shadow bg-white dark:bg-gray-800"
242
+ style={{ borderColor: COLORS[model.provider] }}
243
+ >
244
+ <div className="flex justify-between items-start">
245
+ <div>
246
+ <a
247
+ href={`https://huggingface.co/${model.id}`}
248
+ target="_blank"
249
+ rel="noopener noreferrer"
250
+ className="text-blue-600 hover:underline font-medium dark:text-blue-400"
251
+ >
252
+ {model.name}
253
+ </a>
254
+ <p className="text-sm text-gray-600 dark:text-gray-400">{model.provider}</p>
255
+ </div>
256
+ <div className="text-right">
257
+ <p className="text-sm font-medium dark:text-white">❤️ {model.likes}</p>
258
+ <p className="text-xs text-gray-500 dark:text-gray-400">{formatDate(model.createdAt)}</p>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ ))}
263
+ </div>
264
+ </div>
265
+ ))}
266
+ </div>
267
+ </div>
268
+ </div>
269
+ );
270
+ };
271
+
272
+ export const getStaticProps = async () => {
273
+ try {
274
+ const allModels = await fetchAllModelData();
275
+
276
+ if (!allModels || allModels.length === 0) {
277
+ throw new Error('Failed to fetch model data');
278
+ }
279
+
280
+ const monthlyData = generateMonthlyData(allModels);
281
+ const totalData = getTotalMonthlyData(monthlyData);
282
+ const detailedData = processDetailedModelData(allModels);
283
+
284
+ return {
285
+ props: {
286
+ monthlyData,
287
+ totalData,
288
+ detailedData,
289
+ },
290
+ revalidate: 3600, // Revalidate every hour
291
+ };
292
+ } catch (error) {
293
+ console.error('Error in getStaticProps:', error);
294
+ return {
295
+ props: {
296
+ monthlyData: [],
297
+ totalData: [],
298
+ detailedData: [],
299
+ error: 'Failed to load data. Please try again later.'
300
+ },
301
+ revalidate: 60, // Retry sooner if there was an error
302
+ };
303
+ }
304
+ };
305
+
306
+ export default TrendPage;
src/utils/modelData.ts ADDED
@@ -0,0 +1,300 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { PROVIDERS_MAP } from './providers';
2
+
3
+ export interface ModelData {
4
+ createdAt: string;
5
+ id: string;
6
+ likes?: number;
7
+ }
8
+
9
+ export interface Activity {
10
+ date: string;
11
+ count: number;
12
+ level: number;
13
+ }
14
+
15
+ export interface CalendarData {
16
+ [key: string]: Activity[];
17
+ }
18
+
19
+ export interface MonthlyActivity {
20
+ date: string; // YYYY-MM format
21
+ count: number;
22
+ provider: string;
23
+ }
24
+
25
+ export interface DetailedModelData extends ModelData {
26
+ name: string;
27
+ likes: number;
28
+ downloads: number;
29
+ monthKey: string; // YYYY-MM
30
+ provider: string;
31
+ sortKey: string; // YYYY-MM
32
+ }
33
+
34
+ // Generates calendar data from model data
35
+ export const generateCalendarData = (modelData: ModelData[]): CalendarData => {
36
+ const data: CalendarData = Object.fromEntries(
37
+ Object.keys(PROVIDERS_MAP).map(provider => [provider, []])
38
+ );
39
+
40
+ const today = new Date();
41
+ const startDate = new Date(today);
42
+ startDate.setMonth(today.getMonth() - 11);
43
+ startDate.setDate(1);
44
+
45
+ // Create a map to store counts for each provider and date
46
+ const countMap: Record<string, Record<string, number>> = {};
47
+
48
+ if (!Array.isArray(modelData)) {
49
+ console.error('Model data is not an array:', modelData);
50
+ modelData = [];
51
+ }
52
+
53
+ modelData.forEach(item => {
54
+ const [org] = item.id.split('/');
55
+ const provider = Object.entries(PROVIDERS_MAP).find(([_, info]) =>
56
+ info.authors.includes(org)
57
+ )?.[0];
58
+
59
+ if (provider) {
60
+ const date = item.createdAt.split('T')[0];
61
+ if (!countMap[provider]) {
62
+ countMap[provider] = {};
63
+ }
64
+ countMap[provider][date] = (countMap[provider][date] || 0) + 1;
65
+ }
66
+ });
67
+
68
+ // Fill in the data array with actual counts and zero counts
69
+ Object.keys(PROVIDERS_MAP).forEach(provider => {
70
+ let currentDate = new Date(startDate);
71
+ while (currentDate <= today) {
72
+ const dateStr = currentDate.toISOString().split('T')[0];
73
+ const count = countMap[provider]?.[dateStr] || 0;
74
+ data[provider].push({
75
+ date: dateStr,
76
+ count,
77
+ level: count === 0 ? 0 : Math.min(4, Math.ceil(count / 2))
78
+ });
79
+ currentDate.setDate(currentDate.getDate() + 1);
80
+ }
81
+ });
82
+
83
+ return data;
84
+ };
85
+
86
+ // Aggregates calendar data from all providers into a single heatmap
87
+ export const aggregateCalendarData = (calendarData: CalendarData): Activity[] => {
88
+ if (Object.keys(calendarData).length === 0) return [];
89
+
90
+ // Get the first provider's data to get the date range
91
+ const firstProviderData = Object.values(calendarData)[0];
92
+
93
+ // Create a map to store aggregated counts by date
94
+ const aggregatedCounts: Record<string, number> = {};
95
+
96
+ // Sum up counts for each date across all providers
97
+ Object.values(calendarData).forEach(providerData => {
98
+ providerData.forEach(activity => {
99
+ aggregatedCounts[activity.date] = (aggregatedCounts[activity.date] || 0) + activity.count;
100
+ });
101
+ });
102
+
103
+ // Convert the aggregated counts into Activity array
104
+ return firstProviderData.map(({ date }) => {
105
+ const count = aggregatedCounts[date] || 0;
106
+ return {
107
+ date,
108
+ count,
109
+ level: count === 0 ? 0 : Math.min(4, Math.ceil(count / 3))
110
+ };
111
+ });
112
+ };
113
+
114
+ export const generateMonthlyData = (modelData: ModelData[]): MonthlyActivity[] => {
115
+ if (!Array.isArray(modelData)) {
116
+ console.error('Model data is not an array:', modelData);
117
+ return [];
118
+ }
119
+
120
+ // Create a map to store counts for each provider and month
121
+ const monthlyMap: Record<string, Record<string, number>> = {};
122
+
123
+ modelData.forEach(item => {
124
+ const [org] = item.id.split('/');
125
+ const provider = Object.entries(PROVIDERS_MAP).find(([_, info]) =>
126
+ info.authors.includes(org)
127
+ )?.[0];
128
+
129
+ if (provider) {
130
+ const date = item.createdAt.substring(0, 7); // Get YYYY-MM
131
+ if (!monthlyMap[provider]) {
132
+ monthlyMap[provider] = {};
133
+ }
134
+ monthlyMap[provider][date] = (monthlyMap[provider][date] || 0) + 1;
135
+ }
136
+ });
137
+
138
+ // Convert the map to an array of monthly activities
139
+ const monthlyActivities: MonthlyActivity[] = [];
140
+
141
+ // Get all unique months across all providers
142
+ const allMonths = new Set<string>();
143
+ Object.values(monthlyMap).forEach(providerData => {
144
+ Object.keys(providerData).forEach(month => allMonths.add(month));
145
+ });
146
+
147
+ // Sort months chronologically
148
+ const sortedMonths = Array.from(allMonths).sort();
149
+
150
+ // Create entries for each provider and month
151
+ Object.entries(monthlyMap).forEach(([provider, data]) => {
152
+ sortedMonths.forEach(month => {
153
+ monthlyActivities.push({
154
+ date: month,
155
+ count: data[month] || 0,
156
+ provider
157
+ });
158
+ });
159
+ });
160
+
161
+ return monthlyActivities;
162
+ };
163
+
164
+ const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
165
+
166
+ async function fetchWithRetry(url: string, retries = 3, delayMs = 1000): Promise<Response> {
167
+ for (let i = 0; i < retries; i++) {
168
+ try {
169
+ const response = await fetch(url);
170
+ if (response.status === 429) { // Rate limit exceeded
171
+ console.log(`Rate limit exceeded, waiting ${delayMs}ms before retry ${i + 1}/${retries}`);
172
+ await delay(delayMs);
173
+ continue;
174
+ }
175
+ return response;
176
+ } catch (error) {
177
+ if (i === retries - 1) throw error;
178
+ console.log(`Fetch failed, retrying (${i + 1}/${retries})...`);
179
+ await delay(delayMs);
180
+ }
181
+ }
182
+ throw new Error('Max retries reached');
183
+ }
184
+
185
+ export async function fetchAllModelData(): Promise<ModelData[]> {
186
+ console.log('Starting to fetch model data...');
187
+ const allModels: ModelData[] = [];
188
+ const failedProviders: string[] = [];
189
+
190
+ for (const [provider, info] of Object.entries(PROVIDERS_MAP)) {
191
+ console.log(`Fetching models for provider: ${provider}`);
192
+ try {
193
+ const response = await fetchWithRetry(
194
+ `https://huggingface.co/api/models?author=${info.authors[0]}&sort=likes&direction=-1&limit=100`,
195
+ 3,
196
+ 2000 // 2 second delay between retries
197
+ );
198
+
199
+ if (!response.ok) {
200
+ console.error(`Failed to fetch data for ${provider}:`, response.status, response.statusText);
201
+ failedProviders.push(provider);
202
+ continue;
203
+ }
204
+
205
+ const models = await response.json();
206
+ console.log(`Received ${models.length} models for ${provider}`);
207
+
208
+ allModels.push(
209
+ ...models.map((model: any) => {
210
+ const date = new Date(model.createdAt);
211
+ return {
212
+ id: model.id,
213
+ name: model.modelId,
214
+ likes: model.likes || 0,
215
+ createdAt: model.createdAt,
216
+ provider,
217
+ monthKey: date.toLocaleDateString('en-US', {
218
+ year: 'numeric',
219
+ month: 'long'
220
+ }),
221
+ sortKey: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`
222
+ };
223
+ })
224
+ );
225
+
226
+ // Add a small delay between requests to avoid rate limiting
227
+ await delay(500);
228
+ } catch (error) {
229
+ console.error(`Error fetching data for ${provider}:`, error);
230
+ failedProviders.push(provider);
231
+ }
232
+ }
233
+
234
+ if (failedProviders.length > 0) {
235
+ console.warn('Failed to fetch data for providers:', failedProviders);
236
+ }
237
+
238
+ console.log(`Total models fetched: ${allModels.length}`);
239
+ return allModels.sort((a, b) => {
240
+ // First sort by sortKey (year-month) in descending order
241
+ const dateCompare = b.sortKey.localeCompare(a.sortKey);
242
+ if (dateCompare !== 0) return dateCompare;
243
+ // Then by likes for models in the same month
244
+ return b.likes - a.likes;
245
+ });
246
+ }
247
+
248
+ export function processDetailedModelData(models: ModelData[]): DetailedModelData[] {
249
+ if (!models || models.length === 0) {
250
+ console.log('No models to process');
251
+ return [];
252
+ }
253
+
254
+ console.log('Processing detailed model data...');
255
+ console.log('Input models:', models.length);
256
+
257
+ // Group models by month
258
+ const groupedModels = models.reduce<Record<string, DetailedModelData[]>>((acc, model) => {
259
+ if (!acc[model.monthKey]) {
260
+ acc[model.monthKey] = [];
261
+ }
262
+ acc[model.monthKey].push(model as DetailedModelData);
263
+ return acc;
264
+ }, {});
265
+
266
+ // Sort each month's models by likes
267
+ Object.values(groupedModels).forEach(monthModels => {
268
+ monthModels.sort((a, b) => b.likes - a.likes);
269
+ });
270
+
271
+ const processed = Object.entries(groupedModels)
272
+ .sort((a, b) => {
273
+ const [monthKeyA, modelsA] = a;
274
+ const [monthKeyB, modelsB] = b;
275
+ return modelsB[0].sortKey.localeCompare(modelsA[0].sortKey);
276
+ })
277
+ .flatMap(([_, models]) => models);
278
+
279
+ console.log('Processed models:', processed.length);
280
+ console.log('Sample model:', processed[0]);
281
+
282
+ return processed;
283
+ }
284
+
285
+ // Helper function to get total monthly data across all providers
286
+ export const getTotalMonthlyData = (monthlyData: MonthlyActivity[]): MonthlyActivity[] => {
287
+ const totalByMonth: Record<string, number> = {};
288
+
289
+ monthlyData.forEach(({ date, count }) => {
290
+ totalByMonth[date] = (totalByMonth[date] || 0) + count;
291
+ });
292
+
293
+ return Object.entries(totalByMonth)
294
+ .map(([date, count]) => ({
295
+ date,
296
+ count,
297
+ provider: 'Total'
298
+ }))
299
+ .sort((a, b) => a.date.localeCompare(b.date));
300
+ };
src/utils/providers.ts ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export interface ProviderInfo {
2
+ color: string;
3
+ authors: string[];
4
+ }
5
+
6
+ export const PROVIDERS_MAP: Record<string, ProviderInfo> = {
7
+ "BAAI": { color: "#FF7000", authors: ["BAAI"] },
8
+ "DeepSeek": { color: "#1877F2", authors: ["deepseek-ai"] },
9
+ "Shanghai AI Lab": { color: "#10A37F", authors: ["internlm", "OpenGVLab", "openmmlab", "Vchitect"] },
10
+ "Alibaba": { color: "#FF6F00", authors: ["Qwen", "Alibaba-NLP", "alibaba-pai", "DAMO-NLP-SG", 'ali-vilab', 'modelscope', 'FunAudioLLM'] },
11
+ "ZhipuAI / GLM": { color: "#4285F4", authors: ["THUDM"] },
12
+ "Tencent": { color: "#1DA1F2", authors: ["TencentARC", "Tencent-Hunyuan", "h94"] },
13
+ "Yi/01": { color: "#FF4500", authors: ["01-ai"] },
14
+ "Multimodal Art Projection (m-a-p)": { color: "#5E35B1", authors: ["m-a-p"] }
15
+ };
yarn.lock CHANGED
@@ -2,14 +2,6 @@
2
  # yarn lockfile v1
3
 
4
 
5
- "@75lb/deep-merge@^1.1.1":
6
- version "1.1.1"
7
- resolved "https://registry.yarnpkg.com/@75lb/deep-merge/-/deep-merge-1.1.1.tgz#3b06155b90d34f5f8cc2107d796f1853ba02fd6d"
8
- integrity sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==
9
- dependencies:
10
- lodash.assignwith "^4.2.0"
11
- typical "^7.1.1"
12
-
13
  "@alloc/quick-lru@^5.2.0":
14
  version "5.2.0"
15
  resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
@@ -106,13 +98,6 @@
106
  "@babel/helper-validator-identifier" "^7.24.7"
107
  to-fast-properties "^2.0.0"
108
 
109
- "@duckdb/duckdb-wasm@^1.28.1-dev106.0":
110
- version "1.28.1-dev106.0"
111
- resolved "https://registry.yarnpkg.com/@duckdb/duckdb-wasm/-/duckdb-wasm-1.28.1-dev106.0.tgz#43e71fd705fd47cac02ef8af9b58356669537748"
112
- integrity sha512-HcA9q/Yq1t8nAIg2rl8DmOTjKy1tAHSdBGHlCcWAm5StsfAjcm+f0STBEH3hmWPk0qEtOJF30OR+GfeyUOP+hA==
113
- dependencies:
114
- apache-arrow "^14.0.1"
115
-
116
  "@emotion/babel-plugin@^11.12.0":
117
  version "11.12.0"
118
  resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
@@ -436,20 +421,56 @@
436
  resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.4.tgz#254dddff54568ff8e5d0dcdb071871a458fdfd31"
437
  integrity sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==
438
 
439
- "@types/command-line-args@5.2.0":
440
- version "5.2.0"
441
- resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.2.0.tgz#adbb77980a1cc376bb208e3f4142e907410430f6"
442
- integrity sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==
443
 
444
- "@types/command-line-usage@5.0.2":
445
- version "5.0.2"
446
- resolved "https://registry.yarnpkg.com/@types/command-line-usage/-/command-line-usage-5.0.2.tgz#ba5e3f6ae5a2009d466679cc431b50635bf1a064"
447
- integrity sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
448
 
449
- "@types/node@20.3.0":
450
- version "20.3.0"
451
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.0.tgz#719498898d5defab83c3560f45d8498f58d11938"
452
- integrity sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
 
454
  "@types/node@^20":
455
  version "20.14.13"
@@ -458,11 +479,6 @@
458
  dependencies:
459
  undici-types "~5.26.4"
460
 
461
- "@types/pad-left@2.1.1":
462
- version "2.1.1"
463
- resolved "https://registry.yarnpkg.com/@types/pad-left/-/pad-left-2.1.1.tgz#17d906fc75804e1cc722da73623f1d978f16a137"
464
- integrity sha512-Xd22WCRBydkGSApl5Bw0PhAOHKSVjNL3E3AwzKaps96IMraPqy5BvZIsBVK6JLwdybUzjHnuWVwpDd0JjTfHXA==
465
-
466
  "@types/parse-json@^4.0.0":
467
  version "4.0.2"
468
  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
@@ -517,7 +533,7 @@ ansi-styles@^3.2.1:
517
  dependencies:
518
  color-convert "^1.9.0"
519
 
520
- ansi-styles@^4.0.0, ansi-styles@^4.1.0:
521
  version "4.3.0"
522
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
523
  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@@ -542,37 +558,11 @@ anymatch@~3.1.2:
542
  normalize-path "^3.0.0"
543
  picomatch "^2.0.4"
544
 
545
- apache-arrow@^14.0.1:
546
- version "14.0.2"
547
- resolved "https://registry.yarnpkg.com/apache-arrow/-/apache-arrow-14.0.2.tgz#737f7b8211ef99a2c137dcc9d2001b469efb0344"
548
- integrity sha512-EBO2xJN36/XoY81nhLcwCJgFwkboDZeyNQ+OPsG7bCoQjc2BT0aTyH/MR6SrL+LirSNz+cYqjGRlupMMlP1aEg==
549
- dependencies:
550
- "@types/command-line-args" "5.2.0"
551
- "@types/command-line-usage" "5.0.2"
552
- "@types/node" "20.3.0"
553
- "@types/pad-left" "2.1.1"
554
- command-line-args "5.2.1"
555
- command-line-usage "7.0.1"
556
- flatbuffers "23.5.26"
557
- json-bignum "^0.0.3"
558
- pad-left "^2.1.0"
559
- tslib "^2.5.3"
560
-
561
  arg@^5.0.2:
562
  version "5.0.2"
563
  resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
564
  integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
565
 
566
- array-back@^3.0.1, array-back@^3.1.0:
567
- version "3.1.0"
568
- resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
569
- integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
570
-
571
- array-back@^6.2.2:
572
- version "6.2.2"
573
- resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157"
574
- integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==
575
-
576
  babel-plugin-macros@^3.1.0:
577
  version "3.1.0"
578
  resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
@@ -628,13 +618,6 @@ caniuse-lite@^1.0.30001579:
628
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz#4c4b7427683dea1170a152cd1654be8d0da7bd71"
629
  integrity sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==
630
 
631
- chalk-template@^0.4.0:
632
- version "0.4.0"
633
- resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b"
634
- integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==
635
- dependencies:
636
- chalk "^4.1.2"
637
-
638
  chalk@^2.4.2:
639
  version "2.4.2"
640
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -644,14 +627,6 @@ chalk@^2.4.2:
644
  escape-string-regexp "^1.0.5"
645
  supports-color "^5.3.0"
646
 
647
- chalk@^4.1.2:
648
- version "4.1.2"
649
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
650
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
651
- dependencies:
652
- ansi-styles "^4.1.0"
653
- supports-color "^7.1.0"
654
-
655
  chokidar@^3.5.3:
656
  version "3.6.0"
657
  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
@@ -706,36 +681,6 @@ color-name@~1.1.4:
706
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
707
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
708
 
709
- command-line-args@5.2.1, command-line-args@^5.2.1:
710
- version "5.2.1"
711
- resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e"
712
- integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
713
- dependencies:
714
- array-back "^3.1.0"
715
- find-replace "^3.0.0"
716
- lodash.camelcase "^4.3.0"
717
- typical "^4.0.0"
718
-
719
- command-line-usage@7.0.1:
720
- version "7.0.1"
721
- resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.1.tgz#e540afef4a4f3bc501b124ffde33956309100655"
722
- integrity sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==
723
- dependencies:
724
- array-back "^6.2.2"
725
- chalk-template "^0.4.0"
726
- table-layout "^3.0.0"
727
- typical "^7.1.1"
728
-
729
- command-line-usage@^7.0.0:
730
- version "7.0.3"
731
- resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.3.tgz#6bce992354f6af10ecea2b631bfdf0c8b3bfaea3"
732
- integrity sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==
733
- dependencies:
734
- array-back "^6.2.2"
735
- chalk-template "^0.4.0"
736
- table-layout "^4.1.0"
737
- typical "^7.1.1"
738
-
739
  commander@^4.0.0:
740
  version "4.1.1"
741
  resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
@@ -776,6 +721,77 @@ csstype@^3.0.2, csstype@^3.1.3:
776
  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
777
  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
778
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
779
  date-fns@^3.6.0:
780
  version "3.6.0"
781
  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
@@ -788,6 +804,11 @@ debug@^4.3.1:
788
  dependencies:
789
  ms "2.1.2"
790
 
 
 
 
 
 
791
  didyoumean@^1.2.2:
792
  version "1.2.2"
793
  resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
@@ -838,6 +859,16 @@ escape-string-regexp@^4.0.0:
838
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
839
  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
840
 
 
 
 
 
 
 
 
 
 
 
841
  fast-glob@^3.3.0:
842
  version "3.3.2"
843
  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
@@ -863,23 +894,11 @@ fill-range@^7.1.1:
863
  dependencies:
864
  to-regex-range "^5.0.1"
865
 
866
- find-replace@^3.0.0:
867
- version "3.0.0"
868
- resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
869
- integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
870
- dependencies:
871
- array-back "^3.0.1"
872
-
873
  find-root@^1.1.0:
874
  version "1.1.0"
875
  resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
876
  integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
877
 
878
- flatbuffers@23.5.26:
879
- version "23.5.26"
880
- resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-23.5.26.tgz#01358e272a61239f0faf3bfbe4e014f3ace9d746"
881
- integrity sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==
882
-
883
  foreground-child@^3.1.0:
884
  version "3.2.1"
885
  resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
@@ -939,11 +958,6 @@ has-flag@^3.0.0:
939
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
940
  integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
941
 
942
- has-flag@^4.0.0:
943
- version "4.0.0"
944
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
945
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
946
-
947
  hasown@^2.0.2:
948
  version "2.0.2"
949
  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
@@ -966,6 +980,11 @@ import-fresh@^3.2.1:
966
  parent-module "^1.0.0"
967
  resolve-from "^4.0.0"
968
 
 
 
 
 
 
969
  is-arrayish@^0.2.1:
970
  version "0.2.1"
971
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -1036,11 +1055,6 @@ jsesc@^2.5.1:
1036
  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
1037
  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
1038
 
1039
- json-bignum@^0.0.3:
1040
- version "0.0.3"
1041
- resolved "https://registry.yarnpkg.com/json-bignum/-/json-bignum-0.0.3.tgz#41163b50436c773d82424dbc20ed70db7604b8d7"
1042
- integrity sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==
1043
-
1044
  json-parse-even-better-errors@^2.3.0:
1045
  version "2.3.1"
1046
  resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
@@ -1061,15 +1075,10 @@ lines-and-columns@^1.1.6:
1061
  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
1062
  integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
1063
 
1064
- lodash.assignwith@^4.2.0:
1065
- version "4.2.0"
1066
- resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb"
1067
- integrity sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==
1068
-
1069
- lodash.camelcase@^4.3.0:
1070
- version "4.3.0"
1071
- resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
1072
- integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
1073
 
1074
  loose-envify@^1.1.0, loose-envify@^1.4.0:
1075
  version "1.4.0"
@@ -1170,13 +1179,6 @@ package-json-from-dist@^1.0.0:
1170
  resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
1171
  integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
1172
 
1173
- pad-left@^2.1.0:
1174
- version "2.1.0"
1175
- resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-2.1.0.tgz#16e6a3b2d44a8e138cb0838cc7cb403a4fc9e994"
1176
- integrity sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==
1177
- dependencies:
1178
- repeat-string "^1.5.4"
1179
-
1180
  parent-module@^1.0.0:
1181
  version "1.0.1"
1182
  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -1349,6 +1351,15 @@ react-is@^18.3.1:
1349
  resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
1350
  integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
1351
 
 
 
 
 
 
 
 
 
 
1352
  react-transition-group@^4.4.5:
1353
  version "4.4.5"
1354
  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
@@ -1380,16 +1391,32 @@ readdirp@~3.6.0:
1380
  dependencies:
1381
  picomatch "^2.2.1"
1382
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1383
  regenerator-runtime@^0.14.0:
1384
  version "0.14.1"
1385
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
1386
  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
1387
 
1388
- repeat-string@^1.5.4:
1389
- version "1.6.1"
1390
- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
1391
- integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
1392
-
1393
  resolve-from@^4.0.0:
1394
  version "4.0.0"
1395
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -1450,17 +1477,13 @@ source-map@^0.5.7:
1450
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
1451
  integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
1452
 
1453
- stream-read-all@^3.0.1:
1454
- version "3.0.1"
1455
- resolved "https://registry.yarnpkg.com/stream-read-all/-/stream-read-all-3.0.1.tgz#60762ae45e61d93ba0978cda7f3913790052ad96"
1456
- integrity sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==
1457
-
1458
  streamsearch@^1.1.0:
1459
  version "1.1.0"
1460
  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
1461
  integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
1462
 
1463
  "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
 
1464
  version "4.2.3"
1465
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1466
  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -1479,6 +1502,7 @@ string-width@^5.0.1, string-width@^5.1.2:
1479
  strip-ansi "^7.0.1"
1480
 
1481
  "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
 
1482
  version "6.0.1"
1483
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1484
  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -1524,40 +1548,11 @@ supports-color@^5.3.0:
1524
  dependencies:
1525
  has-flag "^3.0.0"
1526
 
1527
- supports-color@^7.1.0:
1528
- version "7.2.0"
1529
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1530
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1531
- dependencies:
1532
- has-flag "^4.0.0"
1533
-
1534
  supports-preserve-symlinks-flag@^1.0.0:
1535
  version "1.0.0"
1536
  resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
1537
  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
1538
 
1539
- table-layout@^3.0.0:
1540
- version "3.0.2"
1541
- resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-3.0.2.tgz#69c2be44388a5139b48c59cf21e73b488021769a"
1542
- integrity sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==
1543
- dependencies:
1544
- "@75lb/deep-merge" "^1.1.1"
1545
- array-back "^6.2.2"
1546
- command-line-args "^5.2.1"
1547
- command-line-usage "^7.0.0"
1548
- stream-read-all "^3.0.1"
1549
- typical "^7.1.1"
1550
- wordwrapjs "^5.1.0"
1551
-
1552
- table-layout@^4.1.0:
1553
- version "4.1.0"
1554
- resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-4.1.0.tgz#533573a037aad6abffc45911be14c79d1c43aaa6"
1555
- integrity sha512-AfbFMOsAZDoaQq2sDF/F7PSTxnTBexr4cuArFW1bMl07tFbB+HBwKpnw99To3ffcjRFe12dEoyckiNz1+qCSng==
1556
- dependencies:
1557
- "@75lb/deep-merge" "^1.1.1"
1558
- array-back "^6.2.2"
1559
- wordwrapjs "^5.1.0"
1560
-
1561
  tailwindcss@^3.4.1:
1562
  version "3.4.7"
1563
  resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201"
@@ -1600,6 +1595,11 @@ thenify-all@^1.0.0:
1600
  dependencies:
1601
  any-promise "^1.0.0"
1602
 
 
 
 
 
 
1603
  to-fast-properties@^2.0.0:
1604
  version "2.0.0"
1605
  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -1617,7 +1617,7 @@ ts-interface-checker@^0.1.9:
1617
  resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
1618
  integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
1619
 
1620
- tslib@^2.4.0, tslib@^2.5.3:
1621
  version "2.6.3"
1622
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
1623
  integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
@@ -1627,16 +1627,6 @@ typescript@^5:
1627
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
1628
  integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
1629
 
1630
- typical@^4.0.0:
1631
- version "4.0.0"
1632
- resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4"
1633
- integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
1634
-
1635
- typical@^7.1.1:
1636
- version "7.1.1"
1637
- resolved "https://registry.yarnpkg.com/typical/-/typical-7.1.1.tgz#ba177ab7ab103b78534463ffa4c0c9754523ac1f"
1638
- integrity sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==
1639
-
1640
  undici-types@~5.26.4:
1641
  version "5.26.5"
1642
  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
@@ -1647,6 +1637,26 @@ util-deprecate@^1.0.2:
1647
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1648
  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
1649
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1650
  which@^2.0.1:
1651
  version "2.0.2"
1652
  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
@@ -1654,11 +1664,6 @@ which@^2.0.1:
1654
  dependencies:
1655
  isexe "^2.0.0"
1656
 
1657
- wordwrapjs@^5.1.0:
1658
- version "5.1.0"
1659
- resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.0.tgz#4c4d20446dcc670b14fa115ef4f8fd9947af2b3a"
1660
- integrity sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==
1661
-
1662
  "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
1663
  version "7.0.0"
1664
  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
 
2
  # yarn lockfile v1
3
 
4
 
 
 
 
 
 
 
 
 
5
  "@alloc/quick-lru@^5.2.0":
6
  version "5.2.0"
7
  resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
 
98
  "@babel/helper-validator-identifier" "^7.24.7"
99
  to-fast-properties "^2.0.0"
100
 
 
 
 
 
 
 
 
101
  "@emotion/babel-plugin@^11.12.0":
102
  version "11.12.0"
103
  resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
 
421
  resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.4.tgz#254dddff54568ff8e5d0dcdb071871a458fdfd31"
422
  integrity sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==
423
 
424
+ "@types/d3-array@^3.0.3":
425
+ version "3.2.1"
426
+ resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5"
427
+ integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==
428
 
429
+ "@types/d3-color@*":
430
+ version "3.1.3"
431
+ resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2"
432
+ integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==
433
+
434
+ "@types/d3-ease@^3.0.0":
435
+ version "3.0.2"
436
+ resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b"
437
+ integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==
438
+
439
+ "@types/d3-interpolate@^3.0.1":
440
+ version "3.0.4"
441
+ resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c"
442
+ integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==
443
+ dependencies:
444
+ "@types/d3-color" "*"
445
+
446
+ "@types/d3-path@*":
447
+ version "3.1.0"
448
+ resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a"
449
+ integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==
450
 
451
+ "@types/d3-scale@^4.0.2":
452
+ version "4.0.8"
453
+ resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb"
454
+ integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==
455
+ dependencies:
456
+ "@types/d3-time" "*"
457
+
458
+ "@types/d3-shape@^3.1.0":
459
+ version "3.1.6"
460
+ resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72"
461
+ integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==
462
+ dependencies:
463
+ "@types/d3-path" "*"
464
+
465
+ "@types/d3-time@*", "@types/d3-time@^3.0.0":
466
+ version "3.0.4"
467
+ resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f"
468
+ integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==
469
+
470
+ "@types/d3-timer@^3.0.0":
471
+ version "3.0.2"
472
+ resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70"
473
+ integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==
474
 
475
  "@types/node@^20":
476
  version "20.14.13"
 
479
  dependencies:
480
  undici-types "~5.26.4"
481
 
 
 
 
 
 
482
  "@types/parse-json@^4.0.0":
483
  version "4.0.2"
484
  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
 
533
  dependencies:
534
  color-convert "^1.9.0"
535
 
536
+ ansi-styles@^4.0.0:
537
  version "4.3.0"
538
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
539
  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
 
558
  normalize-path "^3.0.0"
559
  picomatch "^2.0.4"
560
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
561
  arg@^5.0.2:
562
  version "5.0.2"
563
  resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
564
  integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
565
 
 
 
 
 
 
 
 
 
 
 
566
  babel-plugin-macros@^3.1.0:
567
  version "3.1.0"
568
  resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
 
618
  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz#4c4b7427683dea1170a152cd1654be8d0da7bd71"
619
  integrity sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==
620
 
 
 
 
 
 
 
 
621
  chalk@^2.4.2:
622
  version "2.4.2"
623
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
 
627
  escape-string-regexp "^1.0.5"
628
  supports-color "^5.3.0"
629
 
 
 
 
 
 
 
 
 
630
  chokidar@^3.5.3:
631
  version "3.6.0"
632
  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
 
681
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
682
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
684
  commander@^4.0.0:
685
  version "4.1.1"
686
  resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
 
721
  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
722
  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
723
 
724
+ "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
725
+ version "3.2.4"
726
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
727
+ integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
728
+ dependencies:
729
+ internmap "1 - 2"
730
+
731
+ "d3-color@1 - 3":
732
+ version "3.1.0"
733
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
734
+ integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
735
+
736
+ d3-ease@^3.0.1:
737
+ version "3.0.1"
738
+ resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
739
+ integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
740
+
741
+ "d3-format@1 - 3":
742
+ version "3.1.0"
743
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
744
+ integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
745
+
746
+ "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
747
+ version "3.0.1"
748
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
749
+ integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
750
+ dependencies:
751
+ d3-color "1 - 3"
752
+
753
+ d3-path@^3.1.0:
754
+ version "3.1.0"
755
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
756
+ integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
757
+
758
+ d3-scale@^4.0.2:
759
+ version "4.0.2"
760
+ resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
761
+ integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
762
+ dependencies:
763
+ d3-array "2.10.0 - 3"
764
+ d3-format "1 - 3"
765
+ d3-interpolate "1.2.0 - 3"
766
+ d3-time "2.1.1 - 3"
767
+ d3-time-format "2 - 4"
768
+
769
+ d3-shape@^3.1.0:
770
+ version "3.2.0"
771
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
772
+ integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
773
+ dependencies:
774
+ d3-path "^3.1.0"
775
+
776
+ "d3-time-format@2 - 4":
777
+ version "4.1.0"
778
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
779
+ integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
780
+ dependencies:
781
+ d3-time "1 - 3"
782
+
783
+ "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0:
784
+ version "3.1.0"
785
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
786
+ integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
787
+ dependencies:
788
+ d3-array "2 - 3"
789
+
790
+ d3-timer@^3.0.1:
791
+ version "3.0.1"
792
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
793
+ integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
794
+
795
  date-fns@^3.6.0:
796
  version "3.6.0"
797
  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
 
804
  dependencies:
805
  ms "2.1.2"
806
 
807
+ decimal.js-light@^2.4.1:
808
+ version "2.5.1"
809
+ resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934"
810
+ integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==
811
+
812
  didyoumean@^1.2.2:
813
  version "1.2.2"
814
  resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
 
859
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
860
  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
861
 
862
+ eventemitter3@^4.0.1:
863
+ version "4.0.7"
864
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
865
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
866
+
867
+ fast-equals@^5.0.1:
868
+ version "5.0.1"
869
+ resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d"
870
+ integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==
871
+
872
  fast-glob@^3.3.0:
873
  version "3.3.2"
874
  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
 
894
  dependencies:
895
  to-regex-range "^5.0.1"
896
 
 
 
 
 
 
 
 
897
  find-root@^1.1.0:
898
  version "1.1.0"
899
  resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
900
  integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
901
 
 
 
 
 
 
902
  foreground-child@^3.1.0:
903
  version "3.2.1"
904
  resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
 
958
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
959
  integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
960
 
 
 
 
 
 
961
  hasown@^2.0.2:
962
  version "2.0.2"
963
  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
 
980
  parent-module "^1.0.0"
981
  resolve-from "^4.0.0"
982
 
983
+ "internmap@1 - 2":
984
+ version "2.0.3"
985
+ resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
986
+ integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
987
+
988
  is-arrayish@^0.2.1:
989
  version "0.2.1"
990
  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
 
1055
  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
1056
  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
1057
 
 
 
 
 
 
1058
  json-parse-even-better-errors@^2.3.0:
1059
  version "2.3.1"
1060
  resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
 
1075
  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
1076
  integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
1077
 
1078
+ lodash@^4.17.21:
1079
+ version "4.17.21"
1080
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
1081
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 
 
 
 
 
1082
 
1083
  loose-envify@^1.1.0, loose-envify@^1.4.0:
1084
  version "1.4.0"
 
1179
  resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
1180
  integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
1181
 
 
 
 
 
 
 
 
1182
  parent-module@^1.0.0:
1183
  version "1.0.1"
1184
  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
 
1351
  resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
1352
  integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
1353
 
1354
+ react-smooth@^4.0.0:
1355
+ version "4.0.1"
1356
+ resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-4.0.1.tgz#6200d8699bfe051ae40ba187988323b1449eab1a"
1357
+ integrity sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==
1358
+ dependencies:
1359
+ fast-equals "^5.0.1"
1360
+ prop-types "^15.8.1"
1361
+ react-transition-group "^4.4.5"
1362
+
1363
  react-transition-group@^4.4.5:
1364
  version "4.4.5"
1365
  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
 
1391
  dependencies:
1392
  picomatch "^2.2.1"
1393
 
1394
+ recharts-scale@^0.4.4:
1395
+ version "0.4.5"
1396
+ resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9"
1397
+ integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==
1398
+ dependencies:
1399
+ decimal.js-light "^2.4.1"
1400
+
1401
+ recharts@^2.13.3:
1402
+ version "2.13.3"
1403
+ resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.13.3.tgz#a5ce61e493dff921a14a14a8f42a9f2d2bbefd5a"
1404
+ integrity sha512-YDZ9dOfK9t3ycwxgKbrnDlRC4BHdjlY73fet3a0C1+qGMjXVZe6+VXmpOIIhzkje5MMEL8AN4hLIe4AMskBzlA==
1405
+ dependencies:
1406
+ clsx "^2.0.0"
1407
+ eventemitter3 "^4.0.1"
1408
+ lodash "^4.17.21"
1409
+ react-is "^18.3.1"
1410
+ react-smooth "^4.0.0"
1411
+ recharts-scale "^0.4.4"
1412
+ tiny-invariant "^1.3.1"
1413
+ victory-vendor "^36.6.8"
1414
+
1415
  regenerator-runtime@^0.14.0:
1416
  version "0.14.1"
1417
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
1418
  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
1419
 
 
 
 
 
 
1420
  resolve-from@^4.0.0:
1421
  version "4.0.0"
1422
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
 
1477
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
1478
  integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
1479
 
 
 
 
 
 
1480
  streamsearch@^1.1.0:
1481
  version "1.1.0"
1482
  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
1483
  integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
1484
 
1485
  "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
1486
+ name string-width-cjs
1487
  version "4.2.3"
1488
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1489
  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
 
1502
  strip-ansi "^7.0.1"
1503
 
1504
  "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1505
+ name strip-ansi-cjs
1506
  version "6.0.1"
1507
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1508
  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
 
1548
  dependencies:
1549
  has-flag "^3.0.0"
1550
 
 
 
 
 
 
 
 
1551
  supports-preserve-symlinks-flag@^1.0.0:
1552
  version "1.0.0"
1553
  resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
1554
  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
1555
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1556
  tailwindcss@^3.4.1:
1557
  version "3.4.7"
1558
  resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201"
 
1595
  dependencies:
1596
  any-promise "^1.0.0"
1597
 
1598
+ tiny-invariant@^1.3.1:
1599
+ version "1.3.3"
1600
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
1601
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
1602
+
1603
  to-fast-properties@^2.0.0:
1604
  version "2.0.0"
1605
  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
 
1617
  resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
1618
  integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
1619
 
1620
+ tslib@^2.4.0:
1621
  version "2.6.3"
1622
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
1623
  integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
 
1627
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
1628
  integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
1629
 
 
 
 
 
 
 
 
 
 
 
1630
  undici-types@~5.26.4:
1631
  version "5.26.5"
1632
  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
 
1637
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1638
  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
1639
 
1640
+ victory-vendor@^36.6.8:
1641
+ version "36.9.2"
1642
+ resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.9.2.tgz#668b02a448fa4ea0f788dbf4228b7e64669ff801"
1643
+ integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==
1644
+ dependencies:
1645
+ "@types/d3-array" "^3.0.3"
1646
+ "@types/d3-ease" "^3.0.0"
1647
+ "@types/d3-interpolate" "^3.0.1"
1648
+ "@types/d3-scale" "^4.0.2"
1649
+ "@types/d3-shape" "^3.1.0"
1650
+ "@types/d3-time" "^3.0.0"
1651
+ "@types/d3-timer" "^3.0.0"
1652
+ d3-array "^3.1.6"
1653
+ d3-ease "^3.0.1"
1654
+ d3-interpolate "^3.0.1"
1655
+ d3-scale "^4.0.2"
1656
+ d3-shape "^3.1.0"
1657
+ d3-time "^3.0.0"
1658
+ d3-timer "^3.0.1"
1659
+
1660
  which@^2.0.1:
1661
  version "2.0.2"
1662
  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
 
1664
  dependencies:
1665
  isexe "^2.0.0"
1666
 
 
 
 
 
 
1667
  "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
1668
  version "7.0.0"
1669
  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"