├── .gitignore ├── README.md ├── src ├── key_resolver.rs ├── utils.rs ├── file_entry.rs ├── mmap.rs ├── chan_exec.rs ├── error.rs ├── extract.rs ├── main.rs └── create.rs ├── Cargo.toml ├── LICENSE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # s3ar 2 | 3 | A massively fast S3 downloader/uploader 4 | 5 | The name is derived from "S3 archive". 6 | 7 | ## Usage 8 | 9 | See `s3ar -h`. 10 | -------------------------------------------------------------------------------- /src/key_resolver.rs: -------------------------------------------------------------------------------- 1 | pub fn data_key(s3_prefix: &str, path: &str) -> String { 2 | format!("{}data/{}", s3_prefix, path) 3 | } 4 | 5 | pub fn manifest_key(s3_prefix: &str) -> String { 6 | format!("{}manifest", s3_prefix) 7 | } 8 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "s3ar" 3 | version = "0.1.0" 4 | authors = ["Hidekazu Kobayashi "] 5 | edition = "2018" 6 | license = "MIT" 7 | repository = "https://github.com/cookpad/s3ar" 8 | description = "Massively fast S3 downloader/uploader" 9 | readme = "README.md" 10 | 11 | [dependencies] 12 | rusoto_core = { version = "0.42", default_features = false, features=["rustls"] } 13 | rusoto_s3 = { version = "0.42", default_features = false, features=["rustls"] } 14 | futures-01 = { package = "futures", version = "0.1" } 15 | futures = { version = "0.3", features = ["compat"] } 16 | tokio = { version = "0.2", features = ["full"] } 17 | tokio-compat = { version = "0.1", features = ["rt-full"] } 18 | nix = "0.17" 19 | clap = "2.33" 20 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use std::cmp; 2 | use std::time::Duration; 3 | use std::future::Future; 4 | use tokio::time::delay_for; 5 | 6 | pub async fn with_retry( 7 | retry_max: u32, 8 | wait_base: u32, 9 | wait_max: u32, 10 | mut f: F, 11 | ) -> Result 12 | where 13 | Fut: Future>, 14 | F: FnMut() -> Fut, 15 | { 16 | let mut retry: u32 = 0; 17 | loop { 18 | let e = match f().await { 19 | Ok(r) => { return Ok(r); }, 20 | Err(e) => e, 21 | }; 22 | retry += 1; 23 | if retry > retry_max { 24 | return Err(e); 25 | } 26 | let wait = cmp::min(wait_max, wait_base.pow(retry)); 27 | //eprintln!("RETRY #{} waiting {}secs: {}", retry, wait, e); 28 | delay_for(Duration::from_secs(wait as u64)).await; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © 2020 Cookpad Inc. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /src/file_entry.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | use std::io::SeekFrom; 3 | 4 | use tokio::prelude::*; 5 | use tokio::fs; 6 | 7 | use super::error::Error; 8 | use super::mmap; 9 | 10 | #[derive(Debug, Clone)] 11 | pub struct FileEntry { 12 | path: String, 13 | size: usize, 14 | } 15 | 16 | impl FileEntry { 17 | pub async unsafe fn open(&self) -> Result { 18 | let file = fs::OpenOptions::new() 19 | .read(true) 20 | .write(true) 21 | .create(false) 22 | .open(&self.path) 23 | .await?; 24 | let handle = mmap::Handle::new(file, self.size)?; 25 | Ok(handle) 26 | } 27 | 28 | pub async fn create(&self) -> Result { 29 | if let Some(dir) = Path::new(&self.path).parent() { 30 | fs::create_dir_all(dir).await?; 31 | } 32 | let mut file = fs::OpenOptions::new() 33 | .read(true) 34 | .write(true) 35 | .create_new(true) 36 | .open(&self.path) 37 | .await?; 38 | if self.size > 0 { 39 | file.seek(SeekFrom::Start(self.size as u64 - 1)).await?; 40 | file.write(&[0]).await?; 41 | } 42 | let handle = unsafe { mmap::Handle::new(file, self.size) }?; 43 | Ok(handle) 44 | } 45 | 46 | pub fn new(path: String, size: usize) -> FileEntry { 47 | FileEntry { path, size } 48 | } 49 | 50 | pub fn path(&self) -> &str { 51 | &self.path 52 | } 53 | 54 | pub fn size(&self) -> usize { 55 | self.size 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/mmap.rs: -------------------------------------------------------------------------------- 1 | use std::ptr; 2 | use std::ffi::c_void; 3 | use std::os::unix::io::AsRawFd; 4 | use std::ops::{Deref, DerefMut}; 5 | use std::sync::Arc; 6 | 7 | use nix::sys::mman; 8 | 9 | #[derive(Debug)] 10 | pub struct Handle { 11 | ptr: *mut c_void, 12 | len: usize, 13 | } 14 | 15 | unsafe impl Sync for Handle {} 16 | unsafe impl Send for Handle {} 17 | 18 | impl Handle { 19 | pub unsafe fn new(as_fd: F, len: usize) -> nix::Result 20 | where 21 | F: AsRawFd, 22 | { 23 | if len == 0 { 24 | return Ok(Self { ptr: ptr::null_mut(), len: 0 }); 25 | } 26 | let ptr = mman::mmap( 27 | ptr::null_mut(), 28 | len, 29 | mman::ProtFlags::PROT_READ | mman::ProtFlags::PROT_WRITE, 30 | mman::MapFlags::MAP_SHARED, 31 | as_fd.as_raw_fd(), 32 | 0 33 | )?; 34 | Ok(Self { ptr, len }) 35 | } 36 | } 37 | 38 | impl Drop for Handle { 39 | fn drop(&mut self) { 40 | if self.ptr == ptr::null_mut() { 41 | return; 42 | } 43 | unsafe { 44 | mman::munmap(self.ptr, self.len).expect("failed to munmap"); 45 | } 46 | } 47 | } 48 | 49 | #[derive(Debug)] 50 | pub struct Chunker { 51 | handle: Arc, 52 | offset: usize, 53 | } 54 | 55 | impl Chunker { 56 | pub fn new(handle: Handle) -> Self { 57 | Chunker { 58 | handle: Arc::new(handle), 59 | offset: 0, 60 | } 61 | } 62 | 63 | pub fn size(&self) -> usize { 64 | self.handle.len - self.offset 65 | } 66 | 67 | pub fn take_chunk(&mut self, len: usize) -> Chunk { 68 | assert!(self.size() >= len); 69 | let chunk = Chunk { 70 | handle: self.handle.clone(), 71 | offset: self.offset, 72 | len, 73 | }; 74 | self.offset += len; 75 | return chunk; 76 | } 77 | } 78 | 79 | #[derive(Debug)] 80 | pub struct Chunk { 81 | handle: Arc, 82 | offset: usize, 83 | len: usize, 84 | } 85 | 86 | impl Deref for Chunk { 87 | type Target = [u8]; 88 | fn deref(&self) -> &Self::Target { 89 | if self.len == 0 { 90 | return &[]; 91 | } 92 | unsafe { 93 | let ptr = (self.handle.ptr as *const u8).add(self.offset); 94 | std::slice::from_raw_parts(ptr, self.len) 95 | } 96 | } 97 | } 98 | 99 | impl DerefMut for Chunk { 100 | fn deref_mut(&mut self) -> &mut Self::Target { 101 | if self.len == 0 { 102 | return &mut []; 103 | } 104 | unsafe { 105 | let ptr = (self.handle.ptr as *mut u8).add(self.offset); 106 | std::slice::from_raw_parts_mut(ptr, self.len) 107 | } 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/chan_exec.rs: -------------------------------------------------------------------------------- 1 | use std::error::Error as StdError; 2 | use std::fmt; 3 | 4 | use futures::channel::oneshot; 5 | use futures::prelude::*; 6 | use mpsc::error::SendError as MpscSendError; 7 | use tokio::sync::mpsc; 8 | 9 | pub type Task = future::BoxFuture<'static, S>; 10 | type TaskWithCb = (Task, oneshot::Sender); 11 | type Sender = mpsc::Sender>; 12 | 13 | #[derive(Debug)] 14 | pub enum Error { 15 | Send(MpscSendError), 16 | Recv(oneshot::Canceled), 17 | } 18 | impl fmt::Display for Error 19 | where 20 | Q: fmt::Debug + 'static, 21 | { 22 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 23 | write!(f, "{}", self.source().unwrap()) 24 | } 25 | } 26 | impl StdError for Error 27 | where 28 | Q: fmt::Debug + 'static, 29 | { 30 | fn source(&self) -> Option<&(dyn StdError + 'static)> { 31 | match self { 32 | Self::Send(ref e) => Some(e), 33 | Self::Recv(ref e) => Some(e), 34 | } 35 | } 36 | } 37 | impl From> for Error { 38 | fn from(e: mpsc::error::SendError) -> Self { 39 | Self::Send(e) 40 | } 41 | } 42 | impl From for Error { 43 | fn from(e: oneshot::Canceled) -> Self { 44 | Self::Recv(e) 45 | } 46 | } 47 | 48 | #[derive(Debug)] 49 | pub struct ChanExec { 50 | sender: Sender, 51 | } 52 | 53 | impl Clone for ChanExec { 54 | fn clone(&self) -> Self { 55 | ChanExec { 56 | sender: self.sender.clone(), 57 | } 58 | } 59 | } 60 | 61 | impl ChanExec { 62 | pub async fn execute(&mut self, task: Task) -> Result>> 63 | where 64 | S: 'static, 65 | { 66 | let (tx, rx) = oneshot::channel(); 67 | let paired_req = (task, tx); 68 | self.sender 69 | .send(paired_req) 70 | .await 71 | .map_err(|MpscSendError((req, _tx))| MpscSendError(req))?; 72 | Ok(rx.await?) 73 | } 74 | } 75 | 76 | pub trait Work { 77 | type Fut: std::future::Future; 78 | fn work(&mut self, req: Q) -> Self::Fut; 79 | } 80 | 81 | impl Work for F 82 | where 83 | F: FnMut(Q) -> Fut, 84 | Fut: std::future::Future, 85 | { 86 | type Fut = Fut; 87 | fn work(&mut self, req: Q) -> Self::Fut { 88 | self(req) 89 | } 90 | } 91 | 92 | pub fn create(queue_size: usize) -> ( 93 | ChanExec, 94 | impl Stream>>, 95 | ) { 96 | let (tx, rx) = mpsc::channel::>(queue_size); 97 | let chan_exec = ChanExec { sender: tx }; 98 | let tasks = rx.map(|(task, cb)| async move { 99 | cb.send(task.await) 100 | }); 101 | (chan_exec, tasks) 102 | } 103 | -------------------------------------------------------------------------------- /src/error.rs: -------------------------------------------------------------------------------- 1 | use std::fmt; 2 | use std::error::Error as StdError; 3 | 4 | use tokio::{io, task, sync::mpsc}; 5 | use rusoto_core::RusotoError; 6 | 7 | use super::chan_exec; 8 | 9 | #[derive(Debug)] 10 | pub struct StringError(String); 11 | impl fmt::Display for StringError { 12 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 13 | write!(f, "{}", self.0) 14 | } 15 | } 16 | impl StdError for StringError {} 17 | impl From for StringError { 18 | fn from(s: String) -> StringError { 19 | StringError(s) 20 | } 21 | } 22 | 23 | #[derive(Debug)] 24 | pub struct StaticStrError(&'static str); 25 | impl fmt::Display for StaticStrError { 26 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 27 | write!(f, "{}", self.0) 28 | } 29 | } 30 | impl StdError for StaticStrError {} 31 | impl From<&'static str> for StaticStrError { 32 | fn from(s: &'static str) -> StaticStrError { 33 | StaticStrError(s) 34 | } 35 | } 36 | 37 | #[derive(Debug)] 38 | pub enum Error { 39 | Io(io::Error), 40 | Nix(nix::Error), 41 | ChanExec(chan_exec::Error<()>), 42 | Rusoto(RusotoError), 43 | JoinError(task::JoinError), 44 | String(StringError), 45 | StaticStr(StaticStrError), 46 | } 47 | impl fmt::Display for Error { 48 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 49 | write!(f, "{}", self.source().unwrap()) 50 | } 51 | } 52 | impl StdError for Error { 53 | fn source(&self) -> Option<&(dyn StdError + 'static)> { 54 | match self { 55 | &Self::Io(ref e) => Some(e), 56 | &Self::Nix(ref e) => Some(e), 57 | &Self::ChanExec(ref e) => Some(e), 58 | &Self::Rusoto(ref e) => Some(e), 59 | &Self::JoinError(ref e) => Some(e), 60 | &Self::String(ref e) => Some(e), 61 | &Self::StaticStr(ref e) => Some(e), 62 | } 63 | } 64 | } 65 | impl From for Error { 66 | fn from(e: io::Error) -> Self { 67 | Self::Io(e) 68 | } 69 | } 70 | impl From for Error { 71 | fn from(e: nix::Error) -> Self { 72 | Self::Nix(e) 73 | } 74 | } 75 | impl From> for Error { 76 | fn from(e: chan_exec::Error) -> Self { 77 | use chan_exec::Error as CEError; 78 | use mpsc::error::SendError as MpscSendError; 79 | Self::ChanExec(match e { 80 | CEError::Send(_) => CEError::Send(MpscSendError(())), 81 | CEError::Recv(c) => CEError::Recv(c), 82 | }) 83 | } 84 | } 85 | impl From> for Error 86 | where 87 | E: fmt::Display, 88 | { 89 | fn from(e: RusotoError) -> Self { 90 | Self::Rusoto(match e { 91 | RusotoError::Service(e) => RusotoError::Service(format!("{}", e).into()), 92 | RusotoError::HttpDispatch(e) => RusotoError::HttpDispatch(e), 93 | RusotoError::Credentials(e) => RusotoError::Credentials(e), 94 | RusotoError::Validation(e) => RusotoError::Validation(e), 95 | RusotoError::ParseError(e) => RusotoError::ParseError(e), 96 | RusotoError::Unknown(e) => RusotoError::Unknown(e), 97 | }) 98 | } 99 | } 100 | impl From for Error { 101 | fn from(e: task::JoinError) -> Self { 102 | Self::JoinError(e) 103 | } 104 | } 105 | impl From for Error { 106 | fn from(e: StringError) -> Self { 107 | Self::String(e) 108 | } 109 | } 110 | impl From for Error { 111 | fn from(s: String) -> Self { 112 | Self::String(StringError(s)) 113 | } 114 | } 115 | impl From for Error { 116 | fn from(e: StaticStrError) -> Self { 117 | Self::StaticStr(e) 118 | } 119 | } 120 | impl From<&'static str> for Error { 121 | fn from(e: &'static str) -> Self { 122 | Self::StaticStr(StaticStrError(e)) 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/extract.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | 3 | use futures::compat::*; 4 | use futures::prelude::*; 5 | 6 | use rusoto_s3::{GetObjectOutput, GetObjectRequest, S3Client, S3}; 7 | 8 | use super::file_entry::FileEntry; 9 | use super::key_resolver; 10 | use super::mmap; 11 | use super::utils::with_retry; 12 | use super::Error; 13 | 14 | #[derive(Debug, Clone)] 15 | pub struct ArchiveExtract { 16 | pub file_concurrency: usize, 17 | pub part_concurrency: usize, 18 | pub directory: Option, 19 | pub s3_bucket: String, 20 | pub s3_prefix: String, 21 | } 22 | 23 | pub struct ExtractExecutor { 24 | s3_client: S3Client, 25 | } 26 | 27 | impl ExtractExecutor { 28 | pub fn new(s3_client: S3Client) -> Self { 29 | Self { s3_client } 30 | } 31 | 32 | pub async fn execute( 33 | &self, 34 | ArchiveExtract { 35 | file_concurrency, 36 | part_concurrency, 37 | directory, 38 | s3_bucket, 39 | s3_prefix, 40 | }: ArchiveExtract, 41 | ) -> Result<(), Error> { 42 | if let Some(cwd) = directory { 43 | std::env::set_current_dir(cwd).expect("failed to change current dir"); 44 | } 45 | 46 | let get_object_request = GetObjectRequest { 47 | bucket: s3_bucket.clone(), 48 | key: key_resolver::manifest_key(&s3_prefix), 49 | ..Default::default() 50 | }; 51 | let GetObjectOutput { body, .. } = self 52 | .s3_client 53 | .get_object(get_object_request) 54 | .compat() 55 | .await?; 56 | 57 | let mp_downloader = MultipartDownloadExecutor { 58 | s3_client: self.s3_client.clone(), 59 | }; 60 | let mp_downloader = &mp_downloader; 61 | 62 | body.expect("no manifest content") 63 | .compat() 64 | .into_async_read() 65 | .lines() 66 | .map_err(Error::from) 67 | .and_then(|line| { 68 | async move { 69 | let mut cols = line.split("\t"); 70 | let size = cols.next().unwrap().parse().map_err(|e| format!("{}", e))?; 71 | let path = cols.next().ok_or("no path in manifest")?; 72 | Ok(FileEntry::new(path.to_string(), size)) 73 | } 74 | }) 75 | .map_ok(|entry| { 76 | let s3_prefix = s3_prefix.clone(); 77 | let s3_bucket = s3_bucket.clone(); 78 | 79 | let source_key = key_resolver::data_key(&s3_prefix, entry.path()); 80 | let object_download = ObjectDownload { 81 | source_bucket: s3_bucket, 82 | source_key, 83 | }; 84 | with_retry(10, 1, 5, move || { 85 | mp_downloader.execute(object_download.clone(), entry.clone()) 86 | }) 87 | }) 88 | .try_buffer_unordered(file_concurrency) 89 | .try_flatten() 90 | .try_for_each_concurrent(part_concurrency, |fut| { 91 | async move { 92 | fut.await 93 | } 94 | }) 95 | .await 96 | } 97 | } 98 | 99 | #[derive(Debug, Clone)] 100 | pub struct ObjectDownload { 101 | source_bucket: String, 102 | source_key: String, 103 | } 104 | 105 | pub struct MultipartDownloadExecutor { 106 | s3_client: S3Client, 107 | } 108 | 109 | impl MultipartDownloadExecutor { 110 | async fn execute( 111 | &self, 112 | ObjectDownload { 113 | source_bucket, 114 | source_key, 115 | }: ObjectDownload, 116 | target: FileEntry, 117 | ) -> Result>, Error>>, Error> { 118 | let handle = target.create().await?; 119 | let chunker = mmap::Chunker::new(handle); 120 | let s3 = self.s3_client.clone(); 121 | Ok(stream::try_unfold((chunker, None), move |(mut chunker, state)| { 122 | let s3 = s3.clone(); 123 | let bucket = source_bucket.clone(); 124 | let key = source_key.clone(); 125 | async move { 126 | let (part, parts_count, next_part_number) = 127 | if let Some((part_number, parts_count)) = state { 128 | if part_number > parts_count { 129 | return Ok(None); 130 | } 131 | let part = get_part(&s3, bucket.clone(), key.clone(), part_number).await?; 132 | (part, parts_count, part_number + 1) 133 | } else { 134 | let part = get_part(&s3, bucket.clone(), key.clone(), 1).await?; 135 | let parts_count = part.parts_count.ok_or("no parts count header")?; 136 | (part, parts_count, 2) 137 | }; 138 | let content_length = part.content_length.ok_or("no content length header")?; 139 | let chunk = chunker.take_chunk(content_length as usize); 140 | return Ok::<_, Error>(Some(( 141 | (part, chunk), 142 | (chunker, Some((next_part_number, parts_count))), 143 | ))); 144 | } 145 | }) 146 | .map_ok(|(source, mut target)| { 147 | async move { 148 | let source_read = 149 | source.body.ok_or("no body")?.compat().into_async_read(); 150 | let mut target_write = futures::io::Cursor::new(&mut target[..]); 151 | futures::io::copy(source_read, &mut target_write).await?; 152 | Ok(()) 153 | } 154 | })) 155 | } 156 | } 157 | 158 | async fn get_part( 159 | s3: &S3Client, 160 | bucket: String, 161 | key: String, 162 | part_number: i64, 163 | ) -> Result { 164 | let request = GetObjectRequest { 165 | bucket, 166 | key, 167 | part_number: Some(part_number), 168 | ..Default::default() 169 | }; 170 | let output = s3.get_object(request).compat().await?; 171 | Ok(output) 172 | } 173 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use tokio_compat::runtime; 2 | 3 | use std::env; 4 | use std::str::FromStr; 5 | 6 | use rusoto_core::Region; 7 | 8 | use clap::{App, Arg, ArgMatches, SubCommand}; 9 | 10 | mod chan_exec; 11 | mod create; 12 | mod error; 13 | mod extract; 14 | mod file_entry; 15 | mod key_resolver; 16 | mod mmap; 17 | mod utils; 18 | 19 | use error::Error; 20 | 21 | fn args() -> ArgMatches<'static> { 22 | App::new("s3ar") 23 | .about("Massively fast S3 downloader/uploader") 24 | .arg( 25 | Arg::with_name("directory") 26 | .short("C") 27 | .long("directory") 28 | .value_name("DIR") 29 | .help("Sets the current directory") 30 | .takes_value(true), 31 | ) 32 | .subcommand( 33 | SubCommand::with_name("upload") 34 | .arg( 35 | Arg::with_name("file_concurrency") 36 | .short("F") 37 | .long("file-concurrency") 38 | .value_name("NUM") 39 | .help("Sets the concurrency of files") 40 | .takes_value(true), 41 | ) 42 | .arg( 43 | Arg::with_name("part_concurrency") 44 | .short("P") 45 | .long("part-concurrency") 46 | .value_name("NUM") 47 | .help("Sets the concurrency of parts") 48 | .takes_value(true), 49 | ) 50 | .arg( 51 | Arg::with_name("part_queue_size") 52 | .short("Q") 53 | .long("part-queue-size") 54 | .value_name("NUM") 55 | .help("Sets the size of parts queue") 56 | .takes_value(true), 57 | ) 58 | .arg( 59 | Arg::with_name("part_size") 60 | .short("s") 61 | .long("part-size") 62 | .value_name("SIZE") 63 | .help("Sets the part size in bytes") 64 | .takes_value(true), 65 | ) 66 | .arg( 67 | Arg::with_name("TARGET_BUCKET") 68 | .help("Sets the S3 bucket") 69 | .required(true) 70 | .index(1), 71 | ) 72 | .arg( 73 | Arg::with_name("TARGET_PREFIX") 74 | .help("Sets the S3 prefix") 75 | .required(true) 76 | .index(2), 77 | ) 78 | .arg( 79 | Arg::with_name("FILE") 80 | .help("Sets the files to archive") 81 | .required(true) 82 | .index(3) 83 | .multiple(true), 84 | ), 85 | ) 86 | .subcommand( 87 | SubCommand::with_name("download") 88 | .arg( 89 | Arg::with_name("file_concurrency") 90 | .short("F") 91 | .long("file-concurrency") 92 | .value_name("NUM") 93 | .help("Sets the concurrency of files") 94 | .takes_value(true), 95 | ) 96 | .arg( 97 | Arg::with_name("part_concurrency") 98 | .short("P") 99 | .long("part-concurrency") 100 | .value_name("NUM") 101 | .help("Sets the concurrency of parts") 102 | .takes_value(true), 103 | ) 104 | .arg( 105 | Arg::with_name("SOURCE_BUCKET") 106 | .help("Sets the S3 bucket") 107 | .required(true) 108 | .index(1), 109 | ) 110 | .arg( 111 | Arg::with_name("SOURCE_PREFIX") 112 | .help("Sets the S3 prefix") 113 | .required(true) 114 | .index(2), 115 | ) 116 | ) 117 | .get_matches() 118 | } 119 | 120 | fn main() { 121 | let aws_region = env::var("AWS_REGION") 122 | .map(|v| v.parse()) 123 | .unwrap_or(Ok(Region::ApNortheast1)) 124 | .expect("failed to parse AWS_REGION"); 125 | 126 | let matches = args(); 127 | 128 | let mut rt = runtime::Builder::default() 129 | .core_threads(4) 130 | .build() 131 | .expect("failed to create Runtime"); 132 | 133 | let s3_client = rusoto_s3::S3Client::new(aws_region); 134 | if let Some(sub_matches) = matches.subcommand_matches("upload") { 135 | let creator = create::CreateExecutor::new(s3_client); 136 | let fut = creator.execute(build_archive_create(&matches, &sub_matches)); 137 | rt.block_on_std(fut).expect("failed to execute"); 138 | return; 139 | } 140 | if let Some(sub_matches) = matches.subcommand_matches("download") { 141 | let extractor = extract::ExtractExecutor::new(s3_client); 142 | let fut = extractor.execute(build_archive_extract(&matches, &sub_matches)); 143 | rt.block_on_std(fut).expect("failed to execute"); 144 | return; 145 | } 146 | } 147 | 148 | fn build_archive_create(matches: &ArgMatches, sub_matches: &ArgMatches) -> create::ArchiveCreate { 149 | let directory = matches.value_of_os("directory").map(Into::into); 150 | 151 | let files = sub_matches 152 | .values_of("FILE") 153 | .expect("no files to archive") 154 | .map(Into::into) 155 | .collect(); 156 | 157 | let file_concurrency = sub_matches 158 | .value_of("file_concurrency") 159 | .map(FromStr::from_str) 160 | .unwrap_or(Ok(8)) 161 | .expect("failed to parse file concurrency"); 162 | let part_concurrency = sub_matches 163 | .value_of("part_concurrency") 164 | .map(FromStr::from_str) 165 | .unwrap_or(Ok(8)) 166 | .expect("failed to parse part concurrency"); 167 | let part_queue_size = sub_matches 168 | .value_of("part_queue_size") 169 | .map(FromStr::from_str) 170 | .unwrap_or(Ok(8)) 171 | .expect("failed to parse part queue size"); 172 | let part_size = sub_matches 173 | .value_of("part_size") 174 | .map(FromStr::from_str) 175 | .unwrap_or(Ok(16usize * 1024 * 1024)) 176 | .expect("failed to parse part size"); 177 | 178 | let s3_bucket = sub_matches 179 | .value_of("TARGET_BUCKET") 180 | .expect("no s3 bucket") 181 | .to_string(); 182 | let s3_prefix = sub_matches 183 | .value_of("TARGET_PREFIX") 184 | .expect("no s3 prefix") 185 | .to_string(); 186 | 187 | create::ArchiveCreate { 188 | file_concurrency, 189 | part_concurrency, 190 | part_queue_size, 191 | part_size, 192 | s3_bucket, 193 | s3_prefix, 194 | directory, 195 | files, 196 | } 197 | } 198 | 199 | 200 | fn build_archive_extract(matches: &ArgMatches, sub_matches: &ArgMatches) -> extract::ArchiveExtract { 201 | let directory = matches.value_of_os("directory").map(Into::into); 202 | 203 | let file_concurrency = sub_matches 204 | .value_of("file_concurrency") 205 | .map(FromStr::from_str) 206 | .unwrap_or(Ok(8)) 207 | .expect("failed to parse file concurrency"); 208 | let part_concurrency = sub_matches 209 | .value_of("part_concurrency") 210 | .map(FromStr::from_str) 211 | .unwrap_or(Ok(8)) 212 | .expect("failed to parse part concurrency"); 213 | 214 | let s3_bucket = sub_matches 215 | .value_of("SOURCE_BUCKET") 216 | .expect("no s3 bucket") 217 | .to_string(); 218 | let s3_prefix = sub_matches 219 | .value_of("SOURCE_PREFIX") 220 | .expect("no s3 prefix") 221 | .to_string(); 222 | 223 | extract::ArchiveExtract { 224 | file_concurrency, 225 | part_concurrency, 226 | s3_bucket, 227 | s3_prefix, 228 | directory, 229 | } 230 | } 231 | -------------------------------------------------------------------------------- /src/create.rs: -------------------------------------------------------------------------------- 1 | use std::cmp; 2 | use std::path::PathBuf; 3 | 4 | use future::Either as E; 5 | use futures::compat::*; 6 | use futures::prelude::*; 7 | use tokio::fs; 8 | use tokio::prelude::*; 9 | 10 | use rusoto_core::RusotoError; 11 | use rusoto_s3::{ 12 | CompleteMultipartUploadRequest, CompletedMultipartUpload, CompletedPart, 13 | CreateMultipartUploadOutput, CreateMultipartUploadRequest, PutObjectRequest, S3Client, 14 | UploadPartError, UploadPartOutput, UploadPartRequest, S3, 15 | }; 16 | 17 | use super::chan_exec; 18 | use super::file_entry::FileEntry; 19 | use super::key_resolver; 20 | use super::mmap; 21 | use super::utils::with_retry; 22 | use super::Error; 23 | 24 | pub type PartUploadExecutor = 25 | chan_exec::ChanExec>>; 26 | 27 | #[derive(Debug, Clone)] 28 | pub struct ArchiveCreate { 29 | pub file_concurrency: usize, 30 | pub part_concurrency: usize, 31 | pub part_size: usize, 32 | pub part_queue_size: usize, 33 | pub directory: Option, 34 | pub s3_bucket: String, 35 | pub s3_prefix: String, 36 | pub files: Vec, 37 | } 38 | 39 | pub struct CreateExecutor { 40 | s3_client: S3Client, 41 | } 42 | 43 | impl CreateExecutor { 44 | pub fn new(s3_client: S3Client) -> Self { 45 | Self { s3_client } 46 | } 47 | 48 | pub async fn execute( 49 | &self, 50 | ArchiveCreate { 51 | file_concurrency, 52 | part_concurrency, 53 | part_size, 54 | part_queue_size, 55 | directory, 56 | s3_bucket, 57 | s3_prefix, 58 | files, 59 | }: ArchiveCreate, 60 | ) -> Result<(), Error> { 61 | let (part_uploader, part_upload_tasks) = chan_exec::create(part_queue_size); 62 | let mp_uploader = MultipartUploadExecutor { 63 | s3_client: self.s3_client.clone(), 64 | part_uploader, 65 | }; 66 | let main = MainExecutor { 67 | s3_client: self.s3_client.clone(), 68 | mp_uploader, 69 | file_concurrency, 70 | part_size, 71 | }; 72 | let main_fut = async move { 73 | // Move main into async block and drop it after await 74 | // because the future won't get completed 75 | // if the ChanExec which main holds were not dropeed 76 | main.execute(s3_bucket, s3_prefix, directory, files).await 77 | }; 78 | let part_upload_fut = part_upload_tasks 79 | .map(Ok) 80 | .try_for_each_concurrent(part_concurrency, |fut| { 81 | fut.map_err(|e| format!("{:?}", e).into()) 82 | }); 83 | future::try_join(main_fut, part_upload_fut) 84 | .await 85 | .map(|_| ()) 86 | } 87 | } 88 | 89 | pub struct MainExecutor { 90 | s3_client: S3Client, 91 | mp_uploader: MultipartUploadExecutor, 92 | file_concurrency: usize, 93 | part_size: usize, 94 | } 95 | 96 | impl MainExecutor { 97 | pub async fn execute( 98 | &self, 99 | s3_bucket: String, 100 | s3_prefix: String, 101 | directory: Option, 102 | files: Vec, 103 | ) -> Result<(), Error> { 104 | if let Some(cwd) = directory { 105 | std::env::set_current_dir(cwd).expect("failed to change current dir"); 106 | } 107 | 108 | let manifest = stream::iter(files) 109 | .map(read_dir_recur) 110 | .flatten() 111 | .map_err(Error::from) 112 | .map_ok(|entry| { 113 | async { 114 | let object_upload = ObjectUpload { 115 | target_bucket: s3_bucket.clone(), 116 | target_key: key_resolver::data_key(&s3_prefix, entry.path()), 117 | }; 118 | self.mp_uploader 119 | .execute(self.part_size, object_upload, entry.clone()) 120 | .await?; 121 | Ok(entry) 122 | } 123 | }) 124 | .try_buffer_unordered(self.file_concurrency) 125 | .try_fold(Vec::::new(), |mut manifest, entry| { 126 | manifest.extend_from_slice(format!("{}\t", entry.size()).as_bytes()); 127 | manifest.extend_from_slice(entry.path().as_bytes()); 128 | manifest.push(b'\n'); 129 | async move { Ok(manifest) } 130 | }) 131 | .await?; 132 | 133 | let put_object_request = PutObjectRequest { 134 | bucket: s3_bucket.clone(), 135 | key: key_resolver::manifest_key(&s3_prefix), 136 | body: Some(manifest.into()), 137 | ..Default::default() 138 | }; 139 | self.s3_client 140 | .put_object(put_object_request) 141 | .compat() 142 | .await?; 143 | Ok(()) 144 | } 145 | } 146 | 147 | #[derive(Clone)] 148 | pub struct MultipartUploadExecutor { 149 | s3_client: S3Client, 150 | part_uploader: PartUploadExecutor, 151 | } 152 | 153 | impl MultipartUploadExecutor { 154 | async fn execute( 155 | &self, 156 | part_size: usize, 157 | object_upload: ObjectUpload, 158 | source: FileEntry, 159 | ) -> Result<(), Error> { 160 | let body = unsafe { source.open() }.await?; 161 | let mp_start = MultipartUploadStart::new(object_upload); 162 | let CreateMultipartUploadOutput { upload_id, .. } = with_retry(10, 1, 5, || { 163 | self.s3_client 164 | .create_multipart_upload(mp_start.start()) 165 | .compat() 166 | }) 167 | .await?; 168 | let mp = mp_start.started(upload_id.expect("no upload_id in response")); 169 | let part_bodies = MultipartUpload::parts(part_size, body); 170 | let part_bodies_with_number = part_bodies.enumerate().map(|(i, b)| (i as i64 + 1, b)); 171 | let mut completed_parts: Vec<_> = stream::iter(part_bodies_with_number) 172 | .map(Ok::<_, Error>) 173 | .map_ok(|(part_number, part_body)| { 174 | let mut exec = self.part_uploader.clone(); 175 | let s3_client = self.s3_client.clone(); 176 | let mp = mp.clone(); 177 | async move { 178 | let UploadPartOutput { e_tag, .. } = exec 179 | .execute( 180 | with_retry(10, 1, 5, move || { 181 | let req = mp.upload_part(part_number, &part_body); 182 | s3_client.upload_part(req).compat() 183 | }) 184 | .boxed(), 185 | ) 186 | .await??; 187 | let part_number = Some(part_number); 188 | Ok(CompletedPart { e_tag, part_number }) 189 | } 190 | }) 191 | .try_buffer_unordered(8) 192 | .try_collect() 193 | .await?; 194 | 195 | completed_parts.sort_by_key(|part| part.part_number); 196 | 197 | with_retry(10, 1, 5, move || { 198 | self.s3_client 199 | .complete_multipart_upload(mp.complete((&completed_parts).clone())) 200 | .compat() 201 | }) 202 | .await?; 203 | Ok(()) 204 | } 205 | } 206 | 207 | pub fn read_dir_recur(dir: PathBuf) -> stream::BoxStream<'static, io::Result> { 208 | fs::read_dir(dir) 209 | .try_flatten_stream() 210 | .and_then(|entry| { 211 | async move { 212 | let metadata = entry.metadata().await?; 213 | let path = entry.path(); 214 | if metadata.is_dir() { 215 | return Ok(E::Left(E::Left(read_dir_recur(path)))); 216 | } else if metadata.is_file() { 217 | let size = metadata.len() as usize; 218 | return Ok(E::Left(E::Right(stream::once(async move { 219 | // do panic simply if file path contains non-UTF-8 strings 220 | // because it's very rare and it doesn't have to be care 221 | let path_string = path 222 | .to_str() 223 | .expect("non-UTF-8 strings in path") 224 | .to_string(); 225 | Ok(FileEntry::new(path_string, size)) 226 | })))); 227 | } 228 | Ok(E::Right(stream::empty())) 229 | } 230 | }) 231 | .try_flatten() 232 | .boxed() 233 | } 234 | 235 | #[derive(Debug, Clone)] 236 | pub struct ObjectUpload { 237 | target_bucket: String, 238 | target_key: String, 239 | } 240 | 241 | pub struct MultipartUploadStart { 242 | obj: ObjectUpload, 243 | } 244 | 245 | impl MultipartUploadStart { 246 | pub fn new(obj: ObjectUpload) -> MultipartUploadStart { 247 | MultipartUploadStart { obj } 248 | } 249 | 250 | pub fn start(&self) -> CreateMultipartUploadRequest { 251 | CreateMultipartUploadRequest { 252 | bucket: self.obj.target_bucket.clone(), 253 | key: self.obj.target_key.clone(), 254 | ..Default::default() 255 | } 256 | } 257 | 258 | pub fn started(self, upload_id: String) -> MultipartUpload { 259 | MultipartUpload { 260 | obj: self.obj, 261 | upload_id, 262 | } 263 | } 264 | } 265 | 266 | #[derive(Clone)] 267 | pub struct MultipartUpload { 268 | obj: ObjectUpload, 269 | upload_id: String, 270 | } 271 | 272 | impl MultipartUpload { 273 | pub fn parts(part_size: usize, mmap_handle: mmap::Handle) -> PartUploadBodies { 274 | let mmap_chunker = Some(mmap::Chunker::new(mmap_handle)); 275 | PartUploadBodies { 276 | part_size, 277 | mmap_chunker, 278 | } 279 | } 280 | 281 | pub fn upload_part(&self, part_number: i64, body: &mmap::Chunk) -> UploadPartRequest { 282 | UploadPartRequest { 283 | body: Some(body.to_vec().into()), 284 | bucket: self.obj.target_bucket.clone(), 285 | key: self.obj.target_key.clone(), 286 | content_length: Some(body.len() as i64), 287 | part_number, 288 | upload_id: self.upload_id.clone(), 289 | ..Default::default() 290 | } 291 | } 292 | 293 | pub fn complete(&self, parts: Vec) -> CompleteMultipartUploadRequest { 294 | CompleteMultipartUploadRequest { 295 | bucket: self.obj.target_bucket.clone(), 296 | key: self.obj.target_key.clone(), 297 | multipart_upload: Some(CompletedMultipartUpload { parts: Some(parts) }), 298 | upload_id: self.upload_id.clone(), 299 | ..Default::default() 300 | } 301 | } 302 | } 303 | 304 | pub struct PartUploadBodies { 305 | part_size: usize, 306 | mmap_chunker: Option, 307 | } 308 | 309 | impl Iterator for PartUploadBodies { 310 | type Item = mmap::Chunk; 311 | fn next(&mut self) -> Option { 312 | let mmap_chunker = match &mut self.mmap_chunker { 313 | Some(ref mut c) => c, 314 | None => { 315 | return None; 316 | } 317 | }; 318 | let len = cmp::min(self.part_size, mmap_chunker.size()); 319 | let mmap_chunk = mmap_chunker.take_chunk(len); 320 | if mmap_chunker.size() == 0 { 321 | self.mmap_chunker = None; 322 | } 323 | Some(mmap_chunk) 324 | } 325 | } 326 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "aho-corasick" 5 | version = "0.7.7" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | dependencies = [ 8 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "ansi_term" 13 | version = "0.11.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | dependencies = [ 16 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 17 | ] 18 | 19 | [[package]] 20 | name = "anyhow" 21 | version = "1.0.26" 22 | source = "registry+https://github.com/rust-lang/crates.io-index" 23 | 24 | [[package]] 25 | name = "arc-swap" 26 | version = "0.4.4" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | 29 | [[package]] 30 | name = "arrayref" 31 | version = "0.3.6" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | 34 | [[package]] 35 | name = "arrayvec" 36 | version = "0.5.1" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | 39 | [[package]] 40 | name = "atty" 41 | version = "0.2.14" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | dependencies = [ 44 | "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 45 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 46 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 47 | ] 48 | 49 | [[package]] 50 | name = "autocfg" 51 | version = "0.1.7" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | 54 | [[package]] 55 | name = "autocfg" 56 | version = "1.0.0" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | 59 | [[package]] 60 | name = "base64" 61 | version = "0.10.1" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | dependencies = [ 64 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 65 | ] 66 | 67 | [[package]] 68 | name = "base64" 69 | version = "0.11.0" 70 | source = "registry+https://github.com/rust-lang/crates.io-index" 71 | 72 | [[package]] 73 | name = "bitflags" 74 | version = "1.2.1" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | 77 | [[package]] 78 | name = "blake2b_simd" 79 | version = "0.5.10" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | dependencies = [ 82 | "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 83 | "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 84 | "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 85 | ] 86 | 87 | [[package]] 88 | name = "block-buffer" 89 | version = "0.7.3" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | dependencies = [ 92 | "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 93 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 94 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 95 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 96 | ] 97 | 98 | [[package]] 99 | name = "block-padding" 100 | version = "0.1.5" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | dependencies = [ 103 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 104 | ] 105 | 106 | [[package]] 107 | name = "bumpalo" 108 | version = "3.2.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | 111 | [[package]] 112 | name = "byte-tools" 113 | version = "0.3.1" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | 116 | [[package]] 117 | name = "byteorder" 118 | version = "1.3.2" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | 121 | [[package]] 122 | name = "bytes" 123 | version = "0.4.12" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | dependencies = [ 126 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 127 | "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 128 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 129 | ] 130 | 131 | [[package]] 132 | name = "bytes" 133 | version = "0.5.4" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | 136 | [[package]] 137 | name = "cc" 138 | version = "1.0.50" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | 141 | [[package]] 142 | name = "cfg-if" 143 | version = "0.1.10" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | 146 | [[package]] 147 | name = "chrono" 148 | version = "0.4.10" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | dependencies = [ 151 | "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 152 | "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 153 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 154 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 155 | ] 156 | 157 | [[package]] 158 | name = "clap" 159 | version = "2.33.0" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | dependencies = [ 162 | "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 163 | "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", 164 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 165 | "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 166 | "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 167 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 168 | "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 169 | ] 170 | 171 | [[package]] 172 | name = "cloudabi" 173 | version = "0.0.3" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | dependencies = [ 176 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 177 | ] 178 | 179 | [[package]] 180 | name = "constant_time_eq" 181 | version = "0.1.5" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | 184 | [[package]] 185 | name = "crossbeam-deque" 186 | version = "0.7.2" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | dependencies = [ 189 | "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 190 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 191 | ] 192 | 193 | [[package]] 194 | name = "crossbeam-epoch" 195 | version = "0.8.0" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | dependencies = [ 198 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 199 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 200 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 201 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 202 | "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 203 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 204 | ] 205 | 206 | [[package]] 207 | name = "crossbeam-queue" 208 | version = "0.1.2" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | dependencies = [ 211 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 212 | ] 213 | 214 | [[package]] 215 | name = "crossbeam-utils" 216 | version = "0.6.6" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | dependencies = [ 219 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 220 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 221 | ] 222 | 223 | [[package]] 224 | name = "crossbeam-utils" 225 | version = "0.7.0" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | dependencies = [ 228 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 229 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 230 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 231 | ] 232 | 233 | [[package]] 234 | name = "crypto-mac" 235 | version = "0.7.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | dependencies = [ 238 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 239 | "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 240 | ] 241 | 242 | [[package]] 243 | name = "ct-logs" 244 | version = "0.6.0" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | dependencies = [ 247 | "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 248 | ] 249 | 250 | [[package]] 251 | name = "digest" 252 | version = "0.8.1" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | dependencies = [ 255 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 256 | ] 257 | 258 | [[package]] 259 | name = "dirs" 260 | version = "1.0.5" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | dependencies = [ 263 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 264 | "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 265 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 266 | ] 267 | 268 | [[package]] 269 | name = "either" 270 | version = "1.5.3" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | 273 | [[package]] 274 | name = "fake-simd" 275 | version = "0.1.2" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | 278 | [[package]] 279 | name = "fnv" 280 | version = "1.0.6" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | 283 | [[package]] 284 | name = "fuchsia-zircon" 285 | version = "0.3.3" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | dependencies = [ 288 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 289 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 290 | ] 291 | 292 | [[package]] 293 | name = "fuchsia-zircon-sys" 294 | version = "0.3.3" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | 297 | [[package]] 298 | name = "futures" 299 | version = "0.1.29" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | 302 | [[package]] 303 | name = "futures" 304 | version = "0.3.2" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | dependencies = [ 307 | "futures-channel 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 308 | "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 309 | "futures-executor 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 310 | "futures-io 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 311 | "futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 312 | "futures-task 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 313 | "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 314 | ] 315 | 316 | [[package]] 317 | name = "futures-channel" 318 | version = "0.3.2" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | dependencies = [ 321 | "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 322 | "futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 323 | ] 324 | 325 | [[package]] 326 | name = "futures-core" 327 | version = "0.3.2" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | 330 | [[package]] 331 | name = "futures-cpupool" 332 | version = "0.1.8" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | dependencies = [ 335 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 336 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 337 | ] 338 | 339 | [[package]] 340 | name = "futures-executor" 341 | version = "0.3.2" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | dependencies = [ 344 | "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 345 | "futures-task 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 346 | "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 347 | ] 348 | 349 | [[package]] 350 | name = "futures-io" 351 | version = "0.3.2" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | 354 | [[package]] 355 | name = "futures-macro" 356 | version = "0.3.2" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | dependencies = [ 359 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 360 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 361 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 362 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 363 | ] 364 | 365 | [[package]] 366 | name = "futures-sink" 367 | version = "0.3.2" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | 370 | [[package]] 371 | name = "futures-task" 372 | version = "0.3.2" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | 375 | [[package]] 376 | name = "futures-util" 377 | version = "0.3.2" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | dependencies = [ 380 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 381 | "futures-channel 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 382 | "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 383 | "futures-io 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 384 | "futures-macro 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 385 | "futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 386 | "futures-task 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 387 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 388 | "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", 389 | "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", 390 | "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 391 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 392 | ] 393 | 394 | [[package]] 395 | name = "generic-array" 396 | version = "0.12.3" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | dependencies = [ 399 | "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", 400 | ] 401 | 402 | [[package]] 403 | name = "getrandom" 404 | version = "0.1.14" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | dependencies = [ 407 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 408 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 409 | "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", 410 | ] 411 | 412 | [[package]] 413 | name = "h2" 414 | version = "0.1.26" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | dependencies = [ 417 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 418 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 419 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 420 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 421 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 422 | "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 423 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 424 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 425 | "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 426 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 427 | ] 428 | 429 | [[package]] 430 | name = "heck" 431 | version = "0.3.1" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | dependencies = [ 434 | "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 435 | ] 436 | 437 | [[package]] 438 | name = "hermit-abi" 439 | version = "0.1.6" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | dependencies = [ 442 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 443 | ] 444 | 445 | [[package]] 446 | name = "hex" 447 | version = "0.4.0" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | 450 | [[package]] 451 | name = "hmac" 452 | version = "0.7.1" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | dependencies = [ 455 | "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 456 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 457 | ] 458 | 459 | [[package]] 460 | name = "http" 461 | version = "0.1.21" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | dependencies = [ 464 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 467 | ] 468 | 469 | [[package]] 470 | name = "http-body" 471 | version = "0.1.0" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | dependencies = [ 474 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 475 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 476 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 477 | "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 478 | ] 479 | 480 | [[package]] 481 | name = "httparse" 482 | version = "1.3.4" 483 | source = "registry+https://github.com/rust-lang/crates.io-index" 484 | 485 | [[package]] 486 | name = "hyper" 487 | version = "0.12.35" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | dependencies = [ 490 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 491 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 492 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 493 | "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", 494 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 495 | "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 496 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 497 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 498 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 499 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 500 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 501 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 502 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 503 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 504 | "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 505 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 506 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 507 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 508 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 509 | "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 510 | "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", 511 | "want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 512 | ] 513 | 514 | [[package]] 515 | name = "hyper-rustls" 516 | version = "0.17.1" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | dependencies = [ 519 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 520 | "ct-logs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 521 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 522 | "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", 523 | "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", 524 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 525 | "tokio-rustls 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", 526 | "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", 527 | "webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", 528 | ] 529 | 530 | [[package]] 531 | name = "indexmap" 532 | version = "1.3.1" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | dependencies = [ 535 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 536 | ] 537 | 538 | [[package]] 539 | name = "iovec" 540 | version = "0.1.4" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | dependencies = [ 543 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 544 | ] 545 | 546 | [[package]] 547 | name = "itoa" 548 | version = "0.4.5" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | 551 | [[package]] 552 | name = "js-sys" 553 | version = "0.3.35" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | dependencies = [ 556 | "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 557 | ] 558 | 559 | [[package]] 560 | name = "kernel32-sys" 561 | version = "0.2.2" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | dependencies = [ 564 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 565 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 566 | ] 567 | 568 | [[package]] 569 | name = "lazy_static" 570 | version = "1.4.0" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | 573 | [[package]] 574 | name = "libc" 575 | version = "0.2.66" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | 578 | [[package]] 579 | name = "lock_api" 580 | version = "0.3.3" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | dependencies = [ 583 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 584 | ] 585 | 586 | [[package]] 587 | name = "log" 588 | version = "0.4.8" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | dependencies = [ 591 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 592 | ] 593 | 594 | [[package]] 595 | name = "maybe-uninit" 596 | version = "2.0.0" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | 599 | [[package]] 600 | name = "md5" 601 | version = "0.7.0" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | 604 | [[package]] 605 | name = "memchr" 606 | version = "2.3.0" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | 609 | [[package]] 610 | name = "memoffset" 611 | version = "0.5.3" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | dependencies = [ 614 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 615 | ] 616 | 617 | [[package]] 618 | name = "mio" 619 | version = "0.6.21" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | dependencies = [ 622 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 623 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 624 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 625 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 626 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 627 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 628 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 629 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 630 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 631 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 632 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 633 | ] 634 | 635 | [[package]] 636 | name = "mio-named-pipes" 637 | version = "0.1.6" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | dependencies = [ 640 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 641 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 642 | "miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 643 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 644 | ] 645 | 646 | [[package]] 647 | name = "mio-uds" 648 | version = "0.6.7" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | dependencies = [ 651 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 652 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 653 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 654 | ] 655 | 656 | [[package]] 657 | name = "miow" 658 | version = "0.2.1" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | dependencies = [ 661 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 662 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 663 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 664 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 665 | ] 666 | 667 | [[package]] 668 | name = "miow" 669 | version = "0.3.3" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | dependencies = [ 672 | "socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", 673 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 674 | ] 675 | 676 | [[package]] 677 | name = "net2" 678 | version = "0.2.33" 679 | source = "registry+https://github.com/rust-lang/crates.io-index" 680 | dependencies = [ 681 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 682 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 683 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 684 | ] 685 | 686 | [[package]] 687 | name = "nix" 688 | version = "0.17.0" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | dependencies = [ 691 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 692 | "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", 693 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 694 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 695 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 696 | ] 697 | 698 | [[package]] 699 | name = "nom" 700 | version = "4.2.3" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | dependencies = [ 703 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 704 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 705 | ] 706 | 707 | [[package]] 708 | name = "num-integer" 709 | version = "0.1.42" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | dependencies = [ 712 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 713 | "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 714 | ] 715 | 716 | [[package]] 717 | name = "num-traits" 718 | version = "0.2.11" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | dependencies = [ 721 | "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 722 | ] 723 | 724 | [[package]] 725 | name = "num_cpus" 726 | version = "1.12.0" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | dependencies = [ 729 | "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 730 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 731 | ] 732 | 733 | [[package]] 734 | name = "opaque-debug" 735 | version = "0.2.3" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | 738 | [[package]] 739 | name = "parking_lot" 740 | version = "0.9.0" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | dependencies = [ 743 | "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 744 | "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 745 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 746 | ] 747 | 748 | [[package]] 749 | name = "parking_lot_core" 750 | version = "0.6.2" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | dependencies = [ 753 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 754 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 755 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 756 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 757 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 758 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 759 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 760 | ] 761 | 762 | [[package]] 763 | name = "percent-encoding" 764 | version = "2.1.0" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | 767 | [[package]] 768 | name = "pin-project-lite" 769 | version = "0.1.4" 770 | source = "registry+https://github.com/rust-lang/crates.io-index" 771 | 772 | [[package]] 773 | name = "pin-utils" 774 | version = "0.1.0-alpha.4" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | 777 | [[package]] 778 | name = "proc-macro-hack" 779 | version = "0.5.11" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | dependencies = [ 782 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 783 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 784 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 785 | ] 786 | 787 | [[package]] 788 | name = "proc-macro-nested" 789 | version = "0.1.3" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | 792 | [[package]] 793 | name = "proc-macro2" 794 | version = "1.0.8" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | dependencies = [ 797 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 798 | ] 799 | 800 | [[package]] 801 | name = "quote" 802 | version = "1.0.2" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | dependencies = [ 805 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 806 | ] 807 | 808 | [[package]] 809 | name = "redox_syscall" 810 | version = "0.1.56" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | 813 | [[package]] 814 | name = "redox_users" 815 | version = "0.3.4" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | dependencies = [ 818 | "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 819 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 820 | "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 821 | ] 822 | 823 | [[package]] 824 | name = "regex" 825 | version = "1.3.4" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | dependencies = [ 828 | "aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", 829 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 830 | "regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", 831 | "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 832 | ] 833 | 834 | [[package]] 835 | name = "regex-syntax" 836 | version = "0.6.14" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | 839 | [[package]] 840 | name = "ring" 841 | version = "0.16.11" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | dependencies = [ 844 | "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", 845 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 846 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 847 | "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 848 | "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 849 | "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 850 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 851 | ] 852 | 853 | [[package]] 854 | name = "rusoto_core" 855 | version = "0.42.0" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | dependencies = [ 858 | "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 859 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 860 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 861 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 862 | "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", 863 | "hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", 864 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 865 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 866 | "rusoto_credential 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)", 867 | "rusoto_signature 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)", 868 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 869 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 870 | "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 871 | "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", 872 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 873 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 874 | "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", 875 | "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 876 | ] 877 | 878 | [[package]] 879 | name = "rusoto_credential" 880 | version = "0.42.0" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | dependencies = [ 883 | "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 884 | "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 885 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 886 | "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", 887 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 888 | "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 889 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 890 | "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 891 | "serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)", 892 | "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 893 | "tokio-process 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 894 | "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", 895 | ] 896 | 897 | [[package]] 898 | name = "rusoto_s3" 899 | version = "0.42.0" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | dependencies = [ 902 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 903 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 904 | "rusoto_core 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)", 905 | "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 906 | ] 907 | 908 | [[package]] 909 | name = "rusoto_signature" 910 | version = "0.42.0" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | dependencies = [ 913 | "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 914 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 915 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 916 | "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 917 | "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 918 | "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", 919 | "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", 920 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 921 | "md5 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 922 | "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 923 | "rusoto_credential 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)", 924 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 925 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 926 | "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 927 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 928 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 929 | ] 930 | 931 | [[package]] 932 | name = "rust-argon2" 933 | version = "0.7.0" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | dependencies = [ 936 | "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 937 | "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", 938 | "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 939 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 940 | ] 941 | 942 | [[package]] 943 | name = "rustc_version" 944 | version = "0.2.3" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | dependencies = [ 947 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 948 | ] 949 | 950 | [[package]] 951 | name = "rustls" 952 | version = "0.16.0" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | dependencies = [ 955 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 956 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 957 | "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", 958 | "sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 959 | "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", 960 | ] 961 | 962 | [[package]] 963 | name = "ryu" 964 | version = "1.0.2" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | 967 | [[package]] 968 | name = "s3ar" 969 | version = "0.1.0" 970 | dependencies = [ 971 | "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", 972 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 973 | "futures 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 974 | "nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", 975 | "rusoto_core 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)", 976 | "rusoto_s3 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)", 977 | "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 978 | "tokio-compat 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 979 | ] 980 | 981 | [[package]] 982 | name = "scopeguard" 983 | version = "1.0.0" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | 986 | [[package]] 987 | name = "sct" 988 | version = "0.6.0" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | dependencies = [ 991 | "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", 992 | "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 993 | ] 994 | 995 | [[package]] 996 | name = "semver" 997 | version = "0.9.0" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | dependencies = [ 1000 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1001 | ] 1002 | 1003 | [[package]] 1004 | name = "semver-parser" 1005 | version = "0.7.0" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | 1008 | [[package]] 1009 | name = "serde" 1010 | version = "1.0.104" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | 1013 | [[package]] 1014 | name = "serde_derive" 1015 | version = "1.0.104" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | dependencies = [ 1018 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1019 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1020 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1021 | ] 1022 | 1023 | [[package]] 1024 | name = "serde_json" 1025 | version = "1.0.46" 1026 | source = "registry+https://github.com/rust-lang/crates.io-index" 1027 | dependencies = [ 1028 | "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", 1029 | "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1030 | "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "sha2" 1035 | version = "0.8.1" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | dependencies = [ 1038 | "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1039 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1040 | "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1041 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1042 | ] 1043 | 1044 | [[package]] 1045 | name = "shlex" 1046 | version = "0.1.1" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | 1049 | [[package]] 1050 | name = "signal-hook" 1051 | version = "0.1.13" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | dependencies = [ 1054 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1055 | "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "signal-hook-registry" 1060 | version = "1.2.0" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | dependencies = [ 1063 | "arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 1064 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "slab" 1069 | version = "0.4.2" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | 1072 | [[package]] 1073 | name = "smallvec" 1074 | version = "0.6.13" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | dependencies = [ 1077 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "socket2" 1082 | version = "0.3.11" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | dependencies = [ 1085 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1086 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1087 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1088 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "sourcefile" 1093 | version = "0.1.4" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | 1096 | [[package]] 1097 | name = "spin" 1098 | version = "0.5.2" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | 1101 | [[package]] 1102 | name = "string" 1103 | version = "0.2.1" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | dependencies = [ 1106 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "strsim" 1111 | version = "0.8.0" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | 1114 | [[package]] 1115 | name = "subtle" 1116 | version = "1.0.0" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | 1119 | [[package]] 1120 | name = "syn" 1121 | version = "1.0.14" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | dependencies = [ 1124 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1125 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1126 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1127 | ] 1128 | 1129 | [[package]] 1130 | name = "textwrap" 1131 | version = "0.11.0" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | dependencies = [ 1134 | "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "thread_local" 1139 | version = "1.0.1" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | dependencies = [ 1142 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "time" 1147 | version = "0.1.42" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | dependencies = [ 1150 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1151 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1152 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1153 | ] 1154 | 1155 | [[package]] 1156 | name = "tokio" 1157 | version = "0.1.22" 1158 | source = "registry+https://github.com/rust-lang/crates.io-index" 1159 | dependencies = [ 1160 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1161 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1162 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1163 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 1164 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1165 | "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1166 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1167 | "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1168 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1169 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1170 | "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1171 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1172 | "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 1173 | "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", 1174 | "tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1175 | "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "tokio" 1180 | version = "0.2.11" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | dependencies = [ 1183 | "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 1184 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1185 | "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1186 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1187 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1188 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1189 | "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1190 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1191 | "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1192 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1193 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 1194 | "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1195 | "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1196 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1197 | "tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 1198 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1199 | ] 1200 | 1201 | [[package]] 1202 | name = "tokio-buf" 1203 | version = "0.1.1" 1204 | source = "registry+https://github.com/rust-lang/crates.io-index" 1205 | dependencies = [ 1206 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1207 | "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 1208 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1209 | ] 1210 | 1211 | [[package]] 1212 | name = "tokio-codec" 1213 | version = "0.1.1" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | dependencies = [ 1216 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1217 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1218 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "tokio-compat" 1223 | version = "0.1.4" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | dependencies = [ 1226 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1227 | "futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1228 | "futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1229 | "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1230 | "tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 1231 | "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1232 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1233 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1234 | "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", 1235 | ] 1236 | 1237 | [[package]] 1238 | name = "tokio-current-thread" 1239 | version = "0.1.6" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | dependencies = [ 1242 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1243 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "tokio-executor" 1248 | version = "0.1.9" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | dependencies = [ 1251 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1252 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "tokio-fs" 1257 | version = "0.1.6" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | dependencies = [ 1260 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1261 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1262 | "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 1263 | ] 1264 | 1265 | [[package]] 1266 | name = "tokio-io" 1267 | version = "0.1.12" 1268 | source = "registry+https://github.com/rust-lang/crates.io-index" 1269 | dependencies = [ 1270 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1271 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1272 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "tokio-macros" 1277 | version = "0.2.4" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | dependencies = [ 1280 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1281 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1282 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1283 | ] 1284 | 1285 | [[package]] 1286 | name = "tokio-process" 1287 | version = "0.2.4" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | dependencies = [ 1290 | "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1291 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1292 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1293 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1294 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1295 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1296 | "mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1297 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1298 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1299 | "tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 1300 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "tokio-reactor" 1305 | version = "0.1.11" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | dependencies = [ 1308 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1309 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1310 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1311 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1312 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1313 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 1314 | "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1315 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1316 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1317 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1318 | "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1319 | ] 1320 | 1321 | [[package]] 1322 | name = "tokio-rustls" 1323 | version = "0.10.3" 1324 | source = "registry+https://github.com/rust-lang/crates.io-index" 1325 | dependencies = [ 1326 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1327 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1328 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1329 | "rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", 1330 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1331 | "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", 1332 | ] 1333 | 1334 | [[package]] 1335 | name = "tokio-signal" 1336 | version = "0.2.7" 1337 | source = "registry+https://github.com/rust-lang/crates.io-index" 1338 | dependencies = [ 1339 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1340 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1341 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1342 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1343 | "signal-hook 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1344 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1345 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1346 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1347 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "tokio-sync" 1352 | version = "0.1.7" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | dependencies = [ 1355 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1356 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "tokio-tcp" 1361 | version = "0.1.3" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | dependencies = [ 1364 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1365 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1366 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1367 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1368 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1369 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "tokio-threadpool" 1374 | version = "0.1.17" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | dependencies = [ 1377 | "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1378 | "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1379 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1380 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1381 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1382 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1383 | "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", 1384 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1385 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "tokio-timer" 1390 | version = "0.2.12" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | dependencies = [ 1393 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1394 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1395 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "tokio-udp" 1401 | version = "0.1.5" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | dependencies = [ 1404 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1405 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1406 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1407 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1408 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1409 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1410 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "tokio-uds" 1415 | version = "0.2.5" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | dependencies = [ 1418 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1419 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1420 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1421 | "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", 1422 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1423 | "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", 1424 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1425 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1426 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1427 | "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "try-lock" 1432 | version = "0.2.2" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | 1435 | [[package]] 1436 | name = "typenum" 1437 | version = "1.11.2" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | 1440 | [[package]] 1441 | name = "unicode-segmentation" 1442 | version = "1.6.0" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | 1445 | [[package]] 1446 | name = "unicode-width" 1447 | version = "0.1.7" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | 1450 | [[package]] 1451 | name = "unicode-xid" 1452 | version = "0.2.0" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | 1455 | [[package]] 1456 | name = "untrusted" 1457 | version = "0.7.0" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | 1460 | [[package]] 1461 | name = "vec_map" 1462 | version = "0.8.1" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | 1465 | [[package]] 1466 | name = "version_check" 1467 | version = "0.1.5" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | 1470 | [[package]] 1471 | name = "void" 1472 | version = "1.0.2" 1473 | source = "registry+https://github.com/rust-lang/crates.io-index" 1474 | 1475 | [[package]] 1476 | name = "want" 1477 | version = "0.2.0" 1478 | source = "registry+https://github.com/rust-lang/crates.io-index" 1479 | dependencies = [ 1480 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1481 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1482 | "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "wasi" 1487 | version = "0.9.0+wasi-snapshot-preview1" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | 1490 | [[package]] 1491 | name = "wasm-bindgen" 1492 | version = "0.2.58" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | dependencies = [ 1495 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1496 | "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1497 | ] 1498 | 1499 | [[package]] 1500 | name = "wasm-bindgen-backend" 1501 | version = "0.2.58" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | dependencies = [ 1504 | "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1505 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1506 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1507 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1508 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1509 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1510 | "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "wasm-bindgen-macro" 1515 | version = "0.2.58" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | dependencies = [ 1518 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1519 | "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "wasm-bindgen-macro-support" 1524 | version = "0.2.58" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | dependencies = [ 1527 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1528 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1529 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1530 | "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1531 | "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1532 | ] 1533 | 1534 | [[package]] 1535 | name = "wasm-bindgen-shared" 1536 | version = "0.2.58" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | 1539 | [[package]] 1540 | name = "wasm-bindgen-webidl" 1541 | version = "0.2.58" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | dependencies = [ 1544 | "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", 1545 | "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1546 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1547 | "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1548 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1549 | "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", 1550 | "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1551 | "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 1552 | ] 1553 | 1554 | [[package]] 1555 | name = "web-sys" 1556 | version = "0.3.35" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | dependencies = [ 1559 | "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", 1560 | "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", 1561 | "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1562 | "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1563 | "wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", 1564 | ] 1565 | 1566 | [[package]] 1567 | name = "webpki" 1568 | version = "0.21.2" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | dependencies = [ 1571 | "ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)", 1572 | "untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "webpki-roots" 1577 | version = "0.17.0" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | dependencies = [ 1580 | "webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)", 1581 | ] 1582 | 1583 | [[package]] 1584 | name = "weedle" 1585 | version = "0.10.0" 1586 | source = "registry+https://github.com/rust-lang/crates.io-index" 1587 | dependencies = [ 1588 | "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1589 | ] 1590 | 1591 | [[package]] 1592 | name = "winapi" 1593 | version = "0.2.8" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | 1596 | [[package]] 1597 | name = "winapi" 1598 | version = "0.3.8" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | dependencies = [ 1601 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1602 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1603 | ] 1604 | 1605 | [[package]] 1606 | name = "winapi-build" 1607 | version = "0.1.1" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | 1610 | [[package]] 1611 | name = "winapi-i686-pc-windows-gnu" 1612 | version = "0.4.0" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | 1615 | [[package]] 1616 | name = "winapi-x86_64-pc-windows-gnu" 1617 | version = "0.4.0" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | 1620 | [[package]] 1621 | name = "ws2_32-sys" 1622 | version = "0.2.1" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | dependencies = [ 1625 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1626 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "xml-rs" 1631 | version = "0.8.0" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | 1634 | [metadata] 1635 | "checksum aho-corasick 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "5f56c476256dc249def911d6f7580b5fc7e875895b5d7ee88f5d602208035744" 1636 | "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" 1637 | "checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" 1638 | "checksum arc-swap 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d7b8a9123b8027467bce0099fe556c628a53c8d83df0507084c31e9ba2e39aff" 1639 | "checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 1640 | "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" 1641 | "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 1642 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 1643 | "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" 1644 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1645 | "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" 1646 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 1647 | "checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" 1648 | "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 1649 | "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 1650 | "checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" 1651 | "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 1652 | "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" 1653 | "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 1654 | "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" 1655 | "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" 1656 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 1657 | "checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" 1658 | "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" 1659 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1660 | "checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 1661 | "checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" 1662 | "checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" 1663 | "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" 1664 | "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" 1665 | "checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" 1666 | "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" 1667 | "checksum ct-logs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d3686f5fa27dbc1d76c751300376e167c5a43387f44bb451fd1c24776e49113" 1668 | "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 1669 | "checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" 1670 | "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" 1671 | "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 1672 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1673 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1674 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1675 | "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" 1676 | "checksum futures 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dda826c2f9351e68bc87b9037d91d818f24384993ecbb37f711e1f71a83182b5" 1677 | "checksum futures-channel 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c92c2137e8e1ebf1ac99453550ab46eb4f35c5c53476d57d75eb782fb4d71e84" 1678 | "checksum futures-core 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ccfb301b0b09e940a67376cf40d1b0ac4db9366ee737f65c02edea225057e91e" 1679 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 1680 | "checksum futures-executor 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f085a4c6508baef1f70ec2e0232a09edc649a3b86551fe92555e3a9e43939e4c" 1681 | "checksum futures-io 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c0ff098c09c30cc42b88a67d9fb27435e8456fb8b2483c904340ed499736931c" 1682 | "checksum futures-macro 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ebecc4204c719ca7140a3253676f1321e6fa17b1752a94a4a436d308be293e87" 1683 | "checksum futures-sink 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0485279d763e8a3669358f500e805339138b7bbe90f5718c80eedfdcb2ea36a4" 1684 | "checksum futures-task 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cefffab2aacc73845afd3f202e09fc775a55e2e96f46c8b1a46c117ae1c126ca" 1685 | "checksum futures-util 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2c3f8c59707f898b8b6f0b54c2aef5408ae90a560b7bf0fbf1b95b3c652b0171" 1686 | "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" 1687 | "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" 1688 | "checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" 1689 | "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" 1690 | "checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" 1691 | "checksum hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "023b39be39e3a2da62a94feb433e91e8bcd37676fbc8bea371daf52b7a769a3e" 1692 | "checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" 1693 | "checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" 1694 | "checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" 1695 | "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 1696 | "checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" 1697 | "checksum hyper-rustls 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)" = "719d85c7df4a7f309a77d145340a063ea929dcb2e025bae46a80345cffec2952" 1698 | "checksum indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" 1699 | "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 1700 | "checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" 1701 | "checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" 1702 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1703 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1704 | "checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" 1705 | "checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" 1706 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 1707 | "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" 1708 | "checksum md5 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 1709 | "checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" 1710 | "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" 1711 | "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" 1712 | "checksum mio-named-pipes 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e374eff525ce1c5b7687c4cef63943e7686524a387933ad27ca7ec43779cb3" 1713 | "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" 1714 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1715 | "checksum miow 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "396aa0f2003d7df8395cb93e09871561ccc3e785f0acb369170e8cc74ddf9226" 1716 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1717 | "checksum nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" 1718 | "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" 1719 | "checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" 1720 | "checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" 1721 | "checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" 1722 | "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1723 | "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" 1724 | "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" 1725 | "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1726 | "checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" 1727 | "checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" 1728 | "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" 1729 | "checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" 1730 | "checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" 1731 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 1732 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 1733 | "checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" 1734 | "checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" 1735 | "checksum regex-syntax 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "b28dfe3fe9badec5dbf0a79a9cccad2cfc2ab5484bdb3e44cbd1ae8b3ba2be06" 1736 | "checksum ring 0.16.11 (registry+https://github.com/rust-lang/crates.io-index)" = "741ba1704ae21999c00942f9f5944f801e977f54302af346b596287599ad1862" 1737 | "checksum rusoto_core 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f1d1ecfe8dac29878a713fbc4c36b0a84a48f7a6883541841cdff9fdd2ba7dfb" 1738 | "checksum rusoto_credential 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8632e41d289db90dd40d0389c71a23c5489e3afd448424226529113102e2a002" 1739 | "checksum rusoto_s3 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3fedcadf3d73c2925b05d547b66787f2219c5e727a98c893fff5cf2197dbd678" 1740 | "checksum rusoto_signature 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7063a70614eb4b36f49bcf4f6f6bb30cc765e3072b317d6afdfe51e7a9f482d1" 1741 | "checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" 1742 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1743 | "checksum rustls 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e" 1744 | "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" 1745 | "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" 1746 | "checksum sct 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" 1747 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1748 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1749 | "checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" 1750 | "checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" 1751 | "checksum serde_json 1.0.46 (registry+https://github.com/rust-lang/crates.io-index)" = "21b01d7f0288608a01dca632cf1df859df6fd6ffa885300fc275ce2ba6221953" 1752 | "checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" 1753 | "checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" 1754 | "checksum signal-hook 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "10b9f3a1686a29f53cfd91ee5e3db3c12313ec02d33765f02c1a9645a1811e2c" 1755 | "checksum signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94f478ede9f64724c5d173d7bb56099ec3e2d9fc2774aac65d34b8b890405f41" 1756 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1757 | "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" 1758 | "checksum socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85" 1759 | "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" 1760 | "checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 1761 | "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" 1762 | "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 1763 | "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" 1764 | "checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" 1765 | "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 1766 | "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" 1767 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 1768 | "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" 1769 | "checksum tokio 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8fdd17989496f49cdc57978c96f0c9fe5e4a58a8bddc6813c449a4624f6a030b" 1770 | "checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" 1771 | "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" 1772 | "checksum tokio-compat 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d4000e3c984d0e58ace4926f1eae4d830a90a76c386dccf5b82aeca4cbee6df" 1773 | "checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" 1774 | "checksum tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" 1775 | "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" 1776 | "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" 1777 | "checksum tokio-macros 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f4b1e7ed7d5d4c2af3d999904b0eebe76544897cdbfb2b9684bed2174ab20f7c" 1778 | "checksum tokio-process 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afbd6ef1b8cc2bd2c2b580d882774d443ebb1c6ceefe35ba9ea4ab586c89dbe8" 1779 | "checksum tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" 1780 | "checksum tokio-rustls 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d7cf08f990090abd6c6a73cab46fed62f85e8aef8b99e4b918a9f4a637f0676" 1781 | "checksum tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296" 1782 | "checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" 1783 | "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" 1784 | "checksum tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" 1785 | "checksum tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" 1786 | "checksum tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" 1787 | "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" 1788 | "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" 1789 | "checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" 1790 | "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" 1791 | "checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" 1792 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 1793 | "checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" 1794 | "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" 1795 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 1796 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 1797 | "checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" 1798 | "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1799 | "checksum wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "5205e9afdf42282b192e2310a5b463a6d1c1d774e30dc3c791ac37ab42d2616c" 1800 | "checksum wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "11cdb95816290b525b32587d76419facd99662a07e59d3cdb560488a819d9a45" 1801 | "checksum wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "574094772ce6921576fb6f2e3f7497b8a76273b6db092be18fc48a082de09dc3" 1802 | "checksum wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "e85031354f25eaebe78bb7db1c3d86140312a911a106b2e29f9cc440ce3e7668" 1803 | "checksum wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "f5e7e61fc929f4c0dddb748b102ebf9f632e2b8d739f2016542b4de2965a9601" 1804 | "checksum wasm-bindgen-webidl 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "ef012a0d93fc0432df126a8eaf547b2dce25a8ce9212e1d3cbeef5c11157975d" 1805 | "checksum web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf97caf6aa8c2b1dac90faf0db529d9d63c93846cca4911856f78a83cebf53b" 1806 | "checksum webpki 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" 1807 | "checksum webpki-roots 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a262ae37dd9d60f60dd473d1158f9fbebf110ba7b6a5051c8160460f6043718b" 1808 | "checksum weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3bb43f70885151e629e2a19ce9e50bd730fd436cfd4b666894c9ce4de9141164" 1809 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1810 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 1811 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1812 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1813 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1814 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 1815 | "checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5" 1816 | --------------------------------------------------------------------------------