├── .rustfmt.toml ├── .gitignore ├── img └── example.jpeg ├── Cargo.toml ├── src ├── main.rs ├── config.rs ├── client.rs ├── plugin.rs └── server.rs ├── README.md └── Cargo.lock /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 2 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | 3 | *.json 4 | *.js 5 | examples 6 | memo.md 7 | -------------------------------------------------------------------------------- /img/example.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oyyd/kcptun-sip003-rust/main/img/example.jpeg -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "kcptun-sip003-rust" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | tokio = { version = "1.35.1", features = [ 10 | "macros", 11 | "net", 12 | "rt", 13 | "rt-multi-thread", 14 | ] } 15 | tokio_kcp = { git = "https://github.com/oyyd/tokio_kcp.git", branch = "hack" } 16 | tokio_smux = "0.2" 17 | anyhow = "1.0.79" 18 | log = "0.4.20" 19 | env_logger = "0.10.1" 20 | tokio-io-timeout = "1.2.0" 21 | 22 | [dev-dependencies] 23 | tokio-socks = "0.5.1" 24 | reqwest = { version = "0.11.23", features = ["socks"] } 25 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod client; 2 | mod config; 3 | mod plugin; 4 | mod server; 5 | 6 | use anyhow::Result; 7 | use env_logger; 8 | use tokio; 9 | 10 | async fn server() -> Result<()> { 11 | let config = config::Config::new_server()?; 12 | 13 | let s = server::Server::new(config); 14 | 15 | s.run().await?; 16 | 17 | Ok(()) 18 | } 19 | 20 | async fn client() -> Result<()> { 21 | let config = config::Config::new_client()?; 22 | 23 | let c = client::Client::new(config); 24 | 25 | c.run().await?; 26 | 27 | Ok(()) 28 | } 29 | 30 | #[tokio::main] 31 | async fn main() { 32 | let env = env_logger::Env::new().filter_or("RUST_LOG", "info"); 33 | env_logger::init_from_env(env); 34 | 35 | let plugin_opts = plugin::PluginOptions::new(); 36 | 37 | if plugin_opts.is_client { 38 | client().await.unwrap() 39 | } else { 40 | server().await.unwrap() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kcptun-sip003-rust 2 | 3 | A [kcptun](https://github.com/xtaci/kcptun) implementation in Rust with sip003 support. It combines: 4 | - A hacked version of [tokio_kcp](https://github.com/Matrix-Zhang/tokio_kcp/) 5 | - [tokio_smux](https://github.com/oyyd/tokio_smux). 6 | 7 | Currently, only minimal features of kcptun are implemented. To work with kcptun, please set these options: 8 | 9 | ```bash 10 | --crypt none --mode fast3 --nocomp --ps 0 --ds 0 11 | ``` 12 | 13 | Example: 14 | 15 | 16 | 17 | 18 | ## Install 19 | 20 | ```bash 21 | git clone https://github.com/oyyd/kcptun-sip003-rust.git 22 | cd kcptun-sip003-rust 23 | cargo install --path . 24 | kcptun-sip003-rust 25 | ``` 26 | 27 | 28 | ## Usage 29 | 30 | Start a server: 31 | ```bash 32 | kcptun-sip003-rust 33 | ``` 34 | 35 | Start a client: 36 | ```bash 37 | SS_PLUGIN_OPTIONS="client=true" kcptun-sip003-rust 38 | ``` 39 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use core::time; 2 | 3 | use crate::plugin::PluginConfig; 4 | use anyhow::Result; 5 | use tokio_kcp::{KcpConfig, KcpNoDelayConfig}; 6 | use tokio_smux::SmuxConfig; 7 | 8 | const DEFAULT_RW_TIMEOUT: time::Duration = time::Duration::from_secs(600); 9 | 10 | #[derive(Clone)] 11 | pub struct Config { 12 | pub plugin: PluginConfig, 13 | pub kcp: KcpConfig, 14 | pub sockbuf: u32, 15 | pub server_kcp_stream_rw_timeout: Option, 16 | } 17 | 18 | impl Config { 19 | fn default_sokcbuf() -> u32 { 20 | 1024 * 1024 * 4 21 | } 22 | 23 | pub fn new_client() -> Result { 24 | let plugin = PluginConfig::new_client()?; 25 | let kcp = Config::new_kcp_config(); 26 | 27 | Ok(Self { 28 | plugin, 29 | kcp, 30 | sockbuf: Self::default_sokcbuf(), 31 | server_kcp_stream_rw_timeout: None, 32 | }) 33 | } 34 | 35 | pub fn new_server() -> Result { 36 | let plugin = PluginConfig::new_server()?; 37 | let kcp = Config::new_kcp_config(); 38 | 39 | Ok(Self { 40 | plugin, 41 | kcp, 42 | sockbuf: Self::default_sokcbuf(), 43 | server_kcp_stream_rw_timeout: Some(DEFAULT_RW_TIMEOUT), 44 | }) 45 | } 46 | 47 | fn new_kcp_config() -> KcpConfig { 48 | let mut kcp = KcpConfig::default(); 49 | 50 | // TODO support kcp config from outside 51 | kcp.nodelay = KcpNoDelayConfig::fastest(); 52 | 53 | kcp 54 | } 55 | 56 | // TODO support config from outside 57 | // TODO allow clone SmuxConfig and move to config 58 | pub fn new_smux() -> SmuxConfig { 59 | let smux = SmuxConfig::default(); 60 | 61 | smux 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/client.rs: -------------------------------------------------------------------------------- 1 | use crate::config::Config; 2 | use anyhow::Result; 3 | use log; 4 | use tokio::{ 5 | io::{AsyncReadExt, AsyncWriteExt}, 6 | net::{TcpListener, TcpStream}, 7 | }; 8 | use tokio_kcp::KcpStream; 9 | use tokio_smux::{Session, Stream}; 10 | 11 | pub struct Client { 12 | config: Config, 13 | } 14 | 15 | async fn proxy(mut socket: TcpStream, mut smux_stream: Stream) -> Result<()> { 16 | let mut buf: Vec = vec![0; 65535]; 17 | 18 | loop { 19 | tokio::select! { 20 | size = socket.read(&mut buf) => { 21 | let size = size?; 22 | if size == 0 { 23 | break 24 | } 25 | let data = &buf[0..size]; 26 | smux_stream.send_message(data.to_vec()).await?; 27 | } 28 | msg = smux_stream.recv_message() => { 29 | let msg = msg?; 30 | if msg.is_none() { 31 | // receive fin 32 | break 33 | } 34 | let msg = msg.unwrap(); 35 | socket.write_all(&msg).await?; 36 | } 37 | } 38 | } 39 | Ok(()) 40 | } 41 | 42 | impl Client { 43 | pub fn new(config: Config) -> Self { 44 | Client { config } 45 | } 46 | 47 | pub async fn run(&self) -> Result<()> { 48 | // - create kcp client connects to server 49 | let remote_addr = self.config.plugin.client_remote_addr()?; 50 | let kcp_stream = KcpStream::connect(&self.config.kcp, remote_addr).await?; 51 | 52 | // - wrap smux 53 | let mut session = Session::client(kcp_stream, Config::new_smux())?; 54 | 55 | // - bind local tcp server 56 | let local_addr = self.config.plugin.client_local_addr()?; 57 | 58 | log::info!("tcp client bind local_addr {}", local_addr); 59 | 60 | let tcp_listener = TcpListener::bind(local_addr).await?; 61 | 62 | // - receive tcp clients and create kcp clients stream to proxy them 63 | loop { 64 | let (socket, local_addr) = tcp_listener.accept().await?; 65 | let smux_stream = session.open_stream().await; 66 | 67 | // TODO restart if kcp stream broken? 68 | if smux_stream.is_err() { 69 | let err = smux_stream.err().unwrap(); 70 | log::warn!("failed to open smux stream, err: {}", err.to_string()); 71 | continue; 72 | } 73 | 74 | let smux_stream = smux_stream?; 75 | 76 | log::info!("proxy {} -> {}", local_addr, remote_addr); 77 | 78 | tokio::spawn(async move { 79 | let res = proxy(socket, smux_stream).await; 80 | let _ = res.map_err(|err| log::warn!("tunnel failure, err: {}", err.to_string())); 81 | }); 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/plugin.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use std::env; 3 | use std::net; 4 | use std::str::FromStr; 5 | 6 | const LOCAL_HOST: &str = "SS_LOCAL_HOST"; 7 | const LOCAL_PORT: &str = "SS_LOCAL_PORT"; 8 | const REMOTE_HOST: &str = "SS_REMOTE_HOST"; 9 | const REMOTE_PORT: &str = "SS_REMOTE_PORT"; 10 | const PLUGIN_OPTIONS: &str = "SS_PLUGIN_OPTIONS"; 11 | 12 | pub struct PluginOptions { 13 | pub is_client: bool, 14 | } 15 | 16 | impl PluginOptions { 17 | pub fn new() -> Self { 18 | let mut opts = PluginOptions { is_client: false }; 19 | 20 | let opts_str = env::var(PLUGIN_OPTIONS); 21 | 22 | if opts_str.is_err() { 23 | return opts; 24 | } 25 | 26 | let opts_str = opts_str.unwrap(); 27 | 28 | let parts = opts_str.split(";"); 29 | 30 | for item in parts.into_iter() { 31 | let kv: Vec<_> = item.split("=").collect(); 32 | if kv.len() != 2 { 33 | continue; 34 | } 35 | 36 | let key = kv[0]; 37 | let value = kv[1]; 38 | 39 | match key { 40 | "client" => opts.is_client = value == "true", 41 | _ => { 42 | // 43 | } 44 | } 45 | } 46 | 47 | opts 48 | } 49 | } 50 | 51 | #[derive(Clone)] 52 | pub struct PluginConfig { 53 | is_client: bool, 54 | 55 | local_host: String, 56 | local_port: u16, 57 | remote_host: String, 58 | remote_port: u16, 59 | } 60 | 61 | impl Default for PluginConfig { 62 | fn default() -> Self { 63 | Self { 64 | is_client: false, 65 | local_host: "127.0.0.1".to_string(), 66 | local_port: 12948, 67 | remote_host: "127.0.0.1".to_string(), 68 | remote_port: 29900, 69 | } 70 | } 71 | } 72 | 73 | fn parse_port(val: &str) -> Result { 74 | let port = val.parse::()?; 75 | 76 | Ok(port) 77 | } 78 | 79 | impl PluginConfig { 80 | pub fn new_client() -> Result { 81 | let mut config = PluginConfig::new()?; 82 | 83 | config.is_client = true; 84 | 85 | Ok(config) 86 | } 87 | 88 | pub fn new_server() -> Result { 89 | let mut config = PluginConfig::new()?; 90 | 91 | config.is_client = false; 92 | 93 | Ok(config) 94 | } 95 | 96 | fn new() -> Result { 97 | let mut config = Self::default(); 98 | 99 | let vars = env::vars(); 100 | 101 | for (key, value) in vars { 102 | match key.as_str() { 103 | LOCAL_HOST => { 104 | config.local_host = value; 105 | } 106 | LOCAL_PORT => { 107 | config.local_port = parse_port(&value)?; 108 | } 109 | REMOTE_HOST => { 110 | config.remote_host = value; 111 | } 112 | REMOTE_PORT => { 113 | config.remote_port = parse_port(&value)?; 114 | } 115 | _ => {} 116 | } 117 | } 118 | 119 | Ok(config) 120 | } 121 | 122 | pub fn server_listen_addr(&self) -> Result { 123 | let addr = format!("{}:{}", self.remote_host, self.remote_port); 124 | let addr = net::SocketAddr::from_str(&addr)?; 125 | Ok(addr) 126 | } 127 | 128 | pub fn server_target_addr(&self) -> Result { 129 | let addr = format!("{}:{}", self.local_host, self.local_port); 130 | let addr = net::SocketAddr::from_str(&addr)?; 131 | Ok(addr) 132 | } 133 | 134 | // TODO check 135 | pub fn client_local_addr(&self) -> Result { 136 | let addr = format!("{}:{}", self.local_host, self.local_port); 137 | let addr = net::SocketAddr::from_str(&addr)?; 138 | Ok(addr) 139 | } 140 | 141 | pub fn client_remote_addr(&self) -> Result { 142 | let addr = format!("{}:{}", self.remote_host, self.remote_port); 143 | let addr = net::SocketAddr::from_str(&addr)?; 144 | Ok(addr) 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use std::net::SocketAddr; 2 | 3 | use crate::config::Config; 4 | use anyhow::Result; 5 | use log; 6 | use tokio::{ 7 | io::{AsyncReadExt, AsyncWriteExt}, 8 | net::{TcpSocket, TcpStream}, 9 | }; 10 | use tokio_io_timeout::TimeoutStream; 11 | use tokio_kcp::KcpListener; 12 | use tokio_smux::{Session, Stream}; 13 | 14 | pub struct Server { 15 | config: Config, 16 | } 17 | 18 | const MAX_FRAME_DATA_LEN: usize = 65535; 19 | 20 | async fn proxy(mut socket: TcpStream, mut smux_stream: Stream) -> Result<()> { 21 | let mut buf: Vec = vec![0; 65535]; 22 | 23 | loop { 24 | tokio::select! { 25 | size = socket.read(&mut buf) => { 26 | let size = size?; 27 | if size == 0 { 28 | break; 29 | } 30 | 31 | // NOTE: When test, large frames will crash shadowrocket clients. 32 | // But I can't reproduce it with kcptun. 33 | let mut pos = 0; 34 | loop { 35 | if pos >= size { 36 | break; 37 | } 38 | let mut end = pos + MAX_FRAME_DATA_LEN; 39 | if end > size { 40 | end = size; 41 | } 42 | let data = &buf[pos..end]; 43 | smux_stream.send_message(data.to_vec()).await?; 44 | pos = end; 45 | }; 46 | 47 | // NOTE: Simply write all of them into a frame when using with kcptun. 48 | // smux_stream.send_message(buf[0..size].to_vec()).await?; 49 | } 50 | msg = smux_stream.recv_message() => { 51 | let msg = msg?; 52 | if msg.is_none() { 53 | break; 54 | } 55 | 56 | let data = msg.unwrap(); 57 | socket.write_all(&data).await?; 58 | } 59 | } 60 | } 61 | 62 | Ok(()) 63 | } 64 | 65 | async fn handle_stream( 66 | smux_stream: Stream, 67 | local_addr: SocketAddr, 68 | target_addr: SocketAddr, 69 | sockbuf: u32, 70 | ) -> Result<()> { 71 | let socket = { 72 | match target_addr.is_ipv4() { 73 | true => TcpSocket::new_v4(), 74 | false => TcpSocket::new_v6(), 75 | } 76 | }?; 77 | 78 | socket.set_recv_buffer_size(sockbuf)?; 79 | socket.set_send_buffer_size(sockbuf)?; 80 | 81 | let tcp_socket = socket.connect(target_addr).await?; 82 | 83 | log::info!("proxy {} -> {}", local_addr, target_addr); 84 | 85 | proxy(tcp_socket, smux_stream).await?; 86 | 87 | Ok(()) 88 | } 89 | 90 | async fn loop_smux_session( 91 | mut session: Session, 92 | local_addr: SocketAddr, 93 | target_addr: SocketAddr, 94 | sockbuf: u32, 95 | ) -> Result<()> { 96 | // - accept smux stream 97 | loop { 98 | let smux_stream = session.accept_stream().await?; 99 | let sid = smux_stream.sid(); 100 | 101 | log::trace!("accept smux stream, sid {}", sid); 102 | 103 | tokio::spawn(async move { 104 | // - create tcp socket connect to the remote and proxy their data 105 | let res = handle_stream(smux_stream, local_addr, target_addr.clone(), sockbuf).await; 106 | let _ = res.map_err(|err| { 107 | log::warn!("proxy failed, err {}", err.to_string()); 108 | }); 109 | log::trace!("smux stream finished, sid {}", sid); 110 | }); 111 | } 112 | } 113 | 114 | impl Server { 115 | pub fn new(config: Config) -> Self { 116 | Self { config } 117 | } 118 | 119 | pub async fn run(&self) -> Result<()> { 120 | // - create kcp stream server 121 | let listen_addr = self.config.plugin.server_listen_addr()?; 122 | let target_addr = self.config.plugin.server_target_addr()?; 123 | 124 | log::info!( 125 | "server starts, listen_addr={}, target_addr={}", 126 | listen_addr, 127 | target_addr 128 | ); 129 | 130 | let mut listener = KcpListener::bind(self.config.kcp, listen_addr).await?; 131 | let sockbuf = self.config.sockbuf; 132 | 133 | // - accept kcp client stream 134 | loop { 135 | let (kcp_stream, addr) = listener.accept().await?; 136 | 137 | let mut kcp_stream_with_timeout = TimeoutStream::new(kcp_stream); 138 | if self.config.server_kcp_stream_rw_timeout.is_some() { 139 | kcp_stream_with_timeout.set_read_timeout(self.config.server_kcp_stream_rw_timeout); 140 | kcp_stream_with_timeout.set_write_timeout(self.config.server_kcp_stream_rw_timeout); 141 | } 142 | 143 | log::info!("accept kcp stream, addr {}", addr); 144 | 145 | // - wrap smux 146 | let session = Session::server(Box::pin(kcp_stream_with_timeout), Config::new_smux())?; 147 | 148 | tokio::spawn(async move { 149 | let res = loop_smux_session(session, addr, target_addr, sockbuf).await; 150 | let _ = res.map_err(|err| { 151 | log::warn!("smux session failed, err: {}", err.to_string()); 152 | }); 153 | log::info!("kcp stream finished, addr {}", addr); 154 | }); 155 | } 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "anyhow" 31 | version = "1.0.97" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 34 | 35 | [[package]] 36 | name = "autocfg" 37 | version = "1.4.0" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 40 | 41 | [[package]] 42 | name = "backtrace" 43 | version = "0.3.74" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 46 | dependencies = [ 47 | "addr2line", 48 | "cfg-if", 49 | "libc", 50 | "miniz_oxide", 51 | "object", 52 | "rustc-demangle", 53 | "windows-targets 0.52.6", 54 | ] 55 | 56 | [[package]] 57 | name = "base64" 58 | version = "0.21.7" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 61 | 62 | [[package]] 63 | name = "bitflags" 64 | version = "1.3.2" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 67 | 68 | [[package]] 69 | name = "bitflags" 70 | version = "2.9.0" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 73 | 74 | [[package]] 75 | name = "bumpalo" 76 | version = "3.17.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 79 | 80 | [[package]] 81 | name = "byte_string" 82 | version = "1.0.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "11aade7a05aa8c3a351cedc44c3fc45806430543382fcc4743a9b757a2a0b4ed" 85 | 86 | [[package]] 87 | name = "byteorder" 88 | version = "1.5.0" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 91 | 92 | [[package]] 93 | name = "bytes" 94 | version = "1.10.1" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 97 | 98 | [[package]] 99 | name = "cc" 100 | version = "1.2.16" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" 103 | dependencies = [ 104 | "shlex", 105 | ] 106 | 107 | [[package]] 108 | name = "cfg-if" 109 | version = "1.0.0" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 112 | 113 | [[package]] 114 | name = "core-foundation" 115 | version = "0.9.4" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 118 | dependencies = [ 119 | "core-foundation-sys", 120 | "libc", 121 | ] 122 | 123 | [[package]] 124 | name = "core-foundation-sys" 125 | version = "0.8.7" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 128 | 129 | [[package]] 130 | name = "crc32fast" 131 | version = "1.4.2" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 134 | dependencies = [ 135 | "cfg-if", 136 | ] 137 | 138 | [[package]] 139 | name = "dashmap" 140 | version = "5.5.3" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 143 | dependencies = [ 144 | "cfg-if", 145 | "hashbrown 0.14.5", 146 | "lock_api", 147 | "once_cell", 148 | "parking_lot_core", 149 | ] 150 | 151 | [[package]] 152 | name = "displaydoc" 153 | version = "0.2.5" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 156 | dependencies = [ 157 | "proc-macro2", 158 | "quote", 159 | "syn", 160 | ] 161 | 162 | [[package]] 163 | name = "either" 164 | version = "1.15.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 167 | 168 | [[package]] 169 | name = "encoding_rs" 170 | version = "0.8.35" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 173 | dependencies = [ 174 | "cfg-if", 175 | ] 176 | 177 | [[package]] 178 | name = "env_logger" 179 | version = "0.10.2" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" 182 | dependencies = [ 183 | "humantime", 184 | "is-terminal", 185 | "log", 186 | "regex", 187 | "termcolor", 188 | ] 189 | 190 | [[package]] 191 | name = "equivalent" 192 | version = "1.0.2" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 195 | 196 | [[package]] 197 | name = "errno" 198 | version = "0.3.10" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 201 | dependencies = [ 202 | "libc", 203 | "windows-sys 0.59.0", 204 | ] 205 | 206 | [[package]] 207 | name = "fastrand" 208 | version = "2.3.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 211 | 212 | [[package]] 213 | name = "fnv" 214 | version = "1.0.7" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 217 | 218 | [[package]] 219 | name = "foreign-types" 220 | version = "0.3.2" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 223 | dependencies = [ 224 | "foreign-types-shared", 225 | ] 226 | 227 | [[package]] 228 | name = "foreign-types-shared" 229 | version = "0.1.1" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 232 | 233 | [[package]] 234 | name = "form_urlencoded" 235 | version = "1.2.1" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 238 | dependencies = [ 239 | "percent-encoding", 240 | ] 241 | 242 | [[package]] 243 | name = "futures" 244 | version = "0.3.31" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 247 | dependencies = [ 248 | "futures-channel", 249 | "futures-core", 250 | "futures-executor", 251 | "futures-io", 252 | "futures-sink", 253 | "futures-task", 254 | "futures-util", 255 | ] 256 | 257 | [[package]] 258 | name = "futures-channel" 259 | version = "0.3.31" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 262 | dependencies = [ 263 | "futures-core", 264 | "futures-sink", 265 | ] 266 | 267 | [[package]] 268 | name = "futures-core" 269 | version = "0.3.31" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 272 | 273 | [[package]] 274 | name = "futures-executor" 275 | version = "0.3.31" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 278 | dependencies = [ 279 | "futures-core", 280 | "futures-task", 281 | "futures-util", 282 | ] 283 | 284 | [[package]] 285 | name = "futures-io" 286 | version = "0.3.31" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 289 | 290 | [[package]] 291 | name = "futures-macro" 292 | version = "0.3.31" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 295 | dependencies = [ 296 | "proc-macro2", 297 | "quote", 298 | "syn", 299 | ] 300 | 301 | [[package]] 302 | name = "futures-sink" 303 | version = "0.3.31" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 306 | 307 | [[package]] 308 | name = "futures-task" 309 | version = "0.3.31" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 312 | 313 | [[package]] 314 | name = "futures-util" 315 | version = "0.3.31" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 318 | dependencies = [ 319 | "futures-channel", 320 | "futures-core", 321 | "futures-io", 322 | "futures-macro", 323 | "futures-sink", 324 | "futures-task", 325 | "memchr", 326 | "pin-project-lite", 327 | "pin-utils", 328 | "slab", 329 | ] 330 | 331 | [[package]] 332 | name = "getrandom" 333 | version = "0.2.15" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 336 | dependencies = [ 337 | "cfg-if", 338 | "libc", 339 | "wasi 0.11.0+wasi-snapshot-preview1", 340 | ] 341 | 342 | [[package]] 343 | name = "getrandom" 344 | version = "0.3.1" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 347 | dependencies = [ 348 | "cfg-if", 349 | "libc", 350 | "wasi 0.13.3+wasi-0.2.2", 351 | "windows-targets 0.52.6", 352 | ] 353 | 354 | [[package]] 355 | name = "gimli" 356 | version = "0.31.1" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 359 | 360 | [[package]] 361 | name = "h2" 362 | version = "0.3.26" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 365 | dependencies = [ 366 | "bytes", 367 | "fnv", 368 | "futures-core", 369 | "futures-sink", 370 | "futures-util", 371 | "http", 372 | "indexmap", 373 | "slab", 374 | "tokio", 375 | "tokio-util", 376 | "tracing", 377 | ] 378 | 379 | [[package]] 380 | name = "hashbrown" 381 | version = "0.14.5" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 384 | 385 | [[package]] 386 | name = "hashbrown" 387 | version = "0.15.2" 388 | source = "registry+https://github.com/rust-lang/crates.io-index" 389 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 390 | 391 | [[package]] 392 | name = "hermit-abi" 393 | version = "0.5.0" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" 396 | 397 | [[package]] 398 | name = "http" 399 | version = "0.2.12" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 402 | dependencies = [ 403 | "bytes", 404 | "fnv", 405 | "itoa", 406 | ] 407 | 408 | [[package]] 409 | name = "http-body" 410 | version = "0.4.6" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 413 | dependencies = [ 414 | "bytes", 415 | "http", 416 | "pin-project-lite", 417 | ] 418 | 419 | [[package]] 420 | name = "httparse" 421 | version = "1.10.1" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 424 | 425 | [[package]] 426 | name = "httpdate" 427 | version = "1.0.3" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 430 | 431 | [[package]] 432 | name = "humantime" 433 | version = "2.1.0" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 436 | 437 | [[package]] 438 | name = "hyper" 439 | version = "0.14.32" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 442 | dependencies = [ 443 | "bytes", 444 | "futures-channel", 445 | "futures-core", 446 | "futures-util", 447 | "h2", 448 | "http", 449 | "http-body", 450 | "httparse", 451 | "httpdate", 452 | "itoa", 453 | "pin-project-lite", 454 | "socket2", 455 | "tokio", 456 | "tower-service", 457 | "tracing", 458 | "want", 459 | ] 460 | 461 | [[package]] 462 | name = "hyper-tls" 463 | version = "0.5.0" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 466 | dependencies = [ 467 | "bytes", 468 | "hyper", 469 | "native-tls", 470 | "tokio", 471 | "tokio-native-tls", 472 | ] 473 | 474 | [[package]] 475 | name = "icu_collections" 476 | version = "1.5.0" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 479 | dependencies = [ 480 | "displaydoc", 481 | "yoke", 482 | "zerofrom", 483 | "zerovec", 484 | ] 485 | 486 | [[package]] 487 | name = "icu_locid" 488 | version = "1.5.0" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 491 | dependencies = [ 492 | "displaydoc", 493 | "litemap", 494 | "tinystr", 495 | "writeable", 496 | "zerovec", 497 | ] 498 | 499 | [[package]] 500 | name = "icu_locid_transform" 501 | version = "1.5.0" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 504 | dependencies = [ 505 | "displaydoc", 506 | "icu_locid", 507 | "icu_locid_transform_data", 508 | "icu_provider", 509 | "tinystr", 510 | "zerovec", 511 | ] 512 | 513 | [[package]] 514 | name = "icu_locid_transform_data" 515 | version = "1.5.0" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 518 | 519 | [[package]] 520 | name = "icu_normalizer" 521 | version = "1.5.0" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 524 | dependencies = [ 525 | "displaydoc", 526 | "icu_collections", 527 | "icu_normalizer_data", 528 | "icu_properties", 529 | "icu_provider", 530 | "smallvec", 531 | "utf16_iter", 532 | "utf8_iter", 533 | "write16", 534 | "zerovec", 535 | ] 536 | 537 | [[package]] 538 | name = "icu_normalizer_data" 539 | version = "1.5.0" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 542 | 543 | [[package]] 544 | name = "icu_properties" 545 | version = "1.5.1" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 548 | dependencies = [ 549 | "displaydoc", 550 | "icu_collections", 551 | "icu_locid_transform", 552 | "icu_properties_data", 553 | "icu_provider", 554 | "tinystr", 555 | "zerovec", 556 | ] 557 | 558 | [[package]] 559 | name = "icu_properties_data" 560 | version = "1.5.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 563 | 564 | [[package]] 565 | name = "icu_provider" 566 | version = "1.5.0" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 569 | dependencies = [ 570 | "displaydoc", 571 | "icu_locid", 572 | "icu_provider_macros", 573 | "stable_deref_trait", 574 | "tinystr", 575 | "writeable", 576 | "yoke", 577 | "zerofrom", 578 | "zerovec", 579 | ] 580 | 581 | [[package]] 582 | name = "icu_provider_macros" 583 | version = "1.5.0" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 586 | dependencies = [ 587 | "proc-macro2", 588 | "quote", 589 | "syn", 590 | ] 591 | 592 | [[package]] 593 | name = "idna" 594 | version = "1.0.3" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 597 | dependencies = [ 598 | "idna_adapter", 599 | "smallvec", 600 | "utf8_iter", 601 | ] 602 | 603 | [[package]] 604 | name = "idna_adapter" 605 | version = "1.2.0" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 608 | dependencies = [ 609 | "icu_normalizer", 610 | "icu_properties", 611 | ] 612 | 613 | [[package]] 614 | name = "indexmap" 615 | version = "2.8.0" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" 618 | dependencies = [ 619 | "equivalent", 620 | "hashbrown 0.15.2", 621 | ] 622 | 623 | [[package]] 624 | name = "ipnet" 625 | version = "2.11.0" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 628 | 629 | [[package]] 630 | name = "is-terminal" 631 | version = "0.4.16" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" 634 | dependencies = [ 635 | "hermit-abi", 636 | "libc", 637 | "windows-sys 0.59.0", 638 | ] 639 | 640 | [[package]] 641 | name = "itoa" 642 | version = "1.0.15" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 645 | 646 | [[package]] 647 | name = "js-sys" 648 | version = "0.3.77" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 651 | dependencies = [ 652 | "once_cell", 653 | "wasm-bindgen", 654 | ] 655 | 656 | [[package]] 657 | name = "kcp" 658 | version = "0.5.3" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "0e387a924f42063d380be14857714a2f0c177e44dbeab8895244e5370d8a8e68" 661 | dependencies = [ 662 | "bytes", 663 | "log", 664 | "thiserror", 665 | ] 666 | 667 | [[package]] 668 | name = "kcptun-sip003-rust" 669 | version = "0.1.0" 670 | dependencies = [ 671 | "anyhow", 672 | "env_logger", 673 | "log", 674 | "reqwest", 675 | "tokio", 676 | "tokio-io-timeout", 677 | "tokio-socks", 678 | "tokio_kcp", 679 | "tokio_smux", 680 | ] 681 | 682 | [[package]] 683 | name = "libc" 684 | version = "0.2.170" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" 687 | 688 | [[package]] 689 | name = "linux-raw-sys" 690 | version = "0.9.2" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "6db9c683daf087dc577b7506e9695b3d556a9f3849903fa28186283afd6809e9" 693 | 694 | [[package]] 695 | name = "litemap" 696 | version = "0.7.5" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 699 | 700 | [[package]] 701 | name = "lock_api" 702 | version = "0.4.12" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 705 | dependencies = [ 706 | "autocfg", 707 | "scopeguard", 708 | ] 709 | 710 | [[package]] 711 | name = "log" 712 | version = "0.4.26" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 715 | 716 | [[package]] 717 | name = "memchr" 718 | version = "2.7.4" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 721 | 722 | [[package]] 723 | name = "mime" 724 | version = "0.3.17" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 727 | 728 | [[package]] 729 | name = "miniz_oxide" 730 | version = "0.8.5" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" 733 | dependencies = [ 734 | "adler2", 735 | ] 736 | 737 | [[package]] 738 | name = "mio" 739 | version = "1.0.3" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 742 | dependencies = [ 743 | "libc", 744 | "wasi 0.11.0+wasi-snapshot-preview1", 745 | "windows-sys 0.52.0", 746 | ] 747 | 748 | [[package]] 749 | name = "native-tls" 750 | version = "0.2.14" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 753 | dependencies = [ 754 | "libc", 755 | "log", 756 | "openssl", 757 | "openssl-probe", 758 | "openssl-sys", 759 | "schannel", 760 | "security-framework", 761 | "security-framework-sys", 762 | "tempfile", 763 | ] 764 | 765 | [[package]] 766 | name = "object" 767 | version = "0.36.7" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 770 | dependencies = [ 771 | "memchr", 772 | ] 773 | 774 | [[package]] 775 | name = "once_cell" 776 | version = "1.21.0" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" 779 | 780 | [[package]] 781 | name = "openssl" 782 | version = "0.10.71" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" 785 | dependencies = [ 786 | "bitflags 2.9.0", 787 | "cfg-if", 788 | "foreign-types", 789 | "libc", 790 | "once_cell", 791 | "openssl-macros", 792 | "openssl-sys", 793 | ] 794 | 795 | [[package]] 796 | name = "openssl-macros" 797 | version = "0.1.1" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 800 | dependencies = [ 801 | "proc-macro2", 802 | "quote", 803 | "syn", 804 | ] 805 | 806 | [[package]] 807 | name = "openssl-probe" 808 | version = "0.1.6" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 811 | 812 | [[package]] 813 | name = "openssl-sys" 814 | version = "0.9.106" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" 817 | dependencies = [ 818 | "cc", 819 | "libc", 820 | "pkg-config", 821 | "vcpkg", 822 | ] 823 | 824 | [[package]] 825 | name = "parking_lot_core" 826 | version = "0.9.10" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 829 | dependencies = [ 830 | "cfg-if", 831 | "libc", 832 | "redox_syscall", 833 | "smallvec", 834 | "windows-targets 0.52.6", 835 | ] 836 | 837 | [[package]] 838 | name = "percent-encoding" 839 | version = "2.3.1" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 842 | 843 | [[package]] 844 | name = "pin-project-lite" 845 | version = "0.2.16" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 848 | 849 | [[package]] 850 | name = "pin-utils" 851 | version = "0.1.0" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 854 | 855 | [[package]] 856 | name = "pkg-config" 857 | version = "0.3.32" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 860 | 861 | [[package]] 862 | name = "ppv-lite86" 863 | version = "0.2.21" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 866 | dependencies = [ 867 | "zerocopy", 868 | ] 869 | 870 | [[package]] 871 | name = "proc-macro2" 872 | version = "1.0.94" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 875 | dependencies = [ 876 | "unicode-ident", 877 | ] 878 | 879 | [[package]] 880 | name = "quote" 881 | version = "1.0.39" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" 884 | dependencies = [ 885 | "proc-macro2", 886 | ] 887 | 888 | [[package]] 889 | name = "rand" 890 | version = "0.8.5" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 893 | dependencies = [ 894 | "libc", 895 | "rand_chacha", 896 | "rand_core", 897 | ] 898 | 899 | [[package]] 900 | name = "rand_chacha" 901 | version = "0.3.1" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 904 | dependencies = [ 905 | "ppv-lite86", 906 | "rand_core", 907 | ] 908 | 909 | [[package]] 910 | name = "rand_core" 911 | version = "0.6.4" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 914 | dependencies = [ 915 | "getrandom 0.2.15", 916 | ] 917 | 918 | [[package]] 919 | name = "redox_syscall" 920 | version = "0.5.10" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" 923 | dependencies = [ 924 | "bitflags 2.9.0", 925 | ] 926 | 927 | [[package]] 928 | name = "regex" 929 | version = "1.11.1" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 932 | dependencies = [ 933 | "aho-corasick", 934 | "memchr", 935 | "regex-automata", 936 | "regex-syntax", 937 | ] 938 | 939 | [[package]] 940 | name = "regex-automata" 941 | version = "0.4.9" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 944 | dependencies = [ 945 | "aho-corasick", 946 | "memchr", 947 | "regex-syntax", 948 | ] 949 | 950 | [[package]] 951 | name = "regex-syntax" 952 | version = "0.8.5" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 955 | 956 | [[package]] 957 | name = "reqwest" 958 | version = "0.11.27" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 961 | dependencies = [ 962 | "base64", 963 | "bytes", 964 | "encoding_rs", 965 | "futures-core", 966 | "futures-util", 967 | "h2", 968 | "http", 969 | "http-body", 970 | "hyper", 971 | "hyper-tls", 972 | "ipnet", 973 | "js-sys", 974 | "log", 975 | "mime", 976 | "native-tls", 977 | "once_cell", 978 | "percent-encoding", 979 | "pin-project-lite", 980 | "rustls-pemfile", 981 | "serde", 982 | "serde_json", 983 | "serde_urlencoded", 984 | "sync_wrapper", 985 | "system-configuration", 986 | "tokio", 987 | "tokio-native-tls", 988 | "tokio-socks", 989 | "tower-service", 990 | "url", 991 | "wasm-bindgen", 992 | "wasm-bindgen-futures", 993 | "web-sys", 994 | "winreg", 995 | ] 996 | 997 | [[package]] 998 | name = "rustc-demangle" 999 | version = "0.1.24" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1002 | 1003 | [[package]] 1004 | name = "rustix" 1005 | version = "1.0.2" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825" 1008 | dependencies = [ 1009 | "bitflags 2.9.0", 1010 | "errno", 1011 | "libc", 1012 | "linux-raw-sys", 1013 | "windows-sys 0.59.0", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "rustls-pemfile" 1018 | version = "1.0.4" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1021 | dependencies = [ 1022 | "base64", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "rustversion" 1027 | version = "1.0.20" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1030 | 1031 | [[package]] 1032 | name = "ryu" 1033 | version = "1.0.20" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1036 | 1037 | [[package]] 1038 | name = "schannel" 1039 | version = "0.1.27" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1042 | dependencies = [ 1043 | "windows-sys 0.59.0", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "scopeguard" 1048 | version = "1.2.0" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1051 | 1052 | [[package]] 1053 | name = "security-framework" 1054 | version = "2.11.1" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1057 | dependencies = [ 1058 | "bitflags 2.9.0", 1059 | "core-foundation", 1060 | "core-foundation-sys", 1061 | "libc", 1062 | "security-framework-sys", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "security-framework-sys" 1067 | version = "2.14.0" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1070 | dependencies = [ 1071 | "core-foundation-sys", 1072 | "libc", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "serde" 1077 | version = "1.0.219" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1080 | dependencies = [ 1081 | "serde_derive", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "serde_derive" 1086 | version = "1.0.219" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1089 | dependencies = [ 1090 | "proc-macro2", 1091 | "quote", 1092 | "syn", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "serde_json" 1097 | version = "1.0.140" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1100 | dependencies = [ 1101 | "itoa", 1102 | "memchr", 1103 | "ryu", 1104 | "serde", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "serde_urlencoded" 1109 | version = "0.7.1" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1112 | dependencies = [ 1113 | "form_urlencoded", 1114 | "itoa", 1115 | "ryu", 1116 | "serde", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "shlex" 1121 | version = "1.3.0" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1124 | 1125 | [[package]] 1126 | name = "slab" 1127 | version = "0.4.9" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1130 | dependencies = [ 1131 | "autocfg", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "smallvec" 1136 | version = "1.14.0" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1139 | 1140 | [[package]] 1141 | name = "socket2" 1142 | version = "0.5.8" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1145 | dependencies = [ 1146 | "libc", 1147 | "windows-sys 0.52.0", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "spin" 1152 | version = "0.9.8" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1155 | dependencies = [ 1156 | "lock_api", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "stable_deref_trait" 1161 | version = "1.2.0" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1164 | 1165 | [[package]] 1166 | name = "syn" 1167 | version = "2.0.100" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 1170 | dependencies = [ 1171 | "proc-macro2", 1172 | "quote", 1173 | "unicode-ident", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "sync_wrapper" 1178 | version = "0.1.2" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1181 | 1182 | [[package]] 1183 | name = "synstructure" 1184 | version = "0.13.1" 1185 | source = "registry+https://github.com/rust-lang/crates.io-index" 1186 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1187 | dependencies = [ 1188 | "proc-macro2", 1189 | "quote", 1190 | "syn", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "system-configuration" 1195 | version = "0.5.1" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1198 | dependencies = [ 1199 | "bitflags 1.3.2", 1200 | "core-foundation", 1201 | "system-configuration-sys", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "system-configuration-sys" 1206 | version = "0.5.0" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1209 | dependencies = [ 1210 | "core-foundation-sys", 1211 | "libc", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "tempfile" 1216 | version = "3.18.0" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "2c317e0a526ee6120d8dabad239c8dadca62b24b6f168914bbbc8e2fb1f0e567" 1219 | dependencies = [ 1220 | "cfg-if", 1221 | "fastrand", 1222 | "getrandom 0.3.1", 1223 | "once_cell", 1224 | "rustix", 1225 | "windows-sys 0.59.0", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "termcolor" 1230 | version = "1.4.1" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 1233 | dependencies = [ 1234 | "winapi-util", 1235 | ] 1236 | 1237 | [[package]] 1238 | name = "thiserror" 1239 | version = "1.0.69" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1242 | dependencies = [ 1243 | "thiserror-impl", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "thiserror-impl" 1248 | version = "1.0.69" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1251 | dependencies = [ 1252 | "proc-macro2", 1253 | "quote", 1254 | "syn", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "tinystr" 1259 | version = "0.7.6" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1262 | dependencies = [ 1263 | "displaydoc", 1264 | "zerovec", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "tokio" 1269 | version = "1.44.0" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" 1272 | dependencies = [ 1273 | "backtrace", 1274 | "bytes", 1275 | "libc", 1276 | "mio", 1277 | "pin-project-lite", 1278 | "socket2", 1279 | "tokio-macros", 1280 | "windows-sys 0.52.0", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "tokio-io-timeout" 1285 | version = "1.2.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" 1288 | dependencies = [ 1289 | "pin-project-lite", 1290 | "tokio", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "tokio-macros" 1295 | version = "2.5.0" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1298 | dependencies = [ 1299 | "proc-macro2", 1300 | "quote", 1301 | "syn", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "tokio-native-tls" 1306 | version = "0.3.1" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1309 | dependencies = [ 1310 | "native-tls", 1311 | "tokio", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "tokio-socks" 1316 | version = "0.5.2" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" 1319 | dependencies = [ 1320 | "either", 1321 | "futures-util", 1322 | "thiserror", 1323 | "tokio", 1324 | ] 1325 | 1326 | [[package]] 1327 | name = "tokio-util" 1328 | version = "0.7.13" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" 1331 | dependencies = [ 1332 | "bytes", 1333 | "futures-core", 1334 | "futures-sink", 1335 | "pin-project-lite", 1336 | "tokio", 1337 | ] 1338 | 1339 | [[package]] 1340 | name = "tokio_kcp" 1341 | version = "0.9.6" 1342 | source = "git+https://github.com/oyyd/tokio_kcp.git?branch=hack#de79162ad71371324c03eef6c5e1878d6613774e" 1343 | dependencies = [ 1344 | "byte_string", 1345 | "byteorder", 1346 | "bytes", 1347 | "crc32fast", 1348 | "futures", 1349 | "kcp", 1350 | "log", 1351 | "rand", 1352 | "spin", 1353 | "tokio", 1354 | ] 1355 | 1356 | [[package]] 1357 | name = "tokio_smux" 1358 | version = "0.2.0" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "0a5826746b94900340cfda9e18a29a75986992df653d5941b5e359ca3b667117" 1361 | dependencies = [ 1362 | "byteorder", 1363 | "dashmap", 1364 | "log", 1365 | "thiserror", 1366 | "tokio", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "tower-service" 1371 | version = "0.3.3" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1374 | 1375 | [[package]] 1376 | name = "tracing" 1377 | version = "0.1.41" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1380 | dependencies = [ 1381 | "pin-project-lite", 1382 | "tracing-core", 1383 | ] 1384 | 1385 | [[package]] 1386 | name = "tracing-core" 1387 | version = "0.1.33" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1390 | dependencies = [ 1391 | "once_cell", 1392 | ] 1393 | 1394 | [[package]] 1395 | name = "try-lock" 1396 | version = "0.2.5" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1399 | 1400 | [[package]] 1401 | name = "unicode-ident" 1402 | version = "1.0.18" 1403 | source = "registry+https://github.com/rust-lang/crates.io-index" 1404 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1405 | 1406 | [[package]] 1407 | name = "url" 1408 | version = "2.5.4" 1409 | source = "registry+https://github.com/rust-lang/crates.io-index" 1410 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1411 | dependencies = [ 1412 | "form_urlencoded", 1413 | "idna", 1414 | "percent-encoding", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "utf16_iter" 1419 | version = "1.0.5" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1422 | 1423 | [[package]] 1424 | name = "utf8_iter" 1425 | version = "1.0.4" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1428 | 1429 | [[package]] 1430 | name = "vcpkg" 1431 | version = "0.2.15" 1432 | source = "registry+https://github.com/rust-lang/crates.io-index" 1433 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1434 | 1435 | [[package]] 1436 | name = "want" 1437 | version = "0.3.1" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1440 | dependencies = [ 1441 | "try-lock", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "wasi" 1446 | version = "0.11.0+wasi-snapshot-preview1" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1449 | 1450 | [[package]] 1451 | name = "wasi" 1452 | version = "0.13.3+wasi-0.2.2" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 1455 | dependencies = [ 1456 | "wit-bindgen-rt", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "wasm-bindgen" 1461 | version = "0.2.100" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1464 | dependencies = [ 1465 | "cfg-if", 1466 | "once_cell", 1467 | "rustversion", 1468 | "wasm-bindgen-macro", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "wasm-bindgen-backend" 1473 | version = "0.2.100" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1476 | dependencies = [ 1477 | "bumpalo", 1478 | "log", 1479 | "proc-macro2", 1480 | "quote", 1481 | "syn", 1482 | "wasm-bindgen-shared", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "wasm-bindgen-futures" 1487 | version = "0.4.50" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1490 | dependencies = [ 1491 | "cfg-if", 1492 | "js-sys", 1493 | "once_cell", 1494 | "wasm-bindgen", 1495 | "web-sys", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "wasm-bindgen-macro" 1500 | version = "0.2.100" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1503 | dependencies = [ 1504 | "quote", 1505 | "wasm-bindgen-macro-support", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "wasm-bindgen-macro-support" 1510 | version = "0.2.100" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1513 | dependencies = [ 1514 | "proc-macro2", 1515 | "quote", 1516 | "syn", 1517 | "wasm-bindgen-backend", 1518 | "wasm-bindgen-shared", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "wasm-bindgen-shared" 1523 | version = "0.2.100" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1526 | dependencies = [ 1527 | "unicode-ident", 1528 | ] 1529 | 1530 | [[package]] 1531 | name = "web-sys" 1532 | version = "0.3.77" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1535 | dependencies = [ 1536 | "js-sys", 1537 | "wasm-bindgen", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "winapi-util" 1542 | version = "0.1.9" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 1545 | dependencies = [ 1546 | "windows-sys 0.59.0", 1547 | ] 1548 | 1549 | [[package]] 1550 | name = "windows-sys" 1551 | version = "0.48.0" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1554 | dependencies = [ 1555 | "windows-targets 0.48.5", 1556 | ] 1557 | 1558 | [[package]] 1559 | name = "windows-sys" 1560 | version = "0.52.0" 1561 | source = "registry+https://github.com/rust-lang/crates.io-index" 1562 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1563 | dependencies = [ 1564 | "windows-targets 0.52.6", 1565 | ] 1566 | 1567 | [[package]] 1568 | name = "windows-sys" 1569 | version = "0.59.0" 1570 | source = "registry+https://github.com/rust-lang/crates.io-index" 1571 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1572 | dependencies = [ 1573 | "windows-targets 0.52.6", 1574 | ] 1575 | 1576 | [[package]] 1577 | name = "windows-targets" 1578 | version = "0.48.5" 1579 | source = "registry+https://github.com/rust-lang/crates.io-index" 1580 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1581 | dependencies = [ 1582 | "windows_aarch64_gnullvm 0.48.5", 1583 | "windows_aarch64_msvc 0.48.5", 1584 | "windows_i686_gnu 0.48.5", 1585 | "windows_i686_msvc 0.48.5", 1586 | "windows_x86_64_gnu 0.48.5", 1587 | "windows_x86_64_gnullvm 0.48.5", 1588 | "windows_x86_64_msvc 0.48.5", 1589 | ] 1590 | 1591 | [[package]] 1592 | name = "windows-targets" 1593 | version = "0.52.6" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1596 | dependencies = [ 1597 | "windows_aarch64_gnullvm 0.52.6", 1598 | "windows_aarch64_msvc 0.52.6", 1599 | "windows_i686_gnu 0.52.6", 1600 | "windows_i686_gnullvm", 1601 | "windows_i686_msvc 0.52.6", 1602 | "windows_x86_64_gnu 0.52.6", 1603 | "windows_x86_64_gnullvm 0.52.6", 1604 | "windows_x86_64_msvc 0.52.6", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "windows_aarch64_gnullvm" 1609 | version = "0.48.5" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1612 | 1613 | [[package]] 1614 | name = "windows_aarch64_gnullvm" 1615 | version = "0.52.6" 1616 | source = "registry+https://github.com/rust-lang/crates.io-index" 1617 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1618 | 1619 | [[package]] 1620 | name = "windows_aarch64_msvc" 1621 | version = "0.48.5" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1624 | 1625 | [[package]] 1626 | name = "windows_aarch64_msvc" 1627 | version = "0.52.6" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1630 | 1631 | [[package]] 1632 | name = "windows_i686_gnu" 1633 | version = "0.48.5" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1636 | 1637 | [[package]] 1638 | name = "windows_i686_gnu" 1639 | version = "0.52.6" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1642 | 1643 | [[package]] 1644 | name = "windows_i686_gnullvm" 1645 | version = "0.52.6" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1648 | 1649 | [[package]] 1650 | name = "windows_i686_msvc" 1651 | version = "0.48.5" 1652 | source = "registry+https://github.com/rust-lang/crates.io-index" 1653 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1654 | 1655 | [[package]] 1656 | name = "windows_i686_msvc" 1657 | version = "0.52.6" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1660 | 1661 | [[package]] 1662 | name = "windows_x86_64_gnu" 1663 | version = "0.48.5" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1666 | 1667 | [[package]] 1668 | name = "windows_x86_64_gnu" 1669 | version = "0.52.6" 1670 | source = "registry+https://github.com/rust-lang/crates.io-index" 1671 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1672 | 1673 | [[package]] 1674 | name = "windows_x86_64_gnullvm" 1675 | version = "0.48.5" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1678 | 1679 | [[package]] 1680 | name = "windows_x86_64_gnullvm" 1681 | version = "0.52.6" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1684 | 1685 | [[package]] 1686 | name = "windows_x86_64_msvc" 1687 | version = "0.48.5" 1688 | source = "registry+https://github.com/rust-lang/crates.io-index" 1689 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1690 | 1691 | [[package]] 1692 | name = "windows_x86_64_msvc" 1693 | version = "0.52.6" 1694 | source = "registry+https://github.com/rust-lang/crates.io-index" 1695 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1696 | 1697 | [[package]] 1698 | name = "winreg" 1699 | version = "0.50.0" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 1702 | dependencies = [ 1703 | "cfg-if", 1704 | "windows-sys 0.48.0", 1705 | ] 1706 | 1707 | [[package]] 1708 | name = "wit-bindgen-rt" 1709 | version = "0.33.0" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 1712 | dependencies = [ 1713 | "bitflags 2.9.0", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "write16" 1718 | version = "1.0.0" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 1721 | 1722 | [[package]] 1723 | name = "writeable" 1724 | version = "0.5.5" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 1727 | 1728 | [[package]] 1729 | name = "yoke" 1730 | version = "0.7.5" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 1733 | dependencies = [ 1734 | "serde", 1735 | "stable_deref_trait", 1736 | "yoke-derive", 1737 | "zerofrom", 1738 | ] 1739 | 1740 | [[package]] 1741 | name = "yoke-derive" 1742 | version = "0.7.5" 1743 | source = "registry+https://github.com/rust-lang/crates.io-index" 1744 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 1745 | dependencies = [ 1746 | "proc-macro2", 1747 | "quote", 1748 | "syn", 1749 | "synstructure", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "zerocopy" 1754 | version = "0.8.23" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" 1757 | dependencies = [ 1758 | "zerocopy-derive", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "zerocopy-derive" 1763 | version = "0.8.23" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" 1766 | dependencies = [ 1767 | "proc-macro2", 1768 | "quote", 1769 | "syn", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "zerofrom" 1774 | version = "0.1.6" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 1777 | dependencies = [ 1778 | "zerofrom-derive", 1779 | ] 1780 | 1781 | [[package]] 1782 | name = "zerofrom-derive" 1783 | version = "0.1.6" 1784 | source = "registry+https://github.com/rust-lang/crates.io-index" 1785 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 1786 | dependencies = [ 1787 | "proc-macro2", 1788 | "quote", 1789 | "syn", 1790 | "synstructure", 1791 | ] 1792 | 1793 | [[package]] 1794 | name = "zerovec" 1795 | version = "0.10.4" 1796 | source = "registry+https://github.com/rust-lang/crates.io-index" 1797 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 1798 | dependencies = [ 1799 | "yoke", 1800 | "zerofrom", 1801 | "zerovec-derive", 1802 | ] 1803 | 1804 | [[package]] 1805 | name = "zerovec-derive" 1806 | version = "0.10.3" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 1809 | dependencies = [ 1810 | "proc-macro2", 1811 | "quote", 1812 | "syn", 1813 | ] 1814 | --------------------------------------------------------------------------------