├── .gitignore ├── SetTimerResolution.exe ├── appsettings.json ├── .idea ├── vcs.xml ├── .gitignore ├── modules.xml └── untitled.iml ├── .gitattributes ├── .vscode └── launch.json ├── Cargo.toml ├── README.md ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | results.txt 3 | -------------------------------------------------------------------------------- /SetTimerResolution.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SwiftyPop/TimerResBenchmark/HEAD/SetTimerResolution.exe -------------------------------------------------------------------------------- /appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "StartValue": 0.5, 3 | "IncrementValue": 0.002, 4 | "EndValue": 0.51, 5 | "SampleValue": 20 6 | } -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Mark Rust files as detectable by GitHub Linguist 2 | *.rs linguist-detectable 3 | 4 | # Ignore C# files in language stats 5 | *.cs linguist-vendored 6 | 7 | # Ignore build artifacts 8 | target/* linguist-generated 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [] 7 | } -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/untitled.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "timer_res_benchmark" 3 | version = "0.3.2" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | windows-sys = { version = "0.59.0", features = ["Win32_Foundation", "Win32_Security", "Win32_System_Threading", "Win32_System_ProcessStatus", "Win32_System_LibraryLoader"] } 8 | serde = { version = "1.0.217", features = ["derive"] } 9 | serde_json = "1.0.135" 10 | tokio = { version = "1.43.0", features = ["full"] } 11 | csv = "1.3.1" 12 | indicatif = "0.17.9" 13 | os_info = "3.9.2" 14 | raw-cpuid = "11.3.0" 15 | lazy_static = "1.5.0" 16 | sysinfo = "0.33.1" 17 | colored = "3.0.0" 18 | plotters = "0.3.7" 19 | comfy-table = "7.1.3" 20 | 21 | 22 | [dependencies.windows] 23 | version = "0.59.0" 24 | features = [ 25 | "Wdk", 26 | "Wdk_System", 27 | "Wdk_System_SystemInformation", 28 | "Win32_System", 29 | "Win32_System_Console", 30 | "Win32_System_Threading", 31 | "Win32_System_SystemInformation", 32 | "Win32_Foundation" 33 | ] 34 | 35 | [dev-dependencies] 36 | # For testing 37 | 38 | [profile.release] 39 | # Optimize for performance 40 | opt-level = 3 41 | lto = true 42 | codegen-units = 1 43 | strip = "symbols" 44 | panic = "abort" 45 | incremental = false 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TimerResBenchmark 2 | 3 |

A Rust-based tool for benchmarking system timer resolution to achieve precise sleep intervals, optimizing performance and consistency for high-performance tasks like gaming, especially in low-latency scenarios. It automatically detects HPET status and identifies the optimal timer resolution for your system.

4 | 5 | ![image](https://github.com/user-attachments/assets/72b39d18-94a8-4312-b7ac-d86f773520ce) 6 | 7 | ![download_count](https://img.shields.io/github/downloads/SwiftyPop/TimerResBenchmark/total) 8 | 9 | 10 | --- 11 | 12 | ## Features 13 | - Checks if HPET is enabled or disabled during benchmark setup. 14 | ![image](https://github.com/user-attachments/assets/6ce5c4d0-98b1-420c-87d5-e5a1f68ba81d) 15 | - **Customizable Benchmark Parameters** 16 | - Modify the start value, end value, increment value and sample value through the program/config file. 17 | ![timer_res_benchmark_xUHblQxThy](https://github.com/user-attachments/assets/a289bd81-ee0f-4c14-af3e-fe21c590b927) 18 | 19 | - **Automatically detects the optimal timer resolution for your system** based on the lowest sleep delta and standard deviation. 20 | ![image](https://github.com/user-attachments/assets/c6cac925-f872-4ae7-b355-e203ce1996af) 21 | 22 | - **Rewritten in Rust** for better performance and less overhead. 23 | - GUI (under development) 24 | - Graph (under development) 25 | 26 | --- 27 | 28 | ## Installation and Usage 29 | 30 | 1. **Disable HPET** and set up an **Idle-disabled power plan** (follow the [Troubleshooting](https://github.com/SwiftyPop/TimerResBenchmark/tree/main?tab=readme-ov-file#troubleshooting) guide for help). 31 | 2. Download the latest release from [GitHub Releases](https://github.com/SwiftyPop/TimerResBenchmark/releases). 32 | 3. Extract the `.7z` archive. 33 | 4. Run `timer_res_benchmark.exe` as an administrator. 34 | - You can adjust the benchmark parameters directly in the program or modify them manually in the 'appsettings.json' file(default value). 35 | 5. After the benchmark completes, it will automatically detect the optimal timer resolution for your system. The results and additional details will be saved in the 'results.txt' file. 36 | 37 | --- 38 | 39 | ### Step 2: Set the Optimal Timer Resolution 40 | 1. Create a shortcut for `SetTimerResolution.exe`. 41 | 2. Place the shortcut in your `shell:startup` folder with the following target: 42 | ``` 43 | C:\PATH\TO\SetTimerResolution.exe --no-console --resolution 5000 44 | ``` 45 | - Replace `5000` with your optimal resolution (e.g., `5000` for 0.5ms). 46 | 3. Restart your PC and verify the settings using `MeasureSleep.exe`. 47 | 48 | --- 49 | ### [Optional] Visualize the Results 50 | 1. Visit [Plotly Chart Studio](https://chart-studio.plotly.com/create/#/). 51 | 2. Click **"Import"** at the top right and upload the `results.txt` file. 52 | 3. Add a trace and configure the settings as shown below: 53 | ![Plotly Configuration](https://github.com/SwiftyPop/TimerResBenchmark/assets/90952326/9f08eb09-7e1a-41f5-819e-10bd41444cd9) 54 | 4. Look for the lowest `Sleep(1) Delta` on the y-axis. This represents the most precise and consistent 1ms sleep delays. 55 | - Example: If the lowest delta is at 0.5024ms, this is your optimal timer resolution. 56 | 57 | --- 58 | 59 | ## Troubleshooting 60 | 61 | ### Sleep Delays Are Spiking (>1ms) 62 | 1. **Disable HPET**: 63 | - Open Command Prompt as administrator and run: 64 | ```bash 65 | bcdedit /deletevalue useplatformclock 66 | bcdedit /set disabledynamictick yes 67 | ``` 68 | - On Windows Server 2022+ and Windows 11+, apply this registry change: 69 | ```plaintext 70 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel] 71 | "GlobalTimerResolutionRequests"=dword:00000001 72 | ``` 73 | - You can now verify HPET status via this program: 74 | ![image](https://github.com/user-attachments/assets/6ce5c4d0-98b1-420c-87d5-e5a1f68ba81d) 75 | 76 | 77 | 2. **Use an Idle-Disabled Power Plan**: 78 | - Download the [Muren power plan](https://www.mediafire.com/file/39yxlxpbkyjg3qa/Muren.pow/file). 79 | - Import the plan using Command Prompt: 80 | ```bash 81 | powercfg -import C:\PATH\TO\MUREN.POW 82 | ``` 83 | - Set your power plan to **Muren**. 84 | 85 | --- 86 | 87 | ## Why Use TimerResBenchmark? 88 | - Disables HPET and uses more stable timers (e.g., TSC at 3.32MHz) for better frame rate consistency and lower latency. 89 | - Unlike the original PowerShell-based benchmark, this tool is now a native executable written in Rust, making it faster and easier to use. 90 | - This tool was initially rewritten from C# to Rust as part of a learning project. Contributions and feedback are always welcome! 91 | 92 | --- 93 | 94 | ## License 95 | This project is licensed under the **MIT License**. See the [LICENSE](https://github.com/SwiftyPop/TimerResBenchmark/blob/master/LICENSE) file for details. 96 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use io::ErrorKind; 2 | use serde::{Deserialize, Serialize}; 3 | use std::io::{self, BufWriter, Error, Write}; 4 | use std::path::PathBuf; 5 | use std::process::{Command, Stdio}; 6 | use std::time::Duration; 7 | use std::{env, ptr}; 8 | use std::{fs, mem::size_of}; 9 | use tokio::task; 10 | use tokio::time::sleep; 11 | use std::mem; 12 | use os_info; 13 | use raw_cpuid; 14 | use windows_sys::Win32::Foundation::HANDLE; 15 | use windows_sys::Win32::Security::{GetTokenInformation, TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY}; 16 | use windows_sys::Win32::System::Threading::{GetCurrentProcess, OpenProcessToken}; 17 | use std::sync::atomic::{AtomicBool, Ordering}; 18 | use std::sync::Once; 19 | use indicatif; 20 | use std::sync::Mutex; 21 | use comfy_table::{Cell, Color, ContentArrangement, Row, Table}; 22 | use colored::Colorize; 23 | 24 | #[derive(Debug, Deserialize, Serialize)] 25 | struct BenchmarkingParameters { 26 | #[serde(rename = "StartValue", deserialize_with = "validate_positive_f64")] 27 | start_value: f64, 28 | #[serde(rename = "IncrementValue", deserialize_with = "validate_positive_f64")] 29 | increment_value: f64, 30 | #[serde(rename = "EndValue", deserialize_with = "validate_positive_f64")] 31 | end_value: f64, 32 | #[serde(rename = "SampleValue", deserialize_with = "validate_positive_i32")] 33 | sample_value: i32, 34 | } 35 | 36 | fn validate_positive_f64<'de, D>(deserializer: D) -> Result 37 | where 38 | D: serde::Deserializer<'de>, 39 | { 40 | let value = f64::deserialize(deserializer)?; 41 | if value > 0.0 { 42 | Ok(value) 43 | } else { 44 | Err(serde::de::Error::custom("Value must be positive")) 45 | } 46 | } 47 | 48 | fn validate_positive_i32<'de, D>(deserializer: D) -> Result 49 | where 50 | D: serde::Deserializer<'de>, 51 | { 52 | let value = i32::deserialize(deserializer)?; 53 | if value > 0 { 54 | Ok(value) 55 | } else { 56 | Err(serde::de::Error::custom("Value must be positive")) 57 | } 58 | } 59 | 60 | 61 | #[tokio::main] 62 | async fn main() -> io::Result<()> { 63 | use colored::*; 64 | 65 | // Create a dynamic separator using '=' characters 66 | let separator = "=".repeat(60); 67 | 68 | // Title Block 69 | println!("\n{}", separator); 70 | println!("{:^60}", "🚀 Timer Resolution Benchmark Tool".bold().cyan()); 71 | println!("{}\n", separator); 72 | 73 | // Check admin privileges first - fail fast 74 | if !is_admin() { 75 | eprintln!("{} {}", "❌ Error:".bold().red(), "Administrator privileges required!".bold().red()); 76 | eprintln!(" {}", "Please run this program as Administrator.".bold().red()); 77 | return Err(Error::new(ErrorKind::PermissionDenied, "Administrator privileges required")); 78 | } 79 | 80 | // System information block 81 | println!("{}", "📊 System Information".bold().yellow()); 82 | println!("━━━━━━━━━━━━━━━━━━━"); 83 | println!("📂 Working Directory: {}", env::current_dir()?.display()); 84 | println!("🛡️ Admin Privileges: {}", "✓ Confirmed".bold().green()); 85 | 86 | // Display OS information 87 | let os_info = os_info::get(); 88 | 89 | // Check if the OS is Windows and display specific version information 90 | if let os_info::Type::Windows = os_info.os_type() { 91 | if let Some(build_number) = os_info.version().to_string().split('.').nth(2).and_then(|s| s.parse::().ok()) { 92 | let version = if build_number >= 22000 { 93 | "Windows 11" 94 | } else { 95 | "Windows 10" 96 | }; 97 | println!("🖥️ Windows Version: {} (Build {})", version, build_number); 98 | } else { 99 | println!("🖥️ Windows Version: Unknown Build"); 100 | } 101 | } 102 | 103 | // Display CPU information 104 | let cpuid = raw_cpuid::CpuId::new(); 105 | 106 | // Get the CPU brand string 107 | if let Some(brand) = cpuid.get_processor_brand_string() { 108 | println!("💻 CPU: {}", brand.as_str().trim()); 109 | } else { 110 | println!("💻 CPU: Unknown"); 111 | } 112 | 113 | println!(); 114 | 115 | // HPET Configuration block 116 | println!("{}", "🔧 System Configuration".bold().yellow()); 117 | println!("━━━━━━━━━━━━━━━━━━━━"); 118 | check_hpet_status()?; 119 | println!(); 120 | 121 | // Load and parse configuration 122 | let parameters = match fs::read_to_string("appsettings.json") 123 | .and_then(|content| serde_json::from_str::(&content) 124 | .map_err(|e| Error::new(ErrorKind::InvalidData, e))) 125 | { 126 | Ok(mut params) => { 127 | let mut input = String::new(); 128 | let mut prompt = |desc: &str, current: &str| -> io::Result> { 129 | println!("▸ {}: {} (current)", desc, current); 130 | println!("Enter new {} (or press Enter to keep current): ", desc); 131 | input.clear(); 132 | io::stdin().read_line(&mut input)?; 133 | let trimmed = input.trim(); 134 | Ok(if trimmed.is_empty() { None } else { Some(trimmed.to_string()) }) 135 | }; 136 | 137 | println!("⚙️ Benchmark Parameters"); 138 | println!("━━━━━━━━━━━━━━━━━━━"); 139 | 140 | if let Some(new_value) = prompt("Start Value", &format!("{:.4} ms", params.start_value))? { 141 | params.start_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?; 142 | } 143 | if let Some(new_value) = prompt("Increment Value", &format!("{:.4} ms", params.increment_value))? { 144 | params.increment_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?; 145 | } 146 | if let Some(new_value) = prompt("End Value", &format!("{:.4} ms", params.end_value))? { 147 | params.end_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?; 148 | } 149 | if let Some(new_value) = prompt("Sample Value", ¶ms.sample_value.to_string())? { 150 | params.sample_value = new_value.parse().map_err(|e| Error::new(ErrorKind::InvalidInput, e))?; 151 | } 152 | 153 | let iterations = ((params.end_value - params.start_value) / params.increment_value).ceil(); 154 | println!("▸ Iterations: {}\n", iterations as i32); 155 | 156 | // Save updated parameters back to appsettings.json 157 | if let Err(e) = fs::write("appsettings.json", serde_json::to_string_pretty(¶ms)?) { 158 | eprintln!("❌ Failed to save updated parameters: {}", e); 159 | } 160 | 161 | params 162 | }, 163 | Err(e) => { 164 | eprintln!("❌ Configuration Error: {}", e); 165 | return Err(e); 166 | } 167 | }; 168 | 169 | let exe_dir = env::current_exe()?.parent() 170 | .ok_or_else(|| { 171 | eprintln!("❌ Error: Failed to get current executable path"); 172 | Error::new(ErrorKind::Other, "Failed to get current executable path") 173 | })? 174 | .to_path_buf(); 175 | 176 | let set_timer_resolution_path = exe_dir.join("SetTimerResolution.exe"); 177 | let measure_sleep_path = exe_dir.join("MeasureSleep.exe"); 178 | 179 | // Dependency check 180 | println!("\n🔍 Checking Dependencies"); 181 | println!("━━━━━━━━━━━━━━━━━━━━━"); 182 | 183 | let dependencies = [ 184 | ("SetTimerResolution.exe", &set_timer_resolution_path), 185 | ("MeasureSleep.exe", &measure_sleep_path), 186 | ]; 187 | 188 | let missing_dependencies: Vec<_> = dependencies.iter() 189 | .filter_map(|(name, path)| { 190 | if path.exists() { 191 | println!("✓ Found: {}", path.file_name().unwrap_or_default().to_string_lossy()); 192 | None 193 | } else { 194 | Some(*name) 195 | } 196 | }) 197 | .collect(); 198 | 199 | if !missing_dependencies.is_empty() { 200 | eprintln!("❌ Error: Missing dependencies: {}", missing_dependencies.join(", ")); 201 | return Err(Error::new(ErrorKind::NotFound, "Missing dependencies")); 202 | } 203 | println!(); 204 | 205 | prompt_user("⏳ Press Enter to start the benchmark...")?; 206 | 207 | fn prompt_user(message: &str) -> io::Result<()> { 208 | println!("{}", message); 209 | io::stdin().read_line(&mut String::new())?; 210 | Ok(()) 211 | } 212 | 213 | let results_file = fs::File::create("results.txt")?; 214 | let mut results_writer = BufWriter::with_capacity(8 * 1024, results_file); 215 | writeln!(results_writer, "RequestedResolutionMs,DeltaMs,StandardDeviation")?; 216 | println!("📝 Results will be saved to: results.txt"); 217 | 218 | let mut current = parameters.start_value; 219 | let total_iterations = ((parameters.end_value - parameters.start_value) / parameters.increment_value).ceil() as u64; 220 | let progress_bar = indicatif::ProgressBar::new(total_iterations); 221 | progress_bar.set_style( 222 | indicatif::ProgressStyle::default_bar() 223 | .template( 224 | "{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {pos}/{len} \n\ 225 | ▸ Current Resolution: {msg:.yellow} \n\ 226 | ▸ ETA: {eta_precise} | Iteration Time: {per_sec}" 227 | ) 228 | .map_err(|e| Error::new(ErrorKind::Other, e.to_string()))? 229 | .progress_chars("█▓▒░ ") 230 | .with_key("per_sec", |state: &indicatif::ProgressState, w: &mut dyn std::fmt::Write| write!(w, "{:.2}s/iter", state.per_sec()).unwrap()) 231 | ); 232 | progress_bar.enable_steady_tick(Duration::from_millis(100)); 233 | 234 | while current <= parameters.end_value { 235 | let resolution = ((current * 10_000.0).round() / 10_000.0 * 10_000.0) as i32; 236 | 237 | let set_timer_resolution_path = set_timer_resolution_path.clone(); 238 | let set_timer_result = task::spawn_blocking({ 239 | move || { 240 | Command::new(&set_timer_resolution_path) 241 | .args(&["--resolution", &resolution.to_string(), "--no-console"]) 242 | .stdout(Stdio::null()) 243 | .spawn() 244 | } 245 | }).await?; 246 | 247 | if let Err(e) = set_timer_result { 248 | eprintln!("Failed to set timer resolution: {}", e); 249 | } 250 | 251 | 252 | sleep(Duration::from_millis(1)).await; 253 | 254 | let output = Command::new(&measure_sleep_path) 255 | .arg("--samples") 256 | .arg(parameters.sample_value.to_string()) 257 | .output() 258 | .map_err(|e| { 259 | eprintln!("Failed to execute measurement: {}", e); 260 | e 261 | })?; 262 | 263 | let (avg, stdev) = parse_measurement_output(&output.stdout).map_err(|e| { 264 | eprintln!("Failed to parse measurement output: {}", e); 265 | e 266 | })?; 267 | 268 | if avg != 0.0 && stdev != 0.0 { 269 | writeln!(results_writer, "{:.4},{:.4},{:.4}", current, avg, stdev)?; 270 | } else { 271 | eprintln!("❌ Measurement output is invalid for resolution: {}", resolution); 272 | } 273 | 274 | results_writer.flush()?; 275 | if let Err(e) = kill_process("SetTimerResolution.exe") { 276 | eprintln!("Failed to kill process: {}", e); 277 | } 278 | 279 | current += parameters.increment_value; 280 | progress_bar.set_message(format!("Current resolution: {:.4} ms", current)); 281 | progress_bar.inc(1); 282 | } 283 | 284 | progress_bar.finish_with_message("Benchmarking completed successfully"); 285 | 286 | // Confirm the existence of the results file 287 | let results_path = PathBuf::from("results.txt"); 288 | if !results_path.exists() { 289 | eprintln!("❌ Error: results.txt file not found!"); 290 | return Err(Error::new(ErrorKind::NotFound, "results.txt file not found")); 291 | } 292 | 293 | let results_content = fs::read_to_string(&results_path)?; 294 | let mut rdr = csv::ReaderBuilder::new() 295 | .has_headers(true) 296 | .from_reader(results_content.as_bytes()); 297 | 298 | let mut all_results = Vec::new(); 299 | let mut optimal_resolution = None; 300 | let mut min_delta = f64::MAX; 301 | let mut min_std = f64::MAX; 302 | 303 | for result in rdr.records().filter_map(|r| r.ok()) { 304 | if let (Ok(res), Ok(delta), Ok(std)) = ( 305 | result[0].parse::(), 306 | result[1].parse::(), 307 | result[2].parse::(), 308 | ) { 309 | all_results.push((res, delta, std)); 310 | 311 | // Find the optimal resolution 312 | if delta < min_delta || (delta == min_delta && std < min_std) { 313 | optimal_resolution = Some(res); 314 | min_delta = delta; 315 | min_std = std; 316 | } 317 | } 318 | } 319 | // Call print_summary if valid results are found 320 | if let Some(resolution) = optimal_resolution { 321 | print_summary(resolution, &all_results); 322 | } else { 323 | eprintln!("❌ Error: No valid data found in results.txt"); 324 | return Err(Error::new(ErrorKind::InvalidData, "No valid data found in results.txt")); 325 | } 326 | 327 | println!("Benchmarking completed successfully"); 328 | 329 | // Wait for user input before exiting 330 | prompt_exit()?; 331 | 332 | Ok(()) 333 | } 334 | 335 | fn prompt_exit() -> io::Result<()> { 336 | println!("Press Enter to exit..."); 337 | io::stdin().read_line(&mut String::new())?; 338 | Ok(()) 339 | } 340 | fn print_summary(optimal_res: f64, all_results: &[(f64, f64, f64)]) { 341 | assert!(!all_results.is_empty(), "Cannot print summary of empty results"); 342 | 343 | let mut table = Table::new(); 344 | table.set_content_arrangement(ContentArrangement::Dynamic); 345 | table.set_header(vec![ 346 | Cell::new("Resolution (ms)"), 347 | Cell::new("Avg Δ (ms)"), 348 | Cell::new("STDEV"), 349 | ]); 350 | 351 | let mut optimal_row_index = None; 352 | 353 | for (i, &(res, avg, stdev)) in all_results.iter().enumerate() { 354 | // Check if this row is optimal based on a tolerance 355 | let is_optimal = (res - optimal_res).abs() < f64::EPSILON; 356 | if is_optimal { 357 | optimal_row_index = Some(i); 358 | } 359 | 360 | // Create cells with formatted numbers. 361 | // We use comfy_table's Cell and its styling API, so the styling does not affect width calculations. 362 | let res_cell = if is_optimal { 363 | Cell::new(format!("{:>8.4}", res)).fg(Color::Green) 364 | } else { 365 | Cell::new(format!("{:>8.4}", res)) 366 | }; 367 | let avg_cell = if is_optimal { 368 | Cell::new(format!("{:>8.4}", avg)).fg(Color::Green) 369 | } else { 370 | Cell::new(format!("{:>8.4}", avg)) 371 | }; 372 | let stdev_cell = if is_optimal { 373 | Cell::new(format!("{:>8.4}", stdev)).fg(Color::Green) 374 | } else { 375 | Cell::new(format!("{:>8.4}", stdev)) 376 | }; 377 | 378 | let row = Row::from(vec![res_cell, avg_cell, stdev_cell]); 379 | table.add_row(row); 380 | } 381 | 382 | assert!(optimal_row_index.is_some(), "Optimal resolution not found in results"); 383 | 384 | // Finally, print the table. 385 | println!("{}", table); 386 | 387 | // Print the header and optimal resolution. 388 | println!("\n{}", "OPTIMAL RESOLUTION FOUND".green().bold()); 389 | println!("{}", "═════════════════════════"); 390 | println!("▸ {:>8.4} ms\n", optimal_res); 391 | } 392 | 393 | 394 | lazy_static::lazy_static! { 395 | static ref HPET_STATUS: Mutex> = Mutex::new(None); 396 | } 397 | 398 | fn check_hpet_status() -> io::Result<()> { 399 | let mut status = HPET_STATUS.lock().unwrap(); 400 | 401 | // Use the cached status if available. 402 | if let Some(ref cached_status) = *status { 403 | println!("HPET status (cached): {}", cached_status); 404 | return Ok(()); 405 | } 406 | 407 | // Run the bcdedit command to get the current boot configuration. 408 | let output = Command::new("bcdedit") 409 | .arg("/enum") 410 | .arg("{current}") 411 | .output()?; 412 | 413 | if !output.status.success() { 414 | eprintln!("❌ Error: Failed to retrieve HPET status"); 415 | return Err(Error::new(ErrorKind::Other, "Failed to retrieve HPET status")); 416 | } 417 | 418 | let output_str = String::from_utf8_lossy(&output.stdout); 419 | 420 | // We'll capture the values for the two keys if they exist. 421 | let mut useplatformclock_value: Option = None; 422 | let mut disabledynamictick_value: Option = None; 423 | 424 | for line in output_str.lines() { 425 | let mut parts = line.split_whitespace(); 426 | if let (Some(key), Some(value)) = (parts.next(), parts.next()) { 427 | match key.to_lowercase().as_str() { 428 | "useplatformclock" => { 429 | useplatformclock_value = Some(value.to_lowercase()); 430 | } 431 | "disabledynamictick" => { 432 | disabledynamictick_value = Some(value.to_lowercase()); 433 | } 434 | _ => {} 435 | } 436 | } 437 | } 438 | 439 | // Decide HPET status. 440 | // According to the requirement, if "useplatformclock" is absent and "disabledynamictick" is "yes", 441 | // then we consider HPET as disabled. 442 | let hpet_status = match ( 443 | useplatformclock_value.as_deref(), 444 | disabledynamictick_value.as_deref(), 445 | ) { 446 | // If "useplatformclock" is present and equals "no", and disabledynamictick is "yes" → disabled. 447 | (Some("no"), Some("yes")) => "disabled", 448 | // If "useplatformclock" is absent but disabledynamictick is "yes" → disabled. 449 | (None, Some("yes")) => "disabled", 450 | // If both keys are absent, default to disabled. 451 | (None, None) => "disabled", 452 | // In all other cases, consider HPET as enabled. 453 | _ => "enabled", 454 | }; 455 | 456 | println!("HPET status: {}", hpet_status); 457 | 458 | // If HPET is enabled, notify the user and prompt to disable. 459 | if hpet_status == "enabled" { 460 | println!("⚠️ HPET is enabled. For optimal results, it is recommended to disable HPET."); 461 | println!("Please refer to the troubleshooting guide: https://github.com/SwiftyPop/TimerResBenchmark?tab=readme-ov-file#troubleshooting"); 462 | println!("Would you like to disable HPET now? (y/n): "); 463 | let mut input = String::new(); 464 | io::stdin().read_line(&mut input)?; 465 | if input.trim().eq_ignore_ascii_case("y") { 466 | if let Err(e) = disable_hpet() { 467 | eprintln!("❌ Error: Failed to disable HPET: {}", e); 468 | return Err(e); 469 | } 470 | println!("✅ HPET has been disabled. Please restart your computer for the changes to take effect."); 471 | } 472 | } 473 | 474 | *status = Some(hpet_status.to_string()); 475 | 476 | Ok(()) 477 | } 478 | 479 | fn disable_hpet() -> io::Result<()> { 480 | let mut commands = vec![ 481 | { 482 | let mut cmd = Command::new("bcdedit"); 483 | cmd.arg("/deletevalue").arg("useplatformclock"); 484 | cmd 485 | }, 486 | { 487 | let mut cmd = Command::new("bcdedit"); 488 | cmd.arg("/set").arg("disabledynamictick").arg("yes"); 489 | cmd 490 | }, 491 | ]; 492 | 493 | if let Err(e) = apply_registry_tweak() { 494 | eprintln!("❌ Error: Failed to apply registry tweak: {}", e); 495 | return Err(e.into()); 496 | } 497 | 498 | for command in commands.iter_mut() { 499 | let output = command.output() 500 | .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("Failed to disable HPET: {}", e)))?; 501 | if !output.status.success() { 502 | return Err(io::Error::new( 503 | io::ErrorKind::Other, 504 | format!("Failed to disable HPET: {}", output.status), 505 | )); 506 | } 507 | } 508 | 509 | Ok(()) 510 | } 511 | 512 | fn apply_registry_tweak() -> io::Result<()> { 513 | let output = Command::new("reg") 514 | .arg("add") 515 | .arg(r"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel") 516 | .arg("/v") 517 | .arg("GlobalTimerResolutionRequests") 518 | .arg("/t") 519 | .arg("REG_DWORD") 520 | .arg("/d") 521 | .arg("1") 522 | .arg("/f") 523 | .output()?; 524 | 525 | if !output.status.success() { 526 | return Err(Error::new( 527 | ErrorKind::Other, 528 | "Failed to apply registry tweak", 529 | )); 530 | } 531 | 532 | Ok(()) 533 | } 534 | 535 | fn parse_measurement_output(output: &[u8]) -> io::Result<(f64, f64)> { 536 | let output_str = std::str::from_utf8(output) 537 | .map_err(|e| Error::new(ErrorKind::InvalidData, e))?; 538 | 539 | let mut avg = None; 540 | let mut stdev = None; 541 | 542 | for line in output_str.lines() { 543 | if avg.is_none() && line.starts_with("Avg: ") { 544 | avg = line[5..].parse().ok(); 545 | } else if stdev.is_none() && line.starts_with("STDEV: ") { 546 | stdev = line[7..].parse().ok(); 547 | } 548 | 549 | if avg.is_some() && stdev.is_some() { 550 | break; 551 | } 552 | } 553 | 554 | avg.zip(stdev).ok_or_else(|| Error::new(ErrorKind::InvalidData, "Invalid measurement output")) 555 | } 556 | 557 | static IS_ADMIN: AtomicBool = AtomicBool::new(false); 558 | static INIT: Once = Once::new(); 559 | 560 | fn is_admin() -> bool { 561 | INIT.call_once(|| { 562 | unsafe { 563 | let mut token: HANDLE = ptr::null_mut(); 564 | if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) != 0 { 565 | let mut elevation: TOKEN_ELEVATION = mem::zeroed(); 566 | let mut size = size_of::() as u32; 567 | 568 | if GetTokenInformation( 569 | token, 570 | TokenElevation, 571 | &mut elevation as *mut _ as *mut std::ffi::c_void, 572 | size, 573 | &mut size, 574 | ) != 0 && elevation.TokenIsElevated != 0 575 | { 576 | IS_ADMIN.store(true, Ordering::Relaxed); 577 | } 578 | windows_sys::Win32::Foundation::CloseHandle(token); 579 | } 580 | } 581 | }); 582 | 583 | IS_ADMIN.load(Ordering::Relaxed) 584 | } 585 | 586 | fn kill_process(process_name: &str) -> io::Result<()> { 587 | let mut system = sysinfo::System::new_all(); 588 | system.refresh_all(); 589 | 590 | let mut found = false; 591 | 592 | for (_pid, process) in system.processes() { 593 | if process.name().eq_ignore_ascii_case(process_name) { 594 | if process.kill() { 595 | found = true; 596 | } else { 597 | return Err(Error::new(ErrorKind::Other, format!("Failed to kill process {}", process_name))); 598 | } 599 | } 600 | } 601 | 602 | if !found { 603 | eprintln!("Process {} not found", process_name); 604 | return Err(Error::new(ErrorKind::NotFound, format!("Process {} not found", process_name))); 605 | } 606 | 607 | Ok(()) 608 | } 609 | 610 | 611 | -------------------------------------------------------------------------------- /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.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 = "android-tzdata" 22 | version = "0.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 25 | 26 | [[package]] 27 | name = "android_system_properties" 28 | version = "0.1.5" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 31 | dependencies = [ 32 | "libc", 33 | ] 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 = "bitflags" 58 | version = "1.3.2" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 61 | 62 | [[package]] 63 | name = "bitflags" 64 | version = "2.8.0" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 67 | 68 | [[package]] 69 | name = "bumpalo" 70 | version = "3.16.0" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 73 | 74 | [[package]] 75 | name = "bytemuck" 76 | version = "1.21.0" 77 | source = "registry+https://github.com/rust-lang/crates.io-index" 78 | checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" 79 | 80 | [[package]] 81 | name = "byteorder" 82 | version = "1.5.0" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 85 | 86 | [[package]] 87 | name = "bytes" 88 | version = "1.9.0" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 91 | 92 | [[package]] 93 | name = "cc" 94 | version = "1.2.10" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" 97 | dependencies = [ 98 | "shlex", 99 | ] 100 | 101 | [[package]] 102 | name = "cfg-if" 103 | version = "1.0.0" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 106 | 107 | [[package]] 108 | name = "chrono" 109 | version = "0.4.39" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 112 | dependencies = [ 113 | "android-tzdata", 114 | "iana-time-zone", 115 | "js-sys", 116 | "num-traits", 117 | "wasm-bindgen", 118 | "windows-targets 0.52.6", 119 | ] 120 | 121 | [[package]] 122 | name = "color_quant" 123 | version = "1.1.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 126 | 127 | [[package]] 128 | name = "colored" 129 | version = "3.0.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" 132 | dependencies = [ 133 | "windows-sys 0.59.0", 134 | ] 135 | 136 | [[package]] 137 | name = "comfy-table" 138 | version = "7.1.3" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "24f165e7b643266ea80cb858aed492ad9280e3e05ce24d4a99d7d7b889b6a4d9" 141 | dependencies = [ 142 | "crossterm", 143 | "strum", 144 | "strum_macros", 145 | "unicode-width", 146 | ] 147 | 148 | [[package]] 149 | name = "console" 150 | version = "0.15.10" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" 153 | dependencies = [ 154 | "encode_unicode", 155 | "libc", 156 | "once_cell", 157 | "unicode-width", 158 | "windows-sys 0.59.0", 159 | ] 160 | 161 | [[package]] 162 | name = "core-foundation" 163 | version = "0.9.4" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 166 | dependencies = [ 167 | "core-foundation-sys", 168 | "libc", 169 | ] 170 | 171 | [[package]] 172 | name = "core-foundation-sys" 173 | version = "0.8.7" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 176 | 177 | [[package]] 178 | name = "core-graphics" 179 | version = "0.23.2" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 182 | dependencies = [ 183 | "bitflags 1.3.2", 184 | "core-foundation", 185 | "core-graphics-types", 186 | "foreign-types", 187 | "libc", 188 | ] 189 | 190 | [[package]] 191 | name = "core-graphics-types" 192 | version = "0.1.3" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 195 | dependencies = [ 196 | "bitflags 1.3.2", 197 | "core-foundation", 198 | "libc", 199 | ] 200 | 201 | [[package]] 202 | name = "core-text" 203 | version = "20.1.0" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" 206 | dependencies = [ 207 | "core-foundation", 208 | "core-graphics", 209 | "foreign-types", 210 | "libc", 211 | ] 212 | 213 | [[package]] 214 | name = "crc32fast" 215 | version = "1.4.2" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 218 | dependencies = [ 219 | "cfg-if", 220 | ] 221 | 222 | [[package]] 223 | name = "crossbeam-deque" 224 | version = "0.8.6" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 227 | dependencies = [ 228 | "crossbeam-epoch", 229 | "crossbeam-utils", 230 | ] 231 | 232 | [[package]] 233 | name = "crossbeam-epoch" 234 | version = "0.9.18" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 237 | dependencies = [ 238 | "crossbeam-utils", 239 | ] 240 | 241 | [[package]] 242 | name = "crossbeam-utils" 243 | version = "0.8.21" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 246 | 247 | [[package]] 248 | name = "crossterm" 249 | version = "0.28.1" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 252 | dependencies = [ 253 | "bitflags 2.8.0", 254 | "crossterm_winapi", 255 | "parking_lot", 256 | "rustix", 257 | "winapi", 258 | ] 259 | 260 | [[package]] 261 | name = "crossterm_winapi" 262 | version = "0.9.1" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 265 | dependencies = [ 266 | "winapi", 267 | ] 268 | 269 | [[package]] 270 | name = "csv" 271 | version = "1.3.1" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" 274 | dependencies = [ 275 | "csv-core", 276 | "itoa", 277 | "ryu", 278 | "serde", 279 | ] 280 | 281 | [[package]] 282 | name = "csv-core" 283 | version = "0.1.11" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" 286 | dependencies = [ 287 | "memchr", 288 | ] 289 | 290 | [[package]] 291 | name = "dirs" 292 | version = "5.0.1" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 295 | dependencies = [ 296 | "dirs-sys", 297 | ] 298 | 299 | [[package]] 300 | name = "dirs-sys" 301 | version = "0.4.1" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 304 | dependencies = [ 305 | "libc", 306 | "option-ext", 307 | "redox_users", 308 | "windows-sys 0.48.0", 309 | ] 310 | 311 | [[package]] 312 | name = "dlib" 313 | version = "0.5.2" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 316 | dependencies = [ 317 | "libloading", 318 | ] 319 | 320 | [[package]] 321 | name = "dwrote" 322 | version = "0.11.2" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "70182709525a3632b2ba96b6569225467b18ecb4a77f46d255f713a6bebf05fd" 325 | dependencies = [ 326 | "lazy_static", 327 | "libc", 328 | "winapi", 329 | "wio", 330 | ] 331 | 332 | [[package]] 333 | name = "either" 334 | version = "1.13.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 337 | 338 | [[package]] 339 | name = "encode_unicode" 340 | version = "1.0.0" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 343 | 344 | [[package]] 345 | name = "errno" 346 | version = "0.3.10" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 349 | dependencies = [ 350 | "libc", 351 | "windows-sys 0.59.0", 352 | ] 353 | 354 | [[package]] 355 | name = "fdeflate" 356 | version = "0.3.7" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 359 | dependencies = [ 360 | "simd-adler32", 361 | ] 362 | 363 | [[package]] 364 | name = "flate2" 365 | version = "1.0.35" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 368 | dependencies = [ 369 | "crc32fast", 370 | "miniz_oxide", 371 | ] 372 | 373 | [[package]] 374 | name = "float-ord" 375 | version = "0.3.2" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" 378 | 379 | [[package]] 380 | name = "font-kit" 381 | version = "0.14.2" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "b64b34f4efd515f905952d91bc185039863705592c0c53ae6d979805dd154520" 384 | dependencies = [ 385 | "bitflags 2.8.0", 386 | "byteorder", 387 | "core-foundation", 388 | "core-graphics", 389 | "core-text", 390 | "dirs", 391 | "dwrote", 392 | "float-ord", 393 | "freetype-sys", 394 | "lazy_static", 395 | "libc", 396 | "log", 397 | "pathfinder_geometry", 398 | "pathfinder_simd", 399 | "walkdir", 400 | "winapi", 401 | "yeslogic-fontconfig-sys", 402 | ] 403 | 404 | [[package]] 405 | name = "foreign-types" 406 | version = "0.5.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 409 | dependencies = [ 410 | "foreign-types-macros", 411 | "foreign-types-shared", 412 | ] 413 | 414 | [[package]] 415 | name = "foreign-types-macros" 416 | version = "0.2.3" 417 | source = "registry+https://github.com/rust-lang/crates.io-index" 418 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 419 | dependencies = [ 420 | "proc-macro2", 421 | "quote", 422 | "syn", 423 | ] 424 | 425 | [[package]] 426 | name = "foreign-types-shared" 427 | version = "0.3.1" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 430 | 431 | [[package]] 432 | name = "freetype-sys" 433 | version = "0.20.1" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" 436 | dependencies = [ 437 | "cc", 438 | "libc", 439 | "pkg-config", 440 | ] 441 | 442 | [[package]] 443 | name = "getrandom" 444 | version = "0.2.15" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 447 | dependencies = [ 448 | "cfg-if", 449 | "libc", 450 | "wasi", 451 | ] 452 | 453 | [[package]] 454 | name = "gif" 455 | version = "0.12.0" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" 458 | dependencies = [ 459 | "color_quant", 460 | "weezl", 461 | ] 462 | 463 | [[package]] 464 | name = "gimli" 465 | version = "0.31.1" 466 | source = "registry+https://github.com/rust-lang/crates.io-index" 467 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 468 | 469 | [[package]] 470 | name = "heck" 471 | version = "0.5.0" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 474 | 475 | [[package]] 476 | name = "iana-time-zone" 477 | version = "0.1.61" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 480 | dependencies = [ 481 | "android_system_properties", 482 | "core-foundation-sys", 483 | "iana-time-zone-haiku", 484 | "js-sys", 485 | "wasm-bindgen", 486 | "windows-core 0.52.0", 487 | ] 488 | 489 | [[package]] 490 | name = "iana-time-zone-haiku" 491 | version = "0.1.2" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 494 | dependencies = [ 495 | "cc", 496 | ] 497 | 498 | [[package]] 499 | name = "image" 500 | version = "0.24.9" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 503 | dependencies = [ 504 | "bytemuck", 505 | "byteorder", 506 | "color_quant", 507 | "jpeg-decoder", 508 | "num-traits", 509 | "png", 510 | ] 511 | 512 | [[package]] 513 | name = "indicatif" 514 | version = "0.17.10" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "aeffd0d77fc9a0bc8ec71b6364089028b48283b534f874178753723ad9241f42" 517 | dependencies = [ 518 | "console", 519 | "number_prefix", 520 | "portable-atomic", 521 | "unicode-width", 522 | "web-time", 523 | ] 524 | 525 | [[package]] 526 | name = "itoa" 527 | version = "1.0.14" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 530 | 531 | [[package]] 532 | name = "jpeg-decoder" 533 | version = "0.3.1" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 536 | 537 | [[package]] 538 | name = "js-sys" 539 | version = "0.3.77" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 542 | dependencies = [ 543 | "once_cell", 544 | "wasm-bindgen", 545 | ] 546 | 547 | [[package]] 548 | name = "lazy_static" 549 | version = "1.5.0" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 552 | 553 | [[package]] 554 | name = "libc" 555 | version = "0.2.169" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 558 | 559 | [[package]] 560 | name = "libloading" 561 | version = "0.8.6" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 564 | dependencies = [ 565 | "cfg-if", 566 | "windows-targets 0.52.6", 567 | ] 568 | 569 | [[package]] 570 | name = "libredox" 571 | version = "0.1.3" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 574 | dependencies = [ 575 | "bitflags 2.8.0", 576 | "libc", 577 | ] 578 | 579 | [[package]] 580 | name = "linux-raw-sys" 581 | version = "0.4.15" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 584 | 585 | [[package]] 586 | name = "lock_api" 587 | version = "0.4.12" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 590 | dependencies = [ 591 | "autocfg", 592 | "scopeguard", 593 | ] 594 | 595 | [[package]] 596 | name = "log" 597 | version = "0.4.25" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 600 | 601 | [[package]] 602 | name = "memchr" 603 | version = "2.7.4" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 606 | 607 | [[package]] 608 | name = "miniz_oxide" 609 | version = "0.8.3" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" 612 | dependencies = [ 613 | "adler2", 614 | "simd-adler32", 615 | ] 616 | 617 | [[package]] 618 | name = "mio" 619 | version = "1.0.3" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 622 | dependencies = [ 623 | "libc", 624 | "wasi", 625 | "windows-sys 0.52.0", 626 | ] 627 | 628 | [[package]] 629 | name = "ntapi" 630 | version = "0.4.1" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 633 | dependencies = [ 634 | "winapi", 635 | ] 636 | 637 | [[package]] 638 | name = "num-traits" 639 | version = "0.2.19" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 642 | dependencies = [ 643 | "autocfg", 644 | ] 645 | 646 | [[package]] 647 | name = "number_prefix" 648 | version = "0.4.0" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 651 | 652 | [[package]] 653 | name = "object" 654 | version = "0.36.7" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 657 | dependencies = [ 658 | "memchr", 659 | ] 660 | 661 | [[package]] 662 | name = "once_cell" 663 | version = "1.20.2" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 666 | 667 | [[package]] 668 | name = "option-ext" 669 | version = "0.2.0" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 672 | 673 | [[package]] 674 | name = "os_info" 675 | version = "3.9.2" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "6e6520c8cc998c5741ee68ec1dc369fc47e5f0ea5320018ecf2a1ccd6328f48b" 678 | dependencies = [ 679 | "log", 680 | "serde", 681 | "windows-sys 0.52.0", 682 | ] 683 | 684 | [[package]] 685 | name = "parking_lot" 686 | version = "0.12.3" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 689 | dependencies = [ 690 | "lock_api", 691 | "parking_lot_core", 692 | ] 693 | 694 | [[package]] 695 | name = "parking_lot_core" 696 | version = "0.9.10" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 699 | dependencies = [ 700 | "cfg-if", 701 | "libc", 702 | "redox_syscall", 703 | "smallvec", 704 | "windows-targets 0.52.6", 705 | ] 706 | 707 | [[package]] 708 | name = "pathfinder_geometry" 709 | version = "0.5.1" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" 712 | dependencies = [ 713 | "log", 714 | "pathfinder_simd", 715 | ] 716 | 717 | [[package]] 718 | name = "pathfinder_simd" 719 | version = "0.5.4" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "5cf07ef4804cfa9aea3b04a7bbdd5a40031dbb6b4f2cbaf2b011666c80c5b4f2" 722 | dependencies = [ 723 | "rustc_version", 724 | ] 725 | 726 | [[package]] 727 | name = "pin-project-lite" 728 | version = "0.2.16" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 731 | 732 | [[package]] 733 | name = "pkg-config" 734 | version = "0.3.31" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 737 | 738 | [[package]] 739 | name = "plotters" 740 | version = "0.3.7" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" 743 | dependencies = [ 744 | "chrono", 745 | "font-kit", 746 | "image", 747 | "lazy_static", 748 | "num-traits", 749 | "pathfinder_geometry", 750 | "plotters-backend", 751 | "plotters-bitmap", 752 | "plotters-svg", 753 | "ttf-parser", 754 | "wasm-bindgen", 755 | "web-sys", 756 | ] 757 | 758 | [[package]] 759 | name = "plotters-backend" 760 | version = "0.3.7" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" 763 | 764 | [[package]] 765 | name = "plotters-bitmap" 766 | version = "0.3.7" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "72ce181e3f6bf82d6c1dc569103ca7b1bd964c60ba03d7e6cdfbb3e3eb7f7405" 769 | dependencies = [ 770 | "gif", 771 | "image", 772 | "plotters-backend", 773 | ] 774 | 775 | [[package]] 776 | name = "plotters-svg" 777 | version = "0.3.7" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" 780 | dependencies = [ 781 | "plotters-backend", 782 | ] 783 | 784 | [[package]] 785 | name = "png" 786 | version = "0.17.16" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 789 | dependencies = [ 790 | "bitflags 1.3.2", 791 | "crc32fast", 792 | "fdeflate", 793 | "flate2", 794 | "miniz_oxide", 795 | ] 796 | 797 | [[package]] 798 | name = "portable-atomic" 799 | version = "1.10.0" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" 802 | 803 | [[package]] 804 | name = "proc-macro2" 805 | version = "1.0.93" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 808 | dependencies = [ 809 | "unicode-ident", 810 | ] 811 | 812 | [[package]] 813 | name = "quote" 814 | version = "1.0.38" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 817 | dependencies = [ 818 | "proc-macro2", 819 | ] 820 | 821 | [[package]] 822 | name = "raw-cpuid" 823 | version = "11.3.0" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "c6928fa44c097620b706542d428957635951bade7143269085389d42c8a4927e" 826 | dependencies = [ 827 | "bitflags 2.8.0", 828 | ] 829 | 830 | [[package]] 831 | name = "rayon" 832 | version = "1.10.0" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 835 | dependencies = [ 836 | "either", 837 | "rayon-core", 838 | ] 839 | 840 | [[package]] 841 | name = "rayon-core" 842 | version = "1.12.1" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 845 | dependencies = [ 846 | "crossbeam-deque", 847 | "crossbeam-utils", 848 | ] 849 | 850 | [[package]] 851 | name = "redox_syscall" 852 | version = "0.5.8" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 855 | dependencies = [ 856 | "bitflags 2.8.0", 857 | ] 858 | 859 | [[package]] 860 | name = "redox_users" 861 | version = "0.4.6" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 864 | dependencies = [ 865 | "getrandom", 866 | "libredox", 867 | "thiserror", 868 | ] 869 | 870 | [[package]] 871 | name = "rustc-demangle" 872 | version = "0.1.24" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 875 | 876 | [[package]] 877 | name = "rustc_version" 878 | version = "0.4.1" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 881 | dependencies = [ 882 | "semver", 883 | ] 884 | 885 | [[package]] 886 | name = "rustix" 887 | version = "0.38.44" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 890 | dependencies = [ 891 | "bitflags 2.8.0", 892 | "errno", 893 | "libc", 894 | "linux-raw-sys", 895 | "windows-sys 0.59.0", 896 | ] 897 | 898 | [[package]] 899 | name = "rustversion" 900 | version = "1.0.19" 901 | source = "registry+https://github.com/rust-lang/crates.io-index" 902 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 903 | 904 | [[package]] 905 | name = "ryu" 906 | version = "1.0.19" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 909 | 910 | [[package]] 911 | name = "same-file" 912 | version = "1.0.6" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 915 | dependencies = [ 916 | "winapi-util", 917 | ] 918 | 919 | [[package]] 920 | name = "scopeguard" 921 | version = "1.2.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 924 | 925 | [[package]] 926 | name = "semver" 927 | version = "1.0.25" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" 930 | 931 | [[package]] 932 | name = "serde" 933 | version = "1.0.217" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 936 | dependencies = [ 937 | "serde_derive", 938 | ] 939 | 940 | [[package]] 941 | name = "serde_derive" 942 | version = "1.0.217" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 945 | dependencies = [ 946 | "proc-macro2", 947 | "quote", 948 | "syn", 949 | ] 950 | 951 | [[package]] 952 | name = "serde_json" 953 | version = "1.0.137" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" 956 | dependencies = [ 957 | "itoa", 958 | "memchr", 959 | "ryu", 960 | "serde", 961 | ] 962 | 963 | [[package]] 964 | name = "shlex" 965 | version = "1.3.0" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 968 | 969 | [[package]] 970 | name = "signal-hook-registry" 971 | version = "1.4.2" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 974 | dependencies = [ 975 | "libc", 976 | ] 977 | 978 | [[package]] 979 | name = "simd-adler32" 980 | version = "0.3.7" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 983 | 984 | [[package]] 985 | name = "smallvec" 986 | version = "1.13.2" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 989 | 990 | [[package]] 991 | name = "socket2" 992 | version = "0.5.8" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 995 | dependencies = [ 996 | "libc", 997 | "windows-sys 0.52.0", 998 | ] 999 | 1000 | [[package]] 1001 | name = "strum" 1002 | version = "0.26.3" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1005 | 1006 | [[package]] 1007 | name = "strum_macros" 1008 | version = "0.26.4" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1011 | dependencies = [ 1012 | "heck", 1013 | "proc-macro2", 1014 | "quote", 1015 | "rustversion", 1016 | "syn", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "syn" 1021 | version = "2.0.96" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 1024 | dependencies = [ 1025 | "proc-macro2", 1026 | "quote", 1027 | "unicode-ident", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "sysinfo" 1032 | version = "0.33.1" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" 1035 | dependencies = [ 1036 | "core-foundation-sys", 1037 | "libc", 1038 | "memchr", 1039 | "ntapi", 1040 | "rayon", 1041 | "windows 0.57.0", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "thiserror" 1046 | version = "1.0.69" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1049 | dependencies = [ 1050 | "thiserror-impl", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "thiserror-impl" 1055 | version = "1.0.69" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1058 | dependencies = [ 1059 | "proc-macro2", 1060 | "quote", 1061 | "syn", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "timer_res_benchmark" 1066 | version = "0.3.2" 1067 | dependencies = [ 1068 | "colored", 1069 | "comfy-table", 1070 | "csv", 1071 | "indicatif", 1072 | "lazy_static", 1073 | "os_info", 1074 | "plotters", 1075 | "raw-cpuid", 1076 | "serde", 1077 | "serde_json", 1078 | "sysinfo", 1079 | "tokio", 1080 | "windows 0.59.0", 1081 | "windows-sys 0.59.0", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "tokio" 1086 | version = "1.43.0" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 1089 | dependencies = [ 1090 | "backtrace", 1091 | "bytes", 1092 | "libc", 1093 | "mio", 1094 | "parking_lot", 1095 | "pin-project-lite", 1096 | "signal-hook-registry", 1097 | "socket2", 1098 | "tokio-macros", 1099 | "windows-sys 0.52.0", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "tokio-macros" 1104 | version = "2.5.0" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1107 | dependencies = [ 1108 | "proc-macro2", 1109 | "quote", 1110 | "syn", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "ttf-parser" 1115 | version = "0.20.0" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 1118 | 1119 | [[package]] 1120 | name = "unicode-ident" 1121 | version = "1.0.16" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" 1124 | 1125 | [[package]] 1126 | name = "unicode-width" 1127 | version = "0.2.0" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 1130 | 1131 | [[package]] 1132 | name = "walkdir" 1133 | version = "2.5.0" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 1136 | dependencies = [ 1137 | "same-file", 1138 | "winapi-util", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "wasi" 1143 | version = "0.11.0+wasi-snapshot-preview1" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1146 | 1147 | [[package]] 1148 | name = "wasm-bindgen" 1149 | version = "0.2.100" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1152 | dependencies = [ 1153 | "cfg-if", 1154 | "once_cell", 1155 | "rustversion", 1156 | "wasm-bindgen-macro", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "wasm-bindgen-backend" 1161 | version = "0.2.100" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1164 | dependencies = [ 1165 | "bumpalo", 1166 | "log", 1167 | "proc-macro2", 1168 | "quote", 1169 | "syn", 1170 | "wasm-bindgen-shared", 1171 | ] 1172 | 1173 | [[package]] 1174 | name = "wasm-bindgen-macro" 1175 | version = "0.2.100" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1178 | dependencies = [ 1179 | "quote", 1180 | "wasm-bindgen-macro-support", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "wasm-bindgen-macro-support" 1185 | version = "0.2.100" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1188 | dependencies = [ 1189 | "proc-macro2", 1190 | "quote", 1191 | "syn", 1192 | "wasm-bindgen-backend", 1193 | "wasm-bindgen-shared", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "wasm-bindgen-shared" 1198 | version = "0.2.100" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1201 | dependencies = [ 1202 | "unicode-ident", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "web-sys" 1207 | version = "0.3.77" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1210 | dependencies = [ 1211 | "js-sys", 1212 | "wasm-bindgen", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "web-time" 1217 | version = "1.1.0" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 1220 | dependencies = [ 1221 | "js-sys", 1222 | "wasm-bindgen", 1223 | ] 1224 | 1225 | [[package]] 1226 | name = "weezl" 1227 | version = "0.1.8" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 1230 | 1231 | [[package]] 1232 | name = "winapi" 1233 | version = "0.3.9" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1236 | dependencies = [ 1237 | "winapi-i686-pc-windows-gnu", 1238 | "winapi-x86_64-pc-windows-gnu", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "winapi-i686-pc-windows-gnu" 1243 | version = "0.4.0" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1246 | 1247 | [[package]] 1248 | name = "winapi-util" 1249 | version = "0.1.9" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 1252 | dependencies = [ 1253 | "windows-sys 0.59.0", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "winapi-x86_64-pc-windows-gnu" 1258 | version = "0.4.0" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1261 | 1262 | [[package]] 1263 | name = "windows" 1264 | version = "0.57.0" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" 1267 | dependencies = [ 1268 | "windows-core 0.57.0", 1269 | "windows-targets 0.52.6", 1270 | ] 1271 | 1272 | [[package]] 1273 | name = "windows" 1274 | version = "0.59.0" 1275 | source = "registry+https://github.com/rust-lang/crates.io-index" 1276 | checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" 1277 | dependencies = [ 1278 | "windows-core 0.59.0", 1279 | "windows-targets 0.53.0", 1280 | ] 1281 | 1282 | [[package]] 1283 | name = "windows-core" 1284 | version = "0.52.0" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1287 | dependencies = [ 1288 | "windows-targets 0.52.6", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "windows-core" 1293 | version = "0.57.0" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" 1296 | dependencies = [ 1297 | "windows-implement 0.57.0", 1298 | "windows-interface 0.57.0", 1299 | "windows-result 0.1.2", 1300 | "windows-targets 0.52.6", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "windows-core" 1305 | version = "0.59.0" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" 1308 | dependencies = [ 1309 | "windows-implement 0.59.0", 1310 | "windows-interface 0.59.0", 1311 | "windows-result 0.3.0", 1312 | "windows-strings", 1313 | "windows-targets 0.53.0", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "windows-implement" 1318 | version = "0.57.0" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" 1321 | dependencies = [ 1322 | "proc-macro2", 1323 | "quote", 1324 | "syn", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "windows-implement" 1329 | version = "0.59.0" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" 1332 | dependencies = [ 1333 | "proc-macro2", 1334 | "quote", 1335 | "syn", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "windows-interface" 1340 | version = "0.57.0" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" 1343 | dependencies = [ 1344 | "proc-macro2", 1345 | "quote", 1346 | "syn", 1347 | ] 1348 | 1349 | [[package]] 1350 | name = "windows-interface" 1351 | version = "0.59.0" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01" 1354 | dependencies = [ 1355 | "proc-macro2", 1356 | "quote", 1357 | "syn", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "windows-result" 1362 | version = "0.1.2" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 1365 | dependencies = [ 1366 | "windows-targets 0.52.6", 1367 | ] 1368 | 1369 | [[package]] 1370 | name = "windows-result" 1371 | version = "0.3.0" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | checksum = "d08106ce80268c4067c0571ca55a9b4e9516518eaa1a1fe9b37ca403ae1d1a34" 1374 | dependencies = [ 1375 | "windows-targets 0.53.0", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "windows-strings" 1380 | version = "0.3.0" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "b888f919960b42ea4e11c2f408fadb55f78a9f236d5eef084103c8ce52893491" 1383 | dependencies = [ 1384 | "windows-targets 0.53.0", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "windows-sys" 1389 | version = "0.48.0" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1392 | dependencies = [ 1393 | "windows-targets 0.48.5", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "windows-sys" 1398 | version = "0.52.0" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1401 | dependencies = [ 1402 | "windows-targets 0.52.6", 1403 | ] 1404 | 1405 | [[package]] 1406 | name = "windows-sys" 1407 | version = "0.59.0" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1410 | dependencies = [ 1411 | "windows-targets 0.52.6", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "windows-targets" 1416 | version = "0.48.5" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 1419 | dependencies = [ 1420 | "windows_aarch64_gnullvm 0.48.5", 1421 | "windows_aarch64_msvc 0.48.5", 1422 | "windows_i686_gnu 0.48.5", 1423 | "windows_i686_msvc 0.48.5", 1424 | "windows_x86_64_gnu 0.48.5", 1425 | "windows_x86_64_gnullvm 0.48.5", 1426 | "windows_x86_64_msvc 0.48.5", 1427 | ] 1428 | 1429 | [[package]] 1430 | name = "windows-targets" 1431 | version = "0.52.6" 1432 | source = "registry+https://github.com/rust-lang/crates.io-index" 1433 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1434 | dependencies = [ 1435 | "windows_aarch64_gnullvm 0.52.6", 1436 | "windows_aarch64_msvc 0.52.6", 1437 | "windows_i686_gnu 0.52.6", 1438 | "windows_i686_gnullvm 0.52.6", 1439 | "windows_i686_msvc 0.52.6", 1440 | "windows_x86_64_gnu 0.52.6", 1441 | "windows_x86_64_gnullvm 0.52.6", 1442 | "windows_x86_64_msvc 0.52.6", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "windows-targets" 1447 | version = "0.53.0" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 1450 | dependencies = [ 1451 | "windows_aarch64_gnullvm 0.53.0", 1452 | "windows_aarch64_msvc 0.53.0", 1453 | "windows_i686_gnu 0.53.0", 1454 | "windows_i686_gnullvm 0.53.0", 1455 | "windows_i686_msvc 0.53.0", 1456 | "windows_x86_64_gnu 0.53.0", 1457 | "windows_x86_64_gnullvm 0.53.0", 1458 | "windows_x86_64_msvc 0.53.0", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "windows_aarch64_gnullvm" 1463 | version = "0.48.5" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 1466 | 1467 | [[package]] 1468 | name = "windows_aarch64_gnullvm" 1469 | version = "0.52.6" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1472 | 1473 | [[package]] 1474 | name = "windows_aarch64_gnullvm" 1475 | version = "0.53.0" 1476 | source = "registry+https://github.com/rust-lang/crates.io-index" 1477 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 1478 | 1479 | [[package]] 1480 | name = "windows_aarch64_msvc" 1481 | version = "0.48.5" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 1484 | 1485 | [[package]] 1486 | name = "windows_aarch64_msvc" 1487 | version = "0.52.6" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1490 | 1491 | [[package]] 1492 | name = "windows_aarch64_msvc" 1493 | version = "0.53.0" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 1496 | 1497 | [[package]] 1498 | name = "windows_i686_gnu" 1499 | version = "0.48.5" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 1502 | 1503 | [[package]] 1504 | name = "windows_i686_gnu" 1505 | version = "0.52.6" 1506 | source = "registry+https://github.com/rust-lang/crates.io-index" 1507 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1508 | 1509 | [[package]] 1510 | name = "windows_i686_gnu" 1511 | version = "0.53.0" 1512 | source = "registry+https://github.com/rust-lang/crates.io-index" 1513 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 1514 | 1515 | [[package]] 1516 | name = "windows_i686_gnullvm" 1517 | version = "0.52.6" 1518 | source = "registry+https://github.com/rust-lang/crates.io-index" 1519 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1520 | 1521 | [[package]] 1522 | name = "windows_i686_gnullvm" 1523 | version = "0.53.0" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 1526 | 1527 | [[package]] 1528 | name = "windows_i686_msvc" 1529 | version = "0.48.5" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 1532 | 1533 | [[package]] 1534 | name = "windows_i686_msvc" 1535 | version = "0.52.6" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1538 | 1539 | [[package]] 1540 | name = "windows_i686_msvc" 1541 | version = "0.53.0" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 1544 | 1545 | [[package]] 1546 | name = "windows_x86_64_gnu" 1547 | version = "0.48.5" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 1550 | 1551 | [[package]] 1552 | name = "windows_x86_64_gnu" 1553 | version = "0.52.6" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1556 | 1557 | [[package]] 1558 | name = "windows_x86_64_gnu" 1559 | version = "0.53.0" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 1562 | 1563 | [[package]] 1564 | name = "windows_x86_64_gnullvm" 1565 | version = "0.48.5" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 1568 | 1569 | [[package]] 1570 | name = "windows_x86_64_gnullvm" 1571 | version = "0.52.6" 1572 | source = "registry+https://github.com/rust-lang/crates.io-index" 1573 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1574 | 1575 | [[package]] 1576 | name = "windows_x86_64_gnullvm" 1577 | version = "0.53.0" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 1580 | 1581 | [[package]] 1582 | name = "windows_x86_64_msvc" 1583 | version = "0.48.5" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 1586 | 1587 | [[package]] 1588 | name = "windows_x86_64_msvc" 1589 | version = "0.52.6" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1592 | 1593 | [[package]] 1594 | name = "windows_x86_64_msvc" 1595 | version = "0.53.0" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 1598 | 1599 | [[package]] 1600 | name = "wio" 1601 | version = "0.2.2" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" 1604 | dependencies = [ 1605 | "winapi", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "yeslogic-fontconfig-sys" 1610 | version = "6.0.0" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" 1613 | dependencies = [ 1614 | "dlib", 1615 | "once_cell", 1616 | "pkg-config", 1617 | ] 1618 | --------------------------------------------------------------------------------