├── .gitignore ├── rustfmt.toml ├── LICENSE ├── Cargo.toml ├── src ├── lib.rs └── main.rs ├── .github └── workflows │ └── release.yml ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | target/ 4 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | enum_discrim_align_threshold = 10 2 | group_imports = "StdExternalCrate" 3 | imports_granularity = "Crate" 4 | imports_layout = "HorizontalVertical" 5 | struct_field_align_threshold = 10 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Shayne Hartford 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "lighthouse" 3 | description = "Virtual reality basestation power management in Rust" 4 | version = "1.3.2" 5 | authors = ["Shayne Hartford "] 6 | edition = "2021" 7 | readme = "README.md" 8 | repository = "https://github.com/ShayBox/Lighthouse" 9 | license = "MIT" 10 | keywords = ["bluetooth", "valve", "htc", "basestation", "lighthouse"] 11 | categories = ["asynchronous", "command-line-utilities", "hardware-support"] 12 | 13 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 14 | 15 | [dependencies] 16 | btleplug = { version = "0.11", features = ["serde"] } 17 | clap = "4" 18 | clap-verbosity-flag = "3" 19 | thiserror = "2" 20 | tokio = { version = "1", features = ["macros"] } 21 | tracing = "0.1" 22 | tracing-log = "0.2" 23 | tracing-subscriber = "0.3" 24 | uuid = "1" 25 | 26 | # https://github.com/johnthagen/min-sized-rust 27 | [profile.release] 28 | strip = true # Automatically strip symbols from the binary. 29 | opt-level = "z" # Optimize for size. 30 | lto = true 31 | codegen-units = 1 32 | panic = "abort" 33 | 34 | [lints.clippy] 35 | pedantic = { level = "warn", priority = -1 } 36 | nursery = { level = "warn", priority = -1 } 37 | cargo = { level = "warn", priority = -1 } 38 | multiple_crate_versions = "allow" 39 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use std::time::Duration; 2 | 3 | use btleplug::{ 4 | api::{Central, Peripheral, WriteType}, 5 | platform::{Adapter, PeripheralId}, 6 | }; 7 | use thiserror::Error; 8 | use tokio::time; 9 | use uuid::Uuid; 10 | 11 | #[derive(Debug, Error)] 12 | pub enum Error { 13 | #[error("BtleError")] 14 | Btle(#[from] btleplug::Error), 15 | #[error("StdError")] 16 | Std(#[from] std::num::ParseIntError), 17 | #[error("UuidError")] 18 | Uuid(#[from] uuid::Error), 19 | #[error("{0}")] 20 | Message(&'static str), 21 | } 22 | 23 | /// # Write to a device 24 | /// 25 | /// # Errors 26 | /// Will return `Err` if `X` fails. 27 | pub async fn write( 28 | adapter: &Adapter, 29 | id: PeripheralId, 30 | data: &[u8], 31 | uuid: Uuid, 32 | ) -> Result<(), Error> { 33 | let peripheral = adapter.peripheral(&id).await.map_err(Error::Btle)?; 34 | 35 | if peripheral.connect().await.map_err(Error::Btle).is_err() { 36 | return Err(Error::Message("Failed to connect")); 37 | } 38 | 39 | if peripheral 40 | .discover_services() 41 | .await 42 | .map_err(Error::Btle) 43 | .is_err() 44 | { 45 | peripheral.disconnect().await.map_err(Error::Btle)?; 46 | return Err(Error::Message("Failed to scan")); 47 | } 48 | 49 | let characteristic = peripheral 50 | .characteristics() 51 | .into_iter() 52 | .find(|c| c.uuid == uuid); 53 | 54 | if let Some(characteristic) = characteristic { 55 | if peripheral 56 | .write(&characteristic, data, WriteType::WithoutResponse) 57 | .await 58 | .map_err(Error::Btle) 59 | .is_err() 60 | { 61 | return Err(Error::Message("Failed to write")); 62 | } 63 | } 64 | 65 | time::sleep(Duration::from_secs(1)).await; 66 | peripheral.disconnect().await.map_err(Error::Btle)?; 67 | 68 | Ok(()) 69 | } 70 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | release: 3 | types: [created] 4 | 5 | jobs: 6 | release: 7 | env: 8 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 9 | 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | include: 14 | - name: Linux-x86_64 15 | target: x86_64-unknown-linux-gnu 16 | runner: ubuntu-latest 17 | 18 | - name: macOS-Apple 19 | target: aarch64-apple-darwin 20 | runner: macos-latest 21 | 22 | - name: macOS-Intel 23 | target: x86_64-apple-darwin 24 | runner: macos-latest 25 | 26 | - name: Windows 27 | target: i686-pc-windows-msvc 28 | runner: windows-latest 29 | 30 | name: ${{ matrix.name }} 31 | runs-on: ${{ matrix.runner }} 32 | steps: 33 | - name: Fetch Repository 34 | uses: actions/checkout@v3 35 | 36 | - name: Update and Install Dependencies (Linux) 37 | if: ${{ matrix.runner == 'ubuntu-latest' }} 38 | run: | 39 | sudo apt update 40 | sudo apt upgrade -y 41 | sudo apt install -y libdbus-1-dev 42 | 43 | - name: Update Rust Toolchain 44 | run: rustup update stable 45 | 46 | - name: Add Rust Target 47 | run: rustup target add ${{ matrix.target }} 48 | 49 | - name: Build Release Binary 50 | run: cargo build --release --target ${{ matrix.target }} 51 | 52 | - name: Create Zip Archive (Windows) 53 | if: ${{ matrix.runner == 'windows-latest' }} 54 | run: bash -c '7z a ${{ matrix.name }}.zip ./target/${{ matrix.target }}/release/lighthouse.exe' 55 | 56 | - name: Create Zip Archive (Other) 57 | if: ${{ matrix.runner != 'windows-latest' }} 58 | run: zip -j ${{ matrix.name }}.zip target/${{ matrix.target }}/release/lighthouse 59 | 60 | - name: Upload Zip Archive 61 | run: gh release upload ${{ github.ref_name }} ${{ matrix.name }}.zip --clobber 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | Discord 4 | 5 | 6 | Downloads 7 | 8 |
9 | 10 | # Lighthouse 11 | Virtual reality basestation power management in Rust 12 | 13 | ## Usage 14 | 15 | ``` 16 | Usage: lighthouse [OPTIONS] --state 17 | 18 | Options: 19 | -s, --state V1: [OFF|ON] | V2: [OFF|ON|STANDBY] 20 | -b, --bsid V1: Basestation BSID (Required) | V2: Bluetooth Device Identifier (Optional) 21 | -v, --verbose... Increase logging verbosity 22 | -q, --quiet... Decrease logging verbosity 23 | -t, --timeout Request timeout in seconds [default: 10] 24 | -h, --help Print help 25 | ``` 26 | V1 Basestations require an 8 character BSID found on the device to work. 27 | 28 | V2 Basestations do not require BSID. But you can specify their MAC address as BSID to manage a specific device. 29 | 30 | ### Examples 31 | 32 | **Turning a V1 lighthouse on:** 33 | 34 | Find the BSID at the back of the device. 35 | 36 | ```bash 37 | $ lighthouse --state on --bsid aabbccdd 38 | ``` 39 | **Turning on any V2 lighthouses within range:** 40 | 41 | ```bash 42 | $ lighthouse --state on 43 | ``` 44 | 45 | **Turning on a specific V2 lighthouse:** 46 | 47 | Run once with verbose parameters to find the MAC address for each lighthouse: 48 | ```bash 49 | $ lighthouse -vv --state off 50 | ``` 51 | 52 | This will show the device path or MAC address within square brackets, looking something like this: 53 | ``` 54 | 2025-02-28T22:14:58.528048Z INFO lighthouse: Found 'LHB-6DC32F38' [hci0/dev_E2_5A_B0_E4_97_AD] 55 | 2025-02-28T22:15:33.543205Z INFO lighthouse: LHB-6DC32F38 [hci0/dev_E2_5A_B0_E4_97_AD]: OFF 56 | ``` 57 | 58 | Use the ID shown in the square brackets in the previous command as the bsid to manage a specific lighthouse: 59 | ```bash 60 | $ lighthouse --state on --bsid "hci0/dev_E2_5A_B0_E4_97_AD" 61 | # or 62 | $ lighthouse --state on --bsid "E2:5A:B0:E4:97:AD" 63 | ``` 64 | 65 | ## macOS 66 | Enable the Bluetooth permission for your terminal. You can do the latter by going to System Preferences → Security & Privacy → Privacy → Bluetooth, clicking the '+' button, and selecting 'Terminal' (or iTerm or whichever terminal application you use). 67 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::time::Duration; 2 | 3 | use btleplug::{ 4 | api::{Central, Manager as _, Peripheral, ScanFilter}, 5 | platform::Manager, 6 | }; 7 | use clap::Parser; 8 | use clap_verbosity_flag::Verbosity; 9 | use lighthouse::Error; 10 | use tokio::time; 11 | use tracing::{info}; 12 | use tracing_log::AsTrace; 13 | use uuid::Uuid; 14 | 15 | const V1_UUID: &str = "0000cb01-0000-1000-8000-00805f9b34fb"; 16 | const V2_UUID: &str = "00001525-1212-efde-1523-785feabcd124"; 17 | 18 | #[derive(Debug, Parser)] 19 | struct Args { 20 | /// V1: [OFF|ON] | V2: [OFF|ON|STANDBY] 21 | #[arg(short, long)] 22 | state: String, 23 | 24 | /// V1: Basestation BSID (Required) | V2: Bluetooth Device Identifier (Optional) 25 | #[arg(short, long)] 26 | bsid: Option, 27 | 28 | #[clap(flatten)] 29 | verbose: Verbosity, 30 | 31 | /// Request timeout in seconds 32 | #[arg(short, long, default_value_t = 10)] 33 | timeout: u64 34 | } 35 | 36 | #[tokio::main(flavor = "current_thread")] 37 | async fn main() -> Result<(), Error> { 38 | let args = Args::parse(); 39 | 40 | tracing_subscriber::fmt() 41 | .with_max_level(args.verbose.log_level_filter().as_trace()) 42 | .init(); 43 | 44 | let manager = Manager::new().await.map_err(Error::Btle)?; 45 | let adapters = manager.adapters().await.map_err(Error::Btle)?; 46 | if adapters.is_empty() { 47 | return Err(Error::Message("No Bluetooth adapters found")); 48 | } 49 | 50 | for adapter in &adapters { 51 | let info = adapter.adapter_info().await.map_err(Error::Btle)?; 52 | info!("Starting scan on {info}..."); 53 | 54 | adapter 55 | .start_scan(ScanFilter::default()) 56 | .await 57 | .map_err(Error::Btle) 58 | .expect("Can't scan BLE adapter for connected devices..."); 59 | 60 | time::sleep(Duration::from_secs(args.timeout)).await; 61 | 62 | let peripherals = adapter.peripherals().await.map_err(Error::Btle)?; 63 | if peripherals.is_empty() { 64 | return Err(Error::Message( 65 | "->>> BLE peripheral devices were not found. Exiting...", 66 | )); 67 | } 68 | 69 | for peripheral in &peripherals { 70 | let Some(properties) = peripheral.properties().await.map_err(Error::Btle)? else { 71 | continue; 72 | }; 73 | 74 | let Some(name) = properties.local_name else { 75 | continue; 76 | }; 77 | 78 | let state = args.state.to_uppercase(); 79 | 80 | info!("Found '{}' [{}]", name, peripheral.id()); 81 | 82 | if name.starts_with("LHB-") // v2 83 | { 84 | if let Some(bsid) = &args.bsid 85 | { 86 | // On Linux systems the peripheral ID will be something like "hci0/dev_A1_B2_C3_D4_E5_F6" 87 | // instead of "A1:B2:C3:D4:E5:F6". Normalize the strings to allow user input in either format. 88 | let normalized_peripheral_id = peripheral.id().to_string().to_lowercase().replace("_", ":"); 89 | let normalized_input = bsid.to_lowercase().replace("_", ":"); 90 | if !normalized_peripheral_id.contains(normalized_input.as_str()) { 91 | continue; 92 | } 93 | } 94 | 95 | let cmd = match state.as_str() { 96 | "OFF" => vec![0x00], 97 | "ON" => vec![0x01], 98 | "STANDBY" => vec![0x02], 99 | _ => { 100 | return Err(Error::Message( 101 | "V2: Unknown State {state}, Available: [OFF|ON|STANDBY]", 102 | )) 103 | } 104 | }; 105 | 106 | let uuid = Uuid::parse_str(V2_UUID).map_err(Error::Uuid)?; 107 | 108 | lighthouse::write(adapter, peripheral.id(), &cmd, uuid).await?; 109 | } 110 | else if let Some(bsid) = &args.bsid { // v1 111 | if !name.starts_with("HTC BS") 112 | || name[(name.len() - 4)..] != bsid[(bsid.len() - 4)..] 113 | { 114 | continue; 115 | } 116 | 117 | let aa = u8::from_str_radix(&bsid[0..2], 16).map_err(Error::Std)?; 118 | let bb = u8::from_str_radix(&bsid[2..4], 16).map_err(Error::Std)?; 119 | let cc = u8::from_str_radix(&bsid[4..6], 16).map_err(Error::Std)?; 120 | let dd = u8::from_str_radix(&bsid[6..8], 16).map_err(Error::Std)?; 121 | 122 | let cmd = match state.as_str() { 123 | "OFF" | "STANDBY" => vec![ 124 | 0x12, 0x02, 0x00, 0x01, dd, cc, bb, aa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 125 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 | ], 127 | "ON" => vec![ 128 | 0x12, 0x00, 0x00, 0x00, dd, cc, bb, aa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 130 | ], 131 | _ => { 132 | return Err(Error::Message( 133 | "V1: Unknown State {state}, Available: [OFF|ON]", 134 | )) 135 | } 136 | }; 137 | 138 | let uuid = Uuid::parse_str(V1_UUID).map_err(Error::Uuid)?; 139 | 140 | lighthouse::write(adapter, peripheral.id(), &cmd, uuid).await?; 141 | } 142 | else { continue; } // not supported 143 | info!("{} [{}]: {}", name, peripheral.id(), state); 144 | } 145 | } 146 | Ok(()) 147 | } 148 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.25.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "anstream" 22 | version = "0.6.21" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 25 | dependencies = [ 26 | "anstyle", 27 | "anstyle-parse", 28 | "anstyle-query", 29 | "anstyle-wincon", 30 | "colorchoice", 31 | "is_terminal_polyfill", 32 | "utf8parse", 33 | ] 34 | 35 | [[package]] 36 | name = "anstyle" 37 | version = "1.0.13" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 40 | 41 | [[package]] 42 | name = "anstyle-parse" 43 | version = "0.2.7" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 46 | dependencies = [ 47 | "utf8parse", 48 | ] 49 | 50 | [[package]] 51 | name = "anstyle-query" 52 | version = "1.1.4" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 55 | dependencies = [ 56 | "windows-sys 0.60.2", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-wincon" 61 | version = "3.0.10" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 64 | dependencies = [ 65 | "anstyle", 66 | "once_cell_polyfill", 67 | "windows-sys 0.60.2", 68 | ] 69 | 70 | [[package]] 71 | name = "async-trait" 72 | version = "0.1.89" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 75 | dependencies = [ 76 | "proc-macro2", 77 | "quote", 78 | "syn", 79 | ] 80 | 81 | [[package]] 82 | name = "autocfg" 83 | version = "1.5.0" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 86 | 87 | [[package]] 88 | name = "backtrace" 89 | version = "0.3.76" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 92 | dependencies = [ 93 | "addr2line", 94 | "cfg-if", 95 | "libc", 96 | "miniz_oxide", 97 | "object", 98 | "rustc-demangle", 99 | "windows-link 0.2.0", 100 | ] 101 | 102 | [[package]] 103 | name = "bitflags" 104 | version = "2.9.4" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 107 | 108 | [[package]] 109 | name = "block2" 110 | version = "0.5.1" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 113 | dependencies = [ 114 | "objc2", 115 | ] 116 | 117 | [[package]] 118 | name = "bluez-async" 119 | version = "0.8.2" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "84ae4213cc2a8dc663acecac67bbdad05142be4d8ef372b6903abf878b0c690a" 122 | dependencies = [ 123 | "bitflags", 124 | "bluez-generated", 125 | "dbus", 126 | "dbus-tokio", 127 | "futures", 128 | "itertools", 129 | "log", 130 | "serde", 131 | "serde-xml-rs", 132 | "thiserror 2.0.17", 133 | "tokio", 134 | "uuid", 135 | ] 136 | 137 | [[package]] 138 | name = "bluez-generated" 139 | version = "0.4.0" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "9676783265eadd6f11829982792c6f303f3854d014edfba384685dcf237dd062" 142 | dependencies = [ 143 | "dbus", 144 | ] 145 | 146 | [[package]] 147 | name = "btleplug" 148 | version = "0.11.8" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "c9a11621cb2c8c024e444734292482b1ad86fb50ded066cf46252e46643c8748" 151 | dependencies = [ 152 | "async-trait", 153 | "bitflags", 154 | "bluez-async", 155 | "dashmap 6.1.0", 156 | "dbus", 157 | "futures", 158 | "jni", 159 | "jni-utils", 160 | "log", 161 | "objc2", 162 | "objc2-core-bluetooth", 163 | "objc2-foundation", 164 | "once_cell", 165 | "serde", 166 | "serde_bytes", 167 | "static_assertions", 168 | "thiserror 2.0.17", 169 | "tokio", 170 | "tokio-stream", 171 | "uuid", 172 | "windows", 173 | "windows-future", 174 | ] 175 | 176 | [[package]] 177 | name = "bumpalo" 178 | version = "3.19.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 181 | 182 | [[package]] 183 | name = "bytes" 184 | version = "1.10.1" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 187 | 188 | [[package]] 189 | name = "cesu8" 190 | version = "1.1.0" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 193 | 194 | [[package]] 195 | name = "cfg-if" 196 | version = "1.0.3" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 199 | 200 | [[package]] 201 | name = "clap" 202 | version = "4.5.48" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" 205 | dependencies = [ 206 | "clap_builder", 207 | "clap_derive", 208 | ] 209 | 210 | [[package]] 211 | name = "clap-verbosity-flag" 212 | version = "3.0.4" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "9d92b1fab272fe943881b77cc6e920d6543e5b1bfadbd5ed81c7c5a755742394" 215 | dependencies = [ 216 | "clap", 217 | "log", 218 | ] 219 | 220 | [[package]] 221 | name = "clap_builder" 222 | version = "4.5.48" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" 225 | dependencies = [ 226 | "anstream", 227 | "anstyle", 228 | "clap_lex", 229 | "strsim", 230 | ] 231 | 232 | [[package]] 233 | name = "clap_derive" 234 | version = "4.5.47" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" 237 | dependencies = [ 238 | "heck", 239 | "proc-macro2", 240 | "quote", 241 | "syn", 242 | ] 243 | 244 | [[package]] 245 | name = "clap_lex" 246 | version = "0.7.5" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" 249 | 250 | [[package]] 251 | name = "colorchoice" 252 | version = "1.0.4" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 255 | 256 | [[package]] 257 | name = "combine" 258 | version = "4.6.7" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 261 | dependencies = [ 262 | "bytes", 263 | "memchr", 264 | ] 265 | 266 | [[package]] 267 | name = "crossbeam-utils" 268 | version = "0.8.21" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 271 | 272 | [[package]] 273 | name = "dashmap" 274 | version = "5.5.3" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 277 | dependencies = [ 278 | "cfg-if", 279 | "hashbrown", 280 | "lock_api", 281 | "once_cell", 282 | "parking_lot_core", 283 | ] 284 | 285 | [[package]] 286 | name = "dashmap" 287 | version = "6.1.0" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 290 | dependencies = [ 291 | "cfg-if", 292 | "crossbeam-utils", 293 | "hashbrown", 294 | "lock_api", 295 | "once_cell", 296 | "parking_lot_core", 297 | ] 298 | 299 | [[package]] 300 | name = "dbus" 301 | version = "0.9.9" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" 304 | dependencies = [ 305 | "futures-channel", 306 | "futures-util", 307 | "libc", 308 | "libdbus-sys", 309 | "windows-sys 0.59.0", 310 | ] 311 | 312 | [[package]] 313 | name = "dbus-tokio" 314 | version = "0.7.6" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "007688d459bc677131c063a3a77fb899526e17b7980f390b69644bdbc41fad13" 317 | dependencies = [ 318 | "dbus", 319 | "libc", 320 | "tokio", 321 | ] 322 | 323 | [[package]] 324 | name = "either" 325 | version = "1.15.0" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 328 | 329 | [[package]] 330 | name = "futures" 331 | version = "0.3.31" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 334 | dependencies = [ 335 | "futures-channel", 336 | "futures-core", 337 | "futures-executor", 338 | "futures-io", 339 | "futures-sink", 340 | "futures-task", 341 | "futures-util", 342 | ] 343 | 344 | [[package]] 345 | name = "futures-channel" 346 | version = "0.3.31" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 349 | dependencies = [ 350 | "futures-core", 351 | "futures-sink", 352 | ] 353 | 354 | [[package]] 355 | name = "futures-core" 356 | version = "0.3.31" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 359 | 360 | [[package]] 361 | name = "futures-executor" 362 | version = "0.3.31" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 365 | dependencies = [ 366 | "futures-core", 367 | "futures-task", 368 | "futures-util", 369 | ] 370 | 371 | [[package]] 372 | name = "futures-io" 373 | version = "0.3.31" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 376 | 377 | [[package]] 378 | name = "futures-macro" 379 | version = "0.3.31" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 382 | dependencies = [ 383 | "proc-macro2", 384 | "quote", 385 | "syn", 386 | ] 387 | 388 | [[package]] 389 | name = "futures-sink" 390 | version = "0.3.31" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 393 | 394 | [[package]] 395 | name = "futures-task" 396 | version = "0.3.31" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 399 | 400 | [[package]] 401 | name = "futures-util" 402 | version = "0.3.31" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 405 | dependencies = [ 406 | "futures-channel", 407 | "futures-core", 408 | "futures-io", 409 | "futures-macro", 410 | "futures-sink", 411 | "futures-task", 412 | "memchr", 413 | "pin-project-lite", 414 | "pin-utils", 415 | "slab", 416 | ] 417 | 418 | [[package]] 419 | name = "gimli" 420 | version = "0.32.3" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 423 | 424 | [[package]] 425 | name = "hashbrown" 426 | version = "0.14.5" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 429 | 430 | [[package]] 431 | name = "heck" 432 | version = "0.5.0" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 435 | 436 | [[package]] 437 | name = "io-uring" 438 | version = "0.7.10" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 441 | dependencies = [ 442 | "bitflags", 443 | "cfg-if", 444 | "libc", 445 | ] 446 | 447 | [[package]] 448 | name = "is_terminal_polyfill" 449 | version = "1.70.1" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 452 | 453 | [[package]] 454 | name = "itertools" 455 | version = "0.14.0" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 458 | dependencies = [ 459 | "either", 460 | ] 461 | 462 | [[package]] 463 | name = "jni" 464 | version = "0.19.0" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" 467 | dependencies = [ 468 | "cesu8", 469 | "combine", 470 | "jni-sys", 471 | "log", 472 | "thiserror 1.0.69", 473 | "walkdir", 474 | ] 475 | 476 | [[package]] 477 | name = "jni-sys" 478 | version = "0.3.0" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 481 | 482 | [[package]] 483 | name = "jni-utils" 484 | version = "0.1.1" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "259e9f2c3ead61de911f147000660511f07ab00adeed1d84f5ac4d0386e7a6c4" 487 | dependencies = [ 488 | "dashmap 5.5.3", 489 | "futures", 490 | "jni", 491 | "log", 492 | "once_cell", 493 | "static_assertions", 494 | "uuid", 495 | ] 496 | 497 | [[package]] 498 | name = "js-sys" 499 | version = "0.3.81" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 502 | dependencies = [ 503 | "once_cell", 504 | "wasm-bindgen", 505 | ] 506 | 507 | [[package]] 508 | name = "lazy_static" 509 | version = "1.5.0" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 512 | 513 | [[package]] 514 | name = "libc" 515 | version = "0.2.176" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" 518 | 519 | [[package]] 520 | name = "libdbus-sys" 521 | version = "0.2.6" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" 524 | dependencies = [ 525 | "pkg-config", 526 | ] 527 | 528 | [[package]] 529 | name = "lighthouse" 530 | version = "1.3.2" 531 | dependencies = [ 532 | "btleplug", 533 | "clap", 534 | "clap-verbosity-flag", 535 | "thiserror 2.0.17", 536 | "tokio", 537 | "tracing", 538 | "tracing-log", 539 | "tracing-subscriber", 540 | "uuid", 541 | ] 542 | 543 | [[package]] 544 | name = "lock_api" 545 | version = "0.4.13" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 548 | dependencies = [ 549 | "autocfg", 550 | "scopeguard", 551 | ] 552 | 553 | [[package]] 554 | name = "log" 555 | version = "0.4.28" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 558 | 559 | [[package]] 560 | name = "memchr" 561 | version = "2.7.6" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 564 | 565 | [[package]] 566 | name = "miniz_oxide" 567 | version = "0.8.9" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 570 | dependencies = [ 571 | "adler2", 572 | ] 573 | 574 | [[package]] 575 | name = "mio" 576 | version = "1.0.4" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 579 | dependencies = [ 580 | "libc", 581 | "wasi", 582 | "windows-sys 0.59.0", 583 | ] 584 | 585 | [[package]] 586 | name = "nu-ansi-term" 587 | version = "0.50.1" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 590 | dependencies = [ 591 | "windows-sys 0.52.0", 592 | ] 593 | 594 | [[package]] 595 | name = "objc-sys" 596 | version = "0.3.5" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 599 | 600 | [[package]] 601 | name = "objc2" 602 | version = "0.5.2" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 605 | dependencies = [ 606 | "objc-sys", 607 | "objc2-encode", 608 | ] 609 | 610 | [[package]] 611 | name = "objc2-core-bluetooth" 612 | version = "0.2.2" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "5a644b62ffb826a5277f536cf0f701493de420b13d40e700c452c36567771111" 615 | dependencies = [ 616 | "bitflags", 617 | "objc2", 618 | "objc2-foundation", 619 | ] 620 | 621 | [[package]] 622 | name = "objc2-encode" 623 | version = "4.1.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 626 | 627 | [[package]] 628 | name = "objc2-foundation" 629 | version = "0.2.2" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 632 | dependencies = [ 633 | "bitflags", 634 | "block2", 635 | "libc", 636 | "objc2", 637 | ] 638 | 639 | [[package]] 640 | name = "object" 641 | version = "0.37.3" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 644 | dependencies = [ 645 | "memchr", 646 | ] 647 | 648 | [[package]] 649 | name = "once_cell" 650 | version = "1.21.3" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 653 | 654 | [[package]] 655 | name = "once_cell_polyfill" 656 | version = "1.70.1" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 659 | 660 | [[package]] 661 | name = "parking_lot_core" 662 | version = "0.9.11" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 665 | dependencies = [ 666 | "cfg-if", 667 | "libc", 668 | "redox_syscall", 669 | "smallvec", 670 | "windows-targets 0.52.6", 671 | ] 672 | 673 | [[package]] 674 | name = "pin-project-lite" 675 | version = "0.2.16" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 678 | 679 | [[package]] 680 | name = "pin-utils" 681 | version = "0.1.0" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 684 | 685 | [[package]] 686 | name = "pkg-config" 687 | version = "0.3.32" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 690 | 691 | [[package]] 692 | name = "proc-macro2" 693 | version = "1.0.101" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 696 | dependencies = [ 697 | "unicode-ident", 698 | ] 699 | 700 | [[package]] 701 | name = "quote" 702 | version = "1.0.41" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" 705 | dependencies = [ 706 | "proc-macro2", 707 | ] 708 | 709 | [[package]] 710 | name = "redox_syscall" 711 | version = "0.5.17" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 714 | dependencies = [ 715 | "bitflags", 716 | ] 717 | 718 | [[package]] 719 | name = "rustc-demangle" 720 | version = "0.1.26" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 723 | 724 | [[package]] 725 | name = "rustversion" 726 | version = "1.0.22" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 729 | 730 | [[package]] 731 | name = "same-file" 732 | version = "1.0.6" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 735 | dependencies = [ 736 | "winapi-util", 737 | ] 738 | 739 | [[package]] 740 | name = "scopeguard" 741 | version = "1.2.0" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 744 | 745 | [[package]] 746 | name = "serde" 747 | version = "1.0.228" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 750 | dependencies = [ 751 | "serde_core", 752 | "serde_derive", 753 | ] 754 | 755 | [[package]] 756 | name = "serde-xml-rs" 757 | version = "0.8.1" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "53630160a98edebde0123eb4dfd0fce6adff091b2305db3154a9e920206eb510" 760 | dependencies = [ 761 | "log", 762 | "serde", 763 | "thiserror 1.0.69", 764 | "xml-rs", 765 | ] 766 | 767 | [[package]] 768 | name = "serde_bytes" 769 | version = "0.11.19" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 772 | dependencies = [ 773 | "serde", 774 | "serde_core", 775 | ] 776 | 777 | [[package]] 778 | name = "serde_core" 779 | version = "1.0.228" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 782 | dependencies = [ 783 | "serde_derive", 784 | ] 785 | 786 | [[package]] 787 | name = "serde_derive" 788 | version = "1.0.228" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 791 | dependencies = [ 792 | "proc-macro2", 793 | "quote", 794 | "syn", 795 | ] 796 | 797 | [[package]] 798 | name = "sharded-slab" 799 | version = "0.1.7" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 802 | dependencies = [ 803 | "lazy_static", 804 | ] 805 | 806 | [[package]] 807 | name = "slab" 808 | version = "0.4.11" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 811 | 812 | [[package]] 813 | name = "smallvec" 814 | version = "1.15.1" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 817 | 818 | [[package]] 819 | name = "socket2" 820 | version = "0.6.0" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 823 | dependencies = [ 824 | "libc", 825 | "windows-sys 0.59.0", 826 | ] 827 | 828 | [[package]] 829 | name = "static_assertions" 830 | version = "1.1.0" 831 | source = "registry+https://github.com/rust-lang/crates.io-index" 832 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 833 | 834 | [[package]] 835 | name = "strsim" 836 | version = "0.11.1" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 839 | 840 | [[package]] 841 | name = "syn" 842 | version = "2.0.106" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 845 | dependencies = [ 846 | "proc-macro2", 847 | "quote", 848 | "unicode-ident", 849 | ] 850 | 851 | [[package]] 852 | name = "thiserror" 853 | version = "1.0.69" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 856 | dependencies = [ 857 | "thiserror-impl 1.0.69", 858 | ] 859 | 860 | [[package]] 861 | name = "thiserror" 862 | version = "2.0.17" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 865 | dependencies = [ 866 | "thiserror-impl 2.0.17", 867 | ] 868 | 869 | [[package]] 870 | name = "thiserror-impl" 871 | version = "1.0.69" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 874 | dependencies = [ 875 | "proc-macro2", 876 | "quote", 877 | "syn", 878 | ] 879 | 880 | [[package]] 881 | name = "thiserror-impl" 882 | version = "2.0.17" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 885 | dependencies = [ 886 | "proc-macro2", 887 | "quote", 888 | "syn", 889 | ] 890 | 891 | [[package]] 892 | name = "thread_local" 893 | version = "1.1.9" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 896 | dependencies = [ 897 | "cfg-if", 898 | ] 899 | 900 | [[package]] 901 | name = "tokio" 902 | version = "1.47.1" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 905 | dependencies = [ 906 | "backtrace", 907 | "io-uring", 908 | "libc", 909 | "mio", 910 | "pin-project-lite", 911 | "slab", 912 | "socket2", 913 | "tokio-macros", 914 | "windows-sys 0.59.0", 915 | ] 916 | 917 | [[package]] 918 | name = "tokio-macros" 919 | version = "2.5.0" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 922 | dependencies = [ 923 | "proc-macro2", 924 | "quote", 925 | "syn", 926 | ] 927 | 928 | [[package]] 929 | name = "tokio-stream" 930 | version = "0.1.17" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 933 | dependencies = [ 934 | "futures-core", 935 | "pin-project-lite", 936 | "tokio", 937 | "tokio-util", 938 | ] 939 | 940 | [[package]] 941 | name = "tokio-util" 942 | version = "0.7.16" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 945 | dependencies = [ 946 | "bytes", 947 | "futures-core", 948 | "futures-sink", 949 | "pin-project-lite", 950 | "tokio", 951 | ] 952 | 953 | [[package]] 954 | name = "tracing" 955 | version = "0.1.41" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 958 | dependencies = [ 959 | "pin-project-lite", 960 | "tracing-attributes", 961 | "tracing-core", 962 | ] 963 | 964 | [[package]] 965 | name = "tracing-attributes" 966 | version = "0.1.30" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 969 | dependencies = [ 970 | "proc-macro2", 971 | "quote", 972 | "syn", 973 | ] 974 | 975 | [[package]] 976 | name = "tracing-core" 977 | version = "0.1.34" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 980 | dependencies = [ 981 | "once_cell", 982 | "valuable", 983 | ] 984 | 985 | [[package]] 986 | name = "tracing-log" 987 | version = "0.2.0" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 990 | dependencies = [ 991 | "log", 992 | "once_cell", 993 | "tracing-core", 994 | ] 995 | 996 | [[package]] 997 | name = "tracing-subscriber" 998 | version = "0.3.20" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" 1001 | dependencies = [ 1002 | "nu-ansi-term", 1003 | "sharded-slab", 1004 | "smallvec", 1005 | "thread_local", 1006 | "tracing-core", 1007 | "tracing-log", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "unicode-ident" 1012 | version = "1.0.19" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 1015 | 1016 | [[package]] 1017 | name = "utf8parse" 1018 | version = "0.2.2" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1021 | 1022 | [[package]] 1023 | name = "uuid" 1024 | version = "1.18.1" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 1027 | dependencies = [ 1028 | "js-sys", 1029 | "serde", 1030 | "wasm-bindgen", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "valuable" 1035 | version = "0.1.1" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1038 | 1039 | [[package]] 1040 | name = "walkdir" 1041 | version = "2.5.0" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1044 | dependencies = [ 1045 | "same-file", 1046 | "winapi-util", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "wasi" 1051 | version = "0.11.1+wasi-snapshot-preview1" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1054 | 1055 | [[package]] 1056 | name = "wasm-bindgen" 1057 | version = "0.2.104" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 1060 | dependencies = [ 1061 | "cfg-if", 1062 | "once_cell", 1063 | "rustversion", 1064 | "wasm-bindgen-macro", 1065 | "wasm-bindgen-shared", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "wasm-bindgen-backend" 1070 | version = "0.2.104" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 1073 | dependencies = [ 1074 | "bumpalo", 1075 | "log", 1076 | "proc-macro2", 1077 | "quote", 1078 | "syn", 1079 | "wasm-bindgen-shared", 1080 | ] 1081 | 1082 | [[package]] 1083 | name = "wasm-bindgen-macro" 1084 | version = "0.2.104" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 1087 | dependencies = [ 1088 | "quote", 1089 | "wasm-bindgen-macro-support", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "wasm-bindgen-macro-support" 1094 | version = "0.2.104" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 1097 | dependencies = [ 1098 | "proc-macro2", 1099 | "quote", 1100 | "syn", 1101 | "wasm-bindgen-backend", 1102 | "wasm-bindgen-shared", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "wasm-bindgen-shared" 1107 | version = "0.2.104" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 1110 | dependencies = [ 1111 | "unicode-ident", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "winapi-util" 1116 | version = "0.1.11" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 1119 | dependencies = [ 1120 | "windows-sys 0.61.1", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "windows" 1125 | version = "0.61.3" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 1128 | dependencies = [ 1129 | "windows-collections", 1130 | "windows-core", 1131 | "windows-future", 1132 | "windows-link 0.1.3", 1133 | "windows-numerics", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "windows-collections" 1138 | version = "0.2.0" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 1141 | dependencies = [ 1142 | "windows-core", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "windows-core" 1147 | version = "0.61.2" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" 1150 | dependencies = [ 1151 | "windows-implement", 1152 | "windows-interface", 1153 | "windows-link 0.1.3", 1154 | "windows-result", 1155 | "windows-strings", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "windows-future" 1160 | version = "0.2.1" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 1163 | dependencies = [ 1164 | "windows-core", 1165 | "windows-link 0.1.3", 1166 | "windows-threading", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "windows-implement" 1171 | version = "0.60.1" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" 1174 | dependencies = [ 1175 | "proc-macro2", 1176 | "quote", 1177 | "syn", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "windows-interface" 1182 | version = "0.59.2" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" 1185 | dependencies = [ 1186 | "proc-macro2", 1187 | "quote", 1188 | "syn", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "windows-link" 1193 | version = "0.1.3" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 1196 | 1197 | [[package]] 1198 | name = "windows-link" 1199 | version = "0.2.0" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 1202 | 1203 | [[package]] 1204 | name = "windows-numerics" 1205 | version = "0.2.0" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 1208 | dependencies = [ 1209 | "windows-core", 1210 | "windows-link 0.1.3", 1211 | ] 1212 | 1213 | [[package]] 1214 | name = "windows-result" 1215 | version = "0.3.4" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 1218 | dependencies = [ 1219 | "windows-link 0.1.3", 1220 | ] 1221 | 1222 | [[package]] 1223 | name = "windows-strings" 1224 | version = "0.4.2" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 1227 | dependencies = [ 1228 | "windows-link 0.1.3", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "windows-sys" 1233 | version = "0.52.0" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1236 | dependencies = [ 1237 | "windows-targets 0.52.6", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "windows-sys" 1242 | version = "0.59.0" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1245 | dependencies = [ 1246 | "windows-targets 0.52.6", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "windows-sys" 1251 | version = "0.60.2" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1254 | dependencies = [ 1255 | "windows-targets 0.53.4", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "windows-sys" 1260 | version = "0.61.1" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" 1263 | dependencies = [ 1264 | "windows-link 0.2.0", 1265 | ] 1266 | 1267 | [[package]] 1268 | name = "windows-targets" 1269 | version = "0.52.6" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1272 | dependencies = [ 1273 | "windows_aarch64_gnullvm 0.52.6", 1274 | "windows_aarch64_msvc 0.52.6", 1275 | "windows_i686_gnu 0.52.6", 1276 | "windows_i686_gnullvm 0.52.6", 1277 | "windows_i686_msvc 0.52.6", 1278 | "windows_x86_64_gnu 0.52.6", 1279 | "windows_x86_64_gnullvm 0.52.6", 1280 | "windows_x86_64_msvc 0.52.6", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "windows-targets" 1285 | version = "0.53.4" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" 1288 | dependencies = [ 1289 | "windows-link 0.2.0", 1290 | "windows_aarch64_gnullvm 0.53.0", 1291 | "windows_aarch64_msvc 0.53.0", 1292 | "windows_i686_gnu 0.53.0", 1293 | "windows_i686_gnullvm 0.53.0", 1294 | "windows_i686_msvc 0.53.0", 1295 | "windows_x86_64_gnu 0.53.0", 1296 | "windows_x86_64_gnullvm 0.53.0", 1297 | "windows_x86_64_msvc 0.53.0", 1298 | ] 1299 | 1300 | [[package]] 1301 | name = "windows-threading" 1302 | version = "0.1.0" 1303 | source = "registry+https://github.com/rust-lang/crates.io-index" 1304 | checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 1305 | dependencies = [ 1306 | "windows-link 0.1.3", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "windows_aarch64_gnullvm" 1311 | version = "0.52.6" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1314 | 1315 | [[package]] 1316 | name = "windows_aarch64_gnullvm" 1317 | version = "0.53.0" 1318 | source = "registry+https://github.com/rust-lang/crates.io-index" 1319 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 1320 | 1321 | [[package]] 1322 | name = "windows_aarch64_msvc" 1323 | version = "0.52.6" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1326 | 1327 | [[package]] 1328 | name = "windows_aarch64_msvc" 1329 | version = "0.53.0" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 1332 | 1333 | [[package]] 1334 | name = "windows_i686_gnu" 1335 | version = "0.52.6" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1338 | 1339 | [[package]] 1340 | name = "windows_i686_gnu" 1341 | version = "0.53.0" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 1344 | 1345 | [[package]] 1346 | name = "windows_i686_gnullvm" 1347 | version = "0.52.6" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1350 | 1351 | [[package]] 1352 | name = "windows_i686_gnullvm" 1353 | version = "0.53.0" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 1356 | 1357 | [[package]] 1358 | name = "windows_i686_msvc" 1359 | version = "0.52.6" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1362 | 1363 | [[package]] 1364 | name = "windows_i686_msvc" 1365 | version = "0.53.0" 1366 | source = "registry+https://github.com/rust-lang/crates.io-index" 1367 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 1368 | 1369 | [[package]] 1370 | name = "windows_x86_64_gnu" 1371 | version = "0.52.6" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1374 | 1375 | [[package]] 1376 | name = "windows_x86_64_gnu" 1377 | version = "0.53.0" 1378 | source = "registry+https://github.com/rust-lang/crates.io-index" 1379 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 1380 | 1381 | [[package]] 1382 | name = "windows_x86_64_gnullvm" 1383 | version = "0.52.6" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1386 | 1387 | [[package]] 1388 | name = "windows_x86_64_gnullvm" 1389 | version = "0.53.0" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 1392 | 1393 | [[package]] 1394 | name = "windows_x86_64_msvc" 1395 | version = "0.52.6" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1398 | 1399 | [[package]] 1400 | name = "windows_x86_64_msvc" 1401 | version = "0.53.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 1404 | 1405 | [[package]] 1406 | name = "xml-rs" 1407 | version = "0.8.27" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" 1410 | --------------------------------------------------------------------------------