diff --git a/Cargo.lock b/Cargo.lock index 4cdbc2bd0..5712d08d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,11 @@ +[[package]] +name = "MacTypes-sys" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "adler32" version = "1.0.3" @@ -8,7 +16,7 @@ name = "aho-corasick" version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -26,7 +34,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "arc-swap" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -40,7 +48,7 @@ dependencies = [ [[package]] name = "array-macro" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -59,7 +67,7 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.4.8" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -70,30 +78,36 @@ name = "atty" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "autocfg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "backtrace" -version = "0.3.9" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.24" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -101,7 +115,7 @@ name = "base64" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -144,7 +158,7 @@ name = "blake2-rfc" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -174,7 +188,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "git2 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -185,7 +199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" -version = "1.2.7" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -193,13 +207,13 @@ name = "bytes" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.25" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -222,8 +236,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -232,7 +246,7 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -270,7 +284,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -278,7 +292,7 @@ name = "core-foundation-sys" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -299,21 +313,21 @@ dependencies = [ [[package]] name = "croaring" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "croaring-sys 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "croaring-sys 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "croaring-sys" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bindgen 0.37.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -321,6 +335,21 @@ name = "crossbeam" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crossbeam" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-channel" version = "0.2.6" @@ -329,17 +358,26 @@ dependencies = [ "crossbeam-epoch 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-channel" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-deque" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -347,9 +385,22 @@ name = "crossbeam-epoch" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -362,10 +413,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "crossbeam-utils" -version = "0.6.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -382,7 +434,7 @@ name = "csv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -411,14 +463,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-channel 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "enum-map 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "enumset 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "enumset 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ncurses 5.97.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ncurses 5.98.0 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "signal-hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "signal-hook 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -427,11 +479,25 @@ dependencies = [ ] [[package]] -name = "daemonize" -version = "0.3.0" +name = "cursive" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "enum-map 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "enumset 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pancurses 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", + "signal-hook 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -452,7 +518,7 @@ name = "dirs" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -474,7 +540,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "encoding_rs" -version = "0.8.13" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -485,18 +551,18 @@ name = "enum-map" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "array-macro 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "enum-map-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "reexport-proc-macro 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "array-macro 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "enum-map-derive 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "reexport-proc-macro 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "enum-map-derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -510,7 +576,7 @@ dependencies = [ [[package]] name = "enumset" -version = "0.3.14" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "enumset_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -522,9 +588,9 @@ name = "enumset_derive" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -541,21 +607,21 @@ dependencies = [ [[package]] name = "failure" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -570,8 +636,8 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -580,9 +646,9 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -603,6 +669,11 @@ name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -628,7 +699,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -650,8 +721,8 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "libgit2-sys 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -670,10 +741,10 @@ dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cursive 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "cursive 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "daemonize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "grin_api 1.0.1", "grin_chain 1.0.1", @@ -688,10 +759,11 @@ dependencies = [ "humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "linefeed 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pancurses 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -700,8 +772,8 @@ dependencies = [ name = "grin_api" version = "1.0.1" dependencies = [ - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "grin_chain 1.0.1", "grin_core 1.0.1", @@ -709,21 +781,21 @@ dependencies = [ "grin_pool 1.0.1", "grin_store 1.0.1", "grin_util 1.0.1", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-rustls 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-rustls 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -732,12 +804,12 @@ name = "grin_chain" version = "1.0.1" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "croaring 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "croaring 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "grin_core 1.0.1", "grin_keychain 1.0.1", "grin_store 1.0.1", @@ -745,9 +817,9 @@ dependencies = [ "lmdb-zero 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -761,9 +833,9 @@ dependencies = [ "grin_util 1.0.1", "grin_wallet 1.0.1", "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -772,23 +844,23 @@ name = "grin_core" version = "1.0.1" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "croaring 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "croaring 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "grin_keychain 1.0.1", "grin_util 1.0.1", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -798,18 +870,18 @@ name = "grin_keychain" version = "1.0.1" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", "grin_util 1.0.1", "hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "ripemd160 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -830,9 +902,9 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -847,9 +919,9 @@ dependencies = [ "grin_store 1.0.1", "grin_util 1.0.1", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -859,11 +931,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -883,17 +955,17 @@ dependencies = [ "grin_store 1.0.1", "grin_util 1.0.1", "grin_wallet 1.0.1", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-staticfile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)", "jsonrpc-core 8.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "lmdb-zero 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -901,39 +973,39 @@ dependencies = [ name = "grin_store" version = "1.0.1" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "croaring 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "croaring 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "grin_core 1.0.1", "grin_util 1.0.1", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "lmdb-zero 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grin_util" version = "1.0.1" dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "grin_secp256k1zkp 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log4rs 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "zeroize 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -944,10 +1016,10 @@ name = "grin_wallet" version = "1.0.1" dependencies = [ "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "grin_api 1.0.1", "grin_chain 1.0.1", @@ -955,14 +1027,14 @@ dependencies = [ "grin_keychain 1.0.1", "grin_store 1.0.1", "grin_util 1.0.1", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "prettytable-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -973,19 +1045,19 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -999,7 +1071,7 @@ dependencies = [ [[package]] name = "http" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1027,27 +1099,27 @@ dependencies = [ [[package]] name = "hyper" -version = "0.12.17" +version = "0.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1058,13 +1130,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ct-logs 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "rustls 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-rustls 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "webpki 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", "webpki-roots 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1076,8 +1148,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1089,9 +1161,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1101,7 +1173,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1114,7 +1186,7 @@ name = "iovec" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1138,9 +1210,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1164,7 +1236,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.44" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1173,17 +1245,17 @@ version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libgit2-sys" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1194,7 +1266,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1202,7 +1274,7 @@ name = "libloading" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1211,8 +1283,8 @@ name = "libz-sys" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1243,7 +1315,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "liblmdb-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "supercow 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1271,7 +1343,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1290,13 +1362,13 @@ dependencies = [ "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log-mdc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "serde-value 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)", "thread-id 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1326,17 +1398,16 @@ name = "memchr" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memchr" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1344,7 +1415,7 @@ name = "memmap" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1355,7 +1426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mime" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1366,9 +1437,9 @@ name = "mime_guess" version = "2.0.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1377,13 +1448,13 @@ name = "miniz-sys" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "miniz_oxide" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1391,13 +1462,13 @@ dependencies = [ [[package]] name = "miniz_oxide_c_api" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1410,11 +1481,11 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1424,7 +1495,7 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1445,11 +1516,11 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "smallstr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "terminfo 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1459,7 +1530,7 @@ name = "msdos_time" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1469,24 +1540,24 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ncurses" -version = "5.97.0" +version = "5.98.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1496,7 +1567,7 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1507,7 +1578,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1519,9 +1590,9 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1540,10 +1611,11 @@ dependencies = [ [[package]] name = "nom" -version = "4.1.1" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1564,7 +1636,7 @@ name = "num" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-complex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1579,13 +1651,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-bigint" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1642,7 +1714,7 @@ name = "num-rational" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1662,10 +1734,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "num_cpus" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1675,15 +1747,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.15" +version = "0.10.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1693,11 +1765,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.39" +version = "0.9.40" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1718,6 +1790,18 @@ dependencies = [ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pancurses" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ncurses 5.98.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pdcurses-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot" version = "0.6.4" @@ -1727,15 +1811,36 @@ dependencies = [ "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1745,15 +1850,24 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pdcurses-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -1766,33 +1880,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "phf" -version = "0.7.23" +version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "phf_codegen" -version = "0.7.23" +version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "phf_generator 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "phf_generator" -version = "0.7.23" +version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "phf_shared" -version = "0.7.23" +version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1841,7 +1955,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "0.4.24" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1862,82 +1976,83 @@ dependencies = [ [[package]] name = "quote" -version = "0.6.10" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_jitter 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_chacha" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1945,7 +2060,7 @@ name = "rand_hc" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1953,7 +2068,30 @@ name = "rand_isaac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_jitter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_os" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1961,21 +2099,29 @@ name = "rand_pcg" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_xorshift" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" -version = "0.1.43" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1983,7 +2129,7 @@ name = "redox_termios" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1992,14 +2138,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "reexport-proc-macro" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2008,15 +2154,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2037,23 +2183,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding_rs 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.15 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "libflate 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", "native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2061,9 +2207,9 @@ name = "ring" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2083,13 +2229,13 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rustc-demangle" -version = "0.1.9" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2141,7 +2287,7 @@ name = "same-file" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2179,22 +2325,23 @@ dependencies = [ [[package]] name = "security-framework" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2217,7 +2364,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.81" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2226,27 +2373,27 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.81" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.33" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2256,7 +2403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2267,7 +2414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2284,11 +2431,11 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arc-swap 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "arc-swap 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2298,7 +2445,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "slab" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2306,12 +2453,12 @@ name = "smallstr" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "smallvec" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2324,7 +2471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "string" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2342,18 +2489,18 @@ name = "syn" version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "syn" -version = "0.15.22" +version = "0.15.26" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2362,9 +2509,9 @@ name = "synstructure" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2374,8 +2521,8 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2385,9 +2532,9 @@ version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2397,7 +2544,7 @@ name = "term" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2407,7 +2554,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2425,9 +2572,9 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2435,8 +2582,8 @@ name = "termion" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2453,8 +2600,8 @@ name = "thread-id" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2468,11 +2615,11 @@ dependencies = [ [[package]] name = "time" -version = "0.1.40" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2486,15 +2633,15 @@ dependencies = [ "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2504,7 +2651,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2519,10 +2666,10 @@ dependencies = [ "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2531,30 +2678,31 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-executor" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-fs" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-io" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2564,19 +2712,19 @@ dependencies = [ [[package]] name = "tokio-reactor" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2585,7 +2733,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2610,40 +2758,43 @@ dependencies = [ [[package]] name = "tokio-tcp" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-threadpool" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-deque 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-timer" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2656,25 +2807,25 @@ dependencies = [ "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-uds" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2682,7 +2833,7 @@ name = "toml" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2739,8 +2890,11 @@ dependencies = [ [[package]] name = "unicode-normalization" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "unicode-segmentation" @@ -2799,16 +2953,16 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "uuid" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2838,7 +2992,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2874,7 +3028,7 @@ name = "which" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2903,7 +3057,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2920,7 +3074,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winreg" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2937,7 +3099,7 @@ name = "xattr" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2970,23 +3132,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] +"checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" -"checksum arc-swap 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5c5ed110e2537bdd3f5b9091707a8a5556a72ac49bbd7302ae0b28fdccb3246c" +"checksum arc-swap 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1025aeae2b664ca0ea726a89d574fe8f4e77dd712d443236ad1de00379450cf6" "checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392" -"checksum array-macro 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8b1b1a00de235e9f2cc0e650423dc249d875c116a5934188c08fdd0c02d840ef" +"checksum array-macro 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c4ff37a25fb442a1fecfd399be0dde685558bca30fb998420532889a36852d2" "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" -"checksum arrayvec 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "f405cc4c21cd8b784f6c8fc2adf9bc00f59558f0049b5ec21517f875963040cc" +"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" -"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0" +"checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799" +"checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" +"checksum backtrace-sys 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)" = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" "checksum bindgen 0.37.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1b25ab82877ea8fe6ce1ce1f8ac54361f0218bad900af9eb11803994bf67c221" "checksum bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dead7461c1127cf637931a1e50934eb6eee8bff2f74433ac7909e9afcee04a3" @@ -2998,9 +3162,9 @@ dependencies = [ "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum built 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61f5aae2fa15b68fbcf0cbab64e659a55d10e9bacc55d3470ef77ae73030d755" "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" -"checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d" +"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" -"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" +"checksum cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e" "checksum cexpr 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42aac45e9567d97474a834efdee3081b3c942b2205be932092f53354ce503d6c" "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" @@ -3012,41 +3176,45 @@ dependencies = [ "checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" "checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192" -"checksum croaring 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a2c82431f150237fc25ef9ece26ccbcc8325118f44a538b48449a7639cb6e9cf" -"checksum croaring-sys 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d36e44ca368664098be5d03576da36edd3e2c728df553f13f89cb25fbc3792c5" +"checksum croaring 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b350ece8a9ba71eeb9c068a98a86dc420ca5c1d6bd4e1627a4581e9c843c38" +"checksum croaring-sys 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "546b00f33bdf591bce6410a8dca65047d126b1d5a9189190d085aa8c493d43a7" "checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19" +"checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" "checksum crossbeam-channel 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7b85741761b7f160bc5e7e0c14986ef685b7f8bf9b7ad081c60c604bb4649827" -"checksum crossbeam-deque 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe1b6f945f824c7a25afe44f62e25d714c0cc523f8e99d8db5cd1026e1269d3" +"checksum crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" +"checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" "checksum crossbeam-epoch 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2449aaa4ec7ef96e5fb24db16024b935df718e9ae1cec0a1e68feeca2efca7b8" +"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" "checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" -"checksum crossbeam-utils 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e07fc155212827475223f0bcfae57e945e694fc90950ddf3f6695bbfd5555c72" +"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" "checksum crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7afa06d05a046c7a47c3a849907ec303504608c927f4e85f7bfff22b7180d971" "checksum csv 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7ef22b37c7a51c564a365892c012dc0271221fdcc64c69b19ba4d6fa8bd96d9c" "checksum ct-logs 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "95a4bf5107667e12bf6ce31a3a5066d67acc88942b6742117a41198734aaccaa" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" +"checksum cursive 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad36e47ece323d806b1daa3c87c7eb2aae54ef15e6554e27fe3dbdacf6b515fc" "checksum cursive 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1df013f020cf1e66c456c9af584ae660590b8147186fd66b941604f85145b880" -"checksum daemonize 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4093d27eb267d617f03c2ee25d4c3ca525b89a76154001954a11984508ffbde5" "checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" "checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a" "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" -"checksum encoding_rs 0.8.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1a8fa54e6689eb2549c4efed8d00d7f3b2b994a064555b0e8df4ae3764bcc4be" +"checksum encoding_rs 0.8.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fd251508d65030820f3a4317af2248180db337fdb25d89967956242580277813" "checksum enum-map 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "caa1769f019df7ccd8f9a741d2d608309688d0f1bd8a8747c14ac993660c761c" -"checksum enum-map-derive 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f915c8ef505ce27b6fa51515463938aa2e9135081fefc93aef786539a646a365" +"checksum enum-map-derive 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "153f6e8a8b2868e2fedf921b165f30229edcccb74d6a9bb1ccf0480ef61cd07e" "checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" -"checksum enumset 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "410e0c8f67e79dcc08cb844c629e2845e9846b464e059b7f3c9d5311b4151d8d" +"checksum enumset 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "55da7777fd68a7213fa1d8f56ec3063141e44650c7fe7ae329ab69a0e77ecf00" "checksum enumset_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24300e54ac8ddea74e337f0309c71df4a8c1d7a7fd48a287ef0af8354fadb788" "checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" -"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7" -"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" +"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" +"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a2df5c1a8c4be27e7707789dc42ae65976e60b394afd293d1419ab915833e646" "checksum flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2291c165c8e703ee54ef3055ad6188e3d51108e2ded18e9f2476e774fc5ad3d4" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" @@ -3056,13 +3224,13 @@ dependencies = [ "checksum git2 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "591f8be1674b421644b6c030969520bc3fa12114d2eb467471982ed3e9584e71" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum grin_secp256k1zkp 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "223095ed6108a42855ab2ce368d2056cfd384705f81c494f6d88ab3383161562" -"checksum h2 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "1ac030ae20dee464c5d0f36544d8b914a6bc606da44a57e052d2b0f5dae129e0" +"checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" "checksum hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "733e1b3ac906631ca01ebb577e9bb0f5e37a454032b9036b5eaea4013ed6f99a" -"checksum http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "02096a6d2c55e63f7fcb800690e4f889a25f6ec342e3adb4594e293b625215ab" +"checksum http 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5" "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" -"checksum hyper 0.12.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c49a75385d35ff5e9202755f09beb0b878a05c4c363fcc52b23eeb5dcb6782cc" +"checksum hyper 0.12.19 (registry+https://github.com/rust-lang/crates.io-index)" = "f1ebec079129e43af5e234ef36ee3d7e6085687d145b7ea653b262d16c6b65f1" "checksum hyper-rustls 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "68f2aa6b1681795bf4da8063f718cd23145aa0c9a5143d9787b345aa60d38ee4" "checksum hyper-staticfile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4080cb44b9c1e4c6dfd6f7ee85a9c3439777ec9c59df32f944836d3de58ac35e" "checksum hyper-tls 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "32cd73f14ad370d3b4d4b7dce08f69b81536c82e39fcc89731930fe5788cd661" @@ -3075,9 +3243,9 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" -"checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" +"checksum libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "e962c7641008ac010fa60a7dfdc1712449f29c44ef2d4702394aea943ee75047" "checksum libflate 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)" = "bff3ac7d6f23730d3b533c35ed75eef638167634476a499feef16c428d74b57b" -"checksum libgit2-sys 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4916b5addc78ec36cc309acfcdf0b9f9d97ab7b84083118b248709c5b7029356" +"checksum libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)" = "48441cb35dc255da8ae72825689a95368bf510659ae1ad55dc4aa88cb1789bf1" "checksum liblmdb-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "feed38a3a580f60bf61aaa067b0ff4123395966839adeaf67258a9e50c4d2e49" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" @@ -3094,31 +3262,31 @@ dependencies = [ "checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a" -"checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" +"checksum memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8" "checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0a907b83e7b9e987032439a387e187119cddafc92d5c2aaeb1d92580a793f630" +"checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425" "checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" "checksum miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0300eafb20369952951699b68243ab4334f4b10a88f411c221d444b36c40e649" -"checksum miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ad30a47319c16cde58d0314f5d98202a80c9083b5f61178457403dfb14e509c" -"checksum miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28edaef377517fd9fe3e085c37d892ce7acd1fbeab9239c5a36eec352d8a8b7e" +"checksum miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +"checksum miniz_oxide_c_api 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum mortal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "26153280e6a955881f761354b130aa7838f9983836f3de438ac0a8f22cfab1ff" "checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729" "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" -"checksum ncurses 5.97.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee821144e7fe6fd1d1c04b8001d92d783ae471a71d60ab506e6c608b83a85ae6" +"checksum ncurses 5.98.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ddf9a2b0b4526dc8c5a57c859b0f4415b7b3258c487aaa11e07fbde2877744d" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" "checksum nix 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d95c5fa8b641c10ad0b8887454ebaafa3c92b5cd5350f8fc693adafd178e7b" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05aec50c70fd288702bcd93284a8444607f3292dbdf2a30de5ea5dcdbe72287b" -"checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a" +"checksum nom 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b30adc557058ce00c9d0d7cb3c6e0b5bc6f36e2e2eabe74b0ba726d194abd588" "checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" "checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db" "checksum num-bigint 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1" -"checksum num-bigint 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "10b8423ea72ec64751198856a853e07b37087cfc9b53a87ecb19bff67b6d1320" +"checksum num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "57450397855d951f1a41305e54851b1a7b8f5d2e349543a02a2effe25459f718" "checksum num-complex 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "b288631d7878aaf59442cffd36910ea604ecd7745c36054328595114001c9656" "checksum num-complex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "107b9be86cd2481930688277b675b0114578227f034674726605b8a482d8baf8" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" @@ -3127,54 +3295,61 @@ dependencies = [ "checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10" "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" -"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238" "checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" -"checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" +"checksum openssl 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ec7bd7ca4cce6dbdc77e7c1230682740d307d1218a87fb0349a571272be749f9" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" +"checksum openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)" = "1bb974e77de925ef426b6bc82fce15fd45bdcbeb5728bffcfc7cdeeb7ce1c2d6" "checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2" "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" +"checksum pancurses 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d3058bc37c433096b2ac7afef1c5cdfae49ede0a4ffec3dfc1df1df0959d0ff0" "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" +"checksum parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" +"checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" "checksum pbkdf2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0c09cddfbfc98de7f76931acf44460972edb4023eb14d0c6d4018800e552d8e0" +"checksum pdcurses-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "90e12bfe55b7080fdfa0742f7a22ce7d5d1da250ca064ae6b81c843a2084fa2a" "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "cec29da322b242f4c3098852c77a0ca261c9c01b806cae85a5572a1eb94db9a6" -"checksum phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "7d187f00cd98d5afbcd8898f6cf181743a449162aeb329dcd2f3849009e605ad" -"checksum phf_generator 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "03dc191feb9b08b0dc1330d6549b795b9d81aec19efe6b4a45aec8d4caee0c4b" -"checksum phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "b539898d22d4273ded07f64a05737649dc69095d92cb87c7097ec68e3f150b93" +"checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" +"checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" +"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" +"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6" "checksum prettytable-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5511ca4c805aa35f0abff6be7923231d664408b60c09f44ef715f2bce106cd9e" "checksum proc-macro2 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "77997c53ae6edd6d187fec07ec41b207063b5ee6f33680e9fa86d405cdd313d4" -"checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09" +"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" -"checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" -"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" -"checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" -"checksum rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "771b009e3a508cb67e8823dda454aaa5368c7bc1c16829fb77d3e980440dd34a" -"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" -"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" +"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" +"checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" +"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_jitter 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "080723c6145e37503a2224f801f252e14ac5531cb450f4502698542d188cb3c0" +"checksum rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b7c690732391ae0abafced5015ffb53656abfaec61b342290e5eb56b286a679d" "checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" -"checksum rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effa3fcaa47e18db002bdde6060944b6d2f9cfd8db471c30e873448ad9187be3" -"checksum redox_syscall 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "679da7508e9a6390aeaf7fbd02a800fdc64b73fe2204dd2c8ae66d22d9d5ad5d" +"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +"checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "214a97e49be64fd2c86f568dd0cb2c757d2cc53de95b273b6ad0a1c908482f26" -"checksum reexport-proc-macro 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "438fe63770eda15baf98e30b4d27ada49b932866307fa04fec24d9043fe63324" +"checksum reexport-proc-macro 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b90ec417f693152463d468b6d06ccc45ae3833f0538ef9e1cc154cf09eb1f575" "checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" -"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" +"checksum regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8c2f35eedad5295fdf00a63d7d4b238135723f92b434ec06774dad15c7ab0861" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum reqwest 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ab52e462d1e15891441aeefadff68bdea005174328ce3da0a314f2ad313ec837" "checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" "checksum ripemd160 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "482aa56cc68aaeccdaaff1cc5a72c247da8bbad3beb174ca5741f274c22883fb" "checksum rpassword 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37473170aedbe66ffa3ad3726939ba677d83c646ad4fd99e5b4bc38712f45ec" -"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" +"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" @@ -3187,29 +3362,29 @@ dependencies = [ "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum sct 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cb8f61f9e6eadd062a71c380043d28036304a4706b3c4dd001ff3387ed00745a" -"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0" -"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf" +"checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05" +"checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)" = "c91eb5b0190ae87b4e2e39cbba6e3bed3ac6186935fe265f0426156c4c49961b" +"checksum serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "2e20fde37801e83c891a2dc4ebd3b81f0da4d1fb67a9e0a2a3b921e2536a58ee" "checksum serde-value 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7a663f873dedc4eac1a559d4c6bc0d0b2c34dc5ac4702e105014b8281489e44f" -"checksum serde_derive 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)" = "477b13b646f5b5b56fc95bedfc3b550d12141ce84f466f6c44b9a17589923885" -"checksum serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)" = "c37ccd6be3ed1fdf419ee848f7c758eb31b054d7cd3ae3600e3bae0adf569811" +"checksum serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)" = "633e97856567e518b59ffb2ad7c7a4fd4c5d91d9c7f32dd38a27b2bf7e8114ea" +"checksum serde_json 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "27dce848e7467aa0e2fcaf0a413641499c0b745452aaca1194d24dedde9e13c9" "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" "checksum serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0887a8e097a69559b56aa2526bf7aff7c3048cf627dff781f0b56a6001534593" "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" -"checksum signal-hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8941ae94fa73d0f73b422774b3a40a7195cecd88d1c090f4b37ade7dc795ab66" +"checksum signal-hook 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1f272d1b7586bec132ed427f532dd418d8beca1ca7f2caf7df35569b1415a4b4" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" -"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" +"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallstr 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6aa65bb4d5b2bbc90d36af64e29802f788aa614783fa1d0df011800ddcec6e8e" -"checksum smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b73ea3738b47563803ef814925e69be00799a8c07420be8b996f8e98fb2336db" +"checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum string 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98998cced76115b1da46f63388b909d118a37ae0be0f82ad35773d4a4bc9d18d" +"checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum supercow 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "171758edb47aa306a78dfa4ab9aeb5167405bd4e3dc2b64e88f6a84bbe98bd63" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" -"checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7" +"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum tar 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "a303ba60a099fcd2aaa646b14d2724591a96a75283e4b7ed3d1a1658909d9ae2" "checksum tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7e91405c14320e5c79b3d148e1c86f40749a36e490642202a31689cb1a3452b2" @@ -3221,23 +3396,23 @@ dependencies = [ "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread-id 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6e93c78d23cc61aa245a8acd2c4a79c4d7fa7fb5c3ca90d5737029f043a84895" "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" "checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" "checksum tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "331c8acc267855ec06eb0c94618dcbbfea45bed2d20b77252940095273fb58f6" -"checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" -"checksum tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "60ae25f6b17d25116d2cba342083abe5255d3c2c79cb21ea11aa049c53bf7c75" -"checksum tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "7392fe0a70d5ce0c882c4778116c519bd5dbaa8a7c3ae3d04578b3afafdcda21" -"checksum tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "502b625acb4ee13cbb3b90b8ca80e0addd263ddacf6931666ef751e610b07fb5" +"checksum tokio-executor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30c6dbf2d1ad1de300b393910e8a3aa272b724a400b6531da03eed99e329fbf0" +"checksum tokio-fs 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0e9cbbc8a3698b7ab652340f46633364f9eaa928ddaaee79d8b8f356dd79a09d" +"checksum tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b53aeb9d3f5ccf2ebb29e19788f96987fa1355f8fe45ea193928eaaaf3ae820f" +"checksum tokio-reactor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "afbcdb0f0d2a1e4c440af82d7bbf0bf91a8a8c0575bcd20c05d15be7e9d3a02f" "checksum tokio-retry 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f05746ae87dca83a2016b4f5dba5b237b897dd12fd324f60afe282112f16969a" "checksum tokio-rustls 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "208d62fa3e015426e3c64039d9d20adf054a3c9b4d9445560f1c41c75bef3eab" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" -"checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" -"checksum tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "56c5556262383032878afad66943926a1d1f0967f17e94bd7764ceceb3b70e7f" -"checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" +"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" +"checksum tokio-threadpool 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c3fd86cb15547d02daa2b21aadaf4e37dee3368df38a526178a5afa3c034d2fb" +"checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" -"checksum tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "99ce87382f6c1a24b513a72c048b2c8efe66cb5161c9061d00bee510f08dc168" +"checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" "checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" @@ -3247,7 +3422,7 @@ dependencies = [ "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" +"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" @@ -3257,7 +3432,7 @@ dependencies = [ "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" -"checksum uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dab5c5526c5caa3d106653401a267fed923e7046f35895ffcb5ca42db64942e6" +"checksum uuid 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0238db0c5b605dd1cf51de0f21766f97fba2645897024461d6a00c036819a768" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" @@ -3271,9 +3446,10 @@ dependencies = [ "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" +"checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" "checksum xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12ea8eda4b1eb72f02d148402e23832d56a33f55d8c1b2d5bcdde91d79d47cb1" diff --git a/Cargo.toml b/Cargo.toml index 40b80c2af..f1a0769a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,9 +25,7 @@ chrono = "0.4.4" clap = { version = "2.31", features = ["yaml"] } rpassword = "2.0.0" ctrlc = { version = "3.1", features = ["termination"] } -cursive = "0.9.0" humansize = "1.1.0" -daemonize = "0.3" serde = "1" serde_json = "1" log = "0.4" @@ -45,6 +43,14 @@ grin_servers = { path = "./servers", version = "1.0.1" } grin_util = { path = "./util", version = "1.0.1" } grin_wallet = { path = "./wallet", version = "1.0.1" } +[target.'cfg(windows)'.dependencies] +cursive = { version = "0.10.0", default-features = false, features = ["pancurses-backend"] } +[target.'cfg(windows)'.dependencies.pancurses] +version = "0.16.0" +features = ["win32"] +[target.'cfg(unix)'.dependencies] +cursive = "0.9.0" + [build-dependencies] built = "0.3" reqwest = "0.9" diff --git a/api/src/handlers/chain_api.rs b/api/src/handlers/chain_api.rs index 910838671..af269d71f 100644 --- a/api/src/handlers/chain_api.rs +++ b/api/src/handlers/chain_api.rs @@ -56,7 +56,7 @@ pub struct ChainValidationHandler { impl Handler for ChainValidationHandler { fn get(&self, _req: Request) -> ResponseFuture { match w(&self.chain).validate(true) { - Ok(_) => response(StatusCode::OK, ""), + Ok(_) => response(StatusCode::OK, "{}"), Err(e) => response( StatusCode::INTERNAL_SERVER_ERROR, format!("validate failed: {}", e), @@ -75,7 +75,7 @@ pub struct ChainCompactHandler { impl Handler for ChainCompactHandler { fn post(&self, _req: Request) -> ResponseFuture { match w(&self.chain).compact() { - Ok(_) => response(StatusCode::OK, ""), + Ok(_) => response(StatusCode::OK, "{}"), Err(e) => response( StatusCode::INTERNAL_SERVER_ERROR, format!("compact failed: {}", e), diff --git a/api/src/handlers/peers_api.rs b/api/src/handlers/peers_api.rs index b42a92f1b..31494a17c 100644 --- a/api/src/handlers/peers_api.rs +++ b/api/src/handlers/peers_api.rs @@ -97,6 +97,6 @@ impl Handler for PeerHandler { _ => return response(StatusCode::BAD_REQUEST, "invalid command"), }; - response(StatusCode::OK, "") + response(StatusCode::OK, "{}") } } diff --git a/chain/src/chain.rs b/chain/src/chain.rs index d518baec2..33504d544 100644 --- a/chain/src/chain.rs +++ b/chain/src/chain.rs @@ -857,6 +857,14 @@ impl Chain { } let header = self.get_block_header(&h)?; + + { + let mut txhashset_ref = self.txhashset.write(); + // Drop file handles in underlying txhashset + txhashset_ref.release_backend_files(); + } + + // Rewrite hashset txhashset::zip_write(self.db_root.clone(), txhashset_data, &header)?; let mut txhashset = diff --git a/chain/src/txhashset/txhashset.rs b/chain/src/txhashset/txhashset.rs index cbcf2d657..3520ebb2c 100644 --- a/chain/src/txhashset/txhashset.rs +++ b/chain/src/txhashset/txhashset.rs @@ -18,7 +18,7 @@ use crate::core::core::committed::Committed; use crate::core::core::hash::{Hash, Hashed}; use crate::core::core::merkle_proof::MerkleProof; -use crate::core::core::pmmr::{self, ReadonlyPMMR, RewindablePMMR, PMMR}; +use crate::core::core::pmmr::{self, Backend, ReadonlyPMMR, RewindablePMMR, PMMR}; use crate::core::core::{ Block, BlockHeader, Input, Output, OutputIdentifier, TxKernel, TxKernelEntry, }; @@ -153,6 +153,15 @@ impl TxHashSet { }) } + /// Close all backend file handles + pub fn release_backend_files(&mut self) { + self.header_pmmr_h.backend.release_files(); + self.sync_pmmr_h.backend.release_files(); + self.output_pmmr_h.backend.release_files(); + self.rproof_pmmr_h.backend.release_files(); + self.kernel_pmmr_h.backend.release_files(); + } + /// Check if an output is unspent. /// We look in the index to find the output MMR pos. /// Then we check the entry in the output MMR and confirm the hash matches. diff --git a/core/Cargo.toml b/core/Cargo.toml index 3b1a407c1..071ca1047 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -12,7 +12,7 @@ edition = "2018" [dependencies] blake2-rfc = "0.2" byteorder = "1" -croaring = "=0.3" +croaring = "=0.3.8" enum_primitive = "0.1" failure = "0.1" failure_derive = "0.1" diff --git a/core/src/core/pmmr/backend.rs b/core/src/core/pmmr/backend.rs index 4f6789d93..e4e0e9d27 100644 --- a/core/src/core/pmmr/backend.rs +++ b/core/src/core/pmmr/backend.rs @@ -62,6 +62,9 @@ pub trait Backend { /// fastest way to to be able to allow direct access to the file fn get_data_file_path(&self) -> &Path; + /// Release underlying datafiles and locks + fn release_files(&mut self); + /// Also a bit of a hack... /// Saves a snapshot of the rewound utxo file with the block hash as /// filename suffix. We need this when sending a txhashset zip file to a diff --git a/core/src/core/transaction.rs b/core/src/core/transaction.rs index c536d1167..bdb339fba 100644 --- a/core/src/core/transaction.rs +++ b/core/src/core/transaction.rs @@ -18,6 +18,7 @@ use crate::core::hash::Hashed; use crate::core::verifier_cache::VerifierCache; use crate::core::{committed, Committed}; use crate::keychain::{self, BlindingFactor}; +use crate::libtx::secp_ser; use crate::ser::{ self, read_multi, FixedLength, PMMRable, Readable, Reader, VerifySortedAndUnique, Writeable, Writer, @@ -164,9 +165,14 @@ pub struct TxKernel { /// Remainder of the sum of all transaction commitments. If the transaction /// is well formed, amounts components should sum to zero and the excess /// is hence a valid public key. + #[serde( + serialize_with = "secp_ser::as_hex", + deserialize_with = "secp_ser::commitment_from_hex" + )] pub excess: Commitment, /// The signature proving the excess is a valid public key, which signs /// the transaction fee. + #[serde(with = "secp_ser::sig_serde")] pub excess_sig: secp::Signature, } @@ -756,6 +762,10 @@ impl TransactionBody { pub struct Transaction { /// The kernel "offset" k2 /// excess is k1G after splitting the key k = k1 + k2 + #[serde( + serialize_with = "secp_ser::as_hex", + deserialize_with = "secp_ser::blind_from_hex" + )] pub offset: BlindingFactor, /// The transaction body - inputs/outputs/kernels body: TransactionBody, @@ -1111,6 +1121,10 @@ pub struct Input { /// We will check maturity for coinbase output. pub features: OutputFeatures, /// The commit referencing the output being spent. + #[serde( + serialize_with = "secp_ser::as_hex", + deserialize_with = "secp_ser::commitment_from_hex" + )] pub commit: Commitment, } @@ -1214,8 +1228,16 @@ pub struct Output { /// Options for an output's structure or use pub features: OutputFeatures, /// The homomorphic commitment representing the output amount + #[serde( + serialize_with = "secp_ser::as_hex", + deserialize_with = "secp_ser::commitment_from_hex" + )] pub commit: Commitment, /// A proof that the commitment is in the right range + #[serde( + serialize_with = "secp_ser::as_hex", + deserialize_with = "secp_ser::rangeproof_from_hex" + )] pub proof: RangeProof, } diff --git a/core/tests/vec_backend.rs b/core/tests/vec_backend.rs index 675d5b05e..25143260b 100644 --- a/core/tests/vec_backend.rs +++ b/core/tests/vec_backend.rs @@ -122,6 +122,8 @@ impl Backend for VecBackend { Path::new("") } + fn release_files(&mut self) {} + fn dump_stats(&self) {} } diff --git a/doc/api/wallet_owner_api.md b/doc/api/wallet_owner_api.md index ab0d92b07..70562de08 100644 --- a/doc/api/wallet_owner_api.md +++ b/doc/api/wallet_owner_api.md @@ -12,6 +12,7 @@ 1. [POST Finalize Tx](#post-finalize-tx) 1. [POST Cancel Tx](#post-cancel-tx) 1. [POST Post Tx](#post-post-tx) + 1. [POST Repost Tx](#post-repost-tx) 1. [POST Issue Burn Tx](#post-issue-burn-tx) 1. [Adding Foreign API Endpoints](#add-foreign-api-endpoints) @@ -641,6 +642,50 @@ Push new transaction to the connected node transaction pool. Add `?fluff` at the }, }); ``` +### POST Repost Tx + +Repost a `sending` transaction to the connected node transaction pool with a given transaction id. Add `?fluff` at the end of the URL to bypass Dandelion relay . This could be used for retry posting when a `sending` transaction is created but somehow failed on posting. + +* **URL** + + * /v1/wallet/owner/repost?id=x + * /v1/wallet/owner/repost?tx_id=x + * /v1/wallet/owner/repost?fluff&tx_id=x + +* **Method:** + + `POST` + +* **URL Params** + + **Required:** + * `id=[number]` the transaction id + * `tx_id=[string]`the transaction slate id + +* **Data Params** + + None + +* **Success Response:** + + * **Code:** 200 + +* **Error Response:** + + * **Code:** 400 + +* **Sample Call:** + + ```javascript + $.ajax({ + url: "/v1/wallet/owner/repost?id=3", + dataType: "json", + type : "POST", + success : function(r) { + console.log(r); + } + }); + ``` ### POST Issue Burn Tx diff --git a/src/bin/cmd/server.rs b/src/bin/cmd/server.rs index 7f9c325d4..ea9c4ad0b 100644 --- a/src/bin/cmd/server.rs +++ b/src/bin/cmd/server.rs @@ -13,6 +13,7 @@ // limitations under the License. /// Grin server commands processing +#[cfg(not(target_os = "windows"))] use std::env::current_dir; use std::process::exit; use std::sync::atomic::{AtomicBool, Ordering}; @@ -22,7 +23,6 @@ use std::time::Duration; use clap::ArgMatches; use ctrlc; -use daemonize::Daemonize; use crate::config::GlobalConfig; use crate::core::global; @@ -31,7 +31,7 @@ use crate::servers; use crate::tui::ui; /// wrap below to allow UI to clean up on stop -fn start_server(config: servers::ServerConfig) { +pub fn start_server(config: servers::ServerConfig) { start_server_tui(config); // Just kill process for now, otherwise the process // hangs around until sigint because the API server @@ -157,29 +157,11 @@ pub fn server_command( }); }*/ - // start the server in the different run modes (interactive or daemon) if let Some(a) = server_args { match a.subcommand() { ("run", _) => { start_server(server_config); } - ("start", _) => { - let daemonize = Daemonize::new() - .pid_file("/tmp/grin.pid") - .chown_pid_file(true) - .working_directory(current_dir().unwrap()) - .privileged_action(move || { - start_server(server_config.clone()); - loop { - thread::sleep(Duration::from_secs(60)); - } - }); - match daemonize.start() { - Ok(_) => info!("Grin server successfully started."), - Err(e) => error!("Error starting: {}", e), - } - } - ("stop", _) => println!("TODO. Just 'kill $pid' for now. Maybe /tmp/grin.pid is $pid"), ("", _) => { println!("Subcommand required, use 'grin help server' for details"); } diff --git a/src/bin/cmd/wallet_args.rs b/src/bin/cmd/wallet_args.rs index 80197deae..4ae2f19d2 100644 --- a/src/bin/cmd/wallet_args.rs +++ b/src/bin/cmd/wallet_args.rs @@ -349,6 +349,9 @@ pub fn parse_send_args(args: &ArgMatches) -> Result Result "default", } } else { - parse_required(args, "dest")? + if !estimate_selection_strategies { + parse_required(args, "dest")? + } else { + "" + } } }; - if method == "http" && !dest.starts_with("http://") && !dest.starts_with("https://") { + if !estimate_selection_strategies + && method == "http" + && !dest.starts_with("http://") + && !dest.starts_with("https://") + { let msg = format!( "HTTP Destination should start with http://: or https://: {}", dest, @@ -386,6 +397,7 @@ pub fn parse_send_args(args: &ArgMatches) -> Result { let a = arg_parse!(parse_send_args(&args)); - command::send(inst_wallet(), a) + command::send( + inst_wallet(), + a, + wallet_config.dark_background_color_scheme.unwrap_or(true), + ) } ("receive", Some(args)) => { let a = arg_parse!(parse_receive_args(&args)); diff --git a/src/bin/grin.yml b/src/bin/grin.yml index 1b1f08c6c..94a18e0a1 100644 --- a/src/bin/grin.yml +++ b/src/bin/grin.yml @@ -44,10 +44,6 @@ subcommands: subcommands: - config: about: Generate a configuration grin-server.toml file in the current directory - - start: - about: Start the Grin server as a daemon - - stop: - about: Stop the Grin server daemon - run: about: Run the Grin server in this console - client: @@ -161,6 +157,10 @@ subcommands: - smallest default_value: all takes_value: true + - estimate_selection_strategies: + help: Estimates all possible Coin/Output selection strategies. + short: e + long: estimate-selection - change_outputs: help: Number of change outputs to generate (mainly for testing) short: o diff --git a/store/Cargo.toml b/store/Cargo.toml index 08fb61a45..2c663da3e 100644 --- a/store/Cargo.toml +++ b/store/Cargo.toml @@ -11,7 +11,7 @@ edition = "2018" [dependencies] byteorder = "1" -croaring = "=0.3" +croaring = "=0.3.8" env_logger = "0.5" libc = "0.2" failure = "0.1" diff --git a/store/src/lmdb.rs b/store/src/lmdb.rs index 128d95fc3..9cc5b32ef 100644 --- a/store/src/lmdb.rs +++ b/store/src/lmdb.rs @@ -73,11 +73,19 @@ pub fn new_named_env(path: String, name: String, max_readers: Option) -> lm env_builder.set_maxdbs(8).unwrap(); // half a TB should give us plenty room, will be an issue on 32 bits // (which we don't support anyway) - env_builder - .set_mapsize(549_755_813_888) - .unwrap_or_else(|e| { - panic!("Unable to allocate LMDB space: {:?}", e); - }); + + #[cfg(not(target_os = "windows"))] + env_builder.set_mapsize(5_368_709_120).unwrap_or_else(|e| { + panic!("Unable to allocate LMDB space: {:?}", e); + }); + //TODO: This is temporary to support (beta) windows support + //Windows allocates the entire file at once, so this needs to + //be changed to allocate as little as possible and increase as needed + #[cfg(target_os = "windows")] + env_builder.set_mapsize(524_288_000).unwrap_or_else(|e| { + panic!("Unable to allocate LMDB space: {:?}", e); + }); + if let Some(max_readers) = max_readers { env_builder .set_maxreaders(max_readers) diff --git a/store/src/pmmr.rs b/store/src/pmmr.rs index c6cf6b6c2..4fc031d43 100644 --- a/store/src/pmmr.rs +++ b/store/src/pmmr.rs @@ -152,6 +152,12 @@ impl Backend for PMMRBackend { self.data_file.path() } + /// Release underlying data files + fn release_files(&mut self) { + self.data_file.release(); + self.hash_file.release(); + } + fn snapshot(&self, header: &BlockHeader) -> Result<(), String> { self.leaf_set .snapshot(header) @@ -208,8 +214,8 @@ impl PMMRBackend { Ok(PMMRBackend { data_dir: data_dir.to_path_buf(), prunable, - hash_file, - data_file, + hash_file: hash_file, + data_file: data_file, leaf_set, prune_list, }) @@ -334,20 +340,11 @@ impl PMMRBackend { } self.prune_list.flush()?; } - // 4. Rename the compact copy of hash file and reopen it. - fs::rename( - tmp_prune_file_hash.clone(), - self.data_dir.join(PMMR_HASH_FILE), - )?; - self.hash_file = DataFile::open(self.data_dir.join(PMMR_HASH_FILE))?; + self.hash_file.replace(Path::new(&tmp_prune_file_hash))?; // 5. Rename the compact copy of the data file and reopen it. - fs::rename( - tmp_prune_file_data.clone(), - self.data_dir.join(PMMR_DATA_FILE), - )?; - self.data_file = DataFile::open(self.data_dir.join(PMMR_DATA_FILE))?; + self.data_file.replace(Path::new(&tmp_prune_file_data))?; // 6. Write the leaf_set to disk. // Optimize the bitmap storage in the process. diff --git a/store/src/types.rs b/store/src/types.rs index d53f81b1c..379749a31 100644 --- a/store/src/types.rs +++ b/store/src/types.rs @@ -101,6 +101,17 @@ where self.file.path() } + /// Replace underlying file with another, deleting original + pub fn replace(&mut self, with: &Path) -> io::Result<()> { + self.file.replace(with)?; + Ok(()) + } + + /// Drop underlying file handles + pub fn release(&mut self) { + self.file.release(); + } + /// Write the file out to disk, pruning removed elements. pub fn save_prune(&self, target: &str, prune_offs: &[u64], prune_cb: F) -> io::Result<()> where @@ -125,7 +136,7 @@ where /// latter by truncating the underlying file and re-creating the mmap. pub struct AppendOnlyFile { path: PathBuf, - file: File, + file: Option, mmap: Option, buffer_start: usize, buffer: Vec, @@ -135,28 +146,36 @@ pub struct AppendOnlyFile { impl AppendOnlyFile { /// Open a file (existing or not) as append-only, backed by a mmap. pub fn open>(path: P) -> io::Result { - let file = OpenOptions::new() - .read(true) - .append(true) - .create(true) - .open(&path)?; let mut aof = AppendOnlyFile { - file, + file: None, path: path.as_ref().to_path_buf(), mmap: None, buffer_start: 0, buffer: vec![], buffer_start_bak: 0, }; - // If we have a non-empty file then mmap it. - let sz = aof.size(); - if sz > 0 { - aof.buffer_start = sz as usize; - aof.mmap = Some(unsafe { memmap::Mmap::map(&aof.file)? }); - } + aof.init()?; Ok(aof) } + /// (Re)init an underlying file and its associated memmap + pub fn init(&mut self) -> io::Result<()> { + self.file = Some( + OpenOptions::new() + .read(true) + .append(true) + .create(true) + .open(self.path.clone())?, + ); + // If we have a non-empty file then mmap it. + let sz = self.size(); + if sz > 0 { + self.buffer_start = sz as usize; + self.mmap = Some(unsafe { memmap::Mmap::map(&self.file.as_ref().unwrap())? }); + } + Ok(()) + } + /// Append data to the file. Until the append-only file is synced, data is /// only written to memory. pub fn append(&mut self, bytes: &mut [u8]) { @@ -193,21 +212,37 @@ impl AppendOnlyFile { pub fn flush(&mut self) -> io::Result<()> { if self.buffer_start_bak > 0 { // Flushing a rewound state, we need to truncate via set_len() before applying. - self.file.set_len(self.buffer_start as u64)?; + // Drop and recreate, or windows throws an access error + self.mmap = None; + self.file = None; + { + let file = OpenOptions::new() + .read(true) + .create(true) + .write(true) + .open(&self.path)?; + file.set_len(self.buffer_start as u64)?; + } + let file = OpenOptions::new() + .read(true) + .create(true) + .append(true) + .open(&self.path)?; + self.file = Some(file); self.buffer_start_bak = 0; } self.buffer_start += self.buffer.len(); - self.file.write_all(&self.buffer[..])?; - self.file.sync_all()?; + self.file.as_mut().unwrap().write_all(&self.buffer[..])?; + self.file.as_mut().unwrap().sync_all()?; self.buffer = vec![]; // Note: file must be non-empty to memory map it - if self.file.metadata()?.len() == 0 { + if self.file.as_ref().unwrap().metadata()?.len() == 0 { self.mmap = None; } else { - self.mmap = Some(unsafe { memmap::Mmap::map(&self.file)? }); + self.mmap = Some(unsafe { memmap::Mmap::map(&self.file.as_ref().unwrap())? }); } Ok(()) @@ -313,6 +348,23 @@ impl AppendOnlyFile { } } + /// Replace the underlying file with another file + /// deleting the original + pub fn replace(&mut self, with: &Path) -> io::Result<()> { + self.mmap = None; + self.file = None; + fs::remove_file(&self.path)?; + fs::rename(with, &self.path)?; + self.init()?; + Ok(()) + } + + /// Release underlying file handles + pub fn release(&mut self) { + self.mmap = None; + self.file = None; + } + /// Current size of the file in bytes. pub fn size(&self) -> u64 { fs::metadata(&self.path).map(|md| md.len()).unwrap_or(0) diff --git a/store/tests/pmmr.rs b/store/tests/pmmr.rs index 28e9d82bc..26d75ec7f 100644 --- a/store/tests/pmmr.rs +++ b/store/tests/pmmr.rs @@ -30,46 +30,48 @@ use crate::store::types::prune_noop; #[test] fn pmmr_append() { let (data_dir, elems) = setup("append"); - let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); - - // adding first set of 4 elements and sync - let mut mmr_size = load(0, &elems[0..4], &mut backend); - backend.sync().unwrap(); - - // adding the rest and sync again - mmr_size = load(mmr_size, &elems[4..9], &mut backend); - backend.sync().unwrap(); - - // check the resulting backend store and the computation of the root - let node_hash = elems[0].hash_with_index(0); - assert_eq!(backend.get_hash(1).unwrap(), node_hash); - - // 0010012001001230 - - let pos_0 = elems[0].hash_with_index(0); - let pos_1 = elems[1].hash_with_index(1); - let pos_2 = (pos_0, pos_1).hash_with_index(2); - - let pos_3 = elems[2].hash_with_index(3); - let pos_4 = elems[3].hash_with_index(4); - let pos_5 = (pos_3, pos_4).hash_with_index(5); - let pos_6 = (pos_2, pos_5).hash_with_index(6); - - let pos_7 = elems[4].hash_with_index(7); - let pos_8 = elems[5].hash_with_index(8); - let pos_9 = (pos_7, pos_8).hash_with_index(9); - - let pos_10 = elems[6].hash_with_index(10); - let pos_11 = elems[7].hash_with_index(11); - let pos_12 = (pos_10, pos_11).hash_with_index(12); - let pos_13 = (pos_9, pos_12).hash_with_index(13); - let pos_14 = (pos_6, pos_13).hash_with_index(14); - - let pos_15 = elems[8].hash_with_index(15); - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(pmmr.root(), (pos_14, pos_15).hash_with_index(16)); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); + + // adding first set of 4 elements and sync + let mut mmr_size = load(0, &elems[0..4], &mut backend); + backend.sync().unwrap(); + + // adding the rest and sync again + mmr_size = load(mmr_size, &elems[4..9], &mut backend); + backend.sync().unwrap(); + + // check the resulting backend store and the computation of the root + let node_hash = elems[0].hash_with_index(0); + assert_eq!(backend.get_hash(1).unwrap(), node_hash); + + // 0010012001001230 + + let pos_0 = elems[0].hash_with_index(0); + let pos_1 = elems[1].hash_with_index(1); + let pos_2 = (pos_0, pos_1).hash_with_index(2); + + let pos_3 = elems[2].hash_with_index(3); + let pos_4 = elems[3].hash_with_index(4); + let pos_5 = (pos_3, pos_4).hash_with_index(5); + let pos_6 = (pos_2, pos_5).hash_with_index(6); + + let pos_7 = elems[4].hash_with_index(7); + let pos_8 = elems[5].hash_with_index(8); + let pos_9 = (pos_7, pos_8).hash_with_index(9); + + let pos_10 = elems[6].hash_with_index(10); + let pos_11 = elems[7].hash_with_index(11); + let pos_12 = (pos_10, pos_11).hash_with_index(12); + let pos_13 = (pos_9, pos_12).hash_with_index(13); + let pos_14 = (pos_6, pos_13).hash_with_index(14); + + let pos_15 = elems[8].hash_with_index(15); + + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(pmmr.root(), (pos_14, pos_15).hash_with_index(16)); + } } teardown(data_dir); @@ -80,69 +82,71 @@ fn pmmr_compact_leaf_sibling() { let (data_dir, elems) = setup("compact_leaf_sibling"); // setup the mmr store with all elements - let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); - let mmr_size = load(0, &elems[..], &mut backend); - backend.sync().unwrap(); - - // On far left of the MMR - - // pos 1 and 2 are leaves (and siblings) - // the parent is pos 3 - - let (pos_1_hash, pos_2_hash, pos_3_hash) = { - let pmmr = PMMR::at(&mut backend, mmr_size); - ( - pmmr.get_hash(1).unwrap(), - pmmr.get_hash(2).unwrap(), - pmmr.get_hash(3).unwrap(), - ) - }; - - // prune pos 1 { - let mut pmmr = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); + let mmr_size = load(0, &elems[..], &mut backend); + backend.sync().unwrap(); - // prune pos 8 as well to push the remove list past the cutoff - pmmr.prune(8).unwrap(); + // On far left of the MMR - + // pos 1 and 2 are leaves (and siblings) + // the parent is pos 3 + + let (pos_1_hash, pos_2_hash, pos_3_hash) = { + let pmmr = PMMR::at(&mut backend, mmr_size); + ( + pmmr.get_hash(1).unwrap(), + pmmr.get_hash(2).unwrap(), + pmmr.get_hash(3).unwrap(), + ) + }; + + // prune pos 1 + { + let mut pmmr = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + + // prune pos 8 as well to push the remove list past the cutoff + pmmr.prune(8).unwrap(); + } + backend.sync().unwrap(); + + // // check pos 1, 2, 3 are in the state we expect after pruning + { + let pmmr = PMMR::at(&mut backend, mmr_size); + + // check that pos 1 is "removed" + assert_eq!(pmmr.get_hash(1), None); + + // check that pos 2 and 3 are unchanged + assert_eq!(pmmr.get_hash(2).unwrap(), pos_2_hash); + assert_eq!(pmmr.get_hash(3).unwrap(), pos_3_hash); + } + + // check we can still retrieve the "removed" element at pos 1 + // from the backend hash file. + assert_eq!(backend.get_from_file(1).unwrap(), pos_1_hash); + + // aggressively compact the PMMR files + backend + .check_compact(1, &Bitmap::create(), &prune_noop) + .unwrap(); + + // check pos 1, 2, 3 are in the state we expect after compacting + { + let pmmr = PMMR::at(&mut backend, mmr_size); + + // check that pos 1 is "removed" + assert_eq!(pmmr.get_hash(1), None); + + // check that pos 2 and 3 are unchanged + assert_eq!(pmmr.get_hash(2).unwrap(), pos_2_hash); + assert_eq!(pmmr.get_hash(3).unwrap(), pos_3_hash); + } + + // Check we can still retrieve the "removed" hash at pos 1 from the hash file. + // It should still be available even after pruning and compacting. + assert_eq!(backend.get_from_file(1).unwrap(), pos_1_hash); } - backend.sync().unwrap(); - - // // check pos 1, 2, 3 are in the state we expect after pruning - { - let pmmr = PMMR::at(&mut backend, mmr_size); - - // check that pos 1 is "removed" - assert_eq!(pmmr.get_hash(1), None); - - // check that pos 2 and 3 are unchanged - assert_eq!(pmmr.get_hash(2).unwrap(), pos_2_hash); - assert_eq!(pmmr.get_hash(3).unwrap(), pos_3_hash); - } - - // check we can still retrieve the "removed" element at pos 1 - // from the backend hash file. - assert_eq!(backend.get_from_file(1).unwrap(), pos_1_hash); - - // aggressively compact the PMMR files - backend - .check_compact(1, &Bitmap::create(), &prune_noop) - .unwrap(); - - // check pos 1, 2, 3 are in the state we expect after compacting - { - let pmmr = PMMR::at(&mut backend, mmr_size); - - // check that pos 1 is "removed" - assert_eq!(pmmr.get_hash(1), None); - - // check that pos 2 and 3 are unchanged - assert_eq!(pmmr.get_hash(2).unwrap(), pos_2_hash); - assert_eq!(pmmr.get_hash(3).unwrap(), pos_3_hash); - } - - // Check we can still retrieve the "removed" hash at pos 1 from the hash file. - // It should still be available even after pruning and compacting. - assert_eq!(backend.get_from_file(1).unwrap(), pos_1_hash); teardown(data_dir); } @@ -152,46 +156,48 @@ fn pmmr_prune_compact() { let (data_dir, elems) = setup("prune_compact"); // setup the mmr store with all elements - let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); - let mmr_size = load(0, &elems[..], &mut backend); - backend.sync().unwrap(); - - // save the root - let root = { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.root() - }; - - // pruning some choice nodes { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); - } - backend.sync().unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); + let mmr_size = load(0, &elems[..], &mut backend); + backend.sync().unwrap(); - // check the root and stored data - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); - // check we can still retrieve same element from leaf index 2 - assert_eq!(pmmr.get_data(2).unwrap(), TestElem(2)); - // and the same for leaf index 7 - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); - } + // save the root + let root = { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.root() + }; - // compact - backend - .check_compact(2, &Bitmap::create(), &prune_noop) - .unwrap(); + // pruning some choice nodes + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + pmmr.prune(4).unwrap(); + pmmr.prune(5).unwrap(); + } + backend.sync().unwrap(); - // recheck the root and stored data - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); - assert_eq!(pmmr.get_data(2).unwrap(), TestElem(2)); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + // check the root and stored data + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + // check we can still retrieve same element from leaf index 2 + assert_eq!(pmmr.get_data(2).unwrap(), TestElem(2)); + // and the same for leaf index 7 + assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + } + + // compact + backend + .check_compact(2, &Bitmap::create(), &prune_noop) + .unwrap(); + + // recheck the root and stored data + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + assert_eq!(pmmr.get_data(2).unwrap(), TestElem(2)); + assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + } } teardown(data_dir); @@ -202,94 +208,97 @@ fn pmmr_reload() { let (data_dir, elems) = setup("reload"); // set everything up with an initial backend - let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); - - let mmr_size = load(0, &elems[..], &mut backend); - - // retrieve entries from the hash file for comparison later - let pos_3_hash = backend.get_hash(3).unwrap(); - let pos_4_hash = backend.get_hash(4).unwrap(); - let pos_5_hash = backend.get_hash(5).unwrap(); - - // save the root - let root = { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.root() - }; - - { - backend.sync().unwrap(); - - // prune a node so we have prune data - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - } - backend.sync().unwrap(); - - // now check and compact the backend - backend - .check_compact(1, &Bitmap::create(), &prune_noop) - .unwrap(); - backend.sync().unwrap(); - - // prune another node to force compact to actually do something - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(4).unwrap(); - pmmr.prune(2).unwrap(); - } - backend.sync().unwrap(); - - backend - .check_compact(4, &Bitmap::create(), &prune_noop) - .unwrap(); - backend.sync().unwrap(); - - assert_eq!(backend.unpruned_size(), mmr_size); - - // prune some more to get rm log data - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(5).unwrap(); - } - backend.sync().unwrap(); - assert_eq!(backend.unpruned_size(), mmr_size); - } - - // create a new backend referencing the data files - // and check everything still works as expected { let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); - assert_eq!(backend.unpruned_size(), mmr_size); - { + + let mmr_size = load(0, &elems[..], &mut backend); + + // retrieve entries from the hash file for comparison later + let pos_3_hash = backend.get_hash(3).unwrap(); + let pos_4_hash = backend.get_hash(4).unwrap(); + let pos_5_hash = backend.get_hash(5).unwrap(); + + // save the root + let root = { let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); + pmmr.root() + }; + + { + backend.sync().unwrap(); + + // prune a node so we have prune data + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + } + backend.sync().unwrap(); + + // now check and compact the backend + backend + .check_compact(1, &Bitmap::create(), &prune_noop) + .unwrap(); + backend.sync().unwrap(); + + // prune another node to force compact to actually do something + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(4).unwrap(); + pmmr.prune(2).unwrap(); + } + backend.sync().unwrap(); + + backend + .check_compact(4, &Bitmap::create(), &prune_noop) + .unwrap(); + backend.sync().unwrap(); + + assert_eq!(backend.unpruned_size(), mmr_size); + + // prune some more to get rm log data + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(5).unwrap(); + } + backend.sync().unwrap(); + assert_eq!(backend.unpruned_size(), mmr_size); } - // pos 1 and pos 2 are both removed (via parent pos 3 in prune list) - assert_eq!(backend.get_hash(1), None); - assert_eq!(backend.get_hash(2), None); + // create a new backend referencing the data files + // and check everything still works as expected + { + let mut backend = + store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); + assert_eq!(backend.unpruned_size(), mmr_size); + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + } - // pos 3 is "removed" but we keep the hash around for root of pruned subtree - assert_eq!(backend.get_hash(3), Some(pos_3_hash)); + // pos 1 and pos 2 are both removed (via parent pos 3 in prune list) + assert_eq!(backend.get_hash(1), None); + assert_eq!(backend.get_hash(2), None); - // pos 4 is removed (via prune list) - assert_eq!(backend.get_hash(4), None); - // pos 5 is removed (via leaf_set) - assert_eq!(backend.get_hash(5), None); + // pos 3 is "removed" but we keep the hash around for root of pruned subtree + assert_eq!(backend.get_hash(3), Some(pos_3_hash)); - // now check contents of the hash file - // pos 1 and pos 2 are no longer in the hash file - assert_eq!(backend.get_from_file(1), None); - assert_eq!(backend.get_from_file(2), None); + // pos 4 is removed (via prune list) + assert_eq!(backend.get_hash(4), None); + // pos 5 is removed (via leaf_set) + assert_eq!(backend.get_hash(5), None); - // pos 3 is still in there - assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); + // now check contents of the hash file + // pos 1 and pos 2 are no longer in the hash file + assert_eq!(backend.get_from_file(1), None); + assert_eq!(backend.get_from_file(2), None); - // pos 4 and pos 5 are also still in there - assert_eq!(backend.get_from_file(4), Some(pos_4_hash)); - assert_eq!(backend.get_from_file(5), Some(pos_5_hash)); + // pos 3 is still in there + assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); + + // pos 4 and pos 5 are also still in there + assert_eq!(backend.get_from_file(4), Some(pos_4_hash)); + assert_eq!(backend.get_from_file(5), Some(pos_5_hash)); + } } teardown(data_dir); @@ -298,126 +307,130 @@ fn pmmr_reload() { #[test] fn pmmr_rewind() { let (data_dir, elems) = setup("rewind"); - let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); - - // adding elements and keeping the corresponding root - let mut mmr_size = load(0, &elems[0..4], &mut backend); - backend.sync().unwrap(); - let root1 = { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.root() - }; - - mmr_size = load(mmr_size, &elems[4..6], &mut backend); - backend.sync().unwrap(); - let root2 = { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(pmmr.unpruned_size(), 10); - pmmr.root() - }; - - mmr_size = load(mmr_size, &elems[6..9], &mut backend); - backend.sync().unwrap(); - let root3 = { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(pmmr.unpruned_size(), 16); - pmmr.root() - }; - - // prune the first 4 elements (leaves at pos 1, 2, 4, 5) { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); - pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); + + // adding elements and keeping the corresponding root + let mut mmr_size = load(0, &elems[0..4], &mut backend); + backend.sync().unwrap(); + let root1 = { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.root() + }; + + mmr_size = load(mmr_size, &elems[4..6], &mut backend); + backend.sync().unwrap(); + let root2 = { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(pmmr.unpruned_size(), 10); + pmmr.root() + }; + + mmr_size = load(mmr_size, &elems[6..9], &mut backend); + backend.sync().unwrap(); + let root3 = { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(pmmr.unpruned_size(), 16); + pmmr.root() + }; + + // prune the first 4 elements (leaves at pos 1, 2, 4, 5) + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + pmmr.prune(2).unwrap(); + pmmr.prune(4).unwrap(); + pmmr.prune(5).unwrap(); + } + backend.sync().unwrap(); + + println!("before compacting - "); + for x in 1..17 { + println!("pos {}, {:?}", x, backend.get_from_file(x)); + } + + // and compact the MMR to remove the pruned elements + backend + .check_compact(6, &Bitmap::create(), &prune_noop) + .unwrap(); + backend.sync().unwrap(); + + println!("after compacting - "); + for x in 1..17 { + println!("pos {}, {:?}", x, backend.get_from_file(x)); + } + + println!("root1 {:?}, root2 {:?}, root3 {:?}", root1, root2, root3); + + // rewind and check the roots still match + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.rewind(9, &Bitmap::of(&vec![11, 12, 16])).unwrap(); + assert_eq!(pmmr.unpruned_size(), 10); + + // assert_eq!(pmmr.root(), root2); + } + println!("after rewinding - "); + for x in 1..17 { + println!("pos {}, {:?}", x, backend.get_from_file(x)); + } + + println!("doing a sync after rewinding"); + if let Err(e) = backend.sync() { + panic!("Err: {:?}", e); + } + + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 10); + assert_eq!(pmmr.root(), root2); + } + + // Also check the data file looks correct. + // pos 1, 2, 4, 5 are all leaves but these have been pruned. + for pos in vec![1, 2, 4, 5] { + assert_eq!(backend.get_data(pos), None); + } + // pos 3, 6, 7 are non-leaves so we have no data for these + for pos in vec![3, 6, 7] { + assert_eq!(backend.get_data(pos), None); + } + + // pos 8 and 9 are both leaves and should be unaffected by prior pruning + + for x in 1..16 { + println!("data at {}, {:?}", x, backend.get_data(x)); + } + + assert_eq!(backend.get_data(8), Some(elems[4])); + assert_eq!(backend.get_hash(8), Some(elems[4].hash_with_index(7))); + + assert_eq!(backend.get_data(9), Some(elems[5])); + assert_eq!(backend.get_hash(9), Some(elems[5].hash_with_index(8))); + + assert_eq!(backend.data_size(), 2); + + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 10); + pmmr.rewind(5, &Bitmap::create()).unwrap(); + assert_eq!(pmmr.root(), root1); + } + backend.sync().unwrap(); + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 7); + assert_eq!(pmmr.root(), root1); + } + + // also check the data file looks correct + // everything up to and including pos 7 should be pruned from the data file + // but we have rewound to pos 5 so everything after that should be None + for pos in 1..10 { + assert_eq!(backend.get_data(pos), None); + } + + // check we have no data in the backend after + // pruning, compacting and rewinding + assert_eq!(backend.data_size(), 0); } - backend.sync().unwrap(); - - println!("before compacting - "); - for x in 1..17 { - println!("pos {}, {:?}", x, backend.get_from_file(x)); - } - - // and compact the MMR to remove the pruned elements - backend - .check_compact(6, &Bitmap::create(), &prune_noop) - .unwrap(); - backend.sync().unwrap(); - - println!("after compacting - "); - for x in 1..17 { - println!("pos {}, {:?}", x, backend.get_from_file(x)); - } - - println!("root1 {:?}, root2 {:?}, root3 {:?}", root1, root2, root3); - - // rewind and check the roots still match - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.rewind(9, &Bitmap::of(&vec![11, 12, 16])).unwrap(); - assert_eq!(pmmr.unpruned_size(), 10); - - // assert_eq!(pmmr.root(), root2); - } - println!("after rewinding - "); - for x in 1..17 { - println!("pos {}, {:?}", x, backend.get_from_file(x)); - } - - println!("doing a sync after rewinding"); - backend.sync().unwrap(); - - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 10); - assert_eq!(pmmr.root(), root2); - } - - // Also check the data file looks correct. - // pos 1, 2, 4, 5 are all leaves but these have been pruned. - for pos in vec![1, 2, 4, 5] { - assert_eq!(backend.get_data(pos), None); - } - // pos 3, 6, 7 are non-leaves so we have no data for these - for pos in vec![3, 6, 7] { - assert_eq!(backend.get_data(pos), None); - } - - // pos 8 and 9 are both leaves and should be unaffected by prior pruning - - for x in 1..16 { - println!("data at {}, {:?}", x, backend.get_data(x)); - } - - assert_eq!(backend.get_data(8), Some(elems[4])); - assert_eq!(backend.get_hash(8), Some(elems[4].hash_with_index(7))); - - assert_eq!(backend.get_data(9), Some(elems[5])); - assert_eq!(backend.get_hash(9), Some(elems[5].hash_with_index(8))); - - assert_eq!(backend.data_size(), 2); - - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 10); - pmmr.rewind(5, &Bitmap::create()).unwrap(); - assert_eq!(pmmr.root(), root1); - } - backend.sync().unwrap(); - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, 7); - assert_eq!(pmmr.root(), root1); - } - - // also check the data file looks correct - // everything up to and including pos 7 should be pruned from the data file - // but we have rewound to pos 5 so everything after that should be None - for pos in 1..10 { - assert_eq!(backend.get_data(pos), None); - } - - // check we have no data in the backend after - // pruning, compacting and rewinding - assert_eq!(backend.data_size(), 0); teardown(data_dir); } @@ -425,216 +438,238 @@ fn pmmr_rewind() { #[test] fn pmmr_compact_single_leaves() { let (data_dir, elems) = setup("compact_single_leaves"); - let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); - let mmr_size = load(0, &elems[0..5], &mut backend); - backend.sync().unwrap(); - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - pmmr.prune(4).unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); + let mmr_size = load(0, &elems[0..5], &mut backend); + backend.sync().unwrap(); + + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + pmmr.prune(4).unwrap(); + } + + backend.sync().unwrap(); + + // compact + backend + .check_compact(2, &Bitmap::create(), &prune_noop) + .unwrap(); + + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(2).unwrap(); + pmmr.prune(5).unwrap(); + } + + backend.sync().unwrap(); + + // compact + backend + .check_compact(2, &Bitmap::create(), &prune_noop) + .unwrap(); } - backend.sync().unwrap(); - - // compact - backend - .check_compact(2, &Bitmap::create(), &prune_noop) - .unwrap(); - - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(2).unwrap(); - pmmr.prune(5).unwrap(); - } - - backend.sync().unwrap(); - - // compact - backend - .check_compact(2, &Bitmap::create(), &prune_noop) - .unwrap(); - teardown(data_dir); } #[test] fn pmmr_compact_entire_peak() { let (data_dir, elems) = setup("compact_entire_peak"); - let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); - let mmr_size = load(0, &elems[0..5], &mut backend); - backend.sync().unwrap(); - - let pos_7_hash = backend.get_hash(7).unwrap(); - - let pos_8 = backend.get_data(8).unwrap(); - let pos_8_hash = backend.get_hash(8).unwrap(); - - // prune all leaves under the peak at pos 7 { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); - pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); + let mmr_size = load(0, &elems[0..5], &mut backend); + backend.sync().unwrap(); + + let pos_7_hash = backend.get_hash(7).unwrap(); + + let pos_8 = backend.get_data(8).unwrap(); + let pos_8_hash = backend.get_hash(8).unwrap(); + + // prune all leaves under the peak at pos 7 + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + pmmr.prune(2).unwrap(); + pmmr.prune(4).unwrap(); + pmmr.prune(5).unwrap(); + } + + backend.sync().unwrap(); + + // compact + backend + .check_compact(2, &Bitmap::create(), &prune_noop) + .unwrap(); + + // now check we have pruned up to and including the peak at pos 7 + // hash still available in underlying hash file + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + + // now check we still have subsequent hash and data where we expect + assert_eq!(backend.get_data(8), Some(pos_8)); + assert_eq!(backend.get_hash(8), Some(pos_8_hash)); + assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); } - backend.sync().unwrap(); - - // compact - backend - .check_compact(2, &Bitmap::create(), &prune_noop) - .unwrap(); - - // now check we have pruned up to and including the peak at pos 7 - // hash still available in underlying hash file - assert_eq!(backend.get_hash(7), Some(pos_7_hash)); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); - - // now check we still have subsequent hash and data where we expect - assert_eq!(backend.get_data(8), Some(pos_8)); - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); - teardown(data_dir); } #[test] fn pmmr_compact_horizon() { let (data_dir, elems) = setup("compact_horizon"); - let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); - let mmr_size = load(0, &elems[..], &mut backend); - backend.sync().unwrap(); - - // 0010012001001230 - // 9 leaves - assert_eq!(backend.data_size(), 19); - assert_eq!(backend.hash_size(), 35); - - let pos_1_hash = backend.get_hash(1).unwrap(); - let pos_2_hash = backend.get_hash(2).unwrap(); - let pos_3_hash = backend.get_hash(3).unwrap(); - let pos_6_hash = backend.get_hash(6).unwrap(); - let pos_7_hash = backend.get_hash(7).unwrap(); - - let pos_8 = backend.get_data(8).unwrap(); - let pos_8_hash = backend.get_hash(8).unwrap(); - - let pos_11 = backend.get_data(11).unwrap(); - let pos_11_hash = backend.get_hash(11).unwrap(); - { - // pruning some choice nodes + let pos_1_hash; + let pos_2_hash; + let pos_3_hash; + let pos_6_hash; + let pos_7_hash; + + let pos_8; + let pos_8_hash; + + let pos_11; + let pos_11_hash; + + let mmr_size; { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(4).unwrap(); - pmmr.prune(5).unwrap(); - pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.clone(), true, None).unwrap(); + mmr_size = load(0, &elems[..], &mut backend); + backend.sync().unwrap(); + + // 0010012001001230 + // 9 leaves + assert_eq!(backend.data_size(), 19); + assert_eq!(backend.hash_size(), 35); + + pos_1_hash = backend.get_hash(1).unwrap(); + pos_2_hash = backend.get_hash(2).unwrap(); + pos_3_hash = backend.get_hash(3).unwrap(); + pos_6_hash = backend.get_hash(6).unwrap(); + pos_7_hash = backend.get_hash(7).unwrap(); + + pos_8 = backend.get_data(8).unwrap(); + pos_8_hash = backend.get_hash(8).unwrap(); + + pos_11 = backend.get_data(11).unwrap(); + pos_11_hash = backend.get_hash(11).unwrap(); + + // pruning some choice nodes + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(4).unwrap(); + pmmr.prune(5).unwrap(); + pmmr.prune(1).unwrap(); + pmmr.prune(2).unwrap(); + } + backend.sync().unwrap(); + + // check we can read hashes and data correctly after pruning + { + // assert_eq!(backend.get_hash(3), None); + assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); + + // assert_eq!(backend.get_hash(6), None); + assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); + + // assert_eq!(backend.get_hash(7), None); + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + + assert_eq!(backend.get_hash(8), Some(pos_8_hash)); + assert_eq!(backend.get_data(8), Some(pos_8)); + assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); + + assert_eq!(backend.get_hash(11), Some(pos_11_hash)); + assert_eq!(backend.get_data(11), Some(pos_11)); + assert_eq!(backend.get_from_file(11), Some(pos_11_hash)); + } + + // compact + backend + .check_compact(4, &Bitmap::of(&vec![1, 2]), &prune_noop) + .unwrap(); + backend.sync().unwrap(); + + // check we can read a hash by pos correctly after compaction + { + assert_eq!(backend.get_hash(1), None); + assert_eq!(backend.get_from_file(1), Some(pos_1_hash)); + + assert_eq!(backend.get_hash(2), None); + assert_eq!(backend.get_from_file(2), Some(pos_2_hash)); + + assert_eq!(backend.get_hash(3), Some(pos_3_hash)); + + assert_eq!(backend.get_hash(4), None); + assert_eq!(backend.get_hash(5), None); + assert_eq!(backend.get_hash(6), Some(pos_6_hash)); + + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); + + assert_eq!(backend.get_hash(8), Some(pos_8_hash)); + assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); + } } - backend.sync().unwrap(); - // check we can read hashes and data correctly after pruning + // recheck stored data { - // assert_eq!(backend.get_hash(3), None); - assert_eq!(backend.get_from_file(3), Some(pos_3_hash)); + // recreate backend + let backend = + store::pmmr::PMMRBackend::::new(data_dir.to_string(), true, None) + .unwrap(); - // assert_eq!(backend.get_hash(6), None); - assert_eq!(backend.get_from_file(6), Some(pos_6_hash)); + assert_eq!(backend.data_size(), 19); + assert_eq!(backend.hash_size(), 35); - // assert_eq!(backend.get_hash(7), None); + // check we can read a hash by pos correctly from recreated backend + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_data(8), Some(pos_8)); assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); + } + + { + let mut backend = + store::pmmr::PMMRBackend::::new(data_dir.to_string(), true, None) + .unwrap(); + + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + + pmmr.prune(8).unwrap(); + pmmr.prune(9).unwrap(); + } + + // compact some more + backend + .check_compact(9, &Bitmap::create(), &prune_noop) + .unwrap(); + } + + // recheck stored data + { + // recreate backend + let backend = + store::pmmr::PMMRBackend::::new(data_dir.to_string(), true, None) + .unwrap(); + + // 0010012001001230 + + assert_eq!(backend.data_size(), 13); + assert_eq!(backend.hash_size(), 27); + + // check we can read a hash by pos correctly from recreated backend + // get_hash() and get_from_file() should return the same value + // and we only store leaves in the leaf_set so pos 7 still has a hash in there + assert_eq!(backend.get_hash(7), Some(pos_7_hash)); + assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); assert_eq!(backend.get_hash(11), Some(pos_11_hash)); assert_eq!(backend.get_data(11), Some(pos_11)); assert_eq!(backend.get_from_file(11), Some(pos_11_hash)); } - - // compact - backend - .check_compact(4, &Bitmap::of(&vec![1, 2]), &prune_noop) - .unwrap(); - backend.sync().unwrap(); - - // check we can read a hash by pos correctly after compaction - { - assert_eq!(backend.get_hash(1), None); - assert_eq!(backend.get_from_file(1), Some(pos_1_hash)); - - assert_eq!(backend.get_hash(2), None); - assert_eq!(backend.get_from_file(2), Some(pos_2_hash)); - - assert_eq!(backend.get_hash(3), Some(pos_3_hash)); - - assert_eq!(backend.get_hash(4), None); - assert_eq!(backend.get_hash(5), None); - assert_eq!(backend.get_hash(6), Some(pos_6_hash)); - - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); - - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); - } - } - - // recheck stored data - { - // recreate backend - let backend = - store::pmmr::PMMRBackend::::new(data_dir.to_string(), true, None).unwrap(); - - assert_eq!(backend.data_size(), 19); - assert_eq!(backend.hash_size(), 35); - - // check we can read a hash by pos correctly from recreated backend - assert_eq!(backend.get_hash(7), Some(pos_7_hash)); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); - - assert_eq!(backend.get_hash(8), Some(pos_8_hash)); - assert_eq!(backend.get_from_file(8), Some(pos_8_hash)); - } - - { - let mut backend = - store::pmmr::PMMRBackend::::new(data_dir.to_string(), true, None).unwrap(); - - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - - pmmr.prune(8).unwrap(); - pmmr.prune(9).unwrap(); - } - - // compact some more - backend - .check_compact(9, &Bitmap::create(), &prune_noop) - .unwrap(); - } - - // recheck stored data - { - // recreate backend - let backend = - store::pmmr::PMMRBackend::::new(data_dir.to_string(), true, None).unwrap(); - - // 0010012001001230 - - assert_eq!(backend.data_size(), 13); - assert_eq!(backend.hash_size(), 27); - - // check we can read a hash by pos correctly from recreated backend - // get_hash() and get_from_file() should return the same value - // and we only store leaves in the leaf_set so pos 7 still has a hash in there - assert_eq!(backend.get_hash(7), Some(pos_7_hash)); - assert_eq!(backend.get_from_file(7), Some(pos_7_hash)); - - assert_eq!(backend.get_hash(11), Some(pos_11_hash)); - assert_eq!(backend.get_data(11), Some(pos_11)); - assert_eq!(backend.get_from_file(11), Some(pos_11_hash)); } teardown(data_dir); @@ -645,72 +680,75 @@ fn compact_twice() { let (data_dir, elems) = setup("compact_twice"); // setup the mmr store with all elements - let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); - let mmr_size = load(0, &elems[..], &mut backend); - backend.sync().unwrap(); - - // save the root - let root = { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.root() - }; - - // pruning some choice nodes + // Scoped to allow Windows to teardown { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(1).unwrap(); - pmmr.prune(2).unwrap(); - pmmr.prune(4).unwrap(); - } - backend.sync().unwrap(); + let mut backend = store::pmmr::PMMRBackend::new(data_dir.to_string(), true, None).unwrap(); + let mmr_size = load(0, &elems[..], &mut backend); + backend.sync().unwrap(); - // check the root and stored data - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); - assert_eq!(pmmr.get_data(5).unwrap(), TestElem(4)); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); - } + // save the root + let root = { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.root() + }; - // compact - backend - .check_compact(2, &Bitmap::create(), &prune_noop) - .unwrap(); + // pruning some choice nodes + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(1).unwrap(); + pmmr.prune(2).unwrap(); + pmmr.prune(4).unwrap(); + } + backend.sync().unwrap(); - // recheck the root and stored data - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); - assert_eq!(pmmr.get_data(5).unwrap(), TestElem(4)); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); - } + // check the root and stored data + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + assert_eq!(pmmr.get_data(5).unwrap(), TestElem(4)); + assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + } - // now prune some more nodes - { - let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - pmmr.prune(5).unwrap(); - pmmr.prune(8).unwrap(); - pmmr.prune(9).unwrap(); - } - backend.sync().unwrap(); + // compact + backend + .check_compact(2, &Bitmap::create(), &prune_noop) + .unwrap(); - // recheck the root and stored data - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); - } + // recheck the root and stored data + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + assert_eq!(pmmr.get_data(5).unwrap(), TestElem(4)); + assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + } - // compact - backend - .check_compact(2, &Bitmap::create(), &prune_noop) - .unwrap(); + // now prune some more nodes + { + let mut pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + pmmr.prune(5).unwrap(); + pmmr.prune(8).unwrap(); + pmmr.prune(9).unwrap(); + } + backend.sync().unwrap(); - // recheck the root and stored data - { - let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); - assert_eq!(root, pmmr.root()); - assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + // recheck the root and stored data + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + } + + // compact + backend + .check_compact(2, &Bitmap::create(), &prune_noop) + .unwrap(); + + // recheck the root and stored data + { + let pmmr: PMMR<'_, TestElem, _> = PMMR::at(&mut backend, mmr_size); + assert_eq!(root, pmmr.root()); + assert_eq!(pmmr.get_data(11).unwrap(), TestElem(7)); + } } teardown(data_dir); diff --git a/util/src/zip.rs b/util/src/zip.rs index 1f31aec89..52531bd59 100644 --- a/util/src/zip.rs +++ b/util/src/zip.rs @@ -80,7 +80,15 @@ where fs::create_dir_all(&p)?; } } - let mut outfile = fs::File::create(&file_path)?; + //let mut outfile = fs::File::create(&file_path)?; + let res = fs::File::create(&file_path); + let mut outfile = match res { + Err(e) => { + error!("{:?}", e); + return Err(zip::result::ZipError::Io(e)); + } + Ok(r) => r, + }; io::copy(&mut file, &mut outfile)?; } diff --git a/wallet/src/adapters/file.rs b/wallet/src/adapters/file.rs index 0fd305cce..12fe459a9 100644 --- a/wallet/src/adapters/file.rs +++ b/wallet/src/adapters/file.rs @@ -16,10 +16,10 @@ use std::fs::File; use std::io::{Read, Write}; +use crate::adapters::util::{deserialize_slate, serialize_slate}; use crate::libwallet::slate::Slate; -use crate::libwallet::{Error, ErrorKind}; +use crate::libwallet::Error; use crate::{WalletCommAdapter, WalletConfig}; -use serde_json as json; use std::collections::HashMap; #[derive(Clone)] @@ -43,7 +43,8 @@ impl WalletCommAdapter for FileWalletCommAdapter { fn send_tx_async(&self, dest: &str, slate: &Slate) -> Result<(), Error> { let mut pub_tx = File::create(dest)?; - pub_tx.write_all(json::to_string(&slate).unwrap().as_bytes())?; + let slate_string = serialize_slate(slate); + pub_tx.write_all(slate_string.as_bytes())?; pub_tx.sync_all()?; Ok(()) } @@ -52,7 +53,7 @@ impl WalletCommAdapter for FileWalletCommAdapter { let mut pub_tx_f = File::open(params)?; let mut content = String::new(); pub_tx_f.read_to_string(&mut content)?; - Ok(json::from_str(&content).map_err(|err| ErrorKind::Format(err.to_string()))?) + Ok(deserialize_slate(&content)) } fn listen( diff --git a/wallet/src/adapters/http.rs b/wallet/src/adapters/http.rs index 31ce97f77..c8988af73 100644 --- a/wallet/src/adapters/http.rs +++ b/wallet/src/adapters/http.rs @@ -12,9 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::adapters::util::get_versioned_slate; use crate::api; use crate::controller; -use crate::libwallet::slate::Slate; +use crate::libwallet::slate::{Slate, VersionedSlate}; use crate::libwallet::{Error, ErrorKind}; use crate::{instantiate_wallet, HTTPNodeClient, WalletCommAdapter, WalletConfig}; /// HTTP Wallet 'plugin' implementation @@ -47,15 +48,15 @@ impl WalletCommAdapter for HTTPWalletCommAdapter { } let url = format!("{}/v1/wallet/foreign/receive_tx", dest); debug!("Posting transaction slate to {}", url); - - let res = api::client::post(url.as_str(), None, slate); + let slate = get_versioned_slate(slate); + let res: Result = api::client::post(url.as_str(), None, &slate); match res { Err(e) => { let report = format!("Posting transaction slate (is recipient listening?): {}", e); error!("{}", report); Err(ErrorKind::ClientCallback(report).into()) } - Ok(r) => Ok(r), + Ok(r) => Ok(r.into()), } } diff --git a/wallet/src/adapters/keybase.rs b/wallet/src/adapters/keybase.rs index 2cac127fb..f34e63507 100644 --- a/wallet/src/adapters/keybase.rs +++ b/wallet/src/adapters/keybase.rs @@ -15,7 +15,8 @@ // Keybase Wallet Plugin use crate::controller; -use crate::libwallet::slate::Slate; +use crate::libwallet::slate::{Slate, VersionedSlate}; +use crate::libwallet::slate_versions::v0::SlateV0; use crate::libwallet::{Error, ErrorKind}; use crate::{instantiate_wallet, HTTPNodeClient, WalletCommAdapter, WalletConfig}; use failure::ResultExt; @@ -192,6 +193,7 @@ fn get_unread(topic: &str) -> Result, Error> { /// Send a message to a keybase channel that self-destructs after ttl seconds. fn send(message: T, channel: &str, topic: &str, ttl: u16) -> bool { let seconds = format!("{}s", ttl); + let serialized = to_string(&message).unwrap(); let payload = to_string(&json!({ "method": "send", "params": { @@ -200,7 +202,7 @@ fn send(message: T, channel: &str, topic: &str, ttl: u16) -> bool "name": channel, "topic_name": topic, "topic_type": "dev" }, "message": { - "body": to_string(&message).unwrap() + "body": serialized }, "exploding_lifetime": seconds } @@ -210,7 +212,10 @@ fn send(message: T, channel: &str, topic: &str, ttl: u16) -> bool let response = api_send(&payload); if let Ok(res) = response { match res["result"]["message"].as_str() { - Some("message sent") => true, + Some("message sent") => { + debug!("Message sent to {}: {}", channel, serialized); + true + } _ => false, } } else { @@ -254,9 +259,10 @@ fn poll(nseconds: u64, channel: &str) -> Option { while start.elapsed().as_secs() < nseconds { let unread = read_from_channel(channel, SLATE_SIGNED); for msg in unread.unwrap().iter() { - let blob = from_str::(msg); + let blob = from_str::(msg); match blob { Ok(slate) => { + let slate: Slate = slate.into(); info!( "keybase response message received from @{}, tx uuid: {}", channel, slate.id, @@ -288,8 +294,10 @@ impl WalletCommAdapter for KeybaseWalletCommAdapter { return Err(ErrorKind::GenericError("Tx rejected".to_owned()))?; } + let id = slate.id; + // Send original slate to recipient with the SLATE_NEW topic - match send(slate, addr, SLATE_NEW, TTL) { + match send(&slate, addr, SLATE_NEW, TTL) { true => (), false => { return Err(ErrorKind::ClientCallback( @@ -297,10 +305,7 @@ impl WalletCommAdapter for KeybaseWalletCommAdapter { ))? } } - info!( - "tx request has been sent to @{}, tx uuid: {}", - addr, slate.id - ); + info!("tx request has been sent to @{}, tx uuid: {}", addr, id); // Wait for response from recipient with SLATE_SIGNED topic match poll(TTL as u64, addr) { Some(slate) => return Ok(slate), @@ -345,9 +350,10 @@ impl WalletCommAdapter for KeybaseWalletCommAdapter { break; } for (msg, channel) in &unread.unwrap() { - let blob = from_str::(msg); + let blob = from_str::(msg); match blob { - Ok(mut slate) => { + Ok(message) => { + let mut slate: Slate = message.clone().into(); let tx_uuid = slate.id; // Reject multiple recipients channel for safety @@ -378,19 +384,29 @@ impl WalletCommAdapter for KeybaseWalletCommAdapter { Ok(()) }) { // Reply to the same channel with topic SLATE_SIGNED - Ok(_) => match send(slate, channel, SLATE_SIGNED, TTL) { - true => { + Ok(_) => { + let success = match message { + // Send the same version of slate that was sent to us + VersionedSlate::V0(_) => { + send(SlateV0::from(slate), channel, SLATE_SIGNED, TTL) + } + VersionedSlate::V1(_) => { + send(slate, channel, SLATE_SIGNED, TTL) + } + }; + + if success { notify_on_receive( config.keybase_notify_ttl.unwrap_or(1440), channel.to_string(), tx_uuid.to_string(), ); debug!("Returned slate to @{} via keybase", channel); - } - false => { + } else { error!("Failed to return slate to @{} via keybase. Incoming tx failed", channel); } - }, + } + Err(e) => { error!( "Error on receiving tx via keybase: {}. Incoming tx failed", @@ -399,7 +415,7 @@ impl WalletCommAdapter for KeybaseWalletCommAdapter { } } } - Err(_) => (), + Err(_) => debug!("Failed to deserialize keybase message: {}", msg), } } sleep(LISTEN_SLEEP_DURATION); diff --git a/wallet/src/adapters/mod.rs b/wallet/src/adapters/mod.rs index c42b09647..d1c53eff3 100644 --- a/wallet/src/adapters/mod.rs +++ b/wallet/src/adapters/mod.rs @@ -16,6 +16,7 @@ mod file; mod http; mod keybase; mod null; +pub mod util; pub use self::file::FileWalletCommAdapter; pub use self::http::HTTPWalletCommAdapter; diff --git a/wallet/src/adapters/util.rs b/wallet/src/adapters/util.rs new file mode 100644 index 000000000..86ac7f047 --- /dev/null +++ b/wallet/src/adapters/util.rs @@ -0,0 +1,23 @@ +use crate::libwallet::slate::{Slate, VersionedSlate}; +use crate::libwallet::slate_versions::v0::SlateV0; +use crate::libwallet::ErrorKind; +use serde_json as json; + +pub fn get_versioned_slate(slate: &Slate) -> VersionedSlate { + let slate = slate.clone(); + match slate.version { + 0 => VersionedSlate::V0(SlateV0::from(slate)), + _ => VersionedSlate::V1(slate), + } +} + +pub fn serialize_slate(slate: &Slate) -> String { + json::to_string(&get_versioned_slate(slate)).unwrap() +} + +pub fn deserialize_slate(raw_slate: &str) -> Slate { + let versioned_slate: VersionedSlate = json::from_str(&raw_slate) + .map_err(|err| ErrorKind::Format(err.to_string())) + .unwrap(); + versioned_slate.into() +} diff --git a/wallet/src/command.rs b/wallet/src/command.rs index 35e51959f..593a042e8 100644 --- a/wallet/src/command.rs +++ b/wallet/src/command.rs @@ -200,6 +200,7 @@ pub struct SendArgs { pub message: Option, pub minimum_confirmations: u64, pub selection_strategy: String, + pub estimate_selection_strategies: bool, pub method: String, pub dest: String, pub change_outputs: usize, @@ -210,68 +211,89 @@ pub struct SendArgs { pub fn send( wallet: Arc>>, args: SendArgs, + dark_scheme: bool, ) -> Result<(), Error> { controller::owner_single_use(wallet.clone(), |api| { - let result = api.initiate_tx( - None, - args.amount, - args.minimum_confirmations, - args.max_outputs, - args.change_outputs, - args.selection_strategy == "all", - args.message.clone(), - ); - let (mut slate, lock_fn) = match result { - Ok(s) => { - info!( - "Tx created: {} grin to {} (strategy '{}')", - core::amount_to_hr_string(args.amount, false), - args.dest, - args.selection_strategy, - ); - s - } - Err(e) => { - info!("Tx not created: {}", e); - return Err(e); - } - }; - let adapter = match args.method.as_str() { - "http" => HTTPWalletCommAdapter::new(), - "file" => FileWalletCommAdapter::new(), - "keybase" => KeybaseWalletCommAdapter::new(), - "self" => NullWalletCommAdapter::new(), - _ => NullWalletCommAdapter::new(), - }; - if adapter.supports_sync() { - slate = adapter.send_tx_sync(&args.dest, &slate)?; - api.tx_lock_outputs(&slate, lock_fn)?; - if args.method == "self" { - controller::foreign_single_use(wallet, |api| { - api.receive_tx(&mut slate, Some(&args.dest), None)?; - Ok(()) - })?; - } - if let Err(e) = api.verify_slate_messages(&slate) { - error!("Error validating participant messages: {}", e); - return Err(e); - } - api.finalize_tx(&mut slate)?; + if args.estimate_selection_strategies { + let strategies = vec!["smallest", "all"] + .into_iter() + .map(|strategy| { + let (total, fee) = api + .estimate_initiate_tx( + None, + args.amount, + args.minimum_confirmations, + args.max_outputs, + args.change_outputs, + strategy == "all", + ) + .unwrap(); + (strategy, total, fee) + }) + .collect(); + display::estimate(args.amount, strategies, dark_scheme); } else { - adapter.send_tx_async(&args.dest, &slate)?; - api.tx_lock_outputs(&slate, lock_fn)?; - } - if adapter.supports_sync() { - let result = api.post_tx(&slate.tx, args.fluff); - match result { - Ok(_) => { - info!("Tx sent ok",); - return Ok(()); + let result = api.initiate_tx( + None, + args.amount, + args.minimum_confirmations, + args.max_outputs, + args.change_outputs, + args.selection_strategy == "all", + args.message.clone(), + ); + let (mut slate, lock_fn) = match result { + Ok(s) => { + info!( + "Tx created: {} grin to {} (strategy '{}')", + core::amount_to_hr_string(args.amount, false), + args.dest, + args.selection_strategy, + ); + s } Err(e) => { - error!("Tx sent fail: {}", e); + info!("Tx not created: {}", e); return Err(e); } + }; + let adapter = match args.method.as_str() { + "http" => HTTPWalletCommAdapter::new(), + "file" => FileWalletCommAdapter::new(), + "keybase" => KeybaseWalletCommAdapter::new(), + "self" => NullWalletCommAdapter::new(), + _ => NullWalletCommAdapter::new(), + }; + if adapter.supports_sync() { + slate = adapter.send_tx_sync(&args.dest, &slate)?; + api.tx_lock_outputs(&slate, lock_fn)?; + if args.method == "self" { + controller::foreign_single_use(wallet, |api| { + api.receive_tx(&mut slate, Some(&args.dest), None)?; + Ok(()) + })?; + } + if let Err(e) = api.verify_slate_messages(&slate) { + error!("Error validating participant messages: {}", e); + return Err(e); + } + api.finalize_tx(&mut slate)?; + } else { + adapter.send_tx_async(&args.dest, &slate)?; + api.tx_lock_outputs(&slate, lock_fn)?; + } + if adapter.supports_sync() { + let result = api.post_tx(&slate.tx, args.fluff); + match result { + Ok(_) => { + info!("Tx sent ok",); + return Ok(()); + } + Err(e) => { + error!("Tx sent fail: {}", e); + return Err(e); + } + } } } Ok(()) diff --git a/wallet/src/controller.rs b/wallet/src/controller.rs index 9bd584932..18e64936c 100644 --- a/wallet/src/controller.rs +++ b/wallet/src/controller.rs @@ -15,13 +15,14 @@ //! Controller for wallet.. instantiates and handles listeners (or single-run //! invocations) as needed. //! Still experimental +use crate::adapters::util::get_versioned_slate; use crate::adapters::{FileWalletCommAdapter, HTTPWalletCommAdapter, KeybaseWalletCommAdapter}; use crate::api::{ApiServer, BasicAuthMiddleware, Handler, ResponseFuture, Router, TLSConfig}; use crate::core::core; use crate::core::core::Transaction; use crate::keychain::Keychain; use crate::libwallet::api::{APIForeign, APIOwner}; -use crate::libwallet::slate::Slate; +use crate::libwallet::slate::{Slate, VersionedSlate}; use crate::libwallet::types::{ CbData, NodeClient, OutputData, SendTXArgs, TxLogEntry, WalletBackend, WalletInfo, }; @@ -40,6 +41,7 @@ use std::marker::PhantomData; use std::net::SocketAddr; use std::sync::Arc; use url::form_urlencoded; +use uuid::Uuid; /// Instantiate wallet Owner API for a single-use (command line) call /// Return a function containing a loaded API context to call @@ -467,6 +469,87 @@ where )) } + pub fn repost( + &self, + req: Request, + api: APIOwner, + ) -> Box + Send> { + let params = parse_params(&req); + let mut id_int: Option = None; + let mut tx_uuid: Option = None; + + if let Some(id_string) = params.get("id") { + match id_string[0].parse() { + Ok(id) => id_int = Some(id), + Err(e) => { + error!("repost: could not parse id: {}", e); + return Box::new(err(ErrorKind::GenericError( + "repost: cannot repost transaction. Could not parse id in request." + .to_owned(), + ) + .into())); + } + } + } else if let Some(tx_id_string) = params.get("tx_id") { + match tx_id_string[0].parse() { + Ok(tx_id) => tx_uuid = Some(tx_id), + Err(e) => { + error!("repost: could not parse tx_id: {}", e); + return Box::new(err(ErrorKind::GenericError( + "repost: cannot repost transaction. Could not parse tx_id in request." + .to_owned(), + ) + .into())); + } + } + } else { + return Box::new(err(ErrorKind::GenericError( + "repost: Cannot repost transaction. Missing id or tx_id param in request." + .to_owned(), + ) + .into())); + } + + let res = api.retrieve_txs(true, id_int, tx_uuid); + if let Err(e) = res { + return Box::new(err(ErrorKind::GenericError(format!( + "repost: cannot repost transaction. retrieve_txs failed, err: {:?}", + e + )) + .into())); + } + let (_, txs) = res.unwrap(); + let res = api.get_stored_tx(&txs[0]); + if let Err(e) = res { + return Box::new(err(ErrorKind::GenericError(format!( + "repost: cannot repost transaction. get_stored_tx failed, err: {:?}", + e + )) + .into())); + } + let stored_tx = res.unwrap(); + if stored_tx.is_none() { + error!( + "Transaction with id {:?}/{:?} does not have transaction data. Not reposting.", + id_int, tx_uuid, + ); + return Box::new(err(ErrorKind::GenericError( + "repost: Cannot repost transaction. Missing id or tx_id param in request." + .to_owned(), + ) + .into())); + } + + let fluff = params.get("fluff").is_some(); + Box::new(match api.post_tx(&stored_tx.unwrap(), fluff) { + Ok(_) => ok(()), + Err(e) => { + error!("repost: failed with error: {}", e); + err(e) + } + }) + } + fn handle_post_request(&self, req: Request) -> WalletResponseFuture { let api = APIOwner::new(self.wallet.clone()); match req @@ -487,10 +570,14 @@ where ), "cancel_tx" => Box::new( self.cancel_tx(req, api) - .and_then(|_| ok(response(StatusCode::OK, ""))), + .and_then(|_| ok(response(StatusCode::OK, "{}"))), ), "post_tx" => Box::new( self.post_tx(req, api) + .and_then(|_| ok(response(StatusCode::OK, "{}"))), + ), + "repost" => Box::new( + self.repost(req, api) .and_then(|_| ok(response(StatusCode::OK, ""))), ), _ => Box::new(err(ErrorKind::GenericError( @@ -574,16 +661,17 @@ where &self, req: Request, mut api: APIForeign, - ) -> Box + Send> { + ) -> Box + Send> { Box::new(parse_body(req).and_then( //TODO: No way to insert a message from the params - move |mut slate| { + move |slate: VersionedSlate| { + let mut slate: Slate = slate.into(); if let Err(e) = api.verify_slate_messages(&slate) { error!("Error validating participant messages: {}", e); err(e) } else { match api.receive_tx(&mut slate, None, None) { - Ok(_) => ok(slate.clone()), + Ok(_) => ok(get_versioned_slate(&slate.clone())), Err(e) => { error!("receive_tx: failed with error: {}", e); err(e) @@ -677,20 +765,31 @@ fn create_ok_response(json: &str) -> Response { "access-control-allow-headers", "Content-Type, Authorization", ) + .header(hyper::header::CONTENT_TYPE, "application/json") .body(json.to_string().into()) .unwrap() } +/// Build a new hyper Response with the status code and body provided. +/// +/// Whenever the status code is `StatusCode::OK` the text parameter should be +/// valid JSON as the content type header will be set to `application/json' fn response>(status: StatusCode, text: T) -> Response { - Response::builder() + let mut builder = &mut Response::builder(); + + builder = builder .status(status) .header("access-control-allow-origin", "*") .header( "access-control-allow-headers", "Content-Type, Authorization", - ) - .body(text.into()) - .unwrap() + ); + + if status == StatusCode::OK { + builder = builder.header(hyper::header::CONTENT_TYPE, "application/json"); + } + + builder.body(text.into()).unwrap() } fn parse_params(req: &Request) -> HashMap> { diff --git a/wallet/src/display.rs b/wallet/src/display.rs index 73d0bf2d5..041494fba 100644 --- a/wallet/src/display.rs +++ b/wallet/src/display.rs @@ -338,6 +338,49 @@ pub fn info( ); } } + +/// Display summary info in a pretty way +pub fn estimate( + amount: u64, + strategies: Vec<( + &str, // strategy + u64, // total amount to be locked + u64, // fee + )>, + dark_background_color_scheme: bool, +) { + println!( + "\nEstimation for sending {}:\n", + amount_to_hr_string(amount, false) + ); + + let mut table = table!(); + + table.set_titles(row![ + bMG->"Selection strategy", + bMG->"Fee", + bMG->"Will be locked", + ]); + + for (strategy, total, fee) in strategies { + if dark_background_color_scheme { + table.add_row(row![ + bFC->strategy, + FR->amount_to_hr_string(fee, false), + FY->amount_to_hr_string(total, false), + ]); + } else { + table.add_row(row![ + bFD->strategy, + FR->amount_to_hr_string(fee, false), + FY->amount_to_hr_string(total, false), + ]); + } + } + table.printstd(); + println!(); +} + /// Display list of wallet accounts in a pretty way pub fn accounts(acct_mappings: Vec) { println!("\n____ Wallet Accounts ____\n",); diff --git a/wallet/src/lib.rs b/wallet/src/lib.rs index 1569929f2..72325fec9 100644 --- a/wallet/src/lib.rs +++ b/wallet/src/lib.rs @@ -25,7 +25,8 @@ extern crate serde_derive; extern crate log; use failure; use grin_api as api; -use grin_core as core; +#[macro_use] +extern crate grin_core as core; use grin_keychain as keychain; use grin_store as store; use grin_util as util; diff --git a/wallet/src/libwallet/api.rs b/wallet/src/libwallet/api.rs index 5302e1f19..a615f2bcf 100644 --- a/wallet/src/libwallet/api.rs +++ b/wallet/src/libwallet/api.rs @@ -671,6 +671,74 @@ where Ok((slate, lock_fn)) } + /// Estimates the amount to be locked and fee for the transaction without creating one + /// + /// # Arguments + /// * `src_acct_name` - The human readable account name from which to draw outputs + /// for the transaction, overriding whatever the active account is as set via the + /// [`set_active_account`](struct.APIOwner.html#method.set_active_account) method. + /// If None, the transaction will use the active account. + /// * `amount` - The amount to send, in nanogrins. (`1 G = 1_000_000_000nG`) + /// * `minimum_confirmations` - The minimum number of confirmations an output + /// should have in order to be included in the transaction. + /// * `max_outputs` - By default, the wallet selects as many inputs as possible in a + /// transaction, to reduce the Output set and the fees. The wallet will attempt to spend + /// include up to `max_outputs` in a transaction, however if this is not enough to cover + /// the whole amount, the wallet will include more outputs. This parameter should be considered + /// a soft limit. + /// * `num_change_outputs` - The target number of change outputs to create in the transaction. + /// The actual number created will be `num_change_outputs` + whatever remainder is needed. + /// * `selection_strategy_is_use_all` - If `true`, attempt to use up as many outputs as + /// possible to create the transaction, up the 'soft limit' of `max_outputs`. This helps + /// to reduce the size of the UTXO set and the amount of data stored in the wallet, and + /// minimizes fees. This will generally result in many inputs and a large change output(s), + /// usually much larger than the amount being sent. If `false`, the transaction will include + /// as many outputs as are needed to meet the amount, (and no more) starting with the smallest + /// value outputs. + /// + /// # Returns + /// * a result containing: + /// * (total, fee) - A tuple: + /// * Total amount to be locked. + /// * Transaction fee + pub fn estimate_initiate_tx( + &mut self, + src_acct_name: Option<&str>, + amount: u64, + minimum_confirmations: u64, + max_outputs: usize, + num_change_outputs: usize, + selection_strategy_is_use_all: bool, + ) -> Result< + ( + u64, // total + u64, // fee + ), + Error, + > { + let mut w = self.wallet.lock(); + w.open_with_credentials()?; + let parent_key_id = match src_acct_name { + Some(d) => { + let pm = w.get_acct_path(d.to_owned())?; + match pm { + Some(p) => p.path, + None => w.parent_key_id(), + } + } + None => w.parent_key_id(), + }; + tx::estimate_send_tx( + &mut *w, + amount, + minimum_confirmations, + max_outputs, + num_change_outputs, + selection_strategy_is_use_all, + &parent_key_id, + ) + } + /// Lock outputs associated with a given slate/transaction pub fn tx_lock_outputs( &mut self, diff --git a/wallet/src/libwallet/internal/selection.rs b/wallet/src/libwallet/internal/selection.rs index c9e4b3d27..b02cd896b 100644 --- a/wallet/src/libwallet/internal/selection.rs +++ b/wallet/src/libwallet/internal/selection.rs @@ -242,6 +242,52 @@ pub fn select_send_tx( ), Error, > +where + T: WalletBackend, + C: NodeClient, + K: Keychain, +{ + let (coins, _total, amount, fee) = select_coins_and_fee( + wallet, + amount, + current_height, + minimum_confirmations, + max_outputs, + change_outputs, + selection_strategy_is_use_all, + &parent_key_id, + )?; + + // build transaction skeleton with inputs and change + let (mut parts, change_amounts_derivations) = + inputs_and_change(&coins, wallet, amount, fee, change_outputs)?; + + // This is more proof of concept than anything but here we set lock_height + // on tx being sent (based on current chain height via api). + parts.push(build::with_lock_height(lock_height)); + + Ok((parts, coins, change_amounts_derivations, fee)) +} + +/// Select outputs and calculating fee. +pub fn select_coins_and_fee( + wallet: &mut T, + amount: u64, + current_height: u64, + minimum_confirmations: u64, + max_outputs: usize, + change_outputs: usize, + selection_strategy_is_use_all: bool, + parent_key_id: &Identifier, +) -> Result< + ( + Vec, + u64, // total + u64, // amount + u64, // fee + ), + Error, +> where T: WalletBackend, C: NodeClient, @@ -325,16 +371,7 @@ where amount_with_fee = amount + fee; } } - - // build transaction skeleton with inputs and change - let (mut parts, change_amounts_derivations) = - inputs_and_change(&coins, wallet, amount, fee, change_outputs)?; - - // This is more proof of concept than anything but here we set lock_height - // on tx being sent (based on current chain height via api). - parts.push(build::with_lock_height(lock_height)); - - Ok((parts, coins, change_amounts_derivations, fee)) + Ok((coins, total, amount, fee)) } /// Selects inputs and change for a transaction diff --git a/wallet/src/libwallet/internal/tx.rs b/wallet/src/libwallet/internal/tx.rs index 459885d4c..683a369f4 100644 --- a/wallet/src/libwallet/internal/tx.rs +++ b/wallet/src/libwallet/internal/tx.rs @@ -42,6 +42,52 @@ where Ok(slate) } +/// Estimates locked amount and fee for the transaction without creating one +pub fn estimate_send_tx( + wallet: &mut T, + amount: u64, + minimum_confirmations: u64, + max_outputs: usize, + num_change_outputs: usize, + selection_strategy_is_use_all: bool, + parent_key_id: &Identifier, +) -> Result< + ( + u64, // total + u64, // fee + ), + Error, +> +where + T: WalletBackend, + C: NodeClient, + K: Keychain, +{ + // Get lock height + let current_height = wallet.w2n_client().get_chain_height()?; + // ensure outputs we're selecting are up to date + updater::refresh_outputs(wallet, parent_key_id, false)?; + + // Sender selects outputs into a new slate and save our corresponding keys in + // a transaction context. The secret key in our transaction context will be + // randomly selected. This returns the public slate, and a closure that locks + // our inputs and outputs once we're convinced the transaction exchange went + // according to plan + // This function is just a big helper to do all of that, in theory + // this process can be split up in any way + let (_coins, total, _amount, fee) = selection::select_coins_and_fee( + wallet, + amount, + current_height, + minimum_confirmations, + max_outputs, + num_change_outputs, + selection_strategy_is_use_all, + parent_key_id, + )?; + Ok((total, fee)) +} + /// Add inputs to the slate (effectively becoming the sender) pub fn add_inputs_to_slate( wallet: &mut T, diff --git a/wallet/src/libwallet/mod.rs b/wallet/src/libwallet/mod.rs index aa69b8845..ff60f3433 100644 --- a/wallet/src/libwallet/mod.rs +++ b/wallet/src/libwallet/mod.rs @@ -26,6 +26,7 @@ pub mod api; mod error; pub mod internal; pub mod slate; +pub mod slate_versions; pub mod types; pub use crate::libwallet::error::{Error, ErrorKind}; diff --git a/wallet/src/libwallet/slate.rs b/wallet/src/libwallet/slate.rs index d06286980..2992d1bde 100644 --- a/wallet/src/libwallet/slate.rs +++ b/wallet/src/libwallet/slate.rs @@ -18,6 +18,7 @@ use crate::blake2::blake2b::blake2b; use crate::keychain::{BlindSum, BlindingFactor, Keychain}; use crate::libwallet::error::{Error, ErrorKind}; +use crate::libwallet::slate_versions::v0::SlateV0; use crate::util::secp; use crate::util::secp::key::{PublicKey, SecretKey}; use crate::util::secp::Signature; @@ -33,6 +34,25 @@ use uuid::Uuid; const CURRENT_SLATE_VERSION: u64 = 1; +/// A wrapper around slates the enables support for versioning +#[derive(Serialize, Deserialize, Clone)] +#[serde(untagged)] +pub enum VersionedSlate { + /// Pre versioning version + V0(SlateV0), + /// Version 1 with versioning and hex serialization - current + V1(Slate), +} + +impl From for Slate { + fn from(ver: VersionedSlate) -> Self { + match ver { + VersionedSlate::V0(slate_v0) => Slate::from(slate_v0), + VersionedSlate::V1(slate) => slate, + } + } +} + /// Public data for each participant in the slate #[derive(Serialize, Deserialize, Debug, Clone)] @@ -40,14 +60,18 @@ pub struct ParticipantData { /// Id of participant in the transaction. (For now, 0=sender, 1=rec) pub id: u64, /// Public key corresponding to private blinding factor + #[serde(with = "secp_ser::pubkey_serde")] pub public_blind_excess: PublicKey, /// Public key corresponding to private nonce + #[serde(with = "secp_ser::pubkey_serde")] pub public_nonce: PublicKey, /// Public partial signature + #[serde(with = "secp_ser::option_sig_serde")] pub part_sig: Option, /// A message for other participants pub message: Option, /// Signature, created with private key corresponding to 'public_blind_excess' + #[serde(with = "secp_ser::option_sig_serde")] pub message_sig: Option, } diff --git a/wallet/src/libwallet/slate_versions/mod.rs b/wallet/src/libwallet/slate_versions/mod.rs new file mode 100644 index 000000000..03b4709f9 --- /dev/null +++ b/wallet/src/libwallet/slate_versions/mod.rs @@ -0,0 +1,18 @@ +// Copyright 2019 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This module contains old slate versions and conversions to the newest slate version +//! Used for serialization and deserialization of slates in a backwards compatible way. +#[allow(missing_docs)] +pub mod v0; diff --git a/wallet/src/libwallet/slate_versions/v0.rs b/wallet/src/libwallet/slate_versions/v0.rs new file mode 100644 index 000000000..5aae1a933 --- /dev/null +++ b/wallet/src/libwallet/slate_versions/v0.rs @@ -0,0 +1,370 @@ +// Copyright 2018 The Grin Developers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Contains V0 of the slate +use crate::core::core::transaction::{ + Input, KernelFeatures, Output, OutputFeatures, Transaction, TransactionBody, TxKernel, +}; +use crate::keychain::BlindingFactor; +use crate::libwallet::slate::{ParticipantData, Slate}; +use crate::util::secp; +use crate::util::secp::key::PublicKey; +use crate::util::secp::pedersen::{Commitment, RangeProof}; +use crate::util::secp::Signature; +use uuid::Uuid; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct SlateV0 { + /// The number of participants intended to take part in this transaction + pub num_participants: usize, + /// Unique transaction ID, selected by sender + pub id: Uuid, + /// The core transaction data: + /// inputs, outputs, kernels, kernel offset + pub tx: TransactionV0, + /// base amount (excluding fee) + pub amount: u64, + /// fee amount + pub fee: u64, + /// Block height for the transaction + pub height: u64, + /// Lock height + pub lock_height: u64, + /// Participant data, each participant in the transaction will + /// insert their public data here. For now, 0 is sender and 1 + /// is receiver, though this will change for multi-party + pub participant_data: Vec, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ParticipantDataV0 { + /// Id of participant in the transaction. (For now, 0=sender, 1=rec) + pub id: u64, + /// Public key corresponding to private blinding factor + pub public_blind_excess: PublicKey, + /// Public key corresponding to private nonce + pub public_nonce: PublicKey, + /// Public partial signature + pub part_sig: Option, + /// A message for other participants + pub message: Option, + /// Signature, created with private key corresponding to 'public_blind_excess' + pub message_sig: Option, +} + +/// A transaction +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TransactionV0 { + /// The kernel "offset" k2 + /// excess is k1G after splitting the key k = k1 + k2 + pub offset: BlindingFactor, + /// The transaction body - inputs/outputs/kernels + pub body: TransactionBodyV0, +} + +/// TransactionBody is a common abstraction for transaction and block +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TransactionBodyV0 { + /// List of inputs spent by the transaction. + pub inputs: Vec, + /// List of outputs the transaction produces. + pub outputs: Vec, + /// List of kernels that make up this transaction (usually a single kernel). + pub kernels: Vec, +} +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct InputV0 { + /// The features of the output being spent. + /// We will check maturity for coinbase output. + pub features: OutputFeatures, + /// The commit referencing the output being spent. + pub commit: Commitment, +} + +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +pub struct OutputV0 { + /// Options for an output's structure or use + pub features: OutputFeatures, + /// The homomorphic commitment representing the output amount + pub commit: Commitment, + /// A proof that the commitment is in the right range + pub proof: RangeProof, +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct TxKernelV0 { + /// Options for a kernel's structure or use + pub features: KernelFeatures, + /// Fee originally included in the transaction this proof is for. + pub fee: u64, + /// This kernel is not valid earlier than lock_height blocks + /// The max lock_height of all *inputs* to this transaction + pub lock_height: u64, + /// Remainder of the sum of all transaction commitments. If the transaction + /// is well formed, amounts components should sum to zero and the excess + /// is hence a valid public key. + pub excess: Commitment, + /// The signature proving the excess is a valid public key, which signs + /// the transaction fee. + pub excess_sig: secp::Signature, +} + +impl From for Slate { + fn from(slate: SlateV0) -> Slate { + let SlateV0 { + num_participants, + id, + tx, + amount, + fee, + height, + lock_height, + participant_data, + } = slate; + let tx = Transaction::from(tx); + let participant_data = map_vec!(participant_data, |data| ParticipantData::from(data)); + let version = 0; + Slate { + num_participants, + id, + tx, + amount, + fee, + height, + lock_height, + participant_data, + version, + } + } +} + +impl From<&ParticipantDataV0> for ParticipantData { + fn from(data: &ParticipantDataV0) -> ParticipantData { + let ParticipantDataV0 { + id, + public_blind_excess, + public_nonce, + part_sig, + message, + message_sig, + } = data; + let id = *id; + let public_blind_excess = *public_blind_excess; + let public_nonce = *public_nonce; + let part_sig = *part_sig; + let message: Option = message.as_ref().map(|t| String::from(&**t)); + let message_sig = *message_sig; + ParticipantData { + id, + public_blind_excess, + public_nonce, + part_sig, + message, + message_sig, + } + } +} + +impl From for Transaction { + fn from(tx: TransactionV0) -> Transaction { + let TransactionV0 { offset, body } = tx; + let body = TransactionBody::from(&body); + let transaction = Transaction::new(body.inputs, body.outputs, body.kernels); + transaction.with_offset(offset) + } +} + +impl From<&TransactionBodyV0> for TransactionBody { + fn from(body: &TransactionBodyV0) -> Self { + let TransactionBodyV0 { + inputs, + outputs, + kernels, + } = body; + + let inputs = map_vec!(inputs, |inp| Input::from(inp)); + let outputs = map_vec!(outputs, |out| Output::from(out)); + let kernels = map_vec!(kernels, |kern| TxKernel::from(kern)); + TransactionBody { + inputs, + outputs, + kernels, + } + } +} + +impl From<&InputV0> for Input { + fn from(input: &InputV0) -> Input { + let InputV0 { features, commit } = *input; + Input { features, commit } + } +} + +impl From<&OutputV0> for Output { + fn from(output: &OutputV0) -> Output { + let OutputV0 { + features, + commit, + proof, + } = *output; + Output { + features, + commit, + proof, + } + } +} + +impl From<&TxKernelV0> for TxKernel { + fn from(kernel: &TxKernelV0) -> TxKernel { + let TxKernelV0 { + features, + fee, + lock_height, + excess, + excess_sig, + } = *kernel; + TxKernel { + features, + fee, + lock_height, + excess, + excess_sig, + } + } +} + +impl From for SlateV0 { + fn from(slate: Slate) -> SlateV0 { + let Slate { + num_participants, + id, + tx, + amount, + fee, + height, + lock_height, + participant_data, + version: _, + } = slate; + let tx = TransactionV0::from(tx); + let participant_data = map_vec!(participant_data, |data| ParticipantDataV0::from(data)); + SlateV0 { + num_participants, + id, + tx, + amount, + fee, + height, + lock_height, + participant_data, + } + } +} + +impl From<&ParticipantData> for ParticipantDataV0 { + fn from(data: &ParticipantData) -> ParticipantDataV0 { + let ParticipantData { + id, + public_blind_excess, + public_nonce, + part_sig, + message, + message_sig, + } = data; + let id = *id; + let public_blind_excess = *public_blind_excess; + let public_nonce = *public_nonce; + let part_sig = *part_sig; + let message: Option = message.as_ref().map(|t| String::from(&**t)); + let message_sig = *message_sig; + ParticipantDataV0 { + id, + public_blind_excess, + public_nonce, + part_sig, + message, + message_sig, + } + } +} + +impl From for TransactionV0 { + fn from(tx: Transaction) -> TransactionV0 { + let offset = tx.offset; + let body: TransactionBody = tx.into(); + let body = TransactionBodyV0::from(&body); + TransactionV0 { offset, body } + } +} + +impl From<&TransactionBody> for TransactionBodyV0 { + fn from(body: &TransactionBody) -> Self { + let TransactionBody { + inputs, + outputs, + kernels, + } = body; + + let inputs = map_vec!(inputs, |inp| InputV0::from(inp)); + let outputs = map_vec!(outputs, |out| OutputV0::from(out)); + let kernels = map_vec!(kernels, |kern| TxKernelV0::from(kern)); + TransactionBodyV0 { + inputs, + outputs, + kernels, + } + } +} + +impl From<&Input> for InputV0 { + fn from(input: &Input) -> Self { + let Input { features, commit } = *input; + InputV0 { features, commit } + } +} + +impl From<&Output> for OutputV0 { + fn from(output: &Output) -> Self { + let Output { + features, + commit, + proof, + } = *output; + OutputV0 { + features, + commit, + proof, + } + } +} + +impl From<&TxKernel> for TxKernelV0 { + fn from(kernel: &TxKernel) -> Self { + let TxKernel { + features, + fee, + lock_height, + excess, + excess_sig, + } = *kernel; + TxKernelV0 { + features, + fee, + lock_height, + excess, + excess_sig, + } + } +} diff --git a/wallet/src/test_framework/testclient.rs b/wallet/src/test_framework/testclient.rs index 5e34a2d39..e99b6055a 100644 --- a/wallet/src/test_framework/testclient.rs +++ b/wallet/src/test_framework/testclient.rs @@ -137,6 +137,10 @@ where self.wallets.insert(addr.to_owned(), (tx, wallet)); } + pub fn stop(&mut self) { + self.running.store(false, Ordering::Relaxed); + } + /// Run the incoming message queue and respond more or less /// synchronously pub fn run(&mut self) -> Result<(), libwallet::Error> { diff --git a/wallet/tests/restore.rs b/wallet/tests/restore.rs index 05731bf7e..9f15a72bd 100644 --- a/wallet/tests/restore.rs +++ b/wallet/tests/restore.rs @@ -26,6 +26,7 @@ use grin_keychain as keychain; use grin_util as util; use grin_wallet as wallet; use std::fs; +use std::sync::atomic::Ordering; use std::thread; use std::time::Duration; @@ -44,6 +45,7 @@ fn restore_wallet(base_dir: &str, wallet_dir: &str) -> Result<(), libwallet::Err let dest_dir = format!("{}/{}_restore", base_dir, wallet_dir); fs::create_dir_all(dest_dir.clone())?; let dest_seed = format!("{}/wallet.seed", dest_dir); + println!("Source: {}, Dest: {}", source_seed, dest_seed); fs::copy(source_seed, dest_seed)?; let mut wallet_proxy: WalletProxy = WalletProxy::new(base_dir); @@ -54,6 +56,7 @@ fn restore_wallet(base_dir: &str, wallet_dir: &str) -> Result<(), libwallet::Err wallet_proxy.add_wallet(wallet_dir, client.get_send_instance(), wallet.clone()); // Set the wallet proxy listener running + let wp_running = wallet_proxy.running.clone(); thread::spawn(move || { if let Err(e) = wallet_proxy.run() { error!("Wallet Proxy error: {}", e); @@ -67,6 +70,9 @@ fn restore_wallet(base_dir: &str, wallet_dir: &str) -> Result<(), libwallet::Err Ok(()) })?; + wp_running.store(false, Ordering::Relaxed); + //thread::sleep(Duration::from_millis(1000)); + Ok(()) } @@ -108,6 +114,7 @@ fn compare_wallet_restore( } // Set the wallet proxy listener running + let wp_running = wallet_proxy.running.clone(); thread::spawn(move || { if let Err(e) = wallet_proxy.run() { error!("Wallet Proxy error: {}", e); @@ -164,6 +171,9 @@ fn compare_wallet_restore( dest_accts.as_ref().unwrap().len() ); + wp_running.store(false, Ordering::Relaxed); + //thread::sleep(Duration::from_millis(1000)); + Ok(()) } @@ -208,6 +218,7 @@ fn setup_restore(test_dir: &str) -> Result<(), libwallet::Error> { wallet_proxy.add_wallet("wallet3", client3.get_send_instance(), wallet3.clone()); // Set the wallet proxy listener running + let wp_running = wallet_proxy.running.clone(); thread::spawn(move || { if let Err(e) = wallet_proxy.run() { error!("Wallet Proxy error: {}", e); @@ -327,6 +338,8 @@ fn setup_restore(test_dir: &str) -> Result<(), libwallet::Error> { Ok(()) })?; + wp_running.store(false, Ordering::Relaxed); + Ok(()) } diff --git a/wallet/tests/transaction.rs b/wallet/tests/transaction.rs index 3d0302646..ac22461f7 100644 --- a/wallet/tests/transaction.rs +++ b/wallet/tests/transaction.rs @@ -226,6 +226,33 @@ fn basic_transaction_api(test_dir: &str) -> Result<(), libwallet::Error> { Ok(()) })?; + // Estimate fee and locked amount for a transaction + wallet::controller::owner_single_use(wallet1.clone(), |sender_api| { + let (total, fee) = sender_api.estimate_initiate_tx( + None, + amount * 2, // amount + 2, // minimum confirmations + 500, // max outputs + 1, // num change outputs + true, // select all outputs + )?; + assert_eq!(total, 600_000_000_000); + assert_eq!(fee, 4_000_000); + + let (total, fee) = sender_api.estimate_initiate_tx( + None, + amount * 2, // amount + 2, // minimum confirmations + 500, // max outputs + 1, // num change outputs + false, // select the smallest amount of outputs + )?; + assert_eq!(total, 180_000_000_000); + assert_eq!(fee, 6_000_000); + + Ok(()) + })?; + // Send another transaction, but don't post to chain immediately and use // the stored transaction instead wallet::controller::owner_single_use(wallet1.clone(), |sender_api| {