wwqgtxx
ba6163574e
chore: better parseAddr
2023-01-17 15:41:51 +08:00
wwqgtxx
4e4d741075
chore: code cleanup
2023-01-16 12:11:34 +08:00
wwqgtxx
50832aab47
chore: decrease direct depend on the sing package
2023-01-16 10:50:31 +08:00
H1JK
d1565bb46f
refactor: Implement extended IO
2023-01-16 09:42:03 +08:00
Skyxim
b6b6413d04
refactor: replace experimental.fingerprints with custom-certificates and Change the fingerprint verification logic to SSL pinning
2023-01-14 21:08:06 +08:00
metacubex
606e8948c0
Fix: TLS defaults to true for h2/grpc networks
2023-01-14 16:20:58 +08:00
3andero
804cff8c55
fix: skip-cert-verify is true by default ( #333 )
...
* fix: skip-cert-verify is true by default
* fix: format
* fix: typo
Co-authored-by: 3andero <3andero@github.com>
Co-authored-by: Hellojack <106379370+H1JK@users.noreply.github.com>
2023-01-13 09:55:01 +08:00
Hellojack
be6142aa43
feat: VLESS support packet encodings ( #334 )
...
* adjust: Do not use XTLS on H2 connections
* feat: VLESS support XUDP fullcone NAT
* fix: VLESS with PacketAddr does not work
* fix: VLESS XUDP crash
2023-01-11 22:01:15 +08:00
wwqgtxx
0069513780
chore: shadowtls don't depend on trojan's code
2023-01-11 10:19:30 +08:00
3andero
51f9b34a7c
feat: Support ShadowTLS v2 as Shadowsocks plugin ( #330 )
2023-01-11 00:13:48 +08:00
metacubex
337be9124f
chore: clean code
2023-01-11 00:01:28 +08:00
wwqgtxx
261b8a1d06
fix: vmess udp
2023-01-10 13:21:32 +08:00
metacubex
01d8b224db
fix: vless RoutingMark bind
2023-01-09 23:15:17 +08:00
H1JK
fd48c6df8a
chore: Fix fmt in #321
...
Replace all double spaces to tabs due to Go fmt proposal.
2023-01-07 12:24:28 +08:00
ag2s20150909
29b72df14c
proxy-groups support exclude node by node type
2023-01-03 21:47:57 +08:00
ag2s20150909
f100a33d98
proxy-provider support exclude node by node type
2023-01-03 21:27:07 +08:00
wwqgtxx
a03af85a6b
fix: trying to let hysteria's port hopping work
2022-12-23 11:00:55 +08:00
wwqgtxx
daf0b23805
fix: some safeConnClose forget using original
2022-12-22 12:31:45 +08:00
wwqgtxx
980454beb2
chore: cleanup code
2022-12-22 09:53:25 +08:00
wwqgtxx
22414ce399
chore: relay support tuic
2022-12-20 00:11:02 +08:00
wwqgtxx
7496d9c114
chore: rebuild relay
2022-12-19 21:34:07 +08:00
wwqgtxx
c63dd62ed2
chore: support relay native udp when using ss and ssr protocol
2022-12-19 17:02:04 +08:00
wwqgtxx
57592ee840
chore: better safeConnClose
2022-12-16 22:16:02 +08:00
wwqgtxx
afb2364ca2
chore: wireguard's reserved support base64 input
2022-12-13 20:40:07 +08:00
wwqgtxx
9711390c18
fix: check conn is nil in safeConnClose
2022-12-13 18:09:19 +08:00
wwqgtxx
bffb0573a6
fix: safeConnClose not working
2022-12-13 13:20:40 +08:00
wwqgtxx
88acf8e098
fix: fix bindIfaceToListenConfig() in windows force bind to an ipv4 address
2022-12-13 11:18:32 +08:00
wwqgtxx
f87144f84b
chore: add persistent-keepalive for wireguard
2022-12-13 08:35:01 +08:00
wwqgtxx
1333f1fd47
fix: fix wireguard outbound not work with ipv6 server
2022-12-13 08:23:17 +08:00
wwqgtxx
8fa6bd1743
fix: fix wireguard outbound not work with the sniffer
2022-12-11 23:53:53 +08:00
wwqgtxx
f657ac97f6
fix: add an unmap before is6
2022-12-11 15:48:37 +08:00
wwqgtxx
57dfaf135d
fix: hysteria ipv6 outbound
2022-12-11 13:41:44 +08:00
wwqgtxx
9df42d7b98
fix: issue #292
2022-12-11 09:25:46 +08:00
wwqgtxx
a6f7e1472b
fix: let doh/dot server follow hosts and can remotely resolve itself ip
2022-12-07 20:01:44 +08:00
wwqgtxx
46d23d9b86
chore: all listeners support specialProxy
2022-12-05 17:53:54 +08:00
wwqgtxx
a0a2eb2106
chore: update dependencies
2022-12-05 11:03:28 +08:00
wwqgtxx
b7d976796a
chore: listeners support shadowsocks/vmess
2022-12-05 10:12:53 +08:00
wwqgtxx
2e22c712af
chore: rebuild add adapter/inbound.Addition to simply Listener.New apis
2022-12-05 00:20:50 +08:00
wwqgtxx
62474e0ed6
fix: correct C.Metadata
2022-12-04 22:08:20 +08:00
wwqgtxx
62226e8b3d
chore: rebuild InboundListener
2022-12-04 21:53:13 +08:00
wwqgtxx
6fc62da7ae
chore: change C.PacketAdapter from a struct to an interface
2022-12-04 14:37:52 +08:00
Skyxim
4f75201a98
feat: add linsters
2022-12-04 13:37:14 +08:00
wwqgtxx
0aefa3be85
fix: remove cyclic dependent to make tuic's Finalizer work
2022-12-02 16:56:17 +08:00
metacubex
8c0fbb3665
chore: restful api display fast-open for tuic and hysteria
2022-11-29 00:56:27 +08:00
wwqgtxx
b4b9ef2362
Merge branch 'dev' of https://github.com/Dreamacro/clash into Alpha
2022-11-28 20:04:56 +08:00
wwqgtxx
dd6f7e3701
fix: structure decode first do strict match
2022-11-28 19:11:55 +08:00
wwqgtxx
551283c16e
chore: add tuic-server listener
2022-11-28 17:09:25 +08:00
wwqgtxx
a58234f0cd
chore: support KeyReplacer in Structure Decoder
2022-11-27 13:44:38 +08:00
wwqgtxx
c8d7243b5b
fix: hop-interval of tysteria is optional too
2022-11-27 13:07:27 +08:00
Skyxim
6b1ca7b07c
fix: ports of hysteria is optional
2022-11-27 12:52:14 +08:00
wwqgtxx
17c081a40c
add support for hysteria udp port hopping ( #269 )
...
* add support for hysteria udp port hopping
* add ports field for hysteria
* change method for udp connection
Co-authored-by: geoleonsh <geoleonsh@live.com>
2022-11-27 11:09:56 +08:00
wwqgtxx
423850a7aa
chore: allow to set max-open-streams for tuic
2022-11-27 09:38:20 +08:00
wwqgtxx
896d30b151
chore: rebuild tuic client's code
2022-11-26 23:53:59 +08:00
wwqgtxx
495fd191f2
chore: clear config field name (be compatible with old field name)
2022-11-26 21:35:47 +08:00
wwqgtxx
ae76daf393
chore: tuic add fast-open support
2022-11-26 21:14:56 +08:00
Skyxim
a5ae2e891c
feat: support fast_open for hysteria, and unified parameter naming
2022-11-26 19:37:32 +08:00
Sizhe Sun
90b40a8e5a
Fix: drop UDP packet which mismatched destination for VMess ( #2410 )
...
Co-authored-by: SUN Sizhe <sunsizhe@cmi.chinamobile.com>
2022-11-26 11:27:24 +08:00
wwqgtxx
7f40645934
chore: tuic use a udp pool too and auto close when outbound is garbage collected
2022-11-25 22:42:28 +08:00
Skyxim
6c204d2b77
chroe: wrong variable
2022-11-25 20:53:08 +08:00
wwqgtxx
7b44cde4bd
chore: tuic use a simple client pool
2022-11-25 20:14:05 +08:00
wwqgtxx
21a91e88a1
fix: tuic set MaxOpenStreams
2022-11-25 18:32:30 +08:00
wwqgtxx
76d2838721
chore: split tuic's tcp and udp client
2022-11-25 17:15:45 +08:00
wwqgtxx
f542351404
chore: tuic add max_udp_relay_packet_size
2022-11-25 12:43:23 +08:00
wwqgtxx
d47ce79a24
chore: better tuic conn close
2022-11-25 11:32:52 +08:00
Skyxim
cce42b4b83
fix: prefer ipv6 not working
2022-11-25 11:12:22 +08:00
wwqgtxx
30ca59dab7
fix: tuic typo
2022-11-25 10:45:06 +08:00
wwqgtxx
c89b1f0e96
chore: tuic add cubic,new_reno,bbr congestion_controller
2022-11-25 10:33:37 +08:00
wwqgtxx
59bd11a3a7
chore: add tuic outbound
...
close #133
2022-11-25 08:08:14 +08:00
wwqgtxx
16f8f77f5d
fix: better wireguard error handle
2022-11-18 19:40:39 +08:00
wwqgtxx
dfc0ec995c
fix: wireguard handle conn is nil
2022-11-18 19:32:12 +08:00
wwqgtxx
1880a485f8
chore: better tfo inbound code
2022-11-16 10:43:16 +08:00
wwqgtxx
dc3e144b6a
Merge branch 'dev' of https://github.com/Dreamacro/clash into Alpha
2022-11-12 20:43:48 +08:00
wwqgtxx
901a47318d
chore: always pass context when resolve dns
2022-11-12 13:18:36 +08:00
wwqgtxx
b2d7149a95
chore: support IN-PORT rule
2022-11-11 23:36:06 +08:00
wwqgtxx
6dadc2357a
chore: remove AddrType on Metadata
2022-11-11 09:19:50 +08:00
wwqgtxx
4b4c3dc41e
fix: small-case import name
2022-11-09 19:42:56 +08:00
wwqgtxx
b699fb046b
fix: wireguard's dns resolve
2022-11-09 19:35:03 +08:00
wwqgtxx
ae08d13de4
chore: support wireguard outbound
2022-11-09 18:44:06 +08:00
wwqgtxx
1d784231b0
fix: exclude-filter not work when filter is empty
2022-11-09 08:41:30 +08:00
wwqgtxx
5fd79890e7
chore: add exclude-filter to ProxyGroup
2022-11-09 08:06:37 +08:00
metacubex
53b2a480ef
fix: subscriptionInfo api
2022-11-08 22:30:50 +08:00
adlyq
409cd4f6a1
fix: subscriptionInfo api
...
fix: subscriptionInfo api
fix: subscriptionInfo api
2022-11-08 07:59:08 +08:00
wwqgtxx
4673d2093a
fix: context import
2022-11-06 08:43:39 +08:00
adlyq
dcd2417fce
feat: subscriptionInfo
2022-11-05 19:39:17 +08:00
wwqgtxx
19b7c7f52a
Fix: a shared fastSingle.Do() may cause providers untouched ( #2378 )
2022-11-04 13:11:01 +08:00
wwqgtxx
5dab89c9ec
fix: group filter add not matched proxies at the end
2022-10-31 21:50:30 +08:00
wwqgtxx
2a24effac0
chore: better UrlTest's torch
2022-10-31 16:58:29 +08:00
wwqgtxx
972d3f1d39
fix: UrlTest's torch not work
...
close #232
2022-10-31 16:45:14 +08:00
wwqgtxx
a7aa5fd523
adjust: add some log for healthcheck debug
2022-10-31 16:04:50 +08:00
wwqgtxx
b9d8b69889
fix: lazy check
2022-10-30 23:08:18 +08:00
wwqgtxx
dedb9122df
chore: support multi filter in GroupBase too
2022-10-30 22:30:54 +08:00
wwqgtxx
0e5bf0c27e
chore: support multi filter like subconverter in ProxyProvider and add exclude-filter to ProxyProvider
2022-10-30 21:04:33 +08:00
Skyxim
0fb0e490f8
fix: when connection refused active health test
2022-10-16 13:12:49 +08:00
wwqgtxx
94246104b8
chore: use sing-tun to replace old tun_adapter
2022-10-06 19:23:38 +08:00
H1JK
59edcf33bd
feat: Add VMess global padding support
2022-10-02 22:42:33 +08:00
H1JK
35506e179a
chore: Unify config field name style
2022-10-02 21:46:01 +08:00
Stash Networks
88e4a9a755
Chore: compatible with Stash hysteria config
2022-09-21 23:42:33 +08:00
wwqgtxx
82c9a1a2bb
chore: add xudp support for vmess
2022-09-19 18:26:43 +08:00
wwqgtxx
e1ec4a2502
fix: wrong host shown when using uot
2022-09-19 17:37:16 +08:00
Skyxim
d69e0bce4a
fix: resolve ip of udp proxy error
2022-08-29 13:04:48 +08:00
Skyxim
7f197ede51
fix: hysteria udp crash
2022-08-29 12:10:46 +08:00
Skyxim
db94dc76b4
fix: udp default resolve ip
2022-08-28 15:57:10 +08:00
Skyxim
99effb051b
feat: add ip-version param
2022-08-28 13:41:43 +08:00
Skyxim
482062376e
fix: Temporarily delete marking node alive as false when error occurs
2022-08-13 18:25:28 +08:00
Dreamacro
5940f62794
Chore: http2 should use DialTLSContext and some tls handshake should with context
2022-08-13 12:35:39 +08:00
metacubex
637707e58f
Chore: Migration 1.19
2022-08-12 00:07:13 +08:00
Dreamacro
d71a2ce61e
Fix: fakeip udp should not replace with another ip
2022-07-24 00:02:45 +08:00
Dreamacro
133bb2319f
Chore: load balance hash need to have fallback strategy
2022-07-23 23:59:13 +08:00
Dreamacro
7d84a47683
Chore: load balance hash need to have fallback strategy
2022-07-23 23:51:42 +08:00
Skyxim
6a4063af0d
refactor: optimize nodes caching
2022-07-20 08:53:54 +08:00
Skyxim
fbabcfce94
fix: CA params convert to fingerprint
2022-07-12 14:32:34 +08:00
Skyxim
80df572b18
refactor: Unified provider loading resources
2022-07-11 21:30:34 +08:00
Skyxim
a8ce283727
feat: add fingerprint param
2022-07-11 13:42:28 +08:00
Skyxim
ab8e9e7d7a
fix: skip-cert-verify not work
2022-07-11 12:37:27 +08:00
Skyxim
fef9f95e65
feat: add fingerprint for tls verify
2022-07-10 20:44:24 +08:00
Skyxim
60e1947ed2
chore: upgrade dependencies for hysteria
2022-07-07 12:49:52 +08:00
Dreamacro
aaf08dadff
Change: remove AddrType on Metadata ( #2199 )
2022-07-05 20:26:43 +08:00
Dreamacro
557297ac9a
Chore: load balance hash need to have fallback strategy
2022-07-04 21:36:33 +08:00
Skyxim
3cc1870aee
chore: embed hysteria, clean irrelevant codes, code from https://github.com/HyNetwork/hysteria
2022-07-03 18:26:46 +08:00
Dreamacro
27e1d6cdae
Chore: cleanup code
2022-06-30 17:12:06 +08:00
Kaming Chan
91c22b16bf
Fix: proxy provider filter validation ( #2198 )
2022-06-30 17:08:53 +08:00
世界
6b44178108
Fix concurrency vmess udp write
2022-06-28 08:12:56 +08:00
Skyxim
10383e2701
Merge branch 'dev' into Alpha
2022-06-26 21:53:03 +08:00
Skyxim
f4b9f2965f
fix: hysteria dial use external context
2022-06-26 21:52:22 +08:00
Skyxim
2ba933d16a
chore: hysteria params verify
2022-06-25 12:43:47 +08:00
Skyxim
669961e496
fix: proxy provider force update on init
2022-06-25 12:42:52 +08:00
Skyxim
8c079bf5bc
fix: tcp concurrent force close when context done
2022-06-25 09:16:28 +08:00
Skyxim
4ba34ce672
chore: healthcheck only once check at same time
2022-06-25 08:53:04 +08:00
MetaCubeX
b658bb415b
chore: remove unused
2022-06-20 22:25:59 +08:00
MetaCubeX
85405a54c7
Merge remote-tracking branch 'Meta/Alpha' into Alpha
...
# Conflicts:
# go.mod
# go.sum
2022-06-19 22:30:02 +08:00
Skyxim
109a76e1fc
fix: url test http response not closed
2022-06-19 17:29:46 +08:00
wwqgtxx
8da67ba61c
Add shadowsocks uot in relay
2022-06-18 16:38:44 +08:00
Skyxim
54a0947bb4
fix: force update provider happen loopback
2022-06-18 16:05:09 +08:00
世界
a562b249a2
Add shadowsocks uot and test
2022-06-18 10:50:33 +08:00
MetaCubeX
aaf700f0b5
chore: Allow VLESS protocol TLS to be FALSE
2022-06-16 01:20:33 +08:00
Skyxim
f7c903a586
Merge branch 'dev' into Alpha
2022-06-14 20:23:51 +08:00
Skyxim
ff4a5bef9b
fix: up/down of hysteria must be a valid value
2022-06-14 20:23:36 +08:00
世界
d8dc44e786
Refactor: vmess
...
Add support for vmess length masking/packetaddr/authenticated length
Add support for zero/aes-128-cfb protcol
2022-06-14 13:21:22 +08:00
Skyxim
2146b605f7
refactor: deprecated params(up_mbps,down_mpbs,auth) in hysteria; up/down no use append unit equivalent up_mbps/down_mbps, default unit is Mbps; up/down become a required option.
2022-06-12 11:52:15 +08:00
Skyxim
8853e97b40
fix: sni invalid on hysteria
2022-06-12 00:00:42 +08:00
MetaCubeX
94368f43eb
fix: Vmess URI Scheme 解析问题
2022-06-10 03:15:30 +08:00
世界
695fb64fa8
fix: vmess ws
2022-06-09 16:23:15 +08:00
MetaCubeX
9511ccfe47
chore: refine code
2022-06-08 01:47:50 +08:00
adlyq
ed17a1bf23
fix: group filter touch provider
2022-06-07 17:19:25 +08:00
世界
2a4f2f3942
fix: hysteria dialer
2022-06-07 15:49:10 +08:00
世界
3254eaf51c
fix: hysteria parse auth
2022-06-07 15:24:46 +08:00
adlyq
7941bae141
fix: hysteria parse
2022-06-07 14:53:00 +08:00
世界
35a6666a84
feat: add hysteria
2022-06-07 13:46:54 +08:00
世界
1acc6759e9
feat: add support for shadowsocks 2022 ciphers
2022-06-06 19:56:36 +08:00
MetaCubeX
5d337b75f9
feat: proxy provider 支持V2ray格式订阅链接
2022-06-05 17:14:24 +08:00
yaling888
2188fad9c1
Feature: add V2Ray subscription support to proxy provider
2022-06-05 15:59:47 +08:00
MetaCubeX
c045a4f2a7
Chore: make hadowsocks2 lib embed
2022-06-04 20:29:33 +08:00
Skyxim
8ff7e180a4
fix: 当初始化失败时,定时更新失效
2022-06-04 19:15:30 +08:00
Skyxim
3827e00b54
refactor: 抽离http请求方法
2022-06-04 19:14:39 +08:00
adlyq
6e84f685ce
chore: 更新geox时通过内存存储
2022-06-03 16:50:49 +08:00
adlyq
1ad87cfec9
chore: 选择fallback时,当节点不可用时触发urltest
2022-06-03 13:32:11 +08:00
Dreamacro
09d49bac95
Chore: embed shadowsocks2
2022-06-01 21:43:20 +08:00
adlyq
4092a7c84b
feat: proxies group URLTest api
2022-05-30 22:07:09 +08:00
Skyxim
067c02aba1
fix: 调整获取远程目的的位置
2022-05-28 20:01:27 +08:00
Skyxim
2044458df9
fix: npe
2022-05-27 20:33:27 +08:00
Skyxim
ac36473d13
refactor: 获取远程目的从tunnel中剔除,移至tracker
2022-05-27 09:00:48 +08:00
Skyxim
72fb153fe0
refactor: 优化UDP远程目标获取
2022-05-26 23:41:09 +08:00
Skyxim
527a602eba
fix: 更新错误时未停止后续流程,日志修改
2022-05-26 23:13:36 +08:00
Skyxim
a71fd3b4df
fix: 启动时检测provider文件是否过期,强制更新
2022-05-26 21:05:00 +08:00
Dreamacro
9d2fc976e2
Chore: upgrade to yaml v3
2022-05-26 17:47:05 +08:00
adlyq
c0eb9aac1c
feat: fallback can be select by user
2022-05-24 10:17:44 +08:00
adlyq
3ab82849d4
feat: IN-TYPE rule support
...
eg. IN-TYPE,SOCKS/REDIR/INNER,Proxy
support list: HTTP HTTPS SOCKS SOCKS4 SOCKS5 REDIR TPROXY TUN INNER
2022-05-20 23:17:16 +08:00
Skyxim
fe25ae83df
refactor: 修改sticky-session尝试逻辑
2022-05-19 20:27:26 +08:00
Skyxim
7aff9aac82
fix: sticky-sessions异常
2022-05-18 22:29:27 +08:00
adlyq
b5623602f5
chore: Android auto-detect-interface plus
2022-05-18 12:00:57 +08:00
Skyxim
8b00be9039
fix: 删除udp触发的错误逻辑
2022-05-17 21:23:28 +08:00
Skyxim
fa9e27c5e4
refactor: 重构失败主动健康检测
2022-05-17 21:15:14 +08:00
adlyq
c4408612b3
chore: 暴露数据给前端
2022-05-17 16:47:21 +08:00
Skyxim
0742f7db26
refactor: 重构StickySessions
2022-05-17 13:28:54 +08:00
adlyq
962ceaa89e
refactor: strategyStickySessions
2022-05-16 17:46:28 +08:00
MetaCubeX
aa0d174ccb
fix: strategyStickySessions nil pointer
2022-05-16 17:06:44 +08:00
Skyxim
5016f529af
revert: yaml v2
2022-05-14 23:36:19 +08:00
adlyq
df8196a68c
fix: print process path logic
2022-05-12 18:57:30 +08:00
lelemka0
c1631759fc
feat: add strategy:sticky-sessions for LoadBalance
...
Signed-off-by: Meta <maze.y2b@gmail.com>
2022-05-09 18:56:36 +08:00
Skyxim
2072964701
revert: tls handshake timeout recovery 10s
2022-05-08 21:56:59 +08:00
MetaCubeX
7136d145f8
chore: update dependencies
2022-05-08 00:47:01 +08:00
Skyxim
2fbbf7519f
fix: provider auto update
2022-05-08 00:04:16 +08:00
Skyxim
a95d439852
chore: the uuid-map is transferred to the protocol
2022-05-06 13:28:09 +08:00
wwqgtxx
a08e39faec
fix uuid match
2022-05-06 13:08:27 +08:00
Skyxim
9969e1706e
fix: loadbalance group npe
2022-05-04 19:52:48 +08:00
Skyxim
fb58595d44
feat: Expose remote destination (udp proxy maybe domain of node)
2022-05-04 16:57:08 +08:00
Skyxim
b401da5eba
refactor: provider init order
2022-05-02 16:47:48 +08:00
Skyxim
b929a19f48
refactor: Unified active health detection, supported by load balancing policy group
2022-05-02 13:50:10 +08:00
MetaCubeX
5fee0b5bf1
chore: adjust pass to reject.go
2022-05-02 09:16:47 +08:00
wwqgtxx
fe2bc903b8
fix trojan and snell's normal udp
2022-05-02 06:28:27 +08:00
wwqgtxx
2aad9818e8
fix trojan and snell's udp over tcp
2022-04-30 22:26:38 +08:00
wwqgtxx
861205dbbe
support udp in relay if last proxy could udp-over-tcp
2022-04-30 11:36:42 +08:00
adlyq
8dea62cd63
refactor: del useless file
2022-04-28 23:49:24 +08:00
adlyq
fac63625fc
fix: replace with sync.map for GroupBase
2022-04-28 23:43:10 +08:00
adlyq
b9f270162a
refactor: field name
2022-04-28 23:10:08 +08:00
adlyq
f1dab9e9ce
refactor: optimize the performance of filter in proxy-group
2022-04-28 19:01:13 +08:00
Skyxim
c7bc67e44c
fix: handle metadata when dst is ip:port
2022-04-28 12:44:27 +08:00
Skyxim
c161d5e6be
fix: inner request error
2022-04-28 09:24:40 +08:00
Meta
73aa8c7be7
feat: support uuid with custom string
2022-04-27 18:02:29 +08:00
yaling888
4fd7d0f707
Chore: use generics as possible
2022-04-25 13:18:30 +08:00