├── README.md ├── .gitignore ├── src ├── err.rs ├── opt.rs ├── file.rs ├── as_ref.rs ├── main.rs ├── server.rs ├── routes.rs ├── routes │ ├── index.rs │ └── paths.rs └── body.rs ├── Cargo.toml ├── LICENSE ├── .github └── workflows │ └── ci.yml └── Cargo.lock /README.md: -------------------------------------------------------------------------------- 1 | # reflected 2 | Upload and serve temporary files. 3 | 4 | ⚠️ MOVED TO A SUBCOMMAND OF https://github.com/erikdesjardins/re ⚠️ 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | # These are backup files generated by rustfmt 6 | **/*.rs.bk 7 | -------------------------------------------------------------------------------- /src/err.rs: -------------------------------------------------------------------------------- 1 | use std::fmt::{self, Debug, Display}; 2 | 3 | pub type Error = Box; 4 | 5 | pub struct DisplayError(Error); 6 | 7 | impl Debug for DisplayError { 8 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 9 | Display::fmt(&self.0, f) 10 | } 11 | } 12 | 13 | impl> From for DisplayError { 14 | fn from(display: T) -> Self { 15 | DisplayError(display.into()) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/opt.rs: -------------------------------------------------------------------------------- 1 | use std::net::SocketAddr; 2 | 3 | use structopt::StructOpt; 4 | 5 | #[derive(StructOpt, Debug)] 6 | #[structopt(about)] 7 | pub struct Options { 8 | #[structopt( 9 | short = "v", 10 | long = "verbose", 11 | parse(from_occurrences), 12 | global = true, 13 | help = "Logging verbosity (-v info, -vv debug, -vvv trace)" 14 | )] 15 | pub verbose: u8, 16 | 17 | #[structopt(help = "Socket address to listen on")] 18 | pub listen_addr: SocketAddr, 19 | } 20 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "reflected" 3 | version = "0.4.6" 4 | authors = [] 5 | description = "Upload and serve temporary files." 6 | edition = "2018" 7 | 8 | [dependencies] 9 | env_logger = { version = "0.10", default-features = false, features = ["humantime"] } 10 | headers = "0.3" 11 | hyper = { version = "0.14", features = ["server", "http1", "tcp"] } 12 | log = "0.4" 13 | memmap2 = "0.5" 14 | structopt = { version = "0.3", default-features = false } 15 | tempfile = "3.1" 16 | tokio = { version = "1.0", features = ["fs", "io-util", "macros", "rt", "sync"] } 17 | 18 | [profile.release] 19 | panic = "abort" 20 | lto = true 21 | codegen-units = 1 22 | -------------------------------------------------------------------------------- /src/file.rs: -------------------------------------------------------------------------------- 1 | use hyper::body::HttpBody; 2 | use hyper::Body; 3 | use memmap2::Mmap; 4 | use tempfile::tempfile; 5 | use tokio::fs::File; 6 | use tokio::io::AsyncWriteExt; 7 | 8 | use crate::err::Error; 9 | 10 | pub async fn write_to_mmap(mut body: Body) -> Result { 11 | let file = tempfile()?; 12 | 13 | let mut file = File::from_std(file); 14 | while let Some(bytes) = body.data().await { 15 | let bytes = bytes?; 16 | file.write_all(&bytes).await?; 17 | } 18 | let file = file.into_std().await; 19 | 20 | // safety: this is an unlinked, exclusive-access temporary file, 21 | // so it cannot be modified or truncated by anyone else 22 | let mmap = unsafe { Mmap::map(&file)? }; 23 | 24 | Ok(mmap) 25 | } 26 | -------------------------------------------------------------------------------- /src/as_ref.rs: -------------------------------------------------------------------------------- 1 | use std::ops::{Deref, Index}; 2 | 3 | /// Wraps an `AsRef` type to slice the result of `as_ref`. 4 | pub struct ReindexAsRef(pub T, pub I); 5 | 6 | impl AsRef for ReindexAsRef 7 | where 8 | T: AsRef, 9 | I: Clone, 10 | R: Index + ?Sized, 11 | { 12 | fn as_ref(&self) -> &R { 13 | &self.0.as_ref()[self.1.clone()] 14 | } 15 | } 16 | 17 | /// Forwards a `Deref` type's `AsRef` to the `AsRef` of the deref'd type. 18 | pub struct ForwardAsRef(pub T); 19 | 20 | impl AsRef for ForwardAsRef 21 | where 22 | T: Deref, 23 | T::Target: AsRef, 24 | R: ?Sized, 25 | { 26 | fn as_ref(&self) -> &R { 27 | self.0.deref().as_ref() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::type_complexity)] 2 | 3 | mod as_ref; 4 | mod body; 5 | mod err; 6 | mod file; 7 | mod opt; 8 | mod routes; 9 | mod server; 10 | 11 | use structopt::StructOpt; 12 | 13 | #[tokio::main(flavor = "current_thread")] 14 | async fn main() -> Result<(), err::DisplayError> { 15 | let opt::Options { 16 | verbose, 17 | listen_addr, 18 | } = opt::Options::from_args(); 19 | 20 | env_logger::Builder::new() 21 | .filter_level(match verbose { 22 | 0 => log::LevelFilter::Warn, 23 | 1 => log::LevelFilter::Info, 24 | 2 => log::LevelFilter::Debug, 25 | _ => log::LevelFilter::Trace, 26 | }) 27 | .init(); 28 | 29 | server::run(&listen_addr).await?; 30 | 31 | Ok(()) 32 | } 33 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use std::convert::Infallible; 2 | use std::net::SocketAddr; 3 | use std::sync::Arc; 4 | 5 | use hyper::server::Server; 6 | use hyper::service::{make_service_fn, service_fn}; 7 | 8 | use crate::err::Error; 9 | use crate::routes::respond_to_request; 10 | 11 | pub async fn run(addr: &SocketAddr) -> Result<(), Error> { 12 | let state = Arc::default(); 13 | let make_svc = make_service_fn(move |_| { 14 | let state = Arc::clone(&state); 15 | let svc = service_fn(move |req| { 16 | let state = Arc::clone(&state); 17 | async move { respond_to_request(req, &state).await } 18 | }); 19 | async move { Ok::<_, Infallible>(svc) } 20 | }); 21 | 22 | Server::try_bind(addr)?.serve(make_svc).await?; 23 | 24 | Ok(()) 25 | } 26 | -------------------------------------------------------------------------------- /src/routes.rs: -------------------------------------------------------------------------------- 1 | use std::collections::BTreeMap; 2 | use std::sync::Arc; 3 | 4 | use hyper::{Body, Method, Request, Response, StatusCode}; 5 | use memmap2::Mmap; 6 | use tokio::sync::RwLock; 7 | 8 | use crate::body::ArcBody; 9 | use crate::err::Error; 10 | 11 | mod index; 12 | mod paths; 13 | 14 | #[derive(Default)] 15 | pub struct State { 16 | files: RwLock>>, 17 | } 18 | 19 | pub async fn respond_to_request( 20 | req: Request, 21 | state: &State, 22 | ) -> Result, Error> { 23 | match *req.method() { 24 | Method::GET if req.uri().path() == "/" => index::get(req, state).await, 25 | Method::GET => paths::get(req, state).await, 26 | Method::POST => paths::post(req, state).await, 27 | Method::DELETE => paths::delete(req, state).await, 28 | _ => { 29 | log::warn!("{} {} -> [method not allowed]", req.method(), req.uri()); 30 | let mut resp = Response::new(ArcBody::empty()); 31 | *resp.status_mut() = StatusCode::METHOD_NOT_ALLOWED; 32 | Ok(resp) 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 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 | -------------------------------------------------------------------------------- /src/routes/index.rs: -------------------------------------------------------------------------------- 1 | use hyper::{Body, Request, Response}; 2 | 3 | use crate::body::ArcBody; 4 | use crate::err::Error; 5 | use crate::routes::State; 6 | 7 | pub async fn get(req: Request, state: &State) -> Result, Error> { 8 | let files = state.files.read().await; 9 | log::info!("GET {} -> [listing {} files]", req.uri(), files.len()); 10 | let files_listing = files 11 | .iter() 12 | .map(|(path, file)| { 13 | format!(concat!( 14 | "
", 15 | "{path} ", 16 | "{len} bytes ", 17 | "(delete)", 18 | "
", 19 | ), path = path, len = file.len()) 20 | }) 21 | .collect::>() 22 | .join(""); 23 | Ok(Response::new(ArcBody::new(format!( 24 | concat!( 25 | "", 26 | "", 27 | "", 28 | "", 29 | "visit a path to upload a file", 30 | "

", 31 | "or upload by name ", 32 | "", 36 | "{files_listing}", 37 | "", 38 | "", 39 | ), 40 | files_listing = files_listing 41 | )))) 42 | } 43 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - v*.*.* 9 | pull_request: 10 | 11 | jobs: 12 | fmt: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v2 16 | - uses: actions-rs/toolchain@v1 17 | with: 18 | toolchain: stable 19 | - run: rustup component add rustfmt 20 | - run: cargo fmt --all -- --check 21 | 22 | clippy: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v2 26 | - uses: actions-rs/toolchain@v1 27 | with: 28 | toolchain: stable 29 | - run: rustup component add clippy 30 | - run: RUSTFLAGS="-D warnings" cargo clippy 31 | 32 | test: 33 | runs-on: ubuntu-latest 34 | steps: 35 | - uses: actions/checkout@v2 36 | - uses: actions-rs/toolchain@v1 37 | with: 38 | toolchain: stable 39 | - run: cargo test 40 | 41 | build-linux: 42 | runs-on: ubuntu-latest 43 | steps: 44 | - uses: actions/checkout@v2 45 | - uses: actions-rs/toolchain@v1 46 | with: 47 | toolchain: stable 48 | target: x86_64-unknown-linux-musl 49 | - run: cargo build --release --target=x86_64-unknown-linux-musl 50 | - run: strip target/x86_64-unknown-linux-musl/release/reflected 51 | - run: ls -lh target/x86_64-unknown-linux-musl/release/reflected 52 | - uses: softprops/action-gh-release@v1 53 | if: startsWith(github.ref, 'refs/tags/') 54 | with: 55 | files: target/x86_64-unknown-linux-musl/release/reflected 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | 59 | build-windows: 60 | runs-on: windows-latest 61 | steps: 62 | - uses: actions/checkout@v2 63 | - uses: actions-rs/toolchain@v1 64 | with: 65 | toolchain: stable 66 | - run: cargo build --release 67 | env: 68 | RUSTFLAGS: -Ctarget-feature=+crt-static 69 | - run: dir target/release/reflected.exe 70 | - uses: softprops/action-gh-release@v1 71 | if: startsWith(github.ref, 'refs/tags/') 72 | with: 73 | files: target/release/reflected.exe 74 | env: 75 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 76 | -------------------------------------------------------------------------------- /src/body.rs: -------------------------------------------------------------------------------- 1 | use std::convert::Infallible; 2 | use std::io::Cursor; 3 | use std::mem; 4 | use std::ops::Range; 5 | use std::sync::Arc; 6 | use std::task::Context; 7 | 8 | use hyper::body::{HttpBody, SizeHint}; 9 | use hyper::header::HeaderValue; 10 | use hyper::HeaderMap; 11 | use tokio::macros::support::{Pin, Poll}; 12 | 13 | use crate::as_ref::{ForwardAsRef, ReindexAsRef}; 14 | 15 | type ArcAsRefBytes = Arc + Sync + Send>; 16 | 17 | pub struct ArcBody { 18 | data: Option, 19 | range: Range, 20 | } 21 | 22 | impl ArcBody { 23 | pub fn new(bytes: T) -> Self 24 | where 25 | T: AsRef<[u8]> + Sync + Send + 'static, 26 | { 27 | Self::from_arc(Arc::new(bytes)) 28 | } 29 | 30 | pub fn from_arc(arc: Arc) -> Self 31 | where 32 | T: AsRef<[u8]> + Sync + Send + 'static, 33 | { 34 | Self { 35 | range: 0..T::as_ref(&arc).len(), 36 | data: Some(arc), 37 | } 38 | } 39 | 40 | pub fn from_arc_with_range(arc: Arc, range: Range) -> Result> 41 | where 42 | T: AsRef<[u8]> + Sync + Send + 'static, 43 | { 44 | // check if the range is in bounds 45 | match T::as_ref(&arc).get(range.clone()) { 46 | Some(_) => Ok(Self { 47 | data: Some(arc), 48 | range, 49 | }), 50 | None => Err(arc), 51 | } 52 | } 53 | 54 | pub fn empty() -> Self { 55 | Self { 56 | data: None, 57 | range: 0..0, 58 | } 59 | } 60 | } 61 | 62 | impl HttpBody for ArcBody { 63 | type Data = Cursor, Range>>; 64 | type Error = Infallible; 65 | 66 | fn poll_data( 67 | mut self: Pin<&mut Self>, 68 | _: &mut Context<'_>, 69 | ) -> Poll>> { 70 | let Self { data, range } = &mut *self; 71 | 72 | // windows/linux can't handle write calls bigger than this 73 | let chunk_size = i32::MAX as usize; 74 | 75 | let (data, range) = match data { 76 | Some(data) if (range.end - range.start) > chunk_size => { 77 | let split = range.start + chunk_size; 78 | let (first, rest) = (range.start..split, split..range.end); 79 | *range = rest; 80 | (Arc::clone(data), first) 81 | } 82 | data @ Some(_) => { 83 | // can send everything in one shot 84 | (data.take().unwrap(), mem::replace(range, 0..0)) 85 | } 86 | None => return Poll::Ready(None), 87 | }; 88 | 89 | Poll::Ready(Some(Ok(Cursor::new(ReindexAsRef( 90 | ForwardAsRef(data), 91 | range, 92 | ))))) 93 | } 94 | 95 | fn poll_trailers( 96 | self: Pin<&mut Self>, 97 | _: &mut Context<'_>, 98 | ) -> Poll>, Self::Error>> { 99 | Poll::Ready(Ok(None)) 100 | } 101 | 102 | fn is_end_stream(&self) -> bool { 103 | self.range.start == self.range.end 104 | } 105 | 106 | fn size_hint(&self) -> SizeHint { 107 | let len = self.range.end - self.range.start; 108 | SizeHint::with_exact(len as u64) 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/routes/paths.rs: -------------------------------------------------------------------------------- 1 | use std::collections::Bound; 2 | use std::sync::Arc; 3 | 4 | use headers::{AcceptRanges, ContentRange, HeaderMapExt, Range}; 5 | use hyper::header::HOST; 6 | use hyper::{Body, Request, Response, StatusCode}; 7 | 8 | use crate::body::ArcBody; 9 | use crate::err::Error; 10 | use crate::file::write_to_mmap; 11 | use crate::routes::State; 12 | 13 | pub async fn get(req: Request, state: &State) -> Result, Error> { 14 | let file = state.files.read().await.get(req.uri().path()).cloned(); 15 | Ok(match file { 16 | Some(file) => match req 17 | .headers() 18 | .typed_get::() 19 | .and_then(|r| r.iter().next()) 20 | { 21 | Some((start, end)) => { 22 | let file_len = file.len(); 23 | let start_inclusive = match start { 24 | Bound::Included(start) => start as usize, 25 | Bound::Excluded(start) => start as usize + 1, 26 | Bound::Unbounded => 0, 27 | }; 28 | let end_exclusive = match end { 29 | Bound::Included(end) => end as usize + 1, 30 | Bound::Excluded(end) => end as usize, 31 | Bound::Unbounded => file_len, 32 | }; 33 | match ArcBody::from_arc_with_range(file, start_inclusive..end_exclusive) { 34 | Ok(body) => { 35 | log::info!( 36 | "GET {} -> [found range {}..{} bytes of {}]", 37 | req.uri(), 38 | start_inclusive, 39 | end_exclusive, 40 | file_len 41 | ); 42 | let mut resp = Response::new(body); 43 | *resp.status_mut() = StatusCode::PARTIAL_CONTENT; 44 | resp.headers_mut().typed_insert(ContentRange::bytes( 45 | (start_inclusive as u64)..(end_exclusive as u64), 46 | file_len as u64, 47 | )?); 48 | resp 49 | } 50 | Err(_) => { 51 | log::info!("GET {} -> [bad range]", req.uri()); 52 | let mut resp = Response::new(ArcBody::empty()); 53 | *resp.status_mut() = StatusCode::RANGE_NOT_SATISFIABLE; 54 | resp.headers_mut() 55 | .typed_insert(ContentRange::unsatisfied_bytes(file_len as u64)); 56 | resp 57 | } 58 | } 59 | } 60 | None => { 61 | log::info!("GET {} -> [found {} bytes]", req.uri(), file.len()); 62 | let mut resp = Response::new(ArcBody::from_arc(file)); 63 | resp.headers_mut().typed_insert(AcceptRanges::bytes()); 64 | resp 65 | } 66 | }, 67 | None => { 68 | log::info!("GET {} -> [not found]", req.uri()); 69 | let path = req.uri().path().trim_start_matches('/'); 70 | let host = req 71 | .headers() 72 | .get(HOST) 73 | .and_then(|h| h.to_str().ok()) 74 | .unwrap_or("example.com"); 75 | let mut resp = Response::new(ArcBody::new( 76 | format!(concat!( 77 | "", 78 | "", 79 | "", 80 | "", 81 | "curl -o /dev/null -X POST {host}/{path} --data-binary @- < {path}", 82 | "

", 83 | "or ", 84 | "", 88 | "", 89 | "", 90 | ), path = path, host = host) 91 | )); 92 | *resp.status_mut() = StatusCode::NOT_FOUND; 93 | resp 94 | } 95 | }) 96 | } 97 | 98 | pub async fn post(req: Request, state: &State) -> Result, Error> { 99 | log::info!("POST {} -> [start upload]", req.uri()); 100 | let (parts, body) = req.into_parts(); 101 | let file = write_to_mmap(body).await?; 102 | log::info!("POST {} -> [uploaded {} bytes]", parts.uri, file.len()); 103 | state 104 | .files 105 | .write() 106 | .await 107 | .insert(parts.uri.path().to_string(), Arc::new(file)); 108 | Ok(Response::new(ArcBody::empty())) 109 | } 110 | 111 | pub async fn delete(req: Request, state: &State) -> Result, Error> { 112 | let file = state.files.write().await.remove(req.uri().path()); 113 | Ok(match file { 114 | Some(file) => { 115 | log::info!("DELETE {} -> [deleted {} bytes]", req.uri(), file.len()); 116 | Response::new(ArcBody::empty()) 117 | } 118 | None => { 119 | log::info!("DELETE {} -> [not found]", req.uri()); 120 | let mut resp = Response::new(ArcBody::empty()); 121 | *resp.status_mut() = StatusCode::NOT_FOUND; 122 | resp 123 | } 124 | }) 125 | } 126 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "autocfg" 7 | version = "1.1.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 10 | 11 | [[package]] 12 | name = "base64" 13 | version = "0.13.1" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 16 | 17 | [[package]] 18 | name = "bitflags" 19 | version = "1.3.2" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 22 | 23 | [[package]] 24 | name = "block-buffer" 25 | version = "0.10.3" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" 28 | dependencies = [ 29 | "generic-array", 30 | ] 31 | 32 | [[package]] 33 | name = "bytes" 34 | version = "1.4.0" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 37 | 38 | [[package]] 39 | name = "cc" 40 | version = "1.0.79" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "clap" 52 | version = "2.34.0" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" 55 | dependencies = [ 56 | "bitflags", 57 | "textwrap", 58 | "unicode-width", 59 | ] 60 | 61 | [[package]] 62 | name = "cpufeatures" 63 | version = "0.2.5" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" 66 | dependencies = [ 67 | "libc", 68 | ] 69 | 70 | [[package]] 71 | name = "crypto-common" 72 | version = "0.1.6" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 75 | dependencies = [ 76 | "generic-array", 77 | "typenum", 78 | ] 79 | 80 | [[package]] 81 | name = "digest" 82 | version = "0.10.6" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 85 | dependencies = [ 86 | "block-buffer", 87 | "crypto-common", 88 | ] 89 | 90 | [[package]] 91 | name = "env_logger" 92 | version = "0.10.0" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" 95 | dependencies = [ 96 | "humantime", 97 | "log", 98 | ] 99 | 100 | [[package]] 101 | name = "errno" 102 | version = "0.2.8" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 105 | dependencies = [ 106 | "errno-dragonfly", 107 | "libc", 108 | "winapi", 109 | ] 110 | 111 | [[package]] 112 | name = "errno-dragonfly" 113 | version = "0.1.2" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 116 | dependencies = [ 117 | "cc", 118 | "libc", 119 | ] 120 | 121 | [[package]] 122 | name = "fastrand" 123 | version = "1.9.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 126 | dependencies = [ 127 | "instant", 128 | ] 129 | 130 | [[package]] 131 | name = "fnv" 132 | version = "1.0.7" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 135 | 136 | [[package]] 137 | name = "futures-channel" 138 | version = "0.3.26" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" 141 | dependencies = [ 142 | "futures-core", 143 | ] 144 | 145 | [[package]] 146 | name = "futures-core" 147 | version = "0.3.26" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" 150 | 151 | [[package]] 152 | name = "futures-task" 153 | version = "0.3.26" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" 156 | 157 | [[package]] 158 | name = "futures-util" 159 | version = "0.3.26" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" 162 | dependencies = [ 163 | "futures-core", 164 | "futures-task", 165 | "pin-project-lite", 166 | "pin-utils", 167 | ] 168 | 169 | [[package]] 170 | name = "generic-array" 171 | version = "0.14.6" 172 | source = "registry+https://github.com/rust-lang/crates.io-index" 173 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 174 | dependencies = [ 175 | "typenum", 176 | "version_check", 177 | ] 178 | 179 | [[package]] 180 | name = "headers" 181 | version = "0.3.8" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" 184 | dependencies = [ 185 | "base64", 186 | "bitflags", 187 | "bytes", 188 | "headers-core", 189 | "http", 190 | "httpdate", 191 | "mime", 192 | "sha1", 193 | ] 194 | 195 | [[package]] 196 | name = "headers-core" 197 | version = "0.2.0" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 200 | dependencies = [ 201 | "http", 202 | ] 203 | 204 | [[package]] 205 | name = "heck" 206 | version = "0.3.3" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 209 | dependencies = [ 210 | "unicode-segmentation", 211 | ] 212 | 213 | [[package]] 214 | name = "http" 215 | version = "0.2.9" 216 | source = "registry+https://github.com/rust-lang/crates.io-index" 217 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 218 | dependencies = [ 219 | "bytes", 220 | "fnv", 221 | "itoa", 222 | ] 223 | 224 | [[package]] 225 | name = "http-body" 226 | version = "0.4.5" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 229 | dependencies = [ 230 | "bytes", 231 | "http", 232 | "pin-project-lite", 233 | ] 234 | 235 | [[package]] 236 | name = "httparse" 237 | version = "1.8.0" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 240 | 241 | [[package]] 242 | name = "httpdate" 243 | version = "1.0.2" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 246 | 247 | [[package]] 248 | name = "humantime" 249 | version = "2.1.0" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 252 | 253 | [[package]] 254 | name = "hyper" 255 | version = "0.14.24" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" 258 | dependencies = [ 259 | "bytes", 260 | "futures-channel", 261 | "futures-core", 262 | "futures-util", 263 | "http", 264 | "http-body", 265 | "httparse", 266 | "httpdate", 267 | "itoa", 268 | "pin-project-lite", 269 | "socket2", 270 | "tokio", 271 | "tower-service", 272 | "tracing", 273 | "want", 274 | ] 275 | 276 | [[package]] 277 | name = "instant" 278 | version = "0.1.12" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 281 | dependencies = [ 282 | "cfg-if", 283 | ] 284 | 285 | [[package]] 286 | name = "io-lifetimes" 287 | version = "1.0.5" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" 290 | dependencies = [ 291 | "libc", 292 | "windows-sys 0.45.0", 293 | ] 294 | 295 | [[package]] 296 | name = "itoa" 297 | version = "1.0.5" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 300 | 301 | [[package]] 302 | name = "lazy_static" 303 | version = "1.4.0" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 306 | 307 | [[package]] 308 | name = "libc" 309 | version = "0.2.139" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" 312 | 313 | [[package]] 314 | name = "linux-raw-sys" 315 | version = "0.1.4" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 318 | 319 | [[package]] 320 | name = "log" 321 | version = "0.4.17" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 324 | dependencies = [ 325 | "cfg-if", 326 | ] 327 | 328 | [[package]] 329 | name = "memchr" 330 | version = "2.5.0" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 333 | 334 | [[package]] 335 | name = "memmap2" 336 | version = "0.5.10" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" 339 | dependencies = [ 340 | "libc", 341 | ] 342 | 343 | [[package]] 344 | name = "mime" 345 | version = "0.3.16" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 348 | 349 | [[package]] 350 | name = "mio" 351 | version = "0.8.6" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" 354 | dependencies = [ 355 | "libc", 356 | "log", 357 | "wasi", 358 | "windows-sys 0.45.0", 359 | ] 360 | 361 | [[package]] 362 | name = "once_cell" 363 | version = "1.17.1" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 366 | 367 | [[package]] 368 | name = "pin-project-lite" 369 | version = "0.2.9" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 372 | 373 | [[package]] 374 | name = "pin-utils" 375 | version = "0.1.0" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 378 | 379 | [[package]] 380 | name = "proc-macro-error" 381 | version = "1.0.4" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 384 | dependencies = [ 385 | "proc-macro-error-attr", 386 | "proc-macro2", 387 | "quote", 388 | "syn", 389 | "version_check", 390 | ] 391 | 392 | [[package]] 393 | name = "proc-macro-error-attr" 394 | version = "1.0.4" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 397 | dependencies = [ 398 | "proc-macro2", 399 | "quote", 400 | "version_check", 401 | ] 402 | 403 | [[package]] 404 | name = "proc-macro2" 405 | version = "1.0.51" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" 408 | dependencies = [ 409 | "unicode-ident", 410 | ] 411 | 412 | [[package]] 413 | name = "quote" 414 | version = "1.0.23" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 417 | dependencies = [ 418 | "proc-macro2", 419 | ] 420 | 421 | [[package]] 422 | name = "redox_syscall" 423 | version = "0.2.16" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 426 | dependencies = [ 427 | "bitflags", 428 | ] 429 | 430 | [[package]] 431 | name = "reflected" 432 | version = "0.4.6" 433 | dependencies = [ 434 | "env_logger", 435 | "headers", 436 | "hyper", 437 | "log", 438 | "memmap2", 439 | "structopt", 440 | "tempfile", 441 | "tokio", 442 | ] 443 | 444 | [[package]] 445 | name = "rustix" 446 | version = "0.36.8" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" 449 | dependencies = [ 450 | "bitflags", 451 | "errno", 452 | "io-lifetimes", 453 | "libc", 454 | "linux-raw-sys", 455 | "windows-sys 0.45.0", 456 | ] 457 | 458 | [[package]] 459 | name = "sha1" 460 | version = "0.10.5" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" 463 | dependencies = [ 464 | "cfg-if", 465 | "cpufeatures", 466 | "digest", 467 | ] 468 | 469 | [[package]] 470 | name = "socket2" 471 | version = "0.4.7" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 474 | dependencies = [ 475 | "libc", 476 | "winapi", 477 | ] 478 | 479 | [[package]] 480 | name = "structopt" 481 | version = "0.3.26" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" 484 | dependencies = [ 485 | "clap", 486 | "lazy_static", 487 | "structopt-derive", 488 | ] 489 | 490 | [[package]] 491 | name = "structopt-derive" 492 | version = "0.4.18" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" 495 | dependencies = [ 496 | "heck", 497 | "proc-macro-error", 498 | "proc-macro2", 499 | "quote", 500 | "syn", 501 | ] 502 | 503 | [[package]] 504 | name = "syn" 505 | version = "1.0.109" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 508 | dependencies = [ 509 | "proc-macro2", 510 | "quote", 511 | "unicode-ident", 512 | ] 513 | 514 | [[package]] 515 | name = "tempfile" 516 | version = "3.4.0" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" 519 | dependencies = [ 520 | "cfg-if", 521 | "fastrand", 522 | "redox_syscall", 523 | "rustix", 524 | "windows-sys 0.42.0", 525 | ] 526 | 527 | [[package]] 528 | name = "textwrap" 529 | version = "0.11.0" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 532 | dependencies = [ 533 | "unicode-width", 534 | ] 535 | 536 | [[package]] 537 | name = "tokio" 538 | version = "1.26.0" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" 541 | dependencies = [ 542 | "autocfg", 543 | "bytes", 544 | "libc", 545 | "memchr", 546 | "mio", 547 | "pin-project-lite", 548 | "socket2", 549 | "tokio-macros", 550 | "windows-sys 0.45.0", 551 | ] 552 | 553 | [[package]] 554 | name = "tokio-macros" 555 | version = "1.8.2" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" 558 | dependencies = [ 559 | "proc-macro2", 560 | "quote", 561 | "syn", 562 | ] 563 | 564 | [[package]] 565 | name = "tower-service" 566 | version = "0.3.2" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 569 | 570 | [[package]] 571 | name = "tracing" 572 | version = "0.1.37" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 575 | dependencies = [ 576 | "cfg-if", 577 | "pin-project-lite", 578 | "tracing-core", 579 | ] 580 | 581 | [[package]] 582 | name = "tracing-core" 583 | version = "0.1.30" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 586 | dependencies = [ 587 | "once_cell", 588 | ] 589 | 590 | [[package]] 591 | name = "try-lock" 592 | version = "0.2.4" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 595 | 596 | [[package]] 597 | name = "typenum" 598 | version = "1.16.0" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 601 | 602 | [[package]] 603 | name = "unicode-ident" 604 | version = "1.0.6" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 607 | 608 | [[package]] 609 | name = "unicode-segmentation" 610 | version = "1.10.1" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 613 | 614 | [[package]] 615 | name = "unicode-width" 616 | version = "0.1.10" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 619 | 620 | [[package]] 621 | name = "version_check" 622 | version = "0.9.4" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 625 | 626 | [[package]] 627 | name = "want" 628 | version = "0.3.0" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 631 | dependencies = [ 632 | "log", 633 | "try-lock", 634 | ] 635 | 636 | [[package]] 637 | name = "wasi" 638 | version = "0.11.0+wasi-snapshot-preview1" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 641 | 642 | [[package]] 643 | name = "winapi" 644 | version = "0.3.9" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 647 | dependencies = [ 648 | "winapi-i686-pc-windows-gnu", 649 | "winapi-x86_64-pc-windows-gnu", 650 | ] 651 | 652 | [[package]] 653 | name = "winapi-i686-pc-windows-gnu" 654 | version = "0.4.0" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 657 | 658 | [[package]] 659 | name = "winapi-x86_64-pc-windows-gnu" 660 | version = "0.4.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 663 | 664 | [[package]] 665 | name = "windows-sys" 666 | version = "0.42.0" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 669 | dependencies = [ 670 | "windows_aarch64_gnullvm", 671 | "windows_aarch64_msvc", 672 | "windows_i686_gnu", 673 | "windows_i686_msvc", 674 | "windows_x86_64_gnu", 675 | "windows_x86_64_gnullvm", 676 | "windows_x86_64_msvc", 677 | ] 678 | 679 | [[package]] 680 | name = "windows-sys" 681 | version = "0.45.0" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 684 | dependencies = [ 685 | "windows-targets", 686 | ] 687 | 688 | [[package]] 689 | name = "windows-targets" 690 | version = "0.42.1" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" 693 | dependencies = [ 694 | "windows_aarch64_gnullvm", 695 | "windows_aarch64_msvc", 696 | "windows_i686_gnu", 697 | "windows_i686_msvc", 698 | "windows_x86_64_gnu", 699 | "windows_x86_64_gnullvm", 700 | "windows_x86_64_msvc", 701 | ] 702 | 703 | [[package]] 704 | name = "windows_aarch64_gnullvm" 705 | version = "0.42.1" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 708 | 709 | [[package]] 710 | name = "windows_aarch64_msvc" 711 | version = "0.42.1" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 714 | 715 | [[package]] 716 | name = "windows_i686_gnu" 717 | version = "0.42.1" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 720 | 721 | [[package]] 722 | name = "windows_i686_msvc" 723 | version = "0.42.1" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 726 | 727 | [[package]] 728 | name = "windows_x86_64_gnu" 729 | version = "0.42.1" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 732 | 733 | [[package]] 734 | name = "windows_x86_64_gnullvm" 735 | version = "0.42.1" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 738 | 739 | [[package]] 740 | name = "windows_x86_64_msvc" 741 | version = "0.42.1" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 744 | --------------------------------------------------------------------------------