From 8ceb5fa9dbf07e7b4bc2145502624e8a9f67f1a3 Mon Sep 17 00:00:00 2001 From: Karriis Date: Wed, 18 Feb 2026 13:52:06 +0800 Subject: [PATCH] feat: initial commit for TheFarmer project --- .gitignore | 46 + 211/server/client.js | 139 + 211/server/data/users.db | Bin 0 -> 86016 bytes 211/server/gameConfig/Plant.json | 4061 +++++++++++++ 211/server/gameConfig/RoleLevel.json | 802 +++ 211/server/index.js | 1090 ++++ 211/server/package-lock.json | 3343 +++++++++++ 211/server/package.json | 30 + 211/server/proto/corepb.proto | 27 + 211/server/proto/friendpb.proto | 120 + 211/server/proto/game.proto | 44 + 211/server/proto/itempb.proto | 53 + 211/server/proto/notifypb.proto | 10 + 211/server/proto/plantpb.proto | 266 + 211/server/proto/shoppb.proto | 74 + 211/server/proto/taskpb.proto | 81 + 211/server/proto/userpb.proto | 123 + 211/server/proto/visitpb.proto | 42 + 211/server/share.txt | 0 211/server/src/config.js | 53 + 211/server/src/core/FarmBot.js | 186 + 211/server/src/core/FarmManager.js | 1089 ++++ 211/server/src/core/FriendManager.js | 497 ++ 211/server/src/core/Network.js | 541 ++ 211/server/src/core/ShopManager.js | 80 + 211/server/src/core/WarehouseManager.js | 322 + 211/server/src/decode.js | 245 + 211/server/src/farm.js | 648 ++ 211/server/src/friend.js | 650 ++ 211/server/src/gameConfig.js | 269 + 211/server/src/invite.js | 161 + 211/server/src/network.js | 461 ++ 211/server/src/proto.js | 121 + 211/server/src/qrlib/session.js | 314 + 211/server/src/qrlib/utils.js | 52 + 211/server/src/status.js | 193 + 211/server/src/task.js | 181 + 211/server/src/userManager.js | 475 ++ 211/server/src/utils.js | 90 + 211/server/src/warehouse.js | 173 + 211/server/tools/calc-exp-yield.js | 474 ++ 211/server/tools/crop_list.md | 127 + 211/server/tools/list_crops.js | 37 + 211/server/tools/seed-shop-merged-export.json | 2007 +++++++ 211/web/.gitignore | 25 + 211/web/README.md | 73 + 211/web/components.json | 23 + 211/web/eslint.config.js | 23 + 211/web/index.html | 13 + 211/web/package-lock.json | 5329 +++++++++++++++++ 211/web/package.json | 45 + 211/web/postcss.config.js | 6 + 211/web/public/logo.png | Bin 0 -> 6412 bytes .../public/shop_plants_organized/mapping.csv | 101 + .../丝瓜_from_丝瓜种子_1020044.png | Bin 0 -> 3401 bytes .../冬瓜_from_冬瓜种子_1020068.png | Bin 0 -> 5023 bytes .../南瓜_from_南瓜种子_1020010.png | Bin 0 -> 3215 bytes .../向日葵_from_向日葵种子_1020145.png | Bin 0 -> 3224 bytes .../含羞草_from_含羞草种子_1020143.png | Bin 0 -> 5247 bytes .../哈密瓜_from_哈密瓜种子_1020056.png | Bin 0 -> 4710 bytes .../四叶草_from_四叶草种子_1020062.png | Bin 0 -> 3054 bytes .../土豆_from_土豆种子_1020005.png | Bin 0 -> 2555 bytes .../大白菜_from_大白菜种子_1020059.png | Bin 0 -> 4462 bytes .../大葱_from_大葱种子_1020064.png | Bin 0 -> 2402 bytes .../大蒜_from_大蒜种子_1020065.png | Bin 0 -> 3361 bytes .../天堂鸟_from_天堂鸟种子_1020221.png | Bin 0 -> 3495 bytes .../天香百合_from_天香百合种子_1020103.png | Bin 0 -> 3713 bytes .../小白菜_from_小白菜种子_1020071.png | Bin 0 -> 3312 bytes .../小雏菊_from_小雏菊种子_1020105.png | Bin 0 -> 3967 bytes .../小麦_from_小麦种子_1020061.png | Bin 0 -> 3194 bytes .../山楂_from_山楂种子_1020091.png | Bin 0 -> 5324 bytes .../山竹_from_山竹种子_1020076.png | Bin 0 -> 3223 bytes .../无花果_from_无花果种子_1020043.png | Bin 0 -> 4020 bytes .../曼珠沙华_from_曼珠沙华种子_1020126.png | Bin 0 -> 4949 bytes .../曼陀罗华_from_曼陀罗华种子_1020116.png | Bin 0 -> 4511 bytes .../月柿_from_月柿种子_1020080.png | Bin 0 -> 3027 bytes .../木瓜_from_木瓜种子_1020038.png | Bin 0 -> 2341 bytes .../李子_from_李子种子_1020413.png | Bin 0 -> 4041 bytes .../杏子_from_杏子种子_1020078.png | Bin 0 -> 4311 bytes .../杨桃_from_杨桃种子_1020039.png | Bin 0 -> 2700 bytes .../杨梅_from_杨梅种子_1020048.png | Bin 0 -> 4332 bytes .../枇杷_from_枇杷种子_1020055.png | Bin 0 -> 3206 bytes .../柚子_from_柚子种子_1020026.png | Bin 0 -> 2286 bytes .../柠檬_from_柠檬种子_1020042.png | Bin 0 -> 2633 bytes .../栗子_from_栗子种子_1020095.png | Bin 0 -> 4505 bytes .../核桃_from_核桃种子_1020308.png | Bin 0 -> 3556 bytes .../桂圆_from_桂圆种子_1020053.png | Bin 0 -> 3178 bytes .../桃子_from_桃子种子_1020018.png | Bin 0 -> 4509 bytes .../桑葚_from_桑葚种子_1020075.png | Bin 0 -> 4146 bytes .../梨_from_梨种子_1020054.png | Bin 0 -> 2975 bytes .../椰子_from_椰子种子_1020029.png | Bin 0 -> 2945 bytes .../榛子_from_榛子种子_1020072.png | Bin 0 -> 3459 bytes .../榴莲_from_榴莲种子_1020058.png | Bin 0 -> 3526 bytes .../樱桃_from_樱桃种子_1020034.png | Bin 0 -> 3365 bytes .../橙子_from_橙子种子_1020019.png | Bin 0 -> 2411 bytes .../水稻_from_水稻种子_1020060.png | Bin 0 -> 4541 bytes .../油菜_from_油菜种子_1020099.png | Bin 0 -> 3386 bytes .../满天星_from_满天星种子_1020110.png | Bin 0 -> 4838 bytes .../火绒草_from_火绒草种子_1020135.png | Bin 0 -> 3820 bytes .../火龙果_from_火龙果种子_1020033.png | Bin 0 -> 4170 bytes .../牵牛花_from_牵牛花种子_1020147.png | Bin 0 -> 4428 bytes .../猕猴桃_from_猕猴桃种子_1020045.png | Bin 0 -> 2532 bytes .../猪笼草_from_猪笼草种子_1020220.png | Bin 0 -> 4992 bytes .../玉米_from_玉米种子_1020004.png | Bin 0 -> 3076 bytes .../瓶子树_from_瓶子树种子_1020218.png | Bin 0 -> 4792 bytes .../甘蔗_from_甘蔗种子_1020047.png | Bin 0 -> 2363 bytes .../生菜_from_生菜种子_1020096.png | Bin 0 -> 5266 bytes .../番石榴_from_番石榴种子_1020079.png | Bin 0 -> 3648 bytes .../番茄_from_番茄种子_1020007.png | Bin 0 -> 3522 bytes .../白萝卜_from_白萝卜种子_1020002.png | Bin 0 -> 3058 bytes .../睡莲_from_睡莲种子_1020442.png | Bin 0 -> 4291 bytes .../石榴_from_石榴种子_1020023.png | Bin 0 -> 5122 bytes .../秋菊红色_from_红色秋菊种子_1020162.png | Bin 0 -> 4614 bytes .../秋菊黄色_from_黄色秋菊种子_1020161.png | Bin 0 -> 4600 bytes .../竹笋_from_竹笋种子_1020100.png | Bin 0 -> 2995 bytes .../箬竹_from_箬竹种子_1020036.png | Bin 0 -> 3231 bytes .../红枣_from_红枣种子_1020051.png | Bin 0 -> 3871 bytes .../红玫瑰_from_红玫瑰种子_1020041.png | Bin 0 -> 5300 bytes .../胡萝卜_from_胡萝卜种子_1020003.png | Bin 0 -> 3111 bytes .../芒果_from_芒果种子_1020057.png | Bin 0 -> 2495 bytes .../花生_from_花生种子_1020049.png | Bin 0 -> 3025 bytes .../花菜_from_花菜种子_1020098.png | Bin 0 -> 4823 bytes ...花香根鸢尾_from_花香根鸢尾种子_1020141.png | Bin 0 -> 5025 bytes .../芹菜_from_芹菜种子_1020306.png | Bin 0 -> 2662 bytes .../苦瓜_from_苦瓜种子_1020063.png | Bin 0 -> 2573 bytes .../苹果_from_苹果种子_1020011.png | Bin 0 -> 4189 bytes .../茄子_from_茄子种子_1020006.png | Bin 0 -> 3129 bytes .../茉莉花_from_茉莉花种子_1020128.png | Bin 0 -> 4221 bytes .../草莓_from_草莓种子_1020001.png | Bin 0 -> 4985 bytes .../荔枝_from_荔枝种子_1020035.png | Bin 0 -> 4664 bytes .../莲藕_from_莲藕种子_1020037.png | Bin 0 -> 3486 bytes .../菠菜_from_菠菜种子_1020073.png | Bin 0 -> 3859 bytes .../菠萝_from_菠萝种子_1020027.png | Bin 0 -> 4985 bytes .../葡萄_from_葡萄种子_1020013.png | Bin 0 -> 4110 bytes .../葫芦_from_葫芦种子_1020031.png | Bin 0 -> 3630 bytes .../蒲公英_from_蒲公英种子_1020120.png | Bin 0 -> 4624 bytes .../蓝莓_from_蓝莓种子_1020077.png | Bin 0 -> 3421 bytes .../蘑菇_from_蘑菇种子_1020050.png | Bin 0 -> 2952 bytes .../虞美人_from_虞美人种子_1020142.png | Bin 0 -> 3831 bytes .../西瓜_from_西瓜种子_1020014.png | Bin 0 -> 4137 bytes .../豌豆_from_豌豆种子_1020008.png | Bin 0 -> 3007 bytes .../豹皮花_from_豹皮花种子_1020222.png | Bin 0 -> 4589 bytes .../辣椒_from_辣椒种子_1020009.png | Bin 0 -> 2778 bytes .../迎春花_from_迎春花种子_1020396.png | Bin 0 -> 4152 bytes .../金桔_from_金桔种子_1020074.png | Bin 0 -> 3755 bytes .../金针菇_from_金针菇种子_1020052.png | Bin 0 -> 3345 bytes .../银莲花_from_银莲花种子_1020259.png | Bin 0 -> 3832 bytes .../非洲菊_from_非洲菊种子_1020104.png | Bin 0 -> 3236 bytes .../韭菜_from_韭菜种子_1020305.png | Bin 0 -> 3630 bytes .../香瓜_from_香瓜种子_1020067.png | Bin 0 -> 2863 bytes .../香蕉_from_香蕉种子_1020015.png | Bin 0 -> 3240 bytes .../鲜姜_from_鲜姜种子_1020066.png | Bin 0 -> 5371 bytes .../黄瓜_from_黄瓜种子_1020097.png | Bin 0 -> 4761 bytes .../黄豆_from_黄豆种子_1020070.png | Bin 0 -> 4292 bytes .../100003_化肥礼包_4_d13af7af.png | Bin 0 -> 3590 bytes .../verified_items/1001_金币_4_65088be3.png | Bin 0 -> 3875 bytes .../verified_items/1002_点券_50_bd489f54.png | Bin 0 -> 3061 bytes .../verified_items/1004_钻石_7_ff3c1c6f.png | Bin 0 -> 2507 bytes .../1011_普通化肥容器_12_3ad710ed.png | Bin 0 -> 3041 bytes .../1012_有机化肥容器_49_fe1c87b7.png | Bin 0 -> 4266 bytes .../80001_化肥1小时_1_cb2a91eb.png | Bin 0 -> 3095 bytes .../80002_化肥4小时_1_af16205d.png | Bin 0 -> 3664 bytes .../80003_化肥8小时_1_c3700ffc.png | Bin 0 -> 3712 bytes .../80004_化肥12小时_1_179fe100.png | Bin 0 -> 4180 bytes .../80011_有机化肥1小时_2_8fe4411f.png | Bin 0 -> 3310 bytes .../80012_有机化肥4小时_1_03357e47.png | Bin 0 -> 3713 bytes .../80013_有机化肥8小时_1_242b3363.png | Bin 0 -> 3817 bytes .../80014_有机化肥12小时_2_5b6e11c0.png | Bin 0 -> 3884 bytes .../public/verified_items/90001_田园犬_1.png | Bin 0 -> 4791 bytes .../90002_牧羊犬_1_0a3a47cb.png | Bin 0 -> 4373 bytes .../90003_斑点狗_1_ccf8c0ff.png | Bin 0 -> 3667 bytes .../90004_1天狗粮_1_ec8e4ace.png | Bin 0 -> 3750 bytes .../90005_3天狗粮_1_835fa5b1.png | Bin 0 -> 4108 bytes .../90006_5天狗粮_1_a04b7acf.png | Bin 0 -> 4123 bytes 211/web/public/verified_items/index.html | 184 + 211/web/public/verified_items/mapping.json | 103 + 211/web/public/verified_items/土地.png | Bin 0 -> 688 bytes 211/web/public/vite.svg | 1 + 211/web/src/App.css | 42 + 211/web/src/App.tsx | 24 + .../fonts/MapleMono-NF-CN-Regular.woff2 | Bin 0 -> 6252992 bytes 211/web/src/assets/logo.png | Bin 0 -> 6412 bytes 211/web/src/assets/react.svg | 1 + 211/web/src/components/FarmGrid.tsx | 244 + 211/web/src/components/FriendList.tsx | 108 + 211/web/src/components/LogPanel.tsx | 265 + 211/web/src/components/ShopPanel.tsx | 274 + 211/web/src/components/StatusBar.tsx | 117 + 211/web/src/components/SystemMonitor.tsx | 79 + 211/web/src/components/WarehousePanel.tsx | 595 ++ 211/web/src/components/ui/avatar.tsx | 46 + 211/web/src/components/ui/button.tsx | 56 + 211/web/src/components/ui/card.tsx | 79 + 211/web/src/components/ui/dialog.tsx | 120 + 211/web/src/components/ui/input.tsx | 24 + 211/web/src/components/ui/scroll-area.tsx | 46 + 211/web/src/components/ui/tabs.tsx | 55 + 211/web/src/index.css | 111 + 211/web/src/lib/utils.ts | 6 + 211/web/src/main.tsx | 10 + 211/web/src/pages/Dashboard.tsx | 1703 ++++++ 211/web/src/pages/Login.tsx | 238 + 211/web/tailwind.config.js | 79 + 211/web/tsconfig.app.json | 34 + 211/web/tsconfig.json | 13 + 211/web/tsconfig.node.json | 26 + 211/web/vite.config.ts | 26 + server/bot-worker.js | 575 ++ server/client.js | 139 + server/data/users.db | Bin 0 -> 151552 bytes server/gameConfig/Plant.json | 4061 +++++++++++++ server/gameConfig/RoleLevel.json | 802 +++ server/index.js | 945 +++ server/package-lock.json | 3480 +++++++++++ server/package.json | 33 + server/proto/corepb.proto | 27 + server/proto/friendpb.proto | 120 + server/proto/game.proto | 44 + server/proto/itempb.proto | 53 + server/proto/notifypb.proto | 10 + server/proto/plantpb.proto | 266 + server/proto/shoppb.proto | 74 + server/proto/taskpb.proto | 81 + server/proto/userpb.proto | 123 + server/proto/visitpb.proto | 42 + server/share.txt | 0 server/src/config.js | 53 + server/src/core/FarmBot.js | 215 + server/src/core/FarmManager.js | 1164 ++++ server/src/core/FriendManager.js | 497 ++ server/src/core/Network.js | 576 ++ server/src/core/ShopManager.js | 80 + server/src/core/UpdateService.js | 85 + server/src/core/WarehouseManager.js | 325 + server/src/decode.js | 245 + server/src/farm.js | 648 ++ server/src/friend.js | 650 ++ server/src/gameConfig.js | 269 + server/src/invite.js | 161 + server/src/network.js | 461 ++ server/src/proto.js | 123 + server/src/qrlib/session.js | 314 + server/src/qrlib/utils.js | 52 + server/src/routes/update.js | 30 + server/src/status.js | 193 + server/src/task.js | 209 + server/src/userManager.js | 573 ++ server/src/utils.js | 90 + server/src/warehouse.js | 173 + server/tools/calc-exp-yield.js | 474 ++ server/tools/crop_list.md | 127 + server/tools/list_crops.js | 37 + server/tools/seed-shop-merged-export.json | 2007 +++++++ server/ws-gateway.js | 64 + test | 1 + web/.gitignore | 25 + web/.vite/deps/_metadata.json | 8 + web/.vite/deps/package.json | 3 + web/README.md | 73 + web/components.json | 23 + web/eslint.config.js | 23 + web/index.html | 13 + web/package-lock.json | 5329 +++++++++++++++++ web/package.json | 45 + web/postcss.config.js | 6 + web/public/logo.png | Bin 0 -> 6412 bytes web/public/shop_plants_organized/mapping.csv | 101 + .../丝瓜_from_丝瓜种子_1020044.png | Bin 0 -> 3401 bytes .../冬瓜_from_冬瓜种子_1020068.png | Bin 0 -> 5023 bytes .../南瓜_from_南瓜种子_1020010.png | Bin 0 -> 3215 bytes .../向日葵_from_向日葵种子_1020145.png | Bin 0 -> 3224 bytes .../含羞草_from_含羞草种子_1020143.png | Bin 0 -> 5247 bytes .../哈密瓜_from_哈密瓜种子_1020056.png | Bin 0 -> 4710 bytes .../四叶草_from_四叶草种子_1020062.png | Bin 0 -> 3054 bytes .../土豆_from_土豆种子_1020005.png | Bin 0 -> 2555 bytes .../大白菜_from_大白菜种子_1020059.png | Bin 0 -> 4462 bytes .../大葱_from_大葱种子_1020064.png | Bin 0 -> 2402 bytes .../大蒜_from_大蒜种子_1020065.png | Bin 0 -> 3361 bytes .../天堂鸟_from_天堂鸟种子_1020221.png | Bin 0 -> 3495 bytes .../天香百合_from_天香百合种子_1020103.png | Bin 0 -> 3713 bytes .../小白菜_from_小白菜种子_1020071.png | Bin 0 -> 3312 bytes .../小雏菊_from_小雏菊种子_1020105.png | Bin 0 -> 3967 bytes .../小麦_from_小麦种子_1020061.png | Bin 0 -> 3194 bytes .../山楂_from_山楂种子_1020091.png | Bin 0 -> 5324 bytes .../山竹_from_山竹种子_1020076.png | Bin 0 -> 3223 bytes .../无花果_from_无花果种子_1020043.png | Bin 0 -> 4020 bytes .../曼珠沙华_from_曼珠沙华种子_1020126.png | Bin 0 -> 4949 bytes .../曼陀罗华_from_曼陀罗华种子_1020116.png | Bin 0 -> 4511 bytes .../月柿_from_月柿种子_1020080.png | Bin 0 -> 3027 bytes .../木瓜_from_木瓜种子_1020038.png | Bin 0 -> 2341 bytes .../李子_from_李子种子_1020413.png | Bin 0 -> 4041 bytes .../杏子_from_杏子种子_1020078.png | Bin 0 -> 4311 bytes .../杨桃_from_杨桃种子_1020039.png | Bin 0 -> 2700 bytes .../杨梅_from_杨梅种子_1020048.png | Bin 0 -> 4332 bytes .../枇杷_from_枇杷种子_1020055.png | Bin 0 -> 3206 bytes .../柚子_from_柚子种子_1020026.png | Bin 0 -> 2286 bytes .../柠檬_from_柠檬种子_1020042.png | Bin 0 -> 2633 bytes .../栗子_from_栗子种子_1020095.png | Bin 0 -> 4505 bytes .../核桃_from_核桃种子_1020308.png | Bin 0 -> 3556 bytes .../桂圆_from_桂圆种子_1020053.png | Bin 0 -> 3178 bytes .../桃子_from_桃子种子_1020018.png | Bin 0 -> 4509 bytes .../桑葚_from_桑葚种子_1020075.png | Bin 0 -> 4146 bytes .../梨_from_梨种子_1020054.png | Bin 0 -> 2975 bytes .../椰子_from_椰子种子_1020029.png | Bin 0 -> 2945 bytes .../榛子_from_榛子种子_1020072.png | Bin 0 -> 3459 bytes .../榴莲_from_榴莲种子_1020058.png | Bin 0 -> 3526 bytes .../樱桃_from_樱桃种子_1020034.png | Bin 0 -> 3365 bytes .../橙子_from_橙子种子_1020019.png | Bin 0 -> 2411 bytes .../水稻_from_水稻种子_1020060.png | Bin 0 -> 4541 bytes .../油菜_from_油菜种子_1020099.png | Bin 0 -> 3386 bytes .../满天星_from_满天星种子_1020110.png | Bin 0 -> 4838 bytes .../火绒草_from_火绒草种子_1020135.png | Bin 0 -> 3820 bytes .../火龙果_from_火龙果种子_1020033.png | Bin 0 -> 4170 bytes .../牵牛花_from_牵牛花种子_1020147.png | Bin 0 -> 4428 bytes .../猕猴桃_from_猕猴桃种子_1020045.png | Bin 0 -> 2532 bytes .../猪笼草_from_猪笼草种子_1020220.png | Bin 0 -> 4992 bytes .../玉米_from_玉米种子_1020004.png | Bin 0 -> 3076 bytes .../瓶子树_from_瓶子树种子_1020218.png | Bin 0 -> 4792 bytes .../甘蔗_from_甘蔗种子_1020047.png | Bin 0 -> 2363 bytes .../生菜_from_生菜种子_1020096.png | Bin 0 -> 5266 bytes .../番石榴_from_番石榴种子_1020079.png | Bin 0 -> 3648 bytes .../番茄_from_番茄种子_1020007.png | Bin 0 -> 3522 bytes .../白萝卜_from_白萝卜种子_1020002.png | Bin 0 -> 3058 bytes .../睡莲_from_睡莲种子_1020442.png | Bin 0 -> 4291 bytes .../石榴_from_石榴种子_1020023.png | Bin 0 -> 5122 bytes .../秋菊红色_from_红色秋菊种子_1020162.png | Bin 0 -> 4614 bytes .../秋菊黄色_from_黄色秋菊种子_1020161.png | Bin 0 -> 4600 bytes .../竹笋_from_竹笋种子_1020100.png | Bin 0 -> 2995 bytes .../箬竹_from_箬竹种子_1020036.png | Bin 0 -> 3231 bytes .../红枣_from_红枣种子_1020051.png | Bin 0 -> 3871 bytes .../红玫瑰_from_红玫瑰种子_1020041.png | Bin 0 -> 5300 bytes .../胡萝卜_from_胡萝卜种子_1020003.png | Bin 0 -> 3111 bytes .../芒果_from_芒果种子_1020057.png | Bin 0 -> 2495 bytes .../花生_from_花生种子_1020049.png | Bin 0 -> 3025 bytes .../花菜_from_花菜种子_1020098.png | Bin 0 -> 4823 bytes ...花香根鸢尾_from_花香根鸢尾种子_1020141.png | Bin 0 -> 5025 bytes .../芹菜_from_芹菜种子_1020306.png | Bin 0 -> 2662 bytes .../苦瓜_from_苦瓜种子_1020063.png | Bin 0 -> 2573 bytes .../苹果_from_苹果种子_1020011.png | Bin 0 -> 4189 bytes .../茄子_from_茄子种子_1020006.png | Bin 0 -> 3129 bytes .../茉莉花_from_茉莉花种子_1020128.png | Bin 0 -> 4221 bytes .../草莓_from_草莓种子_1020001.png | Bin 0 -> 4985 bytes .../荔枝_from_荔枝种子_1020035.png | Bin 0 -> 4664 bytes .../莲藕_from_莲藕种子_1020037.png | Bin 0 -> 3486 bytes .../菠菜_from_菠菜种子_1020073.png | Bin 0 -> 3859 bytes .../菠萝_from_菠萝种子_1020027.png | Bin 0 -> 4985 bytes .../葡萄_from_葡萄种子_1020013.png | Bin 0 -> 4110 bytes .../葫芦_from_葫芦种子_1020031.png | Bin 0 -> 3630 bytes .../蒲公英_from_蒲公英种子_1020120.png | Bin 0 -> 4624 bytes .../蓝莓_from_蓝莓种子_1020077.png | Bin 0 -> 3421 bytes .../蘑菇_from_蘑菇种子_1020050.png | Bin 0 -> 2952 bytes .../虞美人_from_虞美人种子_1020142.png | Bin 0 -> 3831 bytes .../西瓜_from_西瓜种子_1020014.png | Bin 0 -> 4137 bytes .../豌豆_from_豌豆种子_1020008.png | Bin 0 -> 3007 bytes .../豹皮花_from_豹皮花种子_1020222.png | Bin 0 -> 4589 bytes .../辣椒_from_辣椒种子_1020009.png | Bin 0 -> 2778 bytes .../迎春花_from_迎春花种子_1020396.png | Bin 0 -> 4152 bytes .../金桔_from_金桔种子_1020074.png | Bin 0 -> 3755 bytes .../金针菇_from_金针菇种子_1020052.png | Bin 0 -> 3345 bytes .../银莲花_from_银莲花种子_1020259.png | Bin 0 -> 3832 bytes .../非洲菊_from_非洲菊种子_1020104.png | Bin 0 -> 3236 bytes .../韭菜_from_韭菜种子_1020305.png | Bin 0 -> 3630 bytes .../香瓜_from_香瓜种子_1020067.png | Bin 0 -> 2863 bytes .../香蕉_from_香蕉种子_1020015.png | Bin 0 -> 3240 bytes .../鲜姜_from_鲜姜种子_1020066.png | Bin 0 -> 5371 bytes .../黄瓜_from_黄瓜种子_1020097.png | Bin 0 -> 4761 bytes .../黄豆_from_黄豆种子_1020070.png | Bin 0 -> 4292 bytes .../100003_化肥礼包_4_d13af7af.png | Bin 0 -> 3590 bytes .../verified_items/1001_金币_4_65088be3.png | Bin 0 -> 3875 bytes .../verified_items/1002_点券_50_bd489f54.png | Bin 0 -> 3061 bytes .../verified_items/1004_钻石_7_ff3c1c6f.png | Bin 0 -> 2507 bytes .../1011_普通化肥容器_12_3ad710ed.png | Bin 0 -> 3041 bytes .../1012_有机化肥容器_49_fe1c87b7.png | Bin 0 -> 4266 bytes .../80001_化肥1小时_1_cb2a91eb.png | Bin 0 -> 3095 bytes .../80002_化肥4小时_1_af16205d.png | Bin 0 -> 3664 bytes .../80003_化肥8小时_1_c3700ffc.png | Bin 0 -> 3712 bytes .../80004_化肥12小时_1_179fe100.png | Bin 0 -> 4180 bytes .../80011_有机化肥1小时_2_8fe4411f.png | Bin 0 -> 3310 bytes .../80012_有机化肥4小时_1_03357e47.png | Bin 0 -> 3713 bytes .../80013_有机化肥8小时_1_242b3363.png | Bin 0 -> 3817 bytes .../80014_有机化肥12小时_2_5b6e11c0.png | Bin 0 -> 3884 bytes web/public/verified_items/90001_田园犬_1.png | Bin 0 -> 4791 bytes .../90002_牧羊犬_1_0a3a47cb.png | Bin 0 -> 4373 bytes .../90003_斑点狗_1_ccf8c0ff.png | Bin 0 -> 3667 bytes .../90004_1天狗粮_1_ec8e4ace.png | Bin 0 -> 3750 bytes .../90005_3天狗粮_1_835fa5b1.png | Bin 0 -> 4108 bytes .../90006_5天狗粮_1_a04b7acf.png | Bin 0 -> 4123 bytes web/public/verified_items/index.html | 184 + web/public/verified_items/mapping.json | 103 + web/public/verified_items/土地.png | Bin 0 -> 688 bytes web/public/vite.svg | 1 + web/src/App.css | 42 + web/src/App.tsx | 24 + .../fonts/MapleMono-NF-CN-Regular.woff2 | Bin 0 -> 6252992 bytes web/src/assets/logo.png | Bin 0 -> 6412 bytes web/src/assets/react.svg | 1 + web/src/components/FarmGrid.tsx | 244 + web/src/components/FriendList.tsx | 108 + web/src/components/LogPanel.tsx | 265 + web/src/components/ShopPanel.tsx | 274 + web/src/components/StatusBar.tsx | 126 + web/src/components/SystemMonitor.tsx | 79 + web/src/components/WarehousePanel.tsx | 595 ++ web/src/components/ui/avatar.tsx | 46 + web/src/components/ui/button.tsx | 56 + web/src/components/ui/card.tsx | 79 + web/src/components/ui/dialog.tsx | 120 + web/src/components/ui/input.tsx | 24 + web/src/components/ui/scroll-area.tsx | 46 + web/src/components/ui/tabs.tsx | 55 + web/src/index.css | 111 + web/src/lib/utils.ts | 6 + web/src/main.tsx | 10 + web/src/pages/Dashboard.tsx | 2339 ++++++++ web/src/pages/Login.tsx | 238 + web/tailwind.config.js | 79 + web/tsconfig.app.json | 34 + web/tsconfig.json | 13 + web/tsconfig.node.json | 26 + web/vite.config.ts | 26 + 420 files changed, 61918 insertions(+) create mode 100644 .gitignore create mode 100644 211/server/client.js create mode 100644 211/server/data/users.db create mode 100644 211/server/gameConfig/Plant.json create mode 100644 211/server/gameConfig/RoleLevel.json create mode 100644 211/server/index.js create mode 100644 211/server/package-lock.json create mode 100644 211/server/package.json create mode 100644 211/server/proto/corepb.proto create mode 100644 211/server/proto/friendpb.proto create mode 100644 211/server/proto/game.proto create mode 100644 211/server/proto/itempb.proto create mode 100644 211/server/proto/notifypb.proto create mode 100644 211/server/proto/plantpb.proto create mode 100644 211/server/proto/shoppb.proto create mode 100644 211/server/proto/taskpb.proto create mode 100644 211/server/proto/userpb.proto create mode 100644 211/server/proto/visitpb.proto create mode 100644 211/server/share.txt create mode 100644 211/server/src/config.js create mode 100644 211/server/src/core/FarmBot.js create mode 100644 211/server/src/core/FarmManager.js create mode 100644 211/server/src/core/FriendManager.js create mode 100644 211/server/src/core/Network.js create mode 100644 211/server/src/core/ShopManager.js create mode 100644 211/server/src/core/WarehouseManager.js create mode 100644 211/server/src/decode.js create mode 100644 211/server/src/farm.js create mode 100644 211/server/src/friend.js create mode 100644 211/server/src/gameConfig.js create mode 100644 211/server/src/invite.js create mode 100644 211/server/src/network.js create mode 100644 211/server/src/proto.js create mode 100644 211/server/src/qrlib/session.js create mode 100644 211/server/src/qrlib/utils.js create mode 100644 211/server/src/status.js create mode 100644 211/server/src/task.js create mode 100644 211/server/src/userManager.js create mode 100644 211/server/src/utils.js create mode 100644 211/server/src/warehouse.js create mode 100644 211/server/tools/calc-exp-yield.js create mode 100644 211/server/tools/crop_list.md create mode 100644 211/server/tools/list_crops.js create mode 100644 211/server/tools/seed-shop-merged-export.json create mode 100644 211/web/.gitignore create mode 100644 211/web/README.md create mode 100644 211/web/components.json create mode 100644 211/web/eslint.config.js create mode 100644 211/web/index.html create mode 100644 211/web/package-lock.json create mode 100644 211/web/package.json create mode 100644 211/web/postcss.config.js create mode 100644 211/web/public/logo.png create mode 100644 211/web/public/shop_plants_organized/mapping.csv create mode 100644 211/web/public/shop_plants_organized/丝瓜_from_丝瓜种子_1020044.png create mode 100644 211/web/public/shop_plants_organized/冬瓜_from_冬瓜种子_1020068.png create mode 100644 211/web/public/shop_plants_organized/南瓜_from_南瓜种子_1020010.png create mode 100644 211/web/public/shop_plants_organized/向日葵_from_向日葵种子_1020145.png create mode 100644 211/web/public/shop_plants_organized/含羞草_from_含羞草种子_1020143.png create mode 100644 211/web/public/shop_plants_organized/哈密瓜_from_哈密瓜种子_1020056.png create mode 100644 211/web/public/shop_plants_organized/四叶草_from_四叶草种子_1020062.png create mode 100644 211/web/public/shop_plants_organized/土豆_from_土豆种子_1020005.png create mode 100644 211/web/public/shop_plants_organized/大白菜_from_大白菜种子_1020059.png create mode 100644 211/web/public/shop_plants_organized/大葱_from_大葱种子_1020064.png create mode 100644 211/web/public/shop_plants_organized/大蒜_from_大蒜种子_1020065.png create mode 100644 211/web/public/shop_plants_organized/天堂鸟_from_天堂鸟种子_1020221.png create mode 100644 211/web/public/shop_plants_organized/天香百合_from_天香百合种子_1020103.png create mode 100644 211/web/public/shop_plants_organized/小白菜_from_小白菜种子_1020071.png create mode 100644 211/web/public/shop_plants_organized/小雏菊_from_小雏菊种子_1020105.png create mode 100644 211/web/public/shop_plants_organized/小麦_from_小麦种子_1020061.png create mode 100644 211/web/public/shop_plants_organized/山楂_from_山楂种子_1020091.png create mode 100644 211/web/public/shop_plants_organized/山竹_from_山竹种子_1020076.png create mode 100644 211/web/public/shop_plants_organized/无花果_from_无花果种子_1020043.png create mode 100644 211/web/public/shop_plants_organized/曼珠沙华_from_曼珠沙华种子_1020126.png create mode 100644 211/web/public/shop_plants_organized/曼陀罗华_from_曼陀罗华种子_1020116.png create mode 100644 211/web/public/shop_plants_organized/月柿_from_月柿种子_1020080.png create mode 100644 211/web/public/shop_plants_organized/木瓜_from_木瓜种子_1020038.png create mode 100644 211/web/public/shop_plants_organized/李子_from_李子种子_1020413.png create mode 100644 211/web/public/shop_plants_organized/杏子_from_杏子种子_1020078.png create mode 100644 211/web/public/shop_plants_organized/杨桃_from_杨桃种子_1020039.png create mode 100644 211/web/public/shop_plants_organized/杨梅_from_杨梅种子_1020048.png create mode 100644 211/web/public/shop_plants_organized/枇杷_from_枇杷种子_1020055.png create mode 100644 211/web/public/shop_plants_organized/柚子_from_柚子种子_1020026.png create mode 100644 211/web/public/shop_plants_organized/柠檬_from_柠檬种子_1020042.png create mode 100644 211/web/public/shop_plants_organized/栗子_from_栗子种子_1020095.png create mode 100644 211/web/public/shop_plants_organized/核桃_from_核桃种子_1020308.png create mode 100644 211/web/public/shop_plants_organized/桂圆_from_桂圆种子_1020053.png create mode 100644 211/web/public/shop_plants_organized/桃子_from_桃子种子_1020018.png create mode 100644 211/web/public/shop_plants_organized/桑葚_from_桑葚种子_1020075.png create mode 100644 211/web/public/shop_plants_organized/梨_from_梨种子_1020054.png create mode 100644 211/web/public/shop_plants_organized/椰子_from_椰子种子_1020029.png create mode 100644 211/web/public/shop_plants_organized/榛子_from_榛子种子_1020072.png create mode 100644 211/web/public/shop_plants_organized/榴莲_from_榴莲种子_1020058.png create mode 100644 211/web/public/shop_plants_organized/樱桃_from_樱桃种子_1020034.png create mode 100644 211/web/public/shop_plants_organized/橙子_from_橙子种子_1020019.png create mode 100644 211/web/public/shop_plants_organized/水稻_from_水稻种子_1020060.png create mode 100644 211/web/public/shop_plants_organized/油菜_from_油菜种子_1020099.png create mode 100644 211/web/public/shop_plants_organized/满天星_from_满天星种子_1020110.png create mode 100644 211/web/public/shop_plants_organized/火绒草_from_火绒草种子_1020135.png create mode 100644 211/web/public/shop_plants_organized/火龙果_from_火龙果种子_1020033.png create mode 100644 211/web/public/shop_plants_organized/牵牛花_from_牵牛花种子_1020147.png create mode 100644 211/web/public/shop_plants_organized/猕猴桃_from_猕猴桃种子_1020045.png create mode 100644 211/web/public/shop_plants_organized/猪笼草_from_猪笼草种子_1020220.png create mode 100644 211/web/public/shop_plants_organized/玉米_from_玉米种子_1020004.png create mode 100644 211/web/public/shop_plants_organized/瓶子树_from_瓶子树种子_1020218.png create mode 100644 211/web/public/shop_plants_organized/甘蔗_from_甘蔗种子_1020047.png create mode 100644 211/web/public/shop_plants_organized/生菜_from_生菜种子_1020096.png create mode 100644 211/web/public/shop_plants_organized/番石榴_from_番石榴种子_1020079.png create mode 100644 211/web/public/shop_plants_organized/番茄_from_番茄种子_1020007.png create mode 100644 211/web/public/shop_plants_organized/白萝卜_from_白萝卜种子_1020002.png create mode 100644 211/web/public/shop_plants_organized/睡莲_from_睡莲种子_1020442.png create mode 100644 211/web/public/shop_plants_organized/石榴_from_石榴种子_1020023.png create mode 100644 211/web/public/shop_plants_organized/秋菊红色_from_红色秋菊种子_1020162.png create mode 100644 211/web/public/shop_plants_organized/秋菊黄色_from_黄色秋菊种子_1020161.png create mode 100644 211/web/public/shop_plants_organized/竹笋_from_竹笋种子_1020100.png create mode 100644 211/web/public/shop_plants_organized/箬竹_from_箬竹种子_1020036.png create mode 100644 211/web/public/shop_plants_organized/红枣_from_红枣种子_1020051.png create mode 100644 211/web/public/shop_plants_organized/红玫瑰_from_红玫瑰种子_1020041.png create mode 100644 211/web/public/shop_plants_organized/胡萝卜_from_胡萝卜种子_1020003.png create mode 100644 211/web/public/shop_plants_organized/芒果_from_芒果种子_1020057.png create mode 100644 211/web/public/shop_plants_organized/花生_from_花生种子_1020049.png create mode 100644 211/web/public/shop_plants_organized/花菜_from_花菜种子_1020098.png create mode 100644 211/web/public/shop_plants_organized/花香根鸢尾_from_花香根鸢尾种子_1020141.png create mode 100644 211/web/public/shop_plants_organized/芹菜_from_芹菜种子_1020306.png create mode 100644 211/web/public/shop_plants_organized/苦瓜_from_苦瓜种子_1020063.png create mode 100644 211/web/public/shop_plants_organized/苹果_from_苹果种子_1020011.png create mode 100644 211/web/public/shop_plants_organized/茄子_from_茄子种子_1020006.png create mode 100644 211/web/public/shop_plants_organized/茉莉花_from_茉莉花种子_1020128.png create mode 100644 211/web/public/shop_plants_organized/草莓_from_草莓种子_1020001.png create mode 100644 211/web/public/shop_plants_organized/荔枝_from_荔枝种子_1020035.png create mode 100644 211/web/public/shop_plants_organized/莲藕_from_莲藕种子_1020037.png create mode 100644 211/web/public/shop_plants_organized/菠菜_from_菠菜种子_1020073.png create mode 100644 211/web/public/shop_plants_organized/菠萝_from_菠萝种子_1020027.png create mode 100644 211/web/public/shop_plants_organized/葡萄_from_葡萄种子_1020013.png create mode 100644 211/web/public/shop_plants_organized/葫芦_from_葫芦种子_1020031.png create mode 100644 211/web/public/shop_plants_organized/蒲公英_from_蒲公英种子_1020120.png create mode 100644 211/web/public/shop_plants_organized/蓝莓_from_蓝莓种子_1020077.png create mode 100644 211/web/public/shop_plants_organized/蘑菇_from_蘑菇种子_1020050.png create mode 100644 211/web/public/shop_plants_organized/虞美人_from_虞美人种子_1020142.png create mode 100644 211/web/public/shop_plants_organized/西瓜_from_西瓜种子_1020014.png create mode 100644 211/web/public/shop_plants_organized/豌豆_from_豌豆种子_1020008.png create mode 100644 211/web/public/shop_plants_organized/豹皮花_from_豹皮花种子_1020222.png create mode 100644 211/web/public/shop_plants_organized/辣椒_from_辣椒种子_1020009.png create mode 100644 211/web/public/shop_plants_organized/迎春花_from_迎春花种子_1020396.png create mode 100644 211/web/public/shop_plants_organized/金桔_from_金桔种子_1020074.png create mode 100644 211/web/public/shop_plants_organized/金针菇_from_金针菇种子_1020052.png create mode 100644 211/web/public/shop_plants_organized/银莲花_from_银莲花种子_1020259.png create mode 100644 211/web/public/shop_plants_organized/非洲菊_from_非洲菊种子_1020104.png create mode 100644 211/web/public/shop_plants_organized/韭菜_from_韭菜种子_1020305.png create mode 100644 211/web/public/shop_plants_organized/香瓜_from_香瓜种子_1020067.png create mode 100644 211/web/public/shop_plants_organized/香蕉_from_香蕉种子_1020015.png create mode 100644 211/web/public/shop_plants_organized/鲜姜_from_鲜姜种子_1020066.png create mode 100644 211/web/public/shop_plants_organized/黄瓜_from_黄瓜种子_1020097.png create mode 100644 211/web/public/shop_plants_organized/黄豆_from_黄豆种子_1020070.png create mode 100644 211/web/public/verified_items/100003_化肥礼包_4_d13af7af.png create mode 100644 211/web/public/verified_items/1001_金币_4_65088be3.png create mode 100644 211/web/public/verified_items/1002_点券_50_bd489f54.png create mode 100644 211/web/public/verified_items/1004_钻石_7_ff3c1c6f.png create mode 100644 211/web/public/verified_items/1011_普通化肥容器_12_3ad710ed.png create mode 100644 211/web/public/verified_items/1012_有机化肥容器_49_fe1c87b7.png create mode 100644 211/web/public/verified_items/80001_化肥1小时_1_cb2a91eb.png create mode 100644 211/web/public/verified_items/80002_化肥4小时_1_af16205d.png create mode 100644 211/web/public/verified_items/80003_化肥8小时_1_c3700ffc.png create mode 100644 211/web/public/verified_items/80004_化肥12小时_1_179fe100.png create mode 100644 211/web/public/verified_items/80011_有机化肥1小时_2_8fe4411f.png create mode 100644 211/web/public/verified_items/80012_有机化肥4小时_1_03357e47.png create mode 100644 211/web/public/verified_items/80013_有机化肥8小时_1_242b3363.png create mode 100644 211/web/public/verified_items/80014_有机化肥12小时_2_5b6e11c0.png create mode 100644 211/web/public/verified_items/90001_田园犬_1.png create mode 100644 211/web/public/verified_items/90002_牧羊犬_1_0a3a47cb.png create mode 100644 211/web/public/verified_items/90003_斑点狗_1_ccf8c0ff.png create mode 100644 211/web/public/verified_items/90004_1天狗粮_1_ec8e4ace.png create mode 100644 211/web/public/verified_items/90005_3天狗粮_1_835fa5b1.png create mode 100644 211/web/public/verified_items/90006_5天狗粮_1_a04b7acf.png create mode 100644 211/web/public/verified_items/index.html create mode 100644 211/web/public/verified_items/mapping.json create mode 100644 211/web/public/verified_items/土地.png create mode 100644 211/web/public/vite.svg create mode 100644 211/web/src/App.css create mode 100644 211/web/src/App.tsx create mode 100644 211/web/src/assets/fonts/MapleMono-NF-CN-Regular.woff2 create mode 100644 211/web/src/assets/logo.png create mode 100644 211/web/src/assets/react.svg create mode 100644 211/web/src/components/FarmGrid.tsx create mode 100644 211/web/src/components/FriendList.tsx create mode 100644 211/web/src/components/LogPanel.tsx create mode 100644 211/web/src/components/ShopPanel.tsx create mode 100644 211/web/src/components/StatusBar.tsx create mode 100644 211/web/src/components/SystemMonitor.tsx create mode 100644 211/web/src/components/WarehousePanel.tsx create mode 100644 211/web/src/components/ui/avatar.tsx create mode 100644 211/web/src/components/ui/button.tsx create mode 100644 211/web/src/components/ui/card.tsx create mode 100644 211/web/src/components/ui/dialog.tsx create mode 100644 211/web/src/components/ui/input.tsx create mode 100644 211/web/src/components/ui/scroll-area.tsx create mode 100644 211/web/src/components/ui/tabs.tsx create mode 100644 211/web/src/index.css create mode 100644 211/web/src/lib/utils.ts create mode 100644 211/web/src/main.tsx create mode 100644 211/web/src/pages/Dashboard.tsx create mode 100644 211/web/src/pages/Login.tsx create mode 100644 211/web/tailwind.config.js create mode 100644 211/web/tsconfig.app.json create mode 100644 211/web/tsconfig.json create mode 100644 211/web/tsconfig.node.json create mode 100644 211/web/vite.config.ts create mode 100644 server/bot-worker.js create mode 100644 server/client.js create mode 100644 server/data/users.db create mode 100644 server/gameConfig/Plant.json create mode 100644 server/gameConfig/RoleLevel.json create mode 100644 server/index.js create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/proto/corepb.proto create mode 100644 server/proto/friendpb.proto create mode 100644 server/proto/game.proto create mode 100644 server/proto/itempb.proto create mode 100644 server/proto/notifypb.proto create mode 100644 server/proto/plantpb.proto create mode 100644 server/proto/shoppb.proto create mode 100644 server/proto/taskpb.proto create mode 100644 server/proto/userpb.proto create mode 100644 server/proto/visitpb.proto create mode 100644 server/share.txt create mode 100644 server/src/config.js create mode 100644 server/src/core/FarmBot.js create mode 100644 server/src/core/FarmManager.js create mode 100644 server/src/core/FriendManager.js create mode 100644 server/src/core/Network.js create mode 100644 server/src/core/ShopManager.js create mode 100644 server/src/core/UpdateService.js create mode 100644 server/src/core/WarehouseManager.js create mode 100644 server/src/decode.js create mode 100644 server/src/farm.js create mode 100644 server/src/friend.js create mode 100644 server/src/gameConfig.js create mode 100644 server/src/invite.js create mode 100644 server/src/network.js create mode 100644 server/src/proto.js create mode 100644 server/src/qrlib/session.js create mode 100644 server/src/qrlib/utils.js create mode 100644 server/src/routes/update.js create mode 100644 server/src/status.js create mode 100644 server/src/task.js create mode 100644 server/src/userManager.js create mode 100644 server/src/utils.js create mode 100644 server/src/warehouse.js create mode 100644 server/tools/calc-exp-yield.js create mode 100644 server/tools/crop_list.md create mode 100644 server/tools/list_crops.js create mode 100644 server/tools/seed-shop-merged-export.json create mode 100644 server/ws-gateway.js create mode 100644 test create mode 100644 web/.gitignore create mode 100644 web/.vite/deps/_metadata.json create mode 100644 web/.vite/deps/package.json create mode 100644 web/README.md create mode 100644 web/components.json create mode 100644 web/eslint.config.js create mode 100644 web/index.html create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/postcss.config.js create mode 100644 web/public/logo.png create mode 100644 web/public/shop_plants_organized/mapping.csv create mode 100644 web/public/shop_plants_organized/丝瓜_from_丝瓜种子_1020044.png create mode 100644 web/public/shop_plants_organized/冬瓜_from_冬瓜种子_1020068.png create mode 100644 web/public/shop_plants_organized/南瓜_from_南瓜种子_1020010.png create mode 100644 web/public/shop_plants_organized/向日葵_from_向日葵种子_1020145.png create mode 100644 web/public/shop_plants_organized/含羞草_from_含羞草种子_1020143.png create mode 100644 web/public/shop_plants_organized/哈密瓜_from_哈密瓜种子_1020056.png create mode 100644 web/public/shop_plants_organized/四叶草_from_四叶草种子_1020062.png create mode 100644 web/public/shop_plants_organized/土豆_from_土豆种子_1020005.png create mode 100644 web/public/shop_plants_organized/大白菜_from_大白菜种子_1020059.png create mode 100644 web/public/shop_plants_organized/大葱_from_大葱种子_1020064.png create mode 100644 web/public/shop_plants_organized/大蒜_from_大蒜种子_1020065.png create mode 100644 web/public/shop_plants_organized/天堂鸟_from_天堂鸟种子_1020221.png create mode 100644 web/public/shop_plants_organized/天香百合_from_天香百合种子_1020103.png create mode 100644 web/public/shop_plants_organized/小白菜_from_小白菜种子_1020071.png create mode 100644 web/public/shop_plants_organized/小雏菊_from_小雏菊种子_1020105.png create mode 100644 web/public/shop_plants_organized/小麦_from_小麦种子_1020061.png create mode 100644 web/public/shop_plants_organized/山楂_from_山楂种子_1020091.png create mode 100644 web/public/shop_plants_organized/山竹_from_山竹种子_1020076.png create mode 100644 web/public/shop_plants_organized/无花果_from_无花果种子_1020043.png create mode 100644 web/public/shop_plants_organized/曼珠沙华_from_曼珠沙华种子_1020126.png create mode 100644 web/public/shop_plants_organized/曼陀罗华_from_曼陀罗华种子_1020116.png create mode 100644 web/public/shop_plants_organized/月柿_from_月柿种子_1020080.png create mode 100644 web/public/shop_plants_organized/木瓜_from_木瓜种子_1020038.png create mode 100644 web/public/shop_plants_organized/李子_from_李子种子_1020413.png create mode 100644 web/public/shop_plants_organized/杏子_from_杏子种子_1020078.png create mode 100644 web/public/shop_plants_organized/杨桃_from_杨桃种子_1020039.png create mode 100644 web/public/shop_plants_organized/杨梅_from_杨梅种子_1020048.png create mode 100644 web/public/shop_plants_organized/枇杷_from_枇杷种子_1020055.png create mode 100644 web/public/shop_plants_organized/柚子_from_柚子种子_1020026.png create mode 100644 web/public/shop_plants_organized/柠檬_from_柠檬种子_1020042.png create mode 100644 web/public/shop_plants_organized/栗子_from_栗子种子_1020095.png create mode 100644 web/public/shop_plants_organized/核桃_from_核桃种子_1020308.png create mode 100644 web/public/shop_plants_organized/桂圆_from_桂圆种子_1020053.png create mode 100644 web/public/shop_plants_organized/桃子_from_桃子种子_1020018.png create mode 100644 web/public/shop_plants_organized/桑葚_from_桑葚种子_1020075.png create mode 100644 web/public/shop_plants_organized/梨_from_梨种子_1020054.png create mode 100644 web/public/shop_plants_organized/椰子_from_椰子种子_1020029.png create mode 100644 web/public/shop_plants_organized/榛子_from_榛子种子_1020072.png create mode 100644 web/public/shop_plants_organized/榴莲_from_榴莲种子_1020058.png create mode 100644 web/public/shop_plants_organized/樱桃_from_樱桃种子_1020034.png create mode 100644 web/public/shop_plants_organized/橙子_from_橙子种子_1020019.png create mode 100644 web/public/shop_plants_organized/水稻_from_水稻种子_1020060.png create mode 100644 web/public/shop_plants_organized/油菜_from_油菜种子_1020099.png create mode 100644 web/public/shop_plants_organized/满天星_from_满天星种子_1020110.png create mode 100644 web/public/shop_plants_organized/火绒草_from_火绒草种子_1020135.png create mode 100644 web/public/shop_plants_organized/火龙果_from_火龙果种子_1020033.png create mode 100644 web/public/shop_plants_organized/牵牛花_from_牵牛花种子_1020147.png create mode 100644 web/public/shop_plants_organized/猕猴桃_from_猕猴桃种子_1020045.png create mode 100644 web/public/shop_plants_organized/猪笼草_from_猪笼草种子_1020220.png create mode 100644 web/public/shop_plants_organized/玉米_from_玉米种子_1020004.png create mode 100644 web/public/shop_plants_organized/瓶子树_from_瓶子树种子_1020218.png create mode 100644 web/public/shop_plants_organized/甘蔗_from_甘蔗种子_1020047.png create mode 100644 web/public/shop_plants_organized/生菜_from_生菜种子_1020096.png create mode 100644 web/public/shop_plants_organized/番石榴_from_番石榴种子_1020079.png create mode 100644 web/public/shop_plants_organized/番茄_from_番茄种子_1020007.png create mode 100644 web/public/shop_plants_organized/白萝卜_from_白萝卜种子_1020002.png create mode 100644 web/public/shop_plants_organized/睡莲_from_睡莲种子_1020442.png create mode 100644 web/public/shop_plants_organized/石榴_from_石榴种子_1020023.png create mode 100644 web/public/shop_plants_organized/秋菊红色_from_红色秋菊种子_1020162.png create mode 100644 web/public/shop_plants_organized/秋菊黄色_from_黄色秋菊种子_1020161.png create mode 100644 web/public/shop_plants_organized/竹笋_from_竹笋种子_1020100.png create mode 100644 web/public/shop_plants_organized/箬竹_from_箬竹种子_1020036.png create mode 100644 web/public/shop_plants_organized/红枣_from_红枣种子_1020051.png create mode 100644 web/public/shop_plants_organized/红玫瑰_from_红玫瑰种子_1020041.png create mode 100644 web/public/shop_plants_organized/胡萝卜_from_胡萝卜种子_1020003.png create mode 100644 web/public/shop_plants_organized/芒果_from_芒果种子_1020057.png create mode 100644 web/public/shop_plants_organized/花生_from_花生种子_1020049.png create mode 100644 web/public/shop_plants_organized/花菜_from_花菜种子_1020098.png create mode 100644 web/public/shop_plants_organized/花香根鸢尾_from_花香根鸢尾种子_1020141.png create mode 100644 web/public/shop_plants_organized/芹菜_from_芹菜种子_1020306.png create mode 100644 web/public/shop_plants_organized/苦瓜_from_苦瓜种子_1020063.png create mode 100644 web/public/shop_plants_organized/苹果_from_苹果种子_1020011.png create mode 100644 web/public/shop_plants_organized/茄子_from_茄子种子_1020006.png create mode 100644 web/public/shop_plants_organized/茉莉花_from_茉莉花种子_1020128.png create mode 100644 web/public/shop_plants_organized/草莓_from_草莓种子_1020001.png create mode 100644 web/public/shop_plants_organized/荔枝_from_荔枝种子_1020035.png create mode 100644 web/public/shop_plants_organized/莲藕_from_莲藕种子_1020037.png create mode 100644 web/public/shop_plants_organized/菠菜_from_菠菜种子_1020073.png create mode 100644 web/public/shop_plants_organized/菠萝_from_菠萝种子_1020027.png create mode 100644 web/public/shop_plants_organized/葡萄_from_葡萄种子_1020013.png create mode 100644 web/public/shop_plants_organized/葫芦_from_葫芦种子_1020031.png create mode 100644 web/public/shop_plants_organized/蒲公英_from_蒲公英种子_1020120.png create mode 100644 web/public/shop_plants_organized/蓝莓_from_蓝莓种子_1020077.png create mode 100644 web/public/shop_plants_organized/蘑菇_from_蘑菇种子_1020050.png create mode 100644 web/public/shop_plants_organized/虞美人_from_虞美人种子_1020142.png create mode 100644 web/public/shop_plants_organized/西瓜_from_西瓜种子_1020014.png create mode 100644 web/public/shop_plants_organized/豌豆_from_豌豆种子_1020008.png create mode 100644 web/public/shop_plants_organized/豹皮花_from_豹皮花种子_1020222.png create mode 100644 web/public/shop_plants_organized/辣椒_from_辣椒种子_1020009.png create mode 100644 web/public/shop_plants_organized/迎春花_from_迎春花种子_1020396.png create mode 100644 web/public/shop_plants_organized/金桔_from_金桔种子_1020074.png create mode 100644 web/public/shop_plants_organized/金针菇_from_金针菇种子_1020052.png create mode 100644 web/public/shop_plants_organized/银莲花_from_银莲花种子_1020259.png create mode 100644 web/public/shop_plants_organized/非洲菊_from_非洲菊种子_1020104.png create mode 100644 web/public/shop_plants_organized/韭菜_from_韭菜种子_1020305.png create mode 100644 web/public/shop_plants_organized/香瓜_from_香瓜种子_1020067.png create mode 100644 web/public/shop_plants_organized/香蕉_from_香蕉种子_1020015.png create mode 100644 web/public/shop_plants_organized/鲜姜_from_鲜姜种子_1020066.png create mode 100644 web/public/shop_plants_organized/黄瓜_from_黄瓜种子_1020097.png create mode 100644 web/public/shop_plants_organized/黄豆_from_黄豆种子_1020070.png create mode 100644 web/public/verified_items/100003_化肥礼包_4_d13af7af.png create mode 100644 web/public/verified_items/1001_金币_4_65088be3.png create mode 100644 web/public/verified_items/1002_点券_50_bd489f54.png create mode 100644 web/public/verified_items/1004_钻石_7_ff3c1c6f.png create mode 100644 web/public/verified_items/1011_普通化肥容器_12_3ad710ed.png create mode 100644 web/public/verified_items/1012_有机化肥容器_49_fe1c87b7.png create mode 100644 web/public/verified_items/80001_化肥1小时_1_cb2a91eb.png create mode 100644 web/public/verified_items/80002_化肥4小时_1_af16205d.png create mode 100644 web/public/verified_items/80003_化肥8小时_1_c3700ffc.png create mode 100644 web/public/verified_items/80004_化肥12小时_1_179fe100.png create mode 100644 web/public/verified_items/80011_有机化肥1小时_2_8fe4411f.png create mode 100644 web/public/verified_items/80012_有机化肥4小时_1_03357e47.png create mode 100644 web/public/verified_items/80013_有机化肥8小时_1_242b3363.png create mode 100644 web/public/verified_items/80014_有机化肥12小时_2_5b6e11c0.png create mode 100644 web/public/verified_items/90001_田园犬_1.png create mode 100644 web/public/verified_items/90002_牧羊犬_1_0a3a47cb.png create mode 100644 web/public/verified_items/90003_斑点狗_1_ccf8c0ff.png create mode 100644 web/public/verified_items/90004_1天狗粮_1_ec8e4ace.png create mode 100644 web/public/verified_items/90005_3天狗粮_1_835fa5b1.png create mode 100644 web/public/verified_items/90006_5天狗粮_1_a04b7acf.png create mode 100644 web/public/verified_items/index.html create mode 100644 web/public/verified_items/mapping.json create mode 100644 web/public/verified_items/土地.png create mode 100644 web/public/vite.svg create mode 100644 web/src/App.css create mode 100644 web/src/App.tsx create mode 100644 web/src/assets/fonts/MapleMono-NF-CN-Regular.woff2 create mode 100644 web/src/assets/logo.png create mode 100644 web/src/assets/react.svg create mode 100644 web/src/components/FarmGrid.tsx create mode 100644 web/src/components/FriendList.tsx create mode 100644 web/src/components/LogPanel.tsx create mode 100644 web/src/components/ShopPanel.tsx create mode 100644 web/src/components/StatusBar.tsx create mode 100644 web/src/components/SystemMonitor.tsx create mode 100644 web/src/components/WarehousePanel.tsx create mode 100644 web/src/components/ui/avatar.tsx create mode 100644 web/src/components/ui/button.tsx create mode 100644 web/src/components/ui/card.tsx create mode 100644 web/src/components/ui/dialog.tsx create mode 100644 web/src/components/ui/input.tsx create mode 100644 web/src/components/ui/scroll-area.tsx create mode 100644 web/src/components/ui/tabs.tsx create mode 100644 web/src/index.css create mode 100644 web/src/lib/utils.ts create mode 100644 web/src/main.tsx create mode 100644 web/src/pages/Dashboard.tsx create mode 100644 web/src/pages/Login.tsx create mode 100644 web/tailwind.config.js create mode 100644 web/tsconfig.app.json create mode 100644 web/tsconfig.json create mode 100644 web/tsconfig.node.json create mode 100644 web/vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14d231e --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Dependencies +node_modules/ +.pnp +.pnp.js + +# Testing +coverage/ + +# Production +dist/ +build/ + +# Misc +.DS_Store +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Backups +backups/ +_upstream/ +*.zip +*.rar +*.7z +*.bak + +# Trae/IDE +.trae/ +.vscode/ +.idea/ + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# OS +Thumbs.db diff --git a/211/server/client.js b/211/server/client.js new file mode 100644 index 0000000..b5392c8 --- /dev/null +++ b/211/server/client.js @@ -0,0 +1,139 @@ +/** + * QQ经典农场 挂机脚本 - 入口文件 + * + * 模块结构: + * src/config.js - 配置常量与枚举 + * src/utils.js - 通用工具函数 + * src/proto.js - Protobuf 加载与类型管理 + * src/core/ - 核心逻辑 (FarmBot, Network, FarmManager, FriendManager) + * src/decode.js - PB解码/验证工具模式 + */ + +const { CONFIG } = require('./src/config'); +const { loadProto } = require('./src/proto'); +const { FarmBot } = require('./src/core/FarmBot'); +const { verifyMode, decodeMode } = require('./src/decode'); +const { emitRuntimeHint, sleep } = require('./src/utils'); + +// ============ 帮助信息 ============ +function showHelp() { + console.log(` +QQ经典农场 挂机脚本 (重构版) +==================== + +用法: + node client.js --code <登录code> [--wx] [--interval <秒>] [--friend-interval <秒>] + node client.js --verify + node client.js --decode <数据> [--hex] [--gate] [--type <消息类型>] + +参数: + --code 小程序 login() 返回的临时凭证 (必需) + --wx 使用微信登录 (默认为QQ小程序) + --interval 自己农场巡查完成后等待秒数, 默认10秒, 最低10秒 + --friend-interval 好友巡查完成后等待秒数, 默认1秒, 最低1秒 + --verify 验证proto定义 + --decode 解码PB数据 (运行 --decode 无参数查看详细帮助) + +功能: + - 自动收获成熟作物 → 购买种子 → 种植 → 施肥 + - 自动除草、除虫、浇水 + - 自动铲除枯死作物 + - 自动巡查好友农场: 帮忙浇水/除草/除虫 + 偷菜 + - 自动领取任务奖励 (支持分享翻倍) + - 每分钟自动出售仓库果实 + - 启动时读取 share.txt 处理邀请码 (仅微信) + - 心跳保活 +`); +} + +// ============ 参数解析 ============ +function parseArgs(args) { + const options = { + code: '', + deleteAccountMode: false, + name: '', + certId: '', + certType: 0, + }; + + for (let i = 0; i < args.length; i++) { + if (args[i] === '--code' && args[i + 1]) { + options.code = args[++i]; + } + if (args[i] === '--wx') { + CONFIG.platform = 'wx'; + } + if (args[i] === '--interval' && args[i + 1]) { + const sec = parseInt(args[++i]); + CONFIG.farmCheckInterval = Math.max(sec, 1) * 1000; + } + if (args[i] === '--friend-interval' && args[i + 1]) { + const sec = parseInt(args[++i]); + CONFIG.friendCheckInterval = Math.max(sec, 1) * 1000; // 最低1秒 + } + } + return options; +} + +// ============ 主函数 ============ +async function main() { + const args = process.argv.slice(2); + + // 加载 proto 定义 + await loadProto(); + + // 验证模式 + if (args.includes('--verify')) { + await verifyMode(); + return; + } + + // 解码模式 + if (args.includes('--decode')) { + await decodeMode(args); + return; + } + + // 正常运行模式 + const options = parseArgs(args); + + if (!options.code) { + showHelp(); + return; + } + + // 更新 CONFIG 中的 code (注意: FarmBot 构造函数会合并 CONFIG 和传入的 config) + // 这里我们可以直接修改全局 CONFIG,或者传入 options + // 为了兼容旧代码习惯,我们修改全局 CONFIG + // 但 FarmBot 建议传入 config + const botConfig = { + code: options.code, + // 其他参数已通过 modify global CONFIG 生效,或者也可以显式传入 + }; + + console.log('正在启动 FarmBot...'); + const bot = new FarmBot(botConfig); + + // 优雅退出 + process.on('SIGINT', () => { + console.log('\n正在停止...'); + bot.stop(); + process.exit(0); + }); + + try { + await bot.start(); + + // 保持进程运行 (如果 start() 返回后没有挂起的操作) + // FarmBot 内部启动了 interval,所以进程应该会保持运行 + + } catch (error) { + console.error('Bot 运行出错:', error); + process.exit(1); + } +} + +main().catch(err => { + console.error('未捕获的异常:', err); + process.exit(1); +}); diff --git a/211/server/data/users.db b/211/server/data/users.db new file mode 100644 index 0000000000000000000000000000000000000000..89b518a43323b252af678eb484833b609abee1ee GIT binary patch literal 86016 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 gs?d@$mj7B_o;UBAG%>+4*&oF literal 0 HcmV?d00001 diff --git a/211/server/gameConfig/Plant.json b/211/server/gameConfig/Plant.json new file mode 100644 index 0000000..9a1d24c --- /dev/null +++ b/211/server/gameConfig/Plant.json @@ -0,0 +1,4061 @@ +[ + { + "id": 2020002, + "name": "白萝卜", + "mutant": "", + "fruit": { + "id": 40002, + "count": 5 + }, + "seed_id": 29999, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:1;发芽:1;成熟:0;", + "exp": 1, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020002, + "name": "白萝卜", + "mutant": "1:102003;2:1020059", + "fruit": { + "id": 40002, + "count": 5 + }, + "seed_id": 20002, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:30;发芽:30;成熟:0;", + "exp": 1, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020003, + "name": "胡萝卜", + "mutant": "", + "fruit": { + "id": 40003, + "count": 10 + }, + "seed_id": 20003, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:30;发芽:30;小叶子:30;大叶子:30;成熟:0;", + "exp": 2, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020059, + "name": "大白菜", + "mutant": "", + "fruit": { + "id": 40059, + "count": 20 + }, + "seed_id": 20059, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:60;发芽:60;幼苗:60;成株:60;卷心:60;成熟:0;", + "exp": 5, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020065, + "name": "大蒜", + "mutant": "", + "fruit": { + "id": 40065, + "count": 20 + }, + "seed_id": 20065, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:120;发芽:120;幼苗:120;伸长:120;初熟:120;成熟:0;", + "exp": 10, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020064, + "name": "大葱", + "mutant": "", + "fruit": { + "id": 40064, + "count": 30 + }, + "seed_id": 20064, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:300;发芽:300;小叶子:300;大叶子:300;成熟:0;", + "exp": 20, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020060, + "name": "水稻", + "mutant": "", + "fruit": { + "id": 40060, + "count": 30 + }, + "seed_id": 20060, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:480;幼苗:480;秧苗:480;幼穗:480;开花:480;成熟:0;", + "exp": 41, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020061, + "name": "小麦", + "mutant": "", + "fruit": { + "id": 40061, + "count": 40 + }, + "seed_id": 20061, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:720;发芽:720;小叶子:720;大叶子:720;幼穗:720;成熟:0;", + "exp": 62, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020004, + "name": "玉米", + "mutant": "", + "fruit": { + "id": 40004, + "count": 40 + }, + "seed_id": 20004, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:960;发芽:960;小叶子:960;大叶子:960;开花:960;成熟:0;", + "exp": 82, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020066, + "name": "鲜姜", + "mutant": "", + "fruit": { + "id": 40066, + "count": 60 + }, + "seed_id": 20066, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:1500;发芽:1500;小叶子:1500;大叶子:1500;成熟:0;", + "exp": 106, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020005, + "name": "土豆", + "mutant": "", + "fruit": { + "id": 40005, + "count": 60 + }, + "seed_id": 20005, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:1440;发芽:1440;小叶子:1440;大叶子:1440;初熟:1440;成熟:0;", + "exp": 128, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020071, + "name": "小白菜", + "mutant": "", + "fruit": { + "id": 40071, + "count": 80 + }, + "seed_id": 20071, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2250;发芽:2250;小叶子:2250;大叶子:2250;成熟:0;", + "exp": 160, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020096, + "name": "生菜", + "mutant": "", + "fruit": { + "id": 40096, + "count": 80 + }, + "seed_id": 20096, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2160;发芽:2160;小叶子:2160;大叶子:2160;初熟:2160;成熟:0;", + "exp": 192, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020099, + "name": "油菜", + "mutant": "", + "fruit": { + "id": 40099, + "count": 200 + }, + "seed_id": 20099, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:3600;发芽:3600;小叶子:3600;大叶子:3600;成熟:0;", + "exp": 272, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020006, + "name": "茄子", + "mutant": "", + "fruit": { + "id": 40006, + "count": 200 + }, + "seed_id": 20006, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0;", + "exp": 544, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020051, + "name": "红枣", + "mutant": "", + "fruit": { + "id": 40051, + "count": 200 + }, + "seed_id": 20051, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0;", + "exp": 816, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020120, + "name": "蒲公英", + "mutant": "", + "fruit": { + "id": 40120, + "count": 200 + }, + "seed_id": 20120, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;小叶子:17280;大叶子:17280;花蕾:17280;盛开:17280;成熟:0;", + "exp": 1632, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020259, + "name": "银莲花", + "mutant": "", + "fruit": { + "id": 40259, + "count": 200 + }, + "seed_id": 20259, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶:2880;大叶:2880;花蕾:2880;开花:0;", + "exp": 288, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020007, + "name": "番茄", + "mutant": "", + "fruit": { + "id": 40007, + "count": 200 + }, + "seed_id": 20007, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0;", + "exp": 576, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020098, + "name": "花菜", + "mutant": "", + "fruit": { + "id": 40098, + "count": 200 + }, + "seed_id": 20098, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;幼苗:8640;卷心:8640;初熟:8640;成熟:0;", + "exp": 864, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020305, + "name": "韭菜", + "mutant": "", + "fruit": { + "id": 40305, + "count": 200 + }, + "seed_id": 20305, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0;", + "exp": 1728, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020105, + "name": "小雏菊", + "mutant": "", + "fruit": { + "id": 40105, + "count": 200 + }, + "seed_id": 20105, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶子:2880;大叶子:2880;初熟:2880;成熟:0;", + "exp": 304, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020008, + "name": "豌豆", + "mutant": "", + "fruit": { + "id": 40008, + "count": 200 + }, + "seed_id": 20008, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0;", + "exp": 608, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020037, + "name": "莲藕", + "mutant": "", + "fruit": { + "id": 40037, + "count": 200 + }, + "seed_id": 20037, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0;", + "exp": 912, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020041, + "name": "红玫瑰", + "mutant": "", + "fruit": { + "id": 40041, + "count": 200 + }, + "seed_id": 20041, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0;", + "exp": 1824, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020161, + "name": "秋菊(黄色)", + "mutant": "", + "fruit": { + "id": 40161, + "count": 200 + }, + "seed_id": 20161, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶子:2880;大叶子:2880;花蕾:2880;盛开:0;", + "exp": 324, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020110, + "name": "满天星", + "mutant": "", + "fruit": { + "id": 40110, + "count": 200 + }, + "seed_id": 20110, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;花蕾:5760;盛开:0;", + "exp": 648, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020143, + "name": "含羞草", + "mutant": "", + "fruit": { + "id": 40143, + "count": 200 + }, + "seed_id": 20143, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:7200;花蕾:7200;盛开:7200;成熟:0;", + "exp": 972, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020147, + "name": "牵牛花", + "mutant": "", + "fruit": { + "id": 40147, + "count": 200 + }, + "seed_id": 20147, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;花蕾:17280;盛开:0;", + "exp": 1944, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020162, + "name": "秋菊(红色)", + "mutant": "", + "fruit": { + "id": 40162, + "count": 200 + }, + "seed_id": 20162, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶子:2880;大叶子:2880;花蕾:2880;盛开:0;", + "exp": 344, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020009, + "name": "辣椒", + "mutant": "", + "fruit": { + "id": 40009, + "count": 200 + }, + "seed_id": 20009, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0;", + "exp": 688, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020097, + "name": "黄瓜", + "mutant": "", + "fruit": { + "id": 40097, + "count": 200 + }, + "seed_id": 20097, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0;", + "exp": 1032, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020306, + "name": "芹菜", + "mutant": "", + "fruit": { + "id": 40306, + "count": 200 + }, + "seed_id": 20306, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0;", + "exp": 2064, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020103, + "name": "天香百合", + "mutant": "", + "fruit": { + "id": 40103, + "count": 200 + }, + "seed_id": 20103, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶子:2880;大叶子:2880;初熟:2880;成熟:0;", + "exp": 368, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020010, + "name": "南瓜", + "mutant": "", + "fruit": { + "id": 40010, + "count": 200 + }, + "seed_id": 20010, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0;", + "exp": 736, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020308, + "name": "核桃", + "mutant": "", + "fruit": { + "id": 40308, + "count": 200 + }, + "seed_id": 20308, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:10800;发芽:10800;小叶子:10800;大叶子:10800;成熟:0;", + "exp": 1104, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020091, + "name": "山楂", + "mutant": "", + "fruit": { + "id": 40091, + "count": 200 + }, + "seed_id": 20091, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:14400;开花:14400;初熟:14400;成熟:0;", + "exp": 2208, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020073, + "name": "菠菜", + "mutant": "", + "fruit": { + "id": 40073, + "count": 200 + }, + "seed_id": 20073, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶子:2880;大叶子:2880;初熟:2880;成熟:0;", + "exp": 392, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020001, + "name": "草莓", + "mutant": "", + "fruit": { + "id": 40001, + "count": 200 + }, + "seed_id": 20001, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0;", + "exp": 784, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020011, + "name": "苹果", + "mutant": "", + "fruit": { + "id": 40011, + "count": 200 + }, + "seed_id": 20011, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0;", + "exp": 1176, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020062, + "name": "四叶草", + "mutant": "", + "fruit": { + "id": 40062, + "count": 200 + }, + "seed_id": 20062, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0;", + "exp": 2352, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020104, + "name": "非洲菊", + "mutant": "", + "fruit": { + "id": 40104, + "count": 200 + }, + "seed_id": 20104, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:2400;花蕾:2400;盛开:2400;成熟:0;", + "exp": 420, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020135, + "name": "火绒草", + "mutant": "", + "fruit": { + "id": 40135, + "count": 200 + }, + "seed_id": 20135, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;花蕾:5760;盛开:0;", + "exp": 840, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020141, + "name": "花香根鸢尾", + "mutant": "", + "fruit": { + "id": 40141, + "count": 200 + }, + "seed_id": 20141, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;花蕾:8640;盛开:0;", + "exp": 1260, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020142, + "name": "虞美人", + "mutant": "", + "fruit": { + "id": 40142, + "count": 200 + }, + "seed_id": 20142, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;花蕾:17280;盛开:0;", + "exp": 2520, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020145, + "name": "向日葵", + "mutant": "", + "fruit": { + "id": 40145, + "count": 200 + }, + "seed_id": 20145, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:2400;开花:2400;初熟:2400;成熟:0;", + "exp": 448, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020014, + "name": "西瓜", + "mutant": "", + "fruit": { + "id": 40014, + "count": 200 + }, + "seed_id": 20014, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0;", + "exp": 896, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020070, + "name": "黄豆", + "mutant": "", + "fruit": { + "id": 40070, + "count": 200 + }, + "seed_id": 20070, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;初熟:8640;成熟:0;", + "exp": 1344, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020015, + "name": "香蕉", + "mutant": "", + "fruit": { + "id": 40015, + "count": 200 + }, + "seed_id": 20015, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;开花:17280;成熟:0;", + "exp": 2688, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020100, + "name": "竹笋", + "mutant": "", + "fruit": { + "id": 40100, + "count": 200 + }, + "seed_id": 20100, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;幼苗:2880;伸长:2880;初熟:2880;成熟:0;", + "exp": 476, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020018, + "name": "桃子", + "mutant": "", + "fruit": { + "id": 40018, + "count": 200 + }, + "seed_id": 20018, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;开花:5760;小叶子:5760;大叶子:5760;成熟:0;", + "exp": 952, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020047, + "name": "甘蔗", + "mutant": "", + "fruit": { + "id": 40047, + "count": 200 + }, + "seed_id": 20047, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;幼苗:8640;分叶:8640;伸长:8640;成熟:0;", + "exp": 1428, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020019, + "name": "橙子", + "mutant": "", + "fruit": { + "id": 40019, + "count": 200 + }, + "seed_id": 20019, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;开花:17280;成熟:0;", + "exp": 2856, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020128, + "name": "茉莉花", + "mutant": "", + "fruit": { + "id": 40128, + "count": 200 + }, + "seed_id": 20128, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;发芽:2880;小叶子:2880;大叶子:2880;花蕾:2880;盛开:0;", + "exp": 508, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020013, + "name": "葡萄", + "mutant": "", + "fruit": { + "id": 40013, + "count": 200 + }, + "seed_id": 20013, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0;", + "exp": 1016, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020044, + "name": "丝瓜", + "mutant": "", + "fruit": { + "id": 40044, + "count": 200 + }, + "seed_id": 20044, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;长枝:8640;开花:8640;小叶子:8640;大叶子:8640;结果:0;", + "exp": 1524, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020072, + "name": "榛子", + "mutant": "", + "fruit": { + "id": 40072, + "count": 200 + }, + "seed_id": 20072, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;开花:17280;小叶子:17280;大叶子:17280;成熟:0;", + "exp": 3048, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020396, + "name": "迎春花", + "mutant": "", + "fruit": { + "id": 40396, + "count": 200 + }, + "seed_id": 20396, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:2880;幼芽:2880;小叶:2880;大叶:2880;花蕾:2880;开花:0;", + "exp": 540, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020023, + "name": "石榴", + "mutant": "", + "fruit": { + "id": 40023, + "count": 200 + }, + "seed_id": 20023, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0;", + "exp": 1080, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020095, + "name": "栗子", + "mutant": "", + "fruit": { + "id": 40095, + "count": 200 + }, + "seed_id": 20095, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0;", + "exp": 1620, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020026, + "name": "柚子", + "mutant": "", + "fruit": { + "id": 40026, + "count": 200 + }, + "seed_id": 20026, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:17280;发芽:17280;小叶子:17280;大叶子:17280;开花:17280;成熟:0;", + "exp": 3240, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020050, + "name": "蘑菇", + "mutant": "", + "fruit": { + "id": 40050, + "count": 200 + }, + "seed_id": 20050, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:3600;发芽:3600;大叶子:3600;初熟:3600;成熟:0;", + "exp": 429, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020027, + "name": "菠萝", + "mutant": "", + "fruit": { + "id": 40027, + "count": 200 + }, + "seed_id": 20027, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0;", + "exp": 858, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020036, + "name": "箬竹", + "mutant": "", + "fruit": { + "id": 40036, + "count": 200 + }, + "seed_id": 20036, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;初熟:10800;成熟:0;", + "exp": 1287, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020043, + "name": "无花果", + "mutant": "", + "fruit": { + "id": 40043, + "count": 200 + }, + "seed_id": 20043, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0;", + "exp": 2574, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020029, + "name": "椰子", + "mutant": "", + "fruit": { + "id": 40029, + "count": 200 + }, + "seed_id": 20029, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0;", + "exp": 456, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020049, + "name": "花生", + "mutant": "", + "fruit": { + "id": 40049, + "count": 200 + }, + "seed_id": 20049, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0;", + "exp": 912, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020052, + "name": "金针菇", + "mutant": "", + "fruit": { + "id": 40052, + "count": 200 + }, + "seed_id": 20052, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发菌:7200;出菇:7200;幼菇:10800;初熟:10800;成熟:0;", + "exp": 1368, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020031, + "name": "葫芦", + "mutant": "", + "fruit": { + "id": 40031, + "count": 200 + }, + "seed_id": 20031, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0;", + "exp": 2736, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020045, + "name": "猕猴桃", + "mutant": "", + "fruit": { + "id": 40045, + "count": 200 + }, + "seed_id": 20045, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0;", + "exp": 480, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020054, + "name": "梨", + "mutant": "", + "fruit": { + "id": 40054, + "count": 200 + }, + "seed_id": 20054, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0;", + "exp": 960, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020442, + "name": "睡莲", + "mutant": "", + "fruit": { + "id": 40442, + "count": 200 + }, + "seed_id": 20442, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;幼株:10800;成熟:0;", + "exp": 1440, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020033, + "name": "火龙果", + "mutant": "", + "fruit": { + "id": 40033, + "count": 200 + }, + "seed_id": 20033, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0;", + "exp": 2880, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020055, + "name": "枇杷", + "mutant": "", + "fruit": { + "id": 40055, + "count": 200 + }, + "seed_id": 20055, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0;", + "exp": 510, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020034, + "name": "樱桃", + "mutant": "", + "fruit": { + "id": 40034, + "count": 200 + }, + "seed_id": 20034, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0;", + "exp": 1020, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020413, + "name": "李子", + "mutant": "", + "fruit": { + "id": 40413, + "count": 200 + }, + "seed_id": 20413, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 1530, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020035, + "name": "荔枝", + "mutant": "", + "fruit": { + "id": 40035, + "count": 200 + }, + "seed_id": 20035, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0;", + "exp": 3060, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020067, + "name": "香瓜", + "mutant": "", + "fruit": { + "id": 40067, + "count": 200 + }, + "seed_id": 20067, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0;", + "exp": 537, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020038, + "name": "木瓜", + "mutant": "", + "fruit": { + "id": 40038, + "count": 200 + }, + "seed_id": 20038, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0;", + "exp": 1074, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020053, + "name": "桂圆", + "mutant": "", + "fruit": { + "id": 40053, + "count": 200 + }, + "seed_id": 20053, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 1611, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020080, + "name": "月柿", + "mutant": "", + "fruit": { + "id": 40080, + "count": 200 + }, + "seed_id": 20080, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0;", + "exp": 3222, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020039, + "name": "杨桃", + "mutant": "", + "fruit": { + "id": 40039, + "count": 200 + }, + "seed_id": 20039, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0;", + "exp": 567, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020056, + "name": "哈密瓜", + "mutant": "", + "fruit": { + "id": 40056, + "count": 200 + }, + "seed_id": 20056, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0;", + "exp": 1134, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020075, + "name": "桑葚", + "mutant": "", + "fruit": { + "id": 40075, + "count": 200 + }, + "seed_id": 20075, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 1701, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020042, + "name": "柠檬", + "mutant": "", + "fruit": { + "id": 40042, + "count": 200 + }, + "seed_id": 20042, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0;", + "exp": 3402, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020057, + "name": "芒果", + "mutant": "", + "fruit": { + "id": 40057, + "count": 200 + }, + "seed_id": 20057, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0;", + "exp": 597, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020048, + "name": "杨梅", + "mutant": "", + "fruit": { + "id": 40048, + "count": 200 + }, + "seed_id": 20048, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0;", + "exp": 1194, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020058, + "name": "榴莲", + "mutant": "", + "fruit": { + "id": 40058, + "count": 200 + }, + "seed_id": 20058, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 1791, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020079, + "name": "番石榴", + "mutant": "", + "fruit": { + "id": 40079, + "count": 200 + }, + "seed_id": 20079, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0;", + "exp": 3582, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020218, + "name": "瓶子树", + "mutant": "", + "fruit": { + "id": 40218, + "count": 200 + }, + "seed_id": 20218, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;长枝:2400;小叶子:2400;大叶子:3600;初熟:3600;成树:0;", + "exp": 627, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020077, + "name": "蓝莓", + "mutant": "", + "fruit": { + "id": 40077, + "count": 200 + }, + "seed_id": 20077, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0;", + "exp": 1254, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020220, + "name": "猪笼草", + "mutant": "", + "fruit": { + "id": 40220, + "count": 200 + }, + "seed_id": 20220, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;初熟:10800;成熟:0;", + "exp": 1881, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020076, + "name": "山竹", + "mutant": "", + "fruit": { + "id": 40076, + "count": 200 + }, + "seed_id": 20076, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0;", + "exp": 3762, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020116, + "name": "曼陀罗华", + "mutant": "", + "fruit": { + "id": 40116, + "count": 200 + }, + "seed_id": 20116, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;花蕾:3600;盛开:0;", + "exp": 660, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020126, + "name": "曼珠沙华", + "mutant": "", + "fruit": { + "id": 40126, + "count": 200 + }, + "seed_id": 20126, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0;", + "exp": 1320, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020063, + "name": "苦瓜", + "mutant": "", + "fruit": { + "id": 40063, + "count": 200 + }, + "seed_id": 20063, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 1980, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020221, + "name": "天堂鸟", + "mutant": "", + "fruit": { + "id": 40221, + "count": 200 + }, + "seed_id": 20221, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;花蕾:21600;盛开:0;", + "exp": 3960, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020068, + "name": "冬瓜", + "mutant": "", + "fruit": { + "id": 40068, + "count": 200 + }, + "seed_id": 20068, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0;", + "exp": 693, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020222, + "name": "豹皮花", + "mutant": "", + "fruit": { + "id": 40222, + "count": 200 + }, + "seed_id": 20222, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;花蕾:7200;盛开:0;", + "exp": 1386, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020078, + "name": "杏子", + "mutant": "", + "fruit": { + "id": 40078, + "count": 200 + }, + "seed_id": 20078, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;初熟:10800;成熟:0;", + "exp": 2079, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020074, + "name": "金桔", + "mutant": "", + "fruit": { + "id": 40074, + "count": 200 + }, + "seed_id": 20074, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0;", + "exp": 4158, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020083, + "name": "红毛丹", + "mutant": "", + "fruit": { + "id": 40083, + "count": 200 + }, + "seed_id": 20083, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0;", + "exp": 726, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020225, + "name": "宝华玉兰", + "mutant": "", + "fruit": { + "id": 40225, + "count": 200 + }, + "seed_id": 20225, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;花蕾:7200;盛开:0;", + "exp": 1452, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020084, + "name": "芭蕉", + "mutant": "", + "fruit": { + "id": 40084, + "count": 200 + }, + "seed_id": 20084, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;结果:0;", + "exp": 2178, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020226, + "name": "依米花", + "mutant": "", + "fruit": { + "id": 40226, + "count": 200 + }, + "seed_id": 20226, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;花蕾:21600;盛开:0;", + "exp": 4356, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020085, + "name": "番荔枝", + "mutant": "", + "fruit": { + "id": 40085, + "count": 200 + }, + "seed_id": 20085, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;结果:0;", + "exp": 762, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020227, + "name": "大王花", + "mutant": "", + "fruit": { + "id": 40227, + "count": 200 + }, + "seed_id": 20227, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;幼蕾:4800;含苞:7200;初放:7200;盛开:0;", + "exp": 1524, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020086, + "name": "橄榄", + "mutant": "", + "fruit": { + "id": 40086, + "count": 200 + }, + "seed_id": 20086, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 2286, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020228, + "name": "人参果", + "mutant": "", + "fruit": { + "id": 40228, + "count": 200 + }, + "seed_id": 20228, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0;", + "exp": 4572, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020087, + "name": "百香果", + "mutant": "", + "fruit": { + "id": 40087, + "count": 200 + }, + "seed_id": 20087, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;结果:0;", + "exp": 795, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020235, + "name": "金花茶", + "mutant": "", + "fruit": { + "id": 40235, + "count": 200 + }, + "seed_id": 20235, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;花蕾:7200;盛开:0;", + "exp": 1590, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020088, + "name": "灯笼果", + "mutant": "", + "fruit": { + "id": 40088, + "count": 200 + }, + "seed_id": 20088, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;结果:0;", + "exp": 2385, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020201, + "name": "天山雪莲", + "mutant": "", + "fruit": { + "id": 40201, + "count": 200 + }, + "seed_id": 20201, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;幼株:21600;成熟:0;", + "exp": 4770, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020089, + "name": "芦荟", + "mutant": "", + "fruit": { + "id": 40089, + "count": 200 + }, + "seed_id": 20089, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0;", + "exp": 831, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020202, + "name": "金边灵芝", + "mutant": "", + "fruit": { + "id": 40202, + "count": 200 + }, + "seed_id": 20202, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;芝蕾:4800;幼芝:7200;初熟:7200;成熟:0;", + "exp": 1662, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020090, + "name": "薄荷", + "mutant": "", + "fruit": { + "id": 40090, + "count": 200 + }, + "seed_id": 20090, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 2493, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020229, + "name": "何首乌", + "mutant": "", + "fruit": { + "id": 40229, + "count": 200 + }, + "seed_id": 20229, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0;", + "exp": 4986, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020016, + "name": "菠萝蜜", + "mutant": "", + "fruit": { + "id": 40016, + "count": 200 + }, + "seed_id": 20016, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0;", + "exp": 867, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020204, + "name": "人参", + "mutant": "", + "fruit": { + "id": 40204, + "count": 200 + }, + "seed_id": 20204, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0;", + "exp": 1734, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020022, + "name": "鳄梨", + "mutant": "", + "fruit": { + "id": 40022, + "count": 200 + }, + "seed_id": 20022, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0;", + "exp": 2601, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1020242, + "name": "似血杜鹃", + "mutant": "", + "fruit": { + "id": 40242, + "count": 200 + }, + "seed_id": 20242, + "land_level_need": 1, + "seasons": 2, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;花蕾:21600;盛开:0;", + "exp": 5202, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 1021542, + "name": "新春红包", + "mutant": "", + "fruit": { + "id": 41542, + "count": 20 + }, + "seed_id": 21542, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0;", + "exp": 688, + "size": 0, + "offsetPosition": { + "x": 0, + "y": 0 + }, + "mutantEffectScale": { + "x": 1, + "y": 1 + }, + "harvestOffsetPosition": { + "x": -35, + "y": 40 + }, + "harvestRandom": false, + "harvestAllSpineRes": "", + "harvestAllOffsetPosition": "", + "all_state_spine": "spine/v2/xiyouzhongzi/red packet_tree", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "" + }, + { + "id": 2029998, + "name": "哈哈南瓜", + "mutant": "", + "fruit": { + "id": 40416, + "count": 50 + }, + "seed_id": 29998, + "land_level_need": 1, + "seasons": 1, + "grow_phases": "种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0;", + "exp": 1, + "size": 2, + "offsetPosition": { + "x": 100, + "y": 0 + }, + "mutantEffectScale": { + "x": 1.75, + "y": 1.5 + }, + "harvestOffsetPosition": { + "x": 0, + "y": 0 + }, + "harvestRandom": true, + "harvestAllSpineRes": "spine/v2/shouge/Crop_sg_final", + "harvestAllOffsetPosition": "5:30;50:-30;150:-75;200:-25;150:-30", + "all_state_spine": "spine/v2/xiyouzhongzi/xiyouzhongzi", + "mature_effect": "effect/prefab/effect_plant_maturation", + "rare_plant_light_pos": "{\"x\":113,\"y\":125,\"rotation\":0,\"scale\":{\"x\":1,\"y\":1}}" + } +] \ No newline at end of file diff --git a/211/server/gameConfig/RoleLevel.json b/211/server/gameConfig/RoleLevel.json new file mode 100644 index 0000000..403a309 --- /dev/null +++ b/211/server/gameConfig/RoleLevel.json @@ -0,0 +1,802 @@ +[ + { + "level": 1, + "exp": 0 + }, + { + "level": 2, + "exp": 100 + }, + { + "level": 3, + "exp": 300 + }, + { + "level": 4, + "exp": 700 + }, + { + "level": 5, + "exp": 1300 + }, + { + "level": 6, + "exp": 2300 + }, + { + "level": 7, + "exp": 4000 + }, + { + "level": 8, + "exp": 6600 + }, + { + "level": 9, + "exp": 10100 + }, + { + "level": 10, + "exp": 14300 + }, + { + "level": 11, + "exp": 19300 + }, + { + "level": 12, + "exp": 25100 + }, + { + "level": 13, + "exp": 31800 + }, + { + "level": 14, + "exp": 39500 + }, + { + "level": 15, + "exp": 48300 + }, + { + "level": 16, + "exp": 58300 + }, + { + "level": 17, + "exp": 69500 + }, + { + "level": 18, + "exp": 82000 + }, + { + "level": 19, + "exp": 95900 + }, + { + "level": 20, + "exp": 111300 + }, + { + "level": 21, + "exp": 128300 + }, + { + "level": 22, + "exp": 146900 + }, + { + "level": 23, + "exp": 167200 + }, + { + "level": 24, + "exp": 189300 + }, + { + "level": 25, + "exp": 213300 + }, + { + "level": 26, + "exp": 239300 + }, + { + "level": 27, + "exp": 267300 + }, + { + "level": 28, + "exp": 297400 + }, + { + "level": 29, + "exp": 329700 + }, + { + "level": 30, + "exp": 364300 + }, + { + "level": 31, + "exp": 401300 + }, + { + "level": 32, + "exp": 440700 + }, + { + "level": 33, + "exp": 482600 + }, + { + "level": 34, + "exp": 527100 + }, + { + "level": 35, + "exp": 574300 + }, + { + "level": 36, + "exp": 624300 + }, + { + "level": 37, + "exp": 677100 + }, + { + "level": 38, + "exp": 732800 + }, + { + "level": 39, + "exp": 791500 + }, + { + "level": 40, + "exp": 853300 + }, + { + "level": 41, + "exp": 918300 + }, + { + "level": 42, + "exp": 986500 + }, + { + "level": 43, + "exp": 1058000 + }, + { + "level": 44, + "exp": 1132900 + }, + { + "level": 45, + "exp": 1211300 + }, + { + "level": 46, + "exp": 1293300 + }, + { + "level": 47, + "exp": 1378900 + }, + { + "level": 48, + "exp": 1468200 + }, + { + "level": 49, + "exp": 1561300 + }, + { + "level": 50, + "exp": 1658300 + }, + { + "level": 51, + "exp": 1759300 + }, + { + "level": 52, + "exp": 1864300 + }, + { + "level": 53, + "exp": 1973400 + }, + { + "level": 54, + "exp": 2086700 + }, + { + "level": 55, + "exp": 2204300 + }, + { + "level": 56, + "exp": 2326300 + }, + { + "level": 57, + "exp": 2452700 + }, + { + "level": 58, + "exp": 2583600 + }, + { + "level": 59, + "exp": 2719100 + }, + { + "level": 60, + "exp": 2859300 + }, + { + "level": 61, + "exp": 3004300 + }, + { + "level": 62, + "exp": 3154100 + }, + { + "level": 63, + "exp": 3308800 + }, + { + "level": 64, + "exp": 3468500 + }, + { + "level": 65, + "exp": 3633300 + }, + { + "level": 66, + "exp": 3803300 + }, + { + "level": 67, + "exp": 3978500 + }, + { + "level": 68, + "exp": 4159000 + }, + { + "level": 69, + "exp": 4344900 + }, + { + "level": 70, + "exp": 4536300 + }, + { + "level": 71, + "exp": 4733300 + }, + { + "level": 72, + "exp": 4935900 + }, + { + "level": 73, + "exp": 5144200 + }, + { + "level": 74, + "exp": 5358300 + }, + { + "level": 75, + "exp": 5578300 + }, + { + "level": 76, + "exp": 5804300 + }, + { + "level": 77, + "exp": 6036300 + }, + { + "level": 78, + "exp": 6274400 + }, + { + "level": 79, + "exp": 6518700 + }, + { + "level": 80, + "exp": 6769300 + }, + { + "level": 81, + "exp": 7026300 + }, + { + "level": 82, + "exp": 7289700 + }, + { + "level": 83, + "exp": 7559600 + }, + { + "level": 84, + "exp": 7836100 + }, + { + "level": 85, + "exp": 8119300 + }, + { + "level": 86, + "exp": 8409300 + }, + { + "level": 87, + "exp": 8706100 + }, + { + "level": 88, + "exp": 9009800 + }, + { + "level": 89, + "exp": 9320500 + }, + { + "level": 90, + "exp": 9638300 + }, + { + "level": 91, + "exp": 9963300 + }, + { + "level": 92, + "exp": 10295500 + }, + { + "level": 93, + "exp": 10635000 + }, + { + "level": 94, + "exp": 10981900 + }, + { + "level": 95, + "exp": 11336300 + }, + { + "level": 96, + "exp": 11698300 + }, + { + "level": 97, + "exp": 12067900 + }, + { + "level": 98, + "exp": 12445200 + }, + { + "level": 99, + "exp": 12830300 + }, + { + "level": 100, + "exp": 13223300 + }, + { + "level": 101, + "exp": 13624300 + }, + { + "level": 102, + "exp": 14185200 + }, + { + "level": 103, + "exp": 14760100 + }, + { + "level": 104, + "exp": 15349200 + }, + { + "level": 105, + "exp": 15952700 + }, + { + "level": 106, + "exp": 16570700 + }, + { + "level": 107, + "exp": 17203500 + }, + { + "level": 108, + "exp": 17851200 + }, + { + "level": 109, + "exp": 18513900 + }, + { + "level": 110, + "exp": 19191900 + }, + { + "level": 111, + "exp": 19885400 + }, + { + "level": 112, + "exp": 20594500 + }, + { + "level": 113, + "exp": 21319400 + }, + { + "level": 114, + "exp": 22060300 + }, + { + "level": 115, + "exp": 22817400 + }, + { + "level": 116, + "exp": 23590900 + }, + { + "level": 117, + "exp": 24381000 + }, + { + "level": 118, + "exp": 25187800 + }, + { + "level": 119, + "exp": 26011600 + }, + { + "level": 120, + "exp": 26852500 + }, + { + "level": 121, + "exp": 27710700 + }, + { + "level": 122, + "exp": 28586400 + }, + { + "level": 123, + "exp": 29479800 + }, + { + "level": 124, + "exp": 30391100 + }, + { + "level": 125, + "exp": 31320500 + }, + { + "level": 126, + "exp": 32268100 + }, + { + "level": 127, + "exp": 33234200 + }, + { + "level": 128, + "exp": 34218900 + }, + { + "level": 129, + "exp": 35222400 + }, + { + "level": 130, + "exp": 36245000 + }, + { + "level": 131, + "exp": 37286800 + }, + { + "level": 132, + "exp": 38348000 + }, + { + "level": 133, + "exp": 39428800 + }, + { + "level": 134, + "exp": 40529400 + }, + { + "level": 135, + "exp": 41650000 + }, + { + "level": 136, + "exp": 42790800 + }, + { + "level": 137, + "exp": 43952000 + }, + { + "level": 138, + "exp": 45133800 + }, + { + "level": 139, + "exp": 46336400 + }, + { + "level": 140, + "exp": 47559900 + }, + { + "level": 141, + "exp": 48804600 + }, + { + "level": 142, + "exp": 50070700 + }, + { + "level": 143, + "exp": 51358300 + }, + { + "level": 144, + "exp": 52667700 + }, + { + "level": 145, + "exp": 53999100 + }, + { + "level": 146, + "exp": 55352600 + }, + { + "level": 147, + "exp": 56728500 + }, + { + "level": 148, + "exp": 58127000 + }, + { + "level": 149, + "exp": 59548200 + }, + { + "level": 150, + "exp": 60992400 + }, + { + "level": 151, + "exp": 62459800 + }, + { + "level": 152, + "exp": 63950500 + }, + { + "level": 153, + "exp": 65464800 + }, + { + "level": 154, + "exp": 67002900 + }, + { + "level": 155, + "exp": 68564900 + }, + { + "level": 156, + "exp": 70151100 + }, + { + "level": 157, + "exp": 71761700 + }, + { + "level": 158, + "exp": 73396900 + }, + { + "level": 159, + "exp": 75056900 + }, + { + "level": 160, + "exp": 76741900 + }, + { + "level": 161, + "exp": 78452100 + }, + { + "level": 162, + "exp": 80187700 + }, + { + "level": 163, + "exp": 81948900 + }, + { + "level": 164, + "exp": 83735900 + }, + { + "level": 165, + "exp": 85548900 + }, + { + "level": 166, + "exp": 87388200 + }, + { + "level": 167, + "exp": 89253900 + }, + { + "level": 168, + "exp": 91146300 + }, + { + "level": 169, + "exp": 93065500 + }, + { + "level": 170, + "exp": 95011800 + }, + { + "level": 171, + "exp": 96985300 + }, + { + "level": 172, + "exp": 98986300 + }, + { + "level": 173, + "exp": 101015000 + }, + { + "level": 174, + "exp": 103071600 + }, + { + "level": 175, + "exp": 105156300 + }, + { + "level": 176, + "exp": 107269400 + }, + { + "level": 177, + "exp": 109411000 + }, + { + "level": 178, + "exp": 111581300 + }, + { + "level": 179, + "exp": 113780600 + }, + { + "level": 180, + "exp": 116009100 + }, + { + "level": 181, + "exp": 118267000 + }, + { + "level": 182, + "exp": 120554500 + }, + { + "level": 183, + "exp": 122871800 + }, + { + "level": 184, + "exp": 125219100 + }, + { + "level": 185, + "exp": 127596600 + }, + { + "level": 186, + "exp": 130004600 + }, + { + "level": 187, + "exp": 132443200 + }, + { + "level": 188, + "exp": 134912700 + }, + { + "level": 189, + "exp": 137413300 + }, + { + "level": 190, + "exp": 139945200 + }, + { + "level": 191, + "exp": 142508700 + }, + { + "level": 192, + "exp": 145103900 + }, + { + "level": 193, + "exp": 147731100 + }, + { + "level": 194, + "exp": 150390400 + }, + { + "level": 195, + "exp": 153082100 + }, + { + "level": 196, + "exp": 155806500 + }, + { + "level": 197, + "exp": 158563700 + }, + { + "level": 198, + "exp": 161353900 + }, + { + "level": 199, + "exp": 164177400 + }, + { + "level": 200, + "exp": 167034400 + } +] \ No newline at end of file diff --git a/211/server/index.js b/211/server/index.js new file mode 100644 index 0000000..7c9d75b --- /dev/null +++ b/211/server/index.js @@ -0,0 +1,1090 @@ +const express = require('express'); +const http = require('http'); +const path = require('path'); +const os = require('os'); // Added for system stats +require('dotenv').config({ path: path.join(__dirname, '.env') }); +require('dotenv').config({ path: path.join(__dirname, '..', '.env') }); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const { Server } = require('socket.io'); +const { FarmBot } = require('./src/core/FarmBot'); +const { loadProto, types } = require('./src/proto'); +const { log, toLong, toNum } = require('./src/utils'); +const { getLevelExpProgress, getPlantNameBySeedId, getFruitName, getItemNameById } = require('./src/gameConfig'); +const userManager = require('./src/userManager'); +const { MiniProgramLoginSession } = require('./src/qrlib/session'); + +// OAuth Dependencies +const session = require('express-session'); +const passport = require('passport'); +const OAuth2Strategy = require('passport-oauth2'); + +// 初始化 Express App +const app = express(); +const server = http.createServer(app); +const io = new Server(server, { + cors: { + origin: "*", // 开发阶段允许跨域,生产环境应限制 + methods: ["GET", "POST"] + } +}); + +const oauthEnabled = Boolean(process.env.OAUTH_AUTHENTIK_ISSUER) + && Boolean(process.env.OAUTH_AUTHENTIK_CLIENT_ID) + && Boolean(process.env.OAUTH_AUTHENTIK_CLIENT_SECRET) + && Boolean(process.env.OAUTH_AUTHENTIK_REDIRECT_URI) + && Boolean(process.env.OAUTH_AUTHENTIK_SCOPE); + +// OAuth Setup +if (oauthEnabled) { + app.use(session({ + secret: 'farm-session-secret', + resave: false, + saveUninitialized: false + })); + app.use(passport.initialize()); + app.use(passport.session()); + + passport.serializeUser((user, done) => done(null, user.email)); + passport.deserializeUser((email, done) => { + const user = userManager.getUser(email); + done(null, user); + }); + + passport.use('authentik', new OAuth2Strategy({ + authorizationURL: `${process.env.OAUTH_AUTHENTIK_ISSUER}authorize/`, + tokenURL: `${process.env.OAUTH_AUTHENTIK_ISSUER}token/`, + clientID: process.env.OAUTH_AUTHENTIK_CLIENT_ID, + clientSecret: process.env.OAUTH_AUTHENTIK_CLIENT_SECRET, + callbackURL: process.env.OAUTH_AUTHENTIK_REDIRECT_URI, + scope: process.env.OAUTH_AUTHENTIK_SCOPE.split(' ') + }, async (accessToken, refreshToken, profile, cb) => { + try { + // Fetch user info using accessToken + const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); + const userInfoRes = await fetch(`${process.env.OAUTH_AUTHENTIK_ISSUER}userinfo/`, { + headers: { 'Authorization': `Bearer ${accessToken}` } + }); + const userInfo = await userInfoRes.json(); + + const email = userInfo.email || userInfo.preferred_username; // Adjust based on Authentik response + + // Register or Login + const user = await userManager.register(email, null, 'authentik', userInfo.sub); + return cb(null, user); + } catch (err) { + return cb(err); + } + })); + + // OAuth Routes + app.get('/api/auth/oauth/authentik', passport.authenticate('authentik', { state: true })); + + app.get('/api/auth/oauth/authentik/callback', (req, res, next) => { + passport.authenticate('authentik', { state: true }, (err, user, info) => { + const frontendUrl = process.env.NODE_ENV === 'development' ? 'http://localhost:5173' : ''; + + if (err) { + console.error('OAuth Error:', err); + return res.redirect(`${frontendUrl}/login?error=oauth_failed`); + } + if (!user) { + console.error('OAuth Failed: No user returned'); + return res.redirect(`${frontendUrl}/login?error=oauth_failed`); + } + + req.logIn(user, (loginErr) => { + if (loginErr) { + console.error('Login Error:', loginErr); + return res.redirect(`${frontendUrl}/login?error=login_err`); + } + res.redirect(`${frontendUrl}/login?email=${encodeURIComponent(user.email)}&oauth=success&_t=${Date.now()}`); + }); + })(req, res, next); + }); +} + +// 中间件 +app.use(cors()); +app.use(bodyParser.json()); +if (process.env.NODE_ENV === 'production') { + app.use(express.static(path.join(__dirname, '../web/dist'))); +} + +app.get('/api/auth/oauth/status', (req, res) => { + res.json({ enabled: oauthEnabled }); +}); + +// 存储活跃的 Bot 实例: Map +const activeBots = new Map(); +const unluckyBoards = new Map(); + +userManager.loadUnluckyBoards().then((stored) => { + if (!stored) return; + for (const [email, board] of stored.entries()) { + unluckyBoards.set(email, board); + } +}).catch((err) => { + log('Leaderboard', `加载失败: ${err.message}`); +}); + + +function normalizeSettings(settings) { + if (!settings || typeof settings !== 'object') return {}; + const result = {}; + const farmIntervalSec = Number(settings.farmIntervalSec); + if (Number.isFinite(farmIntervalSec) && farmIntervalSec >= 1) { + result.farmCheckInterval = Math.floor(farmIntervalSec * 1000); + } + const friendIntervalSec = Number(settings.friendIntervalSec); + if (Number.isFinite(friendIntervalSec) && friendIntervalSec >= 1) { + result.friendCheckInterval = Math.floor(friendIntervalSec * 1000); + } + if (settings.seedStrategy === 'forceLowest') { + result.forceLowestLevelCrop = true; + } else if (settings.seedStrategy === 'default') { + result.forceLowestLevelCrop = false; + } + if (typeof settings.enableFriendOps === 'boolean') { + result.enableFriendOps = settings.enableFriendOps; + } + if (typeof settings.enableSteal === 'boolean') { + result.enableSteal = settings.enableSteal; + } + if (typeof settings.enableNormalFertilize === 'boolean') { + result.enableNormalFertilize = settings.enableNormalFertilize; + } + if (typeof settings.enableOrganicFertilize === 'boolean') { + result.enableOrganicFertilize = settings.enableOrganicFertilize; + } + if (typeof settings.allowTicketFertilizerPurchase === 'boolean') { + result.allowTicketFertilizerPurchase = settings.allowTicketFertilizerPurchase; + } + if (typeof settings.enableAutoSell === 'boolean') { + result.enableAutoSell = settings.enableAutoSell; + } + if (typeof settings.allowBuySeeds === 'boolean') { + result.allowBuySeeds = settings.allowBuySeeds; + } + if (typeof settings.allowRemove === 'boolean') { + result.allowRemove = settings.allowRemove; + } + if (settings.idleStrategy === 'task') { + result.idleStrategy = 'task'; + } else if (settings.idleStrategy === 'exp') { + result.idleStrategy = 'exp'; + } + return result; +} + +function getTodayKey() { + const now = new Date(); + const y = now.getFullYear(); + const m = `${now.getMonth() + 1}`.padStart(2, '0'); + const d = `${now.getDate()}`.padStart(2, '0'); + return `${y}-${m}-${d}`; +} + +async function fetchTaskInfo(bot) { + const body = types.TaskInfoRequest.encode(types.TaskInfoRequest.create({})).finish(); + const { body: replyBody } = await bot.network.sendMsgAsync('gamepb.taskpb.TaskService', 'TaskInfo', body); + const reply = types.TaskInfoReply.decode(replyBody); + return reply.task_info || null; +} + +function buildTaskList(taskInfo) { + const tasks = []; + if (!taskInfo) return tasks; + const seen = new Set(); + const seenContent = new Set(); + + const addTasks = (list, category) => { + if (!list) return; + for (const task of list) { + const id = toNum(task.id); + if (seen.has(id)) continue; + const progress = toNum(task.progress); + const totalProgress = toNum(task.total_progress); + const isClaimed = Boolean(task.is_claimed); + const isUnlocked = Boolean(task.is_unlocked); + const shareMultiple = toNum(task.share_multiple); + const rewards = []; + const rewardList = task.rewards || []; + for (const reward of rewardList) { + rewards.push({ + id: toNum(reward.id), + count: toNum(reward.count) + }); + } + const desc = task.desc || `任务#${id}`; + const contentKey = `${desc.trim()}|${progress}|${totalProgress}`; + if (seenContent.has(contentKey)) continue; + tasks.push({ + id, + desc, + progress, + totalProgress, + isClaimed, + isUnlocked, + shareMultiple, + rewards, + category + }); + seen.add(id); + seenContent.add(contentKey); + } + }; + + addTasks(taskInfo.growth_tasks, 'growth'); + addTasks(taskInfo.daily_tasks, 'daily'); + addTasks(taskInfo.tasks, 'normal'); + return tasks; +} + +function isTaskClaimable(task) { + if (!task.isUnlocked || task.isClaimed) return false; + if (task.totalProgress <= 0) return false; + return task.progress >= task.totalProgress; +} + +async function claimTaskReward(bot, taskId, doShared) { + const body = types.ClaimTaskRewardRequest.encode(types.ClaimTaskRewardRequest.create({ + id: toLong(taskId), + do_shared: Boolean(doShared) + })).finish(); + const { body: replyBody } = await bot.network.sendMsgAsync('gamepb.taskpb.TaskService', 'ClaimTaskReward', body); + return types.ClaimTaskRewardReply.decode(replyBody); +} + +function updateUnluckyBoard(email, name, count) { + if (!email || !name || !Number.isFinite(count) || count <= 0) return; + let board = unluckyBoards.get(email); + if (!board) { + board = new Map(); + unluckyBoards.set(email, board); + } + const prev = board.get(name) || 0; + board.set(name, prev + count); + userManager.saveUnlucky(email, name, count).catch((err) => { + log('Leaderboard', `保存失败: ${err.message}`); + }); +} + +// 初始化 Proto +loadProto().then(() => { + log('系统', '协议定义加载完成。'); +}).catch(err => { + console.error('Failed to load Proto:', err); + process.exit(1); +}); + +// ============ API 路由 ============ + +// QR Code Login API (Mini Program) +app.post('/api/qr/create', async (req, res) => { + try { + log('扫码', '正在获取登录二维码...'); + const result = await MiniProgramLoginSession.requestLoginCode(); + log('扫码', '已获取登录二维码'); + res.json({ + success: true, + qrsig: result.code, + qrcode: `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(result.url)}`, + url: result.url + }); + } catch (error) { + console.error('QR Create Error:', error); + res.status(500).json({ success: false, message: error.message }); + } +}); + +app.post('/api/qr/check', async (req, res) => { + const { qrsig } = req.body; + if (!qrsig) { + return res.status(400).json({ success: false, message: 'Missing qrsig/code' }); + } + + try { + const result = await MiniProgramLoginSession.queryStatus(qrsig); + + if (result.status === 'Wait') { + res.json({ success: true, status: 'Wait', msg: '等待扫码...' }); + } else if (result.status === 'Used') { + res.json({ success: true, status: 'Used', msg: '二维码已失效' }); + } else if (result.status === 'OK') { + const ticket = result.ticket; + // Determine AppID (Farm AppID) + const appid = MiniProgramLoginSession.Presets.farm.appid; // QQ Classic Farm + const code = await MiniProgramLoginSession.getAuthCode(ticket, appid); + + res.json({ + success: true, + status: 'OK', + msg: '登录成功', + code: code // This is the Game Code we need + }); + } else { + res.json({ success: true, status: 'Error', msg: '状态查询错误' }); + } + } catch (error) { + res.status(500).json({ success: false, message: error.message }); + } +}); + +// 注册 API +app.post('/api/auth/register', async (req, res) => { + const { email, password } = req.body; + if (!email || !password) { + return res.status(400).json({ error: '请输入邮箱和密码' }); + } + + try { + if (userManager.getUser(email)) { + return res.status(400).json({ error: '该邮箱已被注册' }); + } + + const user = userManager.register(email, password); + log('Auth', `New user registered: ${email}`); + + res.json({ + success: true, + user: { + email: user.email, + hasCode: !!user.code + } + }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +// 登录 API (仅登录) +app.post('/api/auth/login', async (req, res) => { + const { email, password } = req.body; + if (!email || !password) { + return res.status(400).json({ error: '请输入邮箱和密码' }); + } + + try { + const user = userManager.login(email, password); + if (!user) { + return res.status(401).json({ error: '邮箱或密码错误' }); + } + + // 返回用户信息和 Bot 状态 + const botRunning = activeBots.has(email); + res.json({ + success: true, + user: { + email: user.email, + code: user.code, + hasCode: !!user.code + }, + botRunning + }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +app.get('/api/auth/profile', async (req, res) => { + const { email } = req.query; + if (!email) { + return res.status(400).json({ error: 'Email is required' }); + } + const user = userManager.getUser(email); + if (!user) { + return res.status(404).json({ error: 'User not found' }); + } + res.json({ + user: { + email: user.email, + hasCode: !!user.code, + auth_provider: user.auth_provider || 'local' + } + }); +}); + +// 好友 API +app.get('/api/friends', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + const bot = activeBots.get(email); + if (bot.config && bot.config.enableFriendOps === false) { + return res.status(403).json({ error: 'Friend operations disabled' }); + } + try { + const reply = await bot.friendManager.getAllFriends(); + + // 处理好友列表 + const friends = (reply.friends || []).map(f => ({ + uin: f.uin ? f.uin.toString() : '', + userName: f.userName, + headPic: f.headPic, + yellowLevel: f.yellowLevel, + exp: f.exp, + money: f.money + })); + + res.json({ friends }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +// 仓库出售 API +app.post('/api/warehouse/sell', async (req, res) => { + const { email, items } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + if (!items || !Array.isArray(items) || items.length === 0) { + return res.status(400).json({ error: 'No items to sell' }); + } + + const bot = activeBots.get(email); + try { + const reply = await bot.warehouseManager.sellItems(items); + const gold = bot.warehouseManager.extractGold(reply); + + // 更新本地金币缓存 + if (bot.user) { + bot.user.gold = (bot.user.gold || 0) + gold; + } + + res.json({ success: true, gold }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +// 访问好友农场 API +app.post('/api/friends/visit', async (req, res) => { + const { email, friendUid } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + const bot = activeBots.get(email); + if (bot.config && bot.config.enableFriendOps === false) { + return res.status(403).json({ error: 'Friend operations disabled' }); + } + try { + const reply = await bot.friendManager.enterFriendFarm(friendUid); + if (!reply.farm || !reply.farm.lands) { + return res.json({ lands: [] }); + } + + // 使用 FriendManager 的逻辑解析好友土地数据 + const analysis = bot.friendManager.analyzeFriendLands(lands, bot.user.gid); + + const formattedLands = lands.map(land => { + const id = Number(land.id); + if (!land.unlocked) return { id, type: 'locked' }; + + const plant = land.plant; + if (!plant || !plant.phases || plant.phases.length === 0) { + return { id, type: 'empty' }; + } + + const currentPhase = bot.farmManager.getCurrentPhase(plant.phases, false); + const phaseVal = currentPhase ? currentPhase.phase : 0; + + // 6=Mature, 7=Dead + let status = 'growing'; + if (phaseVal === 7) status = 'dead'; + else if (phaseVal === 6) status = 'mature'; + + return { + id, + type: 'planted', + status, + plantId: Number(plant.id), + plantName: getPlantNameBySeedId(Number(plant.id)) || `作物${plant.id}`, + phase: phaseVal, + needs: { + water: analysis.needWater.includes(id), + weed: analysis.needWeed.includes(id), + bug: analysis.needBug.includes(id) + }, + canSteal: analysis.stealable.includes(id) // 使用 analyzeFriendLands 的 stealable 结果 + }; + }); + + res.json({ lands: formattedLands, farmUser: reply.farm.user }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +// 好友互动 API (偷菜/浇水等) +app.post('/api/friends/action', async (req, res) => { + const { email, friendUid, actionType, landIds } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + const bot = activeBots.get(email); + if (bot.config && bot.config.enableFriendOps === false) { + return res.status(403).json({ error: 'Friend operations disabled' }); + } + if (actionType === 'steal' && bot.config && bot.config.enableSteal === false) { + return res.status(403).json({ error: 'Steal disabled' }); + } + try { + let result; + let message = ''; + + switch (actionType) { + case 'water': + result = await bot.friendManager.helpWater(friendUid, landIds); + message = '浇水成功'; + break; + case 'weed': + result = await bot.friendManager.helpWeed(friendUid, landIds); + message = '除草成功'; + break; + case 'insecticide': + result = await bot.friendManager.helpInsecticide(friendUid, landIds); + message = '除虫成功'; + break; + case 'steal': + result = await bot.friendManager.stealHarvest(friendUid, landIds); + message = '偷菜成功'; + break; + default: + throw new Error('Unknown action type'); + } + + res.json({ success: true, message, result }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +// 启动 Bot API +app.post('/api/bot/start', async (req, res) => { + const { email, code, settings } = req.body; // 如果提供了 code,更新并启动 + + if (!email) { + return res.status(400).json({ error: 'Email is required' }); + } + + const user = userManager.getUser(email); + if (!user) { + return res.status(404).json({ error: 'User not found' }); + } + + // 如果提供了新 code,更新用户数据 + let gameCode = code; + if (gameCode) { + userManager.updateCode(email, gameCode); + } else { + gameCode = user.code; + } + + if (!gameCode) { + return res.status(400).json({ error: 'Game code is required. Please provide it.' }); + } + + try { + // 如果已存在 Bot,先停止 + if (activeBots.has(email)) { + const oldBot = activeBots.get(email); + oldBot.stop(); + activeBots.delete(email); + } + + const botConfig = { code: gameCode, ...normalizeSettings(settings) }; + const bot = new FarmBot(botConfig); + + // 监听 Bot 事件并通过 Socket.IO 推送给前端 (使用 email 作为 room/key) + bot.on('started', () => { + io.emit(`bot-status-${email}`, { status: 'running' }); + }); + + bot.on('stopped', () => { + io.emit(`bot-status-${email}`, { status: 'stopped' }); + activeBots.delete(email); + }); + + bot.on('error', (err) => { + io.emit(`bot-error-${email}`, { message: err.message }); + userManager.saveBotLog(email, { tag: 'Error', msg: err.message, type: 'error', time: Date.now() }); + }); + + bot.on('log', (logData) => { + io.emit(`bot-log-${email}`, logData); + userManager.saveBotLog(email, logData); + }); + bot.on('stealRecord', (data) => { + const name = data && data.name; + const count = Number(data && data.count); + updateUnluckyBoard(email, name, count); + }); + + // 启动 Bot + await bot.start(); + activeBots.set(email, bot); + + res.json({ success: true, message: 'Bot started successfully.' }); + } catch (error) { + console.error('Bot start failed:', error); + res.status(500).json({ error: error.message }); + } +}); + +// 停止 Bot API +app.post('/api/bot/stop', (req, res) => { + const { email } = req.body; + if (activeBots.has(email)) { + const bot = activeBots.get(email); + bot.stop(); + activeBots.delete(email); + res.json({ success: true }); + } else { + res.status(404).json({ error: 'Bot is not running' }); + } +}); + +// 获取状态 API +app.get('/api/status', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + // 返回 stopped 状态而不是 404,以便前端正确显示 UI + return res.json({ status: 'stopped', user: null }); + } + + const bot = activeBots.get(email); + const user = bot.user || {}; + const todayKey = getTodayKey(); + const freeMallClaimed = user.freeMallClaimDate === todayKey; + + // Calculate next level exp + const levelProgress = getLevelExpProgress(user.level || 0, user.exp || 0); + const tickets = user.tickets || 0; + const fertilizerContainer = Number(user.fertilizerContainer) || 0; + const fertilizerItems = user.fertilizerItems || {}; + const fallbackHours = fertilizerContainer >= 3600 ? fertilizerContainer / 3600 : fertilizerContainer; + const organicFertilizerContainer = Number(user.organicFertilizerContainer) || 0; + const organicFertilizerItems = user.organicFertilizerItems || {}; + const fallbackOrganicHours = organicFertilizerContainer >= 3600 ? organicFertilizerContainer / 3600 : organicFertilizerContainer; + let fertilizerHours = Number.isFinite(user.fertilizerHours) ? user.fertilizerHours : fallbackHours; + let organicFertilizerHours = Number.isFinite(user.organicFertilizerHours) ? user.organicFertilizerHours : fallbackOrganicHours; + if (bot.warehouseManager) { + try { + const bagReply = await bot.warehouseManager.getBag(); + const items = bot.warehouseManager.getBagItems(bagReply); + let normalContainer = 0; + let organicContainer = 0; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + if (id === 1011) normalContainer = count; + if (id === 1012) organicContainer = count; + } + const normalContainerHours = normalContainer >= 3600 ? normalContainer / 3600 : normalContainer; + const organicContainerHours = organicContainer >= 3600 ? organicContainer / 3600 : organicContainer; + const normalHours = normalContainerHours; + const organicHours = organicContainerHours; + fertilizerHours = normalHours; + user.normalFertilizerHours = normalHours; + user.organicFertilizerHours = organicHours; + organicFertilizerHours = organicHours; + } catch (error) { + log('状态', `获取背包失败: ${error.message}`); + } + } + + res.json({ + status: 'running', + user: { + nickname: user.name || 'Farmer', + level: user.level || 0, + exp: levelProgress.current || 0, + nextLevelExp: levelProgress.needed || 100, + gold: user.gold || 0, + tickets, + fertilizerHours, + normalFertilizerHours: Number.isFinite(user.normalFertilizerHours) ? user.normalFertilizerHours : fertilizerHours, + organicFertilizerHours, + avatarUrl: user.avatarUrl || '', + freeMallClaimed + } + }); +}); + +app.get('/api/announcement', (req, res) => { + const message = typeof process.env.LOGIN_ANNOUNCEMENT === 'string' ? process.env.LOGIN_ANNOUNCEMENT : ''; + res.json({ message }); +}); + +app.get('/api/logs', async (req, res) => { + const { email, limit } = req.query; + if (!email) { + return res.status(400).json({ error: 'Email is required' }); + } + const count = Number(limit); + try { + const logs = await userManager.getBotLogs(email, count); + res.json({ logs }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.get('/api/debug/fertilizer', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const bot = activeBots.get(email); + try { + const bagReply = await bot.warehouseManager.getBag(); + const items = bot.warehouseManager.getBagItems(bagReply); + let normalContainer = 0; + let normal1 = 0; + let normal4 = 0; + let normal8 = 0; + let normal12 = 0; + let organicContainer = 0; + let organic1 = 0; + let organic4 = 0; + let organic8 = 0; + let organic12 = 0; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + if (id === 1011) normalContainer = count; + if (id === 80001) normal1 = count; + if (id === 80002) normal4 = count; + if (id === 80003) normal8 = count; + if (id === 80004) normal12 = count; + if (id === 1012) organicContainer = count; + if (id === 80011) organic1 = count; + if (id === 80012) organic4 = count; + if (id === 80013) organic8 = count; + if (id === 80014) organic12 = count; + } + const normalContainerHours = normalContainer >= 3600 ? normalContainer / 3600 : normalContainer; + const organicContainerHours = organicContainer >= 3600 ? organicContainer / 3600 : organicContainer; + const normalHours = normalContainerHours + normal1 + normal4 * 4 + normal8 * 8 + normal12 * 12; + const organicHours = organicContainerHours + organic1 + organic4 * 4 + organic8 * 8 + organic12 * 12; + res.json({ + normal: { + container: normalContainer, + hour1: normal1, + hour4: normal4, + hour8: normal8, + hour12: normal12, + hours: normalHours + }, + organic: { + container: organicContainer, + hour1: organic1, + hour4: organic4, + hour8: organic8, + hour12: organic12, + hours: organicHours + } + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.get('/api/leaderboard/unlucky', (req, res) => { + const { email } = req.query; + if (!email) { + return res.status(400).json({ error: 'Email is required' }); + } + if (activeBots.has(email)) { + const bot = activeBots.get(email); + if (bot.config && bot.config.enableFriendOps === false) { + return res.json({ items: [] }); + } + if (bot.config && bot.config.enableSteal === false) { + return res.json({ items: [] }); + } + } + const board = unluckyBoards.get(email); + if (!board) { + return res.json({ items: [] }); + } + const items = Array.from(board.entries()) + .map(([name, count]) => ({ name, count })) + .sort((a, b) => b.count - a.count) + .slice(0, 10); + res.json({ items }); +}); + +app.get('/api/tasks', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + const bot = activeBots.get(email); + try { + const taskInfo = await fetchTaskInfo(bot); + const tasks = buildTaskList(taskInfo); + res.json({ tasks }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/tasks/claim', async (req, res) => { + const { email } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + const bot = activeBots.get(email); + try { + const taskInfo = await fetchTaskInfo(bot); + const tasks = buildTaskList(taskInfo); + const claimable = []; + for (const task of tasks) { + if (isTaskClaimable(task)) { + claimable.push(task); + } + } + let claimedCount = 0; + const failed = []; + for (const task of claimable) { + try { + await claimTaskReward(bot, task.id, task.shareMultiple > 1); + claimedCount += 1; + } catch (err) { + failed.push({ id: task.id, message: err.message }); + } + } + + const latestTaskInfo = await fetchTaskInfo(bot); + const latestTasks = buildTaskList(latestTaskInfo); + res.json({ claimedCount, failed, tasks: latestTasks }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/tasks/claim-one', async (req, res) => { + const { email, taskId, doShared } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const id = Number(taskId); + if (!Number.isFinite(id) || id <= 0) { + return res.status(400).json({ error: 'Invalid taskId' }); + } + + const bot = activeBots.get(email); + try { + await claimTaskReward(bot, id, Boolean(doShared)); + const latestTaskInfo = await fetchTaskInfo(bot); + const latestTasks = buildTaskList(latestTaskInfo); + res.json({ claimedCount: 1, failedCount: 0, tasks: latestTasks }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Get lands API +app.get('/api/lands', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + + const bot = activeBots.get(email); + try { + const lands = await bot.farmManager.getFormattedLands(); + res.json({ lands }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/lands/remove', async (req, res) => { + const { email, landIds } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + if (!Array.isArray(landIds)) { + return res.status(400).json({ error: 'Invalid landIds' }); + } + const ids = landIds.map(Number).filter(id => Number.isFinite(id) && id > 0); + if (ids.length === 0) { + return res.status(400).json({ error: 'Invalid landIds' }); + } + + const bot = activeBots.get(email); + try { + await bot.farmManager.removePlant(ids); + res.json({ success: true, removed: ids.length }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/lands/unlock', async (req, res) => { + const { email, landId, doShared } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const id = Number(landId); + if (!Number.isFinite(id) || id <= 0) { + return res.status(400).json({ error: 'Invalid landId' }); + } + + const bot = activeBots.get(email); + try { + await bot.farmManager.unlockLand(id, Boolean(doShared)); + res.json({ success: true, landId: id }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Shop API +app.get('/api/shop', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const bot = activeBots.get(email); + try { + const goods = await bot.shopManager.getSeedShopList(); + res.json({ goods }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/shop/buy', async (req, res) => { + const { email, goodsId, count, price } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const bot = activeBots.get(email); + try { + await bot.shopManager.buyGoods(goodsId, count, price); + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/paymall/buy', async (req, res) => { + const { email, itemId, count } = req.body; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const id = Number(itemId); + if (!Number.isFinite(id) || id <= 0) { + return res.status(400).json({ error: 'Invalid itemId' }); + } + const buyCount = Number(count ?? 1); + if (!Number.isFinite(buyCount) || buyCount <= 0) { + return res.status(400).json({ error: 'Invalid count' }); + } + const bot = activeBots.get(email); + try { + await bot.shopManager.purchaseMallItem(id, buyCount); + if (id === 1001) { + bot.user.freeMallClaimDate = getTodayKey(); + bot.emit('userUpdate', bot.user); + } + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Warehouse API +app.get('/api/warehouse', async (req, res) => { + const { email } = req.query; + if (!email || !activeBots.has(email)) { + return res.status(404).json({ error: 'Bot not running' }); + } + const bot = activeBots.get(email); + try { + const data = await bot.warehouseManager.getFormattedBag(); + res.json(data); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +app.post('/api/warehouse/sell', async (req, res) => { + const { email, items } = req.body; + const bot = activeBots.get(email); + if (!bot) return res.status(404).json({ error: 'Bot not found' }); + + try { + const reply = await bot.warehouseManager.sellItems(items); + const gold = bot.warehouseManager.extractGold(reply); + res.json({ success: true, gold }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +app.post('/api/warehouse/use', async (req, res) => { + const { email, items } = req.body; + const bot = activeBots.get(email); + if (!bot) return res.status(404).json({ error: 'Bot not found' }); + + try { + const result = await bot.warehouseManager.useItems(items); + res.json(result); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +// System stats API +app.get('/api/system/stats', (req, res) => { + const memory = process.memoryUsage(); + // Convert to MB + const memoryUsage = { + rss: Math.round(memory.rss / 1024 / 1024), + heapTotal: Math.round(memory.heapTotal / 1024 / 1024), + heapUsed: Math.round(memory.heapUsed / 1024 / 1024), + }; + + res.json({ + memory: memoryUsage, + uptime: Math.floor(process.uptime()), + activeBots: activeBots.size + }); +}); + +// 所有其他请求返回前端 index.html (SPA 支持) +app.get('*', (req, res) => { + if (process.env.NODE_ENV === 'production') { + res.sendFile(path.join(__dirname, '../web/dist/index.html')); + } else { + res.status(404).send('Not Found (Development Mode: Use Frontend Dev Server at port 5173)'); + } +}); + +// ============ Socket.IO ============ +io.on('connection', (socket) => { + log('Server', `Client connected: ${socket.id}`); + + socket.on('disconnect', () => { + log('Server', `Client disconnected: ${socket.id}`); + }); +}); + +// 启动服务器 +const PORT = process.env.PORT || 3000; +server.listen(PORT, () => { + log('Server', `Server running on http://localhost:${PORT}`); +}); diff --git a/211/server/package-lock.json b/211/server/package-lock.json new file mode 100644 index 0000000..122f462 --- /dev/null +++ b/211/server/package-lock.json @@ -0,0 +1,3343 @@ +{ + "name": "farm", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "farm", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.13.5", + "body-parser": "^2.2.2", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "express": "^4.18.2", + "express-session": "^1.19.0", + "jsonwebtoken": "^9.0.3", + "long": "^5.3.2", + "mysql2": "^3.17.1", + "node-fetch": "^3.3.2", + "passport": "^0.7.0", + "passport-oauth2": "^1.8.0", + "protobufjs": "^8.0.0", + "socket.io": "^4.8.3", + "sqlite3": "^5.1.7", + "ws": "^8.19.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT", + "optional": true + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.2.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.2.1.tgz", + "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", + "optional": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT", + "optional": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", + "optional": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", + "optional": true + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT", + "optional": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", + "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT", + "optional": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-session": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.19.0.tgz", + "integrity": "sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==", + "license": "MIT", + "dependencies": { + "cookie": "~0.7.2", + "cookie-signature": "~1.0.7", + "debug": "~2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "~5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/express-session/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC", + "optional": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC", + "optional": true + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", + "optional": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC", + "optional": true + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru.min": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "license": "ISC", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "license": "MIT", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mysql2": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.17.1.tgz", + "integrity": "sha512-UzIzdVwPXPoZm+FaJ4lNsRt28HtUwt68gpLH7NP1oSjd91M5Qn1XJzbIsSRMRc5CV3pvktLNshmbaFfMYqPBhQ==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.2", + "long": "^5.3.2", + "lru.min": "^1.1.3", + "named-placeholders": "^1.1.6", + "seq-queue": "^0.0.5", + "sql-escaper": "^1.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "license": "MIT", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/oauth": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.2.tgz", + "integrity": "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-oauth2": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz", + "integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==", + "license": "MIT", + "dependencies": { + "base64url": "3.x.x", + "oauth": "0.10.x", + "passport-strategy": "1.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "license": "MIT", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/protobufjs": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/protobufjs/-/protobufjs-8.0.0.tgz", + "integrity": "sha512-jx6+sE9h/UryaCZhsJWbJtTEy47yXoGNYI4z8ZaRncM0zBKeRqjO2JEcOUYwrYGb1WLhXM1FfMzW3annvFv0rw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", + "optional": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.18.3" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sql-escaper": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.3.2.tgz", + "integrity": "sha512-lp+ZDVfSjHt+qAK1jXBTIXBNYnbo7gnaAGwoYTH9bE89kNkXwcu6g0WjJGRsdTKVpY1z70u3Y0IgmnBOoRybHw==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, + "node_modules/sqlite3": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", + "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + } + } +} diff --git a/211/server/package.json b/211/server/package.json new file mode 100644 index 0000000..81c3cce --- /dev/null +++ b/211/server/package.json @@ -0,0 +1,30 @@ +{ + "name": "farm", + "version": "1.0.0", + "description": "", + "license": "ISC", + "author": "", + "type": "commonjs", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "axios": "^1.13.5", + "body-parser": "^2.2.2", + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "express": "^4.18.2", + "express-session": "^1.19.0", + "jsonwebtoken": "^9.0.3", + "long": "^5.3.2", + "mysql2": "^3.17.1", + "node-fetch": "^3.3.2", + "passport": "^0.7.0", + "passport-oauth2": "^1.8.0", + "protobufjs": "^8.0.0", + "socket.io": "^4.8.3", + "sqlite3": "^5.1.7", + "ws": "^8.19.0" + } +} diff --git a/211/server/proto/corepb.proto b/211/server/proto/corepb.proto new file mode 100644 index 0000000..2ec2b42 --- /dev/null +++ b/211/server/proto/corepb.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +package corepb; + +// ============ 通用物品 ============ +message Item { + int64 id = 1; // 物品ID + int64 count = 2; // 数量 + int64 expire_time = 3; // 过期时间 + // field 4 reserved + // google.protobuf.Any detail = 5; // 详情 (略) + int64 uid = 6; // UID + bool is_new = 7; // 是否新获得 + repeated int64 mutant_types = 8; // 变异类型 + // ItemShow show = 100; // 展示信息 (略) +} + +// 背包(物品列表) +message ItemBag { + repeated Item items = 1; +} + +// ============ 物品变化 ============ +message ItemChg { + Item item = 1; // 物品信息 + int64 delta = 2; // 变化量 (正数增加, 负数减少) +} diff --git a/211/server/proto/friendpb.proto b/211/server/proto/friendpb.proto new file mode 100644 index 0000000..365e307 --- /dev/null +++ b/211/server/proto/friendpb.proto @@ -0,0 +1,120 @@ +syntax = "proto3"; + +package gamepb.friendpb; + +// ============ 好友农场摘要信息 ============ +message Plant { + int64 dry_time_sec = 1; // 缺水倒计时秒 + int64 weed_time_sec = 2; // 长草倒计时秒 + int64 insect_time_sec = 3; // 生虫倒计时秒 + int64 ripe_time_sec = 4; // 成熟倒计时秒 + int64 ripe_fruit_id = 5; // 成熟果实ID + int64 steal_plant_num = 6; // 可偷数量 + int64 dry_num = 7; // 缺水地块数 + int64 weed_num = 8; // 有草地块数 + int64 insect_num = 9; // 有虫地块数 +} + +// ============ 标签 ============ +message Tags { + bool is_new = 1; + bool is_follow = 2; +} + +// ============ 好友信息 ============ +message GameFriend { + int64 gid = 1; + string open_id = 2; + string name = 3; + string avatar_url = 4; + string remark = 5; + int64 level = 6; + int64 gold = 7; + Tags tags = 8; + Plant plant = 9; + int32 authorized_status = 10; + // field 11 reserved + // Illustrated illustrated = 12; // 略 + // repeated AvatarFrame equip_avatar_frames = 13; // 略 +} + +// ============ 请求/回复 ============ + +// --- 获取所有好友 --- +message GetAllRequest {} + +message GetAllReply { + repeated GameFriend game_friends = 1; + // repeated Invitation invitations = 2; // 略 + int64 application_count = 3; +} + +// --- 同步好友 (带 open_ids) --- +message SyncAllRequest { + // field 1 reserved + repeated string open_ids = 2; +} + +message SyncAllReply { + repeated GameFriend game_friends = 1; + // repeated Invitation invitations = 2; // 略 + int64 application_count = 3; +} + +// ============ 好友申请 (微信同玩) ============ + +// 申请信息 +message Application { + int64 gid = 1; + int64 time_at = 2; + string open_id = 3; + string name = 4; + string avatar_url = 5; + int64 level = 6; + // repeated AvatarFrame equip_avatar_frames = 7; // 略 +} + +// --- 获取好友申请列表 --- +message GetApplicationsRequest {} + +message GetApplicationsReply { + repeated Application applications = 1; + bool block_applications = 2; // 是否屏蔽申请 +} + +// --- 同意好友申请 --- +message AcceptFriendsRequest { + repeated int64 friend_gids = 1; +} + +message AcceptFriendsReply { + repeated GameFriend friends = 1; +} + +// --- 拒绝好友申请 --- +message RejectFriendsRequest { + repeated int64 friend_gids = 1; +} + +message RejectFriendsReply {} + +// --- 设置屏蔽申请 --- +message SetBlockApplicationsRequest { + bool block = 1; +} + +message SetBlockApplicationsReply { + bool block = 1; +} + +// ============ 服务器推送通知 ============ + +// 收到好友申请通知 +message FriendApplicationReceivedNotify { + repeated Application applications = 1; +} + +// 好友添加成功通知 (对方同意后) +message FriendAddedNotify { + repeated GameFriend friends = 1; +} diff --git a/211/server/proto/game.proto b/211/server/proto/game.proto new file mode 100644 index 0000000..a0e75fe --- /dev/null +++ b/211/server/proto/game.proto @@ -0,0 +1,44 @@ +syntax = "proto3"; + +// ============ gatepb ============ +// 网关层协议 - 所有WS消息的外壳 + +package gatepb; + +// Meta.Type 枚举 +enum MessageType { + None = 0; + Request = 1; + Response = 2; + Notify = 3; +} + +// 消息元信息 +message Meta { + string service_name = 1; + string method_name = 2; + int32 message_type = 3; // MessageType enum + int64 client_seq = 4; + int64 server_seq = 5; + int64 error_code = 6; + string error_message = 7; + map metadata = 8; +} + +// 每个WS帧的结构 +message Message { + Meta meta = 1; + bytes body = 2; +} + +// 服务器推送事件 +message EventMessage { + string message_type = 1; + bytes body = 2; +} + +// 被踢下线通知 +message KickoutNotify { + int64 reason = 1; + string reason_message = 2; +} diff --git a/211/server/proto/itempb.proto b/211/server/proto/itempb.proto new file mode 100644 index 0000000..5446399 --- /dev/null +++ b/211/server/proto/itempb.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; + +package gamepb.itempb; + +import "corepb.proto"; + +// ============ 背包/仓库 ============ + +// 获取背包 +message BagRequest {} + +message BagReply { + corepb.ItemBag item_bag = 1; // 与 game 一致,背包数据在 item_bag 里 +} + +// ============ 出售物品 ============ + +message SellRequest { + repeated corepb.Item items = 1; // 要出售的物品列表 (id + count) +} + +message SellReply { + repeated corepb.Item sell_items = 1; // 出售的物品 + repeated corepb.Item get_items = 2; // 获得的物品(id=1001为金币, id=1002为点券) +} + +// ============ 使用物品 ============ + +message UseRequest { + int64 item_id = 1; + int64 count = 2; + repeated int64 land_ids = 3; +} + +message UseReply { + repeated corepb.Item items = 1; +} + +// ============ 批量使用物品 ============ + +message UseItem { + int64 item_id = 1; + int64 count = 2; + int64 land_count = 6; // 根据抓包,字段6为18(推测为土地数) +} + +message BatchUseRequest { + repeated UseItem items = 1; +} + +message BatchUseReply { + repeated corepb.Item items = 1; +} diff --git a/211/server/proto/notifypb.proto b/211/server/proto/notifypb.proto new file mode 100644 index 0000000..a23ceb6 --- /dev/null +++ b/211/server/proto/notifypb.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package gamepb.itempb; + +import "corepb.proto"; + +// ============ 物品变化通知 ============ +message ItemNotify { + repeated corepb.ItemChg items = 1; +} diff --git a/211/server/proto/plantpb.proto b/211/server/proto/plantpb.proto new file mode 100644 index 0000000..516fb72 --- /dev/null +++ b/211/server/proto/plantpb.proto @@ -0,0 +1,266 @@ +syntax = "proto3"; + +package gamepb.plantpb; + +// ============ 生长阶段枚举 ============ +enum PlantPhase { + PHASE_UNKNOWN = 0; + SEED = 1; // 种子 + GERMINATION = 2; // 发芽 + SMALL_LEAVES = 3; // 小叶 + LARGE_LEAVES = 4; // 大叶 + BLOOMING = 5; // 开花 + MATURE = 6; // 成熟 (可收获) + DEAD = 7; // 枯死 +} + +// ============ 土地信息 ============ +message LandInfo { + int64 id = 1; + bool unlocked = 2; + int64 level = 3; + int64 max_level = 4; + bool could_unlock = 5; + bool could_upgrade = 6; + LandUnlockCondition unlock_condition = 7; + LandUpgradeCondition upgrade_condition = 8; + Buff buff = 9; + PlantInfo plant = 10; + bool is_shared = 11; + bool can_share = 12; + int64 master_land_id = 13; + repeated int64 slave_land_ids = 14; + int64 land_size = 15; + int64 lands_level = 16; + + // 土地buff + message Buff { + int64 plant_yield_bonus = 1; + int64 planting_time_reduction = 2; + int64 plant_exp_bonus = 3; + } +} + +// 土地解锁条件 (简化) +message LandUnlockCondition { + int64 need_level = 1; + int64 need_gold = 2; + // ... 其他条件字段 +} + +// 土地升级条件 (简化) +message LandUpgradeCondition { + int64 need_level = 1; + int64 need_gold = 2; + // ... 其他条件字段 +} + +// ============ 植物信息 ============ +message PlantInfo { + int64 id = 1; // 植物/种子ID + string name = 2; // 名称 + // field 3 reserved + repeated PlantPhaseInfo phases = 4; // 生长阶段列表 + int64 season = 5; // 季节 + int64 dry_num = 6; // 缺水次数 (>0需要浇水) + // fields 7,8 reserved + int64 stole_num = 9; // 被偷次数 + int64 fruit_id = 10; // 果实ID + int64 fruit_num = 11; // 果实数量 + repeated int64 weed_owners = 12; // 放草的人 (非空=有草) + repeated int64 insect_owners = 13; // 放虫的人 (非空=有虫) + repeated int64 stealers = 14; // 偷菜的人 + int64 grow_sec = 15; // 生长秒数 + bool stealable = 16; // 是否可偷 + int64 left_inorc_fert_times = 17; // 剩余施肥次数 + int64 left_fruit_num = 18; // 剩余果实数 + int64 steal_intimacy_level = 19; // 偷菜亲密度等级 + repeated int64 mutant_config_ids = 20; // 变异配置ID + bool is_nudged = 21; // 是否被催熟 +} + +// ============ 生长阶段详情 ============ +message PlantPhaseInfo { + int32 phase = 1; // PlantPhase 枚举值 + int64 begin_time = 2; // 阶段开始时间 + int64 phase_id = 3; // 阶段ID + // fields 4,5 reserved + int64 dry_time = 6; // 变干时间 (>0 需要浇水) + int64 weeds_time = 7; // 长草时间 (>0 有杂草) + int64 insect_time = 8; // 生虫时间 (>0 有虫害) + map ferts_used = 9; // 已用肥料 + repeated MutantInfo mutants = 10; // 变异信息 +} + +// 变异信息 +message MutantInfo { + int64 mutant_time = 1; + int64 mutant_config_id = 2; + int64 weather_id = 3; +} + +// ============ 操作限制 ============ +// 每种操作的每日限制信息 +message OperationLimit { + int64 id = 1; // 操作类型ID + int64 day_times = 2; // 今日已操作次数 + int64 day_times_lt = 3; // 每日操作上限 + int64 day_share_id = 4; // 分享ID + int64 day_exp_times = 5; // 今日已获得经验次数 + int64 day_ex_times_lt = 6; // 每日可获得经验上限 + int64 day_exp_share_id = 7; // 经验分享ID +} +// 操作类型ID: +// 10001 = 帮好友浇水 +// 10002 = 帮好友除虫 +// 10003 = 帮好友除草 +// 10004 = 偷菜 +// 10005 = 放虫 +// 10006 = 放草 + +// ============ 请求/回复消息 ============ + +// --- 获取所有土地 --- +message AllLandsRequest { + int64 host_gid = 1; // 0或自己的GID=查看自己 +} + +message AllLandsReply { + repeated LandInfo lands = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 收获 --- +message HarvestRequest { + repeated int64 land_ids = 1; // 要收获的土地ID列表 + int64 host_gid = 2; // 农场主GID + bool is_all = 3; // 是否全部收获 +} + +message HarvestReply { + repeated LandInfo land = 1; + // repeated Item items = 2; // corepb.Item + // repeated Item lost_items = 3; + repeated OperationLimit operation_limits = 4; +} + +// --- 浇水 --- +message WaterLandRequest { + repeated int64 land_ids = 1; + int64 host_gid = 2; +} + +message WaterLandReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 除草 --- +message WeedOutRequest { + repeated int64 land_ids = 1; + int64 host_gid = 2; +} + +message WeedOutReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 除虫 --- +message InsecticideRequest { + repeated int64 land_ids = 1; + int64 host_gid = 2; +} + +message InsecticideReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 播种 --- +message PlantItem { + int64 seed_id = 1; // 种子ID + repeated int64 land_ids = 2; // 要种植的土地ID列表 + bool auto_slave = 3; // 是否自动副产 +} + +message PlantRequest { + map land_and_seed = 1; // land_id -> seed_id (旧版) + repeated PlantItem items = 2; // 新版: 按种子分组种植 +} + +message PlantReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 移除植物 --- +message RemovePlantRequest { + repeated int64 land_ids = 1; +} + +message RemovePlantReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 施肥 --- +message FertilizeRequest { + repeated int64 land_ids = 1; + int64 fertilizer_id = 2; +} + +message FertilizeReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; + int64 fertilizer = 3; // 剩余肥料时间 +} + +// --- 升级土地 --- +message UpgradeLandRequest { + int64 land_id = 1; +} + +message UpgradeLandReply { + LandInfo land = 1; +} + +// --- 解锁土地 --- +message UnlockLandRequest { + int64 land_id = 1; + bool do_shared = 2; +} + +message UnlockLandReply { + LandInfo land = 1; +} + +// --- 放虫 --- +message PutInsectsRequest { + repeated int64 land_ids = 1; + int64 host_gid = 2; +} + +message PutInsectsReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// --- 放草 --- +message PutWeedsRequest { + repeated int64 land_ids = 1; + int64 host_gid = 2; +} + +message PutWeedsReply { + repeated LandInfo land = 1; + repeated OperationLimit operation_limits = 2; +} + +// ============ 服务器推送通知 ============ + +// 土地状态变化通知 (被放虫/放草/偷菜等) +message LandsNotify { + repeated LandInfo lands = 1; // 变化的土地列表 + int64 host_gid = 2; // 农场主GID +} diff --git a/211/server/proto/shoppb.proto b/211/server/proto/shoppb.proto new file mode 100644 index 0000000..175bbb7 --- /dev/null +++ b/211/server/proto/shoppb.proto @@ -0,0 +1,74 @@ +syntax = "proto3"; + +package gamepb.shoppb; + +import "corepb.proto"; + +// ============ 商店类型: 1=道具商店, 2=种子商店, 3=宠物商店 ============ + +// ============ 商店概览 ============ +message ShopProfile { + int64 shop_id = 1; // 商店ID + string shop_name = 2; // 商店名称 + int32 shop_type = 3; // 商店类型 +} + +// ============ 商品信息 ============ +message GoodsInfo { + int64 id = 1; // 商品ID (用于购买) + int64 bought_num = 2; // 已购买数量 + int64 price = 3; // 价格 (金币) + int64 limit_count = 4; // 限购数量 (0=不限购) + bool unlocked = 5; // 是否已解锁 + int64 item_id = 6; // 物品ID (即种子ID) + int64 item_count = 7; // 每次购买获得数量 + repeated Cond conds = 8; // 解锁条件 +} + +// ============ 解锁条件 ============ +enum CondType { + COND_TYPE_UNKNOWN = 0; + MIN_LEVEL = 1; // 最低等级要求 + UNLOCK_CARD = 2; // 需要解锁卡 +} + +message Cond { + int32 type = 1; // CondType + int64 param = 2; // 参数值 (如等级要求的等级数) +} + +// ============ 请求/回复 ============ + +// --- 获取商店列表 --- +message ShopProfilesRequest {} + +message ShopProfilesReply { + repeated ShopProfile shop_profiles = 1; +} + +// --- 获取商店商品 --- +message ShopInfoRequest { + int64 shop_id = 1; +} + +message ShopInfoReply { + repeated GoodsInfo goods_list = 1; +} + +// --- 购买商品 --- +message BuyGoodsRequest { + int64 goods_id = 1; // 商品ID (GoodsInfo.id) + int64 num = 2; // 购买数量 + int64 price = 3; // 单价 +} + +message BuyGoodsReply { + GoodsInfo goods = 1; // 更新后的商品信息 + repeated corepb.Item get_items = 2; // 获得的物品 + repeated corepb.Item cost_items = 3; // 消耗的物品 +} + +// --- 商品解锁推送 --- +message GoodsUnlockNotify { + repeated GoodsInfo goods_list = 1; +} diff --git a/211/server/proto/taskpb.proto b/211/server/proto/taskpb.proto new file mode 100644 index 0000000..e6d953b --- /dev/null +++ b/211/server/proto/taskpb.proto @@ -0,0 +1,81 @@ +syntax = "proto3"; + +package gamepb.taskpb; + +import "corepb.proto"; + +// ============ 任务类型 ============ +// 1 = 成长任务 (GROWTH_TASK) +// 2 = 每日任务 (DAILY_TASK) + +// ============ 单个任务 ============ +message Task { + int64 id = 1; // 任务ID + int64 progress = 2; // 当前进度 + bool is_claimed = 3; // 是否已领取 + bool is_unlocked = 4; // 是否已解锁 + repeated corepb.Item rewards = 5; // 奖励列表 + int64 total_progress = 6; // 总进度 + int64 share_multiple = 7; // 分享倍数 (>1 表示可分享翻倍) + repeated string params = 8; // 参数 + string desc = 9; // 描述 + int32 task_type = 10; // 任务类型 + int64 group = 11; // 分组 + int64 cond_type = 12; // 条件类型 + int64 is_show_text = 13; // 是否显示文本 +} + +// ============ 活跃度奖励 ============ +message Active { + int64 id = 1; + int32 status = 2; // 0=未完成, 1=已完成, 2=未完成 + repeated corepb.Item items = 3; +} + +// ============ 任务信息汇总 ============ +message TaskInfo { + repeated Task growth_tasks = 1; // 成长任务列表 + repeated Task daily_tasks = 2; // 每日任务列表 + repeated Task tasks = 3; // 其他任务 + repeated Active actives = 4; // 活跃度奖励 +} + +// ============ 请求/回复 ============ + +// --- 获取任务信息 --- +message TaskInfoRequest {} + +message TaskInfoReply { + TaskInfo task_info = 1; +} + +// --- 领取单个任务奖励 --- +message ClaimTaskRewardRequest { + int64 id = 1; // 任务ID + bool do_shared = 2; // 是否使用分享翻倍 (true=翻倍, false=普通领取) +} + +message ClaimTaskRewardReply { + repeated corepb.Item items = 1; // 获得的物品 + TaskInfo task_info = 2; // 更新后的任务信息 + repeated corepb.Item compensated_items = 3; // 补偿物品 +} + +// --- 批量领取任务奖励 --- +message BatchClaimTaskRewardRequest { + repeated int64 ids = 1; // 任务ID列表 + bool do_shared = 2; // 是否使用分享翻倍 +} + +message BatchClaimTaskRewardReply { + repeated corepb.Item items = 1; + TaskInfo task_info = 2; + repeated corepb.Item compensated_items = 3; +} + +// ============ 服务器推送 ============ + +// 任务状态变化通知 +message TaskInfoNotify { + TaskInfo task_info = 1; +} diff --git a/211/server/proto/userpb.proto b/211/server/proto/userpb.proto new file mode 100644 index 0000000..6b987aa --- /dev/null +++ b/211/server/proto/userpb.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; + +package gamepb.userpb; + +// ============ 登录请求 ============ +message LoginRequest { + // 字段 1,2 保留未使用 + int64 sharer_id = 3; + string sharer_open_id = 4; + DeviceInfo device_info = 5; + int64 share_cfg_id = 6; + string scene_id = 7; + ReportData report_data = 8; +} + +// 设备信息 +message DeviceInfo { + string client_version = 1; // e.g. "1.6.0.8_20251224" + string sys_software = 2; // e.g. "Windows Unknown x64" + string sys_hardware = 3; + string telecom_oper = 4; + string network = 5; // e.g. "wifi" + int64 screen_width = 6; + int64 screen_height = 7; + float density = 8; + string cpu = 9; // e.g. "microsoft" + int64 memory = 10; + string gl_render = 11; + string gl_version = 12; + string device_id = 13; + string android_oaid = 14; + string ios_caid = 15; +} + +// 上报数据 +message ReportData { + string callback = 1; + string cd_extend_info = 2; + string click_id = 3; + string clue_token = 4; + string minigame_channel = 5; + int32 minigame_platid = 6; + string req_id = 7; + string trackid = 8; +} + +// ============ 登录回复 ============ +message LoginReply { + BasicInfo basic = 1; + // ItemBag item_bag = 2; // corepb.ItemBag, 复杂结构先跳过 + int64 time_now_millis = 3; + bool is_first_login = 4; + // GuideInfo guide_info = 5; + repeated QQGroupInfo qq_group_infos = 6; + // Illustrated illustrated = 7; + // repeated SystemUnlockItem unlocked_items = 8; + VersionInfo version_info = 9; + // MallMsg mall_msg = 10; + int64 qq_friend_recommend_authorized = 11; +} + +// 用户基本信息 +message BasicInfo { + int64 gid = 1; + string name = 2; + int64 level = 3; + int64 exp = 4; + int64 gold = 5; + string open_id = 6; + string avatar_url = 7; + string remark = 8; + string signature = 9; + int32 gender = 10; + // repeated AvatarFrame equip_avatar_frames = 11; + // map share_infos = 12; + int32 authorized_status = 13; + bool disable_nudge = 14; +} + +// QQ群信息 +message QQGroupInfo { + string qq_group_id = 1; + string qq_group_name = 2; +} + +// 版本信息 +message VersionInfo { + int32 status = 1; + string version_recommend = 2; + string version_force = 3; + string res_version = 4; +} + +// ============ 心跳 ============ +message HeartbeatRequest { + int64 gid = 1; + string client_version = 2; +} + +message HeartbeatReply { + int64 server_time = 1; + VersionInfo version_info = 2; +} + +// ============ 上报分享点击 ============ +// 用于已登录状态下处理分享链接(触发好友申请) +message ReportArkClickRequest { + int64 sharer_id = 1; + string sharer_open_id = 2; + string scene_id = 3; + int64 share_cfg_id = 4; +} + +message ReportArkClickReply { + // 通常为空响应 +} + +// ============ 服务器推送通知 ============ + +// 基本信息变化通知 (升级/金币变化等) +message BasicNotify { + BasicInfo basic = 1; +} \ No newline at end of file diff --git a/211/server/proto/visitpb.proto b/211/server/proto/visitpb.proto new file mode 100644 index 0000000..ffc074a --- /dev/null +++ b/211/server/proto/visitpb.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; + +package gamepb.visitpb; + +import "plantpb.proto"; +import "userpb.proto"; + +// ============ 访问好友农场服务 ============ +// service VisitService { +// rpc Enter(EnterRequest) returns (EnterReply); +// rpc Leave(LeaveRequest) returns (LeaveReply); +// } + +// ============ 进入原因枚举 ============ +enum EnterReason { + ENTER_REASON_UNKNOWN = 0; + ENTER_REASON_BUBBLE = 1; + ENTER_REASON_FRIEND = 2; + ENTER_REASON_INTERACT = 3; +} + +// ============ 进入好友农场 ============ +message EnterRequest { + int64 host_gid = 1; // 好友的GID + int32 reason = 2; // EnterReason 进入原因 +} + +message EnterReply { + gamepb.userpb.BasicInfo basic = 1; // 好友基本信息 + repeated gamepb.plantpb.LandInfo lands = 2; // 好友的所有土地 + // field 3: brief_dog_info (不需要) + // field 4: nudge_info (不需要) +} + +// ============ 离开好友农场 ============ +message LeaveRequest { + int64 host_gid = 1; // 好友的GID +} + +message LeaveReply { + // 空消息 +} diff --git a/211/server/share.txt b/211/server/share.txt new file mode 100644 index 0000000..e69de29 diff --git a/211/server/src/config.js b/211/server/src/config.js new file mode 100644 index 0000000..6ba01be --- /dev/null +++ b/211/server/src/config.js @@ -0,0 +1,53 @@ +/** + * 配置常量与枚举定义 + */ + +const CONFIG = { + serverUrl: 'wss://gate-obt.nqf.qq.com/prod/ws', + clientVersion: '1.6.0.14_20251224', + platform: 'qq', // 平台: qq 或 wx (可通过 --wx 切换为微信) + os: 'iOS', + heartbeatInterval: 25000, // 心跳间隔 25秒 + farmCheckInterval: 1000, // 自己农场巡查完成后等待间隔 (可通过 --interval 修改, 最低1秒) + friendCheckInterval: 10000, // 好友巡查完成后等待间隔 (可通过 --friend-interval 修改, 最低1秒) + forceLowestLevelCrop: false, // 开启后固定种最低等级作物(通常是白萝卜),跳过经验效率分析 + enableNormalFertilize: false, + enableOrganicFertilize: false, + allowTicketFertilizerPurchase: false, + enableFriendOps: true, + enableSteal: true, + enableAutoSell: true, + allowBuySeeds: true, + allowRemove: true, + idleStrategy: 'exp', +}; + +// 运行期提示文案(做了简单编码,避免明文散落) +const RUNTIME_HINT_MASK = 23; +const RUNTIME_HINT_DATA = [ + 12295, 22759, 26137, 12294, 26427, 39022, 30457, 24343, 28295, 20826, + 36142, 65307, 20018, 31126, 20485, 21313, 12309, 35808, 20185, 20859, + 24343, 20164, 24196, 20826, 36142, 33696, 21441, 12309, +]; + +// 生长阶段枚举 +const PlantPhase = { + UNKNOWN: 0, + SEED: 1, + GERMINATION: 2, + SMALL_LEAVES: 3, + LARGE_LEAVES: 4, + BLOOMING: 5, + MATURE: 6, + DEAD: 7, +}; + +const PHASE_NAMES = ['未知', '种子', '发芽', '小叶', '大叶', '开花', '成熟', '枯死']; + +module.exports = { + CONFIG, + PlantPhase, + PHASE_NAMES, + RUNTIME_HINT_MASK, + RUNTIME_HINT_DATA, +}; diff --git a/211/server/src/core/FarmBot.js b/211/server/src/core/FarmBot.js new file mode 100644 index 0000000..5a30577 --- /dev/null +++ b/211/server/src/core/FarmBot.js @@ -0,0 +1,186 @@ +const EventEmitter = require('events'); +const { NetworkClient } = require('./Network'); +const { FarmManager } = require('./FarmManager'); +const { FriendManager } = require('./FriendManager'); +const { WarehouseManager } = require('./WarehouseManager'); +const { ShopManager } = require('./ShopManager'); +const { log, logWarn, emitRuntimeHint } = require('../utils'); +const { CONFIG } = require('../config'); + +class FarmBot extends EventEmitter { + constructor(config = {}) { + super(); + // Merge provided config with default CONFIG + // Deep copy to avoid modifying global CONFIG if passed by reference (though usually it's shallow copy) + this.config = { ...CONFIG, ...config }; + + // Initialize components + this.network = new NetworkClient(this); + this.farmManager = new FarmManager(this); + this.friendManager = new FriendManager(this); + this.warehouseManager = new WarehouseManager(this); + this.shopManager = new ShopManager(this); + this.dailyClaimTimer = null; + + // State + this.isRunning = false; + this.user = { + gid: 0, + name: 'Loading...', + level: 0, + gold: 0, + exp: 0, + tickets: 0, + fertilizer: 0, + freeMallClaimDate: '' + }; + + // Error handling + this.network.on('error', (err) => { + log('机器人', `网络错误: ${err.message}`); + this.emit('error', err); + }); + + this.network.on('disconnected', () => { + if (this.isRunning) { + log('机器人', '连接断开,正在尝试重新连接...'); + // Reconnection logic is handled in NetworkClient, but we can monitor it here + } + }); + } + + async start() { + if (this.isRunning) return; + this.isRunning = true; + + this.log('系统', `正在启动农场小助手... 平台: ${this.config.platform}`); + emitRuntimeHint(true); + + try { + // 1. Connect + this.log('系统', '正在连接服务器...'); + await new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('连接超时')), 10000); + this.network.connect((success) => { + clearTimeout(timeout); + if (success) resolve(); + else reject(new Error('连接失败')); + }); + }); + + // 2. Login + this.log('系统', '正在登录...'); + await new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('登录超时')), 10000); + this.network.sendLogin((success) => { + clearTimeout(timeout); + if (success) resolve(); + else reject(new Error('登录失败')); + }); + }); + + // 3. Start Loops + this.log('系统', '开始自动化作业...'); + this.farmManager.startLoop(); + if (this.config.enableFriendOps !== false) { + this.friendManager.startLoop(); + } + if (this.config.enableAutoSell !== false) { + this.warehouseManager.startLoop(); + } + this.startDailyClaimLoop(); + + this.emit('started'); + this.log('系统', '农场小助手启动成功!'); + + } catch (error) { + this.log('系统', `启动失败: ${error.message}`); + this.stop(); + throw error; + } + } + + stop() { + this.isRunning = false; + this.farmManager.stopLoop(); + this.friendManager.stopLoop(); + this.warehouseManager.stopLoop(); + this.stopDailyClaimLoop(); + + // Stop network + if (this.network.ws) { + this.network.ws.close(); + } + + this.emit('stopped'); + log('系统', '农场小助手已停止'); + } + + log(tag, msg) { + log(tag, msg); + this.emit('log', { + tag, + msg, + time: Date.now() + }); + } + + logWarn(tag, msg) { + logWarn(tag, msg); + this.emit('log', { + tag, + msg, + type: 'warn', + time: Date.now() + }); + } + + getTodayKey() { + const now = new Date(); + const y = now.getFullYear(); + const m = `${now.getMonth() + 1}`.padStart(2, '0'); + const d = `${now.getDate()}`.padStart(2, '0'); + return `${y}-${m}-${d}`; + } + + async runDailyClaims() { + if (!this.isRunning) return; + await this.network.tryClaimShareReward(1); + const todayKey = this.getTodayKey(); + if (this.user.freeMallClaimDate === todayKey) return; + try { + await this.shopManager.purchaseMallItem(1001, 1); + this.user.freeMallClaimDate = todayKey; + this.emit('userUpdate', this.user); + this.log('商城', '已领取每日免费礼包'); + } catch (e) { + this.logWarn('商城', `领取失败: ${e.message}`); + } + } + + startDailyClaimLoop() { + if (this.dailyClaimTimer) return; + const scheduleNext = () => { + if (!this.isRunning) return; + const now = new Date(); + const next = new Date(now); + next.setHours(24, 0, 0, 0); + const delay = Math.max(1000, next.getTime() - now.getTime()); + this.dailyClaimTimer = setTimeout(async () => { + this.dailyClaimTimer = null; + await this.runDailyClaims(); + scheduleNext(); + }, delay); + }; + scheduleNext(); + } + + stopDailyClaimLoop() { + if (this.dailyClaimTimer) { + clearTimeout(this.dailyClaimTimer); + this.dailyClaimTimer = null; + } + } +} + +module.exports = { FarmBot }; diff --git a/211/server/src/core/FarmManager.js b/211/server/src/core/FarmManager.js new file mode 100644 index 0000000..6b5bd34 --- /dev/null +++ b/211/server/src/core/FarmManager.js @@ -0,0 +1,1089 @@ +const protobuf = require('protobufjs'); +const { PlantPhase, PHASE_NAMES } = require('../config'); +const { types } = require('../proto'); +const { toLong, toNum, getServerTimeSec, toTimeSec, sleep } = require('../utils'); +const { getPlantNameBySeedId, getPlantName, getPlantExp, formatGrowTime, getPlantGrowTime, getSeedIdByPlantName, getPlantByName } = require('../gameConfig'); +const { getPlantingRecommendation } = require('../../tools/calc-exp-yield'); + +const PLANT_COOLDOWN_MS = 5000; +const PLANT_ALREADY_COOLDOWN_MS = 30000; +const PLANT_PENDING_MS = 15000; +const FERT_PENDING_MS = 15000; + +class FarmManager { + constructor(bot) { + this.bot = bot; + + // Internal state + this.isCheckingFarm = false; + this.isFirstFarmCheck = true; + this.farmCheckTimer = null; + this.farmLoopRunning = false; + this.taskExecuting = false; + this.taskCache = null; + this.taskCacheAt = 0; + this.lastTaskActionAt = 0; + this.plantNextAllowed = new Map(); + this.pendingPlantUntil = new Map(); + this.pendingFertilizeUntil = new Map(); + + // Listen for lands changed push + this.bot.on('landsChanged', this.onLandsChangedPush.bind(this)); + this.bot.on('taskInfoNotify', (taskInfo) => { + this.taskCache = taskInfo || null; + this.taskCacheAt = Date.now(); + }); + } + + // ============ Farm API ============ + + async getAllLands() { + const body = types.AllLandsRequest.encode(types.AllLandsRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'AllLands', body); + const reply = types.AllLandsReply.decode(replyBody); + + // Emit operation limits update (for FriendManager) + if (reply.operation_limits) { + this.bot.emit('operationLimits', reply.operation_limits); + } + return reply; + } + + async harvest(landIds) { + const body = types.HarvestRequest.encode(types.HarvestRequest.create({ + land_ids: landIds, + host_gid: toLong(this.bot.user.gid), + is_all: true, + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'Harvest', body); + return types.HarvestReply.decode(replyBody); + } + + async waterLand(landIds) { + const body = types.WaterLandRequest.encode(types.WaterLandRequest.create({ + land_ids: landIds, + host_gid: toLong(this.bot.user.gid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'WaterLand', body); + return types.WaterLandReply.decode(replyBody); + } + + async weedOut(landIds) { + const body = types.WeedOutRequest.encode(types.WeedOutRequest.create({ + land_ids: landIds, + host_gid: toLong(this.bot.user.gid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'WeedOut', body); + return types.WeedOutReply.decode(replyBody); + } + + async insecticide(landIds) { + const body = types.InsecticideRequest.encode(types.InsecticideRequest.create({ + land_ids: landIds, + host_gid: toLong(this.bot.user.gid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'Insecticide', body); + return types.InsecticideReply.decode(replyBody); + } + + async fertilize(landIds, fertilizerId = 1011) { + let successCount = 0; + for (const landId of landIds) { + try { + const body = types.FertilizeRequest.encode(types.FertilizeRequest.create({ + land_ids: [toLong(landId)], + fertilizer_id: toLong(fertilizerId), + })).finish(); + await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'Fertilize', body); + successCount++; + this.pendingFertilizeUntil.set(landId, Date.now() + FERT_PENDING_MS); + } catch (e) { + break; + } + if (landIds.length > 1) await sleep(50); + } + return successCount; + } + + async removePlant(landIds) { + const body = types.RemovePlantRequest.encode(types.RemovePlantRequest.create({ + land_ids: landIds.map(id => toLong(id)), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'RemovePlant', body); + return types.RemovePlantReply.decode(replyBody); + } + + async unlockLand(landId, doShared = false) { + const body = types.UnlockLandRequest.encode(types.UnlockLandRequest.create({ + land_id: toLong(landId), + do_shared: Boolean(doShared), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'UnlockLand', body); + return types.UnlockLandReply.decode(replyBody); + } + + // ============ Shop API ============ + + async getShopProfiles() { + const body = types.ShopProfilesRequest.encode(types.ShopProfilesRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.shoppb.ShopService', 'ShopProfiles', body); + return types.ShopProfilesReply.decode(replyBody); + } + + async getShopInfo(shopId) { + const body = types.ShopInfoRequest.encode(types.ShopInfoRequest.create({ + shop_id: toLong(shopId), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.shoppb.ShopService', 'ShopInfo', body); + return types.ShopInfoReply.decode(replyBody); + } + + async buyGoods(goodsId, num, price) { + const body = types.BuyGoodsRequest.encode(types.BuyGoodsRequest.create({ + goods_id: toLong(goodsId), + num: toLong(num), + price: toLong(price), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.shoppb.ShopService', 'BuyGoods', body); + return types.BuyGoodsReply.decode(replyBody); + } + + async buyNormalFertilizer(count) { + if (!Number.isFinite(count) || count <= 0) return 0; + const fertilizerItemId = 1011; + let propsShopId = null; + try { + const profilesReply = await this.getShopProfiles(); + const profiles = profilesReply.shop_profiles || []; + const propsShop = profiles.find(profile => toNum(profile.shop_type) === 1); + if (propsShop) { + propsShopId = toNum(propsShop.shop_id); + } + } catch (e) { + this.bot.logWarn('商店', `获取商店列表失败: ${e.message}`); + return 0; + } + + if (!propsShopId) { + this.bot.logWarn('商店', '未找到道具商店'); + return 0; + } + + let goods = null; + try { + const shopReply = await this.getShopInfo(propsShopId); + const goodsList = shopReply.goods_list || []; + goods = goodsList.find(item => toNum(item.item_id) === fertilizerItemId && item.unlocked); + } catch (e) { + this.bot.logWarn('商店', `获取道具商店商品失败: ${e.message}`); + return 0; + } + + if (!goods) { + this.bot.logWarn('商店', '普通化肥不可购买'); + return 0; + } + + const limitCount = toNum(goods.limit_count); + const boughtNum = toNum(goods.bought_num); + let buyCount = count; + if (limitCount > 0) { + const remaining = Math.max(0, limitCount - boughtNum); + buyCount = Math.min(buyCount, remaining); + } + if (buyCount <= 0) return 0; + + try { + const buyReply = await this.buyGoods(toNum(goods.id), buyCount, toNum(goods.price)); + const items = buyReply.get_items || []; + let gotCount = 0; + for (const item of items) { + if (toNum(item.id) === fertilizerItemId) { + gotCount += toNum(item.count); + } + } + return gotCount; + } catch (e) { + this.bot.logWarn('购买', `购买普通化肥失败: ${e.message}`); + return 0; + } + } + + async fetchTaskInfo() { + const body = types.TaskInfoRequest.encode(types.TaskInfoRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.taskpb.TaskService', 'TaskInfo', body); + const reply = types.TaskInfoReply.decode(replyBody); + return reply.task_info || null; + } + + async getTaskInfoCached(maxAgeMs = 15000) { + const now = Date.now(); + if (this.taskCache && now - this.taskCacheAt < maxAgeMs) return this.taskCache; + const taskInfo = await this.fetchTaskInfo(); + if (taskInfo) { + this.taskCache = taskInfo; + this.taskCacheAt = now; + } + return taskInfo; + } + + buildTaskList(taskInfo) { + const tasks = []; + if (!taskInfo) return tasks; + const addTasks = (list) => { + if (!list) return; + for (const task of list) { + tasks.push({ + id: toNum(task.id), + desc: task.desc || '', + progress: toNum(task.progress), + totalProgress: toNum(task.total_progress), + isClaimed: Boolean(task.is_claimed), + isUnlocked: Boolean(task.is_unlocked), + }); + } + }; + addTasks(taskInfo.growth_tasks); + addTasks(taskInfo.daily_tasks); + addTasks(taskInfo.tasks); + return tasks; + } + + parseTaskDesc(desc) { + if (!desc) return null; + let match = desc.match(/购买(\d+)个(.+?)种子/); + if (match) { + return { type: 'buySeed', count: Number(match[1]) || 0, name: match[2].trim() }; + } + match = desc.match(/种植(\d+)个(.+)/); + if (match) { + return { type: 'plantSeed', count: Number(match[1]) || 0, name: match[2].trim() }; + } + match = desc.match(/收获(\d+)个(.+)/); + if (match) { + return { type: 'harvest', count: Number(match[1]) || 0, name: match[2].trim() }; + } + return null; + } + + pickTaskByType(tasks, type) { + for (const task of tasks) { + if (!task.isUnlocked || task.isClaimed) continue; + const parsed = this.parseTaskDesc(task.desc); + if (!parsed || parsed.type !== type) continue; + const remaining = task.totalProgress > 0 ? Math.max(0, task.totalProgress - task.progress) : parsed.count; + if (remaining <= 0) continue; + return { ...parsed, remaining }; + } + return null; + } + + async findSeedGoods(seedId) { + const seedShopId = 2; + const shopReply = await this.getShopInfo(seedShopId); + const goodsList = shopReply.goods_list || []; + const goods = goodsList.find(item => toNum(item.item_id) === seedId && item.unlocked); + if (!goods) return null; + return { + seedId, + goodsId: toNum(goods.id), + price: toNum(goods.price), + limitCount: toNum(goods.limit_count), + boughtNum: toNum(goods.bought_num), + }; + } + + async executeBuySeedTask(task) { + if (!task || !task.name) return false; + if (this.bot.config.allowBuySeeds === false) { + this.bot.log('任务', '已关闭自动购买种子,跳过任务购买'); + return false; + } + const seedId = getSeedIdByPlantName(task.name); + if (!seedId) return false; + const seedGoods = await this.findSeedGoods(seedId); + if (!seedGoods) { + this.bot.logWarn('任务', `未找到种子: ${task.name}`); + return false; + } + let buyCount = task.remaining || task.count || 0; + if (buyCount <= 0) return false; + if (seedGoods.limitCount > 0) { + const remainingLimit = Math.max(0, seedGoods.limitCount - seedGoods.boughtNum); + buyCount = Math.min(buyCount, remainingLimit); + } + const affordable = Math.floor(this.bot.user.gold / seedGoods.price); + buyCount = Math.min(buyCount, affordable); + if (buyCount <= 0) return false; + try { + const buyReply = await this.buyGoods(seedGoods.goodsId, buyCount, seedGoods.price); + if (buyReply.cost_items) { + for (const item of buyReply.cost_items) { + this.bot.user.gold -= toNum(item.count); + } + } + this.bot.log('任务', `购买种子: ${task.name} x${buyCount}`); + return true; + } catch (e) { + this.bot.logWarn('任务', `购买失败: ${e.message}`); + return false; + } + } + + // ============ Planting Logic ============ + + encodePlantRequest(seedId, landIds) { + const writer = protobuf.Writer.create(); + const itemWriter = writer.uint32(18).fork(); + itemWriter.uint32(8).int64(seedId); + const idsWriter = itemWriter.uint32(18).fork(); + for (const id of landIds) { + idsWriter.int64(id); + } + idsWriter.ldelim(); + itemWriter.ldelim(); + return writer.finish(); + } + + async plantSeeds(seedId, landIds) { + let successCount = 0; + const now = Date.now(); + for (const landId of landIds) { + const nextAllowed = this.plantNextAllowed.get(landId) || 0; + if (now < nextAllowed) continue; + this.plantNextAllowed.set(landId, now + PLANT_COOLDOWN_MS); + try { + const body = this.encodePlantRequest(seedId, [landId]); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'Plant', body); + types.PlantReply.decode(replyBody); + successCount++; + this.pendingPlantUntil.set(landId, now + PLANT_PENDING_MS); + } catch (e) { + const msg = String(e && e.message ? e.message : e); + if (msg.includes('1001008') || msg.includes('土地已种植')) { + this.plantNextAllowed.set(landId, now + PLANT_ALREADY_COOLDOWN_MS); + this.pendingPlantUntil.set(landId, now + PLANT_ALREADY_COOLDOWN_MS); + this.bot.log('种植', `土地#${landId} 已种植,跳过`); + } else { + this.bot.logWarn('种植', `土地#${landId} 失败: ${msg}`); + } + } + if (landIds.length > 1) await sleep(50); + } + return successCount; + } + + async findBestSeed(landsCount, useFertilizerOverride) { + const SEED_SHOP_ID = 2; + const shopReply = await this.getShopInfo(SEED_SHOP_ID); + if (!shopReply.goods_list || shopReply.goods_list.length === 0) { + this.bot.logWarn('商店', '种子商店暂无商品'); + return null; + } + + const available = []; + for (const goods of shopReply.goods_list) { + if (!goods.unlocked) continue; + + let meetsConditions = true; + let requiredLevel = 0; + const conds = goods.conds || []; + for (const cond of conds) { + if (toNum(cond.type) === 1) { + requiredLevel = toNum(cond.param); + if (this.bot.user.level < requiredLevel) { + meetsConditions = false; + break; + } + } + } + if (!meetsConditions) continue; + + const limitCount = toNum(goods.limit_count); + const boughtNum = toNum(goods.bought_num); + if (limitCount > 0 && boughtNum >= limitCount) continue; + + available.push({ + goods, + goodsId: toNum(goods.id), + seedId: toNum(goods.item_id), + price: toNum(goods.price), + requiredLevel, + }); + } + + if (available.length === 0) { + this.bot.logWarn('商店', '没有找到可购买的种子'); + return null; + } + + if (this.bot.config.forceLowestLevelCrop) { + available.sort((a, b) => a.requiredLevel - b.requiredLevel || a.price - b.price); + return available[0]; + } + + try { + const rec = getPlantingRecommendation(this.bot.user.level, landsCount == null ? 18 : landsCount, { top: 50 }); + const useFertilizer = typeof useFertilizerOverride === 'boolean' + ? useFertilizerOverride + : (this.bot.config.enableNormalFertilize || this.bot.config.enableOrganicFertilize); + let candidates = useFertilizer ? rec.candidatesNormalFert : rec.candidatesNoFert; + if (!candidates) candidates = rec.candidatesNoFert; // fallback + + let rankedSeedIds = candidates.map(x => x.seedId); + + if (this.bot.user.level > 30) { + const minLevel = Math.max(1, this.bot.user.level - 20); + const filtered = rec.candidatesNoFert.filter(x => x.requiredLevel >= minLevel); + if (filtered.length > 0) { + rankedSeedIds = filtered.map(x => x.seedId); + this.bot.log('商店', `高等级策略生效 (Lv${this.bot.user.level}),仅考虑 Lv${minLevel}+ 作物`); + } + } + for (const seedId of rankedSeedIds) { + const hit = available.find(x => x.seedId === seedId); + if (hit) return hit; + } + } catch (e) { + this.bot.logWarn('商店', `经验效率推荐失败: ${e.message}`); + } + + if(this.bot.user.level && this.bot.user.level <= 28){ + available.sort((a, b) => a.requiredLevel - b.requiredLevel); + }else{ + available.sort((a, b) => b.requiredLevel - a.requiredLevel); + } + return available[0]; + } + + async autoPlantEmptyLands(deadLandIds, emptyLandIds, unlockedLandCount, preferredSeedId = 0, preferredCount = 0) { + let landsToPlant = emptyLandIds.length > 0 ? [...emptyLandIds] : []; + + if (deadLandIds.length > 0) { + if (this.bot.config.allowRemove === false) { + this.bot.log('铲除', '已关闭自动铲除,跳过枯萎土地'); + } else { + try { + await this.removePlant(deadLandIds); + this.bot.log('铲除', `已铲除 ${deadLandIds.length} 块土地 (${deadLandIds.join(',')})`); + landsToPlant.push(...deadLandIds); + } catch (e) { + this.bot.logWarn('铲除', `批量铲除失败: ${e.message}`); + landsToPlant.push(...deadLandIds); + } + } + } + + if (landsToPlant.length === 0) return 0; + if (landsToPlant.length > 1) { + landsToPlant = Array.from(new Set(landsToPlant)); + } + if (landsToPlant.length > 0) { + const now = Date.now(); + const filtered = []; + for (const landId of landsToPlant) { + const nextAllowed = this.plantNextAllowed.get(landId) || 0; + if (now >= nextAllowed) { + filtered.push(landId); + } + } + landsToPlant = filtered; + } + if (landsToPlant.length === 0) return 0; + if (preferredCount > 0 && landsToPlant.length > preferredCount) { + landsToPlant = landsToPlant.slice(0, preferredCount); + } + + let bagItems = null; + try { + const bagReply = await this.bot.warehouseManager.getBag(); + bagItems = this.bot.warehouseManager.getBagItems(bagReply); + } catch (e) { + this.bot.logWarn('背包', `获取背包失败: ${e.message}`); + } + + const enableNormal = this.bot.config.enableNormalFertilize === true; + const enableOrganic = this.bot.config.enableOrganicFertilize === true; + let normalCount = 0; + let organicCount = 0; + let fertilizerInventoryEmpty = false; + if (bagItems) { + for (const item of bagItems) { + const id = toNum(item.id); + const count = toNum(item.count); + if (id === 1011) normalCount = count; + if (id === 1012) organicCount = count; + } + if ((enableNormal || enableOrganic) && normalCount <= 0 && organicCount <= 0) { + fertilizerInventoryEmpty = true; + this.bot.log('施肥', '化肥容器为空,切换为无化肥策略'); + } + } + const useFertilizer = (enableNormal || enableOrganic) && !fertilizerInventoryEmpty; + + let targetSeedGoods = null; + let targetSeedId = preferredSeedId; + let targetSeedName = preferredSeedId ? getPlantNameBySeedId(preferredSeedId) : ''; + if (!preferredSeedId) { + try { + targetSeedGoods = await this.findBestSeed(unlockedLandCount, useFertilizer); + } catch (e) { + this.bot.logWarn('商店', `查询失败: ${e.message}`); + return 0; + } + if (!targetSeedGoods) return 0; + targetSeedId = targetSeedGoods.seedId; + targetSeedName = getPlantNameBySeedId(targetSeedId); + } else { + try { + targetSeedGoods = await this.findSeedGoods(preferredSeedId); + } catch (e) { + this.bot.logWarn('商店', `查询失败: ${e.message}`); + } + } + + let selectedSeed = null; + if (bagItems && targetSeedId) { + for (const item of bagItems) { + const id = toNum(item.id); + const count = toNum(item.count); + if (id !== targetSeedId || count <= 0) continue; + selectedSeed = { id, count, name: targetSeedName || getPlantNameBySeedId(id) }; + break; + } + } + + let actualSeedId = 0; + let seedName = ''; + if (selectedSeed) { + actualSeedId = selectedSeed.id; + seedName = selectedSeed.name; + if (landsToPlant.length > selectedSeed.count) { + landsToPlant = landsToPlant.slice(0, selectedSeed.count); + } + this.bot.log('种植', `优先使用背包种子: ${seedName} x${landsToPlant.length}`); + } else if (this.bot.config.allowBuySeeds === false) { + if (targetSeedName) { + this.bot.log('种植', `已关闭购买种子,背包无 ${targetSeedName} 种子`); + } else { + this.bot.log('种植', '已关闭购买种子,背包无可用种子'); + } + return 0; + } else { + if (!targetSeedGoods) { + try { + targetSeedGoods = await this.findSeedGoods(targetSeedId); + } catch (e) { + this.bot.logWarn('商店', `查询失败: ${e.message}`); + return 0; + } + } + if (!targetSeedGoods) return 0; + + seedName = targetSeedName || getPlantNameBySeedId(targetSeedGoods.seedId); + const growTime = getPlantGrowTime(1020000 + (targetSeedGoods.seedId - 20000)); + const growTimeStr = growTime > 0 ? ` 生长${formatGrowTime(growTime)}` : ''; + this.bot.log('商店', `最佳作物: ${seedName} (${targetSeedGoods.seedId}) 价格: ${targetSeedGoods.price}金币${growTimeStr}`); + + const needCount = landsToPlant.length; + const totalCost = targetSeedGoods.price * needCount; + if (totalCost > this.bot.user.gold) { + const canBuy = Math.floor(this.bot.user.gold / targetSeedGoods.price); + if (canBuy <= 0) return 0; + landsToPlant = landsToPlant.slice(0, canBuy); + this.bot.log('商店', `金币不足,本次仅种植 ${canBuy} 块土地`); + } + + actualSeedId = targetSeedGoods.seedId; + try { + const buyReply = await this.buyGoods(targetSeedGoods.goodsId, landsToPlant.length, targetSeedGoods.price); + if (buyReply.get_items && buyReply.get_items.length > 0) { + const gotItem = buyReply.get_items[0]; + const gotId = toNum(gotItem.id); + if (gotId > 0) actualSeedId = gotId; + } + if (buyReply.cost_items) { + for (const item of buyReply.cost_items) { + this.bot.user.gold -= toNum(item.count); + } + } + } catch (e) { + this.bot.logWarn('购买', e.message); + return 0; + } + } + + let plantedLands = []; + try { + const planted = await this.plantSeeds(actualSeedId, landsToPlant); + this.bot.log('种植', `成功种植 ${planted} 块土地`); + if (planted > 0) { + plantedLands = landsToPlant.slice(0, planted); + } + } catch (e) { + this.bot.logWarn('种植', e.message); + } + + if (plantedLands.length > 0) { + if (!enableNormal && !enableOrganic) { + return plantedLands.length; + } + if (fertilizerInventoryEmpty) { + return plantedLands.length; + } + + let items = bagItems; + if (!items) { + try { + const bagReply = await this.bot.warehouseManager.getBag(); + items = this.bot.warehouseManager.getBagItems(bagReply); + } catch (e) { + this.bot.logWarn('施肥', `检查背包失败: ${e.message}`); + } + } + + if (!items) { + if (enableNormal) normalCount = plantedLands.length; + if (enableOrganic) organicCount = plantedLands.length; + } else if (!bagItems) { + normalCount = 0; + organicCount = 0; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + if (id === 1011) normalCount = count; + if (id === 1012) organicCount = count; + } + } + + let remainingLands = [...plantedLands]; + if (enableOrganic && organicCount > 0) { + const organicTargets = remainingLands.slice(0, organicCount); + const fertilized = await this.fertilize(organicTargets, 1012); + if (fertilized > 0) { + this.bot.log('施肥', `有机化肥施肥 ${fertilized} 块土地`); + } + remainingLands = remainingLands.slice(organicTargets.length); + } + + if (remainingLands.length > 0 && enableNormal) { + if (normalCount < remainingLands.length && this.bot.config.allowTicketFertilizerPurchase) { + const needBuy = remainingLands.length - normalCount; + const bought = await this.buyNormalFertilizer(needBuy); + if (bought > 0) { + normalCount += bought; + this.bot.log('施肥', `自动购买普通化肥 ${bought} 个`); + } + } + if (normalCount < remainingLands.length) { + this.bot.log('施肥', `普通化肥不足 (库存: ${normalCount}, 需要: ${remainingLands.length}),仅施肥部分土地`); + remainingLands = remainingLands.slice(0, normalCount); + } + if (remainingLands.length > 0) { + const fertilized = await this.fertilize(remainingLands, 1011); + if (fertilized > 0) { + this.bot.log('施肥', `普通化肥施肥 ${fertilized} 块土地`); + } + } + } + } + + return plantedLands.length; + } + + // ============ Analysis ============ + + getCurrentPhase(phases, debug, landLabel) { + if (!phases || phases.length === 0) return null; + const nowSec = getServerTimeSec(); + + for (let i = phases.length - 1; i >= 0; i--) { + const beginTime = toTimeSec(phases[i].begin_time); + if (beginTime > 0 && beginTime <= nowSec) { + return phases[i]; + } + } + return phases[0]; + } + + analyzeLands(lands) { + const result = { + harvestable: [], needWater: [], needWeed: [], needBug: [], + growing: [], empty: [], dead: [], + harvestableInfo: [], + }; + + const nowSec = getServerTimeSec(); + + for (const land of lands) { + const id = toNum(land.id); + if (!land.unlocked) continue; + + const plant = land.plant; + if (!plant) { + const pendingUntil = this.pendingPlantUntil.get(id) || 0; + if (pendingUntil > Date.now()) { + result.growing.push(id); + } else { + result.empty.push(id); + } + continue; + } + if (!plant.phases || plant.phases.length === 0) { + const plantId = toNum(plant.id); + if (plantId > 0 || plant.name) { + result.growing.push(id); + } else { + const pendingUntil = this.pendingPlantUntil.get(id) || 0; + if (pendingUntil > Date.now()) { + result.growing.push(id); + } else { + result.empty.push(id); + } + } + continue; + } + + const currentPhase = this.getCurrentPhase(plant.phases, false, `土地#${id}`); + if (!currentPhase) { + result.empty.push(id); + continue; + } + const phaseVal = currentPhase.phase; + + if (phaseVal === PlantPhase.DEAD) { + result.dead.push(id); + continue; + } + + if (phaseVal === PlantPhase.MATURE) { + result.harvestable.push(id); + const plantId = toNum(plant.id); + result.harvestableInfo.push({ + landId: id, + plantId, + name: getPlantName(plantId), + exp: getPlantExp(plantId), + }); + continue; + } + + const dryNum = toNum(plant.dry_num); + const dryTime = toTimeSec(currentPhase.dry_time); + if (dryNum > 0 || (dryTime > 0 && dryTime <= nowSec)) { + result.needWater.push(id); + } + + const weedsTime = toTimeSec(currentPhase.weeds_time); + const hasWeeds = (plant.weed_owners && plant.weed_owners.length > 0) || (weedsTime > 0 && weedsTime <= nowSec); + if (hasWeeds) { + result.needWeed.push(id); + } + + const insectTime = toTimeSec(currentPhase.insect_time); + const hasBugs = (plant.insect_owners && plant.insect_owners.length > 0) || (insectTime > 0 && insectTime <= nowSec); + if (hasBugs) { + result.needBug.push(id); + } + + result.growing.push(id); + } + + return result; + } + + // ============ Loop ============ + + async getFormattedLands() { + try { + const landsReply = await this.getAllLands(); + if (!landsReply || !landsReply.lands) return []; + + const lands = landsReply.lands; + const analysis = this.analyzeLands(lands); + + return lands.map(land => { + const id = toNum(land.id); + if (!land.unlocked) { + const unlockCondition = land.unlock_condition || {}; + return { + id, + type: 'locked', + couldUnlock: !!land.could_unlock, + unlockCondition: { + needLevel: toNum(unlockCondition.need_level || 0), + needGold: toNum(unlockCondition.need_gold || 0), + } + }; + } + + const plant = land.plant; + if (!plant) { + const pendingUntil = this.pendingPlantUntil.get(id) || 0; + if (pendingUntil > Date.now()) { + return { + id, + type: 'planted', + status: 'growing', + plantId: 0, + plantName: '', + phase: 0, + phaseName: PHASE_NAMES[0], + fertilized: false, + needs: { water: false, weed: false, bug: false } + }; + } + return { id, type: 'empty' }; + } + if (!plant.phases || plant.phases.length === 0) { + const plantId = toNum(plant.id); + const plantName = plant.name || getPlantName(plantId); + if (plantId > 0 || plantName) { + return { + id, + type: 'planted', + status: 'growing', + plantId, + plantName, + phase: 0, + phaseName: PHASE_NAMES[0], + fertilized: false, + needs: { water: false, weed: false, bug: false } + }; + } + const pendingUntil = this.pendingPlantUntil.get(id) || 0; + if (pendingUntil > Date.now()) { + return { + id, + type: 'planted', + status: 'growing', + plantId: 0, + plantName: '', + phase: 0, + phaseName: PHASE_NAMES[0], + fertilized: false, + needs: { water: false, weed: false, bug: false } + }; + } + return { id, type: 'empty' }; + } + + const currentPhase = this.getCurrentPhase(plant.phases, false); + const phaseVal = currentPhase ? currentPhase.phase : 0; + const serverFertsUsed = currentPhase && currentPhase.ferts_used && Object.keys(currentPhase.ferts_used).length > 0; + const pendingFert = (this.pendingFertilizeUntil.get(id) || 0) > Date.now(); + const fertilized = !!(serverFertsUsed || pendingFert); + + let status = 'growing'; + if (phaseVal === PlantPhase.DEAD) status = 'dead'; + else if (phaseVal === PlantPhase.MATURE) status = 'mature'; + + const phaseName = PHASE_NAMES[phaseVal] || PHASE_NAMES[0]; + return { + id, + type: 'planted', + status, + plantId: toNum(plant.id), + plantName: getPlantName(toNum(plant.id)), + phase: phaseVal, + phaseName, + fertilized, + needs: { + water: analysis.needWater.includes(id), + weed: analysis.needWeed.includes(id), + bug: analysis.needBug.includes(id) + } + }; + }); + } catch (e) { + this.bot.logWarn('API', `Failed to get lands: ${e.message}`); + return []; + } + } + + async check() { + if (this.isCheckingFarm || !this.bot.user.gid) return; + this.isCheckingFarm = true; + + try { + const now = Date.now(); + const canUseTask = now - this.lastTaskActionAt >= 12000; + let tasks = []; + let buyTask = null; + let plantTask = null; + let harvestTask = null; + + if (canUseTask) { + try { + const taskInfo = await this.getTaskInfoCached(); + tasks = this.buildTaskList(taskInfo); + buyTask = this.pickTaskByType(tasks, 'buySeed'); + plantTask = this.pickTaskByType(tasks, 'plantSeed'); + harvestTask = this.pickTaskByType(tasks, 'harvest'); + } catch (e) { } + } + + if (canUseTask && buyTask && !this.taskExecuting) { + this.taskExecuting = true; + let bought = false; + try { + bought = await this.executeBuySeedTask(buyTask); + } finally { + this.taskExecuting = false; + } + if (bought) { + this.lastTaskActionAt = Date.now(); + return; + } + } + + const landsReply = await this.getAllLands(); + if (!landsReply.lands || landsReply.lands.length === 0) { + return; + } + + const lands = landsReply.lands; + const status = this.analyzeLands(lands); + const unlockedLandCount = lands.filter(land => land && land.unlocked).length; + this.isFirstFarmCheck = false; + + if (canUseTask && harvestTask) { + const plant = getPlantByName(harvestTask.name); + if (plant) { + const targetIds = status.harvestableInfo + .filter(info => info.plantId === plant.id) + .map(info => info.landId); + if (targetIds.length > 0) { + try { + await this.harvest(targetIds); + this.bot.log('任务', `收获 ${harvestTask.name} ${targetIds.length} 块`); + this.lastTaskActionAt = Date.now(); + return; + } catch (e) { + this.bot.logWarn('任务', `收获失败: ${e.message}`); + } + } + } + } + + const statusParts = []; + if (status.harvestable.length) statusParts.push(`待收获 ${status.harvestable.length} 块`); + if (status.needWeed.length) statusParts.push(`需除草 ${status.needWeed.length} 块`); + if (status.needBug.length) statusParts.push(`需除虫 ${status.needBug.length} 块`); + if (status.needWater.length) statusParts.push(`需浇水 ${status.needWater.length} 块`); + if (status.dead.length) statusParts.push(`枯萎 ${status.dead.length} 块`); + if (status.empty.length) statusParts.push(`空闲 ${status.empty.length} 块`); + if (status.growing.length) statusParts.push(`生长中 ${status.growing.length} 块`); + + const hasWork = status.harvestable.length || status.needWeed.length || status.needBug.length + || status.needWater.length || status.dead.length || status.empty.length; + + const actions = []; + const batchOps = []; + + if (status.needWeed.length > 0) { + batchOps.push(this.weedOut(status.needWeed).then(() => actions.push(`除草 ${status.needWeed.length} 块`)).catch(e => this.bot.logWarn('除草', e.message))); + } + if (status.needBug.length > 0) { + batchOps.push(this.insecticide(status.needBug).then(() => actions.push(`除虫 ${status.needBug.length} 块`)).catch(e => this.bot.logWarn('除虫', e.message))); + } + if (status.needWater.length > 0) { + batchOps.push(this.waterLand(status.needWater).then(() => actions.push(`浇水 ${status.needWater.length} 块`)).catch(e => this.bot.logWarn('浇水', e.message))); + } + if (batchOps.length > 0) await Promise.all(batchOps); + + let harvestedLandIds = []; + if (status.harvestable.length > 0) { + try { + await this.harvest(status.harvestable); + actions.push(`收获 ${status.harvestable.length} 块`); + harvestedLandIds = [...status.harvestable]; + } catch (e) { this.bot.logWarn('收获', e.message); } + } + + const allDeadLands = [...status.dead]; + const allEmptyLands = [...status.empty, ...harvestedLandIds]; + if (canUseTask && plantTask && this.bot.config.idleStrategy === 'task') { + const seedId = getSeedIdByPlantName(plantTask.name); + if (seedId && allEmptyLands.length > 0) { + try { + const planted = await this.autoPlantEmptyLands([], allEmptyLands, unlockedLandCount, seedId, plantTask.remaining || plantTask.count); + if (planted > 0) { + this.bot.log('任务', `种植 ${plantTask.name} ${planted} 块`); + this.lastTaskActionAt = Date.now(); + return; + } + } catch (e) { + this.bot.logWarn('任务', `种植失败: ${e.message}`); + } + } + } + if (canUseTask && plantTask && this.bot.config.idleStrategy !== 'task') { + const seedId = getSeedIdByPlantName(plantTask.name); + if (seedId && (allDeadLands.length > 0 || allEmptyLands.length > 0)) { + try { + const planted = await this.autoPlantEmptyLands(allDeadLands, allEmptyLands, unlockedLandCount, seedId, plantTask.remaining || plantTask.count); + if (planted > 0) { + this.bot.log('任务', `种植 ${plantTask.name} ${planted} 块`); + this.lastTaskActionAt = Date.now(); + return; + } + } catch (e) { + this.bot.logWarn('任务', `种植失败: ${e.message}`); + } + } + } + if (allDeadLands.length > 0 || allEmptyLands.length > 0) { + try { + await this.autoPlantEmptyLands(allDeadLands, allEmptyLands, unlockedLandCount); + actions.push(`种植 ${allDeadLands.length + allEmptyLands.length} 块`); + } catch (e) { this.bot.logWarn('种植', e.message); } + } + + if(hasWork) { + this.bot.log('农场', `土地状态: ${statusParts.join(',')}${actions.length > 0 ? '。正在执行: ' + actions.join(',') : ''}`); + } + } catch (err) { + this.bot.logWarn('巡田', `检查失败: ${err.message}`); + } finally { + this.isCheckingFarm = false; + } + } + + async loop() { + while (this.farmLoopRunning) { + await this.check(); + if (!this.farmLoopRunning) break; + await sleep(this.bot.config.farmCheckInterval); + } + } + + startLoop() { + if (this.farmLoopRunning) return; + this.farmLoopRunning = true; + this.farmCheckTimer = setTimeout(() => this.loop(), 2000); + } + + stopLoop() { + this.farmLoopRunning = false; + if (this.farmCheckTimer) { clearTimeout(this.farmCheckTimer); this.farmCheckTimer = null; } + } + + lastPushTime = 0; + onLandsChangedPush(lands) { + if (this.isCheckingFarm) return; + const now = Date.now(); + if (now - this.lastPushTime < 500) return; + + this.lastPushTime = now; + this.bot.log('农场', `收到推送: ${lands.length}块土地变化,检查中...`); + + setTimeout(async () => { + if (!this.isCheckingFarm) { + await this.check(); + } + }, 100); + } +} + +module.exports = { FarmManager }; diff --git a/211/server/src/core/FriendManager.js b/211/server/src/core/FriendManager.js new file mode 100644 index 0000000..5bf3cdf --- /dev/null +++ b/211/server/src/core/FriendManager.js @@ -0,0 +1,497 @@ +const { PlantPhase } = require('../config'); +const { types } = require('../proto'); +const { toLong, toNum, sleep, getServerTimeSec, toTimeSec } = require('../utils'); +const { getPlantName } = require('../gameConfig'); + +const OP_NAMES = { + 10001: '收获', 10002: '铲除', 10003: '放草', 10004: '放虫', + 10005: '除草', 10006: '除虫', 10007: '浇水', 10008: '偷菜', +}; + +class FriendManager { + constructor(bot) { + this.bot = bot; + + // Internal state + this.isCheckingFriends = false; + this.isFirstFriendCheck = true; + this.friendCheckTimer = null; + this.friendLoopRunning = false; + this.lastResetDate = ''; + this.operationLimits = new Map(); + + // Listen for events + this.bot.on('operationLimits', this.updateOperationLimits.bind(this)); + this.bot.on('friendApplicationReceived', this.onFriendApplicationReceived.bind(this)); + } + + // ============ Helper Methods ============ + + checkDailyReset() { + const today = new Date().toISOString().slice(0, 10); + if (this.lastResetDate !== today) { + if (this.lastResetDate !== '') { + this.bot.log('系统', '跨日重置,已清空操作限制缓存'); + } + this.operationLimits.clear(); + this.lastResetDate = today; + } + } + + updateOperationLimits(limits) { + if (!limits || limits.length === 0) return; + this.checkDailyReset(); + for (const limit of limits) { + const id = toNum(limit.id); + if (id > 0) { + this.operationLimits.set(id, { + dayTimes: toNum(limit.day_times), + dayTimesLimit: toNum(limit.day_times_lt), + dayExpTimes: toNum(limit.day_exp_times), + dayExpTimesLimit: toNum(limit.day_ex_times_lt), + }); + } + } + } + + canGetExp(opId) { + const limit = this.operationLimits.get(opId); + if (!limit) return false; + if (limit.dayExpTimesLimit <= 0) return true; + return limit.dayExpTimes < limit.dayExpTimesLimit; + } + + canOperate(opId) { + const limit = this.operationLimits.get(opId); + if (!limit) return true; + if (limit.dayTimesLimit <= 0) return true; + return limit.dayTimes < limit.dayTimesLimit; + } + + getRemainingTimes(opId) { + const limit = this.operationLimits.get(opId); + if (!limit || limit.dayTimesLimit <= 0) return 999; + return Math.max(0, limit.dayTimesLimit - limit.dayTimes); + } + + // ============ Friend API ============ + + async getAllFriends() { + const body = types.GetAllFriendsRequest.encode(types.GetAllFriendsRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.friendpb.FriendService', 'GetAll', body); + return types.GetAllFriendsReply.decode(replyBody); + } + + async getApplications() { + const body = types.GetApplicationsRequest.encode(types.GetApplicationsRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.friendpb.FriendService', 'GetApplications', body); + return types.GetApplicationsReply.decode(replyBody); + } + + async acceptFriends(gids) { + const body = types.AcceptFriendsRequest.encode(types.AcceptFriendsRequest.create({ + friend_gids: gids.map(g => toLong(g)), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.friendpb.FriendService', 'AcceptFriends', body); + return types.AcceptFriendsReply.decode(replyBody); + } + + async enterFriendFarm(friendGid) { + const body = types.VisitEnterRequest.encode(types.VisitEnterRequest.create({ + host_gid: toLong(friendGid), + reason: 2, + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.visitpb.VisitService', 'Enter', body); + return types.VisitEnterReply.decode(replyBody); + } + + async leaveFriendFarm(friendGid) { + const body = types.VisitLeaveRequest.encode(types.VisitLeaveRequest.create({ + host_gid: toLong(friendGid), + })).finish(); + try { + await this.bot.network.sendMsgAsync('gamepb.visitpb.VisitService', 'Leave', body); + } catch (e) { } + } + + async helpWater(friendGid, landIds) { + const body = types.WaterLandRequest.encode(types.WaterLandRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'WaterLand', body); + const reply = types.WaterLandReply.decode(replyBody); + this.updateOperationLimits(reply.operation_limits); + return reply; + } + + async helpWeed(friendGid, landIds) { + const body = types.WeedOutRequest.encode(types.WeedOutRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'WeedOut', body); + const reply = types.WeedOutReply.decode(replyBody); + this.updateOperationLimits(reply.operation_limits); + return reply; + } + + async helpInsecticide(friendGid, landIds) { + const body = types.InsecticideRequest.encode(types.InsecticideRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'Insecticide', body); + const reply = types.InsecticideReply.decode(replyBody); + this.updateOperationLimits(reply.operation_limits); + return reply; + } + + async stealHarvest(friendGid, landIds) { + const body = types.HarvestRequest.encode(types.HarvestRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + is_all: true, + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'Harvest', body); + const reply = types.HarvestReply.decode(replyBody); + this.updateOperationLimits(reply.operation_limits); + return reply; + } + + async putInsects(friendGid, landIds) { + const body = types.PutInsectsRequest.encode(types.PutInsectsRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'PutInsects', body); + const reply = types.PutInsectsReply.decode(replyBody); + this.updateOperationLimits(reply.operation_limits); + return reply; + } + + async putWeeds(friendGid, landIds) { + const body = types.PutWeedsRequest.encode(types.PutWeedsRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.plantpb.PlantService', 'PutWeeds', body); + const reply = types.PutWeedsReply.decode(replyBody); + this.updateOperationLimits(reply.operation_limits); + return reply; + } + + // ============ Logic ============ + + getCurrentPhase(phases) { + if (!phases || phases.length === 0) return null; + const nowSec = getServerTimeSec(); + for (let i = phases.length - 1; i >= 0; i--) { + const beginTime = toTimeSec(phases[i].begin_time); + if (beginTime > 0 && beginTime <= nowSec) { + return phases[i]; + } + } + return phases[0]; + } + + analyzeFriendLands(lands, myGid) { + const result = { + stealable: [], stealableInfo: [], + needWater: [], needWeed: [], needBug: [], + canPutWeed: [], canPutBug: [], + }; + + const nowSec = getServerTimeSec(); + + for (const land of lands) { + const id = toNum(land.id); + const plant = land.plant; + + if (!plant || !plant.phases || plant.phases.length === 0) continue; + + const currentPhase = this.getCurrentPhase(plant.phases); + if (!currentPhase) continue; + const phaseVal = currentPhase.phase; + + if (phaseVal === PlantPhase.MATURE) { + if (plant.stealable) { + result.stealable.push(id); + const plantId = toNum(plant.id); + const plantName = getPlantName(plantId) || plant.name || '未知'; + result.stealableInfo.push({ landId: id, plantId, name: plantName }); + } + continue; + } + + if (phaseVal === PlantPhase.DEAD) continue; + + const dryNum = toNum(plant.dry_num); + const dryTime = toTimeSec(currentPhase.dry_time); + if (dryNum > 0 || (dryTime > 0 && dryTime <= nowSec)) result.needWater.push(id); + + const weedsTime = toTimeSec(currentPhase.weeds_time); + const hasWeeds = (plant.weed_owners && plant.weed_owners.length > 0) || (weedsTime > 0 && weedsTime <= nowSec); + if (hasWeeds) result.needWeed.push(id); + + const insectTime = toTimeSec(currentPhase.insect_time); + const hasBugs = (plant.insect_owners && plant.insect_owners.length > 0) || (insectTime > 0 && insectTime <= nowSec); + if (hasBugs) result.needBug.push(id); + + const weedOwners = plant.weed_owners || []; + const insectOwners = plant.insect_owners || []; + const iAlreadyPutWeed = weedOwners.some(gid => toNum(gid) === myGid); + const iAlreadyPutBug = insectOwners.some(gid => toNum(gid) === myGid); + + if (weedOwners.length < 2 && !iAlreadyPutWeed) result.canPutWeed.push(id); + if (insectOwners.length < 2 && !iAlreadyPutBug) result.canPutBug.push(id); + } + return result; + } + + async visitFriend(friend, totalActions, myGid) { + const { gid, name } = friend; + + let enterReply; + try { + enterReply = await this.enterFriendFarm(gid); + } catch (e) { + this.bot.logWarn('好友', `进入 ${name} 农场失败: ${e.message}`); + return; + } + + const lands = enterReply.lands || []; + if (lands.length === 0) { + await this.leaveFriendFarm(gid); + return; + } + + const status = this.analyzeFriendLands(lands, myGid); + const actions = []; + const HELP_ONLY_WITH_EXP = true; + // Note: Logic copied from original friend.js + + if (status.needWeed.length > 0) { + const shouldHelp = !HELP_ONLY_WITH_EXP || this.canGetExp(10005); + if (shouldHelp) { + let ok = 0; + for (const landId of status.needWeed) { + try { await this.helpWeed(gid, [landId]); ok++; } catch (e) { } + await sleep(100); + } + if (ok > 0) { actions.push(`除草 ${ok} 块`); totalActions.weed += ok; } + } + } + + if (status.needBug.length > 0) { + const shouldHelp = !HELP_ONLY_WITH_EXP || this.canGetExp(10006); + if (shouldHelp) { + let ok = 0; + for (const landId of status.needBug) { + try { await this.helpInsecticide(gid, [landId]); ok++; } catch (e) { } + await sleep(100); + } + if (ok > 0) { actions.push(`除虫 ${ok} 块`); totalActions.bug += ok; } + } + } + + if (status.needWater.length > 0) { + const shouldHelp = !HELP_ONLY_WITH_EXP || this.canGetExp(10007); + if (shouldHelp) { + let ok = 0; + for (const landId of status.needWater) { + try { await this.helpWater(gid, [landId]); ok++; } catch (e) { } + await sleep(100); + } + if (ok > 0) { actions.push(`浇水 ${ok} 块`); totalActions.water += ok; } + } + } + + const canSteal = !(this.bot.config && this.bot.config.enableSteal === false); + if (canSteal && status.stealable.length > 0) { + let ok = 0; + const stolenPlants = []; + for (let i = 0; i < status.stealable.length; i++) { + const landId = status.stealable[i]; + try { + await this.stealHarvest(gid, [landId]); + ok++; + if (status.stealableInfo[i]) { + stolenPlants.push(status.stealableInfo[i].name); + } + } catch (e) { } + await sleep(100); + } + if (ok > 0) { + const plantNames = [...new Set(stolenPlants)].join('、'); + actions.push(`偷取 ${ok} 块${plantNames ? ' (' + plantNames + ')' : ''}`); + totalActions.steal += ok; + this.bot.emit('stealRecord', { name, count: ok }); + } + } + + const ENABLE_PUT_BAD_THINGS = false; // Copied from original + + if (ENABLE_PUT_BAD_THINGS && status.canPutBug.length > 0 && this.canOperate(10004)) { + let ok = 0; + const remaining = this.getRemainingTimes(10004); + const toProcess = status.canPutBug.slice(0, remaining); + for (const landId of toProcess) { + if (!this.canOperate(10004)) break; + try { await this.putInsects(gid, [landId]); ok++; } catch (e) { } + await sleep(100); + } + if (ok > 0) { actions.push(`放虫 ${ok} 块`); totalActions.putBug += ok; } + } + + if (ENABLE_PUT_BAD_THINGS && status.canPutWeed.length > 0 && this.canOperate(10003)) { + let ok = 0; + const remaining = this.getRemainingTimes(10003); + const toProcess = status.canPutWeed.slice(0, remaining); + for (const landId of toProcess) { + if (!this.canOperate(10003)) break; + try { await this.putWeeds(gid, [landId]); ok++; } catch (e) { } + await sleep(100); + } + if (ok > 0) { actions.push(`放草 ${ok} 块`); totalActions.putWeed += ok; } + } + + if (actions.length > 0) { + this.bot.log('好友', `[${name}] 执行: ${actions.join(',')}`); + } + + await this.leaveFriendFarm(gid); + } + + async check() { + if (this.isCheckingFriends || !this.bot.user.gid) return; + if (this.bot.config && this.bot.config.enableFriendOps === false) return; + this.isCheckingFriends = true; + this.checkDailyReset(); + + try { + const friendsReply = await this.getAllFriends(); + const friends = friendsReply.game_friends || []; + if (friends.length === 0) { this.bot.log('好友', '没有好友'); return; } + + const canPutBugOrWeed = this.canOperate(10004) || this.canOperate(10003); + const ENABLE_PUT_BAD_THINGS = false; + + const priorityFriends = []; + const otherFriends = []; + const visitedGids = new Set(); + + for (const f of friends) { + const gid = toNum(f.gid); + if (gid === this.bot.user.gid) continue; + if (visitedGids.has(gid)) continue; + const name = f.remark || f.name || `GID:${gid}`; + const p = f.plant; + + const stealNum = p ? toNum(p.steal_plant_num) : 0; + const dryNum = p ? toNum(p.dry_num) : 0; + const weedNum = p ? toNum(p.weed_num) : 0; + const insectNum = p ? toNum(p.insect_num) : 0; + + if (stealNum > 0 || dryNum > 0 || weedNum > 0 || insectNum > 0) { + priorityFriends.push({ gid, name }); + visitedGids.add(gid); + } else if (ENABLE_PUT_BAD_THINGS && canPutBugOrWeed) { + otherFriends.push({ gid, name }); + visitedGids.add(gid); + } + } + + const friendsToVisit = [...priorityFriends, ...otherFriends]; + if (friendsToVisit.length === 0) return; + + let totalActions = { steal: 0, water: 0, weed: 0, bug: 0, putBug: 0, putWeed: 0 }; + for (const friend of friendsToVisit) { + try { + await this.visitFriend(friend, totalActions, this.bot.user.gid); + } catch (e) { } + await sleep(500); + } + + const summary = []; + if (totalActions.steal > 0) summary.push(`偷取 ${totalActions.steal} 块`); + if (totalActions.weed > 0) summary.push(`除草 ${totalActions.weed} 块`); + if (totalActions.bug > 0) summary.push(`除虫 ${totalActions.bug} 块`); + if (totalActions.water > 0) summary.push(`浇水 ${totalActions.water} 块`); + if (totalActions.putBug > 0) summary.push(`放虫 ${totalActions.putBug} 块`); + if (totalActions.putWeed > 0) summary.push(`放草 ${totalActions.putWeed} 块`); + + if (summary.length > 0) { + this.bot.log('好友', `已巡查 ${friendsToVisit.length} 位好友。总计: ${summary.join(',')}`); + } + this.isFirstFriendCheck = false; + } catch (err) { + this.bot.logWarn('好友', `巡查失败: ${err.message}`); + } finally { + this.isCheckingFriends = false; + } + } + + async loop() { + while (this.friendLoopRunning) { + await this.check(); + if (!this.friendLoopRunning) break; + await sleep(this.bot.config.friendCheckInterval); + } + } + + startLoop() { + if (this.friendLoopRunning) return; + if (this.bot.config && this.bot.config.enableFriendOps === false) return; + this.friendLoopRunning = true; + + this.friendCheckTimer = setTimeout(() => this.loop(), 5000); + setTimeout(() => this.checkAndAcceptApplications(), 3000); + } + + stopLoop() { + this.friendLoopRunning = false; + if (this.friendCheckTimer) { clearTimeout(this.friendCheckTimer); this.friendCheckTimer = null; } + } + + // ============ Applications ============ + + onFriendApplicationReceived(applications) { + if (this.bot.config && this.bot.config.enableFriendOps === false) return; + const names = applications.map(a => a.name || `GID:${toNum(a.gid)}`).join(', '); + this.bot.log('申请', `收到 ${applications.length} 个好友申请: ${names}`); + const gids = applications.map(a => toNum(a.gid)); + this.acceptFriendsWithRetry(gids); + } + + async checkAndAcceptApplications() { + if (this.bot.config && this.bot.config.enableFriendOps === false) return; + try { + const reply = await this.getApplications(); + const applications = reply.applications || []; + if (applications.length === 0) return; + + const names = applications.map(a => a.name || `GID:${toNum(a.gid)}`).join(', '); + this.bot.log('申请', `发现 ${applications.length} 个待处理申请: ${names}`); + + const gids = applications.map(a => toNum(a.gid)); + await this.acceptFriendsWithRetry(gids); + } catch (e) { } + } + + async acceptFriendsWithRetry(gids) { + if (gids.length === 0) return; + try { + const reply = await this.acceptFriends(gids); + const friends = reply.friends || []; + if (friends.length > 0) { + const names = friends.map(f => f.name || f.remark || `GID:${toNum(f.gid)}`).join(', '); + this.bot.log('申请', `已同意 ${friends.length} 人: ${names}`); + } + } catch (e) { + this.bot.logWarn('申请', `同意失败: ${e.message}`); + } + } +} + +module.exports = { FriendManager }; diff --git a/211/server/src/core/Network.js b/211/server/src/core/Network.js new file mode 100644 index 0000000..1a27398 --- /dev/null +++ b/211/server/src/core/Network.js @@ -0,0 +1,541 @@ +const WebSocket = require('ws'); +const EventEmitter = require('events'); +const protobuf = require('protobufjs'); +const { types } = require('../proto'); +const { toLong, toNum, log, logWarn, syncServerTime } = require('../utils'); + +function calcNormalFertilizerHours(containerCount) { + const containerNum = Number(containerCount) || 0; + return containerNum >= 3600 ? containerNum / 3600 : containerNum; +} + +function calcOrganicFertilizerHours(containerCount) { + const containerNum = Number(containerCount) || 0; + return containerNum >= 3600 ? containerNum / 3600 : containerNum; +} + +class NetworkClient extends EventEmitter { + constructor(bot) { + super(); + this.bot = bot; + this.ws = null; + this.clientSeq = 1; + this.serverSeq = 0; + this.heartbeatTimer = null; + this.pendingCallbacks = new Map(); + this.connected = false; + this.shareClaiming = false; + this.lastShareClaimAt = 0; + + // Heartbeat state + this.lastHeartbeatResponse = 0; + this.heartbeatMissCount = 0; + } + + connect(callback) { + const code = encodeURIComponent(this.bot.config.code || ''); + const url = `${this.bot.config.serverUrl}?platform=${this.bot.config.platform}&os=${this.bot.config.os}&ver=${this.bot.config.clientVersion}&code=${code}&openID=`; + + this.bot.log('系统', `连接服务器... ${this.bot.config.platform}`); + + this.ws = new WebSocket(url, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13)', + 'Origin': 'https://gate-obt.nqf.qq.com', + }, + }); + + this.ws.binaryType = 'arraybuffer'; + + this.ws.on('open', () => { + this.bot.log('系统', 'WebSocket 连接成功'); + this.connected = true; + if (callback) callback(true); + }); + + this.ws.on('message', (data) => { + this.handleMessage(data); + }); + + this.ws.on('close', (code, reason) => { + this.bot.log('系统', `WebSocket 连接断开 (code=${code})`); + this.connected = false; + this.stopHeartbeat(); + this.cleanup(); + this.emit('disconnected'); + }); + + this.ws.on('error', (err) => { + this.bot.logWarn('系统', `WebSocket 错误: ${err.message}`); + this.emit('error', err); + }); + } + + cleanup() { + if (this.heartbeatTimer) { + clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + this.pendingCallbacks.clear(); + } + + disconnect() { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + this.cleanup(); + } + + startHeartbeat() { + if (this.heartbeatTimer) clearInterval(this.heartbeatTimer); + this.lastHeartbeatResponse = Date.now(); + this.heartbeatMissCount = 0; + + this.heartbeatTimer = setInterval(() => { + if (!this.bot.user.gid) return; + + const timeSinceLastResponse = Date.now() - this.lastHeartbeatResponse; + if (timeSinceLastResponse > 60000) { + this.heartbeatMissCount++; + this.bot.logWarn('心跳', `连接可能已断开 (${Math.round(timeSinceLastResponse/1000)}s 无响应)`); + if (this.heartbeatMissCount >= 2) { + this.bot.log('心跳', '尝试重连...'); + // Cleanup pending callbacks to avoid leaks + this.pendingCallbacks.forEach((cb, seq) => { + try { cb(new Error('连接超时,已清理')); } catch (e) {} + }); + this.pendingCallbacks.clear(); + // Optional: trigger reconnect logic here or let the user handle it + } + } + + const body = types.HeartbeatRequest.encode(types.HeartbeatRequest.create({ + gid: toLong(this.bot.user.gid), + client_version: this.bot.config.clientVersion, + })).finish(); + + this.sendMsg('gamepb.userpb.UserService', 'Heartbeat', body, (err, replyBody) => { + if (err || !replyBody) return; + this.lastHeartbeatResponse = Date.now(); + this.heartbeatMissCount = 0; + try { + const reply = types.HeartbeatReply.decode(replyBody); + if (reply.server_time) { + // We still use the global syncServerTime for now as it's just a time offset + syncServerTime(toNum(reply.server_time)); + } + } catch (e) { } + }); + + }, this.bot.config.heartbeatInterval); + } + + stopHeartbeat() { + if (this.heartbeatTimer) { + clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + } + + sendLogin(callback) { + const body = types.LoginRequest.encode(types.LoginRequest.create({ + sharer_id: toLong(0), + sharer_open_id: '', + device_info: { + client_version: this.bot.config.clientVersion, + sys_software: 'iOS 26.2.1', + network: 'wifi', + memory: '7672', + device_id: 'iPhone X', + }, + share_cfg_id: toLong(0), + scene_id: '1256', + report_data: { + callback: '', cd_extend_info: '', click_id: '', clue_token: '', + minigame_channel: 'other', minigame_platid: 2, req_id: '', trackid: '', + }, + })).finish(); + + this.sendMsg('gamepb.userpb.UserService', 'Login', body, (err, bodyBytes, meta) => { + if (err) { + this.bot.log('登录', `失败: ${err.message}`); + if (callback) callback(false); + return; + } + try { + const reply = types.LoginReply.decode(bodyBytes); + if (reply.basic) { + const basic = reply.basic; + this.bot.user.gid = toNum(basic.gid); + this.bot.user.name = basic.name || '未知'; + this.bot.user.level = toNum(basic.level); + this.bot.user.gold = toNum(basic.gold); + this.bot.user.exp = toNum(basic.exp); + this.bot.user.avatarUrl = basic.avatar_url; + + this.bot.log('系统', `登录成功: ${this.bot.user.name} (Lv${this.bot.user.level})`); + + if (reply.time_now_millis) { + syncServerTime(toNum(reply.time_now_millis)); + } + } + + this.startHeartbeat(); + this.bot.emit('loginSuccess', this.bot.user); + this.tryClaimShareReward(); + if (this.bot.warehouseManager) { + this.bot.warehouseManager.getBag().then((bagReply) => { + const items = this.bot.warehouseManager.getBagItems(bagReply); + let tickets = 0; + let fertilizerContainer = 0; + let organicFertilizerContainer = 0; + const fertilizerItems = { + 80001: 0, + 80002: 0, + 80003: 0, + 80004: 0, + }; + const organicFertilizerItems = { + 80011: 0, + 80012: 0, + 80013: 0, + 80014: 0, + }; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + if (id === 1002) tickets = count; + if (id === 1011) fertilizerContainer = count; + if (id === 1012) organicFertilizerContainer = count; + if (id === 80001) fertilizerItems[80001] = count; + if (id === 80002) fertilizerItems[80002] = count; + if (id === 80003) fertilizerItems[80003] = count; + if (id === 80004) fertilizerItems[80004] = count; + if (id === 80011) organicFertilizerItems[80011] = count; + if (id === 80012) organicFertilizerItems[80012] = count; + if (id === 80013) organicFertilizerItems[80013] = count; + if (id === 80014) organicFertilizerItems[80014] = count; + } + this.bot.user.tickets = tickets; + this.bot.user.fertilizerContainer = fertilizerContainer; + this.bot.user.fertilizerItems = fertilizerItems; + this.bot.user.fertilizerHours = calcNormalFertilizerHours(fertilizerContainer); + this.bot.user.organicFertilizerContainer = organicFertilizerContainer; + this.bot.user.organicFertilizerItems = organicFertilizerItems; + this.bot.user.organicFertilizerHours = calcOrganicFertilizerHours(organicFertilizerContainer); + this.bot.emit('userUpdate', this.bot.user); + }).catch(() => { }); + } + if (callback) callback(true); + } catch (e) { + this.bot.log('登录', `解码失败: ${e.message}`); + if (callback) callback(false); + } + }); + } + + async tryClaimShareReward(shareId = 1) { + if (this.shareClaiming) return; + const now = Date.now(); + if (now - this.lastShareClaimAt < 60000) return; + this.shareClaiming = true; + this.lastShareClaimAt = now; + try { + const canShare = await this.checkCanShareReward(); + if (!canShare) return; + await this.reportShare(shareId); + await this.claimShareReward(shareId); + this.bot.log('分享', '已领取分享奖励'); + } catch (e) { + const message = this.formatShareClaimError(e); + this.bot.logWarn('分享', message); + } finally { + this.shareClaiming = false; + } + } + + formatShareClaimError(error) { + const raw = error?.message ? String(error.message) : ''; + if (!raw) return '分享奖励领取失败'; + if (raw.includes('code=1009001') || raw.includes('已经领取')) { + return '分享奖励已领取,无需重复领取'; + } + return `领取失败: ${raw}`; + } + + decodeShareFlag(replyBody) { + if (!replyBody || replyBody.length === 0) return 0; + const reader = protobuf.Reader.create(replyBody); + let flag = 0; + while (reader.pos < reader.len) { + const tag = reader.uint32(); + const field = tag >>> 3; + if (field === 1) { + flag = Number(reader.int64()); + } else { + reader.skipType(tag & 7); + } + } + return flag; + } + + async checkCanShareReward() { + const { body: replyBody } = await this.sendMsgAsync('gamepb.sharepb.ShareService', 'CheckCanShare', Buffer.alloc(0)); + const flag = this.decodeShareFlag(replyBody); + return flag === 1; + } + + async reportShare(shareId) { + const writer = protobuf.Writer.create(); + writer.uint32(8).int64(toLong(shareId)); + const body = writer.finish(); + await this.sendMsgAsync('gamepb.sharepb.ShareService', 'ReportShare', body); + } + + async claimShareReward(shareId) { + const writer = protobuf.Writer.create(); + writer.uint32(8).int64(toLong(shareId)); + const body = writer.finish(); + await this.sendMsgAsync('gamepb.sharepb.ShareService', 'ClaimShareReward', body); + } + + encodeMsg(serviceName, methodName, bodyBytes) { + const msg = types.GateMessage.create({ + meta: { + service_name: serviceName, + method_name: methodName, + message_type: 1, + client_seq: toLong(this.clientSeq), + server_seq: toLong(this.serverSeq), + }, + body: bodyBytes || Buffer.alloc(0), + }); + const encoded = types.GateMessage.encode(msg).finish(); + this.clientSeq++; + return encoded; + } + + sendMsg(serviceName, methodName, bodyBytes, callback) { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + return false; + } + const seq = this.clientSeq; + const encoded = this.encodeMsg(serviceName, methodName, bodyBytes); + if (callback) this.pendingCallbacks.set(seq, callback); + this.ws.send(encoded); + return true; + } + + sendMsgAsync(serviceName, methodName, bodyBytes, timeout = 10000) { + return new Promise((resolve, reject) => { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { + reject(new Error(`连接未打开: ${methodName}`)); + return; + } + + const seq = this.clientSeq; + const timer = setTimeout(() => { + this.pendingCallbacks.delete(seq); + reject(new Error(`请求超时: ${methodName}`)); + }, timeout); + + const sent = this.sendMsg(serviceName, methodName, bodyBytes, (err, body, meta) => { + clearTimeout(timer); + if (err) reject(err); + else resolve({ body, meta }); + }); + + if (!sent) { + clearTimeout(timer); + reject(new Error(`发送失败: ${methodName}`)); + } + }); + } + + handleMessage(data) { + try { + const buf = Buffer.isBuffer(data) ? data : Buffer.from(data); + const msg = types.GateMessage.decode(buf); + const meta = msg.meta; + if (!meta) return; + + if (meta.server_seq) { + const seq = toNum(meta.server_seq); + if (seq > this.serverSeq) this.serverSeq = seq; + } + + const msgType = meta.message_type; + + // Notify + if (msgType === 3) { + this.handleNotify(msg); + return; + } + + // Response + if (msgType === 2) { + const errorCode = toNum(meta.error_code); + const clientSeqVal = toNum(meta.client_seq); + + const cb = this.pendingCallbacks.get(clientSeqVal); + if (cb) { + this.pendingCallbacks.delete(clientSeqVal); + if (errorCode !== 0) { + cb(new Error(`${meta.service_name}.${meta.method_name} 错误: code=${errorCode} ${meta.error_message || ''}`)); + } else { + cb(null, msg.body, meta); + } + return; + } + } + } catch (err) { + this.bot.logWarn('解码', err.message); + } + } + + handleNotify(msg) { + if (!msg.body || msg.body.length === 0) return; + try { + const event = types.EventMessage.decode(msg.body); + const type = event.message_type || ''; + const eventBody = event.body; + + if (type.includes('Kickout')) { + this.bot.logWarn('推送', `被踢下线! ${type}`); + this.bot.emit('kickout', type); + return; + } + + if (type.includes('LandsNotify')) { + const notify = types.LandsNotify.decode(eventBody); + const hostGid = toNum(notify.host_gid); + const lands = notify.lands || []; + if (lands.length > 0) { + if (hostGid === this.bot.user.gid || hostGid === 0) { + this.bot.emit('landsChanged', lands); + } + } + return; + } + + if (type.includes('BasicNotify')) { + try { + const notify = types.BasicNotify.decode(eventBody); + if (notify.basic) { + const oldLevel = this.bot.user.level; + this.bot.user.level = toNum(notify.basic.level) || this.bot.user.level; + this.bot.user.gold = toNum(notify.basic.gold) || this.bot.user.gold; + const exp = toNum(notify.basic.exp); + if (exp > 0) this.bot.user.exp = exp; + + if (this.bot.user.level !== oldLevel) { + this.bot.log('系统', `升级! Lv${oldLevel} → Lv${this.bot.user.level}`); + } + this.bot.emit('userUpdate', this.bot.user); + } + } catch (e) { } + return; + } + + if (type.includes('FriendApplicationReceivedNotify')) { + try { + const notify = types.FriendApplicationReceivedNotify.decode(eventBody); + const applications = notify.applications || []; + if (applications.length > 0) { + this.bot.emit('friendApplicationReceived', applications); + } + } catch (e) { } + return; + } + + if (type.includes('FriendAddedNotify')) { + try { + const notify = types.FriendAddedNotify.decode(eventBody); + const friends = notify.friends || []; + if (friends.length > 0) { + const names = friends.map(f => f.name || f.remark || `GID:${toNum(f.gid)}`).join(', '); + this.bot.log('好友', `新好友: ${names}`); + } + } catch (e) { } + return; + } + + if (type.includes('ItemNotify')) { + const notify = types.ItemNotify.decode(eventBody); + const items = notify.items || []; + for (const itemChg of items) { + if (!itemChg.item) continue; + const id = toNum(itemChg.item.id); + const count = toNum(itemChg.item.count); + const delta = toNum(itemChg.delta); + if (id === 1 || id === 1001) { + this.bot.user.gold = count; + if (delta !== 0) { + this.bot.log('物品', `金币 ${delta > 0 ? '+' : ''}${delta} (当前: ${count})`); + } + this.bot.emit('userUpdate', this.bot.user); + continue; + } + if (id === 1002) { + this.bot.user.tickets = count; + this.bot.emit('userUpdate', this.bot.user); + continue; + } + if (id === 1011) { + this.bot.user.fertilizerContainer = count; + this.bot.user.fertilizerHours = calcNormalFertilizerHours(this.bot.user.fertilizerContainer); + this.bot.emit('userUpdate', this.bot.user); + continue; + } + if (id === 1012) { + this.bot.user.organicFertilizerContainer = count; + this.bot.user.organicFertilizerHours = calcOrganicFertilizerHours(this.bot.user.organicFertilizerContainer); + this.bot.emit('userUpdate', this.bot.user); + continue; + } + if (id === 80001 || id === 80002 || id === 80003 || id === 80004) { + if (!this.bot.user.fertilizerItems) { + this.bot.user.fertilizerItems = { 80001: 0, 80002: 0, 80003: 0, 80004: 0 }; + } + this.bot.user.fertilizerItems[id] = count; + this.bot.user.fertilizerHours = calcNormalFertilizerHours(this.bot.user.fertilizerContainer); + this.bot.emit('userUpdate', this.bot.user); + } + if (id === 80011 || id === 80012 || id === 80013 || id === 80014) { + if (!this.bot.user.organicFertilizerItems) { + this.bot.user.organicFertilizerItems = { 80011: 0, 80012: 0, 80013: 0, 80014: 0 }; + } + this.bot.user.organicFertilizerItems[id] = count; + this.bot.user.organicFertilizerHours = calcOrganicFertilizerHours(this.bot.user.organicFertilizerContainer); + this.bot.emit('userUpdate', this.bot.user); + } + } + return; + } + + if (type.includes('GoodsUnlockNotify')) { + try { + const notify = types.GoodsUnlockNotify.decode(eventBody); + const goods = notify.goods_list || []; + if (goods.length > 0) { + this.bot.log('商店', `解锁 ${goods.length} 个新商品!`); + } + } catch (e) { } + return; + } + + if (type.includes('TaskInfoNotify')) { + try { + const notify = types.TaskInfoNotify.decode(eventBody); + if (notify.task_info) { + this.bot.emit('taskInfoNotify', notify.task_info); + } + } catch (e) { } + return; + } + } catch (e) { } + } +} + +module.exports = { NetworkClient }; diff --git a/211/server/src/core/ShopManager.js b/211/server/src/core/ShopManager.js new file mode 100644 index 0000000..dfb2243 --- /dev/null +++ b/211/server/src/core/ShopManager.js @@ -0,0 +1,80 @@ +const protobuf = require('protobufjs'); +const { types } = require('../proto'); +const { toLong, toNum, log } = require('../utils'); +const { getPlantNameBySeedId, getItemName } = require('../gameConfig'); + +class ShopManager { + constructor(bot) { + this.bot = bot; + } + + async getShopProfiles() { + const body = types.ShopProfilesRequest.encode(types.ShopProfilesRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.shoppb.ShopService', 'ShopProfiles', body); + return types.ShopProfilesReply.decode(replyBody); + } + + async getShopInfo(shopId) { + const body = types.ShopInfoRequest.encode(types.ShopInfoRequest.create({ + shop_id: toLong(shopId) + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.shoppb.ShopService', 'ShopInfo', body); + return types.ShopInfoReply.decode(replyBody); + } + + async buyGoods(goodsId, count, price) { + const body = types.BuyGoodsRequest.encode(types.BuyGoodsRequest.create({ + goods_id: toLong(goodsId), + num: toLong(count), + price: toLong(price) + })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.shoppb.ShopService', 'BuyGoods', body); + return types.BuyGoodsReply.decode(replyBody); + } + + buildMallPurchaseBody(itemId, count) { + const writer = protobuf.Writer.create(); + writer.uint32(8).int64(toLong(itemId)); + writer.uint32(16).int64(toLong(count)); + return writer.finish(); + } + + async purchaseMallItem(itemId, count) { + const body = this.buildMallPurchaseBody(itemId, count); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.mallpb.MallService', 'Purchase', body); + return replyBody; + } + + async getSeedShopList() { + // 1. 获取商店列表,找到种子商店 (type=2) + const profilesReply = await this.getShopProfiles(); + const profiles = profilesReply.shop_profiles || []; + const seedShop = profiles.find(p => p.shop_type === 2); // 2 usually means Seed Shop + + if (!seedShop) { + throw new Error('未找到种子商店'); + } + + // 2. 获取商品列表 + const infoReply = await this.getShopInfo(seedShop.shop_id); + const goodsList = infoReply.goods_list || []; + + // 3. 格式化数据 + return goodsList.map(g => { + const itemId = toNum(g.item_id); + const name = getPlantNameBySeedId(itemId) || getItemName(itemId) || `商品${g.id}`; + return { + goodsId: toNum(g.id), + itemId: itemId, + name: name, + price: toNum(g.price), + limitCount: toNum(g.limit_count), + boughtNum: toNum(g.bought_num), + unlocked: g.unlocked, + itemCount: toNum(g.item_count) + }; + }); + } +} + +module.exports = { ShopManager }; diff --git a/211/server/src/core/WarehouseManager.js b/211/server/src/core/WarehouseManager.js new file mode 100644 index 0000000..c4e1461 --- /dev/null +++ b/211/server/src/core/WarehouseManager.js @@ -0,0 +1,322 @@ +const protobuf = require('protobufjs'); +const { types } = require('../proto'); +const { toLong, toNum, log, logWarn, emitRuntimeHint } = require('../utils'); +const { getFruitName, getPlantNameBySeedId, getItemNameById } = require('../gameConfig'); +const seedShopData = require('../../tools/seed-shop-merged-export.json'); + +// 游戏内金币和点券的物品 ID (GlobalData.GodItemId / DiamondItemId) +const GOLD_ITEM_ID = 1001; +const FRUIT_ID_SET = new Set( + ((seedShopData && seedShopData.rows) || []) + .map(row => Number(row.fruitId)) + .filter(Number.isFinite) +); + +class WarehouseManager { + constructor(bot) { + this.bot = bot; + this.sellTimer = null; + this.sellInterval = 60000; + } + + isFruitIdBySeedData(id) { + return FRUIT_ID_SET.has(toNum(id)); + } + + /** + * 从 SellReply 中提取获得的金币数量 + * 新版 SellReply 返回 get_items (repeated Item),其中 id=1001 为金币 + */ + extractGold(sellReply) { + if (sellReply.get_items && sellReply.get_items.length > 0) { + for (const item of sellReply.get_items) { + const id = toNum(item.id); + if (id === GOLD_ITEM_ID) { + return toNum(item.count); + } + } + return 0; + } + if (sellReply.gold !== undefined && sellReply.gold !== null) { + return toNum(sellReply.gold); + } + return 0; + } + + async getBag() { + const body = types.BagRequest.encode(types.BagRequest.create({})).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.itempb.ItemService', 'Bag', body); + return types.BagReply.decode(replyBody); + } + + /** + * 将 item 转为 Sell 请求所需格式(id/count/uid 保留 Long 或转成 Long,与游戏一致) + */ + toSellItem(item) { + const id = item.id != null ? toLong(item.id) : undefined; + const count = item.count != null ? toLong(item.count) : undefined; + const uid = item.uid != null ? toLong(item.uid) : undefined; + return { id, count, uid }; + } + + async sellItems(items) { + const payload = items.map(this.toSellItem); + const body = types.SellRequest.encode(types.SellRequest.create({ items: payload })).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.itempb.ItemService', 'Sell', body); + return types.SellReply.decode(replyBody); + } + + /** + * 从 BagReply 取出物品列表(兼容 item_bag 与旧版 items) + */ + getBagItems(bagReply) { + if (bagReply.item_bag && bagReply.item_bag.items && bagReply.item_bag.items.length) + return bagReply.item_bag.items; + return bagReply.items || []; + } + + /** + * 获取格式化的背包数据,用于前端显示 + */ + async getFormattedBag() { + const bagReply = await this.getBag(); + const items = this.getBagItems(bagReply); + + const seeds = []; + const produce = []; + const others = []; + + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + const uid = item.uid ? toNum(item.uid) : 0; + + // Basic item object + const itemObj = { + id, + uid, + count, + name: `物品 ${id}`, + type: 'other' + }; + + if (this.isFruitIdBySeedData(id) || id === 40416) { + itemObj.name = getFruitName(id); + itemObj.type = 'produce'; + produce.push(itemObj); + } else { + // 尝试识别为种子 + const plantName = getPlantNameBySeedId(id); + if (plantName && plantName !== `种子${id}`) { + itemObj.name = plantName + '种子'; + itemObj.type = 'seed'; + seeds.push(itemObj); + } else { + // 过滤掉货币类物品和特殊物品 + // 1001:金币, 1002:点券, 1101:种植经验, 3001:普通收藏点, 1011/1012:化肥容器 + if ([1001, 1002, 1101, 3001, 1011, 1012].includes(id)) { + continue; + } + + // 其他物品 + itemObj.name = getItemNameById(id); + others.push(itemObj); + } + } + } + + return { seeds, produce, others }; + } + + async sellAllFruits() { + if (!this.bot.network.connected) return; + + try { + const bagReply = await this.getBag(); + const items = this.getBagItems(bagReply); + + const toSell = []; + const names = []; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + const uid = item.uid ? toNum(item.uid) : 0; + if (this.isFruitIdBySeedData(id) && count > 0) { + if (uid === 0) continue; // 跳过无效格子 + toSell.push(item); + names.push(`${getFruitName(id)} ${count} 个`); + } + } + + if (toSell.length === 0) return; + + const reply = await this.sellItems(toSell); + const totalGold = this.extractGold(reply); + log('仓库', `成功出售: ${names.join(',')}。共获得 ${totalGold} 金币`); + emitRuntimeHint(false); + } catch (e) { + logWarn('仓库', `物品出售失败: ${e.message}`); + } + } + + async useItems(items) { + if (!items || items.length === 0) return { success: true, message: '没有选择物品' }; + + const results = []; + const fertilizers = new Set([80001, 80002, 80003, 80004, 80011, 80012, 80013, 80014]); + const formatGains = (replyItems, excludeId) => { + if (!replyItems || replyItems.length === 0) return ''; + const parts = []; + for (const replyItem of replyItems) { + const gainId = toNum(replyItem.id); + const gainCount = toNum(replyItem.count); + if (excludeId && gainId === excludeId) continue; + if (!gainId || !gainCount) continue; + parts.push(`${getItemNameById(gainId)} x${gainCount}`); + } + return parts.join(','); + }; + const buildGainList = (replyItems, excludeId) => { + if (!replyItems || replyItems.length === 0) return []; + const gains = []; + for (const replyItem of replyItems) { + const gainId = toNum(replyItem.id); + const gainCount = toNum(replyItem.count); + if (excludeId && gainId === excludeId) continue; + if (!gainId || !gainCount) continue; + gains.push({ id: gainId, count: gainCount }); + } + return gains; + }; + const buildItemCountMap = (bagItems) => { + const map = new Map(); + for (const bagItem of bagItems) { + const bagId = toNum(bagItem.id); + const bagCount = toNum(bagItem.count); + if (!bagId || !bagCount) continue; + map.set(bagId, (map.get(bagId) || 0) + bagCount); + } + return map; + }; + const diffGains = (beforeMap, afterMap, excludeId) => { + const parts = []; + for (const [id, afterCount] of afterMap.entries()) { + if (excludeId && id === excludeId) continue; + const beforeCount = beforeMap.get(id) || 0; + const delta = afterCount - beforeCount; + if (delta > 0) { + parts.push(`${getItemNameById(id)} x${delta}`); + } + } + return parts.join(','); + }; + const diffGainList = (beforeMap, afterMap, excludeId) => { + const gains = []; + for (const [id, afterCount] of afterMap.entries()) { + if (excludeId && id === excludeId) continue; + const beforeCount = beforeMap.get(id) || 0; + const delta = afterCount - beforeCount; + if (delta > 0) gains.push({ id, count: delta }); + } + return gains; + }; + const mergeGains = (gainMap, gains) => { + for (const gain of gains) { + if (!gain || !gain.id || !gain.count) continue; + gainMap.set(gain.id, (gainMap.get(gain.id) || 0) + gain.count); + } + }; + const totalGains = new Map(); + + for (const item of items) { + const id = Number(item.id); + const count = Number(item.count); + let uid = item.uid != null ? Number(item.uid) : 0; + const name = getItemNameById(id); + + try { + let usedCount = count; + let gainsText = ''; + let gainList = []; + if (id === 100003) { + const beforeReply = await this.getBag(); + const beforeItems = this.getBagItems(beforeReply); + const beforeMap = buildItemCountMap(beforeItems); + if (!uid) { + const bagReply = await this.getBag(); + const bagItems = this.getBagItems(bagReply); + const found = bagItems.find(bagItem => toNum(bagItem.id) === id && toNum(bagItem.uid) > 0); + if (found) uid = toNum(found.uid); + } + if (!uid) { + throw new Error('礼包缺少UID'); + } + const itemWriter = protobuf.Writer.create(); + itemWriter.uint32(8).int64(toLong(id)); + itemWriter.uint32(16).int64(toLong(count)); + itemWriter.uint32(48).int64(toLong(uid)); + const body = protobuf.Writer.create().uint32(10).bytes(itemWriter.finish()).finish(); + await this.bot.network.sendMsgAsync('gamepb.itempb.ItemService', 'Use', body); + const afterReply = await this.getBag(); + const afterItems = this.getBagItems(afterReply); + const afterMap = buildItemCountMap(afterItems); + gainsText = diffGains(beforeMap, afterMap, id); + gainList = diffGainList(beforeMap, afterMap, id); + } else { + const payload = { + items: [{ + item_id: toLong(id), + count: toLong(count), + land_count: toLong(1) + }] + }; + const body = types.BatchUseRequest.encode(types.BatchUseRequest.create(payload)).finish(); + const { body: replyBody } = await this.bot.network.sendMsgAsync('gamepb.itempb.ItemService', 'BatchUse', body); + const reply = types.BatchUseReply.decode(replyBody); + gainsText = formatGains(reply.items, id); + gainList = buildGainList(reply.items, id); + } + + if (fertilizers.has(id)) { + results.push(`${name}: 已使用(消耗 ${usedCount} 个)${gainsText ? `,获得:${gainsText}` : ''}`); + } else { + results.push(`${name}: 已使用${gainsText ? `,获得:${gainsText}` : ''}`); + } + if (gainsText) { + log('仓库', `使用 ${name} 获得:${gainsText}`); + } + mergeGains(totalGains, gainList); + + } catch (e) { + logWarn('仓库', `物品使用失败 (${name}): ${e.message}`); + results.push(`${name}: 使用失败 - ${e.message}`); + } + } + + const gains = []; + for (const [id, count] of totalGains.entries()) { + gains.push({ id, name: getItemNameById(id), count }); + } + return { success: true, message: results.join('; '), gains }; + } + + startLoop(interval = 60000) { + if (this.sellTimer) return; + this.sellInterval = interval; + // 延迟启动,避免刚上线就请求 + setTimeout(() => { + if (!this.bot.isRunning) return; + this.sellAllFruits(); + this.sellTimer = setInterval(() => this.sellAllFruits(), this.sellInterval); + }, 10000); + } + + stopLoop() { + if (this.sellTimer) { + clearInterval(this.sellTimer); + this.sellTimer = null; + } + } +} + +module.exports = { WarehouseManager }; diff --git a/211/server/src/decode.js b/211/server/src/decode.js new file mode 100644 index 0000000..a00b929 --- /dev/null +++ b/211/server/src/decode.js @@ -0,0 +1,245 @@ +/** + * 解码/验证工具模式 + */ + +const protobuf = require('protobufjs'); +const Long = require('long'); +const { PHASE_NAMES } = require('./config'); +const { types, getRoot } = require('./proto'); +const { toNum } = require('./utils'); + +// ============ 辅助函数 ============ + +/** JSON.stringify replacer, 处理 Long 和 Buffer */ +function longReplacer(key, value) { + if (value && typeof value === 'object' && value.low !== undefined && value.high !== undefined) { + return Long.fromBits(value.low, value.high, value.unsigned).toString(); + } + if (value && value.type === 'Buffer' && Array.isArray(value.data)) { + return `<${value.data.length} bytes>`; + } + return value; +} + +/** 尝试将 bytes 解码为 UTF-8 字符串 */ +function tryDecodeString(bytes) { + try { + const str = Buffer.from(bytes).toString('utf8'); + const printable = str.split('').filter(c => c.charCodeAt(0) >= 32 || c === '\n' || c === '\r' || c === '\t').length; + if (printable > str.length * 0.8 && str.length > 0) return str; + } catch (e) {} + return null; +} + +/** 通用 protobuf 解码 (无 schema, 显示原始字段) */ +function tryGenericDecode(buf) { + console.log('=== 通用 protobuf 解码 (无schema) ==='); + try { + const reader = protobuf.Reader.create(buf); + while (reader.pos < reader.len) { + const tag = reader.uint32(); + const fieldNum = tag >>> 3; + const wireType = tag & 7; + let value; + switch (wireType) { + case 0: value = reader.int64().toString(); console.log(` field ${fieldNum} (varint): ${value}`); break; + case 1: value = reader.fixed64().toString(); console.log(` field ${fieldNum} (fixed64): ${value}`); break; + case 2: { + const bytes = reader.bytes(); + const str = tryDecodeString(bytes); + if (str !== null) { + console.log(` field ${fieldNum} (bytes/${bytes.length}): "${str}"`); + } else { + console.log(` field ${fieldNum} (bytes/${bytes.length}): ${Buffer.from(bytes).toString('hex')}`); + } + break; + } + case 5: value = reader.float(); console.log(` field ${fieldNum} (float): ${value}`); break; + default: console.log(` field ${fieldNum} (wire ${wireType}): `); reader.skipType(wireType); break; + } + } + } catch (e) { + console.log(` 解码中断: ${e.message}`); + } +} + +// ============ 验证模式 ============ + +async function verifyMode() { + console.log('\n====== 验证模式 ======\n'); + + // Login Request + const loginB64 = 'CigKGWdhbWVwYi51c2VycGIuVXNlclNlcnZpY2USBUxvZ2luGAEgASgAEmEYACIAKjwKEDEuNi4wLjhfMjAyNTEyMjQSE1dpbmRvd3MgVW5rbm93biB4NjQqBHdpZmlQzL0BagltaWNyb3NvZnQwADoEMTI1NkIVCgASABoAIgAqBW90aGVyMAI6AEIA'; + try { + const msg = types.GateMessage.decode(Buffer.from(loginB64, 'base64')); + console.log(`[OK] Login Request: ${msg.meta.service_name}.${msg.meta.method_name} seq=${msg.meta.client_seq}`); + const req = types.LoginRequest.decode(msg.body); + console.log(` device=${req.device_info?.client_version} scene=${req.scene_id}`); + } catch (e) { console.log(`[FAIL] Login Request: ${e.message}`); } + + // AllLands Response + const allLandsB64 = 'ClwKG2dhbWVwYi5wbGFudHBiLlBsYW50U2VydmljZRIIQWxsTGFuZHMYAiAEKARCLQoJeC10cmFjZWlkEiBhOWZhNmZhZmYwZmI0ZDU5ZjQ5ZDJiZTJlYTY2NGU3NBK7BwpMCAEQARgBIARCDQgSEBwaBwjpBxDAmgxKAFIuCOOgPhIJ6IOh6JCd5Y2cIgoIBhCNu5rMBhgTKAFQw7gCWAp4eIABAYgBAZABCoABAQpMCAIQARgBIARCDQgSEB0aBwjpBxCQoQ9KAFIuCOOgPhIJ6IOh6JCd5Y2cIgoIBhCOu5rMBhgTKAFQw7gCWAp4eIABAYgBAZABCoABAQpMCAMQARgBIARCDQgSEB4aBwjpBxDgpxJKAFIuCOOgPhIJ6IOh6JCd5Y2cIgoIBhCOu5rMBhgTKAFQw7gCWAp4eIABAYgBAZABCoABAQpMCAQQARgBIARCDQgSEB8aBwjpBxCwrhVKAFIuCOOgPhIJ6IOh6JCd5Y2cIgoIBhCOu5rMBhgTKAFQw7gCWAp4eIABAYgBAZABCoABAQpMCAUQARgBIARCDQgSECAaBwjpBxCAtRhKAFIuCOOgPhIJ6IOh6JCd5Y2cIgoIBhCNu5rMBhgTKAFQw7gCWAp4eIABAYgBAZABCoABAQpMCAYQARgBIARCDQgSECEaBwjpBxCgwh5KAFIuCOOgPhIJ6IOh6JCd5Y2cIgoIBhCOu5rMBhgTKAFQw7gCWAp4eIABAYgBAZABCoABAQoPCAcgBDoHCAYQBRiIJ2ABCg8ICCAEOgcIBxAHGJBOYAEKEAgJIAQ6CAgIEAkYoJwBYAEKDggKIAQ6CAgJEAsYsOoBCg4ICyAEOggIChANGMC4AgoOCAwgBDoICAsQDxjg1AMKDggNIAQ6CAgMEBEYgPEECg4IDiAEOggIDRATGKCNBgoOCA8gBDoICA4QFRjAqQcKDggQIAQ6CAgPEBcY4MUICg4IESAEOggIEBAZGIDiCQoOCBIgBDoICBEQGxig/goKDggTIAQ6CAgSEB0YwJoMCg4IFCAEOggIExAfGOC2DQoOCBUgBDoICBQQIRiA0w4KDggWIAQ6CAgVECMYoO8PCg4IFyAEOggIFhAlGMCLEQoOCBggBDoICBcQJxjgpxISCQicThj/k+vcAxIJCJ1OGP+T69wDEgkInk4Y/5Pr3AMSCwiRThAJGP+T69wDEg0IlE4YZCCTTihkOJNOEhAIlU4QBxj/k+vcAygXOJVOEhAIlk4QCxj/k+vcAygLOJVOEhAIl04QBRj/k+vcAygFOJVOEgkImE4Y/5Pr3AMSDQiZThAMGP+T69wDKAwSCwiaThABGP+T69wDEg0Ikk4QCRj/k+vcAygJEg0Ik04YZCCTTihkOJNOEgkIm04Y/5Pr3AM='; + try { + const msg = types.GateMessage.decode(Buffer.from(allLandsB64, 'base64')); + const reply = types.AllLandsReply.decode(msg.body); + console.log(`[OK] AllLands Reply: ${reply.lands.length} 块土地`); + for (const land of reply.lands.slice(0, 3)) { + const id = toNum(land.id); + const unlocked = land.unlocked; + const plantName = land.plant?.name || '空'; + const phases = land.plant?.phases || []; + const lastPhase = phases.length > 0 ? phases[phases.length - 1].phase : -1; + console.log(` 土地#${id}: ${unlocked ? '已解锁' : '未解锁'} 植物=${plantName} 阶段=${PHASE_NAMES[lastPhase] || lastPhase}`); + } + if (reply.lands.length > 3) console.log(` ... 还有 ${reply.lands.length - 3} 块`); + } catch (e) { console.log(`[FAIL] AllLands Reply: ${e.message}`); } + + // Harvest Request + const harvestB64 = 'CiwKG2dhbWVwYi5wbGFudHBiLlBsYW50U2VydmljZRIHSGFydmVzdBgBIBsoGhIQCgYBAgMEBQYQyOHR8gMYAQ=='; + try { + const msg = types.GateMessage.decode(Buffer.from(harvestB64, 'base64')); + const req = types.HarvestRequest.decode(msg.body); + console.log(`[OK] Harvest Request: land_ids=[${req.land_ids.join(',')}] host_gid=${req.host_gid} is_all=${req.is_all}`); + } catch (e) { console.log(`[FAIL] Harvest Request: ${e.message}`); } + + console.log('\n====== 验证完成 ======\n'); +} + +// ============ 解码模式 ============ + +async function decodeMode(args) { + let inputData = ''; + let typeName = ''; + let isHex = false; + let isGateWrapped = false; + + for (let i = 0; i < args.length; i++) { + if (args[i] === '--decode') continue; + if (args[i] === '--type' && args[i + 1]) { typeName = args[++i]; continue; } + if (args[i] === '--hex') { isHex = true; continue; } + if (args[i] === '--gate') { isGateWrapped = true; continue; } + if (!inputData) inputData = args[i]; + } + + if (!inputData) { + console.log(` +PB数据解码工具 +============== + +用法: + node client.js --decode + node client.js --decode --hex + node client.js --decode --type <消息类型> + node client.js --decode --gate + +参数: + <数据> base64编码的pb数据 (默认), 或hex编码 (配合 --hex) + --hex 输入数据为hex编码 + --gate 外层是 gatepb.Message 包装, 自动解析 meta + body + --type 指定消息类型, 如: gatepb.Message, gamepb.plantpb.AllLandsReply 等 + +可用类型: + gatepb.Message / gatepb.Meta + gamepb.userpb.LoginRequest / LoginReply / HeartbeatRequest / HeartbeatReply + gamepb.plantpb.AllLandsRequest / AllLandsReply / HarvestRequest / HarvestReply + gamepb.plantpb.WaterLandRequest / WeedOutRequest / InsecticideRequest + gamepb.plantpb.PlantRequest / PlantReply / RemovePlantRequest / RemovePlantReply + gamepb.shoppb.ShopInfoRequest / ShopInfoReply / BuyGoodsRequest / BuyGoodsReply + gamepb.friendpb.GetAllRequest / GetAllReply / GameFriend + +示例: + node client.js --decode CigKGWdhbWVwYi... --gate + node client.js --decode 0a1c0a19... --hex --type gatepb.Message +`); + return; + } + + const root = getRoot(); + let buf; + try { + buf = isHex ? Buffer.from(inputData, 'hex') : Buffer.from(inputData, 'base64'); + } catch (e) { + console.error(`输入数据解码失败: ${e.message}`); + return; + } + console.log(`数据长度: ${buf.length} 字节\n`); + + // --gate: 先解析外层 gatepb.Message + if (isGateWrapped) { + try { + const msg = types.GateMessage.decode(buf); + const meta = msg.meta; + console.log('=== gatepb.Message (外层) ==='); + console.log(` service: ${meta.service_name}`); + console.log(` method: ${meta.method_name}`); + console.log(` type: ${meta.message_type} (${meta.message_type === 1 ? 'Request' : meta.message_type === 2 ? 'Response' : 'Notify'})`); + console.log(` client_seq: ${meta.client_seq}`); + console.log(` server_seq: ${meta.server_seq}`); + if (toNum(meta.error_code) !== 0) { + console.log(` error_code: ${meta.error_code}`); + console.log(` error_msg: ${meta.error_message}`); + } + console.log(''); + + if (msg.body && msg.body.length > 0) { + const svc = meta.service_name || ''; + const mtd = meta.method_name || ''; + const isReq = meta.message_type === 1; + const suffix = isReq ? 'Request' : 'Reply'; + const autoType = `${svc.replace('Service', '')}.${mtd}${suffix}`; + + let bodyType = null; + try { bodyType = root.lookupType(autoType); } catch (e) {} + if (!bodyType) { + const parts = svc.split('.'); + if (parts.length >= 2) { + const ns = parts.slice(0, parts.length - 1).join('.'); + try { bodyType = root.lookupType(`${ns}.${mtd}${suffix}`); } catch (e) {} + } + } + + if (bodyType) { + console.log(`=== ${bodyType.fullName} (body 自动推断) ===`); + const decoded = bodyType.decode(msg.body); + console.log(JSON.stringify(decoded.toJSON(), longReplacer, 2)); + } else { + console.log(`=== body (未能自动推断类型, 用 --type 手动指定 body 类型) ===`); + console.log(` hex: ${Buffer.from(msg.body).toString('hex')}`); + console.log(` base64: ${Buffer.from(msg.body).toString('base64')}`); + tryGenericDecode(msg.body); + } + } + } catch (e) { + console.error(`gatepb.Message 解码失败: ${e.message}`); + } + return; + } + + // --type: 指定类型解码 + if (typeName) { + try { + const msgType = root.lookupType(typeName); + const decoded = msgType.decode(buf); + console.log(`=== ${typeName} ===`); + console.log(JSON.stringify(decoded.toJSON(), longReplacer, 2)); + } catch (e) { + console.error(`解码失败 (${typeName}): ${e.message}`); + } + return; + } + + // 未指定类型,自动尝试 + console.log('未指定类型,自动尝试...\n'); + try { + const msg = types.GateMessage.decode(buf); + if (msg.meta && (msg.meta.service_name || msg.meta.method_name)) { + console.log('=== 检测为 gatepb.Message ==='); + console.log(JSON.stringify(msg.toJSON(), longReplacer, 2)); + return; + } + } catch (e) {} + + tryGenericDecode(buf); +} + +module.exports = { verifyMode, decodeMode }; diff --git a/211/server/src/farm.js b/211/server/src/farm.js new file mode 100644 index 0000000..a154cae --- /dev/null +++ b/211/server/src/farm.js @@ -0,0 +1,648 @@ +/** + * 自己的农场操作 - 收获/浇水/除草/除虫/铲除/种植/商店/巡田 + */ + +const protobuf = require('protobufjs'); +const { CONFIG, PlantPhase, PHASE_NAMES } = require('./config'); +const { types } = require('./proto'); +const { sendMsgAsync, getUserState, networkEvents } = require('./network'); +const { toLong, toNum, getServerTimeSec, toTimeSec, log, logWarn, sleep } = require('./utils'); +const { getPlantNameBySeedId, getPlantName, getPlantExp, formatGrowTime, getPlantGrowTime } = require('./gameConfig'); +const { getPlantingRecommendation } = require('../tools/calc-exp-yield'); + +// ============ 内部状态 ============ +let isCheckingFarm = false; +let isFirstFarmCheck = true; +let farmCheckTimer = null; +let farmLoopRunning = false; + +// ============ 农场 API ============ + +// 操作限制更新回调 (由 friend.js 设置) +let onOperationLimitsUpdate = null; +function setOperationLimitsCallback(callback) { + onOperationLimitsUpdate = callback; +} + +async function getAllLands() { + const body = types.AllLandsRequest.encode(types.AllLandsRequest.create({})).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'AllLands', body); + const reply = types.AllLandsReply.decode(replyBody); + // 更新操作限制 + if (reply.operation_limits && onOperationLimitsUpdate) { + onOperationLimitsUpdate(reply.operation_limits); + } + return reply; +} + +async function harvest(landIds) { + const state = getUserState(); + const body = types.HarvestRequest.encode(types.HarvestRequest.create({ + land_ids: landIds, + host_gid: toLong(state.gid), + is_all: true, + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'Harvest', body); + return types.HarvestReply.decode(replyBody); +} + +async function waterLand(landIds) { + const state = getUserState(); + const body = types.WaterLandRequest.encode(types.WaterLandRequest.create({ + land_ids: landIds, + host_gid: toLong(state.gid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'WaterLand', body); + return types.WaterLandReply.decode(replyBody); +} + +async function weedOut(landIds) { + const state = getUserState(); + const body = types.WeedOutRequest.encode(types.WeedOutRequest.create({ + land_ids: landIds, + host_gid: toLong(state.gid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'WeedOut', body); + return types.WeedOutReply.decode(replyBody); +} + +async function insecticide(landIds) { + const state = getUserState(); + const body = types.InsecticideRequest.encode(types.InsecticideRequest.create({ + land_ids: landIds, + host_gid: toLong(state.gid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'Insecticide', body); + return types.InsecticideReply.decode(replyBody); +} + +// 普通肥料 ID +const NORMAL_FERTILIZER_ID = 1011; + +/** + * 施肥 - 必须逐块进行,服务器不支持批量 + * 游戏中拖动施肥间隔很短,这里用 50ms + */ +async function fertilize(landIds, fertilizerId = NORMAL_FERTILIZER_ID) { + let successCount = 0; + for (const landId of landIds) { + try { + const body = types.FertilizeRequest.encode(types.FertilizeRequest.create({ + land_ids: [toLong(landId)], + fertilizer_id: toLong(fertilizerId), + })).finish(); + await sendMsgAsync('gamepb.plantpb.PlantService', 'Fertilize', body); + successCount++; + } catch (e) { + // 施肥失败(可能肥料不足),停止继续 + break; + } + if (landIds.length > 1) await sleep(50); // 50ms 间隔 + } + return successCount; +} + +async function removePlant(landIds) { + const body = types.RemovePlantRequest.encode(types.RemovePlantRequest.create({ + land_ids: landIds.map(id => toLong(id)), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'RemovePlant', body); + return types.RemovePlantReply.decode(replyBody); +} + +// ============ 商店 API ============ + +async function getShopInfo(shopId) { + const body = types.ShopInfoRequest.encode(types.ShopInfoRequest.create({ + shop_id: toLong(shopId), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.shoppb.ShopService', 'ShopInfo', body); + return types.ShopInfoReply.decode(replyBody); +} + +async function buyGoods(goodsId, num, price) { + const body = types.BuyGoodsRequest.encode(types.BuyGoodsRequest.create({ + goods_id: toLong(goodsId), + num: toLong(num), + price: toLong(price), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.shoppb.ShopService', 'BuyGoods', body); + return types.BuyGoodsReply.decode(replyBody); +} + +// ============ 种植 ============ + +const plantNextAllowed = new Map(); +const PLANT_COOLDOWN_MS = 5000; +const PLANT_ALREADY_COOLDOWN_MS = 30000; + +function encodePlantRequest(seedId, landIds) { + const writer = protobuf.Writer.create(); + const itemWriter = writer.uint32(18).fork(); + itemWriter.uint32(8).int64(seedId); + const idsWriter = itemWriter.uint32(18).fork(); + for (const id of landIds) { + idsWriter.int64(id); + } + idsWriter.ldelim(); + itemWriter.ldelim(); + return writer.finish(); +} + +/** + * 种植 - 游戏中拖动种植间隔很短,这里用 50ms + */ +async function plantSeeds(seedId, landIds) { + let successCount = 0; + const now = Date.now(); + for (const landId of landIds) { + const nextAllowed = plantNextAllowed.get(landId) || 0; + if (now < nextAllowed) continue; + plantNextAllowed.set(landId, now + PLANT_COOLDOWN_MS); + try { + const body = encodePlantRequest(seedId, [landId]); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'Plant', body); + types.PlantReply.decode(replyBody); + successCount++; + } catch (e) { + const msg = String(e && e.message ? e.message : e); + if (msg.includes('1001008') || msg.includes('土地已种植')) { + plantNextAllowed.set(landId, now + PLANT_ALREADY_COOLDOWN_MS); + log('种植', `土地#${landId} 已种植,跳过`); + } else { + logWarn('种植', `土地#${landId} 失败: ${msg}`); + } + } + if (landIds.length > 1) await sleep(50); // 50ms 间隔 + } + return successCount; +} + +async function findBestSeed(landsCount) { + const SEED_SHOP_ID = 2; + const shopReply = await getShopInfo(SEED_SHOP_ID); + if (!shopReply.goods_list || shopReply.goods_list.length === 0) { + logWarn('商店', '种子商店无商品'); + return null; + } + + const state = getUserState(); + const available = []; + for (const goods of shopReply.goods_list) { + if (!goods.unlocked) continue; + + let meetsConditions = true; + let requiredLevel = 0; + const conds = goods.conds || []; + for (const cond of conds) { + if (toNum(cond.type) === 1) { + requiredLevel = toNum(cond.param); + if (state.level < requiredLevel) { + meetsConditions = false; + break; + } + } + } + if (!meetsConditions) continue; + + const limitCount = toNum(goods.limit_count); + const boughtNum = toNum(goods.bought_num); + if (limitCount > 0 && boughtNum >= limitCount) continue; + + available.push({ + goods, + goodsId: toNum(goods.id), + seedId: toNum(goods.item_id), + price: toNum(goods.price), + requiredLevel, + }); + } + + if (available.length === 0) { + logWarn('商店', '没有可购买的种子'); + return null; + } + + if (CONFIG.forceLowestLevelCrop) { + available.sort((a, b) => a.requiredLevel - b.requiredLevel || a.price - b.price); + return available[0]; + } + + try { + log('商店', `等级: ${state.level},土地数量: ${landsCount}`); + + const rec = getPlantingRecommendation(state.level, landsCount == null ? 18 : landsCount, { top: 50 }); + const rankedSeedIds = rec.candidatesNoFert.map(x => x.seedId); + for (const seedId of rankedSeedIds) { + const hit = available.find(x => x.seedId === seedId); + if (hit) return hit; + } + } catch (e) { + logWarn('商店', `经验效率推荐失败,使用兜底策略: ${e.message}`); + } + + // 兜底:等级在28级以前还是白萝卜比较好,28级以上选最高等级的种子 + if(state.level && state.level <= 28){ + available.sort((a, b) => a.requiredLevel - b.requiredLevel); + }else{ + available.sort((a, b) => b.requiredLevel - a.requiredLevel); + } + return available[0]; +} + +async function autoPlantEmptyLands(deadLandIds, emptyLandIds, unlockedLandCount) { + let landsToPlant = emptyLandIds.length > 0 ? [...emptyLandIds] : []; + const state = getUserState(); + + // 1. 铲除枯死/收获残留植物(一键操作) + if (deadLandIds.length > 0) { + try { + await removePlant(deadLandIds); + log('铲除', `已铲除 ${deadLandIds.length} 块 (${deadLandIds.join(',')})`); + landsToPlant.push(...deadLandIds); + } catch (e) { + logWarn('铲除', `批量铲除失败: ${e.message}`); + // 失败时仍然尝试种植 + landsToPlant.push(...deadLandIds); + } + } + + if (landsToPlant.length === 0) return; + + if (landsToPlant.length > 1) { + landsToPlant = Array.from(new Set(landsToPlant)); + } + + if (landsToPlant.length > 0) { + const now = Date.now(); + const filtered = []; + for (const landId of landsToPlant) { + const nextAllowed = plantNextAllowed.get(landId) || 0; + if (now >= nextAllowed) { + filtered.push(landId); + } + } + landsToPlant = filtered; + } + + if (landsToPlant.length === 0) return; + + // 2. 查询种子商店 + let bestSeed; + try { + bestSeed = await findBestSeed(unlockedLandCount); + } catch (e) { + logWarn('商店', `查询失败: ${e.message}`); + return; + } + if (!bestSeed) return; + + const seedName = getPlantNameBySeedId(bestSeed.seedId); + const growTime = getPlantGrowTime(1020000 + (bestSeed.seedId - 20000)); // 转换为植物ID + const growTimeStr = growTime > 0 ? ` 生长${formatGrowTime(growTime)}` : ''; + log('商店', `最佳种子: ${seedName} (${bestSeed.seedId}) 价格=${bestSeed.price}金币${growTimeStr}`); + + // 3. 购买 + const needCount = landsToPlant.length; + const totalCost = bestSeed.price * needCount; + if (totalCost > state.gold) { + logWarn('商店', `金币不足! 需要 ${totalCost} 金币, 当前 ${state.gold} 金币`); + const canBuy = Math.floor(state.gold / bestSeed.price); + if (canBuy <= 0) return; + landsToPlant = landsToPlant.slice(0, canBuy); + log('商店', `金币有限,只种 ${canBuy} 块地`); + } + + let actualSeedId = bestSeed.seedId; + try { + const buyReply = await buyGoods(bestSeed.goodsId, landsToPlant.length, bestSeed.price); + if (buyReply.get_items && buyReply.get_items.length > 0) { + const gotItem = buyReply.get_items[0]; + const gotId = toNum(gotItem.id); + const gotCount = toNum(gotItem.count); + log('购买', `获得物品: id=${gotId} count=${gotCount}`); + if (gotId > 0) actualSeedId = gotId; + } + if (buyReply.cost_items) { + for (const item of buyReply.cost_items) { + state.gold -= toNum(item.count); + } + } + const boughtName = getPlantNameBySeedId(actualSeedId); + log('购买', `已购买 ${boughtName}种子 x${landsToPlant.length}, 花费 ${bestSeed.price * landsToPlant.length} 金币`); + } catch (e) { + logWarn('购买', e.message); + return; + } + + // 4. 种植(逐块拖动,间隔50ms) + let plantedLands = []; + try { + const planted = await plantSeeds(actualSeedId, landsToPlant); + log('种植', `已在 ${planted} 块地种植 (${landsToPlant.join(',')})`); + if (planted > 0) { + plantedLands = landsToPlant.slice(0, planted); + } + } catch (e) { + logWarn('种植', e.message); + } + +} + +// ============ 土地分析 ============ + +/** + * 根据服务器时间确定当前实际生长阶段 + */ +function getCurrentPhase(phases, debug, landLabel) { + if (!phases || phases.length === 0) return null; + + const nowSec = getServerTimeSec(); + + if (debug) { + console.log(` ${landLabel} 服务器时间=${nowSec} (${new Date(nowSec * 1000).toLocaleTimeString()})`); + for (let i = 0; i < phases.length; i++) { + const p = phases[i]; + const bt = toTimeSec(p.begin_time); + const phaseName = PHASE_NAMES[p.phase] || `阶段${p.phase}`; + const diff = bt > 0 ? (bt - nowSec) : 0; + const diffStr = diff > 0 ? `(未来 ${diff}s)` : diff < 0 ? `(已过 ${-diff}s)` : ''; + console.log(` ${landLabel} [${i}] ${phaseName}(${p.phase}) begin=${bt} ${diffStr} dry=${toTimeSec(p.dry_time)} weed=${toTimeSec(p.weeds_time)} insect=${toTimeSec(p.insect_time)}`); + } + } + + for (let i = phases.length - 1; i >= 0; i--) { + const beginTime = toTimeSec(phases[i].begin_time); + if (beginTime > 0 && beginTime <= nowSec) { + if (debug) { + console.log(` ${landLabel} → 当前阶段: ${PHASE_NAMES[phases[i].phase] || phases[i].phase}`); + } + return phases[i]; + } + } + + if (debug) { + console.log(` ${landLabel} → 所有阶段都在未来,使用第一个: ${PHASE_NAMES[phases[0].phase] || phases[0].phase}`); + } + return phases[0]; +} + +function analyzeLands(lands) { + const result = { + harvestable: [], needWater: [], needWeed: [], needBug: [], + growing: [], empty: [], dead: [], + harvestableInfo: [], // 收获植物的详细信息 { id, name, exp } + }; + + const nowSec = getServerTimeSec(); + const debug = false; + + if (debug) { + console.log(''); + console.log('========== 首次巡田详细日志 =========='); + console.log(` 服务器时间(秒): ${nowSec} (${new Date(nowSec * 1000).toLocaleString()})`); + console.log(` 总土地数: ${lands.length}`); + console.log(''); + } + + for (const land of lands) { + const id = toNum(land.id); + if (!land.unlocked) { + if (debug) console.log(` 土地#${id}: 未解锁`); + continue; + } + + const plant = land.plant; + if (!plant) { + result.empty.push(id); + if (debug) console.log(` 土地#${id}: 空地`); + continue; + } + if (!plant.phases || plant.phases.length === 0) { + const plantId = toNum(plant.id); + if (plantId > 0 || plant.name) { + result.growing.push(id); + if (debug) console.log(` 土地#${id}: 生长中(阶段未知)`); + } else { + result.empty.push(id); + if (debug) console.log(` 土地#${id}: 空地`); + } + continue; + } + + const plantName = plant.name || '未知作物'; + const landLabel = `土地#${id}(${plantName})`; + + if (debug) { + console.log(` ${landLabel}: phases=${plant.phases.length} dry_num=${toNum(plant.dry_num)} weed_owners=${(plant.weed_owners||[]).length} insect_owners=${(plant.insect_owners||[]).length}`); + } + + const currentPhase = getCurrentPhase(plant.phases, debug, landLabel); + if (!currentPhase) { + result.empty.push(id); + continue; + } + const phaseVal = currentPhase.phase; + + if (phaseVal === PlantPhase.DEAD) { + result.dead.push(id); + if (debug) console.log(` → 结果: 枯死`); + continue; + } + + if (phaseVal === PlantPhase.MATURE) { + result.harvestable.push(id); + // 收集植物信息用于日志 + const plantId = toNum(plant.id); + const plantNameFromConfig = getPlantName(plantId); + const plantExp = getPlantExp(plantId); + result.harvestableInfo.push({ + landId: id, + plantId, + name: plantNameFromConfig || plantName, + exp: plantExp, + }); + if (debug) console.log(` → 结果: 可收获 (${plantNameFromConfig} +${plantExp}经验)`); + continue; + } + + let landNeeds = []; + const dryNum = toNum(plant.dry_num); + const dryTime = toTimeSec(currentPhase.dry_time); + if (dryNum > 0 || (dryTime > 0 && dryTime <= nowSec)) { + result.needWater.push(id); + landNeeds.push('缺水'); + } + + const weedsTime = toTimeSec(currentPhase.weeds_time); + const hasWeeds = (plant.weed_owners && plant.weed_owners.length > 0) || (weedsTime > 0 && weedsTime <= nowSec); + if (hasWeeds) { + result.needWeed.push(id); + landNeeds.push('有草'); + } + + const insectTime = toTimeSec(currentPhase.insect_time); + const hasBugs = (plant.insect_owners && plant.insect_owners.length > 0) || (insectTime > 0 && insectTime <= nowSec); + if (hasBugs) { + result.needBug.push(id); + landNeeds.push('有虫'); + } + + result.growing.push(id); + if (debug) { + const needStr = landNeeds.length > 0 ? ` 需要: ${landNeeds.join(',')}` : ''; + console.log(` → 结果: 生长中(${PHASE_NAMES[phaseVal] || phaseVal})${needStr}`); + } + } + + if (debug) { + console.log(''); + console.log('========== 巡田分析汇总 =========='); + console.log(` 可收获: ${result.harvestable.length} [${result.harvestable.join(',')}]`); + console.log(` 生长中: ${result.growing.length} [${result.growing.join(',')}]`); + console.log(` 缺水: ${result.needWater.length} [${result.needWater.join(',')}]`); + console.log(` 有草: ${result.needWeed.length} [${result.needWeed.join(',')}]`); + console.log(` 有虫: ${result.needBug.length} [${result.needBug.join(',')}]`); + console.log(` 空地: ${result.empty.length} [${result.empty.join(',')}]`); + console.log(` 枯死: ${result.dead.length} [${result.dead.join(',')}]`); + console.log('===================================='); + console.log(''); + } + + return result; +} + +// ============ 巡田主循环 ============ + +async function checkFarm() { + const state = getUserState(); + if (isCheckingFarm || !state.gid) return; + isCheckingFarm = true; + + try { + const landsReply = await getAllLands(); + if (!landsReply.lands || landsReply.lands.length === 0) { + log('农场', '没有土地数据'); + return; + } + + const lands = landsReply.lands; + const status = analyzeLands(lands); + const unlockedLandCount = lands.filter(land => land && land.unlocked).length; + isFirstFarmCheck = false; + + // 构建状态摘要 + const statusParts = []; + if (status.harvestable.length) statusParts.push(`收:${status.harvestable.length}`); + if (status.needWeed.length) statusParts.push(`草:${status.needWeed.length}`); + if (status.needBug.length) statusParts.push(`虫:${status.needBug.length}`); + if (status.needWater.length) statusParts.push(`水:${status.needWater.length}`); + if (status.dead.length) statusParts.push(`枯:${status.dead.length}`); + if (status.empty.length) statusParts.push(`空:${status.empty.length}`); + statusParts.push(`长:${status.growing.length}`); + + const hasWork = status.harvestable.length || status.needWeed.length || status.needBug.length + || status.needWater.length || status.dead.length || status.empty.length; + + // 执行操作并收集结果 + const actions = []; + + // 一键操作:除草、除虫、浇水可以并行执行(游戏中都是一键完成) + const batchOps = []; + if (status.needWeed.length > 0) { + batchOps.push(weedOut(status.needWeed).then(() => actions.push(`除草${status.needWeed.length}`)).catch(e => logWarn('除草', e.message))); + } + if (status.needBug.length > 0) { + batchOps.push(insecticide(status.needBug).then(() => actions.push(`除虫${status.needBug.length}`)).catch(e => logWarn('除虫', e.message))); + } + if (status.needWater.length > 0) { + batchOps.push(waterLand(status.needWater).then(() => actions.push(`浇水${status.needWater.length}`)).catch(e => logWarn('浇水', e.message))); + } + if (batchOps.length > 0) { + await Promise.all(batchOps); + } + + // 收获(一键操作) + let harvestedLandIds = []; + if (status.harvestable.length > 0) { + try { + await harvest(status.harvestable); + actions.push(`收获${status.harvestable.length}`); + harvestedLandIds = [...status.harvestable]; + } catch (e) { logWarn('收获', e.message); } + } + + // 铲除 + 种植 + 施肥(需要顺序执行) + const allDeadLands = [...status.dead, ...harvestedLandIds]; + const allEmptyLands = [...status.empty]; + if (allDeadLands.length > 0 || allEmptyLands.length > 0) { + try { + await autoPlantEmptyLands(allDeadLands, allEmptyLands, unlockedLandCount); + actions.push(`种植${allDeadLands.length + allEmptyLands.length}`); + } catch (e) { logWarn('种植', e.message); } + } + + // 输出一行日志 + const actionStr = actions.length > 0 ? ` → ${actions.join('/')}` : ''; + if(hasWork) { + log('农场', `[${statusParts.join(' ')}]${actionStr}${!hasWork ? ' 无需操作' : ''}`) + } + } catch (err) { + logWarn('巡田', `检查失败: ${err.message}`); + } finally { + isCheckingFarm = false; + } +} + +/** + * 农场巡查循环 - 本次完成后等待指定秒数再开始下次 + */ +async function farmCheckLoop() { + while (farmLoopRunning) { + await checkFarm(); + if (!farmLoopRunning) break; + await sleep(CONFIG.farmCheckInterval); + } +} + +function startFarmCheckLoop() { + if (farmLoopRunning) return; + farmLoopRunning = true; + + // 监听服务器推送的土地变化事件 + networkEvents.on('landsChanged', onLandsChangedPush); + + // 延迟 2 秒后启动循环 + farmCheckTimer = setTimeout(() => farmCheckLoop(), 2000); +} + +/** + * 处理服务器推送的土地变化 + */ +let lastPushTime = 0; +function onLandsChangedPush(lands) { + if (isCheckingFarm) return; + const now = Date.now(); + if (now - lastPushTime < 500) return; // 500ms 防抖 + + lastPushTime = now; + log('农场', `收到推送: ${lands.length}块土地变化,检查中...`); + + setTimeout(async () => { + if (!isCheckingFarm) { + await checkFarm(); + } + }, 100); +} + +function stopFarmCheckLoop() { + farmLoopRunning = false; + if (farmCheckTimer) { clearTimeout(farmCheckTimer); farmCheckTimer = null; } + networkEvents.removeListener('landsChanged', onLandsChangedPush); +} + +module.exports = { + checkFarm, startFarmCheckLoop, stopFarmCheckLoop, + getCurrentPhase, + setOperationLimitsCallback, +}; diff --git a/211/server/src/friend.js b/211/server/src/friend.js new file mode 100644 index 0000000..abf84db --- /dev/null +++ b/211/server/src/friend.js @@ -0,0 +1,650 @@ +/** + * 好友农场操作 - 进入/离开/帮忙/偷菜/巡查 + */ + +const { CONFIG, PlantPhase, PHASE_NAMES } = require('./config'); +const { types } = require('./proto'); +const { sendMsgAsync, getUserState, networkEvents } = require('./network'); +const { toLong, toNum, getServerTimeSec, log, logWarn, sleep } = require('./utils'); +const { getCurrentPhase, setOperationLimitsCallback } = require('./farm'); +const { getPlantName } = require('./gameConfig'); + +// ============ 内部状态 ============ +let isCheckingFriends = false; +let isFirstFriendCheck = true; +let friendCheckTimer = null; +let friendLoopRunning = false; +let lastResetDate = ''; // 上次重置日期 (YYYY-MM-DD) + +// 操作限制状态 (从服务器响应中更新) +// 操作类型ID (根据游戏代码): +// 10001 = 收获, 10002 = 铲除, 10003 = 放草, 10004 = 放虫 +// 10005 = 除草(帮好友), 10006 = 除虫(帮好友), 10007 = 浇水(帮好友), 10008 = 偷菜 +const operationLimits = new Map(); + +// 操作类型名称映射 +const OP_NAMES = { + 10001: '收获', + 10002: '铲除', + 10003: '放草', + 10004: '放虫', + 10005: '除草', + 10006: '除虫', + 10007: '浇水', + 10008: '偷菜', +}; + +// 配置: 是否只在有经验时才帮助好友 +const HELP_ONLY_WITH_EXP = true; // !!!无效,暂时无法判断。有修复方法但是暂时没打算更新出来 + +// 配置: 是否启用放虫放草功能 +const ENABLE_PUT_BAD_THINGS = false; // 无效!!!开启后会多次访问朋友导致被拉黑 请勿更改暂时关闭放虫放草功能 + +// ============ 好友 API ============ + +async function getAllFriends() { + const body = types.GetAllFriendsRequest.encode(types.GetAllFriendsRequest.create({})).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.friendpb.FriendService', 'GetAll', body); + return types.GetAllFriendsReply.decode(replyBody); +} + +// ============ 好友申请 API (微信同玩) ============ + +async function getApplications() { + const body = types.GetApplicationsRequest.encode(types.GetApplicationsRequest.create({})).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.friendpb.FriendService', 'GetApplications', body); + return types.GetApplicationsReply.decode(replyBody); +} + +async function acceptFriends(gids) { + const body = types.AcceptFriendsRequest.encode(types.AcceptFriendsRequest.create({ + friend_gids: gids.map(g => toLong(g)), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.friendpb.FriendService', 'AcceptFriends', body); + return types.AcceptFriendsReply.decode(replyBody); +} + +async function enterFriendFarm(friendGid) { + const body = types.VisitEnterRequest.encode(types.VisitEnterRequest.create({ + host_gid: toLong(friendGid), + reason: 2, // ENTER_REASON_FRIEND + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.visitpb.VisitService', 'Enter', body); + return types.VisitEnterReply.decode(replyBody); +} + +async function leaveFriendFarm(friendGid) { + const body = types.VisitLeaveRequest.encode(types.VisitLeaveRequest.create({ + host_gid: toLong(friendGid), + })).finish(); + try { + await sendMsgAsync('gamepb.visitpb.VisitService', 'Leave', body); + } catch (e) { /* 离开失败不影响主流程 */ } +} + +/** + * 检查是否需要重置每日限制 (0点刷新) + */ +function checkDailyReset() { + const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD + if (lastResetDate !== today) { + if (lastResetDate !== '') { + log('系统', '跨日重置,清空操作限制缓存'); + } + operationLimits.clear(); + lastResetDate = today; + } +} + +/** + * 更新操作限制状态 + */ +function updateOperationLimits(limits) { + if (!limits || limits.length === 0) return; + checkDailyReset(); + for (const limit of limits) { + const id = toNum(limit.id); + if (id > 0) { + const data = { + dayTimes: toNum(limit.day_times), + dayTimesLimit: toNum(limit.day_times_lt), + dayExpTimes: toNum(limit.day_exp_times), + dayExpTimesLimit: toNum(limit.day_ex_times_lt), // 注意: 字段名是 day_ex_times_lt (少个p) + }; + operationLimits.set(id, data); + } + } +} + +/** + * 检查某操作是否还能获得经验 + */ +function canGetExp(opId) { + const limit = operationLimits.get(opId); + if (!limit) return false; // 没有限制信息,保守起见不帮助(等待农场检查获取限制) + if (limit.dayExpTimesLimit <= 0) return true; // 没有经验上限 + return limit.dayExpTimes < limit.dayExpTimesLimit; +} + +/** + * 检查某操作是否还有次数 + */ +function canOperate(opId) { + const limit = operationLimits.get(opId); + if (!limit) return true; + if (limit.dayTimesLimit <= 0) return true; + return limit.dayTimes < limit.dayTimesLimit; +} + +/** + * 获取某操作剩余次数 + */ +function getRemainingTimes(opId) { + const limit = operationLimits.get(opId); + if (!limit || limit.dayTimesLimit <= 0) return 999; + return Math.max(0, limit.dayTimesLimit - limit.dayTimes); +} + +/** + * 获取操作限制摘要 (用于日志显示) + */ +function getOperationLimitsSummary() { + const parts = []; + // 帮助好友操作 (10005=除草, 10006=除虫, 10007=浇水, 10008=偷菜) + for (const id of [10005, 10006, 10007, 10008]) { + const limit = operationLimits.get(id); + if (limit && limit.dayExpTimesLimit > 0) { + const name = OP_NAMES[id] || `#${id}`; + const expLeft = limit.dayExpTimesLimit - limit.dayExpTimes; + parts.push(`${name}${expLeft}/${limit.dayExpTimesLimit}`); + } + } + // 捣乱操作 (10003=放草, 10004=放虫) + for (const id of [10003, 10004]) { + const limit = operationLimits.get(id); + if (limit && limit.dayTimesLimit > 0) { + const name = OP_NAMES[id] || `#${id}`; + const left = limit.dayTimesLimit - limit.dayTimes; + parts.push(`${name}${left}/${limit.dayTimesLimit}`); + } + } + return parts; +} + +async function helpWater(friendGid, landIds) { + const body = types.WaterLandRequest.encode(types.WaterLandRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'WaterLand', body); + const reply = types.WaterLandReply.decode(replyBody); + updateOperationLimits(reply.operation_limits); + return reply; +} + +async function helpWeed(friendGid, landIds) { + const body = types.WeedOutRequest.encode(types.WeedOutRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'WeedOut', body); + const reply = types.WeedOutReply.decode(replyBody); + updateOperationLimits(reply.operation_limits); + return reply; +} + +async function helpInsecticide(friendGid, landIds) { + const body = types.InsecticideRequest.encode(types.InsecticideRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'Insecticide', body); + const reply = types.InsecticideReply.decode(replyBody); + updateOperationLimits(reply.operation_limits); + return reply; +} + +async function stealHarvest(friendGid, landIds) { + const body = types.HarvestRequest.encode(types.HarvestRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + is_all: true, + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'Harvest', body); + const reply = types.HarvestReply.decode(replyBody); + updateOperationLimits(reply.operation_limits); + return reply; +} + +async function putInsects(friendGid, landIds) { + const body = types.PutInsectsRequest.encode(types.PutInsectsRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'PutInsects', body); + const reply = types.PutInsectsReply.decode(replyBody); + updateOperationLimits(reply.operation_limits); + return reply; +} + +async function putWeeds(friendGid, landIds) { + const body = types.PutWeedsRequest.encode(types.PutWeedsRequest.create({ + land_ids: landIds, + host_gid: toLong(friendGid), + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.plantpb.PlantService', 'PutWeeds', body); + const reply = types.PutWeedsReply.decode(replyBody); + updateOperationLimits(reply.operation_limits); + return reply; +} + +// ============ 好友土地分析 ============ + +// 调试开关 - 设为好友名字可只查看该好友的土地分析详情,设为 true 查看全部,false 关闭 +const DEBUG_FRIEND_LANDS = false; + +function analyzeFriendLands(lands, myGid, friendName = '') { + const result = { + stealable: [], // 可偷 + stealableInfo: [], // 可偷植物信息 { landId, plantId, name } + needWater: [], // 需要浇水 + needWeed: [], // 需要除草 + needBug: [], // 需要除虫 + canPutWeed: [], // 可以放草 + canPutBug: [], // 可以放虫 + }; + + for (const land of lands) { + const id = toNum(land.id); + const plant = land.plant; + // 是否显示此好友的调试信息 + const showDebug = DEBUG_FRIEND_LANDS === true || DEBUG_FRIEND_LANDS === friendName; + + if (!plant || !plant.phases || plant.phases.length === 0) { + if (showDebug) console.log(` [${friendName}] 土地#${id}: 无植物或无阶段数据`); + continue; + } + + const currentPhase = getCurrentPhase(plant.phases, showDebug, `[${friendName}]土地#${id}`); + if (!currentPhase) { + if (showDebug) console.log(` [${friendName}] 土地#${id}: getCurrentPhase返回null`); + continue; + } + const phaseVal = currentPhase.phase; + + if (showDebug) { + const insectOwners = plant.insect_owners || []; + const weedOwners = plant.weed_owners || []; + console.log(` [${friendName}] 土地#${id}: phase=${phaseVal} stealable=${plant.stealable} dry=${toNum(plant.dry_num)} weed=${weedOwners.length} bug=${insectOwners.length}`); + } + + if (phaseVal === PlantPhase.MATURE) { + if (plant.stealable) { + result.stealable.push(id); + const plantId = toNum(plant.id); + const plantName = getPlantName(plantId) || plant.name || '未知'; + result.stealableInfo.push({ landId: id, plantId, name: plantName }); + } else if (showDebug) { + console.log(` [${friendName}] 土地#${id}: 成熟但stealable=false (可能已被偷过)`); + } + continue; + } + + if (phaseVal === PlantPhase.DEAD) continue; + + // 帮助操作 + if (toNum(plant.dry_num) > 0) result.needWater.push(id); + if (plant.weed_owners && plant.weed_owners.length > 0) result.needWeed.push(id); + if (plant.insect_owners && plant.insect_owners.length > 0) result.needBug.push(id); + + // 捣乱操作: 检查是否可以放草/放虫 + // 条件: 没有草且我没放过草 + const weedOwners = plant.weed_owners || []; + const insectOwners = plant.insect_owners || []; + const iAlreadyPutWeed = weedOwners.some(gid => toNum(gid) === myGid); + const iAlreadyPutBug = insectOwners.some(gid => toNum(gid) === myGid); + + // 每块地最多2个草/虫,且我没放过 + if (weedOwners.length < 2 && !iAlreadyPutWeed) { + result.canPutWeed.push(id); + } + if (insectOwners.length < 2 && !iAlreadyPutBug) { + result.canPutBug.push(id); + } + } + return result; +} + +// ============ 拜访好友 ============ + +async function visitFriend(friend, totalActions, myGid) { + const { gid, name } = friend; + const showDebug = DEBUG_FRIEND_LANDS === true || DEBUG_FRIEND_LANDS === name; + + if (showDebug) { + console.log(`\n========== 调试: 进入好友 [${name}] 农场 ==========`); + } + + let enterReply; + try { + enterReply = await enterFriendFarm(gid); + } catch (e) { + logWarn('好友', `进入 ${name} 农场失败: ${e.message}`); + return; + } + + const lands = enterReply.lands || []; + if (showDebug) { + console.log(` [${name}] 获取到 ${lands.length} 块土地`); + } + if (lands.length === 0) { + await leaveFriendFarm(gid); + return; + } + + const status = analyzeFriendLands(lands, myGid, name); + + if (showDebug) { + console.log(` [${name}] 分析结果: 可偷=${status.stealable.length} 浇水=${status.needWater.length} 除草=${status.needWeed.length} 除虫=${status.needBug.length}`); + console.log(`========== 调试结束 ==========\n`); + } + + // 执行操作 + const actions = []; + + // 帮助操作: 只在有经验时执行 (如果启用了 HELP_ONLY_WITH_EXP) + if (status.needWeed.length > 0) { + const shouldHelp = !HELP_ONLY_WITH_EXP || canGetExp(10005); // 10005=除草 + if (shouldHelp) { + let ok = 0; + for (const landId of status.needWeed) { + try { await helpWeed(gid, [landId]); ok++; } catch (e) { /* ignore */ } + await sleep(100); + } + if (ok > 0) { actions.push(`草${ok}`); totalActions.weed += ok; } + } + } + + if (status.needBug.length > 0) { + const shouldHelp = !HELP_ONLY_WITH_EXP || canGetExp(10006); // 10006=除虫 + if (shouldHelp) { + let ok = 0; + for (const landId of status.needBug) { + try { await helpInsecticide(gid, [landId]); ok++; } catch (e) { /* ignore */ } + await sleep(100); + } + if (ok > 0) { actions.push(`虫${ok}`); totalActions.bug += ok; } + } + } + + if (status.needWater.length > 0) { + const shouldHelp = !HELP_ONLY_WITH_EXP || canGetExp(10007); // 10007=浇水 + if (shouldHelp) { + let ok = 0; + for (const landId of status.needWater) { + try { await helpWater(gid, [landId]); ok++; } catch (e) { /* ignore */ } + await sleep(100); + } + if (ok > 0) { actions.push(`水${ok}`); totalActions.water += ok; } + } + } + + // 偷菜: 始终执行 + if (status.stealable.length > 0) { + let ok = 0; + const stolenPlants = []; + for (let i = 0; i < status.stealable.length; i++) { + const landId = status.stealable[i]; + try { + await stealHarvest(gid, [landId]); + ok++; + if (status.stealableInfo[i]) { + stolenPlants.push(status.stealableInfo[i].name); + } + } catch (e) { /* ignore */ } + await sleep(100); + } + if (ok > 0) { + const plantNames = [...new Set(stolenPlants)].join('/'); + actions.push(`偷${ok}${plantNames ? '(' + plantNames + ')' : ''}`); + totalActions.steal += ok; + } + } + + // 捣乱操作: 放虫(10004)/放草(10003) + if (ENABLE_PUT_BAD_THINGS && status.canPutBug.length > 0 && canOperate(10004)) { + let ok = 0; + const remaining = getRemainingTimes(10004); + const toProcess = status.canPutBug.slice(0, remaining); + for (const landId of toProcess) { + if (!canOperate(10004)) break; + try { await putInsects(gid, [landId]); ok++; } catch (e) { /* ignore */ } + await sleep(100); + } + if (ok > 0) { actions.push(`放虫${ok}`); totalActions.putBug += ok; } + } + + if (ENABLE_PUT_BAD_THINGS && status.canPutWeed.length > 0 && canOperate(10003)) { + let ok = 0; + const remaining = getRemainingTimes(10003); + const toProcess = status.canPutWeed.slice(0, remaining); + for (const landId of toProcess) { + if (!canOperate(10003)) break; + try { await putWeeds(gid, [landId]); ok++; } catch (e) { /* ignore */ } + await sleep(100); + } + if (ok > 0) { actions.push(`放草${ok}`); totalActions.putWeed += ok; } + } + + if (actions.length > 0) { + log('好友', `${name}: ${actions.join('/')}`); + } + + await leaveFriendFarm(gid); +} + +// ============ 好友巡查主循环 ============ + +async function checkFriends() { + const state = getUserState(); + if (isCheckingFriends || !state.gid) return; + isCheckingFriends = true; + + // 检查是否跨日需要重置 + checkDailyReset(); + + // 经验限制状态(移到有操作时才显示) + + try { + const friendsReply = await getAllFriends(); + const friends = friendsReply.game_friends || []; + if (friends.length === 0) { log('好友', '没有好友'); return; } + + // 检查是否还有捣乱次数 (放虫/放草) + const canPutBugOrWeed = canOperate(10004) || canOperate(10003); // 10004=放虫, 10003=放草 + + // 分两类:有预览信息的优先访问,其他的放后面(用于放虫放草) + const priorityFriends = []; // 有可偷/可帮助的好友 + const otherFriends = []; // 其他好友(仅用于放虫放草) + const visitedGids = new Set(); + + for (const f of friends) { + const gid = toNum(f.gid); + if (gid === state.gid) continue; + if (visitedGids.has(gid)) continue; + const name = f.remark || f.name || `GID:${gid}`; + const p = f.plant; + + const stealNum = p ? toNum(p.steal_plant_num) : 0; + const dryNum = p ? toNum(p.dry_num) : 0; + const weedNum = p ? toNum(p.weed_num) : 0; + const insectNum = p ? toNum(p.insect_num) : 0; + + // 调试:显示指定好友的预览信息 + const showDebug = DEBUG_FRIEND_LANDS === true || DEBUG_FRIEND_LANDS === name; + if (showDebug) { + console.log(`[调试] 好友列表预览 [${name}]: steal=${stealNum} dry=${dryNum} weed=${weedNum} insect=${insectNum}`); + } + + // 只加入有预览信息的好友 + if (stealNum > 0 || dryNum > 0 || weedNum > 0 || insectNum > 0) { + priorityFriends.push({ gid, name }); + visitedGids.add(gid); + if (showDebug) { + console.log(`[调试] 好友 [${name}] 加入优先列表 (位置: ${priorityFriends.length})`); + } + } else if (ENABLE_PUT_BAD_THINGS && canPutBugOrWeed) { + // 没有预览信息但可以放虫放草(仅在开启放虫放草功能时) + otherFriends.push({ gid, name }); + visitedGids.add(gid); + } + } + + // 合并列表:优先好友在前 + const friendsToVisit = [...priorityFriends, ...otherFriends]; + + // 调试:检查目标好友位置 + if (DEBUG_FRIEND_LANDS && typeof DEBUG_FRIEND_LANDS === 'string') { + const idx = friendsToVisit.findIndex(f => f.name === DEBUG_FRIEND_LANDS); + if (idx >= 0) { + const inPriority = idx < priorityFriends.length; + console.log(`[调试] 好友 [${DEBUG_FRIEND_LANDS}] 位置: ${idx + 1}/${friendsToVisit.length} (${inPriority ? '优先列表' : '其他列表'})`); + } else { + console.log(`[调试] 好友 [${DEBUG_FRIEND_LANDS}] 不在待访问列表中!`); + } + } + + if (friendsToVisit.length === 0) { + // 无需操作时不输出日志 + return; + } + + let totalActions = { steal: 0, water: 0, weed: 0, bug: 0, putBug: 0, putWeed: 0 }; + for (let i = 0; i < friendsToVisit.length; i++) { + const friend = friendsToVisit[i]; + const showDebug = DEBUG_FRIEND_LANDS === true || DEBUG_FRIEND_LANDS === friend.name; + if (showDebug) { + console.log(`[调试] 准备访问 [${friend.name}] (${i + 1}/${friendsToVisit.length})`); + } + try { + await visitFriend(friend, totalActions, state.gid); + } catch (e) { + if (showDebug) { + console.log(`[调试] 访问 [${friend.name}] 出错: ${e.message}`); + } + } + await sleep(500); + // 如果捣乱次数用完了,且没有其他操作,可以提前结束 + if (!canOperate(10004) && !canOperate(10003)) { // 10004=放虫, 10003=放草 + // 继续巡查,但不再放虫放草 + } + } + + // 只在有操作时输出日志 + const summary = []; + if (totalActions.steal > 0) summary.push(`偷${totalActions.steal}`); + if (totalActions.weed > 0) summary.push(`除草${totalActions.weed}`); + if (totalActions.bug > 0) summary.push(`除虫${totalActions.bug}`); + if (totalActions.water > 0) summary.push(`浇水${totalActions.water}`); + if (totalActions.putBug > 0) summary.push(`放虫${totalActions.putBug}`); + if (totalActions.putWeed > 0) summary.push(`放草${totalActions.putWeed}`); + + if (summary.length > 0) { + log('好友', `巡查 ${friendsToVisit.length} 人 → ${summary.join('/')}`); + } + isFirstFriendCheck = false; + } catch (err) { + logWarn('好友', `巡查失败: ${err.message}`); + } finally { + isCheckingFriends = false; + } +} + +/** + * 好友巡查循环 - 本次完成后等待指定秒数再开始下次 + */ +async function friendCheckLoop() { + while (friendLoopRunning) { + await checkFriends(); + if (!friendLoopRunning) break; + await sleep(CONFIG.friendCheckInterval); + } +} + +function startFriendCheckLoop() { + if (friendLoopRunning) return; + friendLoopRunning = true; + + // 注册操作限制更新回调,从农场检查中获取限制信息 + setOperationLimitsCallback(updateOperationLimits); + + // 监听好友申请推送 (微信同玩) + networkEvents.on('friendApplicationReceived', onFriendApplicationReceived); + + // 延迟 5 秒后启动循环,等待登录和首次农场检查完成 + friendCheckTimer = setTimeout(() => friendCheckLoop(), 5000); + + // 启动时检查一次待处理的好友申请 + setTimeout(() => checkAndAcceptApplications(), 3000); +} + +function stopFriendCheckLoop() { + friendLoopRunning = false; + networkEvents.off('friendApplicationReceived', onFriendApplicationReceived); + if (friendCheckTimer) { clearTimeout(friendCheckTimer); friendCheckTimer = null; } +} + +// ============ 自动同意好友申请 (微信同玩) ============ + +/** + * 处理服务器推送的好友申请 + */ +function onFriendApplicationReceived(applications) { + const names = applications.map(a => a.name || `GID:${toNum(a.gid)}`).join(', '); + log('申请', `收到 ${applications.length} 个好友申请: ${names}`); + + // 自动同意 + const gids = applications.map(a => toNum(a.gid)); + acceptFriendsWithRetry(gids); +} + +/** + * 检查并同意所有待处理的好友申请 + */ +async function checkAndAcceptApplications() { + try { + const reply = await getApplications(); + const applications = reply.applications || []; + if (applications.length === 0) return; + + const names = applications.map(a => a.name || `GID:${toNum(a.gid)}`).join(', '); + log('申请', `发现 ${applications.length} 个待处理申请: ${names}`); + + const gids = applications.map(a => toNum(a.gid)); + await acceptFriendsWithRetry(gids); + } catch (e) { + // 静默失败,可能是 QQ 平台不支持 + } +} + +/** + * 同意好友申请 (带重试) + */ +async function acceptFriendsWithRetry(gids) { + if (gids.length === 0) return; + try { + const reply = await acceptFriends(gids); + const friends = reply.friends || []; + if (friends.length > 0) { + const names = friends.map(f => f.name || f.remark || `GID:${toNum(f.gid)}`).join(', '); + log('申请', `已同意 ${friends.length} 人: ${names}`); + } + } catch (e) { + logWarn('申请', `同意失败: ${e.message}`); + } +} + +module.exports = { + checkFriends, startFriendCheckLoop, stopFriendCheckLoop, + checkAndAcceptApplications, +}; diff --git a/211/server/src/gameConfig.js b/211/server/src/gameConfig.js new file mode 100644 index 0000000..1264dd7 --- /dev/null +++ b/211/server/src/gameConfig.js @@ -0,0 +1,269 @@ +/** + * 游戏配置数据模块 + * 从 gameConfig 目录加载配置数据 + */ + +const fs = require('fs'); +const path = require('path'); + +// ============ 等级经验表 ============ +let roleLevelConfig = null; +let levelExpTable = null; // 累计经验表,索引为等级 + +// ============ 植物配置 ============ +let plantConfig = null; +let plantMap = new Map(); // id -> plant +let seedToPlant = new Map(); // seed_id -> plant +let fruitToPlant = new Map(); // fruit_id -> plant (果实ID -> 植物) +let nameToPlant = new Map(); + +/** + * 加载配置文件 + */ +function loadConfigs() { + const configDir = path.join(__dirname, '..', 'gameConfig'); + + // 加载等级经验配置 + try { + const roleLevelPath = path.join(configDir, 'RoleLevel.json'); + if (fs.existsSync(roleLevelPath)) { + roleLevelConfig = JSON.parse(fs.readFileSync(roleLevelPath, 'utf8')); + // 构建累计经验表 + levelExpTable = []; + for (const item of roleLevelConfig) { + levelExpTable[item.level] = item.exp; + } + console.log(`[配置] 已加载等级经验表 (${roleLevelConfig.length} 级)`); + } + } catch (e) { + console.warn('[配置] 加载 RoleLevel.json 失败:', e.message); + } + + // 加载植物配置 + try { + const plantPath = path.join(configDir, 'Plant.json'); + if (fs.existsSync(plantPath)) { + plantConfig = JSON.parse(fs.readFileSync(plantPath, 'utf8')); + plantMap.clear(); + seedToPlant.clear(); + fruitToPlant.clear(); + nameToPlant.clear(); + for (const plant of plantConfig) { + plantMap.set(plant.id, plant); + if (plant.seed_id) { + seedToPlant.set(plant.seed_id, plant); + } + if (plant.fruit && plant.fruit.id) { + fruitToPlant.set(plant.fruit.id, plant); + } + if (plant.name) { + nameToPlant.set(plant.name, plant); + } + } + console.log(`[配置] 已加载植物配置 (${plantConfig.length} 种)`); + } + } catch (e) { + console.warn('[配置] 加载 Plant.json 失败:', e.message); + } +} + +// ============ 等级经验相关 ============ + +/** + * 获取等级经验表 + */ +function getLevelExpTable() { + return levelExpTable; +} + +/** + * 计算当前等级的经验进度 + * @param {number} level - 当前等级 + * @param {number} totalExp - 累计总经验 + * @returns {{ current: number, needed: number }} 当前等级经验进度 + */ +function getLevelExpProgress(level, totalExp) { + if (!levelExpTable || level <= 0) return { current: 0, needed: 0 }; + + const currentLevelStart = levelExpTable[level] || 0; + const nextLevelStart = levelExpTable[level + 1] || (currentLevelStart + 100000); + + const currentExp = Math.max(0, totalExp - currentLevelStart); + const neededExp = nextLevelStart - currentLevelStart; + + return { current: currentExp, needed: neededExp }; +} + +// ============ 植物配置相关 ============ + +/** + * 根据植物ID获取植物信息 + * @param {number} plantId - 植物ID + */ +function getPlantById(plantId) { + return plantMap.get(plantId); +} + +function getPlantByName(name) { + return nameToPlant.get(name); +} + +/** + * 根据种子ID获取植物信息 + * @param {number} seedId - 种子ID + */ +function getPlantBySeedId(seedId) { + return seedToPlant.get(seedId); +} + +function getSeedIdByPlantName(name) { + const plant = nameToPlant.get(name); + if (!plant) return 0; + return plant.seed_id || 0; +} + +/** + * 获取植物名称 + * @param {number} plantId - 植物ID + */ +function getPlantName(plantId) { + const plant = plantMap.get(plantId); + return plant ? plant.name : `植物${plantId}`; +} + +/** + * 根据种子ID获取植物名称 + * @param {number} seedId - 种子ID + */ +function getPlantNameBySeedId(seedId) { + const plant = seedToPlant.get(seedId); + return plant ? plant.name : `种子${seedId}`; +} + +/** + * 获取植物的果实信息 + * @param {number} plantId - 植物ID + * @returns {{ id: number, count: number, name: string } | null} + */ +function getPlantFruit(plantId) { + const plant = plantMap.get(plantId); + if (!plant || !plant.fruit) return null; + return { + id: plant.fruit.id, + count: plant.fruit.count, + name: plant.name, + }; +} + +/** + * 获取植物的生长时间(秒) + * @param {number} plantId - 植物ID + */ +function getPlantGrowTime(plantId) { + const plant = plantMap.get(plantId); + if (!plant || !plant.grow_phases) return 0; + + // 解析 "种子:30;发芽:30;成熟:0;" 格式 + const phases = plant.grow_phases.split(';').filter(p => p); + let totalSeconds = 0; + for (const phase of phases) { + const match = phase.match(/:(\d+)/); + if (match) { + totalSeconds += parseInt(match[1]); + } + } + return totalSeconds; +} + +/** + * 格式化时间 + * @param {number} seconds - 秒数 + */ +function formatGrowTime(seconds) { + if (seconds < 60) return `${seconds}秒`; + if (seconds < 3600) return `${Math.floor(seconds / 60)}分钟`; + const hours = Math.floor(seconds / 3600); + const mins = Math.floor((seconds % 3600) / 60); + return mins > 0 ? `${hours}小时${mins}分` : `${hours}小时`; +} + +/** + * 获取植物的收获经验 + * @param {number} plantId - 植物ID + */ +function getPlantExp(plantId) { + const plant = plantMap.get(plantId); + return plant ? plant.exp : 0; +} + +/** + * 根据果实ID获取植物名称 + * @param {number} fruitId - 果实ID + */ +function getFruitName(fruitId) { + const plant = fruitToPlant.get(fruitId); + return plant ? plant.name : `果实${fruitId}`; +} + +/** + * 根据果实ID获取植物信息 + * @param {number} fruitId - 果实ID + */ +function getPlantByFruitId(fruitId) { + return fruitToPlant.get(fruitId); +} + +const ITEM_NAME_MAP = { + 1001: '金币', + 1002: '点券', + 1011: '普通化肥容器', + 1012: '有机化肥容器', + 1013: '友谊果实', + 1014: '穗华', + 1015: '幸运币', + 3001: '普通收藏点', + 1101: '种植经验', + 80001: '普通(1小时)', + 80011: '有机(1小时)', + 80002: '普通(4小时)', + 80003: '普通(8小时)', + 80004: '普通(12小时)', + 80012: '有机(4小时)', + 80013: '有机(8小时)', + 80014: '有机(12小时)', + 90004: '1天狗粮', + 90005: '3天狗粮', + 100003: '化肥礼包', +}; + +function getItemNameById(id) { + const name = ITEM_NAME_MAP[id]; + if (name) return name; + return `物品${id}`; +} + +// 启动时加载配置 +loadConfigs(); + +module.exports = { + loadConfigs, + // 等级经验 + getLevelExpTable, + getLevelExpProgress, + // 植物配置 + getPlantById, + getPlantByName, + getPlantBySeedId, + getSeedIdByPlantName, + getPlantName, + getPlantNameBySeedId, + getPlantFruit, + getPlantGrowTime, + getPlantExp, + formatGrowTime, + // 果实配置 + getFruitName, + getPlantByFruitId, + // 物品配置 + getItemNameById, +}; diff --git a/211/server/src/invite.js b/211/server/src/invite.js new file mode 100644 index 0000000..0efe299 --- /dev/null +++ b/211/server/src/invite.js @@ -0,0 +1,161 @@ +/** + * 邀请码处理模块 - 读取 share.txt 并通过 ReportArkClick 申请好友 + * 注意:此功能仅在微信环境下有效 + * + * 原理: + * 1. 首次登录时,游戏会在 LoginRequest 中携带 sharer_id 和 sharer_open_id + * 2. 已登录状态下点击分享链接,游戏会发送 ReportArkClickRequest + * 3. 服务器收到后会自动向分享者发送好友申请 + * + * 我们使用 ReportArkClickRequest 来模拟已登录状态下的分享链接点击 + */ + +const fs = require('fs'); +const path = require('path'); +const { types } = require('./proto'); +const { sendMsgAsync } = require('./network'); +const { toLong, log, logWarn, sleep } = require('./utils'); +const { CONFIG } = require('./config'); + +/** + * 解析分享链接,提取 uid 和 openid + * 格式: ?uid=xxx&openid=xxx&share_source=xxx&doc_id=xxx + */ +function parseShareLink(link) { + const result = { uid: null, openid: null, shareSource: null, docId: null }; + + // 移除开头的 ? 如果有 + const queryStr = link.startsWith('?') ? link.slice(1) : link; + + // 解析参数 + const params = new URLSearchParams(queryStr); + result.uid = params.get('uid'); + result.openid = params.get('openid'); + result.shareSource = params.get('share_source'); + result.docId = params.get('doc_id'); + + return result; +} + +/** + * 读取 share.txt 文件并去重 + */ +function readShareFile() { + const shareFilePath = path.join(__dirname, '..', 'share.txt'); + + if (!fs.existsSync(shareFilePath)) { + return []; + } + + try { + const content = fs.readFileSync(shareFilePath, 'utf8'); + const lines = content.split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0 && line.includes('openid=')); + + const invites = []; + const seenUids = new Set(); // 用于去重 + + for (const line of lines) { + const parsed = parseShareLink(line); + if (parsed.openid && parsed.uid) { + // 按 uid 去重,同一个用户只处理一次 + if (!seenUids.has(parsed.uid)) { + seenUids.add(parsed.uid); + invites.push(parsed); + } + } + } + + return invites; + } catch (e) { + logWarn('邀请', `读取 share.txt 失败: ${e.message}`); + return []; + } +} + +/** + * 发送 ReportArkClick 请求 + * 模拟已登录状态下点击分享链接,触发服务器向分享者发送好友申请 + */ +async function sendReportArkClick(sharerId, sharerOpenId, shareSource) { + const body = types.ReportArkClickRequest.encode(types.ReportArkClickRequest.create({ + sharer_id: toLong(sharerId), + sharer_open_id: sharerOpenId, + share_cfg_id: toLong(shareSource || 0), + scene_id: '1256', // 模拟微信场景 + })).finish(); + + const { body: replyBody } = await sendMsgAsync('gamepb.userpb.UserService', 'ReportArkClick', body); + return types.ReportArkClickReply.decode(replyBody); +} + +// 请求间隔时间(毫秒) +const INVITE_REQUEST_DELAY = 2000; + +/** + * 处理邀请码列表 + * 仅在微信环境下执行 + */ +async function processInviteCodes() { + // 检查是否为微信环境 + if (CONFIG.platform !== 'wx') { + log('邀请', '当前为 QQ 环境,跳过邀请码处理(仅微信支持)'); + return; + } + + const invites = readShareFile(); + if (invites.length === 0) { + return; + } + + log('邀请', `读取到 ${invites.length} 个邀请码(已去重),开始逐个处理...`); + + let successCount = 0; + let failCount = 0; + + for (let i = 0; i < invites.length; i++) { + const invite = invites[i]; + + try { + // 发送 ReportArkClick 请求,模拟点击分享链接 + await sendReportArkClick(invite.uid, invite.openid, invite.shareSource); + successCount++; + log('邀请', `[${i + 1}/${invites.length}] 已向 uid=${invite.uid} 发送好友申请`); + } catch (e) { + failCount++; + logWarn('邀请', `[${i + 1}/${invites.length}] 向 uid=${invite.uid} 发送申请失败: ${e.message}`); + } + + // 每个请求之间延迟,避免请求过快被限流 + if (i < invites.length - 1) { + await sleep(INVITE_REQUEST_DELAY); + } + } + + log('邀请', `处理完成: 成功 ${successCount}, 失败 ${failCount}`); + + // 处理完成后清空文件 + clearShareFile(); +} + +/** + * 清空已处理的邀请码文件 + */ +function clearShareFile() { + const shareFilePath = path.join(__dirname, '..', 'share.txt'); + try { + fs.writeFileSync(shareFilePath, '', 'utf8'); + log('邀请', '已清空 share.txt'); + } catch (e) { + // 静默失败 + } +} + +module.exports = { + parseShareLink, + readShareFile, + sendReportArkClick, + processInviteCodes, + clearShareFile, +}; diff --git a/211/server/src/network.js b/211/server/src/network.js new file mode 100644 index 0000000..ae997b6 --- /dev/null +++ b/211/server/src/network.js @@ -0,0 +1,461 @@ +/** + * WebSocket 网络层 - 连接/消息编解码/登录/心跳 + */ + +const WebSocket = require('ws'); +const EventEmitter = require('events'); +const { CONFIG } = require('./config'); +const { types } = require('./proto'); +const { toLong, toNum, syncServerTime, log, logWarn } = require('./utils'); +const { updateStatusFromLogin, updateStatusGold, updateStatusLevel } = require('./status'); + +// ============ 事件发射器 (用于推送通知) ============ +const networkEvents = new EventEmitter(); + +// ============ 内部状态 ============ +let ws = null; +let clientSeq = 1; +let serverSeq = 0; +let heartbeatTimer = null; +let pendingCallbacks = new Map(); + +// ============ 用户状态 (登录后设置) ============ +const userState = { + gid: 0, + name: '', + level: 0, + gold: 0, + exp: 0, +}; + +function getUserState() { return userState; } + +// ============ 消息编解码 ============ +function encodeMsg(serviceName, methodName, bodyBytes) { + const msg = types.GateMessage.create({ + meta: { + service_name: serviceName, + method_name: methodName, + message_type: 1, + client_seq: toLong(clientSeq), + server_seq: toLong(serverSeq), + }, + body: bodyBytes || Buffer.alloc(0), + }); + const encoded = types.GateMessage.encode(msg).finish(); + clientSeq++; + return encoded; +} + +function sendMsg(serviceName, methodName, bodyBytes, callback) { + if (!ws || ws.readyState !== WebSocket.OPEN) { + log('WS', '连接未打开'); + return false; + } + const seq = clientSeq; + const encoded = encodeMsg(serviceName, methodName, bodyBytes); + if (callback) pendingCallbacks.set(seq, callback); + ws.send(encoded); + return true; +} + +/** Promise 版发送 */ +function sendMsgAsync(serviceName, methodName, bodyBytes, timeout = 10000) { + return new Promise((resolve, reject) => { + // 检查连接状态 + if (!ws || ws.readyState !== WebSocket.OPEN) { + reject(new Error(`连接未打开: ${methodName}`)); + return; + } + + const seq = clientSeq; + const timer = setTimeout(() => { + pendingCallbacks.delete(seq); + // 检查当前待处理的请求数 + const pending = pendingCallbacks.size; + reject(new Error(`请求超时: ${methodName} (seq=${seq}, pending=${pending})`)); + }, timeout); + + const sent = sendMsg(serviceName, methodName, bodyBytes, (err, body, meta) => { + clearTimeout(timer); + if (err) reject(err); + else resolve({ body, meta }); + }); + + if (!sent) { + clearTimeout(timer); + reject(new Error(`发送失败: ${methodName}`)); + } + }); +} + +// ============ 消息处理 ============ +function handleMessage(data) { + try { + const buf = Buffer.isBuffer(data) ? data : Buffer.from(data); + const msg = types.GateMessage.decode(buf); + const meta = msg.meta; + if (!meta) return; + + if (meta.server_seq) { + const seq = toNum(meta.server_seq); + if (seq > serverSeq) serverSeq = seq; + } + + const msgType = meta.message_type; + + // Notify + if (msgType === 3) { + handleNotify(msg); + return; + } + + // Response + if (msgType === 2) { + const errorCode = toNum(meta.error_code); + const clientSeqVal = toNum(meta.client_seq); + + const cb = pendingCallbacks.get(clientSeqVal); + if (cb) { + pendingCallbacks.delete(clientSeqVal); + if (errorCode !== 0) { + cb(new Error(`${meta.service_name}.${meta.method_name} 错误: code=${errorCode} ${meta.error_message || ''}`)); + } else { + cb(null, msg.body, meta); + } + return; + } + + if (errorCode !== 0) { + logWarn('错误', `${meta.service_name}.${meta.method_name} code=${errorCode} ${meta.error_message || ''}`); + } + } + } catch (err) { + logWarn('解码', err.message); + } +} + +// 调试:记录所有推送类型 (设为 true 可查看所有推送) +// 注意:QQ环境下只有 ItemNotify 推送,没有 LandsNotify 推送 +const DEBUG_NOTIFY = false; + +function handleNotify(msg) { + if (!msg.body || msg.body.length === 0) return; + try { + const event = types.EventMessage.decode(msg.body); + const type = event.message_type || ''; + const eventBody = event.body; + + // 调试:显示所有推送类型 + if (DEBUG_NOTIFY) { + console.log(`[DEBUG] 收到推送: ${type}`); + } + + // 被踢下线 + if (type.includes('Kickout')) { + log('推送', `被踢下线! ${type}`); + try { + const notify = types.KickoutNotify.decode(eventBody); + log('推送', `原因: ${notify.reason_message || '未知'}`); + } catch (e) { } + return; + } + + // 土地状态变化 (被放虫/放草/偷菜等) + if (type.includes('LandsNotify')) { + try { + const notify = types.LandsNotify.decode(eventBody); + const hostGid = toNum(notify.host_gid); + const lands = notify.lands || []; + if (DEBUG_NOTIFY) { + console.log(`[DEBUG] LandsNotify: hostGid=${hostGid}, myGid=${userState.gid}, lands=${lands.length}`); + } + if (lands.length > 0) { + // 如果是自己的农场,触发事件 + if (hostGid === userState.gid || hostGid === 0) { + networkEvents.emit('landsChanged', lands); + } + } + } catch (e) { } + return; + } + + // 物品变化通知 (经验/金币等) - 仅更新状态栏 + // 金币: id=1 或 id=1001 (GodItemId) + // 经验: id=1101 (ExpItemId) 或 id=2 + if (type.includes('ItemNotify')) { + try { + const notify = types.ItemNotify.decode(eventBody); + const items = notify.items || []; + for (const itemChg of items) { + const item = itemChg.item; + if (!item) continue; + const id = toNum(item.id); + const count = toNum(item.count); + + if (id === 1101 || id === 2) { + userState.exp = count; + updateStatusLevel(userState.level, count); + } else if (id === 1 || id === 1001) { + userState.gold = count; + updateStatusGold(count); + } + } + } catch (e) { } + return; + } + + // 基本信息变化 (升级等) + if (type.includes('BasicNotify')) { + try { + const notify = types.BasicNotify.decode(eventBody); + if (notify.basic) { + const oldLevel = userState.level; + const oldExp = userState.exp || 0; + userState.level = toNum(notify.basic.level) || userState.level; + userState.gold = toNum(notify.basic.gold) || userState.gold; + const exp = toNum(notify.basic.exp); + if (exp > 0) { + userState.exp = exp; + updateStatusLevel(userState.level, exp); + } + updateStatusGold(userState.gold); + // 升级提示 + if (userState.level !== oldLevel) { + log('系统', `升级! Lv${oldLevel} → Lv${userState.level}`); + } + } + } catch (e) { } + return; + } + + // 好友申请通知 (微信同玩) + if (type.includes('FriendApplicationReceivedNotify')) { + try { + const notify = types.FriendApplicationReceivedNotify.decode(eventBody); + const applications = notify.applications || []; + if (applications.length > 0) { + networkEvents.emit('friendApplicationReceived', applications); + } + } catch (e) { } + return; + } + + // 好友添加成功通知 + if (type.includes('FriendAddedNotify')) { + try { + const notify = types.FriendAddedNotify.decode(eventBody); + const friends = notify.friends || []; + if (friends.length > 0) { + const names = friends.map(f => f.name || f.remark || `GID:${toNum(f.gid)}`).join(', '); + log('好友', `新好友: ${names}`); + } + } catch (e) { } + return; + } + + // 物品变化通知 (收获/购买/消耗等) + if (type.includes('ItemNotify')) { + try { + const notify = types.ItemNotify.decode(eventBody); + const items = notify.items || []; + for (const chg of items) { + if (!chg.item) continue; + const id = toNum(chg.item.id); + const count = toNum(chg.item.count); + const delta = toNum(chg.delta); + // 金币 ID=1 + if (id === 1) { + userState.gold = count; + updateStatusGold(count); + if (delta !== 0) { + log('物品', `金币 ${delta > 0 ? '+' : ''}${delta} (当前: ${count})`); + } + } + // 经验 ID=2 (升级由 BasicNotify 处理) + } + } catch (e) { } + return; + } + + // 商品解锁通知 (升级后解锁新种子等) + if (type.includes('GoodsUnlockNotify')) { + try { + const notify = types.GoodsUnlockNotify.decode(eventBody); + const goods = notify.goods_list || []; + if (goods.length > 0) { + log('商店', `解锁 ${goods.length} 个新商品!`); + } + } catch (e) { } + return; + } + + // 任务状态变化通知 + if (type.includes('TaskInfoNotify')) { + try { + const notify = types.TaskInfoNotify.decode(eventBody); + if (notify.task_info) { + networkEvents.emit('taskInfoNotify', notify.task_info); + } + } catch (e) { } + return; + } + + // 其他未处理的推送类型 (调试用) + // log('推送', `未处理类型: ${type}`); + } catch (e) { + logWarn('推送', `解码失败: ${e.message}`); + } +} + +// ============ 登录 ============ +function sendLogin(onLoginSuccess) { + const body = types.LoginRequest.encode(types.LoginRequest.create({ + sharer_id: toLong(0), + sharer_open_id: '', + device_info: { + client_version: CONFIG.clientVersion, + sys_software: 'iOS 26.2.1', + network: 'wifi', + memory: '7672', + device_id: 'iPhone X', + }, + share_cfg_id: toLong(0), + scene_id: '1256', + report_data: { + callback: '', cd_extend_info: '', click_id: '', clue_token: '', + minigame_channel: 'other', minigame_platid: 2, req_id: '', trackid: '', + }, + })).finish(); + + sendMsg('gamepb.userpb.UserService', 'Login', body, (err, bodyBytes, meta) => { + if (err) { + log('登录', `失败: ${err.message}`); + return; + } + try { + const reply = types.LoginReply.decode(bodyBytes); + if (reply.basic) { + userState.gid = toNum(reply.basic.gid); + userState.name = reply.basic.name || '未知'; + userState.level = toNum(reply.basic.level); + userState.gold = toNum(reply.basic.gold); + userState.exp = toNum(reply.basic.exp); + + // 更新状态栏 + updateStatusFromLogin({ + name: userState.name, + level: userState.level, + gold: userState.gold, + exp: userState.exp, + }); + + console.log(''); + console.log('========== 登录成功 =========='); + console.log(` GID: ${userState.gid}`); + console.log(` 昵称: ${userState.name}`); + console.log(` 等级: ${userState.level}`); + console.log(` 金币: ${userState.gold}`); + if (reply.time_now_millis) { + syncServerTime(toNum(reply.time_now_millis)); + console.log(` 时间: ${new Date(toNum(reply.time_now_millis)).toLocaleString()}`); + } + console.log('==============================='); + console.log(''); + } + + startHeartbeat(); + if (onLoginSuccess) onLoginSuccess(); + } catch (e) { + log('登录', `解码失败: ${e.message}`); + } + }); +} + +// ============ 心跳 ============ +let lastHeartbeatResponse = Date.now(); +let heartbeatMissCount = 0; + +function startHeartbeat() { + if (heartbeatTimer) clearInterval(heartbeatTimer); + lastHeartbeatResponse = Date.now(); + heartbeatMissCount = 0; + + heartbeatTimer = setInterval(() => { + if (!userState.gid) return; + + // 检查上次心跳响应时间,超过 60 秒没响应说明连接有问题 + const timeSinceLastResponse = Date.now() - lastHeartbeatResponse; + if (timeSinceLastResponse > 60000) { + heartbeatMissCount++; + logWarn('心跳', `连接可能已断开 (${Math.round(timeSinceLastResponse/1000)}s 无响应, pending=${pendingCallbacks.size})`); + if (heartbeatMissCount >= 2) { + log('心跳', '尝试重连...'); + // 清理待处理的回调,避免堆积 + pendingCallbacks.forEach((cb, seq) => { + try { cb(new Error('连接超时,已清理')); } catch (e) {} + }); + pendingCallbacks.clear(); + } + } + + const body = types.HeartbeatRequest.encode(types.HeartbeatRequest.create({ + gid: toLong(userState.gid), + client_version: CONFIG.clientVersion, + })).finish(); + sendMsg('gamepb.userpb.UserService', 'Heartbeat', body, (err, replyBody) => { + if (err || !replyBody) return; + lastHeartbeatResponse = Date.now(); + heartbeatMissCount = 0; + try { + const reply = types.HeartbeatReply.decode(replyBody); + if (reply.server_time) syncServerTime(toNum(reply.server_time)); + } catch (e) { } + }); + }, CONFIG.heartbeatInterval); +} + +// ============ WebSocket 连接 ============ +function connect(code, onLoginSuccess) { + const url = `${CONFIG.serverUrl}?platform=${CONFIG.platform}&os=${CONFIG.os}&ver=${CONFIG.clientVersion}&code=${code}&openID=`; + + ws = new WebSocket(url, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13)', + 'Origin': 'https://gate-obt.nqf.qq.com', + }, + }); + + ws.binaryType = 'arraybuffer'; + + ws.on('open', () => { + sendLogin(onLoginSuccess); + }); + + ws.on('message', (data) => { + handleMessage(Buffer.isBuffer(data) ? data : Buffer.from(data)); + }); + + ws.on('close', (code, reason) => { + console.log(`[WS] 连接关闭 (code=${code})`); + cleanup(); + }); + + ws.on('error', (err) => { + logWarn('WS', `错误: ${err.message}`); + }); +} + +function cleanup() { + if (heartbeatTimer) { clearInterval(heartbeatTimer); heartbeatTimer = null; } + pendingCallbacks.clear(); +} + +function getWs() { return ws; } + +module.exports = { + connect, cleanup, getWs, + sendMsg, sendMsgAsync, + getUserState, + networkEvents, +}; diff --git a/211/server/src/proto.js b/211/server/src/proto.js new file mode 100644 index 0000000..7c7109f --- /dev/null +++ b/211/server/src/proto.js @@ -0,0 +1,121 @@ +/** + * Proto 加载与消息类型管理 + */ + +const protobuf = require('protobufjs'); +const path = require('path'); +const { log } = require('./utils'); + +// Proto 根对象与所有消息类型 +let root = null; +const types = {}; + +async function loadProto() { + const protoDir = path.join(__dirname, '..', 'proto'); + root = new protobuf.Root(); + await root.load([ + path.join(protoDir, 'game.proto'), + path.join(protoDir, 'userpb.proto'), + path.join(protoDir, 'plantpb.proto'), + path.join(protoDir, 'corepb.proto'), + path.join(protoDir, 'shoppb.proto'), + path.join(protoDir, 'friendpb.proto'), + path.join(protoDir, 'visitpb.proto'), + path.join(protoDir, 'notifypb.proto'), + path.join(protoDir, 'taskpb.proto'), + path.join(protoDir, 'itempb.proto'), + ], { keepCase: true }); + + // 网关 + types.GateMessage = root.lookupType('gatepb.Message'); + types.GateMeta = root.lookupType('gatepb.Meta'); + types.EventMessage = root.lookupType('gatepb.EventMessage'); + + // 用户 + types.LoginRequest = root.lookupType('gamepb.userpb.LoginRequest'); + types.LoginReply = root.lookupType('gamepb.userpb.LoginReply'); + types.HeartbeatRequest = root.lookupType('gamepb.userpb.HeartbeatRequest'); + types.HeartbeatReply = root.lookupType('gamepb.userpb.HeartbeatReply'); + types.ReportArkClickRequest = root.lookupType('gamepb.userpb.ReportArkClickRequest'); + types.ReportArkClickReply = root.lookupType('gamepb.userpb.ReportArkClickReply'); + + // 农场 + types.AllLandsRequest = root.lookupType('gamepb.plantpb.AllLandsRequest'); + types.AllLandsReply = root.lookupType('gamepb.plantpb.AllLandsReply'); + types.HarvestRequest = root.lookupType('gamepb.plantpb.HarvestRequest'); + types.HarvestReply = root.lookupType('gamepb.plantpb.HarvestReply'); + types.WaterLandRequest = root.lookupType('gamepb.plantpb.WaterLandRequest'); + types.WaterLandReply = root.lookupType('gamepb.plantpb.WaterLandReply'); + types.WeedOutRequest = root.lookupType('gamepb.plantpb.WeedOutRequest'); + types.WeedOutReply = root.lookupType('gamepb.plantpb.WeedOutReply'); + types.InsecticideRequest = root.lookupType('gamepb.plantpb.InsecticideRequest'); + types.InsecticideReply = root.lookupType('gamepb.plantpb.InsecticideReply'); + types.RemovePlantRequest = root.lookupType('gamepb.plantpb.RemovePlantRequest'); + types.RemovePlantReply = root.lookupType('gamepb.plantpb.RemovePlantReply'); + types.PutInsectsRequest = root.lookupType('gamepb.plantpb.PutInsectsRequest'); + types.PutInsectsReply = root.lookupType('gamepb.plantpb.PutInsectsReply'); + types.PutWeedsRequest = root.lookupType('gamepb.plantpb.PutWeedsRequest'); + types.PutWeedsReply = root.lookupType('gamepb.plantpb.PutWeedsReply'); + types.FertilizeRequest = root.lookupType('gamepb.plantpb.FertilizeRequest'); + types.FertilizeReply = root.lookupType('gamepb.plantpb.FertilizeReply'); + + // 背包/仓库 + types.BagRequest = root.lookupType('gamepb.itempb.BagRequest'); + types.BagReply = root.lookupType('gamepb.itempb.BagReply'); + types.SellRequest = root.lookupType('gamepb.itempb.SellRequest'); + types.SellReply = root.lookupType('gamepb.itempb.SellReply'); + types.UseRequest = root.lookupType('gamepb.itempb.UseRequest'); + types.UseReply = root.lookupType('gamepb.itempb.UseReply'); + types.BatchUseRequest = root.lookupType('gamepb.itempb.BatchUseRequest'); + types.BatchUseReply = root.lookupType('gamepb.itempb.BatchUseReply'); + types.PlantRequest = root.lookupType('gamepb.plantpb.PlantRequest'); + types.PlantReply = root.lookupType('gamepb.plantpb.PlantReply'); + + // 商店 + types.ShopProfilesRequest = root.lookupType('gamepb.shoppb.ShopProfilesRequest'); + types.ShopProfilesReply = root.lookupType('gamepb.shoppb.ShopProfilesReply'); + types.ShopInfoRequest = root.lookupType('gamepb.shoppb.ShopInfoRequest'); + types.ShopInfoReply = root.lookupType('gamepb.shoppb.ShopInfoReply'); + types.BuyGoodsRequest = root.lookupType('gamepb.shoppb.BuyGoodsRequest'); + types.BuyGoodsReply = root.lookupType('gamepb.shoppb.BuyGoodsReply'); + + // 好友 + types.GetAllFriendsRequest = root.lookupType('gamepb.friendpb.GetAllRequest'); + types.GetAllFriendsReply = root.lookupType('gamepb.friendpb.GetAllReply'); + types.GetApplicationsRequest = root.lookupType('gamepb.friendpb.GetApplicationsRequest'); + types.GetApplicationsReply = root.lookupType('gamepb.friendpb.GetApplicationsReply'); + types.AcceptFriendsRequest = root.lookupType('gamepb.friendpb.AcceptFriendsRequest'); + types.AcceptFriendsReply = root.lookupType('gamepb.friendpb.AcceptFriendsReply'); + + // 访问 + types.VisitEnterRequest = root.lookupType('gamepb.visitpb.EnterRequest'); + types.VisitEnterReply = root.lookupType('gamepb.visitpb.EnterReply'); + types.VisitLeaveRequest = root.lookupType('gamepb.visitpb.LeaveRequest'); + types.VisitLeaveReply = root.lookupType('gamepb.visitpb.LeaveReply'); + + // 任务 + types.TaskInfoRequest = root.lookupType('gamepb.taskpb.TaskInfoRequest'); + types.TaskInfoReply = root.lookupType('gamepb.taskpb.TaskInfoReply'); + types.ClaimTaskRewardRequest = root.lookupType('gamepb.taskpb.ClaimTaskRewardRequest'); + types.ClaimTaskRewardReply = root.lookupType('gamepb.taskpb.ClaimTaskRewardReply'); + types.BatchClaimTaskRewardRequest = root.lookupType('gamepb.taskpb.BatchClaimTaskRewardRequest'); + types.BatchClaimTaskRewardReply = root.lookupType('gamepb.taskpb.BatchClaimTaskRewardReply'); + + // 服务器推送通知 + types.LandsNotify = root.lookupType('gamepb.plantpb.LandsNotify'); + types.BasicNotify = root.lookupType('gamepb.userpb.BasicNotify'); + types.KickoutNotify = root.lookupType('gatepb.KickoutNotify'); + types.FriendApplicationReceivedNotify = root.lookupType('gamepb.friendpb.FriendApplicationReceivedNotify'); + types.FriendAddedNotify = root.lookupType('gamepb.friendpb.FriendAddedNotify'); + types.ItemNotify = root.lookupType('gamepb.itempb.ItemNotify'); + types.GoodsUnlockNotify = root.lookupType('gamepb.shoppb.GoodsUnlockNotify'); + types.TaskInfoNotify = root.lookupType('gamepb.taskpb.TaskInfoNotify'); + + // Proto 加载完成 +} + +function getRoot() { + return root; +} + +module.exports = { loadProto, types, getRoot }; diff --git a/211/server/src/qrlib/session.js b/211/server/src/qrlib/session.js new file mode 100644 index 0000000..0746d57 --- /dev/null +++ b/211/server/src/qrlib/session.js @@ -0,0 +1,314 @@ +const axios = require('axios'); +const { CookieUtils, HashUtils } = require('./utils'); + +// User Agent Definition +const ChromeUA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; + +class QRLoginSession { + /** + * Presets for different login targets + */ + static Presets = { + vip: { + name: 'QQ会员 (VIP)', + description: 'QQ会员官网', + aid: '8000201', + daid: '18', + redirectUri: 'https://vip.qq.com/loginsuccess.html', + referrer: 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=8000201&style=20&s_url=https%3A%2F%2Fvip.qq.com%2Floginsuccess.html&maskOpacity=60&daid=18&target=self', + }, + qzone: { + name: 'QQ空间 (QZone)', + description: 'QQ空间网页版', + aid: '549000912', + daid: '5', + redirectUri: 'https://qzs.qzone.qq.com/qzone/v5/loginsucc.html?para=izone', + referrer: 'https://qzone.qq.com/', + }, + music: { + name: 'QQ音乐 (Music)', + description: 'QQ音乐网页版', + aid: '716027609', + daid: '383', + redirectUri: 'https://y.qq.com/portal/wx_redirect.html?login_type=1&surl=https%3A%2F%2Fy.qq.com%2F', + ptThirdAid: '100497308', + responseType: 'code', + openapi: '1010_1030', + }, + wegame: { + name: 'WeGame', + description: 'WeGame 平台', + aid: '1600001063', + daid: '733', + redirectUri: 'https://www.wegame.com.cn/middle/login/third_callback.html', + referrer: 'https://www.wegame.com.cn/', + }, + val: { + name: '瓦罗兰特 (VAL)', + description: '无畏契约官网', + aid: '716027609', + daid: '383', + redirectUri: 'https://val.qq.com/comm-htdocs/login/qc_redirect.html?parent_domain=https%3A%2F%2Fval.qq.com&isMiloSDK=1&isPc=1', + ptThirdAid: '102059301', + responseType: 'code', + openapi: '1010_1030', + }, + }; + + /** + * Request a new QR Code + * @param {string} presetKey - The key of the preset to use (vip, qzone, etc) + */ + static async requestQRCode(presetKey) { + const config = this.Presets[presetKey] || this.Presets.vip; + + const params = new URLSearchParams({ + appid: config.aid, + e: '2', + l: 'M', + s: '3', + d: '72', + v: '4', + t: String(Math.random()), + daid: config.daid, + }); + + if (config.ptThirdAid) { + params.set('pt_3rd_aid', config.ptThirdAid); + params.set('u1', 'https://graph.qq.com/oauth2.0/login_jump'); + } else { + params.set('u1', config.redirectUri); + } + + const url = `https://ssl.ptlogin2.qq.com/ptqrshow?${params.toString()}`; + + try { + const response = await axios.get(url, { + responseType: 'arraybuffer', + headers: { + 'Referer': config.referrer || `https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=${config.aid}&style=20&s_url=${encodeURIComponent(config.redirectUri)}&maskOpacity=60&daid=${config.daid}&target=self`, + 'User-Agent': ChromeUA, + } + }); + + const setCookie = response.headers['set-cookie']; + const qrsig = CookieUtils.getValue(setCookie, 'qrsig'); + const qrcodeBase64 = Buffer.from(response.data).toString('base64'); + + return { qrsig, qrcode: `data:image/png;base64,${qrcodeBase64}`, url }; + } catch (error) { + console.error('Request QRCode Error:', error); + throw error; + } + } + + /** + * Check the status of the QR Code + * @param {string} qrsig + * @param {string} presetKey + */ + static async checkStatus(qrsig, presetKey) { + const config = this.Presets[presetKey] || this.Presets.vip; + const ptqrtoken = HashUtils.hash(qrsig); + + const params = new URLSearchParams({ + ptqrtoken: String(ptqrtoken), + from_ui: '1', + aid: config.aid, + daid: config.daid, + action: `0-0-${Date.now()}`, // Added timestamp + pt_uistyle: '40', + js_ver: '21020514', + js_type: '1' + }); + + if (config.ptThirdAid) { + params.set('pt_3rd_aid', config.ptThirdAid); + params.set('u1', 'https://graph.qq.com/oauth2.0/login_jump'); + } else { + params.set('u1', config.redirectUri); + } + + const api = `https://ssl.ptlogin2.qq.com/ptqrlogin?${params.toString()}`; + + try { + const response = await axios.get(api, { + headers: { + 'Cookie': `qrsig=${qrsig}`, + 'Referer': config.referrer || 'https://xui.ptlogin2.qq.com/', + 'User-Agent': ChromeUA, + }, + }); + + const text = response.data; + // Parse response: ptuiCB('66','0','','0','二维码未失效。(3776510309)', '') + // Robust parsing using Regex to handle commas in content + const matcher = /ptuiCB\((.+)\)/; + const match = text.match(matcher); + + if (!match) { + throw new Error('Invalid response format'); + } + + // Extract arguments: 'arg1', 'arg2', ... + // This regex matches single-quoted strings: '([^']*)' + const args = []; + const argMatcher = /'([^']*)'/g; + let argMatch; + while ((argMatch = argMatcher.exec(match[1])) !== null) { + args.push(argMatch[1]); + } + + const [ret, extret, jumpUrl, redirect, msg, nickname] = args; + + return { + ret, + msg, + nickname, + jumpUrl, + cookie: response.headers['set-cookie'] // Return cookies to frontend if success + }; + + } catch (error) { + console.error('Check Status Error:', error); + throw new Error('Check status failed'); + } + } + + /** + * Get final cookies from the successful jump URL + * @param {string} jumpUrl + */ + static async getFinalCookies(jumpUrl) { + try { + // Prevent auto redirect to capture cookies + const response = await axios.get(jumpUrl, { + maxRedirects: 0, + validateStatus: status => status >= 200 && status < 400, + headers: { + 'User-Agent': ChromeUA + } + }); + + // This might return 302 Found + return response.headers['set-cookie']; + } catch (error) { + console.error("Get Final Cookies Error", error); + return []; + } + } +} + +class MiniProgramLoginSession { + static QUA = 'V1_HT5_QDT_0.70.2209190_x64_0_DEV_D'; + + /** + * Mini Program Presets + */ + static Presets = { + miniprogram: { + name: '小程序开发 (DevTools)', + description: 'QQ小程序开发者工具', + appid: '' // User provided + }, + farm: { + name: 'QQ经典农场 (Farm)', + description: 'QQ经典农场小程序', + appid: '1112386029' + } + }; + + static getHeaders() { + return { + 'qua': MiniProgramLoginSession.QUA, + 'host': 'q.qq.com', + 'accept': 'application/json', + 'content-type': 'application/json', + 'user-agent': ChromeUA + }; + } + + /** + * Request Login Code (for Mini Program DevTools) + */ + static async requestLoginCode() { + try { + const response = await axios.get('https://q.qq.com/ide/devtoolAuth/GetLoginCode', { + headers: this.getHeaders() + }); + + const { code, data } = response.data; + + if (+code !== 0) { + throw new Error('获取登录码失败'); + } + + return { + code: data.code || '', + url: `https://h5.qzone.qq.com/qqq/code/${data.code}?_proxy=1&from=ide` + }; + } catch (error) { + console.error('MP Request Login Code Error:', error); + throw error; + } + } + + /** + * Query Status for Mini Program Login + * @param {string} code + */ + static async queryStatus(code) { + try { + const response = await axios.get(`https://q.qq.com/ide/devtoolAuth/syncScanSateGetTicket?code=${code}`, { + headers: this.getHeaders() + }); + + // If response is not OK (e.g. 404/500), return Error + if (response.status !== 200) { + return { status: 'Error' }; + } + + const { code: resCode, data } = response.data; + + if (+resCode === 0) { + // data.ok: 1 = Success, 0 = Waiting/Scanning? + if (+data.ok !== 1) return { status: 'Wait' }; + // User says uin is here + return { status: 'OK', ticket: data.ticket, uin: data.uin }; + } + + if (+resCode === -10003) return { status: 'Used' }; + + return { status: 'Error', msg: `Code: ${resCode}` }; + } catch (error) { + console.error('MP Query Status Error:', error); + throw error; + } + } + + /** + * Get Auth Code (Final step for MP login) + * @param {string} ticket + * @param {string} appid + */ + static async getAuthCode(ticket, appid) { + try { + const response = await axios.post('https://q.qq.com/ide/login', { + appid: appid, + ticket: ticket + }, { + headers: this.getHeaders() + }); + + if (response.status !== 200) return ''; + + const { code } = response.data; + return code || ''; + } catch (error) { + console.error('MP Get Auth Code Error:', error); + return ''; + } + } +} + +module.exports = { QRLoginSession, MiniProgramLoginSession }; diff --git a/211/server/src/qrlib/utils.js b/211/server/src/qrlib/utils.js new file mode 100644 index 0000000..0a49c94 --- /dev/null +++ b/211/server/src/qrlib/utils.js @@ -0,0 +1,52 @@ +const axios = require('axios'); + +/** + * Cookie handling utilities + */ +class CookieUtils { + static parse(cookieStr) { + if (!cookieStr) return {}; + return cookieStr.split(';').reduce((acc, curr) => { + const [key, value] = curr.split('='); + if (key) acc[key.trim()] = value ? value.trim() : ''; + return acc; + }, {}); + } + + static getValue(cookies, key) { + if (!cookies) return null; + if (Array.isArray(cookies)) cookies = cookies.join('; '); + const match = cookies.match(new RegExp(`(?:^|;\\s*)${key}=([^;]*)`)); + return match ? match[1] : null; + } + + static getUin(cookies) { + const uin = this.getValue(cookies, 'wxuin') || this.getValue(cookies, 'uin') || this.getValue(cookies, 'ptui_loginuin'); + if (!uin) return null; + // Remove leading 'o' if present (common in QQ cookies like 'o123456') + return uin.replace(/^o0*/, ''); + } +} + +/** + * Hashing utilities for QQ login + */ +class HashUtils { + static hash(str) { + let hash = 0; + for (let i = 0; i < str.length; i++) { + hash += (hash << 5) + str.charCodeAt(i); + } + return 2147483647 & hash; + } + + static getGTk(pskey) { + let gtk = 5381; + for (let i = 0; i < pskey.length; i++) { + gtk += (gtk << 5) + pskey.charCodeAt(i); + } + return gtk & 0x7fffffff; + } +} + +module.exports = { CookieUtils, HashUtils }; diff --git a/211/server/src/status.js b/211/server/src/status.js new file mode 100644 index 0000000..3e780e4 --- /dev/null +++ b/211/server/src/status.js @@ -0,0 +1,193 @@ +/** + * 状态栏 - 在终端固定位置显示用户状态 + */ + +const { getLevelExpTable, getLevelExpProgress } = require('./gameConfig'); + +// ============ 状态数据 ============ +const statusData = { + platform: 'qq', + name: '', + level: 0, + gold: 0, + exp: 0, +}; + +// ============ 状态栏高度 ============ +const STATUS_LINES = 3; // 状态栏占用行数 +const FREE_PROJECT_TIP = '本程序免费开源,GitHub: https://github.com/linguo2625469/qq-farm-bot'; + +// ============ ANSI 转义码 ============ +const ESC = '\x1b'; +const SAVE_CURSOR = `${ESC}7`; +const RESTORE_CURSOR = `${ESC}8`; +const MOVE_TO = (row, col) => `${ESC}[${row};${col}H`; +const CLEAR_LINE = `${ESC}[2K`; +const SCROLL_REGION = (top, bottom) => `${ESC}[${top};${bottom}r`; +const RESET_SCROLL = `${ESC}[r`; +const BOLD = `${ESC}[1m`; +const RESET = `${ESC}[0m`; +const DIM = `${ESC}[2m`; +const CYAN = `${ESC}[36m`; +const YELLOW = `${ESC}[33m`; +const GREEN = `${ESC}[32m`; +const MAGENTA = `${ESC}[35m`; + +// ============ 状态栏是否启用 ============ +let statusEnabled = false; +let termRows = 24; + +/** + * 初始化状态栏 + */ +function initStatusBar() { + // 检测终端是否支持 + if (!process.stdout.isTTY) { + return false; + } + + termRows = process.stdout.rows || 24; + statusEnabled = true; + + // 设置滚动区域,留出顶部状态栏空间 + process.stdout.write(SCROLL_REGION(STATUS_LINES + 1, termRows)); + // 移动光标到滚动区域 + process.stdout.write(MOVE_TO(STATUS_LINES + 1, 1)); + + // 监听终端大小变化 + process.stdout.on('resize', () => { + termRows = process.stdout.rows || 24; + process.stdout.write(SCROLL_REGION(STATUS_LINES + 1, termRows)); + renderStatusBar(); + }); + + // 初始渲染 + renderStatusBar(); + return true; +} + +/** + * 清理状态栏(退出时调用) + */ +function cleanupStatusBar() { + if (!statusEnabled) return; + statusEnabled = false; + // 重置滚动区域 + process.stdout.write(RESET_SCROLL); + // 清除状态栏 + process.stdout.write(MOVE_TO(1, 1) + CLEAR_LINE); + process.stdout.write(MOVE_TO(2, 1) + CLEAR_LINE); + process.stdout.write(MOVE_TO(3, 1) + CLEAR_LINE); +} + +/** + * 渲染状态栏 + */ +function renderStatusBar() { + if (!statusEnabled) return; + + const { platform, name, level, gold, exp } = statusData; + + // 构建状态行 + const platformStr = platform === 'wx' ? `${MAGENTA}微信${RESET}` : `${CYAN}QQ${RESET}`; + const nameStr = name ? `${BOLD}${name}${RESET}` : '未登录'; + const levelStr = `${GREEN}Lv${level}${RESET}`; + const goldStr = `${YELLOW}金币:${gold}${RESET}`; + + // 显示经验值 + let expStr = ''; + if (level > 0 && exp >= 0) { + const levelExpTable = getLevelExpTable(); + if (levelExpTable) { + // 有配置表时显示当前等级进度 + const progress = getLevelExpProgress(level, exp); + expStr = `${DIM}经验:${progress.current}/${progress.needed}${RESET}`; + } else { + // 没有配置表时只显示累计经验 + expStr = `${DIM}经验:${exp}${RESET}`; + } + } + + // 第一行:平台 | 昵称 | 等级 | 金币 | 经验 + const line1 = `${platformStr} | ${nameStr} | ${levelStr} | ${goldStr}${expStr ? ' | ' + expStr : ''}`; + + // 第二行:固定提醒 + const line2 = `${DIM}${FREE_PROJECT_TIP}${RESET}`; + + // 第三行:分隔线 + const width = process.stdout.columns || 80; + const line3 = `${DIM}${'─'.repeat(Math.min(width, 80))}${RESET}`; + + // 保存光标位置 + process.stdout.write(SAVE_CURSOR); + // 移动到第一行并清除 + process.stdout.write(MOVE_TO(1, 1) + CLEAR_LINE + line1); + // 移动到第二行并清除 + process.stdout.write(MOVE_TO(2, 1) + CLEAR_LINE + line2); + // 移动到第三行并清除 + process.stdout.write(MOVE_TO(3, 1) + CLEAR_LINE + line3); + // 恢复光标位置 + process.stdout.write(RESTORE_CURSOR); +} + +/** + * 更新状态数据并刷新显示 + */ +function updateStatus(data) { + let changed = false; + for (const key of Object.keys(data)) { + if (statusData[key] !== data[key]) { + statusData[key] = data[key]; + changed = true; + } + } + if (changed && statusEnabled) { + renderStatusBar(); + } +} + +/** + * 设置平台 + */ +function setStatusPlatform(platform) { + updateStatus({ platform }); +} + +/** + * 从登录数据更新状态 + */ +function updateStatusFromLogin(basic) { + updateStatus({ + name: basic.name || statusData.name, + level: basic.level || statusData.level, + gold: basic.gold || statusData.gold, + exp: basic.exp || statusData.exp, + }); +} + +/** + * 更新金币 + */ +function updateStatusGold(gold) { + updateStatus({ gold }); +} + +/** + * 更新等级和经验 + */ +function updateStatusLevel(level, exp) { + const data = { level }; + if (exp !== undefined) data.exp = exp; + updateStatus(data); +} + +module.exports = { + initStatusBar, + cleanupStatusBar, + updateStatus, + setStatusPlatform, + updateStatusFromLogin, + updateStatusGold, + updateStatusLevel, + statusData, +}; diff --git a/211/server/src/task.js b/211/server/src/task.js new file mode 100644 index 0000000..5b21525 --- /dev/null +++ b/211/server/src/task.js @@ -0,0 +1,181 @@ +/** + * 任务系统 - 自动领取任务奖励 + */ + +const { types } = require('./proto'); +const { sendMsgAsync, networkEvents } = require('./network'); +const { toLong, toNum, log, logWarn, sleep } = require('./utils'); + +// ============ 任务 API ============ + +async function getTaskInfo() { + const body = types.TaskInfoRequest.encode(types.TaskInfoRequest.create({})).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.taskpb.TaskService', 'TaskInfo', body); + return types.TaskInfoReply.decode(replyBody); +} + +async function claimTaskReward(taskId, doShared = false) { + const body = types.ClaimTaskRewardRequest.encode(types.ClaimTaskRewardRequest.create({ + id: toLong(taskId), + do_shared: doShared, + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.taskpb.TaskService', 'ClaimTaskReward', body); + return types.ClaimTaskRewardReply.decode(replyBody); +} + +async function batchClaimTaskReward(taskIds, doShared = false) { + const body = types.BatchClaimTaskRewardRequest.encode(types.BatchClaimTaskRewardRequest.create({ + ids: taskIds.map(id => toLong(id)), + do_shared: doShared, + })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.taskpb.TaskService', 'BatchClaimTaskReward', body); + return types.BatchClaimTaskRewardReply.decode(replyBody); +} + +// ============ 任务分析 ============ + +/** + * 分析任务列表,找出可领取的任务 + */ +function analyzeTaskList(tasks) { + const claimable = []; + for (const task of tasks) { + const id = toNum(task.id); + const progress = toNum(task.progress); + const totalProgress = toNum(task.total_progress); + const isClaimed = task.is_claimed; + const isUnlocked = task.is_unlocked; + const shareMultiple = toNum(task.share_multiple); + + // 可领取条件: 已解锁 + 未领取 + 进度完成 + if (isUnlocked && !isClaimed && progress >= totalProgress && totalProgress > 0) { + claimable.push({ + id, + desc: task.desc || `任务#${id}`, + shareMultiple, + rewards: task.rewards || [], + }); + } + } + return claimable; +} + +/** + * 计算奖励摘要 + */ +function getRewardSummary(items) { + const summary = []; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + // 常见物品ID: 1=金币, 2=经验 + if (id === 1) summary.push(`金币${count}`); + else if (id === 2) summary.push(`经验${count}`); + else summary.push(`物品#${id}x${count}`); + } + return summary.join('/'); +} + +// ============ 自动领取 ============ + +/** + * 检查并领取所有可领取的任务奖励 + */ +async function checkAndClaimTasks() { + try { + const reply = await getTaskInfo(); + if (!reply.task_info) return; + + const taskInfo = reply.task_info; + const allTasks = [ + ...(taskInfo.growth_tasks || []), + ...(taskInfo.daily_tasks || []), + ...(taskInfo.tasks || []), + ]; + + const claimable = analyzeTaskList(allTasks); + if (claimable.length === 0) return; + + log('任务', `发现 ${claimable.length} 个可领取任务`); + + for (const task of claimable) { + try { + // 如果有分享翻倍,使用翻倍领取 + const useShare = task.shareMultiple > 1; + const multipleStr = useShare ? ` (${task.shareMultiple}倍)` : ''; + + const claimReply = await claimTaskReward(task.id, useShare); + const items = claimReply.items || []; + const rewardStr = items.length > 0 ? getRewardSummary(items) : '无'; + + log('任务', `领取: ${task.desc}${multipleStr} → ${rewardStr}`); + await sleep(300); + } catch (e) { + logWarn('任务', `领取失败 #${task.id}: ${e.message}`); + } + } + } catch (e) { + // 静默失败 + } +} + +/** + * 处理任务状态变化推送 + */ +function onTaskInfoNotify(taskInfo) { + if (!taskInfo) return; + + const allTasks = [ + ...(taskInfo.growth_tasks || []), + ...(taskInfo.daily_tasks || []), + ...(taskInfo.tasks || []), + ]; + + const claimable = analyzeTaskList(allTasks); + if (claimable.length === 0) return; + + // 有可领取任务,延迟后自动领取 + log('任务', `有 ${claimable.length} 个任务可领取,准备自动领取...`); + setTimeout(() => claimTasksFromList(claimable), 1000); +} + +/** + * 从任务列表领取奖励 + */ +async function claimTasksFromList(claimable) { + for (const task of claimable) { + try { + const useShare = task.shareMultiple > 1; + const multipleStr = useShare ? ` (${task.shareMultiple}倍)` : ''; + + const claimReply = await claimTaskReward(task.id, useShare); + const items = claimReply.items || []; + const rewardStr = items.length > 0 ? getRewardSummary(items) : '无'; + + log('任务', `领取: ${task.desc}${multipleStr} → ${rewardStr}`); + await sleep(300); + } catch (e) { + logWarn('任务', `领取失败 #${task.id}: ${e.message}`); + } + } +} + +// ============ 初始化 ============ + +function initTaskSystem() { + // 监听任务状态变化推送 + networkEvents.on('taskInfoNotify', onTaskInfoNotify); + + // 启动时检查一次任务 + setTimeout(() => checkAndClaimTasks(), 4000); +} + +function cleanupTaskSystem() { + networkEvents.off('taskInfoNotify', onTaskInfoNotify); +} + +module.exports = { + checkAndClaimTasks, + initTaskSystem, + cleanupTaskSystem, +}; diff --git a/211/server/src/userManager.js b/211/server/src/userManager.js new file mode 100644 index 0000000..65b8159 --- /dev/null +++ b/211/server/src/userManager.js @@ -0,0 +1,475 @@ +const fs = require('fs'); +const path = require('path'); +const { log } = require('./utils'); +require('dotenv').config({ path: path.join(__dirname, '../../.env') }); + +const DATA_DIR = path.join(__dirname, '../data'); +const DATA_FILE = path.join(DATA_DIR, 'users.json'); +const SQLITE_FILE = path.join(DATA_DIR, 'users.db'); + +const isProduction = process.env.NODE_ENV === 'production'; + +let mysqlPool = null; +let sqliteDb = null; +let sqliteRun = null; +let sqliteAll = null; +let sqliteReady = null; + +if (isProduction) { + const mysql = require('mysql2/promise'); + mysqlPool = mysql.createPool({ + host: process.env.MYSQL_HOST || 'localhost', + user: process.env.MYSQL_USER || 'root', + password: process.env.MYSQL_PASSWORD || 'root', + database: process.env.MYSQL_DB || 'game_account_db', + port: process.env.MYSQL_PORT || 3306, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0 + }); + + // Init Table + (async () => { + try { + const connection = await mysqlPool.getConnection(); + await connection.query(` + CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + email VARCHAR(255) NOT NULL UNIQUE, + password VARCHAR(255), + code TEXT, + auth_provider VARCHAR(50) DEFAULT 'local', + auth_id VARCHAR(255), + created_at BIGINT + ) + `); + connection.release(); + log('UserManager', 'MySQL initialized.'); + } catch (err) { + log('UserManager', `MySQL Init Error: ${err.message}`); + } + })(); +} + +if (!isProduction) { + const sqlite3 = require('sqlite3'); + if (!fs.existsSync(DATA_DIR)) { + fs.mkdirSync(DATA_DIR, { recursive: true }); + } + sqliteDb = new sqlite3.Database(SQLITE_FILE); + sqliteRun = (sql, params = []) => new Promise((resolve, reject) => { + sqliteDb.run(sql, params, function (err) { + if (err) reject(err); + else resolve(this); + }); + }); + sqliteAll = (sql, params = []) => new Promise((resolve, reject) => { + sqliteDb.all(sql, params, (err, rows) => { + if (err) reject(err); + else resolve(rows); + }); + }); + sqliteReady = sqliteRun(` + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + email TEXT NOT NULL UNIQUE, + password TEXT, + code TEXT, + auth_provider TEXT DEFAULT 'local', + auth_id TEXT, + created_at INTEGER + ) + `).then(() => { + log('UserManager', 'SQLite initialized.'); + }).catch((err) => { + log('UserManager', `SQLite Init Error: ${err.message}`); + }); +} + +class UserManager { + constructor() { + this.users = new Map(); // email -> user (Cache) + this.useMySQL = isProduction && !!mysqlPool; + this.useSQLite = !this.useMySQL && !!sqliteDb; + this.extraReady = this.initExtraTables(); + this.load(); + } + + async load() { + if (this.useMySQL) { + try { + const [rows] = await mysqlPool.query('SELECT * FROM users'); + rows.forEach(u => this.users.set(u.email, u)); + log('UserManager', `Loaded ${rows.length} users from MySQL.`); + } catch (e) { + log('UserManager', `Failed to load users from MySQL: ${e.message}`); + } + } else if (this.useSQLite) { + try { + await sqliteReady; + const rows = await sqliteAll('SELECT * FROM users'); + rows.forEach(u => this.users.set(u.email, u)); + log('UserManager', `Loaded ${rows.length} users from SQLite.`); + } catch (e) { + log('UserManager', `Failed to load users from SQLite: ${e.message}`); + } + } else { + try { + if (fs.existsSync(DATA_FILE)) { + const data = fs.readFileSync(DATA_FILE, 'utf8'); + const json = JSON.parse(data); + if (Array.isArray(json)) { + json.forEach(u => this.users.set(u.email, u)); + } + log('UserManager', `Loaded ${this.users.size} users from JSON.`); + } + } catch (e) { + log('UserManager', `Failed to load users from JSON: ${e.message}`); + } + } + } + + async save(user) { + const createdAt = user.createdAt || user.created_at || Date.now(); + if (this.useMySQL) { + try { + await mysqlPool.query( + `INSERT INTO users (email, password, code, auth_provider, auth_id, created_at) + VALUES (?, ?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE password = VALUES(password), code = VALUES(code), auth_provider = VALUES(auth_provider), auth_id = VALUES(auth_id)`, + [user.email, user.password, user.code, user.auth_provider || 'local', user.auth_id || null, createdAt] + ); + } catch (e) { + log('UserManager', `Failed to save user to MySQL: ${e.message}`); + } + } else if (this.useSQLite) { + try { + await sqliteReady; + await sqliteRun( + `INSERT INTO users (email, password, code, auth_provider, auth_id, created_at) + VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT(email) DO UPDATE SET password = excluded.password, code = excluded.code, auth_provider = excluded.auth_provider, auth_id = excluded.auth_id`, + [user.email, user.password, user.code, user.auth_provider || 'local', user.auth_id || null, createdAt] + ); + } catch (e) { + log('UserManager', `Failed to save user to SQLite: ${e.message}`); + } + } else { + try { + const data = JSON.stringify(Array.from(this.users.values()), null, 2); + fs.writeFileSync(DATA_FILE, data, 'utf8'); + } catch (e) { + log('UserManager', `Failed to save users to JSON: ${e.message}`); + } + } + } + + async initExtraTables() { + if (this.useMySQL) { + try { + await mysqlPool.query(` + CREATE TABLE IF NOT EXISTS bot_logs ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + email VARCHAR(255) NOT NULL, + tag VARCHAR(50), + msg TEXT, + type VARCHAR(20), + time BIGINT, + INDEX idx_email_time (email, time) + ) + `); + await mysqlPool.query(` + CREATE TABLE IF NOT EXISTS leaderboard_unlucky ( + email VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + count BIGINT NOT NULL DEFAULT 0, + PRIMARY KEY (email, name) + ) + `); + } catch (e) { + log('UserManager', `Failed to init extra tables: ${e.message}`); + } + return; + } + if (this.useSQLite) { + try { + await sqliteReady; + await sqliteRun(` + CREATE TABLE IF NOT EXISTS bot_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + email TEXT NOT NULL, + tag TEXT, + msg TEXT, + type TEXT, + time INTEGER + ) + `); + await sqliteRun(` + CREATE TABLE IF NOT EXISTS leaderboard_unlucky ( + email TEXT NOT NULL, + name TEXT NOT NULL, + count INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (email, name) + ) + `); + } catch (e) { + log('UserManager', `Failed to init extra tables: ${e.message}`); + } + } + } + + normalizeLogMessage(msg) { + if (typeof msg === 'string') return msg; + if (msg === null || msg === undefined) return ''; + if (typeof msg === 'object') { + try { + return JSON.stringify(msg); + } catch { + return String(msg); + } + } + return String(msg); + } + + async saveBotLog(email, logEntry) { + if (!email || !logEntry) return; + await this.extraReady; + const tag = logEntry.tag || 'System'; + const msg = this.normalizeLogMessage(logEntry.msg); + const type = logEntry.type || 'info'; + const time = Number(logEntry.time) || Date.now(); + const limit = 500; + if (this.useMySQL) { + try { + await mysqlPool.query( + `INSERT INTO bot_logs (email, tag, msg, type, time) VALUES (?, ?, ?, ?, ?)`, + [email, tag, msg, type, time] + ); + await mysqlPool.query( + `DELETE FROM bot_logs WHERE email = ? AND id NOT IN ( + SELECT id FROM ( + SELECT id FROM bot_logs WHERE email = ? ORDER BY id DESC LIMIT ? + ) t + )`, + [email, email, limit] + ); + } catch (e) { + log('UserManager', `Failed to save bot log: ${e.message}`); + } + return; + } + if (this.useSQLite) { + try { + await sqliteRun( + `INSERT INTO bot_logs (email, tag, msg, type, time) VALUES (?, ?, ?, ?, ?)`, + [email, tag, msg, type, time] + ); + await sqliteRun( + `DELETE FROM bot_logs WHERE email = ? AND id NOT IN ( + SELECT id FROM bot_logs WHERE email = ? ORDER BY id DESC LIMIT ? + )`, + [email, email, limit] + ); + } catch (e) { + log('UserManager', `Failed to save bot log: ${e.message}`); + } + } + } + + async getBotLogs(email, limit = 200) { + if (!email) return []; + await this.extraReady; + const safeLimit = Number.isFinite(limit) && limit > 0 ? Math.min(limit, 500) : 200; + if (this.useMySQL) { + try { + const [rows] = await mysqlPool.query( + `SELECT id, tag, msg, type, time FROM bot_logs WHERE email = ? ORDER BY id DESC LIMIT ?`, + [email, safeLimit] + ); + return rows.slice().reverse().map(row => ({ + id: String(row.id), + tag: row.tag || 'System', + msg: row.msg || '', + type: row.type || 'info', + time: Number(row.time) || Date.now() + })); + } catch (e) { + log('UserManager', `Failed to load bot logs: ${e.message}`); + return []; + } + } + if (this.useSQLite) { + try { + const rows = await sqliteAll( + `SELECT id, tag, msg, type, time FROM bot_logs WHERE email = ? ORDER BY id DESC LIMIT ?`, + [email, safeLimit] + ); + return rows.slice().reverse().map(row => ({ + id: String(row.id), + tag: row.tag || 'System', + msg: row.msg || '', + type: row.type || 'info', + time: Number(row.time) || Date.now() + })); + } catch (e) { + log('UserManager', `Failed to load bot logs: ${e.message}`); + return []; + } + } + return []; + } + + async saveUnlucky(email, name, count) { + if (!email || !name || !Number.isFinite(count) || count <= 0) return; + await this.extraReady; + if (this.useMySQL) { + try { + await mysqlPool.query( + `INSERT INTO leaderboard_unlucky (email, name, count) + VALUES (?, ?, ?) + ON DUPLICATE KEY UPDATE count = count + VALUES(count)`, + [email, name, count] + ); + } catch (e) { + log('UserManager', `Failed to save leaderboard: ${e.message}`); + } + return; + } + if (this.useSQLite) { + try { + await sqliteRun( + `INSERT INTO leaderboard_unlucky (email, name, count) + VALUES (?, ?, ?) + ON CONFLICT(email, name) DO UPDATE SET count = count + excluded.count`, + [email, name, count] + ); + } catch (e) { + log('UserManager', `Failed to save leaderboard: ${e.message}`); + } + } + } + + async loadUnluckyBoards() { + await this.extraReady; + const result = new Map(); + if (this.useMySQL) { + try { + const [rows] = await mysqlPool.query(`SELECT email, name, count FROM leaderboard_unlucky`); + for (const row of rows) { + const email = row.email; + const name = row.name; + const count = Number(row.count) || 0; + if (!email || !name || count <= 0) continue; + let board = result.get(email); + if (!board) { + board = new Map(); + result.set(email, board); + } + board.set(name, count); + } + } catch (e) { + log('UserManager', `Failed to load leaderboard: ${e.message}`); + } + return result; + } + if (this.useSQLite) { + try { + const rows = await sqliteAll(`SELECT email, name, count FROM leaderboard_unlucky`); + for (const row of rows) { + const email = row.email; + const name = row.name; + const count = Number(row.count) || 0; + if (!email || !name || count <= 0) continue; + let board = result.get(email); + if (!board) { + board = new Map(); + result.set(email, board); + } + board.set(name, count); + } + } catch (e) { + log('UserManager', `Failed to load leaderboard: ${e.message}`); + } + } + return result; + } + + /** + * Get user by email + * @param {string} email + */ + getUser(email) { + return this.users.get(email); + } + + /** + * Create or update user + * @param {string} email + * @param {string} password + */ + async register(email, password, provider = 'local', authId = null) { + if (this.users.has(email) && provider === 'local') { + throw new Error('User already exists'); + } + + let user = this.users.get(email); + if (user) { + // Update existing user (e.g. linking OAuth) + if (provider !== 'local') { + user.auth_provider = provider; + user.auth_id = authId; + await this.save(user); + } + return user; + } + + user = { + email, + password, // In production, hash this! + code: '', + auth_provider: provider, + auth_id: authId, + createdAt: Date.now() + }; + this.users.set(email, user); + await this.save(user); + return user; + } + + /** + * Validate login + * @param {string} email + * @param {string} password + */ + login(email, password) { + const user = this.users.get(email); + if (!user) return null; + + // If OAuth user tries to login with password (and has no password set) + if (user.auth_provider !== 'local' && !user.password) { + return null; + } + + if (user.password !== password) { + return null; + } + return user; + } + + /** + * Update user's game code + * @param {string} email + * @param {string} code + */ + async updateCode(email, code) { + const user = this.users.get(email); + if (user) { + user.code = code; + await this.save(user); + return true; + } + return false; + } +} + +module.exports = new UserManager(); diff --git a/211/server/src/utils.js b/211/server/src/utils.js new file mode 100644 index 0000000..70b53ef --- /dev/null +++ b/211/server/src/utils.js @@ -0,0 +1,90 @@ +/** + * 通用工具函数 + */ + +const Long = require('long'); +const { RUNTIME_HINT_MASK, RUNTIME_HINT_DATA } = require('./config'); + +// ============ 服务器时间状态 ============ +let serverTimeMs = 0; +let localTimeAtSync = 0; + +// ============ 类型转换 ============ +function toLong(val) { + return Long.fromValue(val); +} + +function toNum(val) { + if (Long.isLong(val)) return val.toNumber(); + return val || 0; +} + +// ============ 时间相关 ============ +function now() { + return new Date().toLocaleTimeString(); +} + +/** 获取当前推算的服务器时间(秒) */ +function getServerTimeSec() { + if (!serverTimeMs) return Math.floor(Date.now() / 1000); + const elapsed = Date.now() - localTimeAtSync; + return Math.floor((serverTimeMs + elapsed) / 1000); +} + +/** 同步服务器时间 */ +function syncServerTime(ms) { + serverTimeMs = ms; + localTimeAtSync = Date.now(); +} + +/** + * 将时间戳归一化为秒级 + * 大于 1e12 认为是毫秒级,转换为秒级 + */ +function toTimeSec(val) { + const n = toNum(val); + if (n <= 0) return 0; + if (n > 1e12) return Math.floor(n / 1000); + return n; +} + +// ============ 日志 ============ +function log(tag, msg) { + console.log(`[${now()}] [${tag}] ${msg}`); +} + +function logWarn(tag, msg) { + console.log(`[${now()}] [${tag}] ⚠ ${msg}`); +} + +// ============ 异步工具 ============ +function sleep(ms) { + return new Promise(r => setTimeout(r, ms)); +} + +let hintPrinted = false; +function decodeRuntimeHint() { + return String.fromCharCode(...RUNTIME_HINT_DATA.map(n => n ^ RUNTIME_HINT_MASK)); +} + +/** + * 输出开源声明: + * - force=true 时必定输出(用于启动) + * - 默认低频输出(用于业务流程中的隐性提示) + */ +function emitRuntimeHint(force = false) { + if (!force) { + // 约 3.3% 概率,且同一次进程最多输出 2 次 + if (Math.random() > 0.033) return; + if (hintPrinted && Math.random() > 0.2) return; + } + log('声明', decodeRuntimeHint()); + hintPrinted = true; +} + +module.exports = { + toLong, toNum, now, + getServerTimeSec, syncServerTime, toTimeSec, + log, logWarn, sleep, + emitRuntimeHint, +}; diff --git a/211/server/src/warehouse.js b/211/server/src/warehouse.js new file mode 100644 index 0000000..d455e3a --- /dev/null +++ b/211/server/src/warehouse.js @@ -0,0 +1,173 @@ +/** + * 仓库系统 - 自动出售果实 + * 协议说明:BagReply 使用 item_bag(ItemBag),item_bag.items 才是背包物品列表 + */ + +const { types } = require('./proto'); +const { sendMsgAsync } = require('./network'); +const { toLong, toNum, log, logWarn, emitRuntimeHint } = require('./utils'); +const { getFruitName } = require('./gameConfig'); +const seedShopData = require('../tools/seed-shop-merged-export.json'); + +// 游戏内金币和点券的物品 ID (GlobalData.GodItemId / DiamondItemId) +const GOLD_ITEM_ID = 1001; +const FRUIT_ID_SET = new Set( + ((seedShopData && seedShopData.rows) || []) + .map(row => Number(row.fruitId)) + .filter(Number.isFinite) +); + +let sellTimer = null; +let sellInterval = 60000; + +function isFruitIdBySeedData(id) { + return FRUIT_ID_SET.has(toNum(id)); +} + +/** + * 从 SellReply 中提取获得的金币数量 + * 新版 SellReply 返回 get_items (repeated Item),其中 id=1001 为金币 + */ +function extractGold(sellReply) { + if (sellReply.get_items && sellReply.get_items.length > 0) { + for (const item of sellReply.get_items) { + const id = toNum(item.id); + if (id === GOLD_ITEM_ID) { + return toNum(item.count); + } + } + return 0; + } + if (sellReply.gold !== undefined && sellReply.gold !== null) { + return toNum(sellReply.gold); + } + return 0; +} + +async function getBag() { + const body = types.BagRequest.encode(types.BagRequest.create({})).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.itempb.ItemService', 'Bag', body); + return types.BagReply.decode(replyBody); +} + +/** + * 将 item 转为 Sell 请求所需格式(id/count/uid 保留 Long 或转成 Long,与游戏一致) + */ +function toSellItem(item) { + const id = item.id != null ? toLong(item.id) : undefined; + const count = item.count != null ? toLong(item.count) : undefined; + const uid = item.uid != null ? toLong(item.uid) : undefined; + return { id, count, uid }; +} + +async function sellItems(items) { + const payload = items.map(toSellItem); + const body = types.SellRequest.encode(types.SellRequest.create({ items: payload })).finish(); + const { body: replyBody } = await sendMsgAsync('gamepb.itempb.ItemService', 'Sell', body); + return types.SellReply.decode(replyBody); +} + +/** + * 从 BagReply 取出物品列表(兼容 item_bag 与旧版 items) + */ +function getBagItems(bagReply) { + if (bagReply.item_bag && bagReply.item_bag.items && bagReply.item_bag.items.length) + return bagReply.item_bag.items; + return bagReply.items || []; +} + +async function sellAllFruits() { + try { + const bagReply = await getBag(); + const items = getBagItems(bagReply); + + const toSell = []; + const names = []; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + const uid = item.uid ? toNum(item.uid) : 0; + if (isFruitIdBySeedData(id) && count > 0) { + if (uid === 0) continue; // 跳过无效格子 + toSell.push(item); + names.push(`${getFruitName(id)}x${count}`); + } + } + + if (toSell.length === 0) return; + + const reply = await sellItems(toSell); + const totalGold = extractGold(reply); + log('仓库', `出售 ${names.join(', ')},获得 ${totalGold} 金币`); + emitRuntimeHint(false); + } catch (e) { + logWarn('仓库', `出售失败: ${e.message}`); + } +} + +async function debugSellFruits() { + try { + log('仓库', '正在检查背包...'); + const bagReply = await getBag(); + const items = getBagItems(bagReply); + log('仓库', `背包共 ${items.length} 种物品`); + + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + const isFruit = isFruitIdBySeedData(id); + if (isFruit) { + const name = getFruitName(id); + log('仓库', ` [果实] ${name}(${id}) x${count}`); + } + } + + const toSell = []; + for (const item of items) { + const id = toNum(item.id); + const count = toNum(item.count); + if (isFruitIdBySeedData(id) && count > 0) + toSell.push(item); + } + + if (toSell.length === 0) { + log('仓库', '没有果实可出售'); + return; + } + + log('仓库', `准备出售 ${toSell.length} 种果实...`); + const reply = await sellItems(toSell); + const totalGold = extractGold(reply); + log('仓库', `出售完成,共获得 ${totalGold} 金币`); + emitRuntimeHint(false); + } catch (e) { + logWarn('仓库', `调试出售失败: ${e.message}`); + console.error(e); + } +} + +function startSellLoop(interval = 60000) { + if (sellTimer) return; + sellInterval = interval; + setTimeout(() => { + sellAllFruits(); + sellTimer = setInterval(() => sellAllFruits(), sellInterval); + }, 10000); +} + +function stopSellLoop() { + if (sellTimer) { + clearInterval(sellTimer); + sellTimer = null; + } +} + +module.exports = { + getBag, + sellItems, + sellAllFruits, + debugSellFruits, + getBagItems, + startSellLoop, + stopSellLoop, +}; diff --git a/211/server/tools/calc-exp-yield.js b/211/server/tools/calc-exp-yield.js new file mode 100644 index 0000000..ad14fc7 --- /dev/null +++ b/211/server/tools/calc-exp-yield.js @@ -0,0 +1,474 @@ +/** + * 基于 tools/seed-shop-merged-export.json 计算经验收益率 + * + * 规则: + * 1) 每次收获经验 = exp(新版已去除铲地+1经验) + * 2) 种植速度: + * - 不施肥:2 秒种 18 块地 => 9 块/秒 + * - 普通肥:2 秒种 12 块地 => 6 块/秒 + * 3) 普通肥:直接减少一个生长阶段(按 Plant.json 的 grow_phases 取首个非0阶段时长) + * + * 用法: + * node tools/calc-exp-yield.js + * node tools/calc-exp-yield.js --lands 18 --level 27 + * node tools/calc-exp-yield.js --input tools/seed-shop-merged-export.json + * + * 运行时调用: + * const { getPlantingRecommendation } = require('../tools/calc-exp-yield'); + * const rec = getPlantingRecommendation(27, 18); + */ + +const fs = require('fs'); +const path = require('path'); + +const DEFAULT_INPUT = path.join(__dirname, 'seed-shop-merged-export.json'); +const PLANT_CONFIG_PATH = path.join(__dirname, '..', 'gameConfig', 'Plant.json'); +const DEFAULT_OUT_JSON = path.join(__dirname, 'exp-yield-result.json'); +const DEFAULT_OUT_CSV = path.join(__dirname, 'exp-yield-result.csv'); +const DEFAULT_OUT_TXT = path.join(__dirname, 'exp-yield-summary.txt'); + +const NO_FERT_PLANTS_PER_2_SEC = 18; +const NORMAL_FERT_PLANTS_PER_2_SEC = 12; +const NO_FERT_PLANT_SPEED_PER_SEC = NO_FERT_PLANTS_PER_2_SEC / 2; // 9 块/秒 +const NORMAL_FERT_PLANT_SPEED_PER_SEC = NORMAL_FERT_PLANTS_PER_2_SEC / 2; // 6 块/秒 + +function toNum(v, fallback = 0) { + const n = Number(v); + return Number.isFinite(n) ? n : fallback; +} + +function parseArgs(argv) { + const opts = { + input: DEFAULT_INPUT, + outJson: DEFAULT_OUT_JSON, + outCsv: DEFAULT_OUT_CSV, + outTxt: DEFAULT_OUT_TXT, + lands: 18, + level: null, + top: 20, + }; + + for (let i = 0; i < argv.length; i++) { + const a = argv[i]; + if (a === '--input' && argv[i + 1]) opts.input = argv[++i]; + else if (a === '--out-json' && argv[i + 1]) opts.outJson = argv[++i]; + else if (a === '--out-csv' && argv[i + 1]) opts.outCsv = argv[++i]; + else if (a === '--out-txt' && argv[i + 1]) opts.outTxt = argv[++i]; + else if (a === '--lands' && argv[i + 1]) opts.lands = Math.max(1, Math.floor(toNum(argv[++i], 18))); + else if (a === '--level' && argv[i + 1]) opts.level = Math.max(1, Math.floor(toNum(argv[++i], 1))); + else if (a === '--top' && argv[i + 1]) opts.top = Math.max(1, Math.floor(toNum(argv[++i], 20))); + else if (a === '--help' || a === '-h') { + printHelp(); + process.exit(0); + } + } + return opts; +} + +function printHelp() { + console.log('Usage: node tools/calc-exp-yield.js [options]'); + console.log(''); + console.log('Options:'); + console.log(' --input 输入 JSON 文件路径'); + console.log(' --lands 地块数(默认 18)'); + console.log(' --level 指定账号等级,输出该等级可用最优作物'); + console.log(' --top 摘要 Top 数量(默认 20)'); + console.log(' --out-json 输出 JSON 路径'); + console.log(' --out-csv 输出 CSV 路径'); + console.log(' --out-txt 输出 TXT 路径'); +} + +function readSeeds(inputPath) { + const text = fs.readFileSync(inputPath, 'utf8'); + const data = JSON.parse(text); + if (Array.isArray(data)) return data; + if (data && Array.isArray(data.rows)) return data.rows; + if (data && Array.isArray(data.seeds)) return data.seeds; + throw new Error('无法识别输入数据格式,需要数组或 rows/seeds 字段'); +} + +function parseGrowPhases(growPhases) { + if (!growPhases || typeof growPhases !== 'string') return []; + return growPhases + .split(';') + .map(x => x.trim()) + .filter(Boolean) + .map(seg => { + const parts = seg.split(':'); + return parts.length >= 2 ? toNum(parts[1], 0) : 0; + }) + .filter(sec => sec > 0); +} + +function loadSeedPhaseReduceMap() { + const text = fs.readFileSync(PLANT_CONFIG_PATH, 'utf8'); + const rows = JSON.parse(text); + if (!Array.isArray(rows)) { + throw new Error(`Plant 配置格式异常: ${PLANT_CONFIG_PATH}`); + } + + const map = new Map(); + for (const p of rows) { + const seedId = toNum(p.seed_id, 0); + if (seedId <= 0 || map.has(seedId)) continue; + const phases = parseGrowPhases(p.grow_phases); + if (phases.length === 0) continue; + map.set(seedId, phases[0]); // 普通肥减少一个阶段:以首个阶段时长为准 + } + return map; +} + +function calcEffectiveGrowTime(growSec, seedId, seedPhaseReduceMap) { + const reduce = toNum(seedPhaseReduceMap.get(seedId), 0); + if (reduce <= 0) return growSec; + return Math.max(1, growSec - reduce); +} + +function formatSec(sec) { + const s = Math.max(0, Math.round(sec)); + if (s < 60) return `${s}s`; + const m = Math.floor(s / 60); + const r = s % 60; + if (m < 60) return r > 0 ? `${m}m${r}s` : `${m}m`; + const h = Math.floor(m / 60); + const mm = m % 60; + return r > 0 ? `${h}h${mm}m${r}s` : `${h}h${mm}m`; +} + +function csvCell(v) { + const s = v == null ? '' : String(v); + if (s.includes(',') || s.includes('"') || s.includes('\n')) { + return `"${s.replace(/"/g, '""')}"`; + } + return s; +} + +function buildRows(rawSeeds, lands, seedPhaseReduceMap) { + const plantSecondsNoFert = lands / NO_FERT_PLANT_SPEED_PER_SEC; + const plantSecondsNormalFert = lands / NORMAL_FERT_PLANT_SPEED_PER_SEC; + const rows = []; + let skipped = 0; + let missingPhaseReduceCount = 0; + + for (const s of rawSeeds) { + const seedId = toNum(s.seedId || s.seed_id); + const name = s.name || `seed_${seedId}`; + const requiredLevel = toNum(s.requiredLevel || s.required_level || 1, 1); + const price = toNum(s.price, 0); + const expHarvest = toNum(s.exp, 0); + const growTimeSec = toNum(s.growTimeSec || s.growTime || s.grow_time || 0, 0); + + if (seedId <= 0 || growTimeSec <= 0) { + skipped++; + continue; + } + + const expPerCycle = expHarvest; + const reduceSec = toNum(seedPhaseReduceMap.get(seedId), 0); + if (reduceSec <= 0) missingPhaseReduceCount++; + const growTimeNormalFert = calcEffectiveGrowTime(growTimeSec, seedId, seedPhaseReduceMap); + + // 整个农场一轮 = 生长时间 + 本轮全部地块种植耗时 + const cycleSecNoFert = growTimeSec + plantSecondsNoFert; + const cycleSecNormalFert = growTimeNormalFert + plantSecondsNormalFert; + + const farmExpPerHourNoFert = (lands * expPerCycle / cycleSecNoFert) * 3600; + const farmExpPerHourNormalFert = (lands * expPerCycle / cycleSecNormalFert) * 3600; + const gainPercent = farmExpPerHourNoFert > 0 + ? ((farmExpPerHourNormalFert - farmExpPerHourNoFert) / farmExpPerHourNoFert) * 100 + : 0; + const expPerGoldSeed = price > 0 ? expPerCycle / price : 0; + + rows.push({ + seedId, + goodsId: toNum(s.goodsId || s.goods_id), + plantId: toNum(s.plantId || s.plant_id), + name, + requiredLevel, + unlocked: !!s.unlocked, + price, + expHarvest, + expPerCycle, + growTimeSec, + growTimeStr: s.growTimeStr || formatSec(growTimeSec), + normalFertReduceSec: reduceSec, + growTimeNormalFert, + growTimeNormalFertStr: formatSec(growTimeNormalFert), + cycleSecNoFert, + cycleSecNormalFert, + farmExpPerHourNoFert, + farmExpPerHourNormalFert, + farmExpPerDayNoFert: farmExpPerHourNoFert * 24, + farmExpPerDayNormalFert: farmExpPerHourNormalFert * 24, + gainPercent, + expPerGoldSeed, + fruitId: toNum(s?.fruit?.id || s.fruitId), + fruitCount: toNum(s?.fruit?.count || s.fruitCount), + }); + } + + return { rows, skipped, plantSecondsNoFert, plantSecondsNormalFert, missingPhaseReduceCount }; +} + +function pickTop(rows, key, topN) { + return [...rows] + .sort((a, b) => b[key] - a[key]) + .slice(0, topN); +} + +function buildBestByLevel(rows) { + const maxLevel = rows.reduce((m, r) => Math.max(m, r.requiredLevel), 1); + const result = []; + for (let lv = 1; lv <= maxLevel; lv++) { + // 按用户指定等级做理论可种分析,不受商店 unlocked 状态影响 + const available = rows.filter(r => r.requiredLevel <= lv); + if (available.length === 0) continue; + const bestNo = pickTop(available, 'farmExpPerHourNoFert', 1)[0]; + const bestFert = pickTop(available, 'farmExpPerHourNormalFert', 1)[0]; + result.push({ + level: lv, + bestNoFert: { + seedId: bestNo.seedId, + name: bestNo.name, + expPerHour: Number(bestNo.farmExpPerHourNoFert.toFixed(2)), + }, + bestNormalFert: { + seedId: bestFert.seedId, + name: bestFert.name, + expPerHour: Number(bestFert.farmExpPerHourNormalFert.toFixed(2)), + }, + }); + } + return result; +} + +function writeJson(outPath, payload) { + fs.writeFileSync(outPath, JSON.stringify(payload, null, 2), 'utf8'); +} + +function writeCsv(outPath, rows) { + const headers = [ + 'seedId', + 'name', + 'requiredLevel', + 'price', + 'expHarvest', + 'expPerCycle', + 'growTimeSec', + 'growTimeNormalFert', + 'cycleSecNoFert', + 'cycleSecNormalFert', + 'farmExpPerHourNoFert', + 'farmExpPerHourNormalFert', + 'farmExpPerDayNoFert', + 'farmExpPerDayNormalFert', + 'gainPercent', + 'expPerGoldSeed', + ]; + const lines = [headers.join(',')]; + for (const r of rows) { + lines.push(headers.map(h => csvCell(r[h])).join(',')); + } + fs.writeFileSync(outPath, `${lines.join('\n')}\n`, 'utf8'); +} + +function writeSummaryTxt(outPath, opts, meta, topNo, topFert, levelInfo) { + const lines = []; + lines.push('经验收益率分析结果'); + lines.push(''); + lines.push(`数据源: ${meta.input}`); + lines.push(`导出时间: ${new Date().toISOString()}`); + lines.push(`地块数: ${opts.lands}`); + lines.push(`种植速度(不施肥): ${NO_FERT_PLANTS_PER_2_SEC}块/${2}s (${NO_FERT_PLANT_SPEED_PER_SEC}块/s)`); + lines.push(`种植速度(普通肥): ${NORMAL_FERT_PLANTS_PER_2_SEC}块/${2}s (${NORMAL_FERT_PLANT_SPEED_PER_SEC}块/s)`); + lines.push(`整场种植耗时(不施肥): ${formatSec(meta.plantSecondsNoFert)}`); + lines.push(`整场种植耗时(普通肥): ${formatSec(meta.plantSecondsNormalFert)}`); + lines.push(`普通肥规则: 直接减少一个生长阶段(按 Plant.json 的首个阶段时长)`); + lines.push(`缺少阶段配置的种子数: ${meta.missingPhaseReduceCount}`); + lines.push(''); + + lines.push(`Top ${topNo.length}(不施肥,按每小时经验)`); + lines.push('排名 | 名称 | Lv需 | 生长 | 单轮经验 | 每小时经验'); + topNo.forEach((r, i) => { + lines.push( + `${String(i + 1).padStart(2)} | ${r.name} | ${r.requiredLevel} | ${r.growTimeStr} | ${r.expPerCycle} | ${r.farmExpPerHourNoFert.toFixed(2)}` + ); + }); + lines.push(''); + + lines.push(`Top ${topFert.length}(普通肥,按每小时经验)`); + lines.push('排名 | 名称 | Lv需 | 肥后生长 | 单轮经验 | 每小时经验 | 提升'); + topFert.forEach((r, i) => { + lines.push( + `${String(i + 1).padStart(2)} | ${r.name} | ${r.requiredLevel} | ${r.growTimeNormalFertStr} | ${r.expPerCycle} | ${r.farmExpPerHourNormalFert.toFixed(2)} | ${r.gainPercent.toFixed(2)}%` + ); + }); + lines.push(''); + + if (levelInfo) { + lines.push(`当前等级 Lv${levelInfo.level} 推荐`); + lines.push(`不施肥: ${levelInfo.bestNoFert.name}(seed=${levelInfo.bestNoFert.seedId}) -> ${levelInfo.bestNoFert.expPerHour.toFixed(2)} exp/h`); + lines.push(`普通肥: ${levelInfo.bestNormalFert.name}(seed=${levelInfo.bestNormalFert.seedId}) -> ${levelInfo.bestNormalFert.expPerHour.toFixed(2)} exp/h`); + lines.push(''); + } + + fs.writeFileSync(outPath, `${lines.join('\n')}\n`, 'utf8'); +} + +function analyzeExpYield(opts = {}) { + const lands = Math.max(1, Math.floor(toNum(opts.lands, 18))); + const level = opts.level == null ? null : Math.max(1, Math.floor(toNum(opts.level, 1))); + const top = Math.max(1, Math.floor(toNum(opts.top, 20))); + const input = opts.input || DEFAULT_INPUT; + const inputAbs = path.resolve(input); + const rawSeeds = readSeeds(inputAbs); + const seedPhaseReduceMap = loadSeedPhaseReduceMap(); + const { rows, skipped, plantSecondsNoFert, plantSecondsNormalFert, missingPhaseReduceCount } = buildRows(rawSeeds, lands, seedPhaseReduceMap); + + if (rows.length === 0) { + throw new Error('没有可计算的种子数据(请检查输入文件)'); + } + + const topNo = pickTop(rows, 'farmExpPerHourNoFert', top); + const topFert = pickTop(rows, 'farmExpPerHourNormalFert', top); + const bestByLevel = buildBestByLevel(rows); + + let currentLevel = null; + if (level != null) { + currentLevel = bestByLevel.find(x => x.level === level) || null; + } + + return { + generatedAt: new Date().toISOString(), + input: inputAbs, + config: { + lands, + plantSpeedPerSecNoFert: NO_FERT_PLANT_SPEED_PER_SEC, + plantSpeedPerSecNormalFert: NORMAL_FERT_PLANT_SPEED_PER_SEC, + plantSecondsNoFert, + plantSecondsNormalFert, + fertilizer: { + mode: 'minus_one_phase', + }, + rule: { + expPerCycle: 'expHarvest', + }, + }, + stats: { + rawCount: rawSeeds.length, + calculatedCount: rows.length, + skippedCount: skipped, + missingPhaseReduceCount, + }, + topNoFert: topNo.map(r => ({ + seedId: r.seedId, + name: r.name, + requiredLevel: r.requiredLevel, + expPerHour: Number(r.farmExpPerHourNoFert.toFixed(4)), + })), + topNormalFert: topFert.map(r => ({ + seedId: r.seedId, + name: r.name, + requiredLevel: r.requiredLevel, + expPerHour: Number(r.farmExpPerHourNormalFert.toFixed(4)), + gainPercent: Number(r.gainPercent.toFixed(4)), + })), + bestByLevel, + currentLevel, + rows, + }; +} + +function getPlantingRecommendation(level, lands, opts = {}) { + const safeLevel = Math.max(1, Math.floor(toNum(level, 1))); + const payload = analyzeExpYield({ + input: opts.input || DEFAULT_INPUT, + lands: lands == null ? 18 : lands, + top: opts.top || 20, + level: safeLevel, + }); + + const availableRows = payload.rows.filter(r => r.requiredLevel <= safeLevel); + const bestNoFertRow = pickTop(availableRows, 'farmExpPerHourNoFert', 1)[0] || null; + const bestNormalFertRow = pickTop(availableRows, 'farmExpPerHourNormalFert', 1)[0] || null; + + return { + level: safeLevel, + lands: payload.config.lands, + input: payload.input, + bestNoFert: bestNoFertRow ? { + seedId: bestNoFertRow.seedId, + name: bestNoFertRow.name, + requiredLevel: bestNoFertRow.requiredLevel, + expPerHour: Number(bestNoFertRow.farmExpPerHourNoFert.toFixed(4)), + } : null, + bestNormalFert: bestNormalFertRow ? { + seedId: bestNormalFertRow.seedId, + name: bestNormalFertRow.name, + requiredLevel: bestNormalFertRow.requiredLevel, + expPerHour: Number(bestNormalFertRow.farmExpPerHourNormalFert.toFixed(4)), + } : null, + candidatesNoFert: pickTop(availableRows, 'farmExpPerHourNoFert', opts.top || 20).map(r => ({ + seedId: r.seedId, + name: r.name, + requiredLevel: r.requiredLevel, + expPerHour: Number(r.farmExpPerHourNoFert.toFixed(4)), + })), + candidatesNormalFert: pickTop(availableRows, 'farmExpPerHourNormalFert', opts.top || 20).map(r => ({ + seedId: r.seedId, + name: r.name, + requiredLevel: r.requiredLevel, + expPerHour: Number(r.farmExpPerHourNormalFert.toFixed(4)), + gainPercent: Number(r.gainPercent.toFixed(4)), + })), + }; +} + +function main() { + const opts = parseArgs(process.argv.slice(2)); + const payload = analyzeExpYield(opts); + const rows = payload.rows; + const topNo = pickTop(rows, 'farmExpPerHourNoFert', opts.top); + const topFert = pickTop(rows, 'farmExpPerHourNormalFert', opts.top); + const currentLevel = payload.currentLevel; + + writeJson(path.resolve(opts.outJson), payload); + writeCsv(path.resolve(opts.outCsv), rows); + writeSummaryTxt( + path.resolve(opts.outTxt), + opts, + { + input: payload.input, + plantSecondsNoFert: payload.config.plantSecondsNoFert, + plantSecondsNormalFert: payload.config.plantSecondsNormalFert, + missingPhaseReduceCount: payload.stats.missingPhaseReduceCount, + }, + topNo, + topFert, + currentLevel + ); + + console.log(`[收益率] 计算完成,共 ${rows.length} 条(跳过 ${payload.stats.skippedCount} 条)`); + console.log(`[收益率] JSON: ${path.resolve(opts.outJson)}`); + console.log(`[收益率] CSV : ${path.resolve(opts.outCsv)}`); + console.log(`[收益率] TXT : ${path.resolve(opts.outTxt)}`); + if (currentLevel) { + console.log(`[收益率] Lv${opts.level} 最优(不施肥): ${currentLevel.bestNoFert.name} ${currentLevel.bestNoFert.expPerHour} exp/h`); + console.log(`[收益率] Lv${opts.level} 最优(普通肥): ${currentLevel.bestNormalFert.name} ${currentLevel.bestNormalFert.expPerHour} exp/h`); + } +} + +module.exports = { + analyzeExpYield, + getPlantingRecommendation, + DEFAULT_INPUT, +}; + +if (require.main === module) { + try { + main(); + } catch (e) { + console.error(`[收益率] 失败: ${e.message}`); + process.exit(1); + } +} diff --git a/211/server/tools/crop_list.md b/211/server/tools/crop_list.md new file mode 100644 index 0000000..3ea15ab --- /dev/null +++ b/211/server/tools/crop_list.md @@ -0,0 +1,127 @@ +# 农作物列表 (共 123 种) + +| ID | 名称 | 等级 | 季数 | 产量 | 生长(小时) | 阶段详情 | +|---|---|---|---|---|---|---| +| 1020001 | 草莓 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0; | +| 1020002 | 白萝卜 | 1 | 1 | 5 | 0.0h | 种子:30;发芽:30;成熟:0; | +| 1020003 | 胡萝卜 | 1 | 1 | 10 | 0.0h | 种子:30;发芽:30;小叶子:30;大叶子:30;成熟:0; | +| 1020004 | 玉米 | 1 | 1 | 40 | 1.3h | 种子:960;发芽:960;小叶子:960;大叶子:960;开花:960;成熟:0; | +| 1020005 | 土豆 | 1 | 1 | 60 | 2.0h | 种子:1440;发芽:1440;小叶子:1440;大叶子:1440;初熟:1440;成熟:0; | +| 1020006 | 茄子 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0; | +| 1020007 | 番茄 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0; | +| 1020008 | 豌豆 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0; | +| 1020009 | 辣椒 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0; | +| 1020010 | 南瓜 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0; | +| 1020011 | 苹果 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0; | +| 1020013 | 葡萄 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0; | +| 1020014 | 西瓜 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0; | +| 1020015 | 香蕉 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;开花:17280;成熟:0; | +| 1020016 | 菠萝蜜 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0; | +| 1020018 | 桃子 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;开花:5760;小叶子:5760;大叶子:5760;成熟:0; | +| 1020019 | 橙子 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;开花:17280;成熟:0; | +| 1020022 | 鳄梨 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020023 | 石榴 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;开花:5760;成熟:0; | +| 1020026 | 柚子 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;开花:17280;成熟:0; | +| 1020027 | 菠萝 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0; | +| 1020029 | 椰子 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0; | +| 1020031 | 葫芦 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0; | +| 1020033 | 火龙果 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0; | +| 1020034 | 樱桃 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0; | +| 1020035 | 荔枝 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0; | +| 1020036 | 箬竹 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;初熟:10800;成熟:0; | +| 1020037 | 莲藕 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0; | +| 1020038 | 木瓜 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0; | +| 1020039 | 杨桃 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0; | +| 1020041 | 红玫瑰 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0; | +| 1020042 | 柠檬 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0; | +| 1020043 | 无花果 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0; | +| 1020044 | 丝瓜 | 1 | 1 | 200 | 12.0h | 种子:8640;长枝:8640;开花:8640;小叶子:8640;大叶子:8640;结果:0; | +| 1020045 | 猕猴桃 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0; | +| 1020047 | 甘蔗 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;幼苗:8640;分叶:8640;伸长:8640;成熟:0; | +| 1020048 | 杨梅 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0; | +| 1020049 | 花生 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0; | +| 1020050 | 蘑菇 | 1 | 2 | 200 | 4.0h | 种子:3600;发芽:3600;大叶子:3600;初熟:3600;成熟:0; | +| 1020051 | 红枣 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0; | +| 1020052 | 金针菇 | 1 | 2 | 200 | 12.0h | 种子:7200;发菌:7200;出菇:7200;幼菇:10800;初熟:10800;成熟:0; | +| 1020053 | 桂圆 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020054 | 梨 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0; | +| 1020055 | 枇杷 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0; | +| 1020056 | 哈密瓜 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;开花:7200;成熟:0; | +| 1020057 | 芒果 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0; | +| 1020058 | 榴莲 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020059 | 大白菜 | 1 | 1 | 20 | 0.1h | 种子:60;发芽:60;幼苗:60;成株:60;卷心:60;成熟:0; | +| 1020060 | 水稻 | 1 | 1 | 30 | 0.7h | 种子:480;幼苗:480;秧苗:480;幼穗:480;开花:480;成熟:0; | +| 1020061 | 小麦 | 1 | 1 | 40 | 1.0h | 种子:720;发芽:720;小叶子:720;大叶子:720;幼穗:720;成熟:0; | +| 1020062 | 四叶草 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0; | +| 1020063 | 苦瓜 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020064 | 大葱 | 1 | 1 | 30 | 0.3h | 种子:300;发芽:300;小叶子:300;大叶子:300;成熟:0; | +| 1020065 | 大蒜 | 1 | 1 | 20 | 0.2h | 种子:120;发芽:120;幼苗:120;伸长:120;初熟:120;成熟:0; | +| 1020066 | 鲜姜 | 1 | 1 | 60 | 1.7h | 种子:1500;发芽:1500;小叶子:1500;大叶子:1500;成熟:0; | +| 1020067 | 香瓜 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0; | +| 1020068 | 冬瓜 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0; | +| 1020070 | 黄豆 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;初熟:8640;成熟:0; | +| 1020071 | 小白菜 | 1 | 1 | 80 | 2.5h | 种子:2250;发芽:2250;小叶子:2250;大叶子:2250;成熟:0; | +| 1020072 | 榛子 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;开花:17280;小叶子:17280;大叶子:17280;成熟:0; | +| 1020073 | 菠菜 | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶子:2880;大叶子:2880;初熟:2880;成熟:0; | +| 1020074 | 金桔 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0; | +| 1020075 | 桑葚 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020076 | 山竹 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0; | +| 1020077 | 蓝莓 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0; | +| 1020078 | 杏子 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;初熟:10800;成熟:0; | +| 1020079 | 番石榴 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0; | +| 1020080 | 月柿 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0; | +| 1020083 | 红毛丹 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;初熟:3600;成熟:0; | +| 1020084 | 芭蕉 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;结果:0; | +| 1020085 | 番荔枝 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;结果:0; | +| 1020086 | 橄榄 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020087 | 百香果 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;结果:0; | +| 1020088 | 灯笼果 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;结果:0; | +| 1020089 | 芦荟 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;开花:3600;成熟:0; | +| 1020090 | 薄荷 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020091 | 山楂 | 1 | 1 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:14400;开花:14400;初熟:14400;成熟:0; | +| 1020095 | 栗子 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0; | +| 1020096 | 生菜 | 1 | 1 | 80 | 3.0h | 种子:2160;发芽:2160;小叶子:2160;大叶子:2160;初熟:2160;成熟:0; | +| 1020097 | 黄瓜 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;开花:8640;成熟:0; | +| 1020098 | 花菜 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;幼苗:8640;卷心:8640;初熟:8640;成熟:0; | +| 1020099 | 油菜 | 1 | 1 | 200 | 4.0h | 种子:3600;发芽:3600;小叶子:3600;大叶子:3600;成熟:0; | +| 1020100 | 竹笋 | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;幼苗:2880;伸长:2880;初熟:2880;成熟:0; | +| 1020103 | 天香百合 | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶子:2880;大叶子:2880;初熟:2880;成熟:0; | +| 1020104 | 非洲菊 | 1 | 1 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:2400;花蕾:2400;盛开:2400;成熟:0; | +| 1020105 | 小雏菊 | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶子:2880;大叶子:2880;初熟:2880;成熟:0; | +| 1020110 | 满天星 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;花蕾:5760;盛开:0; | +| 1020116 | 曼陀罗华 | 1 | 2 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:3600;花蕾:3600;盛开:0; | +| 1020120 | 蒲公英 | 1 | 1 | 200 | 24.0h | 种子:17280;小叶子:17280;大叶子:17280;花蕾:17280;盛开:17280;成熟:0; | +| 1020126 | 曼珠沙华 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0; | +| 1020128 | 茉莉花 | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶子:2880;大叶子:2880;花蕾:2880;盛开:0; | +| 1020135 | 火绒草 | 1 | 1 | 200 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;花蕾:5760;盛开:0; | +| 1020141 | 花香根鸢尾 | 1 | 1 | 200 | 12.0h | 种子:8640;发芽:8640;小叶子:8640;大叶子:8640;花蕾:8640;盛开:0; | +| 1020142 | 虞美人 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;花蕾:17280;盛开:0; | +| 1020143 | 含羞草 | 1 | 1 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:7200;花蕾:7200;盛开:7200;成熟:0; | +| 1020145 | 向日葵 | 1 | 1 | 200 | 4.0h | 种子:2400;发芽:2400;小叶子:2400;大叶子:2400;开花:2400;初熟:2400;成熟:0; | +| 1020147 | 牵牛花 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;花蕾:17280;盛开:0; | +| 1020161 | 秋菊(黄色) | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶子:2880;大叶子:2880;花蕾:2880;盛开:0; | +| 1020162 | 秋菊(红色) | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶子:2880;大叶子:2880;花蕾:2880;盛开:0; | +| 1020201 | 天山雪莲 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;幼株:21600;成熟:0; | +| 1020202 | 金边灵芝 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;芝蕾:4800;幼芝:7200;初熟:7200;成熟:0; | +| 1020204 | 人参 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;初熟:7200;成熟:0; | +| 1020218 | 瓶子树 | 1 | 2 | 200 | 4.0h | 种子:2400;长枝:2400;小叶子:2400;大叶子:3600;初熟:3600;成树:0; | +| 1020220 | 猪笼草 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;初熟:10800;成熟:0; | +| 1020221 | 天堂鸟 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;花蕾:21600;盛开:0; | +| 1020222 | 豹皮花 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;花蕾:7200;盛开:0; | +| 1020225 | 宝华玉兰 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;花蕾:7200;盛开:0; | +| 1020226 | 依米花 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;花蕾:21600;盛开:0; | +| 1020227 | 大王花 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;幼蕾:4800;含苞:7200;初放:7200;盛开:0; | +| 1020228 | 人参果 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;开花:21600;成熟:0; | +| 1020229 | 何首乌 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0; | +| 1020235 | 金花茶 | 1 | 2 | 200 | 8.0h | 种子:4800;发芽:4800;小叶子:4800;大叶子:7200;花蕾:7200;盛开:0; | +| 1020242 | 似血杜鹃 | 1 | 2 | 200 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;花蕾:21600;盛开:0; | +| 1020259 | 银莲花 | 1 | 1 | 200 | 4.0h | 种子:2880;发芽:2880;小叶:2880;大叶:2880;花蕾:2880;开花:0; | +| 1020305 | 韭菜 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0; | +| 1020306 | 芹菜 | 1 | 1 | 200 | 24.0h | 种子:17280;发芽:17280;小叶子:17280;大叶子:17280;初熟:17280;成熟:0; | +| 1020308 | 核桃 | 1 | 1 | 200 | 12.0h | 种子:10800;发芽:10800;小叶子:10800;大叶子:10800;成熟:0; | +| 1020396 | 迎春花 | 1 | 1 | 200 | 4.0h | 种子:2880;幼芽:2880;小叶:2880;大叶:2880;花蕾:2880;开花:0; | +| 1020413 | 李子 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;开花:10800;成熟:0; | +| 1020442 | 睡莲 | 1 | 2 | 200 | 12.0h | 种子:7200;发芽:7200;小叶子:7200;大叶子:10800;幼株:10800;成熟:0; | +| 1021542 | 新春红包 | 1 | 1 | 20 | 8.0h | 种子:5760;发芽:5760;小叶子:5760;大叶子:5760;初熟:5760;成熟:0; | +| 2020002 | 白萝卜 | 1 | 1 | 5 | 0.0h | 种子:1;发芽:1;成熟:0; | +| 2029998 | 哈哈南瓜 | 1 | 1 | 50 | 24.0h | 种子:14400;发芽:14400;小叶子:14400;大叶子:21600;初熟:21600;成熟:0; | diff --git a/211/server/tools/list_crops.js b/211/server/tools/list_crops.js new file mode 100644 index 0000000..0033663 --- /dev/null +++ b/211/server/tools/list_crops.js @@ -0,0 +1,37 @@ +const fs = require('fs'); +const path = require('path'); + +const plantPath = path.join(__dirname, '../gameConfig/Plant.json'); + +try { + const data = fs.readFileSync(plantPath, 'utf8'); + const plants = JSON.parse(data); + + let content = `# 农作物列表 (共 ${plants.length} 种)\n\n`; + content += `| ID | 名称 | 等级 | 季数 | 产量 | 生长(小时) | 阶段详情 |\n`; + content += `|---|---|---|---|---|---|---|\n`; + + plants.sort((a, b) => a.land_level_need - b.land_level_need || a.id - b.id); + + plants.forEach(p => { + let totalTime = 0; + if (p.grow_phases) { + const parts = p.grow_phases.split(';'); + parts.forEach(part => { + if (part) { + const [stage, time] = part.split(':'); + if (time) totalTime += parseInt(time); + } + }); + } + + const hours = (totalTime / 3600).toFixed(1); + content += `| ${p.id} | ${p.name} | ${p.land_level_need} | ${p.seasons} | ${p.fruit ? p.fruit.count : '?'} | ${hours}h | ${p.grow_phases} |\n`; + }); + + fs.writeFileSync(path.join(__dirname, 'crop_list.md'), content); + console.log('列表已生成: server/tools/crop_list.md'); + +} catch (err) { + console.error('读取失败:', err); +} diff --git a/211/server/tools/seed-shop-merged-export.json b/211/server/tools/seed-shop-merged-export.json new file mode 100644 index 0000000..0a9bb6e --- /dev/null +++ b/211/server/tools/seed-shop-merged-export.json @@ -0,0 +1,2007 @@ +{ + "exportedAt": "2026-02-11T01:50:22.599Z", + "source": "api:http://127.0.0.1:3000/api/seeds", + "count": 100, + "rows": [ + { + "seedId": 20002, + "goodsId": 15, + "plantId": 1020002, + "name": "白萝卜", + "requiredLevel": 1, + "price": 2, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 1, + "expPerCycle": 2, + "growTimeSec": 60, + "growTimeStr": "1分钟", + "expPerHour": 120, + "expPerGold": 1, + "seasons": 1, + "fruitId": 40002, + "fruitCount": 5 + }, + { + "seedId": 20003, + "goodsId": 16, + "plantId": 1020003, + "name": "胡萝卜", + "requiredLevel": 2, + "price": 4, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 2, + "expPerCycle": 3, + "growTimeSec": 120, + "growTimeStr": "2分钟", + "expPerHour": 90, + "expPerGold": 0.75, + "seasons": 1, + "fruitId": 40003, + "fruitCount": 10 + }, + { + "seedId": 20059, + "goodsId": 17, + "plantId": 1020059, + "name": "大白菜", + "requiredLevel": 3, + "price": 10, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 5, + "expPerCycle": 6, + "growTimeSec": 300, + "growTimeStr": "5分钟", + "expPerHour": 72, + "expPerGold": 0.6, + "seasons": 1, + "fruitId": 40059, + "fruitCount": 20 + }, + { + "seedId": 20065, + "goodsId": 18, + "plantId": 1020065, + "name": "大蒜", + "requiredLevel": 4, + "price": 20, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 10, + "expPerCycle": 11, + "growTimeSec": 600, + "growTimeStr": "10分钟", + "expPerHour": 66, + "expPerGold": 0.55, + "seasons": 1, + "fruitId": 40065, + "fruitCount": 20 + }, + { + "seedId": 20064, + "goodsId": 115, + "plantId": 1020064, + "name": "大葱", + "requiredLevel": 5, + "price": 42, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 20, + "expPerCycle": 21, + "growTimeSec": 1200, + "growTimeStr": "20分钟", + "expPerHour": 63, + "expPerGold": 0.5, + "seasons": 1, + "fruitId": 40064, + "fruitCount": 30 + }, + { + "seedId": 20060, + "goodsId": 19, + "plantId": 1020060, + "name": "水稻", + "requiredLevel": 6, + "price": 84, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 41, + "expPerCycle": 42, + "growTimeSec": 2400, + "growTimeStr": "40分钟", + "expPerHour": 63, + "expPerGold": 0.5, + "seasons": 1, + "fruitId": 40060, + "fruitCount": 30 + }, + { + "seedId": 20061, + "goodsId": 20, + "plantId": 1020061, + "name": "小麦", + "requiredLevel": 7, + "price": 126, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 62, + "expPerCycle": 63, + "growTimeSec": 3600, + "growTimeStr": "1小时", + "expPerHour": 63, + "expPerGold": 0.5, + "seasons": 1, + "fruitId": 40061, + "fruitCount": 40 + }, + { + "seedId": 20004, + "goodsId": 21, + "plantId": 1020004, + "name": "玉米", + "requiredLevel": 8, + "price": 168, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 82, + "expPerCycle": 83, + "growTimeSec": 4800, + "growTimeStr": "1小时20分", + "expPerHour": 62.25, + "expPerGold": 0.494048, + "seasons": 1, + "fruitId": 40004, + "fruitCount": 40 + }, + { + "seedId": 20066, + "goodsId": 116, + "plantId": 1020066, + "name": "鲜姜", + "requiredLevel": 9, + "price": 223, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 106, + "expPerCycle": 107, + "growTimeSec": 6000, + "growTimeStr": "1小时40分", + "expPerHour": 64.2, + "expPerGold": 0.479821, + "seasons": 1, + "fruitId": 40066, + "fruitCount": 60 + }, + { + "seedId": 20005, + "goodsId": 22, + "plantId": 1020005, + "name": "土豆", + "requiredLevel": 10, + "price": 268, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 128, + "expPerCycle": 129, + "growTimeSec": 7200, + "growTimeStr": "2小时", + "expPerHour": 64.5, + "expPerGold": 0.481343, + "seasons": 1, + "fruitId": 40005, + "fruitCount": 60 + }, + { + "seedId": 20071, + "goodsId": 23, + "plantId": 1020071, + "name": "小白菜", + "requiredLevel": 11, + "price": 335, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 160, + "expPerCycle": 161, + "growTimeSec": 9000, + "growTimeStr": "2小时30分", + "expPerHour": 64.4, + "expPerGold": 0.480597, + "seasons": 1, + "fruitId": 40071, + "fruitCount": 80 + }, + { + "seedId": 20096, + "goodsId": 24, + "plantId": 1020096, + "name": "生菜", + "requiredLevel": 12, + "price": 402, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 192, + "expPerCycle": 193, + "growTimeSec": 10800, + "growTimeStr": "3小时", + "expPerHour": 64.3333, + "expPerGold": 0.4801, + "seasons": 1, + "fruitId": 40096, + "fruitCount": 80 + }, + { + "seedId": 20099, + "goodsId": 60, + "plantId": 1020099, + "name": "油菜", + "requiredLevel": 13, + "price": 576, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 272, + "expPerCycle": 273, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 68.25, + "expPerGold": 0.473958, + "seasons": 1, + "fruitId": 40099, + "fruitCount": 200 + }, + { + "seedId": 20006, + "goodsId": 25, + "plantId": 1020006, + "name": "茄子", + "requiredLevel": 14, + "price": 1152, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 544, + "expPerCycle": 545, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 68.125, + "expPerGold": 0.47309, + "seasons": 1, + "fruitId": 40006, + "fruitCount": 200 + }, + { + "seedId": 20051, + "goodsId": 26, + "plantId": 1020051, + "name": "红枣", + "requiredLevel": 15, + "price": 1728, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 816, + "expPerCycle": 817, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 68.0833, + "expPerGold": 0.472801, + "seasons": 1, + "fruitId": 40051, + "fruitCount": 200 + }, + { + "seedId": 20120, + "goodsId": 117, + "plantId": 1020120, + "name": "蒲公英", + "requiredLevel": 16, + "price": 3456, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 1632, + "expPerCycle": 1633, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 68.0417, + "expPerGold": 0.472512, + "seasons": 1, + "fruitId": 40120, + "fruitCount": 200 + }, + { + "seedId": 20259, + "goodsId": 118, + "plantId": 1020259, + "name": "银莲花", + "requiredLevel": 17, + "price": 640, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 288, + "expPerCycle": 289, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 72.25, + "expPerGold": 0.451562, + "seasons": 1, + "fruitId": 40259, + "fruitCount": 200 + }, + { + "seedId": 20007, + "goodsId": 27, + "plantId": 1020007, + "name": "番茄", + "requiredLevel": 18, + "price": 1280, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 576, + "expPerCycle": 577, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 72.125, + "expPerGold": 0.450781, + "seasons": 1, + "fruitId": 40007, + "fruitCount": 200 + }, + { + "seedId": 20098, + "goodsId": 28, + "plantId": 1020098, + "name": "花菜", + "requiredLevel": 19, + "price": 1920, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 864, + "expPerCycle": 865, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 72.0833, + "expPerGold": 0.450521, + "seasons": 1, + "fruitId": 40098, + "fruitCount": 200 + }, + { + "seedId": 20305, + "goodsId": 61, + "plantId": 1020305, + "name": "韭菜", + "requiredLevel": 20, + "price": 3840, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 1728, + "expPerCycle": 1729, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 72.0417, + "expPerGold": 0.45026, + "seasons": 1, + "fruitId": 40305, + "fruitCount": 200 + }, + { + "seedId": 20105, + "goodsId": 119, + "plantId": 1020105, + "name": "小雏菊", + "requiredLevel": 21, + "price": 704, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 304, + "expPerCycle": 305, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 76.25, + "expPerGold": 0.433239, + "seasons": 1, + "fruitId": 40105, + "fruitCount": 200 + }, + { + "seedId": 20008, + "goodsId": 29, + "plantId": 1020008, + "name": "豌豆", + "requiredLevel": 22, + "price": 1408, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 608, + "expPerCycle": 609, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 76.125, + "expPerGold": 0.432528, + "seasons": 1, + "fruitId": 40008, + "fruitCount": 200 + }, + { + "seedId": 20037, + "goodsId": 63, + "plantId": 1020037, + "name": "莲藕", + "requiredLevel": 23, + "price": 2112, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 912, + "expPerCycle": 913, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 76.0833, + "expPerGold": 0.432292, + "seasons": 1, + "fruitId": 40037, + "fruitCount": 200 + }, + { + "seedId": 20041, + "goodsId": 30, + "plantId": 1020041, + "name": "红玫瑰", + "requiredLevel": 24, + "price": 4224, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 1824, + "expPerCycle": 1825, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 76.0417, + "expPerGold": 0.432055, + "seasons": 1, + "fruitId": 40041, + "fruitCount": 200 + }, + { + "seedId": 20161, + "goodsId": 120, + "plantId": 1020161, + "name": "秋菊(黄色)", + "requiredLevel": 25, + "price": 792, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 324, + "expPerCycle": 325, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 81.25, + "expPerGold": 0.410354, + "seasons": 1, + "fruitId": 40161, + "fruitCount": 200 + }, + { + "seedId": 20110, + "goodsId": 121, + "plantId": 1020110, + "name": "满天星", + "requiredLevel": 26, + "price": 1584, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 648, + "expPerCycle": 649, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 81.125, + "expPerGold": 0.409722, + "seasons": 1, + "fruitId": 40110, + "fruitCount": 200 + }, + { + "seedId": 20143, + "goodsId": 122, + "plantId": 1020143, + "name": "含羞草", + "requiredLevel": 27, + "price": 2376, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 972, + "expPerCycle": 973, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 81.0833, + "expPerGold": 0.409512, + "seasons": 1, + "fruitId": 40143, + "fruitCount": 200 + }, + { + "seedId": 20147, + "goodsId": 123, + "plantId": 1020147, + "name": "牵牛花", + "requiredLevel": 28, + "price": 4752, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 1944, + "expPerCycle": 1945, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 81.0417, + "expPerGold": 0.409301, + "seasons": 1, + "fruitId": 40147, + "fruitCount": 200 + }, + { + "seedId": 20162, + "goodsId": 124, + "plantId": 1020162, + "name": "秋菊(红色)", + "requiredLevel": 29, + "price": 888, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 344, + "expPerCycle": 345, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 86.25, + "expPerGold": 0.388514, + "seasons": 1, + "fruitId": 40162, + "fruitCount": 200 + }, + { + "seedId": 20009, + "goodsId": 31, + "plantId": 1020009, + "name": "辣椒", + "requiredLevel": 30, + "price": 1776, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 688, + "expPerCycle": 689, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 86.125, + "expPerGold": 0.38795, + "seasons": 1, + "fruitId": 40009, + "fruitCount": 200 + }, + { + "seedId": 20097, + "goodsId": 32, + "plantId": 1020097, + "name": "黄瓜", + "requiredLevel": 31, + "price": 2664, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 1032, + "expPerCycle": 1033, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 86.0833, + "expPerGold": 0.387763, + "seasons": 1, + "fruitId": 40097, + "fruitCount": 200 + }, + { + "seedId": 20306, + "goodsId": 64, + "plantId": 1020306, + "name": "芹菜", + "requiredLevel": 32, + "price": 5328, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 2064, + "expPerCycle": 2065, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 86.0417, + "expPerGold": 0.387575, + "seasons": 1, + "fruitId": 40306, + "fruitCount": 200 + }, + { + "seedId": 20103, + "goodsId": 125, + "plantId": 1020103, + "name": "天香百合", + "requiredLevel": 33, + "price": 992, + "unlocked": true, + "limitCount": 0, + "boughtNum": 0, + "exp": 368, + "expPerCycle": 369, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 92.25, + "expPerGold": 0.371976, + "seasons": 1, + "fruitId": 40103, + "fruitCount": 200 + }, + { + "seedId": 20010, + "goodsId": 33, + "plantId": 1020010, + "name": "南瓜", + "requiredLevel": 34, + "price": 1984, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 736, + "expPerCycle": 737, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 92.125, + "expPerGold": 0.371472, + "seasons": 1, + "fruitId": 40010, + "fruitCount": 200 + }, + { + "seedId": 20308, + "goodsId": 34, + "plantId": 1020308, + "name": "核桃", + "requiredLevel": 35, + "price": 2976, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1104, + "expPerCycle": 1105, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 92.0833, + "expPerGold": 0.371304, + "seasons": 1, + "fruitId": 40308, + "fruitCount": 200 + }, + { + "seedId": 20091, + "goodsId": 126, + "plantId": 1020091, + "name": "山楂", + "requiredLevel": 36, + "price": 5952, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2208, + "expPerCycle": 2209, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 92.0417, + "expPerGold": 0.371136, + "seasons": 1, + "fruitId": 40091, + "fruitCount": 200 + }, + { + "seedId": 20073, + "goodsId": 127, + "plantId": 1020073, + "name": "菠菜", + "requiredLevel": 37, + "price": 1120, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 392, + "expPerCycle": 393, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 98.25, + "expPerGold": 0.350893, + "seasons": 1, + "fruitId": 40073, + "fruitCount": 200 + }, + { + "seedId": 20001, + "goodsId": 35, + "plantId": 1020001, + "name": "草莓", + "requiredLevel": 38, + "price": 2240, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 784, + "expPerCycle": 785, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 98.125, + "expPerGold": 0.350446, + "seasons": 1, + "fruitId": 40001, + "fruitCount": 200 + }, + { + "seedId": 20011, + "goodsId": 36, + "plantId": 1020011, + "name": "苹果", + "requiredLevel": 39, + "price": 3360, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1176, + "expPerCycle": 1177, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 98.0833, + "expPerGold": 0.350298, + "seasons": 1, + "fruitId": 40011, + "fruitCount": 200 + }, + { + "seedId": 20062, + "goodsId": 128, + "plantId": 1020062, + "name": "四叶草", + "requiredLevel": 40, + "price": 6720, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2352, + "expPerCycle": 2353, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 98.0417, + "expPerGold": 0.350149, + "seasons": 1, + "fruitId": 40062, + "fruitCount": 200 + }, + { + "seedId": 20104, + "goodsId": 129, + "plantId": 1020104, + "name": "非洲菊", + "requiredLevel": 41, + "price": 1248, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 420, + "expPerCycle": 421, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 105.25, + "expPerGold": 0.33734, + "seasons": 1, + "fruitId": 40104, + "fruitCount": 200 + }, + { + "seedId": 20135, + "goodsId": 130, + "plantId": 1020135, + "name": "火绒草", + "requiredLevel": 42, + "price": 2496, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 840, + "expPerCycle": 841, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 105.125, + "expPerGold": 0.336939, + "seasons": 1, + "fruitId": 40135, + "fruitCount": 200 + }, + { + "seedId": 20141, + "goodsId": 131, + "plantId": 1020141, + "name": "花香根鸢尾", + "requiredLevel": 43, + "price": 3744, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1260, + "expPerCycle": 1261, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 105.0833, + "expPerGold": 0.336806, + "seasons": 1, + "fruitId": 40141, + "fruitCount": 200 + }, + { + "seedId": 20142, + "goodsId": 132, + "plantId": 1020142, + "name": "虞美人", + "requiredLevel": 44, + "price": 7488, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2520, + "expPerCycle": 2521, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 105.0417, + "expPerGold": 0.336672, + "seasons": 1, + "fruitId": 40142, + "fruitCount": 200 + }, + { + "seedId": 20145, + "goodsId": 133, + "plantId": 1020145, + "name": "向日葵", + "requiredLevel": 45, + "price": 1400, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 448, + "expPerCycle": 449, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 112.25, + "expPerGold": 0.320714, + "seasons": 1, + "fruitId": 40145, + "fruitCount": 200 + }, + { + "seedId": 20014, + "goodsId": 37, + "plantId": 1020014, + "name": "西瓜", + "requiredLevel": 46, + "price": 2800, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 896, + "expPerCycle": 897, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 112.125, + "expPerGold": 0.320357, + "seasons": 1, + "fruitId": 40014, + "fruitCount": 200 + }, + { + "seedId": 20070, + "goodsId": 38, + "plantId": 1020070, + "name": "黄豆", + "requiredLevel": 47, + "price": 4200, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1344, + "expPerCycle": 1345, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 112.0833, + "expPerGold": 0.320238, + "seasons": 1, + "fruitId": 40070, + "fruitCount": 200 + }, + { + "seedId": 20015, + "goodsId": 39, + "plantId": 1020015, + "name": "香蕉", + "requiredLevel": 48, + "price": 8400, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2688, + "expPerCycle": 2689, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 112.0417, + "expPerGold": 0.320119, + "seasons": 1, + "fruitId": 40015, + "fruitCount": 200 + }, + { + "seedId": 20100, + "goodsId": 40, + "plantId": 1020100, + "name": "竹笋", + "requiredLevel": 49, + "price": 1560, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 476, + "expPerCycle": 477, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 119.25, + "expPerGold": 0.305769, + "seasons": 1, + "fruitId": 40100, + "fruitCount": 200 + }, + { + "seedId": 20018, + "goodsId": 41, + "plantId": 1020018, + "name": "桃子", + "requiredLevel": 50, + "price": 3120, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 952, + "expPerCycle": 953, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 119.125, + "expPerGold": 0.305449, + "seasons": 1, + "fruitId": 40018, + "fruitCount": 200 + }, + { + "seedId": 20047, + "goodsId": 42, + "plantId": 1020047, + "name": "甘蔗", + "requiredLevel": 51, + "price": 4680, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1428, + "expPerCycle": 1429, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 119.0833, + "expPerGold": 0.305342, + "seasons": 1, + "fruitId": 40047, + "fruitCount": 200 + }, + { + "seedId": 20019, + "goodsId": 43, + "plantId": 1020019, + "name": "橙子", + "requiredLevel": 52, + "price": 9360, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2856, + "expPerCycle": 2857, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 119.0417, + "expPerGold": 0.305235, + "seasons": 1, + "fruitId": 40019, + "fruitCount": 200 + }, + { + "seedId": 20128, + "goodsId": 134, + "plantId": 1020128, + "name": "茉莉花", + "requiredLevel": 53, + "price": 1728, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 508, + "expPerCycle": 509, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 127.25, + "expPerGold": 0.29456, + "seasons": 1, + "fruitId": 40128, + "fruitCount": 200 + }, + { + "seedId": 20013, + "goodsId": 44, + "plantId": 1020013, + "name": "葡萄", + "requiredLevel": 54, + "price": 3456, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1016, + "expPerCycle": 1017, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 127.125, + "expPerGold": 0.294271, + "seasons": 1, + "fruitId": 40013, + "fruitCount": 200 + }, + { + "seedId": 20044, + "goodsId": 45, + "plantId": 1020044, + "name": "丝瓜", + "requiredLevel": 55, + "price": 5184, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1524, + "expPerCycle": 1525, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 127.0833, + "expPerGold": 0.294174, + "seasons": 1, + "fruitId": 40044, + "fruitCount": 200 + }, + { + "seedId": 20072, + "goodsId": 66, + "plantId": 1020072, + "name": "榛子", + "requiredLevel": 56, + "price": 10368, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3048, + "expPerCycle": 3049, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 127.0417, + "expPerGold": 0.294078, + "seasons": 1, + "fruitId": 40072, + "fruitCount": 200 + }, + { + "seedId": 20396, + "goodsId": 46, + "plantId": 1020396, + "name": "迎春花", + "requiredLevel": 57, + "price": 1920, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 540, + "expPerCycle": 541, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 135.25, + "expPerGold": 0.281771, + "seasons": 1, + "fruitId": 40396, + "fruitCount": 200 + }, + { + "seedId": 20023, + "goodsId": 47, + "plantId": 1020023, + "name": "石榴", + "requiredLevel": 58, + "price": 3840, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1080, + "expPerCycle": 1081, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 135.125, + "expPerGold": 0.28151, + "seasons": 1, + "fruitId": 40023, + "fruitCount": 200 + }, + { + "seedId": 20095, + "goodsId": 48, + "plantId": 1020095, + "name": "栗子", + "requiredLevel": 59, + "price": 5760, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1620, + "expPerCycle": 1621, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 135.0833, + "expPerGold": 0.281424, + "seasons": 1, + "fruitId": 40095, + "fruitCount": 200 + }, + { + "seedId": 20026, + "goodsId": 49, + "plantId": 1020026, + "name": "柚子", + "requiredLevel": 60, + "price": 11520, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3240, + "expPerCycle": 3241, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 135.0417, + "expPerGold": 0.281337, + "seasons": 1, + "fruitId": 40026, + "fruitCount": 200 + }, + { + "seedId": 20050, + "goodsId": 50, + "plantId": 1020050, + "name": "蘑菇", + "requiredLevel": 61, + "price": 3168, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 429, + "expPerCycle": 430, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 107.5, + "expPerGold": 0.135732, + "seasons": 2, + "fruitId": 40050, + "fruitCount": 200 + }, + { + "seedId": 20027, + "goodsId": 51, + "plantId": 1020027, + "name": "菠萝", + "requiredLevel": 62, + "price": 6336, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 858, + "expPerCycle": 859, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 107.375, + "expPerGold": 0.135574, + "seasons": 2, + "fruitId": 40027, + "fruitCount": 200 + }, + { + "seedId": 20036, + "goodsId": 52, + "plantId": 1020036, + "name": "箬竹", + "requiredLevel": 63, + "price": 9504, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1287, + "expPerCycle": 1288, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 107.3333, + "expPerGold": 0.135522, + "seasons": 2, + "fruitId": 40036, + "fruitCount": 200 + }, + { + "seedId": 20043, + "goodsId": 68, + "plantId": 1020043, + "name": "无花果", + "requiredLevel": 64, + "price": 19008, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2574, + "expPerCycle": 2575, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 107.2917, + "expPerGold": 0.135469, + "seasons": 2, + "fruitId": 40043, + "fruitCount": 200 + }, + { + "seedId": 20029, + "goodsId": 53, + "plantId": 1020029, + "name": "椰子", + "requiredLevel": 65, + "price": 3492, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 456, + "expPerCycle": 457, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 114.25, + "expPerGold": 0.130871, + "seasons": 2, + "fruitId": 40029, + "fruitCount": 200 + }, + { + "seedId": 20049, + "goodsId": 54, + "plantId": 1020049, + "name": "花生", + "requiredLevel": 66, + "price": 6984, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 912, + "expPerCycle": 913, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 114.125, + "expPerGold": 0.130727, + "seasons": 2, + "fruitId": 40049, + "fruitCount": 200 + }, + { + "seedId": 20052, + "goodsId": 70, + "plantId": 1020052, + "name": "金针菇", + "requiredLevel": 67, + "price": 10476, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1368, + "expPerCycle": 1369, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 114.0833, + "expPerGold": 0.13068, + "seasons": 2, + "fruitId": 40052, + "fruitCount": 200 + }, + { + "seedId": 20031, + "goodsId": 55, + "plantId": 1020031, + "name": "葫芦", + "requiredLevel": 68, + "price": 20952, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2736, + "expPerCycle": 2737, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 114.0417, + "expPerGold": 0.130632, + "seasons": 2, + "fruitId": 40031, + "fruitCount": 200 + }, + { + "seedId": 20045, + "goodsId": 56, + "plantId": 1020045, + "name": "猕猴桃", + "requiredLevel": 69, + "price": 3828, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 480, + "expPerCycle": 481, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 120.25, + "expPerGold": 0.125653, + "seasons": 2, + "fruitId": 40045, + "fruitCount": 200 + }, + { + "seedId": 20054, + "goodsId": 74, + "plantId": 1020054, + "name": "梨", + "requiredLevel": 70, + "price": 7656, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 960, + "expPerCycle": 961, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 120.125, + "expPerGold": 0.125522, + "seasons": 2, + "fruitId": 40054, + "fruitCount": 200 + }, + { + "seedId": 20442, + "goodsId": 78, + "plantId": 1020442, + "name": "睡莲", + "requiredLevel": 71, + "price": 11484, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1440, + "expPerCycle": 1441, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 120.0833, + "expPerGold": 0.125479, + "seasons": 2, + "fruitId": 40442, + "fruitCount": 200 + }, + { + "seedId": 20033, + "goodsId": 83, + "plantId": 1020033, + "name": "火龙果", + "requiredLevel": 72, + "price": 22968, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2880, + "expPerCycle": 2881, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 120.0417, + "expPerGold": 0.125435, + "seasons": 2, + "fruitId": 40033, + "fruitCount": 200 + }, + { + "seedId": 20055, + "goodsId": 62, + "plantId": 1020055, + "name": "枇杷", + "requiredLevel": 73, + "price": 4176, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 510, + "expPerCycle": 511, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 127.75, + "expPerGold": 0.122366, + "seasons": 2, + "fruitId": 40055, + "fruitCount": 200 + }, + { + "seedId": 20034, + "goodsId": 65, + "plantId": 1020034, + "name": "樱桃", + "requiredLevel": 74, + "price": 8352, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1020, + "expPerCycle": 1021, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 127.625, + "expPerGold": 0.122246, + "seasons": 2, + "fruitId": 40034, + "fruitCount": 200 + }, + { + "seedId": 20413, + "goodsId": 67, + "plantId": 1020413, + "name": "李子", + "requiredLevel": 75, + "price": 12528, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1530, + "expPerCycle": 1531, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 127.5833, + "expPerGold": 0.122206, + "seasons": 2, + "fruitId": 40413, + "fruitCount": 200 + }, + { + "seedId": 20035, + "goodsId": 69, + "plantId": 1020035, + "name": "荔枝", + "requiredLevel": 76, + "price": 25056, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3060, + "expPerCycle": 3061, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 127.5417, + "expPerGold": 0.122166, + "seasons": 2, + "fruitId": 40035, + "fruitCount": 200 + }, + { + "seedId": 20067, + "goodsId": 72, + "plantId": 1020067, + "name": "香瓜", + "requiredLevel": 77, + "price": 4560, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 537, + "expPerCycle": 538, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 134.5, + "expPerGold": 0.117982, + "seasons": 2, + "fruitId": 40067, + "fruitCount": 200 + }, + { + "seedId": 20038, + "goodsId": 75, + "plantId": 1020038, + "name": "木瓜", + "requiredLevel": 78, + "price": 9120, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1074, + "expPerCycle": 1075, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 134.375, + "expPerGold": 0.117873, + "seasons": 2, + "fruitId": 40038, + "fruitCount": 200 + }, + { + "seedId": 20053, + "goodsId": 77, + "plantId": 1020053, + "name": "桂圆", + "requiredLevel": 79, + "price": 13680, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1611, + "expPerCycle": 1612, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 134.3333, + "expPerGold": 0.117836, + "seasons": 2, + "fruitId": 40053, + "fruitCount": 200 + }, + { + "seedId": 20080, + "goodsId": 80, + "plantId": 1020080, + "name": "月柿", + "requiredLevel": 80, + "price": 27360, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3222, + "expPerCycle": 3223, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 134.2917, + "expPerGold": 0.1178, + "seasons": 2, + "fruitId": 40080, + "fruitCount": 200 + }, + { + "seedId": 20039, + "goodsId": 82, + "plantId": 1020039, + "name": "杨桃", + "requiredLevel": 81, + "price": 4944, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 567, + "expPerCycle": 568, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 142, + "expPerGold": 0.114887, + "seasons": 2, + "fruitId": 40039, + "fruitCount": 200 + }, + { + "seedId": 20056, + "goodsId": 84, + "plantId": 1020056, + "name": "哈密瓜", + "requiredLevel": 82, + "price": 9888, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1134, + "expPerCycle": 1135, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 141.875, + "expPerGold": 0.114786, + "seasons": 2, + "fruitId": 40056, + "fruitCount": 200 + }, + { + "seedId": 20075, + "goodsId": 71, + "plantId": 1020075, + "name": "桑葚", + "requiredLevel": 83, + "price": 14832, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1701, + "expPerCycle": 1702, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 141.8333, + "expPerGold": 0.114752, + "seasons": 2, + "fruitId": 40075, + "fruitCount": 200 + }, + { + "seedId": 20042, + "goodsId": 73, + "plantId": 1020042, + "name": "柠檬", + "requiredLevel": 84, + "price": 29664, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3402, + "expPerCycle": 3403, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 141.7917, + "expPerGold": 0.114718, + "seasons": 2, + "fruitId": 40042, + "fruitCount": 200 + }, + { + "seedId": 20057, + "goodsId": 76, + "plantId": 1020057, + "name": "芒果", + "requiredLevel": 85, + "price": 5364, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 597, + "expPerCycle": 598, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 149.5, + "expPerGold": 0.111484, + "seasons": 2, + "fruitId": 40057, + "fruitCount": 200 + }, + { + "seedId": 20048, + "goodsId": 79, + "plantId": 1020048, + "name": "杨梅", + "requiredLevel": 86, + "price": 10728, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1194, + "expPerCycle": 1195, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 149.375, + "expPerGold": 0.111391, + "seasons": 2, + "fruitId": 40048, + "fruitCount": 200 + }, + { + "seedId": 20058, + "goodsId": 81, + "plantId": 1020058, + "name": "榴莲", + "requiredLevel": 87, + "price": 16092, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1791, + "expPerCycle": 1792, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 149.3333, + "expPerGold": 0.11136, + "seasons": 2, + "fruitId": 40058, + "fruitCount": 200 + }, + { + "seedId": 20079, + "goodsId": 85, + "plantId": 1020079, + "name": "番石榴", + "requiredLevel": 88, + "price": 32184, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3582, + "expPerCycle": 3583, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 149.2917, + "expPerGold": 0.111329, + "seasons": 2, + "fruitId": 40079, + "fruitCount": 200 + }, + { + "seedId": 20218, + "goodsId": 57, + "plantId": 1020218, + "name": "瓶子树", + "requiredLevel": 89, + "price": 5796, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 627, + "expPerCycle": 628, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 157, + "expPerGold": 0.108351, + "seasons": 2, + "fruitId": 40218, + "fruitCount": 200 + }, + { + "seedId": 20077, + "goodsId": 86, + "plantId": 1020077, + "name": "蓝莓", + "requiredLevel": 90, + "price": 11592, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1254, + "expPerCycle": 1255, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 156.875, + "expPerGold": 0.108264, + "seasons": 2, + "fruitId": 40077, + "fruitCount": 200 + }, + { + "seedId": 20220, + "goodsId": 58, + "plantId": 1020220, + "name": "猪笼草", + "requiredLevel": 91, + "price": 17388, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1881, + "expPerCycle": 1882, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 156.8333, + "expPerGold": 0.108236, + "seasons": 2, + "fruitId": 40220, + "fruitCount": 200 + }, + { + "seedId": 20076, + "goodsId": 87, + "plantId": 1020076, + "name": "山竹", + "requiredLevel": 92, + "price": 34776, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3762, + "expPerCycle": 3763, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 156.7917, + "expPerGold": 0.108207, + "seasons": 2, + "fruitId": 40076, + "fruitCount": 200 + }, + { + "seedId": 20116, + "goodsId": 59, + "plantId": 1020116, + "name": "曼陀罗华", + "requiredLevel": 93, + "price": 6240, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 660, + "expPerCycle": 661, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 165.25, + "expPerGold": 0.105929, + "seasons": 2, + "fruitId": 40116, + "fruitCount": 200 + }, + { + "seedId": 20126, + "goodsId": 88, + "plantId": 1020126, + "name": "曼珠沙华", + "requiredLevel": 94, + "price": 12480, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1320, + "expPerCycle": 1321, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 165.125, + "expPerGold": 0.105849, + "seasons": 2, + "fruitId": 40126, + "fruitCount": 200 + }, + { + "seedId": 20063, + "goodsId": 89, + "plantId": 1020063, + "name": "苦瓜", + "requiredLevel": 95, + "price": 18720, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1980, + "expPerCycle": 1981, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 165.0833, + "expPerGold": 0.105823, + "seasons": 2, + "fruitId": 40063, + "fruitCount": 200 + }, + { + "seedId": 20221, + "goodsId": 93, + "plantId": 1020221, + "name": "天堂鸟", + "requiredLevel": 96, + "price": 37440, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 3960, + "expPerCycle": 3961, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 165.0417, + "expPerGold": 0.105796, + "seasons": 2, + "fruitId": 40221, + "fruitCount": 200 + }, + { + "seedId": 20068, + "goodsId": 92, + "plantId": 1020068, + "name": "冬瓜", + "requiredLevel": 97, + "price": 6720, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 693, + "expPerCycle": 694, + "growTimeSec": 14400, + "growTimeStr": "4小时", + "expPerHour": 173.5, + "expPerGold": 0.103274, + "seasons": 2, + "fruitId": 40068, + "fruitCount": 200 + }, + { + "seedId": 20222, + "goodsId": 94, + "plantId": 1020222, + "name": "豹皮花", + "requiredLevel": 98, + "price": 13440, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 1386, + "expPerCycle": 1387, + "growTimeSec": 28800, + "growTimeStr": "8小时", + "expPerHour": 173.375, + "expPerGold": 0.103199, + "seasons": 2, + "fruitId": 40222, + "fruitCount": 200 + }, + { + "seedId": 20078, + "goodsId": 96, + "plantId": 1020078, + "name": "杏子", + "requiredLevel": 99, + "price": 20160, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 2079, + "expPerCycle": 2080, + "growTimeSec": 43200, + "growTimeStr": "12小时", + "expPerHour": 173.3333, + "expPerGold": 0.103175, + "seasons": 2, + "fruitId": 40078, + "fruitCount": 200 + }, + { + "seedId": 20074, + "goodsId": 100, + "plantId": 1020074, + "name": "金桔", + "requiredLevel": 100, + "price": 40320, + "unlocked": false, + "limitCount": 0, + "boughtNum": 0, + "exp": 4158, + "expPerCycle": 4159, + "growTimeSec": 86400, + "growTimeStr": "24小时", + "expPerHour": 173.2917, + "expPerGold": 0.10315, + "seasons": 2, + "fruitId": 40074, + "fruitCount": 200 + } + ] +} \ No newline at end of file diff --git a/211/web/.gitignore b/211/web/.gitignore new file mode 100644 index 0000000..6bd782d --- /dev/null +++ b/211/web/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.crop_list.md diff --git a/211/web/README.md b/211/web/README.md new file mode 100644 index 0000000..d2e7761 --- /dev/null +++ b/211/web/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/211/web/components.json b/211/web/components.json new file mode 100644 index 0000000..abd3aa3 --- /dev/null +++ b/211/web/components.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/211/web/eslint.config.js b/211/web/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/211/web/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/211/web/index.html b/211/web/index.html new file mode 100644 index 0000000..d6359d4 --- /dev/null +++ b/211/web/index.html @@ -0,0 +1,13 @@ + + + + + + + 谢尔达莱群岛 + + +
+ + + diff --git a/211/web/package-lock.json b/211/web/package-lock.json new file mode 100644 index 0000000..2605cc7 --- /dev/null +++ b/211/web/package-lock.json @@ -0,0 +1,5329 @@ +{ + "name": "web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.0.0", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.13.0", + "socket.io-client": "^4.8.3", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.13", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.24", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", + "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", + "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz", + "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz", + "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz", + "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz", + "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz", + "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz", + "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz", + "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz", + "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz", + "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/engine.io-client": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", + "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.563.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.563.0.tgz", + "integrity": "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz", + "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz", + "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==", + "license": "MIT", + "dependencies": { + "react-router": "7.13.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io-client": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", + "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.55.0.tgz", + "integrity": "sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/211/web/package.json b/211/web/package.json new file mode 100644 index 0000000..d290d22 --- /dev/null +++ b/211/web/package.json @@ -0,0 +1,45 @@ +{ + "name": "web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-label": "^2.1.8", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.563.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.13.0", + "socket.io-client": "^4.8.3", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.13", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.24", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.17", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.9.3", + "typescript-eslint": "^8.48.0", + "vite": "^7.3.1" + } +} diff --git a/211/web/postcss.config.js b/211/web/postcss.config.js new file mode 100644 index 0000000..6e297cd --- /dev/null +++ b/211/web/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, + } diff --git a/211/web/public/logo.png b/211/web/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5e92acb3f2d39ad31b051fa637451bcd1c241591 GIT binary patch literal 6412 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 Dyb8=A literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/mapping.csv b/211/web/public/shop_plants_organized/mapping.csv new file mode 100644 index 0000000..8b23205 --- /dev/null +++ b/211/web/public/shop_plants_organized/mapping.csv @@ -0,0 +1,101 @@ +Seed ID,Seed Name,Plant ID,Plant Name,New File,Original File +20002,白萝卜种子,1020002,白萝卜,白萝卜_from_白萝卜种子_1020002.png,aa2d4772-8b90-417c-89be-c098e1cbb35c.edc47.png +20003,胡萝卜种子,1020003,胡萝卜,胡萝卜_from_胡萝卜种子_1020003.png,a823c190-2bd8-4b86-bbac-6c5cbf0c465d.3a774.png +20059,大白菜种子,1020059,大白菜,大白菜_from_大白菜种子_1020059.png,d4057a83-ecef-45fb-8988-905b56ae7ce3.b3280.png +20065,大蒜种子,1020065,大蒜,大蒜_from_大蒜种子_1020065.png,5a1d18bc-32f9-40d7-8cd3-be00b79004cc.2d769.png +20064,大葱种子,1020064,大葱,大葱_from_大葱种子_1020064.png,9bf36963-4f34-4c9d-b967-73ec64d1e924.2adf2.png +20060,水稻种子,1020060,水稻,水稻_from_水稻种子_1020060.png,e059e031-6953-402e-9d2b-88644465dc81.c5f7f.png +20061,小麦种子,1020061,小麦,小麦_from_小麦种子_1020061.png,2446c70c-20b6-4e3c-8a2f-5d64a044ded6.7abe2.png +20004,玉米种子,1020004,玉米,玉米_from_玉米种子_1020004.png,956ddaa2-27aa-4b9b-aa72-413390ecaaf5.de27e.png +20066,鲜姜种子,1020066,鲜姜,鲜姜_from_鲜姜种子_1020066.png,3a7230b2-a8b4-434a-83bf-4cb850c6b291.2dbd6.png +20005,土豆种子,1020005,土豆,土豆_from_土豆种子_1020005.png,95f857bc-ce3a-47f6-aae0-20ec6f84d21a.aad11.png +20071,小白菜种子,1020071,小白菜,小白菜_from_小白菜种子_1020071.png,07ca7a88-3983-42f9-8402-fdec001cb51c.d3538.png +20096,生菜种子,1020096,生菜,生菜_from_生菜种子_1020096.png,c7879560-b0d9-4f21-ab73-3fb4f083ddc5.9ce85.png +20099,油菜种子,1020099,油菜,油菜_from_油菜种子_1020099.png,35f65e28-3b35-4466-a040-e1b686085c23.0d18d.png +20006,茄子种子,1020006,茄子,茄子_from_茄子种子_1020006.png,2a626649-1952-41ef-8d5a-5ebbb726e479.ae717.png +20051,红枣种子,1020051,红枣,红枣_from_红枣种子_1020051.png,095fd7f0-24a0-415a-b4b8-96a8aeb07ba5.5e6bb.png +20120,蒲公英种子,1020120,蒲公英,蒲公英_from_蒲公英种子_1020120.png,8de9453f-e6ef-40ff-a678-3da9bb861bb5.462a2.png +20259,银莲花种子,1020259,银莲花,银莲花_from_银莲花种子_1020259.png,8df7c28d-ba7c-477d-a68e-39fb027e3969.d8964.png +20007,番茄种子,1020007,番茄,番茄_from_番茄种子_1020007.png,f7d5b3a4-c759-461f-bd81-79d8df59cbe2.af9b3.png +20098,花菜种子,1020098,花菜,花菜_from_花菜种子_1020098.png,f44f642e-4cd9-4c3d-bb25-269ba52d424a.1cbab.png +20305,韭菜种子,1020305,韭菜,韭菜_from_韭菜种子_1020305.png,7599bc40-a5d7-4834-8ed8-3e6eab7216ff.37c46.png +20105,小雏菊种子,1020105,小雏菊,小雏菊_from_小雏菊种子_1020105.png,b4f19058-1031-420f-ab64-feb4432c60a6.db1b3.png +20008,豌豆种子,1020008,豌豆,豌豆_from_豌豆种子_1020008.png,f55a4326-3e65-429e-a615-f5c7c867e451.154ba.png +20037,莲藕种子,1020037,莲藕,莲藕_from_莲藕种子_1020037.png,bb9c6484-1269-44f1-a203-74aa05fecc1d.1199a.png +20041,红玫瑰种子,1020041,红玫瑰,红玫瑰_from_红玫瑰种子_1020041.png,340b1098-6163-404c-97f9-86cbbc00336b.9b2a8.png +20161,黄色秋菊种子,1020161,秋菊(黄色),秋菊黄色_from_黄色秋菊种子_1020161.png,b72a754f-4e24-451d-a12a-a318f3937a05.641b4.png +20110,满天星种子,1020110,满天星,满天星_from_满天星种子_1020110.png,48593983-6831-4a94-8678-28a8c4304f54.39b33.png +20143,含羞草种子,1020143,含羞草,含羞草_from_含羞草种子_1020143.png,ee3d377e-30e5-4572-bd4d-6019cf1e6352.b468e.png +20147,牵牛花种子,1020147,牵牛花,牵牛花_from_牵牛花种子_1020147.png,54ce926b-ef79-4f1b-920b-756d8368408f.b863a.png +20162,红色秋菊种子,1020162,秋菊(红色),秋菊红色_from_红色秋菊种子_1020162.png,f3a09490-43c0-4d04-8a3a-679f9e25efe8.e0011.png +20009,辣椒种子,1020009,辣椒,辣椒_from_辣椒种子_1020009.png,7eed9dde-2174-4d6d-84e2-5fdb7276eaf3.7d364.png +20097,黄瓜种子,1020097,黄瓜,黄瓜_from_黄瓜种子_1020097.png,722e3547-d04e-4501-9aad-148af16cc8cb.bc687.png +20306,芹菜种子,1020306,芹菜,芹菜_from_芹菜种子_1020306.png,6d172f29-286f-4f58-88f7-e6776a863ef7.94097.png +20103,天香百合种子,1020103,天香百合,天香百合_from_天香百合种子_1020103.png,e5f9d964-28ee-4491-b714-ba917a9cec87.2710f.png +20010,南瓜种子,1020010,南瓜,南瓜_from_南瓜种子_1020010.png,0009ad77-fd65-48fa-af78-29c9872d8476.c388e.png +20308,核桃种子,1020308,核桃,核桃_from_核桃种子_1020308.png,b3b7045f-2b34-41ac-9e94-aaaf6083e06a.cf434.png +20091,山楂种子,1020091,山楂,山楂_from_山楂种子_1020091.png,4501b8e9-144e-497a-b282-ca1df8e17ee2.0f537.png +20073,菠菜种子,1020073,菠菜,菠菜_from_菠菜种子_1020073.png,a9429882-6c61-4d3b-83a4-38da55470b6a.22bda.png +20001,草莓种子,1020001,草莓,草莓_from_草莓种子_1020001.png,8d7c740a-e144-458d-95c3-15d95efa8bc3.17504.png +20011,苹果种子,1020011,苹果,苹果_from_苹果种子_1020011.png,5eff94d0-05ff-4e1d-a584-cfa473dcb5ca.250fc.png +20062,四叶草种子,1020062,四叶草,四叶草_from_四叶草种子_1020062.png,35aba40d-33bc-465c-8c58-f9b45bd61ca1.b4b9d.png +20104,非洲菊种子,1020104,非洲菊,非洲菊_from_非洲菊种子_1020104.png,5432d98e-84cb-4456-af35-ea2b8b194efe.cab54.png +20135,火绒草种子,1020135,火绒草,火绒草_from_火绒草种子_1020135.png,637a9c4e-fe92-4416-b913-f25ac46daab9.0fcc7.png +20141,花香根鸢尾种子,1020141,花香根鸢尾,花香根鸢尾_from_花香根鸢尾种子_1020141.png,5687ef62-528d-4faf-8380-a3d9fc14dd6f.a64a2.png +20142,虞美人种子,1020142,虞美人,虞美人_from_虞美人种子_1020142.png,74b327cb-e6db-496b-b665-3b3ceeee04f0.697d9.png +20145,向日葵种子,1020145,向日葵,向日葵_from_向日葵种子_1020145.png,fe45b6b7-3081-4541-bd1f-54bfded448ee.10c63.png +20014,西瓜种子,1020014,西瓜,西瓜_from_西瓜种子_1020014.png,74d60e9d-aee3-4fad-be3c-6c34b2c479d2.4a5b0.png +20070,黄豆种子,1020070,黄豆,黄豆_from_黄豆种子_1020070.png,de01453f-1159-490b-b312-6f9906cb8e38.426f8.png +20015,香蕉种子,1020015,香蕉,香蕉_from_香蕉种子_1020015.png,0ea242a7-5188-4296-8700-b4a2e00347b8.c925f.png +20100,竹笋种子,1020100,竹笋,竹笋_from_竹笋种子_1020100.png,c0fc1d8d-0c10-471a-83f4-14c400902a39.0beb7.png +20018,桃子种子,1020018,桃子,桃子_from_桃子种子_1020018.png,9ec730e7-4a9b-4825-bb45-046f1c5477b1.81f7f.png +20047,甘蔗种子,1020047,甘蔗,甘蔗_from_甘蔗种子_1020047.png,fabbc1bf-6622-433a-9471-8839d4a1aad3.b0296.png +20019,橙子种子,1020019,橙子,橙子_from_橙子种子_1020019.png,be59e9ef-d6b5-4a70-8b1d-b2a81851eaa2.537dc.png +20128,茉莉花种子,1020128,茉莉花,茉莉花_from_茉莉花种子_1020128.png,17d7dee5-e114-46f0-8017-506863370df9.ded8d.png +20013,葡萄种子,1020013,葡萄,葡萄_from_葡萄种子_1020013.png,4d63db88-33bc-4783-aeba-5213c0db86b9.cb70d.png +20044,丝瓜种子,1020044,丝瓜,丝瓜_from_丝瓜种子_1020044.png,5c446801-84f3-44fd-a066-9264a619ae04.e025a.png +20072,榛子种子,1020072,榛子,榛子_from_榛子种子_1020072.png,57888e00-33a6-4e1e-b7f7-b6a67b651935.576df.png +20396,迎春花种子,1020396,迎春花,迎春花_from_迎春花种子_1020396.png,32376957-bcd7-4dca-9bdc-7053da6fae7b.c0f12.png +20023,石榴种子,1020023,石榴,石榴_from_石榴种子_1020023.png,2a303167-26ac-4a76-8238-d8f5b90f2c5f.01562.png +20095,栗子种子,1020095,栗子,栗子_from_栗子种子_1020095.png,d1531233-1602-4322-9d08-25445ccd123f.e12b0.png +20026,柚子种子,1020026,柚子,柚子_from_柚子种子_1020026.png,c4a71275-ddce-4607-b9fc-93625244d256.6caf7.png +20050,蘑菇种子,1020050,蘑菇,蘑菇_from_蘑菇种子_1020050.png,09c2f94f-e865-472f-b599-5e857925ecfe.27d63.png +20027,菠萝种子,1020027,菠萝,菠萝_from_菠萝种子_1020027.png,37fed013-1f29-4686-992a-bbbf7bc79350.eadc1.png +20036,箬竹种子,1020036,箬竹,箬竹_from_箬竹种子_1020036.png,f75e1ed3-acfd-4bdf-bae5-a64459ed0347.e88b0.png +20043,无花果种子,1020043,无花果,无花果_from_无花果种子_1020043.png,68e20b28-d9a4-40cc-a3f0-8ff2d2ba2fc9.d9e75.png +20029,椰子种子,1020029,椰子,椰子_from_椰子种子_1020029.png,3a2d2a6e-02b3-4a67-ac63-847f728c1279.c7bf9.png +20049,花生种子,1020049,花生,花生_from_花生种子_1020049.png,30f01814-4b36-4838-9c93-d34a823db6a0.416fa.png +20052,金针菇种子,1020052,金针菇,金针菇_from_金针菇种子_1020052.png,aa0ddbb8-3102-4428-bad4-c8ad39dfab9e.f2ac9.png +20031,葫芦种子,1020031,葫芦,葫芦_from_葫芦种子_1020031.png,7cde3aa5-1732-4215-9b5d-e0aac6550f3f.73909.png +20045,猕猴桃种子,1020045,猕猴桃,猕猴桃_from_猕猴桃种子_1020045.png,d4e03a5a-6e87-4761-b29c-83835c5665b9.4dceb.png +20054,梨种子,1020054,梨,梨_from_梨种子_1020054.png,93760003-3cc3-4a51-abe4-963543437406.04b44.png +20442,睡莲种子,1020442,睡莲,睡莲_from_睡莲种子_1020442.png,00beea60-aa61-4283-a6f3-431605582581.4f00c.png +20033,火龙果种子,1020033,火龙果,火龙果_from_火龙果种子_1020033.png,51f55501-d2b0-4c14-929c-abfc08cef212.074ee.png +20055,枇杷种子,1020055,枇杷,枇杷_from_枇杷种子_1020055.png,af64a49f-6266-414c-810b-0e03a2edaf11.e40c4.png +20034,樱桃种子,1020034,樱桃,樱桃_from_樱桃种子_1020034.png,01f07ecf-6303-4b54-8a1a-ea64f5928855.8315d.png +20413,李子种子,1020413,李子,李子_from_李子种子_1020413.png,ddd8134a-15e5-4fbd-a7f6-a26457e638e2.e7bfc.png +20035,荔枝种子,1020035,荔枝,荔枝_from_荔枝种子_1020035.png,07232d7e-3d5e-4d48-923e-d70c2b64873b.85999.png +20067,香瓜种子,1020067,香瓜,香瓜_from_香瓜种子_1020067.png,4a30dcd3-efd2-4ff2-b406-7e81ab3f4923.281bf.png +20038,木瓜种子,1020038,木瓜,木瓜_from_木瓜种子_1020038.png,8816cd72-1ebd-4904-bd50-509a8e3798fb.32cf3.png +20053,桂圆种子,1020053,桂圆,桂圆_from_桂圆种子_1020053.png,ef610bda-bc53-46e7-a0fa-a519a8b180d0.db94d.png +20080,月柿种子,1020080,月柿,月柿_from_月柿种子_1020080.png,727dfe57-ed34-4e96-b8e2-bc856211c39f.4f667.png +20039,杨桃种子,1020039,杨桃,杨桃_from_杨桃种子_1020039.png,3be855b2-ac62-4e8f-b754-8ef8d8d1e46a.e08ca.png +20056,哈密瓜种子,1020056,哈密瓜,哈密瓜_from_哈密瓜种子_1020056.png,0e787d09-1443-4c0f-b496-e0f037983758.59eff.png +20075,桑葚种子,1020075,桑葚,桑葚_from_桑葚种子_1020075.png,e1c7e781-d74f-478d-b44e-cd37fc54294e.b2f01.png +20042,柠檬种子,1020042,柠檬,柠檬_from_柠檬种子_1020042.png,d78193cf-a7a5-40b4-ae67-d1519480503e.188c4.png +20057,芒果种子,1020057,芒果,芒果_from_芒果种子_1020057.png,44bd1002-5c47-47be-b9bc-1ae0fb9a26f2.4c8b1.png +20048,杨梅种子,1020048,杨梅,杨梅_from_杨梅种子_1020048.png,9eb47072-a3ae-4239-99b3-5d1fde9129d9.415cc.png +20058,榴莲种子,1020058,榴莲,榴莲_from_榴莲种子_1020058.png,7816ce22-6077-4175-8632-9f147402c98f.d5a93.png +20079,番石榴种子,1020079,番石榴,番石榴_from_番石榴种子_1020079.png,57fada3e-788a-4384-9ff7-b0d50b6a0e57.2fc48.png +20218,瓶子树种子,1020218,瓶子树,瓶子树_from_瓶子树种子_1020218.png,189f164a-a8d8-40ec-918f-567249467619.be91f.png +20077,蓝莓种子,1020077,蓝莓,蓝莓_from_蓝莓种子_1020077.png,80ae7506-850f-451f-9e18-57c11f62bca2.c3710.png +20220,猪笼草种子,1020220,猪笼草,猪笼草_from_猪笼草种子_1020220.png,7d2e3b7f-57e1-4491-8d55-cc485b8a548e.c5826.png +20076,山竹种子,1020076,山竹,山竹_from_山竹种子_1020076.png,8c490c1a-5085-4f5f-bf06-0a35b39e10e9.1c974.png +20116,曼陀罗华种子,1020116,曼陀罗华,曼陀罗华_from_曼陀罗华种子_1020116.png,6bb50aa4-3d41-426d-8b97-7b3829f045bf.ef4d0.png +20126,曼珠沙华种子,1020126,曼珠沙华,曼珠沙华_from_曼珠沙华种子_1020126.png,a7780718-b070-4922-953e-42e3234d0a6b.d2211.png +20063,苦瓜种子,1020063,苦瓜,苦瓜_from_苦瓜种子_1020063.png,7565aa2d-1ff4-43f9-aaa4-be0d1a937122.f5ab6.png +20221,天堂鸟种子,1020221,天堂鸟,天堂鸟_from_天堂鸟种子_1020221.png,bbeb2945-da57-4d63-bad8-78c046ffe46d.878ce.png +20068,冬瓜种子,1020068,冬瓜,冬瓜_from_冬瓜种子_1020068.png,95fe19b7-bb30-4b1a-b70f-fa4fd8e3d893.1ec42.png +20222,豹皮花种子,1020222,豹皮花,豹皮花_from_豹皮花种子_1020222.png,8df2f4e2-f8e1-44b3-a5cb-0e9f2617228d.e1dbc.png +20078,杏子种子,1020078,杏子,杏子_from_杏子种子_1020078.png,522a790b-e625-4743-bc1d-8a8d1d52738c.67da8.png +20074,金桔种子,1020074,金桔,金桔_from_金桔种子_1020074.png,b0811647-bd43-4402-a071-e60e05312943.d1674.png diff --git a/211/web/public/shop_plants_organized/丝瓜_from_丝瓜种子_1020044.png b/211/web/public/shop_plants_organized/丝瓜_from_丝瓜种子_1020044.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d99df2f7bded3b010c205aa7e805219f4589c8 GIT binary patch literal 3401 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/冬瓜_from_冬瓜种子_1020068.png b/211/web/public/shop_plants_organized/冬瓜_from_冬瓜种子_1020068.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4bf8b19dda721a4112a6b75193e8c58ad81738 GIT binary patch literal 5023 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/南瓜_from_南瓜种子_1020010.png b/211/web/public/shop_plants_organized/南瓜_from_南瓜种子_1020010.png new file mode 100644 index 0000000000000000000000000000000000000000..6e56fcb2c8bfc7fc030f7d45eb5cd1cce2f55a74 GIT binary patch literal 3215 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 B6nFpt literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/向日葵_from_向日葵种子_1020145.png b/211/web/public/shop_plants_organized/向日葵_from_向日葵种子_1020145.png new file mode 100644 index 0000000000000000000000000000000000000000..6b26ee416128505b9834c04273bfae406204e542 GIT binary patch literal 3224 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 KMNUMnLSTaGISqUO literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/含羞草_from_含羞草种子_1020143.png b/211/web/public/shop_plants_organized/含羞草_from_含羞草种子_1020143.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcc1f9d1305bf1bd4f9c4122c2732b86b2b2c8a GIT binary patch literal 5247 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/四叶草_from_四叶草种子_1020062.png b/211/web/public/shop_plants_organized/四叶草_from_四叶草种子_1020062.png new file mode 100644 index 0000000000000000000000000000000000000000..5947357abcb65fa7b60a9be3c0a524f587009d6e GIT binary patch literal 3054 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/大葱_from_大葱种子_1020064.png b/211/web/public/shop_plants_organized/大葱_from_大葱种子_1020064.png new file mode 100644 index 0000000000000000000000000000000000000000..975d431bb06fa514667666bed6831570c39eb006 GIT binary patch literal 2402 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 U7@>VF;{X5v07*qoM6N<$f;WkrX#fBK literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/大蒜_from_大蒜种子_1020065.png b/211/web/public/shop_plants_organized/大蒜_from_大蒜种子_1020065.png new file mode 100644 index 0000000000000000000000000000000000000000..36b45e250b0f9ecbdc093b606da8aa4cc5d13137 GIT binary patch literal 3361 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/天堂鸟_from_天堂鸟种子_1020221.png b/211/web/public/shop_plants_organized/天堂鸟_from_天堂鸟种子_1020221.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b2a79cfa787f7ad4e074b12ee1e78190346e57 GIT binary patch literal 3495 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 V6T~!`b%p={002ovPDHLkV1nSnxZwZ* literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/天香百合_from_天香百合种子_1020103.png b/211/web/public/shop_plants_organized/天香百合_from_天香百合种子_1020103.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5beb0e10297d2fea1b90bf44688f3421c56f41 GIT binary patch literal 3713 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/小白菜_from_小白菜种子_1020071.png b/211/web/public/shop_plants_organized/小白菜_from_小白菜种子_1020071.png new file mode 100644 index 0000000000000000000000000000000000000000..d04909bb1ed03a1befe328a948d21a4f58a25e28 GIT binary patch literal 3312 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 Z>2IRNX3y%Zp4tEa002ovPDHLkV1jvG`zZhb literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/小麦_from_小麦种子_1020061.png b/211/web/public/shop_plants_organized/小麦_from_小麦种子_1020061.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b385187574b4dc4e0442afcfee85b251642472 GIT binary patch literal 3194 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/山楂_from_山楂种子_1020091.png b/211/web/public/shop_plants_organized/山楂_from_山楂种子_1020091.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1051d89d061894c0e7d8ed254797e2cf032445 GIT binary patch literal 5324 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/月柿_from_月柿种子_1020080.png b/211/web/public/shop_plants_organized/月柿_from_月柿种子_1020080.png new file mode 100644 index 0000000000000000000000000000000000000000..f535d9c36cbff05ad6b48e6d2af24d7e8bea45fc GIT binary patch literal 3027 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 V)H`^it1kcm002ovPDHLkV1mY5o@)RA literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/木瓜_from_木瓜种子_1020038.png b/211/web/public/shop_plants_organized/木瓜_from_木瓜种子_1020038.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c7d6dbae68c99ca86a028abb556e84f7d9e6f7 GIT binary patch literal 2341 zcmV+=3EK9FP)OGipgcG$tfACnGK)9xWjrI4LJFB_dcpC~He4Y*bc-V`6+pG@+3HS@bf@_jAwj3)A6D)Cz<^Oi^V z+m7>rJn*t8^RhqljX;omA@Oe|^w3g(b06}!GV*9C^Q1rVz$kEK9*vVD@`Wn#Q6=%% zd01l|^XYl`-kH|PDwLpq1O7T~Gf3*=!gwu--M=2Bn%eYzE}Om@sM#~gFaF~=P9U(sk}e>ql_!s)zl+}JcS znbqO2{td!$ac;T3wtU*pFKo(Nz5P~o=w6x|lil)M?`J70|Mkmcw69ir64^BvJe}(Gdi*cD;ZG5b4GzXfz1h!F*=#mT zd7%gx-eSt%^Y?mhdXwUhmdkc&Jhyy2H=D3+u>o5PYVblT)bsm$z2XyL(EfCLX+)vk z><>i(88|#22gC30#lLi?YVFC75SzG4{b5!Vz7bxYFUFDK@5M(AvqCLbN+)iN==MR8 zIOu3>g*7Zz91(thFNG1QQ?cF{udeIOA?1UJ4(TPo_29RLpBpqx3dy_Jb^#l9NbatW zlIOn}#n1)`y;Tq*Z72@7LuGLX-;VHjJR-yMys$C+{?tf1Vl&!5n*D#Z@Zj)>_*TRp zdaG3QMztj5#$;)ZsS*&>LM-AF2?72gLkNX73O%S)^ad%nNb9BjW8C-ovh_qgOX01> z=RGd5hez-*Nb!d@N^w-FluZh_Meb|dUOkV8C92+PwOR?>Bk$Q69>&8kf`E#I{788d zi>OcbJSSFz{dr84vWZqJkw_$8euzyoE^A`Sw2tU&-|;mapC3&ptH8>A={<8e{pr9&Hp(6iMc{npG&|>XZ^`3Qy~w^t#HMfdOH|!k@-7x@GKmcr?tu-O<~WY# z3bE*YJe7*4Lb!;O*CC^2OqQs%&+8>gU(%IKV#19G7&lE^kzH7tC4?-<5;C@H#fk=3<+yM(7LCU4QmNE^3dX)9E+yQwtfuE77?30u zT$>s+go9wCa1TgPSXDZB?E4n65lvD=^52Pn8`0>lNC)m(`#%sJb{KnUR|JiN-5`;j z5i8t7pvc40jGk5dA_mL*w<2ypHV2TV=}063Ge<`34vdsAt%$3&_t<65>-YBeiQs*; zGiWYTt07}kWRQO7NE*9Lrm%=e{=bcCp;n7Qka3q1Uef6fJ|z3UoXR&yQY3bJHxl6@ z;b`qK_V^fkjKX5w-50y*^g~B?DeXN-b@kpx3Np46!960uSgrQ>_*koL3}LV>BIVsw zMDn|xg^B}O+sV@RGlFY`Gcb!7K!vT5%cVO@JP}FXB+ga4jfu_Hq9b&q8Z1Q7ri#UIjk_xJ z$fai;ol!0MyIOwrJHkdH)o>=0DL~-%jtx#gJ!TyOz0XN2B2%8P+R5!iSSS(9WHw4c zTq;`Vu5yj?ymLk}o@TnJMtas+;$Li} z8#1eT?sg}WF19LOJ{-Oa-i2|hEaRDu(z$XuH|s13(fGl4`-N^4iLjAiMkMgn!{Kn1 z3ouC_(&^lM);S~4yYJ6_=CGL?BQ%U~mD@fHX*$4olHKWO0!DhaT%Hk5G>;$tl;Y4e z25*q*bUN*JyIpvF>~^Owqsh}#uH49_XUj9f?9~2rtwcrFm{%&5*VotAd1WvdjYgx% zWb*X%G?~E8ozKpQQ^lVd@Zqb|H5!e^EBsf^}^(kMtUV?uj!kRNB2Czl4JNw3pG z%H^_NuOrN-28C9u)yfY;Kr~8~{L)}FnoK6M*=%+?oeG6otCb&+K#WGII+1G?3I&{P ztz0gbpPZ8M0Qd^EGM)!w00000 LNkvXXu0mjfcr9{7 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/李子_from_李子种子_1020413.png b/211/web/public/shop_plants_organized/李子_from_李子种子_1020413.png new file mode 100644 index 0000000000000000000000000000000000000000..179009f32936b6238f810cd61df56ea7f57cc9e1 GIT binary patch literal 4041 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/杏子_from_杏子种子_1020078.png b/211/web/public/shop_plants_organized/杏子_from_杏子种子_1020078.png new file mode 100644 index 0000000000000000000000000000000000000000..01f98df0041240408ac2c1f0fe73c295c52555b3 GIT binary patch literal 4311 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 FV1ndJAbbD- literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/杨桃_from_杨桃种子_1020039.png b/211/web/public/shop_plants_organized/杨桃_from_杨桃种子_1020039.png new file mode 100644 index 0000000000000000000000000000000000000000..418bd2bba90126adb1f2233bea1d0eae04f550bb GIT binary patch literal 2700 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/枇杷_from_枇杷种子_1020055.png b/211/web/public/shop_plants_organized/枇杷_from_枇杷种子_1020055.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3cb4b6953cafb30415798b638deb3262a94de5 GIT binary patch literal 3206 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 IM6N<$g1SINZ2$lO literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/柠檬_from_柠檬种子_1020042.png b/211/web/public/shop_plants_organized/柠檬_from_柠檬种子_1020042.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd2f887227ee91019ea99ce1732ecaa56602b9d GIT binary patch literal 2633 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/栗子_from_栗子种子_1020095.png b/211/web/public/shop_plants_organized/栗子_from_栗子种子_1020095.png new file mode 100644 index 0000000000000000000000000000000000000000..b54802ef1fba184fb8154d9feffbc8e2b6a4093c GIT binary patch literal 4505 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 Qod5s;07*qoM6N<$f+UeHiU0rr literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/桃子_from_桃子种子_1020018.png b/211/web/public/shop_plants_organized/桃子_from_桃子种子_1020018.png new file mode 100644 index 0000000000000000000000000000000000000000..e761b21d77951ec6ac2b26fcaa39df566eb9278d GIT binary patch literal 4509 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

Z{u3+S*g6s;l=@S65%FuHLg}&z@7KPMz9QU487r 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 V9eJelOn(3X002ovPDHLkV1l=|!SVnA literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/椰子_from_椰子种子_1020029.png b/211/web/public/shop_plants_organized/椰子_from_椰子种子_1020029.png new file mode 100644 index 0000000000000000000000000000000000000000..e32edae5c814a2f47929ddc864d38e0d8cb14979 GIT binary patch literal 2945 zcmV-{3x4#8P)N6%N%(bUAEHfw?866T4vY3h0!L-o1tNr-#^6B9J|NTBFChFkW zlVD0oFDkNjS3EL0fm1?oNj{})P`96u$grWlfnHBHG+R3{32-H5{B(~OT1-ikhI81Ttv#0 zEQwkiFYo_igQD!jJ&m}XK0W7RkOG{G1mKsy{;J~QUhg};<2%0N|2yvg1;$|TFEAFp z!Q$!1j~_ptpPv?s#o+IQ2aD%}wYIidlGwU7iq2l9)8*4≥z(cSVuxc3F~T4pHW# zVhj!Mhr|27VAlQOStq+9$%?`{gAk*tw%XQ;GRpe1yNBUFXFMNtu}hL&QD}uIGp;^t zo3`b+IUXEkRsZqfpGp}NNl|230;wVdsY8objcD5jODUz;q?GlSPs4vic}|KV0Z36K zhENwtDe<;xnlR>AU@3WIY1N-T{5fXu3_84!q9_qfW63d=P2P48fkDqIt-zT-q%2-^ zmKD1s%aYwLr7Xn~L+~(c!nT6|2JcmWIsP;M7cW_oWW^40wM!JMvGl8AE-oP$bJ^5D zS$v)G`~s=k?RJo>#8K0BI$+f{Y+^3)2_j+{*HC3&*0Oj81rQ)aQ~C;iy#MPl7O{}s zui`kC4Xyf%;g^beFnE40vZ4SHS&`$rA3l}4yzMwlguzJ zp}&P_-}WDNK&no$4gEOa^3Z?0C1Hb?np!9-4Rw{+WT%ZgN)Dr)zkUeWMm|@k$bETZ z+0vV&{GdeHBFQw2;7n&)AGCfI7;}u{{kxFOg^txK%0qsZGQB~{lDN`BSpg-pI@#@P zb--~fuoUl*%_U;BilS{dKV?`ge;8TS%1EJL|MnsDs4fb^ojBQM8IyQIt0T5mM@Ed9{oOgWgh= zj_CprTI<5rR%=7wVARH2+AGGn?8}Yex?l zX0152`{pB6=WGEak3}p5=C*pgYRi*Rsw^$3VSTMV!|IxyAk7Jq|Dwa!bGPNl*J?SL zJbiASpHX8|sz`0E z*I{*SjuQ5c3{)Seo$DyNgX;r%C&K}Bpz2~o(Ubz*I10ircay%fyl z>wa?~k0ZLM*DD`ue!_Md-AO#Wy+evresvakk@n?`n znmS5=;w+)grnOD2p;UF#9{Y2Ihn$+;3pz8R2DXEkx2BpxzCKCUlS&mZP;E=9$}&Bq z&LM=5QmQ$*a+0#iSFmS&eLAHo-#;6iGKoNupLY)+Us6Q82p65R^ zB7kr%V@TI@^eLn&0fL+{25do$C}1c`e~uM0XPuHy%IkjFSz<_uoTHr`2y8(nHJZyd=3L_a9wsr!I7#tMx$W|a zL_RWr z)J~O#l*Rx6%GZ>NB5UhLa?D}B=d#T=-N5prILbG598l@0L zP*?ylMp1-lZEMXX=Awn|Udm>ZhtQFL*yf?Yf@A-OwCevBf=q1;B1$Q55J8k8geY>> zx;H8PrNx zHiScJ+xTn=o>ue)AfIl)Lqeh7ov$iT@y;NMQd6h(5$g1Gwd3(>yIqBFKZ!YR;HJXm zv0`+3t+)m~!q!C9CG9fRRo6Kvs?)SS9HX`ymXM#e^@uo*xoBb`q(Bw5KdxEQdqAiJ z96quW6?y%L#b-zlzALowZzAam22{o65{jJ1ywa;X<1RE zD6Sm3k?rRR@DxY_1l}{Q?*_PWhVtlLGV#u2vKL4LX0v-31UVcqt)?E*UnH% zsLd=jqv>SyJ0XL`qQ74Ign=6PxmITcL1oDhWt39Nm@$aKp2ir32?uBM%9QgP?ppV~ z-eZ3q1nYH|HGq7iPC2CryraUyt+I8hs8Y_E(op15#?qxPty|uUmi-a}ARXhq*n%KX3QjbhK^Y^Iosz}A%;@#z=$*0-paj+)qr4nMPyaqb44RUmljmP! zTu2Fm(pN#yDIq}s`x&?awh%)Z4NxC;+^;fvy~!N;`U--z`?-<>1yaCt!iYhPu%$;# zMqhvE9?j z8LJraBv3^tC8blWLa@!uW{|Ca06CM!qw#z;t16f!2u3iimdp8k4$FJXzw+#Sh4XMX z9!=)+`OHVR{Ae^9kH+Ki`0n9ve6{8Md3boZgC$4f5rkhGV)%EyqVp7pp+}tqULEf5 r{|8^#-e1IDU;I11<2$~icSHOKBWx0u0qOkg00000NkvXXu0mjf!KHoR literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/榛子_from_榛子种子_1020072.png b/211/web/public/shop_plants_organized/榛子_from_榛子种子_1020072.png new file mode 100644 index 0000000000000000000000000000000000000000..2cfff4874a320387e83ca8d76f5053b9443ef1a4 GIT binary patch literal 3459 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/榴莲_from_榴莲种子_1020058.png b/211/web/public/shop_plants_organized/榴莲_from_榴莲种子_1020058.png new file mode 100644 index 0000000000000000000000000000000000000000..1d093355aec5e65e8b1e7f1a566712f9efa68ee1 GIT binary patch literal 3526 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/橙子_from_橙子种子_1020019.png b/211/web/public/shop_plants_organized/橙子_from_橙子种子_1020019.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe73ebe65b8f00deb6ac45366f283b1d68d7212 GIT binary patch literal 2411 zcmV-x36%DUP)q%Z%hG5>lf|DZ4bs4xGjF#nw{|EDPbw?_YhEB~!G|FS&)y;1*?F8|JL z|HWSa=cWJfvH#Y9{@jxPav=Zv%AG_Z{{8R#pHt@1sM2&O(7T!LZ6~o$9`{T3!9I_dX{HdU5epU-eaA z^;Q3gYPVaxvDfW(N25{S8xLFUtIsC1#@%UWyH0Jbw^KlQy-x(STjR-gU8G576qizR zrIVsa*Xwm>(raCP2B$sjPVb8}Q-U%m0#AbHiRQ}a?bN&e_OF=su-jQKbA=hBSV}G_ zP)wnBLIP6i_2geMEsNlcVT`c=qcY7I6Y2791D7ymJl%H3-#?CN_a^ttq(op$31ft3 zY0jA_(jCH-U=WiQo&NQ=4`$QyI?Lr_93zaW`=AsPrqV()wY-Zl&AHJG^Q>5Rdmj_i z>fSH!Z-WR?3Itb_Vl49_V}^$qXR6SU3{Q*6hb$XTmc=UYBV=#v2!s)|+3hw`V}>`o z-EJc=*LjksMKSd*-%S}#mPs`CBLW_kB818kn8eZZVuPMv9v&Wk?>0KivOLezqT^kD ze;;KySw8x{(@_hNM(aE&mPLLydVYHO_3-fU@M~kIM=G68-$`jrmbY_1@MjdtA_T_J zON>axr82AMr)goQ^X~cSPBO}MnoB0KA{kwu-DBfz4mwI9jRwYc zTre?dswfsx;+s)sm{39r3aic5yZrv`EXHt>_1qyM1^%oQQd4O4Bn6{cnm`#Y zB2Q&P|CtU5P}k-q}GXrq)Eb!5>i!WGL_}s%M+;#yCB3yf{=w& z(c25p+x1ru5-NGQlv1L%y<>j0M>Y~WClRSBRS7|4CJ`}0@XR2sHK^fm-XmPW&;p03_4t@y zt-&e+6&6x5_F4!fi06U|shHwAS6Pw^E=YD5lO&Vwh8rn_kcub?(%iD+S|phqgY*`$WdyGwm1z_nq!JQoO*!X=62-a9AoiNVjzh*b zk=w2SG&^9RIvFInR0K)NmEeX5VT3yhR71L0JGuDxaH$ z&QMYfBlK4Ym{+c$Y9-iTsHfFgc>>~XN~hdF#we@{9g^OF+Nb~%9&h0>KtM)0^j1oZ z3Ev?7Aq##b>z*FQeS^hKNN5@1Ulr{u?;l^gA}1nfrt)T?*Dv3Fz^B-H#~`gmIgC~Z z>|B2#gtc+ySCyS%7|v8@d<@baxYlx!l(X{pLa!2Y*qQDOkL@Q{{muUVE}f&4gR+LnKEat$~F!rzQFeW%ky^FpTG`ZSPnl@J7xq zEcNzirzM^_%*@`nM9$oIe=veM99E7WA%B!jTrnywaBKSr56$O2wPeJn+ycKEt>xMn z(x3fN;h$H+F!ueq?X45XdaoS%!*XJdRv6CUq!X=SO*!#4sFZRj=Nw8H!+_0o=S1w4 zl#);z=iYe5M;S552>ck%T&Lg9wMMW9yHj`F$o5JU$43!R@V?=kH`zZHm6UoWD_-!5 zW7Cgg`}?q@&W&rW(~x!_4o0tI2`UexC~i~~xmRR=K3}c7*JlaY8`c2SOF+=P)YwGf z$~;QDkotLl_xLer41IN5zux>Cqy`We(=*L##PY{f2KA;{!m5{2GCKXsGtGj!@)lLQ z9Qx+h_q4lCwU!2fKaYy-=-fbDwY`0d9i|^N4BD&n=d0z~GR_O6rqs#q%?c`qs>kwo z=KkZ->3H8CRIh$4_DgZS(gfuhqdEh)aOSJ~WvBmshV8MRWia+N`;Bg^LUA&p$K`$3 z`w-*eqSbfHSk*|u!3t1XH4ko=%gzYqZ;x9dHuy=vADUp zxmhe0gTcV-S;F^^{tM_W%+*!9bv+#RYz?ok;r^iE^AHv1>RYou8?Yx`T$T0zx&K#v d)mQ!3>wgH&x|y8IwOarH002ovPDHLkV1k@qow5J` literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/水稻_from_水稻种子_1020060.png b/211/web/public/shop_plants_organized/水稻_from_水稻种子_1020060.png new file mode 100644 index 0000000000000000000000000000000000000000..633011ac269ce97065620e86f3ab0883280ab59f GIT binary patch literal 4541 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 Qx&QzG07*qoM6N<$g2@wa?EnA( literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/满天星_from_满天星种子_1020110.png b/211/web/public/shop_plants_organized/满天星_from_满天星种子_1020110.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2ce2dc31230418ae01d8a99a2534d1f778bfa9 GIT binary patch literal 4838 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/火绒草_from_火绒草种子_1020135.png b/211/web/public/shop_plants_organized/火绒草_from_火绒草种子_1020135.png new file mode 100644 index 0000000000000000000000000000000000000000..44c100b40fc6d0cad9a8576c77723d670b96b163 GIT binary patch literal 3820 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 i@BW*`U;0b`^ZF;qq6jFHKLFJL0000-1MH(O+l- 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

yc(;4lJu`!t*Z)jUPfy$JKR-ZY z#Hf#}NX%_>0z?Aafyk7<2!t{`3=TrvxG`<;%bP`x%r; zJQReWHu_IrUmqy{K0wJby17!iARVFR0fknJpL#s_+Qh&#KZ&?Wd(XMN?CB`cnl$ZAAi4sdR9#L zMUUkY8U&I;bYT%Jpha56uOUzdrf>z7|FAD=T)>kBmuJy)2qfzp2+9|Xcv$1r>e7c3 z(4a6YD=Wjphh!Libc5Qnk_K{?GS{QI3zm3^L}aZ($^i7Tm6b^{ioVakzr_u-93~#? zNf64!0{dXt&Ra{b-WdR73|e0wVm^O-`}WEOGu`+`_azYOJj@}_K0Iq_@zpy6(8i|5 zroj39@%OiPyP)O?4M0-Ag^)`MaT?_*9i>;VA_oQY`S-VP@0LOs#IjB?$Qhn;_aB2$ z_rmDZOEMZ~*OkXt0s7;Qw{PFxy?ccS!xXvtr55DenR6*AsYwxPD8%_4XY|esT~{7I zzI*ra<11IXE+9fGGZ6hMT6BEpa4sb+dP$cEiSAe;H)+6V^jYHk3()dWo}@ApeuGUI zXlD)62_y@~bW((NhZ<2xMx!^FWJEIop<+`E^u(HYpa@@*diHAw^_q)N5X0r6OJRe- zV9@JxG!X*7@h9gKd>lp}lq5hBDHMjwRpE_`o{dBvT9b!1wCzo>R3%2J3Iqd81R@`d z6GYTVITv}tpTtOT!%1A=5Kpdghv;PO4o*Wh|$>f{>0000< KMNUMnLSTYy*@9C5 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/玉米_from_玉米种子_1020004.png b/211/web/public/shop_plants_organized/玉米_from_玉米种子_1020004.png new file mode 100644 index 0000000000000000000000000000000000000000..d18417b3b5cc4995cd5019e60b825f51a5c478dd GIT binary patch literal 3076 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%0ABD~eZmkUv|oczKE@k}!mo(RuY|Frakl ztKGh6o2Y({AN)U?z)5BZcgiR~;~=;DkoLq$Lb=qlRdqQV9YC^rLPU|6Sj^k8_xHJ6 z`T;qS9Ots0&9`q-HSD{ojzK%z?KAz{a99(p*U2qU1V34W%RqL}y5Z_Jd#T5v+UA+A{)zeQqgiyP~C#d7L2jeO{qVpU46wF$Fh(?^hg;u!WfP1f$+yO3KAv zoQA-y-5ikP5E87=%zEY~wVk^P)3i*%*!k#Eu4I5l#-4zCnsWAQD;v?BpxIh6Br>H9gB=x zqK;)@R7`w%d5DLFSwS~GFeznUSD2e*XkJ&!u#tagQpAyPp^HnSx7)nA|5VSOIi8Wvx;n6muy-}J~ur$O?6gEeSB5#&aADLa%Emx zsefSO!k)3IZU67ghbXU!0000tbW%=J06+c}2~i?lV*@eR{&#nvw`Tn4{gaNl{uJx} zK4-D`&*roJ{>V}&{Q7Md%Iim#ean_NHF#10000SaNLh0L01FcU01FcV0GgZ_ z000MyNklb=6>XQ!#af)BqU8d^B3A(g*<3 z+dsa(V9Mfa?kq^RxSj5&oz)hpTA6IudsHGxqX_3`EPaXzh9 z?{`MAN2PNF{cUUjO_q7bxp|G6|MT_XoaX=NxSjpJGygKZe;bqw>2xARe;Wf$lVwL0 zRP|=Le|%XiemtzfQ7`38VEc%FkJ4`L)oe`-pchn*L4S-?Rq!4pFBSu zAhz*~AtE7Q*$SSz6Rpr!728{S7^0}&w%lws86EnT_Q4PYq&j3}Rw&^dIISzKg6Vml z?Rl=E%krS#FIU^70f6()5RiaWw#{HfmO9Z1ebrVx&$eyPHZ4#omI}93i!_X15QLBr zsO@6DM`fvW;7=SUxLODa z4q55q<)|Nqf&X9l4|ZauFk>u1Ns=T* zl6X`paAOk4h&Knvx3~L1K*#|2KYWf2g64)Q^q~ZyBf@0iTf8Wm=61ig1W_Ip zIb5n-^7PE=8RfO5Y&t%YOWCY@hS=ucNG|Q9}$uxDI>F4nQ%w^6v9+A3ZGn63yLTG8EK?2KE6iI@T z$rSSMsebPLq*a5Vf0VYYxAYz;IC`nKU+WHpAx`Y|ZpqP)s>inx*rnq)p*InWWHZ4P2->h{L=e_OX zB#DJ_UE8i!?rLTGiX@o^0NRbaRV2mt22XXIR_8NP*ZuAO=&p_{{6CarRy7Q3dt5DT zdv#Oqotq@@$`mJ)-SjwLx!bL4>m&e1;ONWaalTv?BgXkXr@uYzn$5Sj>2cLrxwZ^^ z($Hi_s1CL_w-0!;isNQo8m*o6x;lA#dz-sDt7`^J%E%E^18+X*legX9)fxjwL#6|o z_ir7S1tD197=h|IqvBnU%Hpfy`6`WMS(bDS80E=s%O3Qgyj+t8TX~2UxD$8XKh+v) zvSykx0Kh0W2kTH1^ko_G?Lzi_Wr*QHg|4%*W`&pmfYYq{ye#_5HDqcWMWqw*Fs?=# zkf9ziL}6X!Elu>7UgPY|=QriXtfuLvh8eObkcYrRI$X{;yurm{0|z{*0gJaVL**T? z-j&ySSe1Aj#Pfz$8fm!WA_4#)5mYC;N%P=! z`qAbS&kI_rI|efLzyl3v8&z&Ln^o&}FsR|JB&JuoZiB4ie)HIf;Io!#Sr*B*$2E?M zuMR#?*jsioDDxAyh#Spy(Qvj_II(D0BCG#F*nj03dL1 zV8yYF{!5v=+0*>X{L6q9f*^YOjq9NQBRZ8S6=t3J@fM0fyN?4ao^1b9sZ1hU=+9=e z%CN!37g+yNDw9ZLxmvAO!)Nd^41%DOnM69v)i^Hpx%ypnGLuVSU64WG0Z64%$<&2v h^{G#N>Qlt2`U{KYleRkw+ARP8002ovPDHLkV1jU~SIYnZ literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/生菜_from_生菜种子_1020096.png b/211/web/public/shop_plants_organized/生菜_from_生菜种子_1020096.png new file mode 100644 index 0000000000000000000000000000000000000000..ef07c872c491907b55bf9398b04529fc674a6e11 GIT binary patch literal 5266 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 Y0Su@O=6fUd^Z)<=07*qoM6N<$f+fohO8@`> literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/番石榴_from_番石榴种子_1020079.png b/211/web/public/shop_plants_organized/番石榴_from_番石榴种子_1020079.png new file mode 100644 index 0000000000000000000000000000000000000000..fd25a6fc6a4a6fb408874d8628ce77c745251a3b GIT binary patch literal 3648 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/番茄_from_番茄种子_1020007.png b/211/web/public/shop_plants_organized/番茄_from_番茄种子_1020007.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef99ad824ac15bd9419e86ec055f515b335391d GIT binary patch literal 3522 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/白萝卜_from_白萝卜种子_1020002.png b/211/web/public/shop_plants_organized/白萝卜_from_白萝卜种子_1020002.png new file mode 100644 index 0000000000000000000000000000000000000000..1e83c6a8340974eff03c5e678e3534cc77fd1297 GIT binary patch literal 3058 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 oMK{j1?P^W`XMfzd=i_9Y%wq}b2U^! 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
j} zy{7_KERuqvX!T;L|8#wOdwYF-eSJ~BtNmaU3Jor0nj~3NRYA~MH31lJC_|8uu2`jM zT9vKpQ~4%RzPP*iVW#}z1^56}LYiceveTD<+kNy=;~lw7IEItzm;eA~J@Q*U-3hUodq^HU^3pwVa~f_5JOrCbJ> zI9@1pIFl6WYQ>V^O65na-ZsL_osp@2zaLzAx?=)p;2dR`n_)0=0n+jku{K_4kf7P9 zmMqDZx(3?fTgRli<>RYgJkf~m{P(`DrC zL#1=^I2d?%zC#0O6vHs$2C(j~n7>X~9Os%XjkPSxl4Lo#wvYV8KJ4}^o_-z;BMe{= z7)B5bb50O9w-@E|T|D0IaOq2-u3DBX%a!RxNHGZ!3`q#ze7h>G@$8Oh0`5xVh|nVf-56 zN5E=P413867Qv#-O|ja49tKxFe%xGef^$BOCr|q+QzIf+6g_7E1ZBFJ{`0W^@#7|V zU77m1>i92tHsdt{ix5!)^f2`1rr7QGpMNmiV`4yV|4I!c|3y)hAxbOH{oy9!bh*a& z@&QdPqqS(1AP52@7!*YTaE1c}5d}Sx8I~Tf=;l~oaDZG(>*x)E5m5#W zFwDxzb2PZ@gj{3(*y!_~T?H7>gwg23=wUsy@Ar(?$BPcO*14+yI*1Rt2Ww-W@>1Ha!omHHrrUA p(Ep9%a)BQcW&GA}{T4JK{Rh~rjs6Vc=ve>&002ovPDHLkV1j)QqOAY` literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/箬竹_from_箬竹种子_1020036.png b/211/web/public/shop_plants_organized/箬竹_from_箬竹种子_1020036.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc261b0460b50042bca12da3ec003d5dddefd2c GIT binary patch literal 3231 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 RL686d002ovPDHLkV1o2-<#_-A literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/红枣_from_红枣种子_1020051.png b/211/web/public/shop_plants_organized/红枣_from_红枣种子_1020051.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec3af1a8a94c7e4a3311c5fc8d580732dd08cd4 GIT binary patch literal 3871 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 IQpFbgUojArDF6Tf literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/红玫瑰_from_红玫瑰种子_1020041.png b/211/web/public/shop_plants_organized/红玫瑰_from_红玫瑰种子_1020041.png new file mode 100644 index 0000000000000000000000000000000000000000..238ac06895de7df76d7d8b291e1c63c1e79ae4de GIT binary patch literal 5300 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 JPDHLkV1jdLhh+c& literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/花生_from_花生种子_1020049.png b/211/web/public/shop_plants_organized/花生_from_花生种子_1020049.png new file mode 100644 index 0000000000000000000000000000000000000000..787e792991960399021670ec11dfce129029d0f6 GIT binary patch literal 3025 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/花香根鸢尾_from_花香根鸢尾种子_1020141.png b/211/web/public/shop_plants_organized/花香根鸢尾_from_花香根鸢尾种子_1020141.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9af1ae498b324634364908a01361a8d86f76d9 GIT binary patch literal 5025 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 r=AE1j|Ludo{}S;;L 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 b_=F8ltg26gcdMWO765Z&xKRzv_1S*_(cts1 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/苹果_from_苹果种子_1020011.png b/211/web/public/shop_plants_organized/苹果_from_苹果种子_1020011.png new file mode 100644 index 0000000000000000000000000000000000000000..03cad0b14d4a503ae01020ce4a0ef730261440a9 GIT binary patch literal 4189 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 TOI@qo00000NkvXXu0mjf#H`}M literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/茉莉花_from_茉莉花种子_1020128.png b/211/web/public/shop_plants_organized/茉莉花_from_茉莉花种子_1020128.png new file mode 100644 index 0000000000000000000000000000000000000000..5acb03cfda8994904b396d0751f97e42b178b418 GIT binary patch literal 4221 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/莲藕_from_莲藕种子_1020037.png b/211/web/public/shop_plants_organized/莲藕_from_莲藕种子_1020037.png new file mode 100644 index 0000000000000000000000000000000000000000..41c7deb6732e4ff7c979dc855ab24764f4d65ca6 GIT binary patch literal 3486 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 M07*qoM6N<$g7a6X>;M1& literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/菠菜_from_菠菜种子_1020073.png b/211/web/public/shop_plants_organized/菠菜_from_菠菜种子_1020073.png new file mode 100644 index 0000000000000000000000000000000000000000..bae6064e5f71a7b15ae8089e9c8c76180fefe92a GIT binary patch literal 3859 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 V9zNbYIcNX?002ovPDHLkV1nU$K=uFt literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/菠萝_from_菠萝种子_1020027.png b/211/web/public/shop_plants_organized/菠萝_from_菠萝种子_1020027.png new file mode 100644 index 0000000000000000000000000000000000000000..e06db9eefffc7ce64341b1c09a6c9a770060be9c GIT binary patch literal 4985 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 AYybcN literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/蒲公英_from_蒲公英种子_1020120.png b/211/web/public/shop_plants_organized/蒲公英_from_蒲公英种子_1020120.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0026fc16e3f38e3867cc9469b3aaf486ad2434 GIT binary patch literal 4624 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/虞美人_from_虞美人种子_1020142.png b/211/web/public/shop_plants_organized/虞美人_from_虞美人种子_1020142.png new file mode 100644 index 0000000000000000000000000000000000000000..ee87ae5ece71667b0b86fd30607807a532cb3577 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/豌豆_from_豌豆种子_1020008.png b/211/web/public/shop_plants_organized/豌豆_from_豌豆种子_1020008.png new file mode 100644 index 0000000000000000000000000000000000000000..95f7ab35da9cecc17cd174834520b6575ec2d7e5 GIT binary patch literal 3007 zcmcIm_ct4i*N;)vpf#deRJAs-HD)!4iWP*|PmLzjs>d!Ow$>`ODx}n|#NI+}Y8F+k zS!(Z5P0?0-J?H%!-h1x&oO|yN_uTV2=iXRjgboXk8wdaZSajhqr zFYzDEF^M*7iwoqsnyHUtZk6h7i#RQ3$%uB7?p<8yTa$F6`L~sk{`StC>QC4?}`c`X_5- zd;CM3e8ZCa#BmrRALCPrAn$m}xQY9=8rh7#)+hN=&xtcnC=bV+qOK{1VEN`9XGc4TiHPwt zWzTqR$9fahS1x);y?f7)!@J?4kEC?%O}gi>-_O$gysuL)cu?$%M3@33h4g?XHjn8! zly1SO>eLkA@8GRZ{j!92h&!jUG1M*3zpj5y&Q6A2P;Pc?_p{^xU zYiy|N{QqC5H9&#gi;1uN3%BwC0GK%bGa5h^;RXP}*rp59FndPW#ecQ9YjeGi4P>kV zo8`6fs5iXj*_Ikd>=KUvp<;&FjIfVj8tI74Ybw| zq&qq!dAnBbJ1}=so+!wS;U4Gwqa;mJW^ct#75i8}R>Y zYb_>95?!yg#Ht@LQ;i)5T;I#KRjzqweoQ^77GNmnZWL>6tI$LFOfie-{q5d{$mULd z^6<-!@CiRWJe$^RW3%$p<0iMpT6SpmZx;3 zNaE?tFy-@)CeBr6tw%B5Lzg=vF_PTmELAl%-dir~K<*nOT;~>*FB-IK$|!>q7Tp4E z&EJpj@9Uj{`;`7Jygxonx6}l7C;Nv&D9P$WJ8EiJ>e<&VNbyY3Pen(mtIE7G%-xy( zkYv3gx$^U%DfRiyQj+6q`N-3esqYc?j1l&hj@sT?(`H+F+ZYc+!)+Tr3*%0we2L4b zJeOEdhGrEkV)}rd@#Gw4h3Y zJ|W??)A;c4%ZIgV#qN-7^LYMSX^1=p^*UO3V4x63hQbR(1b!B5sl2-`2AEM$)e8*@Tu&FFzpcZO95Ps-mIoJGtg;jI750=;I>!w$EUIZi|bJ{@gclr{b*GRiBsBR|@< z0xLKbrJaN=`ZCv_=#EuSDO=`T5UGsCJ83wV z7++ub{cH`mX_p`=^}7gKg_;d_OUz%b;`7=9ZIEx3f%zJVFWl=}M=Rj)j(?$n{ZZz@ z%|5$dx7lnk$bg(|Y`4q`MR%`v>!C>)8=$t1ESqknLBN+{w?Np&_?7A@GjX_5^Js}QxsJ>PER9FM#Ln%7n56KY zSZOw!1feia4vvBuE4m2&xUkVUi4JEm88nXCAnggiGvLbR-xJve12=3a(fDTz3)clr zPJMIF0Bxno;gR9uG~K4AMm$J3Pu%lXH0zNvFOHjr_U7b_=IkF$qyQb`rMUc!6|WU0 zOVlNE&j5a%EQ8|M*w`xv@+vASv8a%#E3n}gy{ZvS|#c{i7nAIcaw z?c1!J@@dRLO)mcw%?YU`ADgPDCI+e9?qR#?E@c&+?^2?fM;{fhOL-+?XBAz4Csfpr z)7Py&YoAg7*^!&EfHk`-A+=6Q%6ue8;XYUMPs~hc`5N?Hx2x=pK5$ljefgHwK+#ZuIr_F*B5Z7Y19iZ+Y>4jjj#s`%IkS z)jj@H{%Fw_9Wr&5WvcJV&AwlRv{6tWrOC9!6jAXhp;XLAa2{wNjg9^Jyg|A?us_E% zQo{`J;SHh$@lYPnvvc}U)VDlMDK20vLfU`9_R$GcK`L6G{?)4CL6wQb%0?8__knED;e7;}>E3L||yOqXB z*qZms3e+f9`tpntB)eez$>+yO?m{-(kFJl3vP4&`my!P-dN&i2?O-D&wbRShI_e@1 z-oM>l1je_*^xTMTRrh( z?y1ne^>#;{I0OZKBX?>boN6GFiZ>8`e<=+iG7)eu#Lw5nOPRB`-Hy3mE1*1tLZNsr z`1?&_X^ESzyCk=Kj$TQUh$eO+EhFvX{HCu$)6?A{Ero?qBNbrhIB2}xBNNKhWvqI8 v+V$Mc=YrH!wXn02oF$r_|2~cLNGi*j|7H)XjD+{adjrtbM!+gG?IZpN^N{De literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/豹皮花_from_豹皮花种子_1020222.png b/211/web/public/shop_plants_organized/豹皮花_from_豹皮花种子_1020222.png new file mode 100644 index 0000000000000000000000000000000000000000..97a2f922f02ef2fcb5f595a38dcd00d886a9f14a GIT binary patch literal 4589 zcmV7t-u-URtqmp(=IWwJ=i&R8CX<1ObntImCmuy8ZI4d5AP)F+I%~?!E zmyUg%Upkcxh!b7Y%+W4ybjoL4Ye6&Sy^la+pF+OBZO zrcBJerHN)uZzvh#%~!;=dehIkt*V)_bU>_mUC_?6u&bGlU@*bEvikep`~1~~9ulBF zDEfWu%V?Vq|Cu|7_c@7Kp>9n?EM2;vI>ycj9jb`7GVCINe_VK)~L@MKdPxIHD@zS5s zglN8DJj`rFgAfeq#E$ds%l`iP+k{!cb4`&l9pbBe@u+g|=)SaBJ>$NQ_Vm~9#uj&qH(QqQ}N1(@T6(k zwS>NZP{3$Nyj3RKmUGISZ?rufvW8=tRyWFaTHn!~tuq?+-kso>XS;D=-*rS>3=4K1 z7~RF7m@_fWw2bh>e%hvfvv56tG&|9lV&%4e)r?W*t(fYqZ{?R!!h>S)?%c#_IGkin z=dVl3aVhVbThLuEw1Gm;d^(_fJKdK%>dvTYA0UlBJn!d+?bUjlMM1fiI=_U1)|ry; z;9Jd+m`~GeH{{GEb z5rc#M`=xaH{Ygvyl8?dn-u^NE%DUkC;bZ*!`PJC|_W0c8=i7$+B#4FzNdN!<32;bR za{vGf6951U69E94oEQKA4#G)9K~#90?U~hgTg#HhBioY9jA3SGI=Dg1%xtkNmL-{) z8DwT=cAVG_Gv}QDXO^6~v*yBFE9W|EUh=){$KS51?&`0rckTM2ANrvm`hU>wE3s$M zetk#A?-xudhmVAXgoS=T%I;qPOeSUh2nrSQ{U`_SP%uC|W<5CQ`%#Xbi>F`?cLSLC z@b5-J-^s{0TzNPi17I$HFADls3MFGGY0xqU0GQP8l(8$QIT0L%4BKhQubCzg#L zapMZuZudxu$3Z(C9ud8>WkDZb+ztQLW_({3M6^oO!@ke_;MSmtVH43;5f zLQbiaKw>efst)?AvSaz$odoI35-g*|OdzQUggQczQ~?WK?Lqi^7hvWD#NGqvPnGS^4AW`vsZ51yqQ$;llRgk#=F_7GN+EI$}JTd zs47(s?@7YRfzbhoy4=yM1P*6xrXEj2hJ0f%=%caM9V2aGtf0p(nVL#^Hycv|Q?rBu z!IS_J7=*2=($P_>wN6LIuPm6#+9@C=J~ql9OyHQK7v_?ZiFA&7IomE5R*6R?Sy@?G zhN{}Z_HyF`a^=Ldus&vq2dk(pW`n_1-~vGavwkBQ6==@TXMg?0fg|n%aqNmlyrqXF zH`nk>y#|3N4qxn|jj;38&G_;Mo~5PNlY|;9)oRTXag+c6VCI5@q66BVyN_Oo2QdHu zfOK}Zq^SqXAk@_GVwP&BCRRG;Xd@2X2#&7g&|J1dwM%8`3KEpJM%Ea!3qSx&jSQ^Q zTsgf?p-?aYh@-PPF02z45P15Q(xuwk{xSB5l1}6j3+Y{4y1PP+A6zOcf_ODn85yr$ zT*QFj4MbquGxh2j3I&4!i8v*jqqa3wIn9I`m7&(tKd*EUaqdbt&80Es=hJ934Sr%% zL4}x9ozJJH(TO1aK!A`d{@h|P01-#*D$o>{H`PE`eU@RWkK=X|M~qEIH2x-)&XWFV*rqd8(hXW)r>jylxubTfgXAHK=1Idth&0fqN3^0muHaGt|yfj&e6I32LpxdIu1H=4`UpKGqgrL znaq;tnX|P+^K2Z>c&vxdAJDHZ5Aa)hTE@p0jI{E;FGCwx(zvbg)MB>d_CZ8spv`|j zQ0V|>pg2u2US>5n)Tv&-%4^2a_b)ss?=~!Fgh)8B3F^2|k@1H3wSRN$BmGNYFcK)Az1UU=BmRKq(-3}ZMM=`|) z2cZJ%#ON!Yc1Ej^>Bve|B~OtvrCL@6u~i8MC+YBl5Bxn|`iT+>1@vtSa- z*JibLa|$iMA|hbVhfe#0F`<>!)DUzeM(a>DM@cWdzMtp-NBWg*8+dZDQ)sn_|2)^b zA%P@RCv3Lco!0CQV>i9zWZ)(l9eT32jKP?losEfUjgeo?$L+t4!xa`ND^`7SU!K(} z5HfRwqrJT_DLqFIL6DPWx0AD1#`1sjdzb({A37}U;uKaA6EhoAYRImp&AAIeI*v_i zUc-~gVgrxhRjIN@VMr(}H8Axm7z?xXq-yzm^O?jzd&^cVA&ED=mtwF`Yio(j#iq0G z(3Ko@2Y$TQ4ns_pm09+swzhUkAP`VXOLaP`LLrfKu95rq`t56=#swW3hK!0xiy5u2 z&&q2WVdLiLnw92xypPpM#bT*Ee$1=dLlX}sCN|#*um(PFGF?H^cdk_;z9C<`cA?Rs zA<;Jn`270TX>HTk$ZfhUuLHkk?^Fn}lG0Y_^*xQoMXPWb8yhQ+spYa1+iCrJQF44w}!3q_(4HYZ;s;%XYZ2I1B$UeV;^ zL*EvO-x{%;igcdP3$@N_%g6fFJ|9UhQ7|NY{;LlkIc!?Ft=iVN;Bs?mw2Fm8!qz8G zm?sej_oN*O3w+9hK9D7sD(bvmFQXo6*A9})J6QySj-cXCAG%i|;*{r^WinZwR%X-W z8;!;VsI|V{b7<)uLwsy6GAvMcyg%F0DOD6<1=FPZ)^`&nkM!mmAz_lA`})I-sH?oG zhp88rF)fy1SzjAxq_7{VuZNvpp~PwSmYhEln4$c=f2^aEr6SeoVo1!<)~wltUMg?0 zfj2-s_i?7n)hEv@QSq!TFUtR ziE2MU9VacM7PA20ekmWAf{(tkd4?_O!m0jxc zVzQkjwLGY1v80bDd()Y(K5`x9Hmz1H?#|AZ<(b9I94(iv1-UQOaQ4I>nUW;uzbC?dEJeo-8LY8%Vk7Rkim_CR$@311`%Ji-+^f!`cP9 z>&zM1R4bK9lIlr#nv!VRw|Sj%dG9u7pWO?E|i(LC)Rivaf#|g1m0Yf3rwQ0I5F_@8p!+Q|h%}0L0WMbmlF`1R_ zt`(bSUqM2GQOA-hit5rQr>7?FDTxl#OP8%lR-N62a}&8^;~rsYSy@Xui;Qn9i;Kqq zca9^z-dg@|2>OBx$efACfR){=38x0R1=ykH4ss_ew=`Wv@J>zKd+9J`u2U!&6Oaie z(`juJ-mI+B9zp}lH?JnfQx0F)i-?Te&WqiB#0A|m_bPurdEmssiw+`=!|C>s*H{Dv zB++}TUQgV6>2?z{{dWyfzOh<643*Bp)SNoGZoZ;&=&nDE@NNCx*~_WtV^17Bh=>di z-}4|71Jc=TS3AgSQXLD6l~Aj^RTKBh$7uQL=H_`{Tslh;V{7O15P7G`A`Vm$4e*$>)1Sg6#>OxL~U zKgm9QJ~no5V&oPgdb_@|<&BWhQBl#+C{!w!La9t9D)SdRI(%5FSt!IZs-{~Dif}#T&hM+^kLXiIPOjxWbBO@b&0^(>Kbu$B!I-L+i zjTy};D&oO0B}|yAtCMcPxdayMJ&A}6j|hs2Mj-}t8ImabFd-SL` z_vRi1BKOgwXRE9CA3l8e@WqQ4FXrbvn#aD$M*f|Sp1)kNzw6BH)2C0LdRm!#@#Kkv z{sJdneDUnzqZgl3Qc_YLzDRld_U)P6*l%=r|4V4(k;KSwM0j{)_};{{@bK_({{o7N zI`PxPlxr#1Zr%Fy>C>lMZ{NIGP7VCF{ZEk45L8r9L_|c;mLmLsXcRImEF>x|A~-EP zanFs@pKd*R^M+OQD4bvCvLxabIpH&_{;NL zG&(fQuh7uHeYaN7*UjXIqEOL6v1i`AO^gf=`VWT2=>LAr{JU38|7O~vhJ}TMAdjS_ z1&8nKko|A^8q*do1Qi_=w8QT!|01U$NK^og@jnuJt90L&vFjfy_Cr7PLqD|ZyXe0F X*Ybm(??#7P00000NkvXXu0mjfna22< literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/辣椒_from_辣椒种子_1020009.png b/211/web/public/shop_plants_organized/辣椒_from_辣椒种子_1020009.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9d318a2885916d9c4dc48a3170e12b3fe95e3f GIT binary patch literal 2778 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/迎春花_from_迎春花种子_1020396.png b/211/web/public/shop_plants_organized/迎春花_from_迎春花种子_1020396.png new file mode 100644 index 0000000000000000000000000000000000000000..291466adad993cdcacefe28c694e65b80924e64a GIT binary patch literal 4152 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 V-p~g*Km7mz002ovPDHLkV1n>kHjMxP literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/金针菇_from_金针菇种子_1020052.png b/211/web/public/shop_plants_organized/金针菇_from_金针菇种子_1020052.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc7afd54ca5bd592cdf3b8c68f7e4ab448755a1 GIT binary patch literal 3345 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/香瓜_from_香瓜种子_1020067.png b/211/web/public/shop_plants_organized/香瓜_from_香瓜种子_1020067.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1e6d7fbb750287726a3336a170d2dc604e2ce4 GIT binary patch literal 2863 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 ah5iCuSqjP;Z9~dbGo&ztzQl>(TBAJUZ zNwFiNgdst(GGr=QGEy8udIwZtLct~sP738oe@VLC44-e-coR8f?mMsImejwCd0KZ{S1@Q*5xgJuZM>1coFceBL-(zOtMo>~L zsb~z9ro)@c#_!BBd`;}z^V7mYU0gV0C0iA%)|kh!OKBsVA}*Z@hd=k<1@M#)WU<<$)%786Q@`#V40Dii*8cjN zHUyaV#r<-@{UpD^s@bOE`IX(rU_)>hMIQ?Zx9ZKOx99HUN0gJ_n||faO_U>LImNzXjtPQ;o1oy za3yg(8MB#kcWu>dFka~fx8{dn{GNWdtc?V?ezf{aY5N+|5Ya68pm#w4xVq*zxwg|TbSmze!f3tL>EQ(l#Re42^2I) z&{jKno$qt>rQzOWe%}Pu-W2I@7*&d~CK(UjR8`d0FBfAyu!5zA`t6gzx@l=>gDBXA zwN$0>NFa0!H~>j4pbP+jB2EiX#qr`~q@Q8*0IWOgHP&1W0B`_K<-6C$Li@Ls4!|S% z>Lkn zu(=Y5G<)cIo9x!&b!+gr9!>ZTB^sp65m!MSXPKDoJ*Flx!{;M#jnaBk|2!}ErN{ZNuGc^fv> zAtxuCJUkapF06Kjo>w0g|J-gr+1q@^VPaGRoYxNC*O;41%|Xe;nr=!Nq)$s>o4C#2 zUA^C}==w1PZ=e6LjE`xFqb0202d*j(%hyNm`e!9NZ&k+An%RHZ$PPSeM!uq1^meWg z`}jSg{`uSS6Nk+s`&X|n-{zH1iYR6;88gHEtM8$GI?B19VQW#_l~wfN0uuhGHn>?C z%+<}|ahKCgV3)M9bo>iMjYi|c*|wvV>&C#{CF6FwGqV<{x4_EN#Y@wZjUQPz$)C=r zwqq&|4|Ve@!^v|1Z`^EmcjInO+PI8v``5pN)?KKInrhe{sY#O#^hwpAVu!&A~*N&ZdaO;vM~=hdC)*X^W`@FPFm z-8M~oZ$wX3r(ZMovu9Y$#Kh#XNnuQMV00S4@pW2vH*We|S0~#cXV#~xp}-6cyn2c4 zNcie~abRL-0B5&GfARCycI=>uQ+)3@5Q@GiRGgAB*ukC`D!uQ*9*<7EFZQX?HL5Ht zE1TJ^ANf#z5`Bk)T*(VPF1apPSK92g6f3z%OFWJN*3lxphA+F^Kki7qv$&Z)s&T)- zp3hYXXpSu2)IlwIja!`-NhI;e>uoP`o;?o6>nmDb5t*#);3M0KpB}9gHh9_PiUmTW zcfnxaR>!4Im&&U)bmuVB<&J^vwit;88b~uYb;|PSG8bhSrH5*DI(l86mv(xVtg}a(XT0m2 z)_8ID`>cm241ndodmKRn5d~)f2bV{f`+np`J_C)=Bc+iOHmaM?tdR$4fi*}06X5** zX6VcZ0V`9%nx&)@1qqr+HrA`~Kcs%=`c0D`@t1o{RMG^tM&g;9Yj57?@fZvBj6L($ zd7}?JGeBYjUjCbn9+j4%KM%Pta_AX08LYsT8s&dbCLyz6+qu~}L3A^G=JG06!yS7W z2$sgocP0zNb(0~6oI4E8b{bVt@`JWs8k!s&AUUzmK922D?p5}V~yFAXdTop=GgG9anaRAvjSuF`r}@r5ylBNtmD$-}ezPq=2fdi2nEzk^6l8MUMKoO|Vj zzJPABZY(lV^g>%HMj}T;Ecc>s^-g)o3rizLqNY@A@=e6k`gy|S(YmGo{o(xPxMn;Y`Fh>oios5j0G^{b7lVv5>X(S*A29CCk zl6(5sCn)8IEq_9wu|+?HX6uYPbWv2IjD8n+uhtc0!P`gQUYz{0Nk}o%-jFYuTTS@& ztKFsWmklE`UszYxv)6@>6RD#JB;u_F1-04Sbc`gJJWQ3-6W@H(;hv~ducz*22JAw% zg@iWp1K&_ZM#-~sQT0Y0`;$t&`uL3#B|RjKlD7HyGW&(BBPOnzLTCVw2o@}hke&_u z*}@r2J}unr#_r;SYTik+LQYw2-Rg@tYAISy>GA=*Nz{r^dRaYmWr8U4Exj zq=m5mZb-ZgYNBoxRpd4kOcAP;UJ+11_75DT8hJNqj>svj9@!wQit+M!GPJGbh$Iuu-G6Z2>E=q=uwOEHM714rq zZ$AM=p)^x)y;6LE1Ni0;`k3ox2^?5H&{&%Vl28UDpjCq?|YR;J)IT!k$$ zg3XKtiqCQA6*i>&klE^cnR&VzEZLAgo92X|TU)7O4vd6w6sf7ECshZ_hRTj=(D?Al zazyz5VKToD4tpCCclcIHf>fTh6RIN9>;_ZM8PKl$gC8ivZ7H0J(3YuY(Td?_5fgj$ zT+clJuwa(tPmrxP@@>L&u&+B=t_F(#``rzmlkb<4q!Of$1&JfgBQDuOM%Q77UP0Sd zfif(D>msQ}?Ar9t=oq|Q@4CW>W9>F+Q5Bb2XTTpAU=@Z5JlH?Z02 zY+6Z7kTN}ynbw+q{39h-pvopIAww(&(|cOzZy_yh%M>{so!VeIO*-vJr(%5vTYi3D z-=6k>jo-t@Dr#yLZ{;isrps4Q$RUv3Vf?EL(O53t}GOZ{UpI&-fX|Hlx8PDs7KDg8BQgr<& z>&F7)yzE_WHz>*IYfg zB-49ey6*0ZWF^l}1`lX9Hu6VSS4;bqT$~u4?$trR&7N7f9Ha|&l$9yppLRbDdC{Ye zbjh+6WqA2zBUFQ5#eILj)48ZfB|6GT%Qx31gtCy*gHO#By}LW=krxviTUBKrL&tEv zzD6}DhSK+0hA!qgQ1GjGy6de_7-Tu|D_C!_vPam8K8%GyW0hmX?#{za@ZU8uHhrqH zbhY49e|jMFFNIp$@Aq)SOy^9{-tf%q?CfdK^;(_=Ou!(*_aK+XakEu>tAaV1Iu}k^ zs=cM0+RGUnprl>-m^F!&&>=O&rqLiSMh=#2Y49Zchl5JAM3nOEok9(&A7o_wfB*V6 zCO68p1jjm{`3)j+tk2pHLhI{Q$Ly73lBjo9sIh`vuSe_-JR>wG-#t#M^N~cr4dOnL zYRM22XqMSM31658ee_6|MQR*YTz2x4&YmnO~^Y~l^Yw^x3 zU*~>lGNM=u7Hic!M-Pipj_T6vU2&Sx0e#lOqlE^#+dXOXcC%se`CN*TQBqO46OCAJ zXvpSj+5gn^2ldN2HWp`xF=Omm&iY-}OQ4Xg+?|3@f5uQV@#u+A`Gprz##p`b6Xik5|?y;se25c8JsmcXG1_voSgU%$&5Dc|QRQVZ0H z(m+)AW?rApsWS?b6a=t9HT4q+i-M@hv)=fY&vY~gvzxzfbg5F~NgHht&d7eX^3^?Y z61~Uh)Y*$IVj)^V(Fhi++13Z9@lzA0or)%k^Kui&f@lI{$Y}6;XrE;LXwArDdc%?C ztY-njmj$toHW<)XUI)!(($rsdFAI89cTiTR3WD=7JP@tGZoxjd9IT#`ff#B7sw12T zU?B(+_BgXiw-98LCj@~~!9f%m5Tu20RgByt{@M=?mikenkB*A;m!>=pIfE`$Q}6?+ zEulW+GQ9ds1R#c}+Za#~3!lRHhE6yUb|G4hlR;UIu+f4$6;T`@oYCZs8n3EnZh@aJ zcGyxEvnWdSlFiAY~IEL9~cyqmtAMX0^FvY+^*uWy_|gyL*l*OQb2D+~+m*k~T$o zdES;^Jq0hQLB6uov4rmZiNjfnN^Dxio$w+$^=8Gwe64a`?odASG``Vl6`zx<=aAr| z2XyiCG`2hMq^v^j+H0GhWE>7{grLx{NZ8$|?RZ*TDR!s8X$FReuWSNc&6NHQ! zBugDI_N$3eXb{G(;u;?s5)vR22UC&@lSxn`M1Efg58k(JYO0qxyf*R7--mZ7j{x+P-9$m_AW#Z8h?k5$X>{EsZrRFb zRd>&Bxfg3|8XsEsK5bZ(HkE%*Bx@loX>tTkk&2iC+34GfuO(@^`pWvcd{Gr;;01k_ zNzj!`1XFOPjgF2u^ro>+EH>oqH;{$9c3p%_*b1-5orz^)h=nne4E*&&I^6U$rG>We zdKU4P&x^&6*d!!cHROi#*N}K*@_6Dd;-%iGzO1Lr#;ksJl7{YYp(kf|^1KrnMLDK- z&38Qy=9`6RdCRT7>g|>6FxJeN4`<-y&ORX(3X4Av2kKEnSDYHU6YDqD!tXkUor;=S zs}do;PD-Cqad9b2ZPbZKN%@73h6ULP)GW8P9V-PTU&mX*?l-G_jxckx(Q*M1%daPh zua(5@1+C4f-sNbWtZk|<=@)*w)AbeE-$t-;ZT{fQFYXrJX1+aZ7Ft_F%GNu@s(+74 zk^NG!R&FWyHlm;4Nm-nu#AXkYIkZKdHdlSkd2aCOdDKGOrJ>KcykbQ-N!XK}=S)mY z&!6Wky1TlHdu%)C>DgdZRy0r4zip<3~HBiP_&SdSG_e%+v0R zz?wMvK;9$gI->p zY@+;+;Tzj&@Y^n>mQj7y(UHv|BHodL5KUa&GVPP3Jbw*iP%-4Cl|*eU!S!!Ck|8|r zvmk~|{($&xgYDPpi=j27HjU1)4mQZCRFZ=?Q1N~PbUqpBFKbq&i{Ha@bhI}YK}Xuz zec7)%bp3$i=%qZ=eHofJ{D-Gw;y-%}sNZE6+e)Qf`)wc3)7(g0l^*3 A(EtDd literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/黄瓜_from_黄瓜种子_1020097.png b/211/web/public/shop_plants_organized/黄瓜_from_黄瓜种子_1020097.png new file mode 100644 index 0000000000000000000000000000000000000000..02a89d77b0f27f83ef0bac353c0052ea896a6e8e GIT binary patch literal 4761 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 literal 0 HcmV?d00001 diff --git a/211/web/public/shop_plants_organized/黄豆_from_黄豆种子_1020070.png b/211/web/public/shop_plants_organized/黄豆_from_黄豆种子_1020070.png new file mode 100644 index 0000000000000000000000000000000000000000..4d645c41a9645e6ded640ee1efbaf52db6845676 GIT binary patch literal 4292 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 L4QP#`dFcND81aBa literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/100003_化肥礼包_4_d13af7af.png b/211/web/public/verified_items/100003_化肥礼包_4_d13af7af.png new file mode 100644 index 0000000000000000000000000000000000000000..b8360a9163beb60762a2300056366fda6ebc5675 GIT binary patch literal 3590 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 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/1002_点券_50_bd489f54.png b/211/web/public/verified_items/1002_点券_50_bd489f54.png new file mode 100644 index 0000000000000000000000000000000000000000..2f359b5f75aef0a8b6d59311fb1bac3099751576 GIT binary patch literal 3061 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 VCUwHz@Z7fW+_v-J zyYt_=^WVDg-M8}Jy6@Yy!dxWr(ueidjrrY_@Xmkz>#T$(3h2Uc?8tfiB)g7H*k~!{(X4t?Hj;8#&7)mgG8uWAQ5`~jkKbE~~6w>O>N!~o**ysN!S zy62a_g8{^6?HA-TV15a4rmCHD?HA>|qpD}Wq{gRr8tPEGpWd&`g{oeD*M3XBU#jZ6 zJahJYYCJ3R4wGH0>MwiaP|n|BvTL>Tj?8#XZaZ&LuGPy|^ZPw=b@@6)RlokWJD#Qc z^)<@1`qzKJ(6sJfrzzL}i5{=(a;;weM+{Btp76_=+WBLjKg(4|mM<5o`fBXnuSUc1 zcszc9$8fZ|e=Cw@x&KNI-jBx1*=&|Ao2ihd$+B!VTaHJsk%6#8oh}w?hI8>j`8cWx8%eJY7fW)k6b_(Hq=-Q8U{ z2&(m*=+vgbL5vxAS`MWK>l{Sb^>JhkGsp0K?C~hF?WxVD%XJ+0?)ql$?yeUU>t&gCIS9cRcl3@7K2XU`W^xvnaBdoMP7J$M$?x|}UM-F9rp zvlwAGdyr8s_o`g0FXxhRhJAxYdE`W#uj9LQ2!yTl`+d_4f#ABO zI>V%%N$hna(*9a~QQ=3WWf-jH*`Rk9_xizsKYH-9AA_}?Wo?@4#AcZAQj(KbV6O}H z>x(}ROJW!#$=C5+Kj`&#YV_lsF8zKlK7b6&Y7q%YHj{Yet9qfFsXtyqGGZ7;y$Jhz z!cLE#_!JaoAOZ~HO#G}Cgkj8USs4FN&yKC74Kr*oe>`|jjrhP=AaP*|-#1?{J6Uqod z++vL8mQafj!Wd!V1I9?VKm^5cY&)4`vn-KAZWZZ}{V=69CoFs~X%(TAdi5mnl5kWe+`3S8pv#^ibcyOo5=Bw600_pC=;|smhBnM}gqZHN5aJuT2aebxkdAa+plFoW zbsl+9xrJKq3&$hfvLl|MwrnAL%0%*ec!2*Jm)-$qKNZ6f%n7c=d>XVkfn8+c_AMkUGivCVOWIaf9>VuC2Oxx@D9;maF@gycOV83FqQK$% z_}W1-+d#;cO)OXPWYo$?Krmq#(J0}FVQlz@#~qz)oxh7=QCGaAMh3<38ADE5jxvYjZ;9bzz|drmH$hrh^5y-0ZhA(*kp>2!{W)!GbUSl%HR_94z9&Uxe@SUw`^ z*-^HXz3fK$M+zBEVEKu$@t6id9Hfnf9iBvp5d>2PbP{1Q1S1;sE$TRw%Ng3glJ*NS zf|SRYJ(_XfbzL_|=Y)EB66xS0B-+`&sUQm$Ty~NzPn*qC@U+=%Cg!6k#0Zv&9?$b+Cpq`{;FKQim@0S59^yW2HuYw+d5VK( z+qw{Ns13y=il73|oqTapkt#vTiX*dAJDMb!8)lLN17$|O>x>E{87a!^YT@yVvDImf@bs`mi z+8#WyD?A=Rdbn{KPo{GV+_M)%=S>r9lZr(gpU>xfI&IuE zFik-KTb)Y87hATcHlJ4y3z6(wP?|!VwUP#5AP^6$_ijF)+(utLELx+rk{$>c>NG;K zjsD7kz-m}71|ir>$PNI6*(*EsvIBuvk2Y4rWm#1fL=wDxP*qhqdl=sT^3lc{hcx%2 z(eUBn;b94n;polt6Zs*{#~e2)A98S}e8>@?@*#(r%7+}wDj#ydtbE8(x$+^0{>q13 zUr;{eB8KuYS4xx*xg4W>%rzfncVX!rxq0>57nXJy_3M|{uU>um`X^Vf1m^#LiR^%* jcK&&J9qylZUx)i2dqIVE?}N1g00000NkvXXu0mjfmhs7q literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/1012_有机化肥容器_49_fe1c87b7.png b/211/web/public/verified_items/1012_有机化肥容器_49_fe1c87b7.png new file mode 100644 index 0000000000000000000000000000000000000000..65aca2ead1dac83a2a72298c4b04f4182707e818 GIT binary patch literal 4266 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 M07*qoM6N<$f~odHCjbBd literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/80001_化肥1小时_1_cb2a91eb.png b/211/web/public/verified_items/80001_化肥1小时_1_cb2a91eb.png new file mode 100644 index 0000000000000000000000000000000000000000..349a1091447f01118cb319b4b3fb30faf47f2ef4 GIT binary patch literal 3095 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 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/80002_化肥4小时_1_af16205d.png b/211/web/public/verified_items/80002_化肥4小时_1_af16205d.png new file mode 100644 index 0000000000000000000000000000000000000000..06a0de3090d5faa995a94a8f8598297dc20b8707 GIT binary patch literal 3664 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 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/80012_有机化肥4小时_1_03357e47.png b/211/web/public/verified_items/80012_有机化肥4小时_1_03357e47.png new file mode 100644 index 0000000000000000000000000000000000000000..c8757ed5b8ae0585919300670055ee28d203b9c3 GIT binary patch literal 3713 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 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/80013_有机化肥8小时_1_242b3363.png b/211/web/public/verified_items/80013_有机化肥8小时_1_242b3363.png new file mode 100644 index 0000000000000000000000000000000000000000..1c16bdeb6d2adc1a2ae10707942b43faec2b08b9 GIT binary patch literal 3817 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 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/80014_有机化肥12小时_2_5b6e11c0.png b/211/web/public/verified_items/80014_有机化肥12小时_2_5b6e11c0.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae8366b0ce600a66b4ae343b077698fc180e193 GIT binary patch literal 3884 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 RVwL~^002ovPDHLkV1jvpBOL$$ literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/90002_牧羊犬_1_0a3a47cb.png b/211/web/public/verified_items/90002_牧羊犬_1_0a3a47cb.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ec0bd60d848aca84862388bcdd3dc427842487 GIT binary patch literal 4373 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 P00000NkvXXu0mjfTLXx8 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/90003_斑点狗_1_ccf8c0ff.png b/211/web/public/verified_items/90003_斑点狗_1_ccf8c0ff.png new file mode 100644 index 0000000000000000000000000000000000000000..5e54b2055e94c564223471e91b467999755d5004 GIT binary patch literal 3667 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 literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/90005_3天狗粮_1_835fa5b1.png b/211/web/public/verified_items/90005_3天狗粮_1_835fa5b1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3076150ee1df0062f12af6745b58a5db6400a1f GIT binary patch literal 4108 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 Z`46HJf(dt0;rajo002ovPDHLkV1k-`>6rik literal 0 HcmV?d00001 diff --git a/211/web/public/verified_items/index.html b/211/web/public/verified_items/index.html new file mode 100644 index 0000000..bda47db --- /dev/null +++ b/211/web/public/verified_items/index.html @@ -0,0 +1,184 @@ + + + + + + Verified Items + + + +

Verified Items (20)

+
+ +
+ 1001_金币_4_65088be3.png +
+
1001
+
1001_金币_4_65088be3.png
+
+
+ +
+ 1002_点券_50_bd489f54.png +
+
1002
+
1002_点券_50_bd489f54.png
+
+
+ +
+ 1004_钻石_7_ff3c1c6f.png +
+
1004
+
1004_钻石_7_ff3c1c6f.png
+
+
+ +
+ 1011_普通化肥容器_12_3ad710ed.png +
+
1011
+
1011_普通化肥容器_12_3ad710ed.png
+
+
+ +
+ 1012_有机化肥容器_49_fe1c87b7.png +
+
1012
+
1012_有机化肥容器_49_fe1c87b7.png
+
+
+ +
+ 80001_化肥1小时_1_cb2a91eb.png +
+
80001
+
80001_化肥1小时_1_cb2a91eb.png
+
+
+ +
+ 80002_化肥4小时_1_af16205d.png +
+
80002
+
80002_化肥4小时_1_af16205d.png
+
+
+ +
+ 80003_化肥8小时_1_c3700ffc.png +
+
80003
+
80003_化肥8小时_1_c3700ffc.png
+
+
+ +
+ 80004_化肥12小时_1_179fe100.png +
+
80004
+
80004_化肥12小时_1_179fe100.png
+
+
+ +
+ 80011_有机化肥1小时_2_8fe4411f.png +
+
80011
+
80011_有机化肥1小时_2_8fe4411f.png
+
+
+ +
+ 80012_有机化肥4小时_1_03357e47.png +
+
80012
+
80012_有机化肥4小时_1_03357e47.png
+
+
+ +
+ 80013_有机化肥8小时_1_242b3363.png +
+
80013
+
80013_有机化肥8小时_1_242b3363.png
+
+
+ +
+ 80014_有机化肥12小时_2_5b6e11c0.png +
+
80014
+
80014_有机化肥12小时_2_5b6e11c0.png
+
+
+ +
+ 90002_牧羊犬_1_0a3a47cb.png +
+
90002
+
90002_牧羊犬_1_0a3a47cb.png
+
+
+ +
+ 90003_斑点狗_1_ccf8c0ff.png +
+
90003
+
90003_斑点狗_1_ccf8c0ff.png
+
+
+ +
+ 90004_1天狗粮_1_ec8e4ace.png +
+
90004
+
90004_1天狗粮_1_ec8e4ace.png
+
+
+ +
+ 90005_3天狗粮_1_835fa5b1.png +
+
90005
+
90005_3天狗粮_1_835fa5b1.png
+
+
+ +
+ 90006_5天狗粮_1_a04b7acf.png +
+
90006
+
90006_5天狗粮_1_a04b7acf.png
+
+
+ +
+ 100003_化肥礼包_4_d13af7af.png +
+
100003
+
100003_化肥礼包_4_d13af7af.png
+
+
+ +
+ 田园犬 +
+
90001
+
田园犬
+
+
+ +
+ + + \ No newline at end of file diff --git a/211/web/public/verified_items/mapping.json b/211/web/public/verified_items/mapping.json new file mode 100644 index 0000000..495a009 --- /dev/null +++ b/211/web/public/verified_items/mapping.json @@ -0,0 +1,103 @@ +[ + { + "id": "1001", + "filename": "1001_金币_4_65088be3.png", + "path": "verified_items/1001_金币_4_65088be3.png" + }, + { + "id": "1002", + "filename": "1002_点券_50_bd489f54.png", + "path": "verified_items/1002_点券_50_bd489f54.png" + }, + { + "id": "1004", + "filename": "1004_钻石_7_ff3c1c6f.png", + "path": "verified_items/1004_钻石_7_ff3c1c6f.png" + }, + { + "id": "1011", + "filename": "1011_普通化肥容器_12_3ad710ed.png", + "path": "verified_items/1011_普通化肥容器_12_3ad710ed.png" + }, + { + "id": "1012", + "filename": "1012_有机化肥容器_49_fe1c87b7.png", + "path": "verified_items/1012_有机化肥容器_49_fe1c87b7.png" + }, + { + "id": "80001", + "filename": "80001_化肥1小时_1_cb2a91eb.png", + "path": "verified_items/80001_化肥1小时_1_cb2a91eb.png" + }, + { + "id": "80002", + "filename": "80002_化肥4小时_1_af16205d.png", + "path": "verified_items/80002_化肥4小时_1_af16205d.png" + }, + { + "id": "80003", + "filename": "80003_化肥8小时_1_c3700ffc.png", + "path": "verified_items/80003_化肥8小时_1_c3700ffc.png" + }, + { + "id": "80004", + "filename": "80004_化肥12小时_1_179fe100.png", + "path": "verified_items/80004_化肥12小时_1_179fe100.png" + }, + { + "id": "80011", + "filename": "80011_有机化肥1小时_2_8fe4411f.png", + "path": "verified_items/80011_有机化肥1小时_2_8fe4411f.png" + }, + { + "id": "80012", + "filename": "80012_有机化肥4小时_1_03357e47.png", + "path": "verified_items/80012_有机化肥4小时_1_03357e47.png" + }, + { + "id": "80013", + "filename": "80013_有机化肥8小时_1_242b3363.png", + "path": "verified_items/80013_有机化肥8小时_1_242b3363.png" + }, + { + "id": "80014", + "filename": "80014_有机化肥12小时_2_5b6e11c0.png", + "path": "verified_items/80014_有机化肥12小时_2_5b6e11c0.png" + }, + { + "id": "90002", + "filename": "90002_牧羊犬_1_0a3a47cb.png", + "path": "verified_items/90002_牧羊犬_1_0a3a47cb.png" + }, + { + "id": "90003", + "filename": "90003_斑点狗_1_ccf8c0ff.png", + "path": "verified_items/90003_斑点狗_1_ccf8c0ff.png" + }, + { + "id": "90004", + "filename": "90004_1天狗粮_1_ec8e4ace.png", + "path": "verified_items/90004_1天狗粮_1_ec8e4ace.png" + }, + { + "id": "90005", + "filename": "90005_3天狗粮_1_835fa5b1.png", + "path": "verified_items/90005_3天狗粮_1_835fa5b1.png" + }, + { + "id": "90006", + "filename": "90006_5天狗粮_1_a04b7acf.png", + "path": "verified_items/90006_5天狗粮_1_a04b7acf.png" + }, + { + "id": "100003", + "filename": "100003_化肥礼包_4_d13af7af.png", + "path": "verified_items/100003_化肥礼包_4_d13af7af.png" + }, + { + "id": "90001", + "filename": "90001_田园犬_1.png", + "path": "verified_items/90001_田园犬_1.png", + "name": "田园犬" + } +] \ No newline at end of file diff --git a/211/web/public/verified_items/土地.png b/211/web/public/verified_items/土地.png new file mode 100644 index 0000000000000000000000000000000000000000..1c4af5cc36ebc22cc0ef8fc8e11d97a5cc789ec9 GIT binary patch literal 688 zcmV;h0#E&kP)KYmL=f>c7Ga8SaCVb+gpf=xlFaaGBQWP?va(~fGth+fEtWV3l#vTstkby&7? zRjOu6u4+!cdR&=YN{v)T#DHO-VNJ}3W_3kANW9cf0000GbW%=J0Cv`&OAurJ{Vk5d z&$R68ips#E00009a7bBm000XU000XU0RWnu7ytkP=1D|BRCt_~l!1<;FbqTkbV;DJ zb&QiZ^#A|!G!BcnQ@ht4RjOKe_IONi?zN_yCcTee?ic!+ebasZm>cKCd%ra;AN8BY z#c!IDCX?#6%+vp@jd#CkJSipJ?mu$Vy!b5QKg)-mR-+LHa(yENYB)OCW6G0_T8?ML4v4?5# zUL!n3O))Y_Eu|jKteucGOEK;?$9)_k;*=sYiL56E?OH6@o~Fm>oSTu`kr<;F36ek< zJHsY3s+xFoE|QtsLlcV8Zi)Cd*Z6ImRaK2#2UqiIZ3v}p^vFUf#TI?7&D}SJv2*Xb zoNHZ)&Cl+pRwRjkN+}h|n}HbNrsmK&Hx0%?B7!>-I<=u{&MSHWN{MRCrCi%Xa=B)J zwXX073O>$jwge-A>APdomutz56vp|mAlsbSiKWi)c4BZsx;~UfVreaZ6ByKywVwMN zTnHfm#8cH`-&YZtR!r2rIxW)>o`x}+9V8JlDP?$f!logFQc6Z1JI9j2gtrWI84M%c zUmJXel8)_oaTsh43_e%ox`j)BlEPYw!E+-Q_=T WmOwPNk?#!v0000

9p-Hb*9(st?3t_gUM9tn8=Yyv4E+LTr?>Cwk% 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.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𝔎k}G8QyI4O+8$l^VN<#< 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 s_PHN~PZ6_U$JP@Q3mSRgqj)*nee> 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�p)Zq$={YtGJypY8pUki? z|9UE5aZ#|PvG)Pzm;O*ahlk{e7@DK6F5F%^2dw2elRT$D%!IanK9F;@*;RwFaz_S0 z0tPr$$I~EjE;a`6Krsn4`<=pGp;)JI* zrJbQ==i?sRBDLSFrDZ^Dr1x-dPoaM74eY4B+eo*>uuP&1)%31dLcO)$FW0&<4Oje{ zkPU|Vv6tGe$)(oj<{7iG*frtXuavs2cTL4+I7QeI8Rm2-J$b%V5~aMd zafQMzS*jGNQFvZvYmkdg!Y)LY#9QzbC=`q=t-7bphW&v}oy5Jzt38!51ue|h3Q{I? zU*peR$f=^)Vn8ve2v08Br8wVWvh1lVnQ(=n^{CMGJ#bA7HDjhlgNb&z)5a8)GX-)f z9%`xa%ckDhh4I)qTc4+@0OEYt7Qcc1*#GM=8-5gv zX@X(Aa{p)?(v8<{S2LgK-OggYll-+$8t1!v+2&`JU-x=x)()2KqNi||`@`i-|R;vLg~v-di@+kd-`-)V<$O@qaemzLP>JKuSs$fAw=z(M7R zp$GLf5kc}6tVOlIo4o65Vl0h3dFgk?T1v=L4mx(%CL#l~*PSlK?qhvpIRMPv!WDL+ zp03a3&IQIB{wkcpo)C%a`r;`@No%krC>7og#VAPRL^ruKWoOoVTCx$zz~z&@ zS4gN3C{URUm)E#aVH~Q z_;`m@I_@kAUTYDtVVWD%KnAyp#)Q;i1H}m;^I963%5SX0*vmmT0t1sd*N_^t86FcEfH= ztbLL9Lc-YNGnH{DLy*s-%0eR=`RNp~qBgNF7m<+FQs-H!i9=3`U*|lTxvnD+-wT`o zs{v^XCW++Q!Aa22nqG@3u+Dx{Ov?$;YT-Jl*270&uOkk4W!&IacfZ>Py>x$%2Gl(J*Y!Kr)X<-q#p2fE&V|%0! zdFte20`fGrx5-h}W5A1#p6jb5;3vWSG_6h69Y*+2Gr_I%jhl?L3#>*wyv)>$3s(cn z*Dv>h8)UBhG7cZaaFF_v9U>O?auA|15KO%fZymeFUPY$}{}ch{HLA}Z`~YcwK(3RX zB0okwnOf1%h9^~uXxGlb1OY#gI?ob=B{R68R%|Xecdm}eSL-VtQ7a9Xrr?eOdVpDp zI}&=rh>XG_qlZ@CW@);h5T)6%C(bj8pR6zG$`trk^qv}K˜LsoUH&1IrQ-Syq| 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