[rust] bump many crates

* update base64 0.10.0 to 0.10.1
* update bincode 1.0.1 to 1.1.1
* update byteorder 1.2.7 to 1.3.1
* update crossbeam-channel 0.3.6 to 0.3.8
* update crossbeam-epoch 0.7.0 to 0.7.1
* update crossbeam-utils 0.6.3 to 0.6.5
* update euclid 0.19.4 to 0.19.5
* add euclid_macros 0.1.0
* update h2 0.1.14 to 0.1.16
* update http 0.1.14 to 0.1.15
* update hyper 0.12.20 to 0.12.24
* memchr 2.1.3 to 2.2.0
* update miniz_oxide 0.2.0 to 0.2.1
* update miniz_oxide_c_api 0.2.0 to 0.2.1
* update num_cpus 1.9.0 to 1.10.0
* update proc-macro2 0.4.24 to 0.4.27
* update quote 0.6.10 to 0.6.11
* update ring 0.14.5 to 0.14.6
* update rustls 0.14.0 to 0.15.1
* update rusttype 0.7.3 to 0.7.5
* update serde_derive 1.0.84 to 1.0.87
* update slab 0.4.1 to 0.4.2
* update stb_truetype 0.2.5 to 0.2.6
* update string 0.1.2 to 0.1.3
* update tempfile 3.0.5 to 3.0.6

This has been approved in OSRB-141.

Bug: OSRB-141 #comment landed euclid_macros
Change-Id: Ib7fad509025d11d37fe1456fff8b1f1d4544d314
diff --git a/rustc_deps/Cargo.lock b/rustc_deps/Cargo.lock
index 49e92bd..a7a3bd6 100644
--- a/rustc_deps/Cargo.lock
+++ b/rustc_deps/Cargo.lock
@@ -10,7 +10,7 @@
 version = "0.6.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -92,7 +92,7 @@
 version = "0.8.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)",
  "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -101,16 +101,16 @@
 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)",
 ]
 
 [[package]]
 name = "base64"
-version = "0.10.0"
+version = "0.10.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)",
 ]
 
 [[package]]
@@ -118,16 +118,17 @@
 version = "0.9.2"
 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)",
  "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bincode"
-version = "1.0.1"
+version = "1.1.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)",
+ "autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -186,7 +187,7 @@
 version = "0.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -207,7 +208,7 @@
 
 [[package]]
 name = "byteorder"
-version = "1.2.7"
+version = "1.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -215,7 +216,7 @@
 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)",
 ]
 
@@ -293,23 +294,21 @@
 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.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.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 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)",
  "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)",
+ "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.3.6"
+version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "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)",
 ]
 
@@ -318,8 +317,8 @@
 version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "crossbeam-epoch 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "crossbeam-utils 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)",
 ]
 
 [[package]]
@@ -329,7 +328,7 @@
 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.3 (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)",
@@ -337,12 +336,12 @@
 
 [[package]]
 name = "crossbeam-epoch"
-version = "0.7.0"
+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.3 (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)",
@@ -350,10 +349,11 @@
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.6.3"
+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]]
@@ -367,7 +367,7 @@
 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)",
  "gzip-header 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -407,13 +407,24 @@
 
 [[package]]
 name = "euclid"
-version = "0.19.4"
+version = "0.19.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
+ "euclid_macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
+name = "euclid_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "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 = "eui48"
 version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -436,8 +447,8 @@
 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)",
+ "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)",
 ]
@@ -464,7 +475,7 @@
 dependencies = [
  "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.48 (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]]
@@ -489,11 +500,11 @@
 version = "0.1.0"
 dependencies = [
  "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bincode 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitfield 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "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)",
  "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
  "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -501,7 +512,7 @@
  "crossbeam 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "derp 0.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "euclid 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "euclid 0.19.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "eui48 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "font-rs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -509,8 +520,8 @@
  "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
  "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "hex 0.3.2 (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.20 (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.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "itertools 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "json5 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -518,7 +529,7 @@
  "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)",
- "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -531,28 +542,28 @@
  "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "proc-macro-nested 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "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)",
  "proptest 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand_os 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "rouille 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rust-crypto 0.2.36",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "rustls 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "rusttype 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustls 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rusttype 0.7.5 (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.84 (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)",
- "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)",
  "smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
- "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
  "timebomb 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -602,7 +613,7 @@
  "futures-core-preview 0.3.0-alpha.12 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures-util-preview 0.3.0-alpha.12 (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)",
+ "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -634,8 +645,8 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "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.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -665,7 +676,7 @@
  "proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "proc-macro-nested 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.5.6 (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)",
  "tokio-io 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -700,18 +711,18 @@
 
 [[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)",
+ "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)",
 ]
 
@@ -730,7 +741,7 @@
 
 [[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)",
@@ -745,13 +756,13 @@
 
 [[package]]
 name = "hyper"
-version = "0.12.20"
+version = "0.12.24"
 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)",
- "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)",
@@ -872,12 +883,8 @@
 
 [[package]]
 name = "memchr"
-version = "2.1.3"
+version = "2.2.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)",
- "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
-]
 
 [[package]]
 name = "memoffset"
@@ -905,7 +912,7 @@
 
 [[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)",
@@ -913,13 +920,13 @@
 
 [[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.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.48 (registry+https://github.com/rust-lang/crates.io-index)",
- "miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "miniz_oxide 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1027,7 +1034,7 @@
 
 [[package]]
 name = "num_cpus"
-version = "1.9.0"
+version = "1.10.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)",
@@ -1120,8 +1127,8 @@
 dependencies = [
  "pest 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pest_meta 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "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.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1181,7 +1188,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "base64 0.8.0 (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)",
  "serde 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)",
  "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1201,8 +1208,8 @@
 version = "0.5.4"
 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.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1213,7 +1220,7 @@
 
 [[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)",
@@ -1226,14 +1233,14 @@
 dependencies = [
  "bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "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)",
  "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex-syntax 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "rusty-fork 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1264,10 +1271,10 @@
 
 [[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]]
@@ -1426,7 +1433,7 @@
 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.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.0 (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)",
@@ -1450,7 +1457,7 @@
 
 [[package]]
 name = "ring"
-version = "0.14.5"
+version = "0.14.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1458,6 +1465,7 @@
  "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
  "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.6",
 ]
 
 [[package]]
@@ -1471,10 +1479,10 @@
  "deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)",
  "filetime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "multipart 0.15.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.10.0 (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.84 (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)",
  "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1515,12 +1523,12 @@
 
 [[package]]
 name = "rustls"
-version = "0.15.0"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1528,13 +1536,13 @@
 
 [[package]]
 name = "rusttype"
-version = "0.7.3"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "approx 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "stb_truetype 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "stb_truetype 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1544,7 +1552,7 @@
 dependencies = [
  "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "wait-timeout 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1568,7 +1576,7 @@
 version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "winapi-util 0.1.1",
+ "winapi-util 0.1.2",
 ]
 
 [[package]]
@@ -1581,7 +1589,7 @@
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1605,11 +1613,11 @@
 
 [[package]]
 name = "serde_derive"
-version = "1.0.84"
+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)",
+ "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)",
 ]
 
@@ -1657,7 +1665,7 @@
 
 [[package]]
 name = "slab"
-version = "0.4.1"
+version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1680,15 +1688,15 @@
 
 [[package]]
 name = "stb_truetype"
-version = "0.2.5"
+version = "0.2.6"
 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)",
 ]
 
 [[package]]
 name = "string"
-version = "0.1.2"
+version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1711,8 +1719,8 @@
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "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.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1721,8 +1729,8 @@
 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)",
 ]
 
@@ -1731,8 +1739,8 @@
 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)",
+ "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)",
 ]
@@ -1742,13 +1750,13 @@
 version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bincode 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "plist 0.2.4 (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.84 (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)",
  "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -1764,7 +1772,7 @@
 
 [[package]]
 name = "tempfile"
-version = "3.0.5"
+version = "3.0.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)",
@@ -1780,7 +1788,7 @@
 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",
 ]
 
@@ -1815,7 +1823,7 @@
 version = "1.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1877,7 +1885,7 @@
 version = "0.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -2038,7 +2046,7 @@
 dependencies = [
  "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.3.6",
- "winapi-util 0.1.1",
+ "winapi-util 0.1.2",
 ]
 
 [[package]]
@@ -2056,7 +2064,7 @@
 version = "0.19.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -2071,7 +2079,7 @@
 
 [[package]]
 name = "winapi-util"
-version = "0.1.1"
+version = "0.1.2"
 
 [[package]]
 name = "xi-core-lib"
@@ -2079,7 +2087,7 @@
 dependencies = [
  "lazy_static 1.2.0 (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.84 (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)",
  "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2097,9 +2105,9 @@
 version = "0.2.0"
 dependencies = [
  "bytecount 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.0 (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.84 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 1.0.87 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -2108,7 +2116,7 @@
 dependencies = [
  "crossbeam 0.3.2 (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.84 (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)",
  "xi-trace 0.1.0",
 ]
@@ -2120,7 +2128,7 @@
  "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.48 (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.84 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive 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)",
 ]
 
@@ -2130,7 +2138,7 @@
 dependencies = [
  "bincode 0.9.2 (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.84 (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)",
  "xi-trace 0.1.0",
 ]
@@ -2164,11 +2172,11 @@
 "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
 "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 base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "621fc7ecb8008f86d7fb9b95356cd692ce9514b80a86d85b397f32a22da7b9e2"
+"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
 "checksum base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c4a342b450b268e1be8036311e2c613d7f8a7ed31214dff1cc3b60852a3168d"
 "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643"
 "checksum bincode 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9a6301db0b49fb63551bc15b5ae348147101cdf323242b93ec7546d5002ff1af"
-"checksum bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f2fb9e29e72fd6bc12071533d5dc7664cb01480c59406f656d7ac25c7bd8ff7"
+"checksum bincode 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "58470ad6460f0b0e89b0df5f17b8bd77ebae26af69dca0bd9ddc8b9e38abb2ff"
 "checksum bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1efcc46c18245a69c38fcc5cc650f16d3a59d034f3106e9ed63748f695730a"
 "checksum bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440d5cb623bb7390ae27fec0bb6c61111969860f8e3ae198bfa0663645e67cf"
 "checksum bitfield 0.13.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a260ed6b9f3ca16a4389390b1b1cd15a3bc0a9d3e63b1ef39f4978cec58a4e83"
@@ -2180,7 +2188,7 @@
 "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
 "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40"
 "checksum bytecount 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f861d9ce359f56dbcb6e0c2a1cb84e52ad732cadb57b806adeb3c7668caccbd8"
-"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.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e"
 "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
@@ -2192,11 +2200,11 @@
 "checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192"
 "checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19"
 "checksum crossbeam 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d1c92ff2d7a202d592f5a412d75cf421495c913817781c1cb383bf12a77e185f"
-"checksum crossbeam-channel 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "137bc235f622ffaa0428e3854e24acb53291fc0b3ff6fb2cb75a8be6fb02f06b"
+"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.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f10a4f8f409aaac4b16a5474fb233624238fcdeefb9ba50d5ea059aab63ba31c"
-"checksum crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "41ee4864f4797060e52044376f7d107429ce1fb43460021b126424b7180ee21a"
+"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4"
+"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c"
 "checksum data-encoding 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4f47ca1860a761136924ddd2422ba77b2ea54fe8cc75b9040804a0d9d32ad97"
 "checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86"
 "checksum derp 0.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8e686cf031aae7161f6169912b1b38049b128dff51a94789f26d54a067634bb1"
@@ -2204,7 +2212,8 @@
 "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90"
 "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0"
 "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02"
-"checksum euclid 0.19.4 (registry+https://github.com/rust-lang/crates.io-index)" = "dbbf962bb6f877239a34491f2e0a12c6b824f389bc789eb90f1d70d4780b0727"
+"checksum euclid 0.19.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a7698bdda3d7444a79d33bdc96e8b518d44ea3ff101d8492a6ca1207b886ea"
+"checksum euclid_macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdcb84c18ea5037a1c5a23039b4ff29403abce2e0d6b1daa11cf0bde2b30be15"
 "checksum eui48 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8c4cf866e4d3e5e773691f5f61615a224a7b0b72b7daf994fc56d1b82dab0b6b"
 "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"
@@ -2226,12 +2235,12 @@
 "checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d"
 "checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797"
 "checksum gzip-header 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9e59524a909fe98bb6c6f2cf1f27f2f6772887a496bf4c68cae0d94f884586"
-"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 heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
 "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
-"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 hyper 0.12.20 (registry+https://github.com/rust-lang/crates.io-index)" = "80eeda66c9ef8e18f5122fff2c54604c053420b11dae951cfb74cf1dcba2e93f"
+"checksum hyper 0.12.24 (registry+https://github.com/rust-lang/crates.io-index)" = "fdfa9b401ef6c4229745bb6e9b2529192d07b920eed624cdee2a82348cd550af"
 "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
 "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d"
 "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
@@ -2247,12 +2256,12 @@
 "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.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8"
+"checksum memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"
 "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
 "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
 "checksum mime_guess 1.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2d4c0961143b8efdcfa29c3ae63281601b446a4a668165454b6c90f8024954c5"
-"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 multipart 0.15.4 (registry+https://github.com/rust-lang/crates.io-index)" = "adba94490a79baf2d6a23eac897157047008272fa3eecb3373ae6377b91eca28"
 "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
 "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
@@ -2264,7 +2273,7 @@
 "checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
 "checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10"
 "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
-"checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238"
+"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba"
 "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 parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5"
@@ -2285,12 +2294,12 @@
 "checksum pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a029430f0d744bc3d15dd474d591bed2402b645d024583082b9f63bb936dac6"
 "checksum proc-macro-hack 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3e90aa19cd73dedc2d0e1e8407473f073d735fef0ab521438de6da8ee449ab66"
 "checksum proc-macro-nested 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e9968e025d6368d1273a93bc23051e30dbf5482475e716d7385d8ec8fbd5b5b6"
-"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 proptest 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "926d0604475349f463fe44130aae73f2294b5309ab2ca0310b998bd334ef191f"
 "checksum publicsuffix 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5afecba86dcf1e4fd610246f89899d1924fe12e1e89f555eb7c7f710f3c5ad1d"
 "checksum pulse 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "655612b6c8d96a8a02f331fe296cb4f925b68e87c1d195544675abca2d9b9af0"
 "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
-"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c"
+"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"
@@ -2310,13 +2319,13 @@
 "checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f"
 "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 ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)" = "148fc853f6d85f53f5f315d46701eaacc565cdfb3cb1959730c96e81e7e49999"
+"checksum ring 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c"
 "checksum rouille 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "112568052ec17fa26c6c11c40acbb30d3ad244bf3d6da0be181f5e7e42e5004f"
 "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.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
-"checksum rustls 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "658a37e5aa4f69d50c5b1fff01cff75551be9576cedcadb63df97f7ddbb16d5f"
-"checksum rusttype 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "436c67ae0d0d24f14e1177c3ed96780ee16db82b405f0fba1bb80b46c9a30625"
+"checksum rustls 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)" = "38af00e78b66109e7184a0ee16940f41583161b7ec0518af258e4bcaed15db25"
+"checksum rusttype 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ce3926a2057b315b3e8bca6d1cec1e97f19436a8f9127621cd538cda9c96a38b"
 "checksum rusty-fork 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9591f190d2852720b679c21f66ad929f9f1d7bb09d1193c26167586029d8489c"
 "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7"
 "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f"
@@ -2327,18 +2336,18 @@
 "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.87 (registry+https://github.com/rust-lang/crates.io-index)" = "2e20fde37801e83c891a2dc4ebd3b81f0da4d1fb67a9e0a2a3b921e2536a58ee"
-"checksum serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d6115a3ca25c224e409185325afc16a0d5aaaabc15c42b09587d6f1ba39a5b"
+"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 sha-1 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9d1f3b5de8a167ab06834a7c883bd197f2191e1dda1a22d9ccfeedbf9aded"
 "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
 "checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0"
 "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 smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15"
 "checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55"
 "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
-"checksum stb_truetype 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71a7d260b43b6129a22dc341be18a231044ca67a48b7e32625f380cc5ec9ad70"
-"checksum string 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98998cced76115b1da46f63388b909d118a37ae0be0f82ad35773d4a4bc9d18d"
+"checksum stb_truetype 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "69b7df505db8e81d54ff8be4693421e5b543e08214bd8d99eb761fcb4d5668ba"
+"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 structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad348dc73012fcf78c71f06f9d942232cdd4c859d4b6975e27836c3efc0c3"
 "checksum structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ef98172b1a00b0bec738508d3726540edcbd186d50dfd326f2b1febbb3559f04"
@@ -2346,7 +2355,7 @@
 "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
 "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78"
 "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
-"checksum tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7e91405c14320e5c79b3d148e1c86f40749a36e490642202a31689cb1a3452b2"
+"checksum tempfile 3.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "37daa55a7240c4931c84559f03b3cad7d19535840d1c4a0cc4e9b2fb0dcf70ff"
 "checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561"
 "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
 "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
diff --git a/rustc_deps/tiny_mirrors/winapi-util/Cargo.toml b/rustc_deps/tiny_mirrors/winapi-util/Cargo.toml
index dc0df3c..11e16f6 100644
--- a/rustc_deps/tiny_mirrors/winapi-util/Cargo.toml
+++ b/rustc_deps/tiny_mirrors/winapi-util/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "winapi-util"
-version = "0.1.1"
+version = "0.1.2"
 authors = ["Erick Tryzelaar <etryzelaar@google.com>"]
 
 [dependencies]
diff --git a/rustc_deps/vendor/base64/.cargo-checksum.json b/rustc_deps/vendor/base64/.cargo-checksum.json
index fa3e5a6..0f4d240 100644
--- a/rustc_deps/vendor/base64/.cargo-checksum.json
+++ b/rustc_deps/vendor/base64/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"89131475d69542cea57da56ce5ba4a782188f969a1d1dc399eb254b93284a278","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7","README.md":"7269a723029fe3254ee94efd2967ccf3521c17978d32d064b93e693271323c43","RELEASE-NOTES.md":"405f7c5f06c7e81b232d78111ddac6bc63878528bea4781645866d5f62a9f2bf","benches/benchmarks.rs":"dbdb26bea4d0d214e39176fb7ab5af5afb78863fb345d11bf6e743344ffd36d3","examples/make_tables.rs":"e7c3e665874faa10ff1906420eb5182d1b725bcd30ff0d6da719bb368683e197","src/chunked_encoder.rs":"fe2d6d65d0c5e30f8f5d0ec7a95bf5a5028c47ae338ee8c5ef8d0d7c1d968031","src/decode.rs":"f08cdf315ba7ebad7fbd06ec3b6cb3612a52d9ce16662ce0d7f3d191862f7b17","src/display.rs":"59a9ca41f5fe42be0db700a9180e58e33eaff7a08fcbfd7b24f0286544613915","src/encode.rs":"7f6413ad27bf135f1fe38866a661a7300610905d8c858aff52eff2fd9e02a441","src/lib.rs":"893155d20c55525ebcf0b46de76c4cbdf1e0e43518f911d52e2de357ec7e29a6","src/tables.rs":"10b09997ed9765dc46c2d1f0df21b915d88c4f47a292b5c7df5c1851e724fb03","src/tests.rs":"4c72499a5b13f9ed793f275445bf9d1d631530bb7c39494de96d08e5c0602430","src/write/encoder.rs":"58ded8c942b0b96e8466f9ff667fcb96c262a492c67d76414521baa1e6f32b24","src/write/encoder_tests.rs":"9e7f165650bde35858d05bdb1655ae009f4e44014e296dab6cf6e789f5271de4","src/write/mod.rs":"124b223f3effcb1d85671a4173a635cdfae480341b032217c77876647344176b","tests/decode.rs":"dc7167f8127a3ece7234f3631664e5a0987a0e2b7333f2d93bfc7e88db2f9ad6","tests/encode.rs":"5efb6904c36c6f899a05078e5c9be756fc58af1ee9940edfa8dea1ee53675364","tests/helpers.rs":"a76015e4a4e8f98213bdbaa592cd9574ccdc95a28e1b1f835a2753e09fa6037f","tests/tests.rs":"eec857210322f4ea1531f67afe1aeacfc5626ec50781ee39f91c0b2a677b9846"},"package":"621fc7ecb8008f86d7fb9b95356cd692ce9514b80a86d85b397f32a22da7b9e2"}
\ No newline at end of file
+{"files":{"Cargo.toml":"e2c92a2cbab69decb49684c88d92e3a3ea1b5a57bbbc9a1ecfb6c0a30c44eaf5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7","README.md":"3128245c3e486cc551373a478aa1729565b936308d821dd02ba7936750b0cef6","RELEASE-NOTES.md":"bf3b3b676794ca44197800dbbf96ab2b805f468bc6d89a798374e684e8524374","benches/benchmarks.rs":"f5151f52360c2abca0bbf66eb96aa4deb35e0f06f932389b9b146d48cd9bcd3f","examples/make_tables.rs":"709e19bfb613dc890c72a243bac9ad99b2f97cb793006ce712560575e3162969","icon_CLion.svg":"cffa044ba75cb998ee3306991dc4a3755ec2f39ab95ddd4b74bc21988389020f","src/chunked_encoder.rs":"7a8a8f47f0d85064b648ea1a824417a8fb84803e7e63bd3a03d38d856864f50a","src/decode.rs":"431ca48cc959e26b5a648716bf4e00c6a7f598b670ba9a800a90ba98658b413d","src/display.rs":"2ecee9c0f3c2c00a54f70c950c8a97354691721e0b984b6f5c94299bb744f459","src/encode.rs":"932c4b6168fc2060c582d7a6a8a8fd7d900f8203ef0fe36c1c4d197217ee9a7a","src/lib.rs":"b2c15e224e9b16b5c1b1abef5c8622b8c7261300c582f45f0b24da953396bbd3","src/tables.rs":"4f71ead5d026284f056ef4c7cc233802be5a523790726e5785e576387e11d326","src/tests.rs":"25e4dc1b09124f3bc9f3c3efc39492c059a5de7bf3b515410f83823549ce4cd0","src/write/encoder.rs":"9e705fe50a5f6ba6156c2497f168cee239a5a7610855aa2107e4450c992fbdb3","src/write/encoder_tests.rs":"7489331c0d23eb718b94a40115e92c038a5e5c8f0282d735b0697dcbc8a14846","src/write/mod.rs":"124b223f3effcb1d85671a4173a635cdfae480341b032217c77876647344176b","tests/decode.rs":"216007a44c9201a29b67da14df90ff0d0d219187d209cedfdceee060a379975a","tests/encode.rs":"5efb6904c36c6f899a05078e5c9be756fc58af1ee9940edfa8dea1ee53675364","tests/helpers.rs":"a76015e4a4e8f98213bdbaa592cd9574ccdc95a28e1b1f835a2753e09fa6037f","tests/tests.rs":"5583e10bae1f4264af9a0ffb77330d7a710e2c2cf483ce7013bf13f9ad523491"},"package":"0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/base64/Cargo.toml b/rustc_deps/vendor/base64/Cargo.toml
index 2d284fd..25725e5 100644
--- a/rustc_deps/vendor/base64/Cargo.toml
+++ b/rustc_deps/vendor/base64/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "base64"
-version = "0.10.0"
+version = "0.10.1"
 authors = ["Alice Maz <alice@alicemaz.com>", "Marshall Pierce <marshall@mpierce.org>"]
 description = "encodes and decodes base64 as bytes or utf8"
 documentation = "https://github.com/alicemaz/rust-base64/blob/master/README.md"
@@ -23,7 +23,14 @@
 repository = "https://github.com/alicemaz/rust-base64"
 [profile.bench]
 debug = true
+
+[[bench]]
+name = "benchmarks"
+harness = false
 [dependencies.byteorder]
 version = "1.2.6"
+[dev-dependencies.criterion]
+version = "0.2"
+
 [dev-dependencies.rand]
-version = "0.5.5"
+version = "0.6.1"
diff --git a/rustc_deps/vendor/base64/README.md b/rustc_deps/vendor/base64/README.md
index 4f65289..c10d170 100644
--- a/rustc_deps/vendor/base64/README.md
+++ b/rustc_deps/vendor/base64/README.md
@@ -3,6 +3,10 @@
 
 [![](https://img.shields.io/crates/v/base64.svg)](https://crates.io/crates/base64) [![Docs](https://docs.rs/base64/badge.svg)](https://docs.rs/base64) [![Build](https://travis-ci.org/alicemaz/rust-base64.svg?branch=master)](https://travis-ci.org/alicemaz/rust-base64) [![codecov](https://codecov.io/gh/alicemaz/rust-base64/branch/master/graph/badge.svg)](https://codecov.io/gh/alicemaz/rust-base64)
 
+<a href="https://www.jetbrains.com/?from=rust-base64"><img src="/icon_CLion.svg" height="40px"/></a>
+
+Made with CLion. Thanks to JetBrains for supporting open source!
+
 It's base64. What more could anyone want?
 
 Example
@@ -24,10 +28,10 @@
 
 See the [docs](https://docs.rs/base64) for all the details.
 
-Purpose
+Rust version compatibility
 ---
 
-I have a fondness for small dependency footprints, ecosystems where you can pick and choose what functionality you need, and no more. Unix philosophy sort of thing I guess, many tiny utilities interoperating across a common interface. One time making a Twitter bot, I ran into the need to correctly pluralize arbitrary words. I found on npm a module that did nothing but pluralize words. Nothing else, just a couple of functions. I'd like for this to be that "just a couple of functions."
+The minimum required Rust version is 1.27.2.
 
 Developing
 ---
diff --git a/rustc_deps/vendor/base64/RELEASE-NOTES.md b/rustc_deps/vendor/base64/RELEASE-NOTES.md
index 4d893f1..5e032ea 100644
--- a/rustc_deps/vendor/base64/RELEASE-NOTES.md
+++ b/rustc_deps/vendor/base64/RELEASE-NOTES.md
@@ -1,3 +1,13 @@
+# Next
+
+- TBD
+
+# 0.10.1
+
+- Minimum rust version 1.27.2
+- Fix bug in streaming encoding ([#90](https://github.com/alicemaz/rust-base64/pull/90)): if the underlying writer didn't write all the bytes given to it, the remaining bytes would not be retried later. See the docs on `EncoderWriter::write`.
+- Make it configurable whether or not to return an error when decoding detects excess trailing bits.
+
 # 0.10.0
 
 - Remove line wrapping. Line wrapping was never a great conceptual fit in this library, and other features (streaming encoding, etc) either couldn't support it or could support only special cases of it with a great increase in complexity. Line wrapping has been pulled out into a [line-wrap](https://crates.io/crates/line-wrap) crate, so it's still available if you need it.
diff --git a/rustc_deps/vendor/base64/benches/benchmarks.rs b/rustc_deps/vendor/base64/benches/benchmarks.rs
index acc90f0..e6ae3d2 100644
--- a/rustc_deps/vendor/base64/benches/benchmarks.rs
+++ b/rustc_deps/vendor/base64/benches/benchmarks.rs
@@ -1,348 +1,105 @@
-#![feature(test)]
-
 extern crate base64;
+#[macro_use]
+extern crate criterion;
 extern crate rand;
-extern crate test;
 
 use base64::display;
-use base64::{decode, decode_config_buf, decode_config_slice, encode, encode_config_buf,
-             encode_config_slice, write, Config, STANDARD};
+use base64::{
+    decode, decode_config_buf, decode_config_slice, encode, encode_config_buf, encode_config_slice,
+    write, Config,
+};
 
-use rand::{Rng, FromEntropy};
+use criterion::{black_box, Bencher, Criterion, ParameterizedBenchmark, Throughput};
+use rand::{FromEntropy, Rng};
 use std::io::Write;
-use test::Bencher;
 
-#[bench]
-fn encode_3b(b: &mut Bencher) {
-    do_encode_bench(b, 3)
-}
+const TEST_CONFIG: Config = base64::STANDARD;
 
-#[bench]
-fn encode_3b_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 3, STANDARD)
-}
-
-#[bench]
-fn encode_3b_slice(b: &mut Bencher) {
-    do_encode_bench_slice(b, 3, STANDARD)
-}
-
-#[bench]
-fn encode_50b(b: &mut Bencher) {
-    do_encode_bench(b, 50)
-}
-
-#[bench]
-fn encode_50b_display(b: &mut Bencher) {
-    do_encode_bench_display(b, 50)
-}
-
-#[bench]
-fn encode_50b_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 50, STANDARD)
-}
-
-#[bench]
-fn encode_50b_slice(b: &mut Bencher) {
-    do_encode_bench_slice(b, 50, STANDARD)
-}
-
-#[bench]
-fn encode_100b(b: &mut Bencher) {
-    do_encode_bench(b, 100)
-}
-
-#[bench]
-fn encode_100b_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 100, STANDARD)
-}
-
-#[bench]
-fn encode_500b(b: &mut Bencher) {
-    do_encode_bench(b, 500)
-}
-
-#[bench]
-fn encode_500b_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 500, STANDARD)
-}
-
-#[bench]
-fn encode_3kib(b: &mut Bencher) {
-    do_encode_bench(b, 3 * 1024)
-}
-
-#[bench]
-fn encode_3kib_display(b: &mut Bencher) {
-    do_encode_bench_display(b, 3 * 1024)
-}
-
-#[bench]
-fn encode_3kib_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 3 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_3kib_slice(b: &mut Bencher) {
-    do_encode_bench_slice(b, 3 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_3kib_reuse_buf_stream(b: &mut Bencher) {
-    do_encode_bench_stream(b, 3 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_3mib(b: &mut Bencher) {
-    do_encode_bench(b, 3 * 1024 * 1024)
-}
-
-#[bench]
-fn encode_3mib_display(b: &mut Bencher) {
-    do_encode_bench_display(b, 3 * 1024 * 1024)
-}
-
-#[bench]
-fn encode_3mib_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 3 * 1024 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_3mib_slice(b: &mut Bencher) {
-    do_encode_bench_slice(b, 3 * 1024 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_10mib(b: &mut Bencher) {
-    do_encode_bench(b, 10 * 1024 * 1024)
-}
-
-#[bench]
-fn encode_10mib_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 10 * 1024 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_30mib(b: &mut Bencher) {
-    do_encode_bench(b, 30 * 1024 * 1024)
-}
-
-#[bench]
-fn encode_30mib_reuse_buf(b: &mut Bencher) {
-    do_encode_bench_reuse_buf(b, 30 * 1024 * 1024, STANDARD)
-}
-
-#[bench]
-fn encode_30mib_slice(b: &mut Bencher) {
-    do_encode_bench_slice(b, 30 * 1024 * 1024, STANDARD)
-}
-
-#[bench]
-fn decode_3b(b: &mut Bencher) {
-    do_decode_bench(b, 3)
-}
-
-#[bench]
-fn decode_3b_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 3)
-}
-
-#[bench]
-fn decode_3b_slice(b: &mut Bencher) {
-    do_decode_bench_slice(b, 3)
-}
-
-#[bench]
-fn decode_50b(b: &mut Bencher) {
-    do_decode_bench(b, 50)
-}
-
-#[bench]
-fn decode_50b_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 50)
-}
-
-#[bench]
-fn decode_50b_slice(b: &mut Bencher) {
-    do_decode_bench_slice(b, 50)
-}
-
-#[bench]
-fn decode_100b(b: &mut Bencher) {
-    do_decode_bench(b, 100)
-}
-
-#[bench]
-fn decode_100b_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 100)
-}
-
-#[bench]
-fn decode_500b(b: &mut Bencher) {
-    do_decode_bench(b, 500)
-}
-
-#[bench]
-fn decode_500b_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 500)
-}
-
-#[bench]
-fn decode_3kib(b: &mut Bencher) {
-    do_decode_bench(b, 3 * 1024)
-}
-
-#[bench]
-fn decode_3kib_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 3 * 1024)
-}
-
-#[bench]
-fn decode_3kib_slice(b: &mut Bencher) {
-    do_decode_bench_slice(b, 3 * 1024)
-}
-
-#[bench]
-fn decode_3mib(b: &mut Bencher) {
-    do_decode_bench(b, 3 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_3mib_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 3 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_3mib_slice(b: &mut Bencher) {
-    do_decode_bench_slice(b, 3 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_10mib(b: &mut Bencher) {
-    do_decode_bench(b, 10 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_10mib_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 10 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_30mib(b: &mut Bencher) {
-    do_decode_bench(b, 30 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_30mib_reuse_buf(b: &mut Bencher) {
-    do_decode_bench_reuse_buf(b, 30 * 1024 * 1024)
-}
-
-#[bench]
-fn decode_30mib_slice(b: &mut Bencher) {
-    do_decode_bench_slice(b, 30 * 1024 * 1024)
-}
-
-fn do_decode_bench(b: &mut Bencher, size: usize) {
+fn do_decode_bench(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size * 3 / 4);
     fill(&mut v);
     let encoded = encode(&v);
 
-    b.bytes = encoded.len() as u64;
     b.iter(|| {
         let orig = decode(&encoded);
-        test::black_box(&orig);
+        black_box(&orig);
     });
 }
 
-fn do_decode_bench_reuse_buf(b: &mut Bencher, size: usize) {
+fn do_decode_bench_reuse_buf(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size * 3 / 4);
     fill(&mut v);
     let encoded = encode(&v);
 
     let mut buf = Vec::new();
-    b.bytes = encoded.len() as u64;
     b.iter(|| {
-        decode_config_buf(&encoded, STANDARD, &mut buf).unwrap();
-        test::black_box(&buf);
+        decode_config_buf(&encoded, TEST_CONFIG, &mut buf).unwrap();
+        black_box(&buf);
         buf.clear();
     });
 }
 
-fn do_decode_bench_slice(b: &mut Bencher, size: usize) {
+fn do_decode_bench_slice(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size * 3 / 4);
     fill(&mut v);
     let encoded = encode(&v);
 
     let mut buf = Vec::new();
     buf.resize(size, 0);
-    b.bytes = encoded.len() as u64;
     b.iter(|| {
-        decode_config_slice(&encoded, STANDARD, &mut buf).unwrap();
-        test::black_box(&buf);
+        decode_config_slice(&encoded, TEST_CONFIG, &mut buf).unwrap();
+        black_box(&buf);
     });
 }
 
-fn do_encode_bench(b: &mut Bencher, size: usize) {
+fn do_encode_bench(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size);
     fill(&mut v);
-
-    b.bytes = v.len() as u64;
     b.iter(|| {
         let e = encode(&v);
-        test::black_box(&e);
+        black_box(&e);
     });
 }
 
-fn do_encode_bench_display(b: &mut Bencher, size: usize) {
+fn do_encode_bench_display(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size);
     fill(&mut v);
-
-    b.bytes = v.len() as u64;
     b.iter(|| {
-        let e = format!("{}", display::Base64Display::with_config(&v, STANDARD));
-        test::black_box(&e);
+        let e = format!("{}", display::Base64Display::with_config(&v, TEST_CONFIG));
+        black_box(&e);
     });
 }
 
-fn do_encode_bench_reuse_buf(b: &mut Bencher, size: usize, config: Config) {
+fn do_encode_bench_reuse_buf(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size);
     fill(&mut v);
-
     let mut buf = String::new();
-
-    b.bytes = v.len() as u64;
     b.iter(|| {
-        encode_config_buf(&v, config, &mut buf);
+        encode_config_buf(&v, TEST_CONFIG, &mut buf);
         buf.clear();
     });
 }
 
-fn do_encode_bench_slice(b: &mut Bencher, size: usize, config: Config) {
+fn do_encode_bench_slice(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size);
     fill(&mut v);
-
     let mut buf = Vec::new();
-
-    b.bytes = v.len() as u64;
     // conservative estimate of encoded size
-    buf.resize(size * 2, 0);
+    buf.resize(v.len() * 2, 0);
     b.iter(|| {
-        encode_config_slice(&v, config, &mut buf);
+        encode_config_slice(&v, TEST_CONFIG, &mut buf);
     });
 }
 
-fn do_encode_bench_stream(b: &mut Bencher, size: usize, config: Config) {
+fn do_encode_bench_stream(b: &mut Bencher, &size: &usize) {
     let mut v: Vec<u8> = Vec::with_capacity(size);
     fill(&mut v);
-
     let mut buf = Vec::new();
 
-    b.bytes = v.len() as u64;
-
     buf.reserve(size * 2);
     b.iter(|| {
         buf.clear();
-        let mut stream_enc = write::EncoderWriter::new(&mut buf, config);
+        let mut stream_enc = write::EncoderWriter::new(&mut buf, TEST_CONFIG);
         stream_enc.write_all(&v).unwrap();
         stream_enc.flush().unwrap();
     });
@@ -356,3 +113,48 @@
         v.push(r.gen::<u8>());
     }
 }
+
+const BYTE_SIZES: [usize; 5] = [3, 50, 100, 500, 3 * 1024];
+
+// Benchmarks over these byte sizes take longer so we will run fewer samples to
+// keep the benchmark runtime reasonable.
+const LARGE_BYTE_SIZES: [usize; 3] = [3 * 1024 * 1024, 10 * 1024 * 1024, 30 * 1024 * 1024];
+
+fn encode_benchmarks(byte_sizes: &[usize]) -> ParameterizedBenchmark<usize> {
+    ParameterizedBenchmark::new("encode", do_encode_bench, byte_sizes.iter().cloned())
+        .warm_up_time(std::time::Duration::from_millis(500))
+        .measurement_time(std::time::Duration::from_secs(3))
+        .throughput(|s| Throughput::Bytes(*s as u32))
+        .with_function("encode_display", do_encode_bench_display)
+        .with_function("encode_reuse_buf", do_encode_bench_reuse_buf)
+        .with_function("encode_slice", do_encode_bench_slice)
+        .with_function("encode_reuse_buf_stream", do_encode_bench_stream)
+}
+
+fn decode_benchmarks(byte_sizes: &[usize]) -> ParameterizedBenchmark<usize> {
+    ParameterizedBenchmark::new("decode", do_decode_bench, byte_sizes.iter().cloned())
+        .warm_up_time(std::time::Duration::from_millis(500))
+        .measurement_time(std::time::Duration::from_secs(3))
+        .throughput(|s| Throughput::Bytes(*s as u32))
+        .with_function("decode_reuse_buf", do_decode_bench_reuse_buf)
+        .with_function("decode_slice", do_decode_bench_slice)
+}
+
+fn bench(c: &mut Criterion) {
+    c.bench("bench_small_input", encode_benchmarks(&BYTE_SIZES[..]));
+
+    c.bench(
+        "bench_large_input",
+        encode_benchmarks(&LARGE_BYTE_SIZES[..]).sample_size(10),
+    );
+
+    c.bench("bench_small_input", decode_benchmarks(&BYTE_SIZES[..]));
+
+    c.bench(
+        "bench_large_input",
+        decode_benchmarks(&LARGE_BYTE_SIZES[..]).sample_size(10),
+    );
+}
+
+criterion_group!(benches, bench);
+criterion_main!(benches);
diff --git a/rustc_deps/vendor/base64/examples/make_tables.rs b/rustc_deps/vendor/base64/examples/make_tables.rs
index f8d6f37..9f170c0 100644
--- a/rustc_deps/vendor/base64/examples/make_tables.rs
+++ b/rustc_deps/vendor/base64/examples/make_tables.rs
@@ -33,11 +33,11 @@
     print_decode_table(&url_alphabet, "URL_SAFE_DECODE", 0);
 
     // ./0123456789
-    let crypt_alphabet: Vec<u8> = (b'.'..(b'9'+1))
+    let crypt_alphabet: Vec<u8> = (b'.'..(b'9' + 1))
         // A-Z
-        .chain(b'A'..(b'Z'+1))
+        .chain(b'A'..(b'Z' + 1))
         // a-z
-        .chain(b'a'..(b'z'+1))
+        .chain(b'a'..(b'z' + 1))
         .collect();
     print_encode_table(&crypt_alphabet, "CRYPT_ENCODE", 0);
     print_decode_table(&crypt_alphabet, "CRYPT_DECODE", 0);
diff --git a/rustc_deps/vendor/base64/icon_CLion.svg b/rustc_deps/vendor/base64/icon_CLion.svg
new file mode 100644
index 0000000..e9edb04
--- /dev/null
+++ b/rustc_deps/vendor/base64/icon_CLion.svg
@@ -0,0 +1,34 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
+  <defs>
+    <linearGradient id="linear-gradient" x1="40.69" y1="-676.56" x2="83.48" y2="-676.56" gradientTransform="matrix(1, 0, 0, -1, 0, -648.86)" gradientUnits="userSpaceOnUse">
+      <stop offset="0" stop-color="#ed358c"/>
+      <stop offset="0.16" stop-color="#e9388c"/>
+      <stop offset="0.3" stop-color="#de418c"/>
+      <stop offset="0.43" stop-color="#cc508c"/>
+      <stop offset="0.57" stop-color="#b2658d"/>
+      <stop offset="0.7" stop-color="#90808d"/>
+      <stop offset="0.83" stop-color="#67a18e"/>
+      <stop offset="0.95" stop-color="#37c78f"/>
+      <stop offset="1" stop-color="#22d88f"/>
+    </linearGradient>
+    <linearGradient id="linear-gradient-2" x1="32.58" y1="-665.27" x2="13.76" y2="-791.59" gradientTransform="matrix(1, 0, 0, -1, 0, -648.86)" gradientUnits="userSpaceOnUse">
+      <stop offset="0.09" stop-color="#22d88f"/>
+      <stop offset="0.9" stop-color="#029de0"/>
+    </linearGradient>
+    <linearGradient id="linear-gradient-3" x1="116.68" y1="-660.66" x2="-12.09" y2="-796.66" xlink:href="#linear-gradient-2"/>
+    <linearGradient id="linear-gradient-4" x1="73.35" y1="-739.1" x2="122.29" y2="-746.06" xlink:href="#linear-gradient-2"/>
+  </defs>
+  <title>icon_CLion</title>
+  <g>
+    <polygon points="49.2 51.8 40.6 55.4 48.4 0 77.8 16.2 49.2 51.8" fill="url(#linear-gradient)"/>
+    <polygon points="44.6 76.8 48.8 0 11.8 23.2 0 94 44.6 76.8" fill="url(#linear-gradient-2)"/>
+    <polygon points="125.4 38.4 109 4.8 77.8 16.2 55 41.4 0 94 41.6 124.4 93.6 77.2 125.4 38.4" fill="url(#linear-gradient-3)"/>
+    <polygon points="53.8 54.6 46.6 98.4 75.8 121 107.8 128 128 82.4 53.8 54.6" fill="url(#linear-gradient-4)"/>
+  </g>
+  <g>
+    <rect x="24" y="24" width="80" height="80"/>
+    <rect x="31.6" y="89" width="30" height="5" fill="#fff"/>
+    <path d="M31,51.2h0A16.83,16.83,0,0,1,48.2,34c6.2,0,10,2,13,5.2l-4.6,5.4c-2.6-2.4-5.2-3.8-8.4-3.8-5.6,0-9.6,4.6-9.6,10.4h0c0,5.6,4,10.4,9.6,10.4,3.8,0,6.2-1.6,8.8-3.8l4.6,4.6c-3.4,3.6-7.2,6-13.6,6A17,17,0,0,1,31,51.2" fill="#fff"/>
+    <path d="M66.6,34.4H74v27H88.4v6.2H66.6V34.4Z" fill="#fff"/>
+  </g>
+</svg>
diff --git a/rustc_deps/vendor/base64/src/chunked_encoder.rs b/rustc_deps/vendor/base64/src/chunked_encoder.rs
index 8becab6..db03ba5 100644
--- a/rustc_deps/vendor/base64/src/chunked_encoder.rs
+++ b/rustc_deps/vendor/base64/src/chunked_encoder.rs
@@ -22,7 +22,7 @@
     pub fn new(config: Config) -> ChunkedEncoder {
         ChunkedEncoder {
             config,
-            max_input_chunk_len: max_input_length(BUF_SIZE, &config),
+            max_input_chunk_len: max_input_length(BUF_SIZE, config),
         }
     }
 
@@ -63,7 +63,7 @@
 ///
 /// The input length will always be a multiple of 3 so that no encoding state has to be carried over
 /// between chunks.
-fn max_input_length(encoded_buf_len: usize, config: &Config) -> usize {
+fn max_input_length(encoded_buf_len: usize, config: Config) -> usize {
     let effective_buf_len = if config.pad {
         // make room for padding
         encoded_buf_len
@@ -77,7 +77,6 @@
     (effective_buf_len / 4) * 3
 }
 
-
 // A really simple sink that just appends to a string
 pub(crate) struct StringSink<'a> {
     string: &'a mut String,
@@ -85,9 +84,7 @@
 
 impl<'a> StringSink<'a> {
     pub(crate) fn new(s: &mut String) -> StringSink {
-        StringSink {
-            string: s,
-        }
+        StringSink { string: s }
     }
 }
 
@@ -109,8 +106,8 @@
     use tests::random_config;
     use *;
 
-    use self::rand::distributions::{Distribution, Range};
-    use self::rand::{Rng, FromEntropy};
+    use self::rand::distributions::{Distribution, Uniform};
+    use self::rand::{FromEntropy, Rng};
 
     #[test]
     fn chunked_encode_empty() {
@@ -150,41 +147,38 @@
     #[test]
     fn max_input_length_no_pad() {
         let config = config_with_pad(false);
-        assert_eq!(768, max_input_length(1024, &config));
+        assert_eq!(768, max_input_length(1024, config));
     }
 
     #[test]
     fn max_input_length_with_pad_decrements_one_triple() {
         let config = config_with_pad(true);
-        assert_eq!(765, max_input_length(1024, &config));
+        assert_eq!(765, max_input_length(1024, config));
     }
 
     #[test]
     fn max_input_length_with_pad_one_byte_short() {
         let config = config_with_pad(true);
-        assert_eq!(765, max_input_length(1025, &config));
+        assert_eq!(765, max_input_length(1025, config));
     }
 
     #[test]
     fn max_input_length_with_pad_fits_exactly() {
         let config = config_with_pad(true);
-        assert_eq!(768, max_input_length(1026, &config));
+        assert_eq!(768, max_input_length(1026, config));
     }
 
     #[test]
     fn max_input_length_cant_use_extra_single_encoded_byte() {
-        let config = Config::new(
-            CharacterSet::Standard,
-            false,
-        );
-        assert_eq!(300, max_input_length(401, &config));
+        let config = Config::new(CharacterSet::Standard, false);
+        assert_eq!(300, max_input_length(401, config));
     }
 
     pub fn chunked_encode_matches_normal_encode_random<S: SinkTestHelper>(sink_test_helper: &S) {
         let mut input_buf: Vec<u8> = Vec::new();
         let mut output_buf = String::new();
         let mut rng = rand::rngs::SmallRng::from_entropy();
-        let input_len_range = Range::new(1, 10_000);
+        let input_len_range = Uniform::new(1, 10_000);
 
         for _ in 0..5_000 {
             input_buf.clear();
diff --git a/rustc_deps/vendor/base64/src/decode.rs b/rustc_deps/vendor/base64/src/decode.rs
index 9e5a762..2dfa3ad 100644
--- a/rustc_deps/vendor/base64/src/decode.rs
+++ b/rustc_deps/vendor/base64/src/decode.rs
@@ -1,5 +1,5 @@
 use byteorder::{BigEndian, ByteOrder};
-use {tables, CharacterSet, Config, STANDARD};
+use {tables, Config, STANDARD};
 
 use std::{error, fmt, str};
 
@@ -143,7 +143,7 @@
     let bytes_written;
     {
         let buffer_slice = &mut buffer.as_mut_slice()[starting_output_len..];
-        bytes_written = decode_helper(input_bytes, num_chunks, &config.char_set, buffer_slice)?;
+        bytes_written = decode_helper(input_bytes, num_chunks, config, buffer_slice)?;
     }
 
     buffer.truncate(starting_output_len + bytes_written);
@@ -170,7 +170,7 @@
     decode_helper(
         input_bytes,
         num_chunks(input_bytes),
-        &config.char_set,
+        config,
         output,
     )
 }
@@ -180,7 +180,8 @@
     input
         .len()
         .checked_add(INPUT_CHUNK_LEN - 1)
-        .expect("Overflow when calculating number of chunks in input") / INPUT_CHUNK_LEN
+        .expect("Overflow when calculating number of chunks in input")
+        / INPUT_CHUNK_LEN
 }
 
 /// Helper to avoid duplicating num_chunks calculation, which is costly on short inputs.
@@ -192,9 +193,10 @@
 fn decode_helper(
     input: &[u8],
     num_chunks: usize,
-    char_set: &CharacterSet,
+    config: Config,
     output: &mut [u8],
 ) -> Result<usize, DecodeError> {
+    let char_set = config.char_set;
     let decode_table = char_set.decode_table();
 
     let remainder_len = input.len() % INPUT_CHUNK_LEN;
@@ -312,7 +314,7 @@
     }
 
     // always have one more (possibly partial) block of 8 input
-    debug_assert!(input.len() - input_index > 1 || input.len() == 0);
+    debug_assert!(input.len() - input_index > 1 || input.is_empty());
     debug_assert!(input.len() - input_index <= 8);
 
     // Stage 4
@@ -400,9 +402,12 @@
     // if there are bits set outside the bits we care about, last symbol encodes trailing bits that
     // will not be included in the output
     let mask = !0 >> leftover_bits_ready_to_append;
-    if (leftover_bits & mask) != 0 {
+    if !config.decode_allow_trailing_bits && (leftover_bits & mask) != 0 {
         // last morsel is at `morsels_in_leftover` - 1
-        return Err(DecodeError::InvalidLastSymbol(start_of_leftovers + morsels_in_leftover - 1, last_symbol));
+        return Err(DecodeError::InvalidLastSymbol(
+            start_of_leftovers + morsels_in_leftover - 1,
+            last_symbol,
+        ));
     }
 
     let mut leftover_bits_appended_to_buf = 0;
@@ -542,9 +547,8 @@
     use encode::encode_config_buf;
     use tests::{assert_encode_sanity, random_config};
 
-    use self::rand::distributions::{Distribution, Range};
-    use self::rand::{Rng, FromEntropy};
-
+    use self::rand::distributions::{Distribution, Uniform};
+    use self::rand::{FromEntropy, Rng};
 
     #[test]
     fn decode_chunk_precise_writes_only_6_bytes() {
@@ -570,8 +574,8 @@
         let mut decoded_without_prefix = Vec::new();
         let mut prefix = Vec::new();
 
-        let prefix_len_range = Range::new(0, 1000);
-        let input_len_range = Range::new(0, 1000);
+        let prefix_len_range = Uniform::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -590,7 +594,7 @@
 
             let config = random_config(&mut rng);
             encode_config_buf(&orig_data, config, &mut encoded_data);
-            assert_encode_sanity(&encoded_data, &config, input_len);
+            assert_encode_sanity(&encoded_data, config, input_len);
 
             let prefix_len = prefix_len_range.sample(&mut rng);
 
@@ -627,7 +631,7 @@
         let mut decode_buf = Vec::new();
         let mut decode_buf_copy: Vec<u8> = Vec::new();
 
-        let input_len_range = Range::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -645,7 +649,7 @@
 
             let config = random_config(&mut rng);
             encode_config_buf(&orig_data, config, &mut encoded_data);
-            assert_encode_sanity(&encoded_data, &config, input_len);
+            assert_encode_sanity(&encoded_data, config, input_len);
 
             // fill the buffer with random garbage, long enough to have some room before and after
             for _ in 0..5000 {
@@ -680,7 +684,7 @@
         let mut encoded_data = String::new();
         let mut decode_buf = Vec::new();
 
-        let input_len_range = Range::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -697,7 +701,7 @@
 
             let config = random_config(&mut rng);
             encode_config_buf(&orig_data, config, &mut encoded_data);
-            assert_encode_sanity(&encoded_data, &config, input_len);
+            assert_encode_sanity(&encoded_data, config, input_len);
 
             decode_buf.resize(input_len, 0);
 
@@ -712,17 +716,25 @@
 
     #[test]
     fn detect_invalid_last_symbol_two_bytes() {
+        let decode = |input, forgiving| {
+            decode_config(input, STANDARD.decode_allow_trailing_bits(forgiving))
+        };
+
         // example from https://github.com/alicemaz/rust-base64/issues/75
-        assert!(decode("iYU=").is_ok());
+        assert!(decode("iYU=", false).is_ok());
         // trailing 01
-        assert_eq!(Err(DecodeError::InvalidLastSymbol(2, b'V')), decode("iYV="));
+        assert_eq!(Err(DecodeError::InvalidLastSymbol(2, b'V')), decode("iYV=", false));
+        assert_eq!(Ok(vec![137, 133]), decode("iYV=", true));
         // trailing 10
-        assert_eq!(Err(DecodeError::InvalidLastSymbol(2, b'W')), decode("iYW="));
+        assert_eq!(Err(DecodeError::InvalidLastSymbol(2, b'W')), decode("iYW=", false));
+        assert_eq!(Ok(vec![137, 133]), decode("iYV=", true));
         // trailing 11
-        assert_eq!(Err(DecodeError::InvalidLastSymbol(2, b'X')), decode("iYX="));
+        assert_eq!(Err(DecodeError::InvalidLastSymbol(2, b'X')), decode("iYX=", false));
+        assert_eq!(Ok(vec![137, 133]), decode("iYV=", true));
 
         // also works when there are 2 quads in the last block
-        assert_eq!(Err(DecodeError::InvalidLastSymbol(6, b'X')), decode("AAAAiYX="));
+        assert_eq!(Err(DecodeError::InvalidLastSymbol(6, b'X')), decode("AAAAiYX=", false));
+        assert_eq!(Ok(vec![0, 0, 0, 137, 133]), decode("AAAAiYX=", true));
     }
 
     #[test]
@@ -739,7 +751,10 @@
         assert_eq!(Err(DecodeError::InvalidLastSymbol(1, b'/')), decode("//=="));
 
         // also works when there are 2 quads in the last block
-        assert_eq!(Err(DecodeError::InvalidLastSymbol(5, b'x')), decode("AAAA/x=="));
+        assert_eq!(
+            Err(DecodeError::InvalidLastSymbol(5, b'x')),
+            decode("AAAA/x==")
+        );
     }
 
     #[test]
@@ -757,7 +772,7 @@
                 v.extend_from_slice(&bytes[..]);
 
                 assert!(base64_to_bytes.insert(b64, v).is_none());
-            };
+            }
         }
 
         // every possible combination of symbols must either decode to 2 bytes or get InvalidLastSymbol
@@ -772,9 +787,13 @@
                     symbols[3] = b'=';
 
                     match base64_to_bytes.get(&symbols[..]) {
-                        Some(bytes) => assert_eq!(Ok(bytes.to_vec()), decode_config(&symbols, STANDARD)),
-                        None => assert_eq!(Err(DecodeError::InvalidLastSymbol(2, s3)),
-                                           decode_config(&symbols[..], STANDARD))
+                        Some(bytes) => {
+                            assert_eq!(Ok(bytes.to_vec()), decode_config(&symbols, STANDARD))
+                        }
+                        None => assert_eq!(
+                            Err(DecodeError::InvalidLastSymbol(2, s3)),
+                            decode_config(&symbols[..], STANDARD)
+                        ),
                     }
                 }
             }
@@ -792,7 +811,7 @@
             v.push(b as u8);
 
             assert!(base64_to_bytes.insert(b64, v).is_none());
-        };
+        }
 
         // every possible combination of symbols must either decode to 1 byte or get InvalidLastSymbol
 
@@ -805,9 +824,13 @@
                 symbols[3] = b'=';
 
                 match base64_to_bytes.get(&symbols[..]) {
-                    Some(bytes) => assert_eq!(Ok(bytes.to_vec()), decode_config(&symbols, STANDARD)),
-                    None => assert_eq!(Err(DecodeError::InvalidLastSymbol(1, s2)),
-                                       decode_config(&symbols[..], STANDARD))
+                    Some(bytes) => {
+                        assert_eq!(Ok(bytes.to_vec()), decode_config(&symbols, STANDARD))
+                    }
+                    None => assert_eq!(
+                        Err(DecodeError::InvalidLastSymbol(1, s2)),
+                        decode_config(&symbols[..], STANDARD)
+                    ),
                 }
             }
         }
diff --git a/rustc_deps/vendor/base64/src/display.rs b/rustc_deps/vendor/base64/src/display.rs
index 464b6be..3d76829 100644
--- a/rustc_deps/vendor/base64/src/display.rs
+++ b/rustc_deps/vendor/base64/src/display.rs
@@ -54,8 +54,9 @@
 
 #[cfg(test)]
 mod tests {
-    use super::super::chunked_encoder::tests::{chunked_encode_matches_normal_encode_random,
-                                               SinkTestHelper};
+    use super::super::chunked_encoder::tests::{
+        chunked_encode_matches_normal_encode_random, SinkTestHelper,
+    };
     use super::super::*;
     use super::*;
 
diff --git a/rustc_deps/vendor/base64/src/encode.rs b/rustc_deps/vendor/base64/src/encode.rs
index e563582..fb65f1e 100644
--- a/rustc_deps/vendor/base64/src/encode.rs
+++ b/rustc_deps/vendor/base64/src/encode.rs
@@ -36,7 +36,7 @@
 ///}
 ///```
 pub fn encode_config<T: ?Sized + AsRef<[u8]>>(input: &T, config: Config) -> String {
-    let mut buf = match encoded_size(input.as_ref().len(), &config) {
+    let mut buf = match encoded_size(input.as_ref().len(), config) {
         Some(n) => vec![0; n],
         None => panic!("integer overflow when calculating buffer size"),
     };
@@ -44,7 +44,7 @@
     let encoded_len = encode_config_slice(input.as_ref(), config, &mut buf[..]);
     debug_assert_eq!(encoded_len, buf.len());
 
-    return String::from_utf8(buf).expect("Invalid UTF8");
+    String::from_utf8(buf).expect("Invalid UTF8")
 }
 
 ///Encode arbitrary octets as base64.
@@ -72,9 +72,10 @@
         let mut sink = ::chunked_encoder::StringSink::new(buf);
         let encoder = ::chunked_encoder::ChunkedEncoder::new(config);
 
-        encoder.encode(input_bytes, &mut sink).expect("Writing to a String shouldn't fail")
+        encoder
+            .encode(input_bytes, &mut sink)
+            .expect("Writing to a String shouldn't fail")
     }
-
 }
 
 /// Encode arbitrary octets as base64.
@@ -114,12 +115,12 @@
 ) -> usize {
     let input_bytes = input.as_ref();
 
-    let encoded_size = encoded_size(input_bytes.len(), &config)
+    let encoded_size = encoded_size(input_bytes.len(), config)
         .expect("usize overflow when calculating buffer size");
 
     let mut b64_output = &mut output[0..encoded_size];
 
-    encode_with_padding(&input_bytes, &config, encoded_size, &mut b64_output);
+    encode_with_padding(&input_bytes, config, encoded_size, &mut b64_output);
 
     encoded_size
 }
@@ -134,12 +135,7 @@
 /// `output` must be of size `encoded_size`.
 ///
 /// All bytes in `output` will be written to since it is exactly the size of the output.
-fn encode_with_padding(
-    input: &[u8],
-    config: &Config,
-    encoded_size: usize,
-    output: &mut [u8],
-) {
+fn encode_with_padding(input: &[u8], config: Config, encoded_size: usize, output: &mut [u8]) {
     debug_assert_eq!(encoded_size, output.len());
 
     let b64_bytes_written = encode_to_slice(input, output, config.char_set.encode_table());
@@ -279,7 +275,7 @@
 }
 
 /// calculate the base64 encoded string size, including padding if appropriate
-pub fn encoded_size(bytes_len: usize, config: &Config) -> Option<usize> {
+pub fn encoded_size(bytes_len: usize, config: Config) -> Option<usize> {
     let rem = bytes_len % 3;
 
     let complete_input_chunks = bytes_len / 3;
@@ -325,8 +321,8 @@
     use tests::{assert_encode_sanity, random_config};
     use {Config, STANDARD, URL_SAFE_NO_PAD};
 
-    use self::rand::distributions::{Distribution, Range};
-    use self::rand::{Rng, FromEntropy};
+    use self::rand::distributions::{Distribution, Uniform};
+    use self::rand::{FromEntropy, Rng};
     use std;
     use std::str;
 
@@ -382,7 +378,7 @@
 
     #[test]
     fn encoded_size_overflow() {
-        assert_eq!(None, encoded_size(std::usize::MAX, &STANDARD));
+        assert_eq!(None, encoded_size(std::usize::MAX, STANDARD));
     }
 
     #[test]
@@ -393,8 +389,8 @@
         let mut encoded_data_with_prefix = String::new();
         let mut decoded = Vec::new();
 
-        let prefix_len_range = Range::new(0, 1000);
-        let input_len_range = Range::new(0, 1000);
+        let prefix_len_range = Uniform::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -427,8 +423,8 @@
                 encoded_data_no_prefix.len() + prefix_len,
                 encoded_data_with_prefix.len()
             );
-            assert_encode_sanity(&encoded_data_no_prefix, &config, input_len);
-            assert_encode_sanity(&encoded_data_with_prefix[prefix_len..], &config, input_len);
+            assert_encode_sanity(&encoded_data_no_prefix, config, input_len);
+            assert_encode_sanity(&encoded_data_with_prefix[prefix_len..], config, input_len);
 
             // append plain encode onto prefix
             prefix.push_str(&mut encoded_data_no_prefix);
@@ -447,7 +443,7 @@
         let mut encoded_data_original_state = Vec::new();
         let mut decoded = Vec::new();
 
-        let input_len_range = Range::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -472,7 +468,7 @@
 
             let config = random_config(&mut rng);
 
-            let encoded_size = encoded_size(input_len, &config).unwrap();
+            let encoded_size = encoded_size(input_len, config).unwrap();
 
             assert_eq!(
                 encoded_size,
@@ -481,7 +477,7 @@
 
             assert_encode_sanity(
                 std::str::from_utf8(&encoded_data[0..encoded_size]).unwrap(),
-                &config,
+                config,
                 input_len,
             );
 
@@ -501,7 +497,7 @@
         let mut encoded_data = Vec::new();
         let mut decoded = Vec::new();
 
-        let input_len_range = Range::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -518,7 +514,7 @@
 
             let config = random_config(&mut rng);
 
-            let encoded_size = encoded_size(input_len, &config).unwrap();
+            let encoded_size = encoded_size(input_len, config).unwrap();
 
             encoded_data.resize(encoded_size, 0);
 
@@ -529,7 +525,7 @@
 
             assert_encode_sanity(
                 std::str::from_utf8(&encoded_data[0..encoded_size]).unwrap(),
-                &config,
+                config,
                 input_len,
             );
 
@@ -543,7 +539,7 @@
         let mut input = Vec::new();
         let mut output = Vec::new();
 
-        let input_len_range = Range::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -560,7 +556,7 @@
             let config = random_config(&mut rng);
 
             // fill up the output buffer with garbage
-            let encoded_size = encoded_size(input_len, &config).unwrap();
+            let encoded_size = encoded_size(input_len, config).unwrap();
             for _ in 0..encoded_size {
                 output.push(rng.gen());
             }
@@ -583,7 +579,7 @@
         let mut input = Vec::new();
         let mut output = Vec::new();
 
-        let input_len_range = Range::new(0, 1000);
+        let input_len_range = Uniform::new(0, 1000);
 
         let mut rng = rand::rngs::SmallRng::from_entropy();
 
@@ -600,19 +596,14 @@
             let config = random_config(&mut rng);
 
             // fill up the output buffer with garbage
-            let encoded_size = encoded_size(input_len, &config).unwrap();
+            let encoded_size = encoded_size(input_len, config).unwrap();
             for _ in 0..encoded_size + 1000 {
                 output.push(rng.gen());
             }
 
             let orig_output_buf = output.to_vec();
 
-            encode_with_padding(
-                &input,
-                &config,
-                encoded_size,
-                &mut output[0..encoded_size],
-            );
+            encode_with_padding(&input, config, encoded_size, &mut output[0..encoded_size]);
 
             // make sure the part beyond b64 is the same garbage it was before
             assert_eq!(orig_output_buf[encoded_size..], output[encoded_size..]);
@@ -650,7 +641,7 @@
     }
 
     fn assert_encoded_length(input_len: usize, encoded_len: usize, config: Config) {
-        assert_eq!(encoded_len, encoded_size(input_len, &config).unwrap());
+        assert_eq!(encoded_len, encoded_size(input_len, config).unwrap());
 
         let mut bytes: Vec<u8> = Vec::new();
         let mut rng = rand::rngs::SmallRng::from_entropy();
@@ -660,7 +651,7 @@
         }
 
         let encoded = encode_config(&bytes, config);
-        assert_encode_sanity(&encoded, &config, input_len);
+        assert_encode_sanity(&encoded, config, input_len);
 
         assert_eq!(encoded_len, encoded.len());
     }
diff --git a/rustc_deps/vendor/base64/src/lib.rs b/rustc_deps/vendor/base64/src/lib.rs
index 2c310a5..651cc0e 100644
--- a/rustc_deps/vendor/base64/src/lib.rs
+++ b/rustc_deps/vendor/base64/src/lib.rs
@@ -49,17 +49,25 @@
 //!
 //! The `_slice` flavors of encode or decode will panic if the provided output slice is too small,
 
+#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless))]
 #![deny(
-    missing_docs, trivial_casts, trivial_numeric_casts, unused_extern_crates, unused_import_braces,
-    unused_results, variant_size_differences, warnings, unsafe_code
+    missing_docs,
+    trivial_casts,
+    trivial_numeric_casts,
+    unused_extern_crates,
+    unused_import_braces,
+    unused_results,
+    variant_size_differences,
+    warnings,
+    unsafe_code
 )]
 
 extern crate byteorder;
 
 mod chunked_encoder;
 pub mod display;
-pub mod write;
 mod tables;
+pub mod write;
 
 mod encode;
 pub use encode::{encode, encode_config, encode_config_buf, encode_config_slice};
@@ -88,16 +96,16 @@
 }
 
 impl CharacterSet {
-    fn encode_table(&self) -> &'static [u8; 64] {
-        match *self {
+    fn encode_table(self) -> &'static [u8; 64] {
+        match self {
             CharacterSet::Standard => tables::STANDARD_ENCODE,
             CharacterSet::UrlSafe => tables::URL_SAFE_ENCODE,
             CharacterSet::Crypt => tables::CRYPT_ENCODE,
         }
     }
 
-    fn decode_table(&self) -> &'static [u8; 256] {
-        match *self {
+    fn decode_table(self) -> &'static [u8; 256] {
+        match self {
             CharacterSet::Standard => tables::STANDARD_DECODE,
             CharacterSet::UrlSafe => tables::URL_SAFE_DECODE,
             CharacterSet::Crypt => tables::CRYPT_DECODE,
@@ -112,18 +120,27 @@
     char_set: CharacterSet,
     /// True to pad output with `=` characters
     pad: bool,
+    /// True to ignore excess nonzero bits in the last few symbols, otherwise an error is returned.
+    decode_allow_trailing_bits: bool,
 }
 
 impl Config {
     /// Create a new `Config`.
-    pub fn new(
-        char_set: CharacterSet,
-        pad: bool,
-    ) -> Config {
-        Config {
-            char_set,
-            pad,
-        }
+    pub fn new(char_set: CharacterSet, pad: bool) -> Config {
+        Config { char_set, pad, decode_allow_trailing_bits: false }
+    }
+
+    /// Sets whether to pad output with `=` characters.
+    pub fn pad(self, pad: bool) -> Config {
+        Config { pad, ..self }
+    }
+
+    /// Sets whether to emit errors for nonzero trailing bits.
+    ///
+    /// This is useful when implementing
+    /// [forgiving-base64 decode](https://infra.spec.whatwg.org/#forgiving-base64-decode).
+    pub fn decode_allow_trailing_bits(self, allow: bool) -> Config {
+        Config { decode_allow_trailing_bits: allow, ..self }
     }
 }
 
@@ -131,28 +148,33 @@
 pub const STANDARD: Config = Config {
     char_set: CharacterSet::Standard,
     pad: true,
+    decode_allow_trailing_bits: false,
 };
 
 /// Standard character set without padding.
 pub const STANDARD_NO_PAD: Config = Config {
     char_set: CharacterSet::Standard,
     pad: false,
+    decode_allow_trailing_bits: false,
 };
 
 /// URL-safe character set with padding
 pub const URL_SAFE: Config = Config {
     char_set: CharacterSet::UrlSafe,
     pad: true,
+    decode_allow_trailing_bits: false,
 };
 
 /// URL-safe character set without padding
 pub const URL_SAFE_NO_PAD: Config = Config {
     char_set: CharacterSet::UrlSafe,
     pad: false,
+    decode_allow_trailing_bits: false,
 };
 
 /// As per `crypt(3)` requirements
 pub const CRYPT: Config = Config {
     char_set: CharacterSet::Crypt,
     pad: false,
+    decode_allow_trailing_bits: false,
 };
diff --git a/rustc_deps/vendor/base64/src/tables.rs b/rustc_deps/vendor/base64/src/tables.rs
index af3950b..a1466c3 100644
--- a/rustc_deps/vendor/base64/src/tables.rs
+++ b/rustc_deps/vendor/base64/src/tables.rs
@@ -1,6 +1,6 @@
 pub const INVALID_VALUE: u8 = 255;
 #[cfg_attr(rustfmt, rustfmt_skip)]
-pub const STANDARD_ENCODE: &'static [u8; 64] = &[
+pub const STANDARD_ENCODE: &[u8; 64] = &[
     65, // input 0 (0x0) => 'A' (0x41)
     66, // input 1 (0x1) => 'B' (0x42)
     67, // input 2 (0x2) => 'C' (0x43)
@@ -67,7 +67,7 @@
     47, // input 63 (0x3F) => '/' (0x2F)
 ];
 #[cfg_attr(rustfmt, rustfmt_skip)]
-pub const STANDARD_DECODE: &'static [u8; 256] = &[
+pub const STANDARD_DECODE: &[u8; 256] = &[
     INVALID_VALUE, // input 0 (0x0)
     INVALID_VALUE, // input 1 (0x1)
     INVALID_VALUE, // input 2 (0x2)
@@ -326,7 +326,7 @@
     INVALID_VALUE, // input 255 (0xFF)
 ];
 #[cfg_attr(rustfmt, rustfmt_skip)]
-pub const URL_SAFE_ENCODE: &'static [u8; 64] = &[
+pub const URL_SAFE_ENCODE: &[u8; 64] = &[
     65, // input 0 (0x0) => 'A' (0x41)
     66, // input 1 (0x1) => 'B' (0x42)
     67, // input 2 (0x2) => 'C' (0x43)
@@ -393,7 +393,7 @@
     95, // input 63 (0x3F) => '_' (0x5F)
 ];
 #[cfg_attr(rustfmt, rustfmt_skip)]
-pub const URL_SAFE_DECODE: &'static [u8; 256] = &[
+pub const URL_SAFE_DECODE: &[u8; 256] = &[
     INVALID_VALUE, // input 0 (0x0)
     INVALID_VALUE, // input 1 (0x1)
     INVALID_VALUE, // input 2 (0x2)
@@ -652,7 +652,7 @@
     INVALID_VALUE, // input 255 (0xFF)
 ];
 #[cfg_attr(rustfmt, rustfmt_skip)]
-pub const CRYPT_ENCODE: &'static [u8; 64] = &[
+pub const CRYPT_ENCODE: &[u8; 64] = &[
     46, // input 0 (0x0) => '.' (0x2E)
     47, // input 1 (0x1) => '/' (0x2F)
     48, // input 2 (0x2) => '0' (0x30)
@@ -719,7 +719,7 @@
     122, // input 63 (0x3F) => 'z' (0x7A)
 ];
 #[cfg_attr(rustfmt, rustfmt_skip)]
-pub const CRYPT_DECODE: &'static [u8; 256] = &[
+pub const CRYPT_DECODE: &[u8; 256] = &[
     INVALID_VALUE, // input 0 (0x0)
     INVALID_VALUE, // input 1 (0x1)
     INVALID_VALUE, // input 2 (0x2)
diff --git a/rustc_deps/vendor/base64/src/tests.rs b/rustc_deps/vendor/base64/src/tests.rs
index dcbae9f..a1fb52a 100644
--- a/rustc_deps/vendor/base64/src/tests.rs
+++ b/rustc_deps/vendor/base64/src/tests.rs
@@ -5,21 +5,22 @@
 
 use std::str;
 
-use self::rand::distributions::{Distribution, Range};
-use self::rand::{Rng, FromEntropy};
+use self::rand::distributions::{Distribution, Uniform};
+use self::rand::{FromEntropy, Rng};
+use self::rand::seq::SliceRandom;
 
 #[test]
 fn roundtrip_random_config_short() {
     // exercise the slower encode/decode routines that operate on shorter buffers more vigorously
-    roundtrip_random_config(Range::new(0, 50), 10_000);
+    roundtrip_random_config(Uniform::new(0, 50), 10_000);
 }
 
 #[test]
 fn roundtrip_random_config_long() {
-    roundtrip_random_config(Range::new(0, 1000), 10_000);
+    roundtrip_random_config(Uniform::new(0, 1000), 10_000);
 }
 
-pub fn assert_encode_sanity(encoded: &str, config: &Config, input_len: usize) {
+pub fn assert_encode_sanity(encoded: &str, config: Config, input_len: usize) {
     let input_rem = input_len % 3;
     let expected_padding_len = if input_rem > 0 {
         if config.pad {
@@ -31,7 +32,7 @@
         0
     };
 
-    let expected_encoded_len = encoded_size(input_len, &config).unwrap();
+    let expected_encoded_len = encoded_size(input_len, config).unwrap();
 
     assert_eq!(expected_encoded_len, encoded.len());
 
@@ -42,10 +43,7 @@
     let _ = str::from_utf8(encoded.as_bytes()).expect("Base64 should be valid utf8");
 }
 
-fn roundtrip_random_config(
-    input_len_range: Range<usize>,
-    iterations: u32,
-) {
+fn roundtrip_random_config(input_len_range: Uniform<usize>, iterations: u32) {
     let mut input_buf: Vec<u8> = Vec::new();
     let mut encoded_buf = String::new();
     let mut rng = rand::rngs::SmallRng::from_entropy();
@@ -64,7 +62,7 @@
 
         encode_config_buf(&input_buf, config, &mut encoded_buf);
 
-        assert_encode_sanity(&encoded_buf, &config, input_len);
+        assert_encode_sanity(&encoded_buf, config, input_len);
 
         assert_eq!(input_buf, decode_config(&encoded_buf, config).unwrap());
     }
@@ -76,7 +74,7 @@
         CharacterSet::Standard,
         CharacterSet::Crypt,
     ];
-    let charset = *rng.choose(CHARSETS).unwrap();
+    let charset = *CHARSETS.choose(rng).unwrap();
 
     Config::new(charset, rng.gen())
 }
diff --git a/rustc_deps/vendor/base64/src/write/encoder.rs b/rustc_deps/vendor/base64/src/write/encoder.rs
index 41a9bcb..23de075 100644
--- a/rustc_deps/vendor/base64/src/write/encoder.rs
+++ b/rustc_deps/vendor/base64/src/write/encoder.rs
@@ -1,6 +1,6 @@
-use ::encode::encode_to_slice;
+use encode::encode_to_slice;
+use std::io::{ErrorKind, Result, Write};
 use std::{cmp, fmt};
-use std::io::{Result, Write};
 use {encode_config_slice, Config};
 
 pub(crate) const BUF_SIZE: usize = 1024;
@@ -60,40 +60,45 @@
     w: &'a mut W,
     /// Holds a partial chunk, if any, after the last `write()`, so that we may then fill the chunk
     /// with the next `write()`, encode it, then proceed with the rest of the input normally.
-    extra: [u8; MIN_ENCODE_CHUNK_SIZE],
+    extra_input: [u8; MIN_ENCODE_CHUNK_SIZE],
     /// How much of `extra` is occupied, in `[0, MIN_ENCODE_CHUNK_SIZE]`.
-    extra_len: usize,
-    /// Buffer to encode into.
+    extra_input_occupied_len: usize,
+    /// Buffer to encode into. May hold leftover encoded bytes from a previous write call that the underlying writer
+    /// did not write last time.
     output: [u8; BUF_SIZE],
+    /// How much of `output` is occupied with encoded data that couldn't be written last time
+    output_occupied_len: usize,
     /// True iff padding / partial last chunk has been written.
     finished: bool,
     /// panic safety: don't write again in destructor if writer panicked while we were writing to it
-    panicked: bool
+    panicked: bool,
 }
 
 impl<'a, W: Write> fmt::Debug for EncoderWriter<'a, W> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(
             f,
-            "extra:{:?} extra_len:{:?} output[..5]: {:?}",
-            self.extra,
-            self.extra_len,
-            &self.output[0..5]
+            "extra_input: {:?} extra_input_occupied_len:{:?} output[..5]: {:?} output_occupied_len: {:?}",
+            self.extra_input,
+            self.extra_input_occupied_len,
+            &self.output[0..5],
+            self.output_occupied_len
         )
     }
 }
 
 impl<'a, W: Write> EncoderWriter<'a, W> {
-    /// Create a new encoder around an existing writer.
+    /// Create a new encoder that will write to the provided delegate writer `w`.
     pub fn new(w: &'a mut W, config: Config) -> EncoderWriter<'a, W> {
         EncoderWriter {
             config,
             w,
-            extra: [0u8; MIN_ENCODE_CHUNK_SIZE],
-            extra_len: 0,
+            extra_input: [0u8; MIN_ENCODE_CHUNK_SIZE],
+            extra_input_occupied_len: 0,
             output: [0u8; BUF_SIZE],
+            output_occupied_len: 0,
             finished: false,
-            panicked: false
+            panicked: false,
         }
     }
 
@@ -103,40 +108,118 @@
     /// Once this succeeds, no further writes can be performed, as that would produce invalid
     /// base64.
     ///
+    /// This may write to the delegate writer multiple times if the delegate writer does not accept all input provided
+    /// to its `write` each invocation.
+    ///
     /// # Errors
     ///
-    /// Assuming the wrapped writer obeys the `Write` contract, if this returns `Err`, no data was
-    /// written, and `finish()` may be retried if appropriate for the type of error, etc.
+    /// The first error that is not of [`ErrorKind::Interrupted`] will be returned.
     pub fn finish(&mut self) -> Result<()> {
         if self.finished {
             return Ok(());
         };
 
-        if self.extra_len > 0 {
+        self.write_all_encoded_output()?;
+
+        if self.extra_input_occupied_len > 0 {
             let encoded_len = encode_config_slice(
-                &self.extra[..self.extra_len],
+                &self.extra_input[..self.extra_input_occupied_len],
                 self.config,
                 &mut self.output[..],
             );
-            self.panicked = true;
-            let _ = self.w.write(&self.output[..encoded_len])?;
-            self.panicked = false;
+
+            self.output_occupied_len = encoded_len;
+
+            self.write_all_encoded_output()?;
+
             // write succeeded, do not write the encoding of extra again if finish() is retried
-            self.extra_len = 0;
+            self.extra_input_occupied_len = 0;
         }
 
         self.finished = true;
         Ok(())
     }
+
+    /// Write as much of the encoded output to the delegate writer as it will accept, and store the
+    /// leftovers to be attempted at the next write() call. Updates `self.output_occupied_len`.
+    ///
+    /// # Errors
+    ///
+    /// Errors from the delegate writer are returned. In the case of an error,
+    /// `self.output_occupied_len` will not be updated, as errors from `write` are specified to mean
+    /// that no write took place.
+    fn write_to_delegate(&mut self, current_output_len: usize) -> Result<()> {
+        self.panicked = true;
+        let res = self.w.write(&self.output[..current_output_len]);
+        self.panicked = false;
+
+        return res.map(|consumed| {
+            debug_assert!(consumed <= current_output_len);
+
+            if consumed < current_output_len {
+                self.output_occupied_len = current_output_len.checked_sub(consumed).unwrap();
+                // If we're blocking on I/O, the minor inefficiency of copying bytes to the
+                // start of the buffer is the least of our concerns...
+                // Rotate moves more than we need to, but copy_within isn't stabilized yet.
+                self.output.rotate_left(consumed);
+            } else {
+                self.output_occupied_len = 0;
+            }
+
+            ()
+        });
+    }
+
+    /// Write all buffered encoded output. If this returns `Ok`, `self.output_occupied_len` is `0`.
+    ///
+    /// This is basically write_all for the remaining buffered data but without the undesirable
+    /// abort-on-`Ok(0)` behavior.
+    ///
+    /// # Errors
+    ///
+    /// Any error emitted by the delegate writer abort the write loop and is returned, unless it's
+    /// `Interrupted`, in which case the error is ignored and writes will continue.
+    fn write_all_encoded_output(&mut self) -> Result<()> {
+        while self.output_occupied_len > 0 {
+            let remaining_len = self.output_occupied_len;
+            match self.write_to_delegate(remaining_len) {
+                // try again on interrupts ala write_all
+                Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
+                // other errors return
+                Err(e) => return Err(e),
+                // success no-ops because remaining length is already updated
+                Ok(_) => {}
+            };
+        }
+
+        debug_assert_eq!(0, self.output_occupied_len);
+        Ok(())
+    }
 }
 
 impl<'a, W: Write> Write for EncoderWriter<'a, W> {
+    /// Encode input and then write to the delegate writer.
+    ///
+    /// Under non-error circumstances, this returns `Ok` with the value being the number of bytes
+    /// of `input` consumed. The value may be `0`, which interacts poorly with `write_all`, which
+    /// interprets `Ok(0)` as an error, despite it being allowed by the contract of `write`. See
+    /// https://github.com/rust-lang/rust/issues/56889 for more on that.
+    ///
+    /// If the previous call to `write` provided more (encoded) data than the delegate writer could
+    /// accept in a single call to its `write`, the remaining data is buffered. As long as buffered
+    /// data is present, subsequent calls to `write` will try to write the remaining buffered data
+    /// to the delegate and return either `Ok(0)` -- and therefore not consume any of `input` -- or
+    /// an error.
+    ///
+    /// # Errors
+    ///
+    /// Any errors emitted by the delegate writer are returned.
     fn write(&mut self, input: &[u8]) -> Result<usize> {
         if self.finished {
             panic!("Cannot write more after calling finish()");
         }
 
-        if input.len() == 0 {
+        if input.is_empty() {
             return Ok(0);
         }
 
@@ -146,40 +229,54 @@
         // - Errors mean that "no bytes were written to this writer", so we need to reset the
         // internal state to what it was before the error occurred
 
+        // before reading any input, write any leftover encoded output from last time
+        if self.output_occupied_len > 0 {
+            let current_len = self.output_occupied_len;
+            return self.write_to_delegate(current_len)
+                // did not read any input
+                .map(|_| 0)
+
+        }
+
+        debug_assert_eq!(0, self.output_occupied_len);
+
         // how many bytes, if any, were read into `extra` to create a triple to encode
         let mut extra_input_read_len = 0;
         let mut input = input;
 
-        let orig_extra_len = self.extra_len;
+        let orig_extra_len = self.extra_input_occupied_len;
 
         let mut encoded_size = 0;
         // always a multiple of MIN_ENCODE_CHUNK_SIZE
         let mut max_input_len = MAX_INPUT_LEN;
 
-        // process leftover stuff from last write
-        if self.extra_len > 0 {
-            debug_assert!(self.extra_len < 3);
-            if input.len() + self.extra_len >= MIN_ENCODE_CHUNK_SIZE {
+        // process leftover un-encoded input from last write
+        if self.extra_input_occupied_len > 0 {
+            debug_assert!(self.extra_input_occupied_len < 3);
+            if input.len() + self.extra_input_occupied_len >= MIN_ENCODE_CHUNK_SIZE {
                 // Fill up `extra`, encode that into `output`, and consume as much of the rest of
                 // `input` as possible.
                 // We could write just the encoding of `extra` by itself but then we'd have to
                 // return after writing only 4 bytes, which is inefficient if the underlying writer
                 // would make a syscall.
-                extra_input_read_len = MIN_ENCODE_CHUNK_SIZE - self.extra_len;
+                extra_input_read_len = MIN_ENCODE_CHUNK_SIZE - self.extra_input_occupied_len;
                 debug_assert!(extra_input_read_len > 0);
                 // overwrite only bytes that weren't already used. If we need to rollback extra_len
                 // (when the subsequent write errors), the old leading bytes will still be there.
-                self.extra[self.extra_len..MIN_ENCODE_CHUNK_SIZE].copy_from_slice(&input[0..extra_input_read_len]);
+                self.extra_input[self.extra_input_occupied_len..MIN_ENCODE_CHUNK_SIZE]
+                    .copy_from_slice(&input[0..extra_input_read_len]);
 
-                let len = encode_to_slice(&self.extra[0..MIN_ENCODE_CHUNK_SIZE],
-                                          &mut self.output[..],
-                                          self.config.char_set.encode_table());
+                let len = encode_to_slice(
+                    &self.extra_input[0..MIN_ENCODE_CHUNK_SIZE],
+                    &mut self.output[..],
+                    self.config.char_set.encode_table(),
+                );
                 debug_assert_eq!(4, len);
 
                 input = &input[extra_input_read_len..];
 
                 // consider extra to be used up, since we encoded it
-                self.extra_len = 0;
+                self.extra_input_occupied_len = 0;
                 // don't clobber where we just encoded to
                 encoded_size = 4;
                 // and don't read more than can be encoded
@@ -190,25 +287,29 @@
                 // `extra` and `input` are non empty, but `|extra| + |input| < 3`, so there must be
                 // 1 byte in each.
                 debug_assert_eq!(1, input.len());
-                debug_assert_eq!(1, self.extra_len);
+                debug_assert_eq!(1, self.extra_input_occupied_len);
 
-                self.extra[self.extra_len] = input[0];
-                self.extra_len += 1;
+                self.extra_input[self.extra_input_occupied_len] = input[0];
+                self.extra_input_occupied_len += 1;
                 return Ok(1);
             };
         } else if input.len() < MIN_ENCODE_CHUNK_SIZE {
             // `extra` is empty, and `input` fits inside it
-            self.extra[0..input.len()].copy_from_slice(input);
-            self.extra_len = input.len();
+            self.extra_input[0..input.len()].copy_from_slice(input);
+            self.extra_input_occupied_len = input.len();
             return Ok(input.len());
         };
 
         // either 0 or 1 complete chunks encoded from extra
         debug_assert!(encoded_size == 0 || encoded_size == 4);
-        debug_assert!(MAX_INPUT_LEN - max_input_len == 0
-            || MAX_INPUT_LEN - max_input_len == MIN_ENCODE_CHUNK_SIZE);
+        debug_assert!(
+            // didn't encode extra input
+            MAX_INPUT_LEN == max_input_len
+                // encoded one triple
+                || MAX_INPUT_LEN == max_input_len + MIN_ENCODE_CHUNK_SIZE
+        );
 
-        // handle complete triples
+        // encode complete triples only
         let input_complete_chunks_len = input.len() - (input.len() % MIN_ENCODE_CHUNK_SIZE);
         let input_chunks_to_encode_len = cmp::min(input_complete_chunks_len, max_input_len);
         debug_assert_eq!(0, max_input_len % MIN_ENCODE_CHUNK_SIZE);
@@ -219,25 +320,27 @@
             &mut self.output[encoded_size..],
             self.config.char_set.encode_table(),
         );
-        self.panicked = true;
-        let r = self.w.write(&self.output[..encoded_size]);
-        self.panicked = false;
-        match r {
-            Ok(_) => return Ok(extra_input_read_len + input_chunks_to_encode_len),
-            Err(_) => {
-                // in case we filled and encoded `extra`, reset extra_len
-                self.extra_len = orig_extra_len;
-                return r;
-            }
-        }
 
-        // we could hypothetically copy a few more bytes into `extra` but the extra 1-2 bytes
-        // are not worth all the complexity (and branches)
+        // not updating `self.output_occupied_len` here because if the below write fails, it should
+        // "never take place" -- the buffer contents we encoded are ignored and perhaps retried
+        // later, if the consumer chooses.
+
+        self.write_to_delegate(encoded_size)
+            // no matter whether we wrote the full encoded buffer or not, we consumed the same
+            // input
+            .map(|_| extra_input_read_len + input_chunks_to_encode_len)
+            .map_err( |e| {
+                // in case we filled and encoded `extra`, reset extra_len
+                self.extra_input_occupied_len = orig_extra_len;
+
+                e
+            })
     }
 
     /// Because this is usually treated as OK to call multiple times, it will *not* flush any
     /// incomplete chunks of input or write padding.
     fn flush(&mut self) -> Result<()> {
+        self.write_all_encoded_output()?;
         self.w.flush()
     }
 }
diff --git a/rustc_deps/vendor/base64/src/write/encoder_tests.rs b/rustc_deps/vendor/base64/src/write/encoder_tests.rs
index 4fbf6e5..681235b 100644
--- a/rustc_deps/vendor/base64/src/write/encoder_tests.rs
+++ b/rustc_deps/vendor/base64/src/write/encoder_tests.rs
@@ -2,10 +2,10 @@
 
 use super::EncoderWriter;
 use tests::random_config;
-use {encode_config, encode_config_buf, URL_SAFE, STANDARD_NO_PAD};
+use {encode_config, encode_config_buf, STANDARD_NO_PAD, URL_SAFE};
 
 use std::io::{Cursor, Write};
-use std::{cmp, str, io};
+use std::{cmp, io, str};
 
 use self::rand::Rng;
 
@@ -355,13 +355,12 @@
             while bytes_consumed < orig_len {
                 // use short inputs since we want to use `extra` a lot as that's what needs rollback
                 // when errors occur
-                let input_len: usize = cmp::min(rng.gen_range(0, 10),
-                                                orig_len - bytes_consumed);
+                let input_len: usize = cmp::min(rng.gen_range(0, 10), orig_len - bytes_consumed);
 
-                // write a little bit of the data
-                retry_interrupted_write_all(&mut stream_encoder,
-                                            &orig_data[bytes_consumed..bytes_consumed + input_len])
-                    .unwrap();
+                retry_interrupted_write_all(
+                    &mut stream_encoder,
+                    &orig_data[bytes_consumed..bytes_consumed + input_len],
+                ).unwrap();
 
                 bytes_consumed += input_len;
             }
@@ -372,8 +371,8 @@
                     Ok(_) => break,
                     Err(e) => match e.kind() {
                         io::ErrorKind::Interrupted => continue,
-                        _ => Err(e).unwrap() // bail
-                    }
+                        _ => Err(e).unwrap(), // bail
+                    },
                 }
             }
 
@@ -384,22 +383,78 @@
     }
 }
 
+#[test]
+fn writes_that_only_write_part_of_input_and_sometimes_interrupt_produce_correct_encoded_data() {
+    let mut rng = rand::thread_rng();
+    let mut orig_data = Vec::<u8>::new();
+    let mut stream_encoded = Vec::<u8>::new();
+    let mut normal_encoded = String::new();
+
+    for _ in 0..1_000 {
+        orig_data.clear();
+        stream_encoded.clear();
+        normal_encoded.clear();
+
+        let orig_len: usize = rng.gen_range(100, 20_000);
+        for _ in 0..orig_len {
+            orig_data.push(rng.gen());
+        }
+
+        // encode the normal way
+        let config = random_config(&mut rng);
+        encode_config_buf(&orig_data, config, &mut normal_encoded);
+
+        // encode via the stream encoder
+        {
+            let mut partial_rng = rand::thread_rng();
+            let mut partial_writer = PartialInterruptingWriter {
+                w: &mut stream_encoded,
+                rng: &mut partial_rng,
+                full_input_fraction: 0.1,
+                no_interrupt_fraction: 0.1
+            };
+
+            let mut stream_encoder = EncoderWriter::new(&mut partial_writer, config);
+            let mut bytes_consumed = 0;
+            while bytes_consumed < orig_len {
+                // use at most medium-length inputs to exercise retry logic more aggressively
+                let input_len: usize = cmp::min(rng.gen_range(0, 100), orig_len - bytes_consumed);
+
+                let res = stream_encoder.write(&orig_data[bytes_consumed..bytes_consumed + input_len]);
+
+                // retry on interrupt
+                match res {
+                    Ok(len) => bytes_consumed += len,
+                    Err(e) => match e.kind() {
+                        io::ErrorKind::Interrupted => continue,
+                        _ => { panic!("should not see other errors"); }
+                    },
+                }
+            };
+
+            stream_encoder.finish().unwrap();
+
+            assert_eq!(orig_len, bytes_consumed);
+        }
+
+        assert_eq!(normal_encoded, str::from_utf8(&stream_encoded).unwrap());
+    }
+}
+
+
 /// Retry writes until all the data is written or an error that isn't Interrupted is returned.
 fn retry_interrupted_write_all<W: Write>(w: &mut W, buf: &[u8]) -> io::Result<()> {
-    let mut written = 0;
+    let mut bytes_consumed = 0;
 
-    while written < buf.len() {
-        let res = w.write(&buf[written..]);
+    while bytes_consumed < buf.len() {
+        let res = w.write(&buf[bytes_consumed..]);
 
         match res {
-            Ok(len) => written += len,
+            Ok(len) => bytes_consumed += len,
             Err(e) => match e.kind() {
                 io::ErrorKind::Interrupted => continue,
-                _ => {
-                    println!("got kind: {:?}", e.kind());
-                    return Err(e);
-                }
-            }
+                _ => { return Err(e) }
+            },
         }
     }
 
@@ -431,8 +486,8 @@
             let mut stream_encoder = EncoderWriter::new(&mut stream_encoded, config);
             let mut bytes_consumed = 0;
             while bytes_consumed < orig_len {
-                let input_len: usize = cmp::min(rng.gen_range(0, max_input_len),
-                                                orig_len - bytes_consumed);
+                let input_len: usize =
+                    cmp::min(rng.gen_range(0, max_input_len), orig_len - bytes_consumed);
 
                 // write a little bit of the data
                 stream_encoder
@@ -476,4 +531,34 @@
 
         self.w.flush()
     }
+}
+
+/// A `Write` implementation that sometimes will only write part of its input.
+struct PartialInterruptingWriter<'a, W: 'a + Write, R: 'a + Rng> {
+    w: &'a mut W,
+    rng: &'a mut R,
+    /// In [0, 1]. If a random number in [0, 1] is  `<= threshold`, `write()` will write all its
+    /// input. Otherwise, it will write a random substring
+    full_input_fraction: f64,
+    no_interrupt_fraction: f64
+}
+
+impl<'a, W: Write, R: Rng> Write for PartialInterruptingWriter<'a, W, R> {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        if self.rng.gen_range(0.0, 1.0) > self.no_interrupt_fraction{
+            return Err(io::Error::new(io::ErrorKind::Interrupted, "interrupted"));
+        }
+
+        if self.rng.gen_range(0.0, 1.0) <= self.full_input_fraction || buf.len() == 0 {
+            // pass through the buf untouched
+            self.w.write(buf)
+        } else {
+            // only use a prefix of it
+            self.w.write(&buf[0..(self.rng.gen_range(0, buf.len() - 1))])
+        }
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        self.w.flush()
+    }
 }
\ No newline at end of file
diff --git a/rustc_deps/vendor/base64/tests/decode.rs b/rustc_deps/vendor/base64/tests/decode.rs
index 2b9aa60..eafa441 100644
--- a/rustc_deps/vendor/base64/tests/decode.rs
+++ b/rustc_deps/vendor/base64/tests/decode.rs
@@ -307,4 +307,4 @@
 
 fn config_std_pad() -> Config {
     Config::new(CharacterSet::Standard, true)
-}
\ No newline at end of file
+}
diff --git a/rustc_deps/vendor/base64/tests/tests.rs b/rustc_deps/vendor/base64/tests/tests.rs
index 2d3f3ab..699cb76 100644
--- a/rustc_deps/vendor/base64/tests/tests.rs
+++ b/rustc_deps/vendor/base64/tests/tests.rs
@@ -1,7 +1,7 @@
 extern crate base64;
 extern crate rand;
 
-use rand::{Rng, FromEntropy};
+use rand::{FromEntropy, Rng};
 
 use base64::*;
 
@@ -141,7 +141,10 @@
 
     assert_eq!(
         encode(&bytes),
-        format!("{}", base64::display::Base64Display::with_config(&bytes, STANDARD))
+        format!(
+            "{}",
+            base64::display::Base64Display::with_config(&bytes, STANDARD)
+        )
     );
 }
 
diff --git a/rustc_deps/vendor/bincode/.cargo-checksum.json b/rustc_deps/vendor/bincode/.cargo-checksum.json
index fbe4490..96f2812 100644
--- a/rustc_deps/vendor/bincode/.cargo-checksum.json
+++ b/rustc_deps/vendor/bincode/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"e592da1e4b2bb5078f0f535e6b0bc2680de695f9b8866b542b08fa79e6331350","LICENSE.md":"90d7e062634054e6866d3c81e6a2b3058a840e6af733e98e80bdfe1a7dec6912","readme.md":"a996d4e49c54db1a35af1da05bcff2a524ef5a39a4b9d692d2e1fb929244803b","src/config.rs":"2a6da0f5f95794add175c0a37e2a293f6d4c5932fc43f41492f646a98bf58aa9","src/de/mod.rs":"00f515082f2ea1f8d486db26ea5600aef441a792090fcd850148fce03c652c18","src/de/read.rs":"f8c5f2466c632f062e6fe55734d27c8fc7566c0894b610f012d8835af1810628","src/error.rs":"00a7a4de5cf1cc4a28dcf44c5c3ff607887baf41d5410b76468088963257b783","src/internal.rs":"6c827579a325e02bc7df8403965616b970b0f9b9763896ed938e719309a681b4","src/lib.rs":"ef9ede5af803c44c2a6c3479ca0fa773a13b6a00a362f16001838967bffccda3","src/ser/mod.rs":"bcf95b188d5e147d2041e4832d3bfcfe522cda1e1abeb64ef088ab97dccd07d7"},"package":"9f2fb9e29e72fd6bc12071533d5dc7664cb01480c59406f656d7ac25c7bd8ff7"}
\ No newline at end of file
+{"files":{"Cargo.toml":"98e0fec00155eb806676f2d2c78e57dead080adfabd324b66087330bc165c84c","LICENSE.md":"90d7e062634054e6866d3c81e6a2b3058a840e6af733e98e80bdfe1a7dec6912","build.rs":"b86fd53553e9012ea09ce6ec755418b9cfcaa57c1214cd11c26a44c99b87a424","readme.md":"a996d4e49c54db1a35af1da05bcff2a524ef5a39a4b9d692d2e1fb929244803b","src/config.rs":"60df7a86f9d3fe84cad7a2bbf1309acfaf44202c2eee3bec31ecaaab1df5e33f","src/de/mod.rs":"658823a12b12db6e3bd43780a35eabfc7c4c13497e491dd04f5ec7b3e029a692","src/de/read.rs":"b615c8a22241f533faee7c0d8cac9fc068db2cf05079ada39766e13f9bc70849","src/error.rs":"ce6617bf8523392e6fc8b853b7768899a229b6b78dabc2918c0e2dd3f846aa01","src/internal.rs":"8798739ee63dd50b94d62b7dae0b33cec857ea6824e6226002596ab7053e514f","src/lib.rs":"285550c3300621411db67dab4663cf0c3b10c1282da3cbacad0c3810d54ce183","src/ser/mod.rs":"40704ee175aeefadf948959cdb9d9d247a817d9d56ae66f8d78383bfe1ffcb44"},"package":"58470ad6460f0b0e89b0df5f17b8bd77ebae26af69dca0bd9ddc8b9e38abb2ff"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/bincode/Cargo.toml b/rustc_deps/vendor/bincode/Cargo.toml
index e6da2b9..4b89fe6 100644
--- a/rustc_deps/vendor/bincode/Cargo.toml
+++ b/rustc_deps/vendor/bincode/Cargo.toml
@@ -12,8 +12,9 @@
 
 [package]
 name = "bincode"
-version = "1.0.1"
+version = "1.1.1"
 authors = ["Ty Overby <ty@pre-alpha.com>", "Francesco Mazzoli <f@mazzo.li>", "David Tolnay <dtolnay@gmail.com>", "Daniel Griffen"]
+build = "build.rs"
 exclude = ["logo.png", "tests/*", "examples/*", ".gitignore", ".travis.yml", "changelist.org"]
 publish = true
 description = "A binary serialization / deserialization strategy that uses Serde for transforming structs into bytes and vice versa!"
@@ -33,6 +34,10 @@
 
 [dev-dependencies.serde_derive]
 version = "^1.0.27"
+[build-dependencies.autocfg]
+version = "0.1"
 
 [features]
-i128 = ["byteorder/i128"]
+i128 = []
+[badges.travis-ci]
+repository = "TyOverby/bincode"
diff --git a/rustc_deps/vendor/bincode/build.rs b/rustc_deps/vendor/bincode/build.rs
new file mode 100644
index 0000000..4afe096
--- /dev/null
+++ b/rustc_deps/vendor/bincode/build.rs
@@ -0,0 +1,8 @@
+extern crate autocfg;
+
+fn main() {
+    autocfg::rerun_path(file!());
+
+    let ac = autocfg::new();
+    ac.emit_has_type("i128");
+}
diff --git a/rustc_deps/vendor/bincode/src/config.rs b/rustc_deps/vendor/bincode/src/config.rs
index cebd0be..2d08283 100644
--- a/rustc_deps/vendor/bincode/src/config.rs
+++ b/rustc_deps/vendor/bincode/src/config.rs
@@ -1,14 +1,14 @@
 use super::internal::{Bounded, Infinite, SizeLimit};
-use ::error::Result;
 use byteorder::{BigEndian, ByteOrder, LittleEndian, NativeEndian};
-use {DeserializerAcceptor, SerializerAcceptor};
-use serde;
-use std::io::{Write, Read};
-use std::marker::PhantomData;
 use de::read::BincodeRead;
+use error::Result;
+use serde;
+use std::io::{Read, Write};
+use std::marker::PhantomData;
+use {DeserializerAcceptor, SerializerAcceptor};
 
-use self::LimitOption::*;
 use self::EndianOption::*;
+use self::LimitOption::*;
 
 struct DefaultOptions(Infinite);
 
@@ -110,7 +110,6 @@
     _endian: PhantomData<E>,
 }
 
-
 impl<O: Options, L: SizeLimit> WithOtherLimit<O, L> {
     #[inline(always)]
     pub(crate) fn new(options: O, limit: L) -> WithOtherLimit<O, L> {
@@ -179,7 +178,7 @@
                 $call
             }
         }
-    }
+    };
 }
 
 impl Config {
@@ -217,7 +216,7 @@
     /// Sets the endianness to big-endian
     #[inline(always)]
     pub fn big_endian(&mut self) -> &mut Self {
-        self.endian= EndianOption::Big;
+        self.endian = EndianOption::Big;
         self
     }
 
@@ -245,7 +244,11 @@
     /// If the serialization would take more bytes than allowed by the size limit, an error
     /// is returned and *no bytes* will be written into the `Writer`
     #[inline(always)]
-    pub fn serialize_into<W: Write, T: ?Sized + serde::Serialize>(&self, w: W, t: &T) -> Result<()> {
+    pub fn serialize_into<W: Write, T: ?Sized + serde::Serialize>(
+        &self,
+        w: W,
+        t: &T,
+    ) -> Result<()> {
         config_map!(self, opts => ::internal::serialize_into(w, t, opts))
     }
 
@@ -258,19 +261,32 @@
     /// TODO: document
     #[doc(hidden)]
     #[inline(always)]
-    pub fn deserialize_in_place<'a, R, T: >(&self, reader: R, place: &mut T) -> Result<()>
+    pub fn deserialize_in_place<'a, R, T>(&self, reader: R, place: &mut T) -> Result<()>
     where
         R: BincodeRead<'a>,
-        T: serde::de::Deserialize<'a>
+        T: serde::de::Deserialize<'a>,
     {
         config_map!(self, opts => ::internal::deserialize_in_place(reader, opts, place))
     }
 
+    /// Deserializes a slice of bytes with state `seed` using this configuration.
+    #[inline(always)]
+    pub fn deserialize_seed<'a, T: serde::de::DeserializeSeed<'a>>(
+        &self,
+        seed: T,
+        bytes: &'a [u8],
+    ) -> Result<T::Value> {
+        config_map!(self, opts => ::internal::deserialize_seed(seed, bytes, opts))
+    }
+
     /// Deserializes an object directly from a `Read`er using this configuration
     ///
     /// If this returns an `Error`, `reader` may be in an invalid state.
     #[inline(always)]
-    pub fn deserialize_from<R: Read, T: serde::de::DeserializeOwned>(&self, reader: R) -> Result<T> {
+    pub fn deserialize_from<R: Read, T: serde::de::DeserializeOwned>(
+        &self,
+        reader: R,
+    ) -> Result<T> {
         config_map!(self, opts => ::internal::deserialize_from(reader, opts))
     }
 
@@ -280,16 +296,20 @@
     ///
     /// If this returns an `Error`, `reader` may be in an invalid state.
     #[inline(always)]
-    pub fn deserialize_from_custom<'a, R: BincodeRead<'a>, T: serde::de::DeserializeOwned>(&self, reader: R) -> Result<T> {
+    pub fn deserialize_from_custom<'a, R: BincodeRead<'a>, T: serde::de::DeserializeOwned>(
+        &self,
+        reader: R,
+    ) -> Result<T> {
         config_map!(self, opts => ::internal::deserialize_from_custom(reader, opts))
     }
 
     /// Executes the acceptor with a serde::Deserializer instance.
     /// NOT A PART OF THE STABLE PUBLIC API
     #[doc(hidden)]
-    pub fn with_deserializer<'a, A,  R>(&self, reader: R, acceptor: A) -> A::Output
-    where A: DeserializerAcceptor<'a>,
-          R: BincodeRead<'a>
+    pub fn with_deserializer<'a, A, R>(&self, reader: R, acceptor: A) -> A::Output
+    where
+        A: DeserializerAcceptor<'a>,
+        R: BincodeRead<'a>,
     {
         config_map!(self, opts => {
             let mut deserializer = ::de::Deserializer::new(reader, opts);
@@ -301,8 +321,9 @@
     /// NOT A PART OF THE STABLE PUBLIC API
     #[doc(hidden)]
     pub fn with_serializer<A, W>(&self, writer: W, acceptor: A) -> A::Output
-    where A: SerializerAcceptor,
-        W: Write
+    where
+        A: SerializerAcceptor,
+        W: Write,
     {
         config_map!(self, opts => {
             let mut serializer = ::ser::Serializer::new(writer, opts);
diff --git a/rustc_deps/vendor/bincode/src/de/mod.rs b/rustc_deps/vendor/bincode/src/de/mod.rs
index 1b6f125..6502e3e 100644
--- a/rustc_deps/vendor/bincode/src/de/mod.rs
+++ b/rustc_deps/vendor/bincode/src/de/mod.rs
@@ -1,13 +1,13 @@
+use config::Options;
 use std::io::Read;
-use ::config::Options;
 
-use serde;
-use byteorder::ReadBytesExt;
-use serde::de::IntoDeserializer;
-use serde::de::Error as DeError;
-use ::{Error, ErrorKind, Result};
-use ::internal::SizeLimit;
 use self::read::BincodeRead;
+use byteorder::ReadBytesExt;
+use internal::SizeLimit;
+use serde;
+use serde::de::Error as DeError;
+use serde::de::IntoDeserializer;
+use {Error, ErrorKind, Result};
 
 pub mod read;
 
@@ -108,29 +108,29 @@
     impl_nums!(f32, deserialize_f32, visit_f32, read_f32);
     impl_nums!(f64, deserialize_f64, visit_f64, read_f64);
 
-    #[cfg(feature = "i128")]
+    #[cfg(has_i128)]
     impl_nums!(u128, deserialize_u128, visit_u128, read_u128);
 
-    #[cfg(feature = "i128")]
+    #[cfg(has_i128)]
     impl_nums!(i128, deserialize_i128, visit_i128, read_i128);
 
     serde_if_integer128! {
-        #[cfg(not(feature = "i128"))]
+        #[cfg(not(has_i128))]
         fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
         where
             V: serde::de::Visitor<'de>
         {
             let _ = visitor;
-            Err(DeError::custom("u128 is not supported. Enable the `i128` feature of `bincode`"))
+            Err(DeError::custom("u128 is not supported. Use Rustc ≥ 1.26."))
         }
 
-        #[cfg(not(feature = "i128"))]
+        #[cfg(not(has_i128))]
         fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
         where
             V: serde::de::Visitor<'de>
         {
             let _ = visitor;
-            Err(DeError::custom("i128 is not supported. Enable the `i128` feature of `bincode`"))
+            Err(DeError::custom("i128 is not supported. Use Rustc ≥ 1.26."))
         }
     }
 
@@ -234,12 +234,16 @@
         V: serde::de::Visitor<'de>,
     {
         impl<'de, 'a, R: 'a, O> serde::de::EnumAccess<'de> for &'a mut Deserializer<R, O>
-        where R: BincodeRead<'de>, O: Options {
+        where
+            R: BincodeRead<'de>,
+            O: Options,
+        {
             type Error = Error;
             type Variant = Self;
 
             fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
-                where V: serde::de::DeserializeSeed<'de>,
+            where
+                V: serde::de::DeserializeSeed<'de>,
             {
                 let idx: u32 = try!(serde::de::Deserialize::deserialize(&mut *self));
                 let val: Result<_> = seed.deserialize(idx.into_deserializer());
@@ -259,13 +263,9 @@
             len: usize,
         }
 
-        impl<
-            'de,
-            'a,
-            'b: 'a,
-            R: BincodeRead<'de> + 'b,
-            O: Options,
-        > serde::de::SeqAccess<'de> for Access<'a, R, O> {
+        impl<'de, 'a, 'b: 'a, R: BincodeRead<'de> + 'b, O: Options> serde::de::SeqAccess<'de>
+            for Access<'a, R, O>
+        {
             type Error = Error;
 
             fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
@@ -325,13 +325,9 @@
             len: usize,
         }
 
-        impl<
-            'de,
-            'a,
-            'b: 'a,
-            R: BincodeRead<'de> + 'b,
-            O: Options,
-        > serde::de::MapAccess<'de> for Access<'a, R, O> {
+        impl<'de, 'a, 'b: 'a, R: BincodeRead<'de> + 'b, O: Options> serde::de::MapAccess<'de>
+            for Access<'a, R, O>
+        {
             type Error = Error;
 
             fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
@@ -434,7 +430,10 @@
 }
 
 impl<'de, 'a, R, O> serde::de::VariantAccess<'de> for &'a mut Deserializer<R, O>
-where R: BincodeRead<'de>, O: Options{
+where
+    R: BincodeRead<'de>,
+    O: Options,
+{
     type Error = Error;
 
     fn unit_variant(self) -> Result<()> {
@@ -442,44 +441,43 @@
     }
 
     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
-        where T: serde::de::DeserializeSeed<'de>,
+    where
+        T: serde::de::DeserializeSeed<'de>,
     {
         serde::de::DeserializeSeed::deserialize(seed, self)
     }
 
-    fn tuple_variant<V>(self,
-                      len: usize,
-                      visitor: V) -> Result<V::Value>
-        where V: serde::de::Visitor<'de>,
+    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value>
+    where
+        V: serde::de::Visitor<'de>,
     {
         serde::de::Deserializer::deserialize_tuple(self, len, visitor)
     }
 
-    fn struct_variant<V>(self,
-                       fields: &'static [&'static str],
-                       visitor: V) -> Result<V::Value>
-        where V: serde::de::Visitor<'de>,
+    fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
+    where
+        V: serde::de::Visitor<'de>,
     {
         serde::de::Deserializer::deserialize_tuple(self, fields.len(), visitor)
     }
 }
 static UTF8_CHAR_WIDTH: [u8; 256] = [
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x1F
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x3F
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x5F
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x7F
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x9F
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xBF
-0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // 0xDF
-3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, // 0xEF
-4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0, // 0xFF
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, // 0x1F
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, // 0x3F
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, // 0x5F
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+    1, // 0x7F
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, // 0x9F
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, // 0xBF
+    0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+    2, // 0xDF
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xEF
+    4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xFF
 ];
 
 // This function is a copy of core::str::utf8_char_width
diff --git a/rustc_deps/vendor/bincode/src/de/read.rs b/rustc_deps/vendor/bincode/src/de/read.rs
index 3ddcee5..45aa5d7 100644
--- a/rustc_deps/vendor/bincode/src/de/read.rs
+++ b/rustc_deps/vendor/bincode/src/de/read.rs
@@ -1,6 +1,6 @@
-use std::io;
 use error::Result;
 use serde;
+use std::io;
 
 /// An optional Read trait for advanced Bincode usage.
 ///
@@ -78,9 +78,10 @@
 impl<'storage> SliceReader<'storage> {
     #[inline(always)]
     fn unexpected_eof() -> Box<::ErrorKind> {
-        return Box::new(::ErrorKind::Io(
-            io::Error::new(io::ErrorKind::UnexpectedEof, ""),
-        ));
+        return Box::new(::ErrorKind::Io(io::Error::new(
+            io::ErrorKind::UnexpectedEof,
+            "",
+        )));
     }
 }
 
diff --git a/rustc_deps/vendor/bincode/src/error.rs b/rustc_deps/vendor/bincode/src/error.rs
index f5cfca3..1f52424 100644
--- a/rustc_deps/vendor/bincode/src/error.rs
+++ b/rustc_deps/vendor/bincode/src/error.rs
@@ -1,7 +1,7 @@
-use std::io;
-use std::{error, fmt};
-use std::str::Utf8Error;
 use std::error::Error as StdError;
+use std::io;
+use std::str::Utf8Error;
+use std::{error, fmt};
 
 use serde;
 
@@ -47,14 +47,14 @@
             ErrorKind::InvalidBoolEncoding(_) => "invalid u8 while decoding bool",
             ErrorKind::InvalidCharEncoding => "char is not valid",
             ErrorKind::InvalidTagEncoding(_) => "tag for enum is not valid",
-            ErrorKind::SequenceMustHaveLength =>
-                "Bincode can only encode sequences and maps that have a knowable size ahead of time",
+            ErrorKind::SequenceMustHaveLength => {
+                "Bincode can only encode sequences and maps that have a knowable size ahead of time"
+            }
             ErrorKind::DeserializeAnyNotSupported => {
                 "Bincode doesn't support serde::Deserializer::deserialize_any"
             }
             ErrorKind::SizeLimit => "the size limit has been reached",
             ErrorKind::Custom(ref msg) => msg,
-
         }
     }
 
@@ -91,16 +91,12 @@
             ErrorKind::InvalidTagEncoding(tag) => {
                 write!(fmt, "{}, found {}", self.description(), tag)
             }
-            ErrorKind::SequenceMustHaveLength => {
-                write!(fmt, "{}", self.description())
-            }
+            ErrorKind::SequenceMustHaveLength => write!(fmt, "{}", self.description()),
             ErrorKind::SizeLimit => write!(fmt, "{}", self.description()),
-            ErrorKind::DeserializeAnyNotSupported => {
-                write!(
-                    fmt,
-                    "Bincode does not support the serde::Deserializer::deserialize_any method"
-                )
-            }
+            ErrorKind::DeserializeAnyNotSupported => write!(
+                fmt,
+                "Bincode does not support the serde::Deserializer::deserialize_any method"
+            ),
             ErrorKind::Custom(ref s) => s.fmt(fmt),
         }
     }
diff --git a/rustc_deps/vendor/bincode/src/internal.rs b/rustc_deps/vendor/bincode/src/internal.rs
index bab4a28..c614781 100644
--- a/rustc_deps/vendor/bincode/src/internal.rs
+++ b/rustc_deps/vendor/bincode/src/internal.rs
@@ -1,5 +1,5 @@
-use std::io::{Read, Write};
 use serde;
+use std::io::{Read, Write};
 
 use config::{Options, OptionsExt};
 use de::read::BincodeRead;
@@ -114,6 +114,16 @@
     serde::Deserialize::deserialize(&mut deserializer)
 }
 
+pub(crate) fn deserialize_seed<'a, T, O>(seed: T, bytes: &'a [u8], options: O) -> Result<T::Value>
+where
+    T: serde::de::DeserializeSeed<'a>,
+    O: Options,
+{
+    let reader = ::de::read::SliceReader::new(bytes);
+    let options = ::config::WithOtherLimit::new(options, Infinite);
+    let mut deserializer = ::de::Deserializer::new(reader, options);
+    seed.deserialize(&mut deserializer)
+}
 
 pub(crate) trait SizeLimit: Clone {
     /// Tells the SizeLimit that a certain number of bytes has been
@@ -123,7 +133,6 @@
     fn limit(&self) -> Option<u64>;
 }
 
-
 /// A SizeLimit that restricts serialized or deserialized messages from
 /// exceeding a certain byte length.
 #[derive(Copy, Clone)]
diff --git a/rustc_deps/vendor/bincode/src/lib.rs b/rustc_deps/vendor/bincode/src/lib.rs
index 577c0ba..cbcb1d9 100644
--- a/rustc_deps/vendor/bincode/src/lib.rs
+++ b/rustc_deps/vendor/bincode/src/lib.rs
@@ -19,17 +19,11 @@
 //!     assert_eq!(target, decoded);
 //! }
 //! ```
-//! 
+//!
 //! ### 128bit numbers
-//! 
-//! Support for `i128` and `u128` on Rust toolchains after `1.26.0` is 
-//! enabled through the `i128` feature. Add the following to your 
-//! `Cargo.toml`:
-//! 
-//! ```toml,ignore
-//! [dependencies.bincode]
-//! features = ["i128"]
-//! ```
+//!
+//! Support for `i128` and `u128` is automatically enabled on Rust toolchains
+//! greater than or equal to `1.26.0`.
 
 #![crate_name = "bincode"]
 #![crate_type = "rlib"]
@@ -40,14 +34,14 @@
 extern crate serde;
 
 mod config;
-mod ser;
-mod error;
 mod de;
+mod error;
 mod internal;
+mod ser;
 
-pub use error::{Error, ErrorKind, Result};
 pub use config::Config;
 pub use de::read::{BincodeRead, IoReader, SliceReader};
+pub use error::{Error, ErrorKind, Result};
 
 /// An object that implements this trait can be passed a
 /// serde::Deserializer without knowing its concrete type.
@@ -80,6 +74,7 @@
 /// | Byte limit | Endianness |
 /// |------------|------------|
 /// | Unlimited  | Little     |
+#[inline(always)]
 pub fn config() -> Config {
     Config::new()
 }
@@ -135,7 +130,7 @@
 pub fn deserialize_in_place<'a, R, T>(reader: R, place: &mut T) -> Result<()>
 where
     T: serde::de::Deserialize<'a>,
-    R: BincodeRead<'a>
+    R: BincodeRead<'a>,
 {
     config().deserialize_in_place(reader, place)
 }
@@ -159,9 +154,10 @@
 /// Executes the acceptor with a serde::Deserializer instance.
 /// NOT A PART OF THE STABLE PUBLIC API
 #[doc(hidden)]
-pub fn with_deserializer<'a, A,  R>(reader: R, acceptor: A) -> A::Output
-where A: DeserializerAcceptor<'a>,
-        R: BincodeRead<'a>
+pub fn with_deserializer<'a, A, R>(reader: R, acceptor: A) -> A::Output
+where
+    A: DeserializerAcceptor<'a>,
+    R: BincodeRead<'a>,
 {
     config().with_deserializer(reader, acceptor)
 }
@@ -170,8 +166,9 @@
 /// NOT A PART OF THE STABLE PUBLIC API
 #[doc(hidden)]
 pub fn with_serializer<A, W>(writer: W, acceptor: A) -> A::Output
-where A: SerializerAcceptor,
-    W: std::io::Write
+where
+    A: SerializerAcceptor,
+    W: std::io::Write,
 {
     config().with_serializer(writer, acceptor)
 }
diff --git a/rustc_deps/vendor/bincode/src/ser/mod.rs b/rustc_deps/vendor/bincode/src/ser/mod.rs
index e6d0783..4604c3e 100644
--- a/rustc_deps/vendor/bincode/src/ser/mod.rs
+++ b/rustc_deps/vendor/bincode/src/ser/mod.rs
@@ -5,9 +5,9 @@
 
 use byteorder::WriteBytesExt;
 
-use super::{Result, Error, ErrorKind};
-use ::config::Options;
 use super::internal::SizeLimit;
+use super::{Error, ErrorKind, Result};
+use config::Options;
 
 /// An Serializer that encodes values directly into a Writer.
 ///
@@ -51,9 +51,9 @@
     }
 
     fn serialize_bool(self, v: bool) -> Result<()> {
-        self.writer.write_u8(if v { 1 } else { 0 }).map_err(
-            Into::into,
-        )
+        self.writer
+            .write_u8(if v { 1 } else { 0 })
+            .map_err(Into::into)
     }
 
     fn serialize_u8(self, v: u8) -> Result<()> {
@@ -88,31 +88,31 @@
         self.writer.write_i64::<O::Endian>(v).map_err(Into::into)
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(has_i128)]
     fn serialize_u128(self, v: u128) -> Result<()> {
         self.writer.write_u128::<O::Endian>(v).map_err(Into::into)
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(has_i128)]
     fn serialize_i128(self, v: i128) -> Result<()> {
         self.writer.write_i128::<O::Endian>(v).map_err(Into::into)
     }
 
     serde_if_integer128! {
-        #[cfg(not(feature = "i128"))]
+        #[cfg(not(has_i128))]
         fn serialize_u128(self, v: u128) -> Result<()> {
             use serde::ser::Error;
 
             let _ = v;
-            Err(Error::custom("u128 is not supported. Enable the `i128` feature of `bincode`"))
+            Err(Error::custom("u128 is not supported. Use Rustc ≥ 1.26."))
         }
 
-        #[cfg(not(feature = "i128"))]
+        #[cfg(not(has_i128))]
         fn serialize_i128(self, v: i128) -> Result<()> {
             use serde::ser::Error;
-            
+
             let _ = v;
-            Err(Error::custom("i128 is not supported. Enable the `i128` feature of `bincode`"))
+            Err(Error::custom("i128 is not supported. Use Rustc ≥ 1.26."))
         }
     }
 
@@ -130,9 +130,9 @@
     }
 
     fn serialize_char(self, c: char) -> Result<()> {
-        self.writer.write_all(encode_utf8(c).as_slice()).map_err(
-            Into::into,
-        )
+        self.writer
+            .write_all(encode_utf8(c).as_slice())
+            .map_err(Into::into)
     }
 
     fn serialize_bytes(self, v: &[u8]) -> Result<()> {
@@ -682,7 +682,7 @@
     }
 }
 
-impl<'a, O: Options+ 'a> serde::ser::SerializeMap for SizeCompound<'a, O> {
+impl<'a, O: Options + 'a> serde::ser::SerializeMap for SizeCompound<'a, O> {
     type Ok = ();
     type Error = Error;
 
diff --git a/rustc_deps/vendor/byteorder/.cargo-checksum.json b/rustc_deps/vendor/byteorder/.cargo-checksum.json
index e46d9f0..12eafec 100644
--- a/rustc_deps/vendor/byteorder/.cargo-checksum.json
+++ b/rustc_deps/vendor/byteorder/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"dc0a497d6932b874a32c1a457e344bdcd27a1767a174d163f19d66b837477a08","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"9f119d940ff1131bb71fb7c2b10c36ae91b45dbcf010975ccc555268a5b79165","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"97c01a66dbff4615acd49a8c3a85d137bf29cc113fa514910195bb11aef445bc","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"5dbfb724aa137efdff2cf0faeb728a3d302eda097ba5189de2d82314ce500654","src/io.rs":"d9759a25c625aa341b23bdb489144b1e9554db11bc2fa799a2a6ecfbc442ea5e","src/lib.rs":"fd18e7969a80314537ba41b3c460284975c0d4df4b72f27527506cb5bd889ae8"},"package":"94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"51f0eb3b6139fc1a908d41a7b3cba7d58d684700986b3518f82e5af254c39e8e","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"362a05ecca14c0934f211fba28eeeca2a72e4665e4c8303bc44321aedfa1ab1c","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"97c01a66dbff4615acd49a8c3a85d137bf29cc113fa514910195bb11aef445bc","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"80e43e07f34bc6d3ebe4f37cea79ba02cafce6cf30b737a1db65de55f2c38ca5","build.rs":"088c35c11be1e443c4462c7fe2863bcf885805e7b0f3dc7d83e6091ff197e779","src/io.rs":"dce98946ebc14cc37e8f5632a26979494cdd995adceeb9c22c591aef9010c7ad","src/lib.rs":"23fd0baba674e534dee99f9f082db2f7a51b075b1ed7c3510bc49ebd011033bc"},"package":"a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/byteorder/CHANGELOG.md b/rustc_deps/vendor/byteorder/CHANGELOG.md
index 066878b..020beb4 100644
--- a/rustc_deps/vendor/byteorder/CHANGELOG.md
+++ b/rustc_deps/vendor/byteorder/CHANGELOG.md
@@ -1,3 +1,46 @@
+1.3.0
+=====
+This new minor release now enables `i128` support automatically on Rust
+compilers that support 128-bit integers. The `i128` feature is now a no-op, but
+continues to exist for backward compatibility purposes. The crate continues to
+maintain compatibility with Rust 1.12.0.
+
+This release also deprecates the `ByteOrder` trait methods
+`read_f32_into_unchecked` and `read_f64_into_unchecked` in favor of
+`read_f32_into` and `read_f64_into`. This was an oversight from the 1.2 release
+where the corresponding methods on `ReadBytesExt` were deprecated.
+
+`quickcheck` and `rand` were bumped to `0.8` and `0.6`, respectively.
+
+A few small documentation related bugs have been fixed.
+
+
+1.2.7
+=====
+This patch release excludes some CI files from the crate release and updates
+the license field to use `OR` instead of `/`.
+
+
+1.2.6
+=====
+This patch release fixes some test compilation errors introduced by an
+over-eager release of 1.2.5.
+
+
+1.2.5
+=====
+This patch release fixes some typos in the docs, adds doc tests to methods on
+`WriteByteExt` and bumps the quickcheck dependency to `0.7`.
+
+
+1.2.4
+=====
+This patch release adds support for 48-bit integers by adding the following
+methods to the `ByteOrder` trait: `read_u48`, `read_i48`, `write_u48` and
+`write_i48`. Corresponding methods have been added to the `ReadBytesExt` and
+`WriteBytesExt` traits as well.
+
+
 1.2.3
 =====
 This patch release removes the use of `feature(i128_type)` from byteorder,
diff --git a/rustc_deps/vendor/byteorder/Cargo.toml b/rustc_deps/vendor/byteorder/Cargo.toml
index 4ddaae7..a2c32cb 100644
--- a/rustc_deps/vendor/byteorder/Cargo.toml
+++ b/rustc_deps/vendor/byteorder/Cargo.toml
@@ -12,8 +12,9 @@
 
 [package]
 name = "byteorder"
-version = "1.2.7"
+version = "1.3.1"
 authors = ["Andrew Gallant <jamslam@gmail.com>"]
+build = "build.rs"
 exclude = ["/ci/*"]
 description = "Library for reading/writing numbers in big-endian and little-endian."
 homepage = "https://github.com/BurntSushi/byteorder"
@@ -30,11 +31,11 @@
 name = "byteorder"
 bench = false
 [dev-dependencies.quickcheck]
-version = "0.7"
+version = "0.8"
 default-features = false
 
 [dev-dependencies.rand]
-version = "0.5"
+version = "0.6"
 
 [features]
 default = ["std"]
diff --git a/rustc_deps/vendor/byteorder/benches/bench.rs b/rustc_deps/vendor/byteorder/benches/bench.rs
index 3982476..d53d25e 100644
--- a/rustc_deps/vendor/byteorder/benches/bench.rs
+++ b/rustc_deps/vendor/byteorder/benches/bench.rs
@@ -148,108 +148,108 @@
 bench_num!(int_7, read_int, 7, [1, 2, 3, 4, 5, 6, 7]);
 bench_num!(int_8, read_int, 8, [1, 2, 3, 4, 5, 6, 7, 8]);
 
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(u128, MAX, read_u128, write_u128,
     16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(i128, MAX, read_i128, write_i128,
     16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
 
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_1, read_uint128,
     1, [1]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_2, read_uint128,
     2, [1, 2]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_3, read_uint128,
     3, [1, 2, 3]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_4, read_uint128,
     4, [1, 2, 3, 4]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_5, read_uint128,
     5, [1, 2, 3, 4, 5]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_6, read_uint128,
     6, [1, 2, 3, 4, 5, 6]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_7, read_uint128,
     7, [1, 2, 3, 4, 5, 6, 7]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_8, read_uint128,
     8, [1, 2, 3, 4, 5, 6, 7, 8]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_9, read_uint128,
     9, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_10, read_uint128,
     10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_11, read_uint128,
     11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_12, read_uint128,
     12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_13, read_uint128,
     13, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_14, read_uint128,
     14, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_15, read_uint128,
     15, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(uint128_16, read_uint128,
     16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
 
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_1, read_int128,
     1, [1]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_2, read_int128,
     2, [1, 2]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_3, read_int128,
     3, [1, 2, 3]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_4, read_int128,
     4, [1, 2, 3, 4]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_5, read_int128,
     5, [1, 2, 3, 4, 5]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_6, read_int128,
     6, [1, 2, 3, 4, 5, 6]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_7, read_int128,
     7, [1, 2, 3, 4, 5, 6, 7]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_8, read_int128,
     8, [1, 2, 3, 4, 5, 6, 7, 8]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_9, read_int128,
     9, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_10, read_int128,
     10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_11, read_int128,
     11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_12, read_int128,
     12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_13, read_int128,
     13, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_14, read_int128,
     14, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_15, read_int128,
     15, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 bench_num!(int128_16, read_int128,
     16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
 
diff --git a/rustc_deps/vendor/byteorder/build.rs b/rustc_deps/vendor/byteorder/build.rs
new file mode 100644
index 0000000..002135b
--- /dev/null
+++ b/rustc_deps/vendor/byteorder/build.rs
@@ -0,0 +1,87 @@
+use std::env;
+use std::ffi::OsString;
+use std::io::{self, Write};
+use std::process::Command;
+
+fn main() {
+    let version = match Version::read() {
+        Ok(version) => version,
+        Err(err) => {
+            writeln!(
+                &mut io::stderr(),
+                "failed to parse `rustc --version`: {}",
+                err
+            ).unwrap();
+            return;
+        }
+    };
+    enable_i128(version);
+}
+
+fn enable_i128(version: Version) {
+    if version < (Version { major: 1, minor: 26, patch: 0 }) {
+        return;
+    }
+
+    println!("cargo:rustc-cfg=byteorder_i128");
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
+struct Version {
+    major: u32,
+    minor: u32,
+    patch: u32,
+}
+
+impl Version {
+    fn read() -> Result<Version, String> {
+        let rustc = env::var_os("RUSTC").unwrap_or(OsString::from("rustc"));
+        let output = Command::new(&rustc)
+            .arg("--version")
+            .output()
+            .unwrap()
+            .stdout;
+        Version::parse(&String::from_utf8(output).unwrap())
+    }
+
+    fn parse(mut s: &str) -> Result<Version, String> {
+        if !s.starts_with("rustc ") {
+            return Err(format!("unrecognized version string: {}", s));
+        }
+        s = &s["rustc ".len()..];
+
+        let parts: Vec<&str> = s.split(".").collect();
+        if parts.len() < 3 {
+            return Err(format!("not enough version parts: {:?}", parts));
+        }
+
+        let mut num = String::new();
+        for c in parts[0].chars() {
+            if !c.is_digit(10) {
+                break;
+            }
+            num.push(c);
+        }
+        let major = try!(num.parse::<u32>().map_err(|e| e.to_string()));
+
+        num.clear();
+        for c in parts[1].chars() {
+            if !c.is_digit(10) {
+                break;
+            }
+            num.push(c);
+        }
+        let minor = try!(num.parse::<u32>().map_err(|e| e.to_string()));
+
+        num.clear();
+        for c in parts[2].chars() {
+            if !c.is_digit(10) {
+                break;
+            }
+            num.push(c);
+        }
+        let patch = try!(num.parse::<u32>().map_err(|e| e.to_string()));
+
+        Ok(Version { major: major, minor: minor, patch: patch })
+    }
+}
diff --git a/rustc_deps/vendor/byteorder/src/io.rs b/rustc_deps/vendor/byteorder/src/io.rs
index 74cf9dd..bc49a1c 100644
--- a/rustc_deps/vendor/byteorder/src/io.rs
+++ b/rustc_deps/vendor/byteorder/src/io.rs
@@ -370,7 +370,7 @@
     /// ]);
     /// assert_eq!(16947640962301618749969007319746179, rdr.read_u128::<BigEndian>().unwrap());
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_u128<T: ByteOrder>(&mut self) -> Result<u128> {
         let mut buf = [0; 16];
@@ -391,14 +391,13 @@
     /// Read a signed 128 bit big-endian integer from a `Read`:
     ///
     /// ```rust
-    /// #![feature(i128_type)]
     /// use std::io::Cursor;
     /// use byteorder::{BigEndian, ReadBytesExt};
     ///
     /// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
     /// assert_eq!(i128::min_value(), rdr.read_i128::<BigEndian>().unwrap());
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_i128<T: ByteOrder>(&mut self) -> Result<i128> {
         let mut buf = [0; 16];
@@ -457,7 +456,7 @@
     }
 
     /// Reads an unsigned n-bytes integer from the underlying reader.
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_uint128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u128> {
         let mut buf = [0; 16];
@@ -466,7 +465,7 @@
     }
 
     /// Reads a signed n-bytes integer from the underlying reader.
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_int128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i128> {
         let mut buf = [0; 16];
@@ -672,7 +671,7 @@
     /// rdr.read_u128_into::<BigEndian>(&mut dst).unwrap();
     /// assert_eq!([517, 768], dst);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_u128_into<T: ByteOrder>(
         &mut self,
@@ -822,7 +821,7 @@
     /// rdr.read_i128_into::<BigEndian>(&mut dst).unwrap();
     /// assert_eq!([517, 768], dst);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_i128_into<T: ByteOrder>(
         &mut self,
@@ -1373,7 +1372,7 @@
     }
 
     /// Writes an unsigned 128 bit integer to the underlying writer.
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_u128<T: ByteOrder>(&mut self, n: u128) -> Result<()> {
         let mut buf = [0; 16];
@@ -1382,7 +1381,7 @@
     }
 
     /// Writes a signed 128 bit integer to the underlying writer.
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_i128<T: ByteOrder>(&mut self, n: i128) -> Result<()> {
         let mut buf = [0; 16];
@@ -1466,7 +1465,7 @@
     ///
     /// If the given integer is not representable in the given number of bytes,
     /// this method panics. If `nbytes > 16`, this method panics.
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_uint128<T: ByteOrder>(
         &mut self,
@@ -1482,7 +1481,7 @@
     ///
     /// If the given integer is not representable in the given number of bytes,
     /// this method panics. If `nbytes > 16`, this method panics.
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_int128<T: ByteOrder>(
         &mut self,
diff --git a/rustc_deps/vendor/byteorder/src/lib.rs b/rustc_deps/vendor/byteorder/src/lib.rs
index 77bfdcf..497e914 100644
--- a/rustc_deps/vendor/byteorder/src/lib.rs
+++ b/rustc_deps/vendor/byteorder/src/lib.rs
@@ -84,7 +84,7 @@
     (val << shift) as i64 >> shift
 }
 
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 #[inline]
 fn extend_sign128(val: u128, nbytes: usize) -> i128 {
     let shift = (16 - nbytes) * 8;
@@ -97,7 +97,7 @@
     (val << shift) as u64 >> shift
 }
 
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 #[inline]
 fn unextend_sign128(val: i128, nbytes: usize) -> u128 {
     let shift = (16 - nbytes) * 8;
@@ -125,7 +125,7 @@
     }
 }
 
-#[cfg(feature = "i128")]
+#[cfg(byteorder_i128)]
 #[inline]
 fn pack_size128(n: u128) -> usize {
     if n < 1 << 8 {
@@ -314,7 +314,7 @@
     /// LittleEndian::write_u128(&mut buf, 1_000_000);
     /// assert_eq!(1_000_000, LittleEndian::read_u128(&buf));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn read_u128(buf: &[u8]) -> u128;
 
     /// Reads an unsigned n-bytes integer from `buf`.
@@ -355,7 +355,7 @@
     /// LittleEndian::write_uint128(&mut buf, 1_000_000, 3);
     /// assert_eq!(1_000_000, LittleEndian::read_uint128(&buf, 3));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn read_uint128(buf: &[u8], nbytes: usize) -> u128;
 
     /// Writes an unsigned 16 bit integer `n` to `buf`.
@@ -474,7 +474,7 @@
     /// LittleEndian::write_u128(&mut buf, 1_000_000);
     /// assert_eq!(1_000_000, LittleEndian::read_u128(&buf));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn write_u128(buf: &mut [u8], n: u128);
 
     /// Writes an unsigned integer `n` to `buf` using only `nbytes`.
@@ -515,7 +515,7 @@
     /// LittleEndian::write_uint128(&mut buf, 1_000_000, 3);
     /// assert_eq!(1_000_000, LittleEndian::read_uint128(&buf, 3));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize);
 
     /// Reads a signed 16 bit integer from `buf`.
@@ -645,7 +645,7 @@
     /// LittleEndian::write_i128(&mut buf, -1_000_000_000);
     /// assert_eq!(-1_000_000_000, LittleEndian::read_i128(&buf));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_i128(buf: &[u8]) -> i128 {
         Self::read_u128(buf) as i128
@@ -692,7 +692,7 @@
     /// LittleEndian::write_int128(&mut buf, -1_000, 3);
     /// assert_eq!(-1_000, LittleEndian::read_int128(&buf, 3));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_int128(buf: &[u8], nbytes: usize) -> i128 {
         extend_sign128(Self::read_uint128(buf, nbytes), nbytes)
@@ -871,7 +871,7 @@
     /// LittleEndian::write_i128(&mut buf, -1_000_000_000);
     /// assert_eq!(-1_000_000_000, LittleEndian::read_i128(&buf));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_i128(buf: &mut [u8], n: i128) {
         Self::write_u128(buf, n as u128)
@@ -918,7 +918,7 @@
     /// LittleEndian::write_int128(&mut buf, -1_000, 3);
     /// assert_eq!(-1_000, LittleEndian::read_int128(&buf, 3));
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_int128(buf: &mut [u8], n: i128, nbytes: usize) {
         Self::write_uint128(buf, unextend_sign128(n, nbytes), nbytes)
@@ -1062,7 +1062,7 @@
     /// LittleEndian::read_u128_into(&bytes, &mut numbers_got);
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn read_u128_into(src: &[u8], dst: &mut [u128]);
 
     /// Reads signed 16 bit integers from `src` to `dst`.
@@ -1173,7 +1173,7 @@
     /// LittleEndian::read_i128_into(&bytes, &mut numbers_got);
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_i128_into(src: &[u8], dst: &mut [i128]) {
         let dst = unsafe {
@@ -1197,7 +1197,40 @@
     /// use byteorder::{ByteOrder, LittleEndian};
     ///
     /// let mut bytes = [0; 16];
-    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
+    /// let numbers_given = [1.0, 2.0, 31.312e31, -11.32e19];
+    /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
+    ///
+    /// let mut numbers_got = [0.0; 4];
+    /// LittleEndian::read_f32_into(&bytes, &mut numbers_got);
+    /// assert_eq!(numbers_given, numbers_got);
+    /// ```
+    #[inline]
+    fn read_f32_into(src: &[u8], dst: &mut [f32]) {
+        let dst = unsafe {
+            slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u32, dst.len())
+        };
+        Self::read_u32_into(src, dst);
+    }
+
+    /// **DEPRECATED**.
+    ///
+    /// This method is deprecated. Use `read_f32_into` instead.
+    /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
+    /// `src` into `dst`.
+    ///
+    /// # Panics
+    ///
+    /// Panics when `src.len() != 4*dst.len()`.
+    ///
+    /// # Examples
+    ///
+    /// Write and read `f32` numbers in little endian order:
+    ///
+    /// ```rust
+    /// use byteorder::{ByteOrder, LittleEndian};
+    ///
+    /// let mut bytes = [0; 16];
+    /// let numbers_given = [1.0, 2.0, 31.312e31, -11.32e19];
     /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
     ///
     /// let mut numbers_got = [0.0; 4];
@@ -1205,11 +1238,9 @@
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
     #[inline]
+    #[deprecated(since="1.3.0", note="please use `read_f32_into` instead")]
     fn read_f32_into_unchecked(src: &[u8], dst: &mut [f32]) {
-        let dst = unsafe {
-            slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u32, dst.len())
-        };
-        Self::read_u32_into(src, dst);
+        Self::read_f32_into(src, dst);
     }
 
     /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
@@ -1231,15 +1262,47 @@
     /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
     ///
     /// let mut numbers_got = [0.0; 4];
+    /// LittleEndian::read_f64_into(&bytes, &mut numbers_got);
+    /// assert_eq!(numbers_given, numbers_got);
+    /// ```
+    #[inline]
+    fn read_f64_into(src: &[u8], dst: &mut [f64]) {
+        let dst = unsafe {
+            slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u64, dst.len())
+        };
+        Self::read_u64_into(src, dst);
+    }
+
+    /// **DEPRECATED**.
+    ///
+    /// This method is deprecated. Use `read_f64_into` instead.
+    ///
+    /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
+    /// `src` into `dst`.
+    ///
+    /// # Panics
+    ///
+    /// Panics when `src.len() != 8*dst.len()`.
+    ///
+    /// # Examples
+    ///
+    /// Write and read `f64` numbers in little endian order:
+    ///
+    /// ```rust
+    /// use byteorder::{ByteOrder, LittleEndian};
+    ///
+    /// let mut bytes = [0; 32];
+    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
+    /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
+    ///
+    /// let mut numbers_got = [0.0; 4];
     /// LittleEndian::read_f64_into_unchecked(&bytes, &mut numbers_got);
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
     #[inline]
+    #[deprecated(since="1.3.0", note="please use `read_f64_into` instead")]
     fn read_f64_into_unchecked(src: &[u8], dst: &mut [f64]) {
-        let dst = unsafe {
-            slice::from_raw_parts_mut(dst.as_mut_ptr() as *mut u64, dst.len())
-        };
-        Self::read_u64_into(src, dst);
+        Self::read_f64_into(src, dst);
     }
 
     /// Writes unsigned 16 bit integers from `src` into `dst`.
@@ -1332,7 +1395,7 @@
     /// LittleEndian::read_u128_into(&bytes, &mut numbers_got);
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn write_u128_into(src: &[u128], dst: &mut [u8]);
 
     /// Writes signed 16 bit integers from `src` into `dst`.
@@ -1440,7 +1503,7 @@
     /// LittleEndian::read_i128_into(&bytes, &mut numbers_got);
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn write_i128_into(src: &[i128], dst: &mut [u8]) {
         let src = unsafe {
             slice::from_raw_parts(src.as_ptr() as *const u128, src.len())
@@ -1463,12 +1526,12 @@
     /// use byteorder::{ByteOrder, LittleEndian};
     ///
     /// let mut bytes = [0; 16];
-    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
+    /// let numbers_given = [1.0, 2.0, 31.312e31, -11.32e19];
     /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
     ///
     /// let mut numbers_got = [0.0; 4];
     /// unsafe {
-    ///     LittleEndian::read_f32_into_unchecked(&bytes, &mut numbers_got);
+    ///     LittleEndian::read_f32_into(&bytes, &mut numbers_got);
     /// }
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
@@ -1499,7 +1562,7 @@
     ///
     /// let mut numbers_got = [0.0; 4];
     /// unsafe {
-    ///     LittleEndian::read_f64_into_unchecked(&bytes, &mut numbers_got);
+    ///     LittleEndian::read_f64_into(&bytes, &mut numbers_got);
     /// }
     /// assert_eq!(numbers_given, numbers_got);
     /// ```
@@ -1584,7 +1647,7 @@
     /// BigEndian::from_slice_u128(&mut numbers);
     /// assert_eq!(numbers, [5u128.to_be(), 65000u128.to_be()]);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     fn from_slice_u128(numbers: &mut [u128]);
 
     /// Converts the given slice of signed 16 bit integers to a particular
@@ -1679,7 +1742,7 @@
     /// BigEndian::from_slice_i128(&mut numbers);
     /// assert_eq!(numbers, [5i128.to_be(), 65000i128.to_be()]);
     /// ```
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn from_slice_i128(src: &mut [i128]) {
         let src = unsafe {
@@ -1894,7 +1957,7 @@
         read_num_bytes!(u64, 8, buf, to_be)
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_u128(buf: &[u8]) -> u128 {
         read_num_bytes!(u128, 16, buf, to_be)
@@ -1912,7 +1975,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
         assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len());
@@ -1940,7 +2003,7 @@
         write_num_bytes!(u64, 8, n, buf, to_be);
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_u128(buf: &mut [u8], n: u128) {
         write_num_bytes!(u128, 16, n, buf, to_be);
@@ -1959,7 +2022,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
         assert!(pack_size128(n) <= nbytes && nbytes <= 16);
@@ -1988,7 +2051,7 @@
         read_slice!(src, dst, 8, to_be);
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_u128_into(src: &[u8], dst: &mut [u128]) {
         read_slice!(src, dst, 16, to_be);
@@ -2021,7 +2084,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_u128_into(src: &[u128], dst: &mut [u8]) {
         if cfg!(target_endian = "big") {
@@ -2058,7 +2121,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn from_slice_u128(numbers: &mut [u128]) {
         if cfg!(target_endian = "little") {
@@ -2109,7 +2172,7 @@
         read_num_bytes!(u64, 8, buf, to_le)
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_u128(buf: &[u8]) -> u128 {
         read_num_bytes!(u128, 16, buf, to_le)
@@ -2126,7 +2189,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
         assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len());
@@ -2153,7 +2216,7 @@
         write_num_bytes!(u64, 8, n, buf, to_le);
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_u128(buf: &mut [u8], n: u128) {
         write_num_bytes!(u128, 16, n, buf, to_le);
@@ -2169,7 +2232,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
         assert!(pack_size128(n as u128) <= nbytes && nbytes <= 16);
@@ -2195,7 +2258,7 @@
         read_slice!(src, dst, 8, to_le);
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn read_u128_into(src: &[u8], dst: &mut [u128]) {
         read_slice!(src, dst, 16, to_le);
@@ -2228,7 +2291,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn write_u128_into(src: &[u128], dst: &mut [u8]) {
         if cfg!(target_endian = "little") {
@@ -2265,7 +2328,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     #[inline]
     fn from_slice_u128(numbers: &mut [u128]) {
         if cfg!(target_endian = "big") {
@@ -2306,8 +2369,11 @@
     extern crate rand;
 
     use self::quickcheck::{QuickCheck, StdGen, Testable};
-    use self::rand::{Rng, thread_rng};
-    #[cfg(feature = "i128")] use self::quickcheck::{Arbitrary, Gen};
+    use self::rand::thread_rng;
+    #[cfg(byteorder_i128)]
+    use self::rand::Rng;
+    #[cfg(byteorder_i128)]
+    use self::quickcheck::{Arbitrary, Gen};
 
     pub const U24_MAX: u32 = 16_777_215;
     pub const I24_MAX: i32 = 8_388_607;
@@ -2327,7 +2393,7 @@
     #[derive(Clone, Debug)]
     pub struct Wi128<T>(pub T);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     impl<T: Clone> Wi128<T> {
         pub fn clone(&self) -> T {
             self.0.clone()
@@ -2340,7 +2406,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     impl Arbitrary for Wi128<u128> {
         fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<u128> {
             let max = calc_max!(::core::u128::MAX, gen.size(), 16);
@@ -2351,7 +2417,7 @@
         }
     }
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     impl Arbitrary for Wi128<i128> {
         fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<i128> {
             let max = calc_max!(::core::i128::MAX, gen.size(), 16);
@@ -2464,9 +2530,9 @@
     qc_byte_order!(prop_f32, f32, ::core::u64::MAX as u64, read_f32, write_f32);
     qc_byte_order!(prop_f64, f64, ::core::i64::MAX as u64, read_f64, write_f64);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
 
     qc_byte_order!(prop_uint_1,
@@ -2486,52 +2552,52 @@
     qc_byte_order!(prop_uint_8,
         u64, calc_max!(super::U64_MAX, 8), 8, read_uint, write_uint);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_1,
         Wi128<u128>, 1, 1, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_2,
         Wi128<u128>, 2, 2, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_3,
         Wi128<u128>, 3, 3, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_4,
         Wi128<u128>, 4, 4, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_5,
         Wi128<u128>, 5, 5, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_6,
         Wi128<u128>, 6, 6, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_7,
         Wi128<u128>, 7, 7, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_8,
         Wi128<u128>, 8, 8, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_9,
         Wi128<u128>, 9, 9, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_10,
         Wi128<u128>, 10, 10, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_11,
         Wi128<u128>, 11, 11, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_12,
         Wi128<u128>, 12, 12, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_13,
         Wi128<u128>, 13, 13, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_14,
         Wi128<u128>, 14, 14, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_15,
         Wi128<u128>, 15, 15, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_uint128_16,
         Wi128<u128>, 16, 16, read_uint128, write_uint128);
 
@@ -2552,52 +2618,52 @@
     qc_byte_order!(prop_int_8,
         i64, calc_max!(super::I64_MAX, 8), 8, read_int, write_int);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_1,
         Wi128<i128>, 1, 1, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_2,
         Wi128<i128>, 2, 2, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_3,
         Wi128<i128>, 3, 3, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_4,
         Wi128<i128>, 4, 4, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_5,
         Wi128<i128>, 5, 5, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_6,
         Wi128<i128>, 6, 6, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_7,
         Wi128<i128>, 7, 7, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_8,
         Wi128<i128>, 8, 8, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_9,
         Wi128<i128>, 9, 9, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_10,
         Wi128<i128>, 10, 10, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_11,
         Wi128<i128>, 11, 11, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_12,
         Wi128<i128>, 12, 12, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_13,
         Wi128<i128>, 13, 13, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_14,
         Wi128<i128>, 14, 14, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_15,
         Wi128<i128>, 15, 15, read_int128, write_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_byte_order!(prop_int128_16,
         Wi128<i128>, 16, 16, read_int128, write_int128);
 
@@ -2692,9 +2758,9 @@
     too_small!(small_i64, 7, 0, read_i64, write_i64);
     too_small!(small_f32, 3, 0.0, read_f32, write_f32);
     too_small!(small_f64, 7, 0.0, read_f64, write_f64);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_u128, 15, 0, read_u128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_i128, 15, 0, read_i128, write_i128);
 
     too_small!(small_uint_1, 1, read_uint);
@@ -2705,35 +2771,35 @@
     too_small!(small_uint_6, 6, read_uint);
     too_small!(small_uint_7, 7, read_uint);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_1, 1, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_2, 2, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_3, 3, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_4, 4, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_5, 5, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_6, 6, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_7, 7, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_8, 8, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_9, 9, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_10, 10, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_11, 11, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_12, 12, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_13, 13, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_14, 14, read_uint128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_uint128_15, 15, read_uint128);
 
     too_small!(small_int_1, 1, read_int);
@@ -2744,35 +2810,35 @@
     too_small!(small_int_6, 6, read_int);
     too_small!(small_int_7, 7, read_int);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_1, 1, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_2, 2, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_3, 3, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_4, 4, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_5, 5, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_6, 6, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_7, 7, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_8, 8, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_9, 9, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_10, 10, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_11, 11, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_12, 12, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_13, 13, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_14, 14, read_int128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     too_small!(small_int128_15, 15, read_int128);
 
     // Test that reading/writing slices enforces the correct lengths.
@@ -2860,16 +2926,16 @@
     slice_lengths!(
         slice_len_too_big_i64, read_i64_into, write_i64_into, 17, [0, 0]);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     slice_lengths!(
         slice_len_too_small_u128, read_u128_into, write_u128_into, 31, [0, 0]);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     slice_lengths!(
         slice_len_too_big_u128, read_u128_into, write_u128_into, 33, [0, 0]);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     slice_lengths!(
         slice_len_too_small_i128, read_i128_into, write_i128_into, 31, [0, 0]);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     slice_lengths!(
         slice_len_too_big_i128, read_i128_into, write_i128_into, 33, [0, 0]);
 
@@ -3016,9 +3082,9 @@
     qc_bytes_ext!(prop_ext_f64,
         f64, ::std::i64::MAX as u64, read_f64, write_f64);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
 
     qc_bytes_ext!(prop_ext_uint_1,
@@ -3038,52 +3104,52 @@
     qc_bytes_ext!(prop_ext_uint_8,
         u64, calc_max!(::test::U64_MAX, 8), 8, read_uint, write_u64);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_1,
         Wi128<u128>, 1, 1, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_2,
         Wi128<u128>, 2, 2, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_3,
         Wi128<u128>, 3, 3, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_4,
         Wi128<u128>, 4, 4, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_5,
         Wi128<u128>, 5, 5, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_6,
         Wi128<u128>, 6, 6, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_7,
         Wi128<u128>, 7, 7, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_8,
         Wi128<u128>, 8, 8, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_9,
         Wi128<u128>, 9, 9, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_10,
         Wi128<u128>, 10, 10, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_11,
         Wi128<u128>, 11, 11, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_12,
         Wi128<u128>, 12, 12, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_13,
         Wi128<u128>, 13, 13, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_14,
         Wi128<u128>, 14, 14, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_15,
         Wi128<u128>, 15, 15, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_uint128_16,
         Wi128<u128>, 16, 16, read_uint128, write_u128);
 
@@ -3104,52 +3170,52 @@
     qc_bytes_ext!(prop_ext_int_8,
         i64, calc_max!(::test::I64_MAX, 8), 8, read_int, write_i64);
 
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_1,
         Wi128<i128>, 1, 1, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_2,
         Wi128<i128>, 2, 2, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_3,
         Wi128<i128>, 3, 3, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_4,
         Wi128<i128>, 4, 4, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_5,
         Wi128<i128>, 5, 5, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_6,
         Wi128<i128>, 6, 6, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_7,
         Wi128<i128>, 7, 7, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_8,
         Wi128<i128>, 8, 8, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_9,
         Wi128<i128>, 9, 9, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_10,
         Wi128<i128>, 10, 10, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_11,
         Wi128<i128>, 11, 11, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_12,
         Wi128<i128>, 12, 12, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_13,
         Wi128<i128>, 13, 13, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_14,
         Wi128<i128>, 14, 14, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_15,
         Wi128<i128>, 15, 15, read_int128, write_i128);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_bytes_ext!(prop_ext_int128_16,
         Wi128<i128>, 16, 16, read_int128, write_i128);
 
@@ -3235,15 +3301,15 @@
     qc_slice!(prop_slice_i32, i32, read_i32_into, write_i32_into, 0);
     qc_slice!(prop_slice_u64, u64, read_u64_into, write_u64_into, 0);
     qc_slice!(prop_slice_i64, i64, read_i64_into, write_i64_into, 0);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_slice!(
         prop_slice_u128, Wi128<u128>, read_u128_into, write_u128_into, 0);
-    #[cfg(feature = "i128")]
+    #[cfg(byteorder_i128)]
     qc_slice!(
         prop_slice_i128, Wi128<i128>, read_i128_into, write_i128_into, 0);
 
     qc_slice!(
-        prop_slice_f32, f32, read_f32_into_unchecked, write_f32_into, 0.0);
+        prop_slice_f32, f32, read_f32_into, write_f32_into, 0.0);
     qc_slice!(
-        prop_slice_f64, f64, read_f64_into_unchecked, write_f64_into, 0.0);
+        prop_slice_f64, f64, read_f64_into, write_f64_into, 0.0);
 }
diff --git a/rustc_deps/vendor/crossbeam-channel/.cargo-checksum.json b/rustc_deps/vendor/crossbeam-channel/.cargo-checksum.json
index b1e27ff..a39e37d 100644
--- a/rustc_deps/vendor/crossbeam-channel/.cargo-checksum.json
+++ b/rustc_deps/vendor/crossbeam-channel/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"edceffaca1184a7dea2d532eb8ab5465184d6a9efa9553c8c89e121a4dfc631c","Cargo.toml":"99221e400e9c2fbe4a91e500665f316642995547141fab41315763e472bd26cc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","LICENSE-THIRD-PARTY":"924a49392dc8304def57586be4ebd69aaf51e16fd245b55b4b69ad2cce6b715a","README.md":"92ed40ba03c4613e20eaa2e6197c21a33eb63332f33997836866d1423fe3983f","examples/fibonacci.rs":"8755bcb9cf05e391d8679fbb51db40ed9692703c3b66341cd1c1e4cca2068874","examples/matching.rs":"1fd35488bf42e1782a339b9691a4e82dcf23ad12502809e33555d46c91739476","examples/stopwatch.rs":"4e90ce134475859a421da0a095baea52a575b03e41fb8fb50cf47446f422ee6e","src/channel.rs":"9ef721e79ba789e52323a768e4ebb86035730e4efdca6832a75f7f3a50514665","src/context.rs":"5b544d2e5f613ee6c8eafffc5bce7221a7937d5c033dda8325a36ac85c30d521","src/err.rs":"2e268a32b14ec0a71db7c6417a9db103e311037b6ef1e93150e49c80153d0d1a","src/flavors/after.rs":"391599d3470e8fefabaee78d7090bb94da6617cb5ba06956e83a7d276114e1cf","src/flavors/array.rs":"73fd7053fc47f478540cee9c8c2d5a99876ff8f5e8c96b13a37494b1ebbad808","src/flavors/list.rs":"928ef7f5b89c740f3def89ca2638c25d40f4a16ad2998abbd693184889f91218","src/flavors/mod.rs":"a5af9b6105207e293c0d64928b4486fb1da9bfe0318354c66c8b5069e41ec31f","src/flavors/never.rs":"2c62b2fc3317d633873eee2da5889ed7b4a31215d22139ad23251820ca659c73","src/flavors/tick.rs":"76166135efca426bcb1934001a2da3fe9ad1630a790841d625941f17546b2ff1","src/flavors/zero.rs":"bcadc004f5cd6d3d3d30a898df815ccba43001023a79aee4cc6652fcb4f9d527","src/lib.rs":"de638d0c5a81ed548aa1c2182f0e5485679ad2434bcd7fdaca4a7e2827000125","src/select.rs":"b129a5c1e348998120773a715ddcbee00734337b4d4de1649080ef37aca5c287","src/select_macro.rs":"e8f3998ab86f54e46acaa48bd6bba9b2e955ed11710d23c46f256295575fd638","src/utils.rs":"4c5ec733405c6001140ff50ba85df475b12c911ff1b6ea6f738eca30322f0c4d","src/waker.rs":"5f08aaa6c62a10b447705b4da31380b1fc055ba07f03a9ee50f274d0525e3a40","tests/after.rs":"9336716edbb6e3145f006e62af59a4e82160ecfb8748fac174b844fb81442d45","tests/array.rs":"14199ccf34d93b640311b55300ef6ea9fe7119d9c61500c7ac2719727f6b107e","tests/golang.rs":"22c4532f0d6ec3098fdfaeae0a9a2fb6e32ea7af42ab599c1bd8bd1def13d6e0","tests/iter.rs":"4103344c25c0211b4ffca0201514e6fc856fb15698451d2000dfd0ba3ba94105","tests/list.rs":"5fd2e5ff1494540a8963942d12bc8748ccfa08992a8d225b2c17184b3d9dd3a3","tests/mpsc.rs":"d268beb7bcb0be864bdb745585979c97343b82761705907fd90b0ec85f2db7d4","tests/never.rs":"cd455a4c78403d9a96fe0f3a4e968164cca533cc85c96aaa4558987f9b088fcc","tests/ready.rs":"acc6f30eaffa655af7b38f072dab60fa9e9680b94c8612ab6f12292768b52745","tests/select.rs":"bb2cd44d712c8211f8eb3adc0449988b9c9e81263d36f378258d5cfcaba82742","tests/select_macro.rs":"e307434b4de66b88b36096ac22732f480b3b823be92802d1425e91a89dcd8f7e","tests/thread_locals.rs":"14e57e8e031f9ebc98e9f734926b2dea3e320adb5fad40fd227c1630aa661878","tests/tick.rs":"011c39a85f1e0427e61e7afc0860cf6dc29d41f7e8be9709684e4ffdc26ef9b8","tests/zero.rs":"48092f8c4aaac17138816be5f3e6bfe5b216173fae8a3b7126a4b88c6c7d8378"},"package":"137bc235f622ffaa0428e3854e24acb53291fc0b3ff6fb2cb75a8be6fb02f06b"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"e3f2e919beea9c6641fdd62fa1567cb63a894836c814f3a85b802273909d44c4","Cargo.toml":"120ad305158b75139456a66abb44ef3a191fee44b9b29e209a5bb52e7887cd28","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","LICENSE-THIRD-PARTY":"924a49392dc8304def57586be4ebd69aaf51e16fd245b55b4b69ad2cce6b715a","README.md":"077c5ddbd471d4a21f5b183e415b708e5100fcad8baed335fd4ad5b6f959a8be","examples/fibonacci.rs":"8755bcb9cf05e391d8679fbb51db40ed9692703c3b66341cd1c1e4cca2068874","examples/matching.rs":"1fd35488bf42e1782a339b9691a4e82dcf23ad12502809e33555d46c91739476","examples/stopwatch.rs":"4e90ce134475859a421da0a095baea52a575b03e41fb8fb50cf47446f422ee6e","src/channel.rs":"4d398567823e2e8189de91d67ef58e4b61d1b8d3f1e373da2664ed40ae154717","src/context.rs":"8480d39c053f7533838fdf9cae019d1a5218a146ea071f1a89f2be8f625ef992","src/counter.rs":"3a9c1b0fa94beeabd349789ca94453f0cb3aa67f5d56bc619a7e029956fd3dbf","src/err.rs":"1a9ac9d7f4d5561f9c3e513b2f776782783954efa0bf9428598f3ad9ccb9d5c9","src/flavors/after.rs":"4f761618efe21036145e44f01506bdfbc2524879368ac138600e0feed921a6a7","src/flavors/array.rs":"5155741d55b40715f3c65bf19c106b3f73476f4e77de877b14fb3a2ff53a4631","src/flavors/list.rs":"fef0ae43b96a321961f73e466cdb0aa06afed8597d34bac30795dc14a1908849","src/flavors/mod.rs":"a5af9b6105207e293c0d64928b4486fb1da9bfe0318354c66c8b5069e41ec31f","src/flavors/never.rs":"86e21b4d8b154e5d795cf72c7203a1d16a846c4d670095c8b592c12569f35a98","src/flavors/tick.rs":"3ae19df71310972e7b5fd8cac17d90bff683e1493ed3db26d0d3d329dff133ff","src/flavors/zero.rs":"cae6eb914d36e58810704d7200b1dc90ff6cc03b23a97fa3ac04fbd00f18381a","src/lib.rs":"bc843b55c65d3a20ad1fc56da675e48232af5373339f2e513b4f6d4460e0000d","src/select.rs":"2e1655da701253388949a6e9d6cc30d3f65481d5e071222ede7fba2a9312c0ba","src/select_macro.rs":"e8f3998ab86f54e46acaa48bd6bba9b2e955ed11710d23c46f256295575fd638","src/utils.rs":"ebf230fed429c353f6202fe10c33dcca69a0917a947665a7ee03d230b88a29bf","src/waker.rs":"e85114e43a4db4befadd79b574c2567f3076e460791c2ea6b9588ee824d2c988","tests/after.rs":"9336716edbb6e3145f006e62af59a4e82160ecfb8748fac174b844fb81442d45","tests/array.rs":"1e87f8e2e75dcbaf0dbc75394cfa329c0fd5719db0bdb9ba2aa0cc86b2a18044","tests/golang.rs":"08c13a4fafd25da03809f20965203e4e88bdf936ff53342f2e43430e6603d3fa","tests/iter.rs":"3beaac492a9df39d2eae31d7cdb88f4ee3bd3cb57e2c5c9705811b8ee2abe744","tests/list.rs":"0a664517f3ff49e0885f6c649cbc76f5e5c7a4940096d7a1c98728cbe1655948","tests/mpsc.rs":"d268beb7bcb0be864bdb745585979c97343b82761705907fd90b0ec85f2db7d4","tests/never.rs":"cd455a4c78403d9a96fe0f3a4e968164cca533cc85c96aaa4558987f9b088fcc","tests/ready.rs":"7bc0dd86cd987dcae7db84c9f4379a2421e088b4e5dbdc07affb10c853fc7f55","tests/select.rs":"1ace0bbd2aecf488827d2c16d5d32b47baf00b0a1f7f7470bf9c8e16ddf92dad","tests/select_macro.rs":"d303abb0a3f7ff9bb3b5253951d7d17bfb30e4f77fb66d11c40a063691f9a9ae","tests/thread_locals.rs":"e9d25086d4bc590bacdaf20b5ff0ff3741d3403a413a8b817eaf15f61fb5e644","tests/tick.rs":"011c39a85f1e0427e61e7afc0860cf6dc29d41f7e8be9709684e4ffdc26ef9b8","tests/zero.rs":"983998a52173fba22045fb8390566a59ebb0392834477ab94cac934d637a3231"},"package":"0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/crossbeam-channel/CHANGELOG.md b/rustc_deps/vendor/crossbeam-channel/CHANGELOG.md
index 11ce17f..0cffdbc 100644
--- a/rustc_deps/vendor/crossbeam-channel/CHANGELOG.md
+++ b/rustc_deps/vendor/crossbeam-channel/CHANGELOG.md
@@ -1,3 +1,16 @@
+# Version 0.3.8
+
+- Bump the minimum required version of `crossbeam-utils`.
+
+# Version 0.3.7
+
+- Remove `parking_lot` and `rand` dependencies.
+- Expand documentation.
+- Implement `Default` for `Select`.
+- Make `size_of::<Receiver<T>>()` smaller.
+- Several minor optimizations.
+- Add more tests.
+
 # Version 0.3.6
 
 - Fix a bug in initialization of unbounded channels.
diff --git a/rustc_deps/vendor/crossbeam-channel/Cargo.toml b/rustc_deps/vendor/crossbeam-channel/Cargo.toml
index 99bc20c..42a0785 100644
--- a/rustc_deps/vendor/crossbeam-channel/Cargo.toml
+++ b/rustc_deps/vendor/crossbeam-channel/Cargo.toml
@@ -12,10 +12,10 @@
 
 [package]
 name = "crossbeam-channel"
-version = "0.3.6"
+version = "0.3.8"
 authors = ["The Crossbeam Project Developers"]
 description = "Multi-producer multi-consumer channels for message passing"
-homepage = "https://github.com/crossbeam-rs/crossbeam"
+homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-channel"
 documentation = "https://docs.rs/crossbeam-channel"
 readme = "README.md"
 keywords = ["channel", "mpmc", "select", "golang", "message"]
@@ -23,18 +23,12 @@
 license = "MIT/Apache-2.0"
 repository = "https://github.com/crossbeam-rs/crossbeam"
 [dependencies.crossbeam-utils]
-version = "0.6.3"
-
-[dependencies.parking_lot]
-version = "0.7"
-
-[dependencies.rand]
-version = "0.6"
+version = "0.6.5"
 
 [dependencies.smallvec]
 version = "0.6.2"
-[dev-dependencies.crossbeam]
-version = "0.5.0"
+[dev-dependencies.rand]
+version = "0.6"
 
 [dev-dependencies.signal-hook]
 version = "0.1.5"
diff --git a/rustc_deps/vendor/crossbeam-channel/README.md b/rustc_deps/vendor/crossbeam-channel/README.md
index 15d03d9..39f1e21 100644
--- a/rustc_deps/vendor/crossbeam-channel/README.md
+++ b/rustc_deps/vendor/crossbeam-channel/README.md
@@ -16,14 +16,23 @@
 
 Some highlights:
 
-* `Sender`s and `Receiver`s can be cloned and shared among threads.
-* Two main kinds of channels are `unbounded` and `bounded`.
-* Convenient extra channels like `after`, `never`, and `tick`.
-* The `select!` macro can block on multiple channel operations.
-* `Select` can select over a dynamically built list of channel operations.
+* [`Sender`]s and [`Receiver`]s can be cloned and shared among threads.
+* Two main kinds of channels are [`bounded`] and [`unbounded`].
+* Convenient extra channels like [`after`], [`never`], and [`tick`].
+* The [`select!`] macro can block on multiple channel operations.
+* [`Select`] can select over a dynamically built list of channel operations.
 * Channels use locks very sparingly for maximum [performance](benchmarks).
 
 [`std::sync::mpsc`]: https://doc.rust-lang.org/std/sync/mpsc/index.html
+[`Sender`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/struct.Sender.html
+[`Receiver`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/struct.Receiver.html
+[`bounded`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.bounded.html
+[`unbounded`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.unbounded.html
+[`after`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.after.html
+[`never`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.never.html
+[`tick`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.tick.html
+[`select!`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/macro.select.html
+[`Select`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/struct.Select.html
 
 ## Usage
 
@@ -41,12 +50,6 @@
 extern crate crossbeam_channel;
 ```
 
-## Compatibility
-
-The minimum supported Rust version is 1.26.
-
-This crate does not work in `no_std` environments.
-
 ## License
 
 Licensed under either of
@@ -56,13 +59,13 @@
 
 at your option.
 
-### Contribution
+#### Contribution
 
 Unless you explicitly state otherwise, any contribution intentionally submitted
 for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
 dual licensed as above, without any additional terms or conditions.
 
-### Third party software
+#### Third party software
 
 This product includes copies and modifications of software developed by third parties:
 
diff --git a/rustc_deps/vendor/crossbeam-channel/src/channel.rs b/rustc_deps/vendor/crossbeam-channel/src/channel.rs
index 8e56bd3..e71b22b 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/channel.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/channel.rs
@@ -1,44 +1,18 @@
 //! The channel interface.
 
 use std::fmt;
-use std::isize;
 use std::iter::FusedIterator;
 use std::mem;
 use std::panic::{RefUnwindSafe, UnwindSafe};
-use std::process;
-use std::sync::atomic::{AtomicUsize, Ordering};
 use std::sync::Arc;
 use std::time::{Duration, Instant};
 
 use context::Context;
+use counter;
 use err::{RecvError, RecvTimeoutError, SendError, SendTimeoutError, TryRecvError, TrySendError};
 use flavors;
 use select::{Operation, SelectHandle, Token};
 
-/// A channel in the form of one of the three different flavors.
-pub struct Channel<T> {
-    /// The number of senders associated with this channel.
-    senders: AtomicUsize,
-
-    /// The number of receivers associated with this channel.
-    receivers: AtomicUsize,
-
-    /// This channel's flavor.
-    flavor: ChannelFlavor<T>,
-}
-
-/// Channel flavors.
-enum ChannelFlavor<T> {
-    /// Bounded channel based on a preallocated array.
-    Array(flavors::array::Channel<T>),
-
-    /// Unbounded channel implemented as a linked list.
-    List(flavors::list::Channel<T>),
-
-    /// Zero-capacity channel.
-    Zero(flavors::zero::Channel<T>),
-}
-
 /// Creates a channel of unbounded capacity.
 ///
 /// This channel has a growable buffer that can hold any number of messages at a time.
@@ -67,14 +41,13 @@
 /// println!("{}", r.recv().unwrap());
 /// ```
 pub fn unbounded<T>() -> (Sender<T>, Receiver<T>) {
-    let chan = Arc::new(Channel {
-        senders: AtomicUsize::new(0),
-        receivers: AtomicUsize::new(0),
-        flavor: ChannelFlavor::List(flavors::list::Channel::new()),
-    });
-
-    let s = Sender::new(chan.clone());
-    let r = Receiver::new(chan);
+    let (s, r) = counter::new(flavors::list::Channel::new());
+    let s = Sender {
+        flavor: SenderFlavor::List(s),
+    };
+    let r = Receiver {
+        flavor: ReceiverFlavor::List(r),
+    };
     (s, r)
 }
 
@@ -133,21 +106,25 @@
 /// assert_eq!(r.recv(), Ok(1));
 /// ```
 pub fn bounded<T>(cap: usize) -> (Sender<T>, Receiver<T>) {
-    let chan = Arc::new(Channel {
-        senders: AtomicUsize::new(0),
-        receivers: AtomicUsize::new(0),
-        flavor: {
-            if cap == 0 {
-                ChannelFlavor::Zero(flavors::zero::Channel::new())
-            } else {
-                ChannelFlavor::Array(flavors::array::Channel::with_capacity(cap))
-            }
-        },
-    });
-
-    let s = Sender::new(chan.clone());
-    let r = Receiver::new(chan);
-    (s, r)
+    if cap == 0 {
+        let (s, r) = counter::new(flavors::zero::Channel::new());
+        let s = Sender {
+            flavor: SenderFlavor::Zero(s),
+        };
+        let r = Receiver {
+            flavor: ReceiverFlavor::Zero(r),
+        };
+        (s, r)
+    } else {
+        let (s, r) = counter::new(flavors::array::Channel::with_capacity(cap));
+        let s = Sender {
+            flavor: SenderFlavor::Array(s),
+        };
+        let r = Receiver {
+            flavor: ReceiverFlavor::Array(r),
+        };
+        (s, r)
+    }
 }
 
 /// Creates a receiver that delivers a message after a certain duration of time.
@@ -201,7 +178,7 @@
 /// ```
 pub fn after(duration: Duration) -> Receiver<Instant> {
     Receiver {
-        flavor: ReceiverFlavor::After(flavors::after::Channel::new(duration)),
+        flavor: ReceiverFlavor::After(Arc::new(flavors::after::Channel::new(duration))),
     }
 }
 
@@ -228,7 +205,7 @@
 ///     s.send(1).unwrap();
 /// });
 ///
-/// // This duration can be a `Some` or a `None`.
+/// // Suppose this duration can be a `Some` or a `None`.
 /// let duration = Some(Duration::from_millis(100));
 ///
 /// // Create a channel that times out after the specified duration.
@@ -305,7 +282,7 @@
 /// ```
 pub fn tick(duration: Duration) -> Receiver<Instant> {
     Receiver {
-        flavor: ReceiverFlavor::Tick(flavors::tick::Channel::new(duration)),
+        flavor: ReceiverFlavor::Tick(Arc::new(flavors::tick::Channel::new(duration))),
     }
 }
 
@@ -329,7 +306,19 @@
 /// assert_eq!(msg1 + msg2, 3);
 /// ```
 pub struct Sender<T> {
-    inner: Arc<Channel<T>>,
+    flavor: SenderFlavor<T>,
+}
+
+/// Sender flavors.
+enum SenderFlavor<T> {
+    /// Bounded channel based on a preallocated array.
+    Array(counter::Sender<flavors::array::Channel<T>>),
+
+    /// Unbounded channel implemented as a linked list.
+    List(counter::Sender<flavors::list::Channel<T>>),
+
+    /// Zero-capacity channel.
+    Zero(counter::Sender<flavors::zero::Channel<T>>),
 }
 
 unsafe impl<T: Send> Send for Sender<T> {}
@@ -339,20 +328,6 @@
 impl<T> RefUnwindSafe for Sender<T> {}
 
 impl<T> Sender<T> {
-    /// Creates a sender handle for the channel and increments the sender count.
-    fn new(chan: Arc<Channel<T>>) -> Self {
-        let old_count = chan.senders.fetch_add(1, Ordering::SeqCst);
-
-        // Cloning senders and calling `mem::forget` on the clones could potentially overflow the
-        // counter. It's very difficult to recover sensibly from such degenerate scenarios so we
-        // just abort when the count becomes very large.
-        if old_count > isize::MAX as usize {
-            process::abort();
-        }
-
-        Sender { inner: chan }
-    }
-
     /// Attempts to send a message into the channel without blocking.
     ///
     /// This method will either send a message into the channel immediately or return an error if
@@ -375,10 +350,10 @@
     /// assert_eq!(s.try_send(3), Err(TrySendError::Disconnected(3)));
     /// ```
     pub fn try_send(&self, msg: T) -> Result<(), TrySendError<T>> {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.try_send(msg),
-            ChannelFlavor::List(chan) => chan.try_send(msg),
-            ChannelFlavor::Zero(chan) => chan.try_send(msg),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.try_send(msg),
+            SenderFlavor::List(chan) => chan.try_send(msg),
+            SenderFlavor::Zero(chan) => chan.try_send(msg),
         }
     }
 
@@ -411,10 +386,10 @@
     /// assert_eq!(s.send(3), Err(SendError(3)));
     /// ```
     pub fn send(&self, msg: T) -> Result<(), SendError<T>> {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.send(msg, None),
-            ChannelFlavor::List(chan) => chan.send(msg, None),
-            ChannelFlavor::Zero(chan) => chan.send(msg, None),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.send(msg, None),
+            SenderFlavor::List(chan) => chan.send(msg, None),
+            SenderFlavor::Zero(chan) => chan.send(msg, None),
         }.map_err(|err| match err {
             SendTimeoutError::Disconnected(msg) => SendError(msg),
             SendTimeoutError::Timeout(_) => unreachable!(),
@@ -461,10 +436,10 @@
     pub fn send_timeout(&self, msg: T, timeout: Duration) -> Result<(), SendTimeoutError<T>> {
         let deadline = Instant::now() + timeout;
 
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.send(msg, Some(deadline)),
-            ChannelFlavor::List(chan) => chan.send(msg, Some(deadline)),
-            ChannelFlavor::Zero(chan) => chan.send(msg, Some(deadline)),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.send(msg, Some(deadline)),
+            SenderFlavor::List(chan) => chan.send(msg, Some(deadline)),
+            SenderFlavor::Zero(chan) => chan.send(msg, Some(deadline)),
         }
     }
 
@@ -484,10 +459,10 @@
     /// assert!(!s.is_empty());
     /// ```
     pub fn is_empty(&self) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.is_empty(),
-            ChannelFlavor::List(chan) => chan.is_empty(),
-            ChannelFlavor::Zero(chan) => chan.is_empty(),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.is_empty(),
+            SenderFlavor::List(chan) => chan.is_empty(),
+            SenderFlavor::Zero(chan) => chan.is_empty(),
         }
     }
 
@@ -507,10 +482,10 @@
     /// assert!(s.is_full());
     /// ```
     pub fn is_full(&self) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.is_full(),
-            ChannelFlavor::List(chan) => chan.is_full(),
-            ChannelFlavor::Zero(chan) => chan.is_full(),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.is_full(),
+            SenderFlavor::List(chan) => chan.is_full(),
+            SenderFlavor::Zero(chan) => chan.is_full(),
         }
     }
 
@@ -529,10 +504,10 @@
     /// assert_eq!(s.len(), 2);
     /// ```
     pub fn len(&self) -> usize {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.len(),
-            ChannelFlavor::List(chan) => chan.len(),
-            ChannelFlavor::Zero(chan) => chan.len(),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.len(),
+            SenderFlavor::List(chan) => chan.len(),
+            SenderFlavor::Zero(chan) => chan.len(),
         }
     }
 
@@ -553,21 +528,21 @@
     /// assert_eq!(s.capacity(), Some(0));
     /// ```
     pub fn capacity(&self) -> Option<usize> {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.capacity(),
-            ChannelFlavor::List(chan) => chan.capacity(),
-            ChannelFlavor::Zero(chan) => chan.capacity(),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.capacity(),
+            SenderFlavor::List(chan) => chan.capacity(),
+            SenderFlavor::Zero(chan) => chan.capacity(),
         }
     }
 }
 
 impl<T> Drop for Sender<T> {
     fn drop(&mut self) {
-        if self.inner.senders.fetch_sub(1, Ordering::SeqCst) == 1 {
-            match &self.inner.flavor {
-                ChannelFlavor::Array(chan) => chan.disconnect(),
-                ChannelFlavor::List(chan) => chan.disconnect(),
-                ChannelFlavor::Zero(chan) => chan.disconnect(),
+        unsafe {
+            match &self.flavor {
+                SenderFlavor::Array(chan) => chan.release(|c| c.disconnect()),
+                SenderFlavor::List(chan) => chan.release(|c| c.disconnect()),
+                SenderFlavor::Zero(chan) => chan.release(|c| c.disconnect()),
             }
         }
     }
@@ -575,7 +550,13 @@
 
 impl<T> Clone for Sender<T> {
     fn clone(&self) -> Self {
-        Sender::new(self.inner.clone())
+        let flavor = match &self.flavor {
+            SenderFlavor::Array(chan) => SenderFlavor::Array(chan.acquire()),
+            SenderFlavor::List(chan) => SenderFlavor::List(chan.acquire()),
+            SenderFlavor::Zero(chan) => SenderFlavor::Zero(chan.acquire()),
+        };
+
+        Sender { flavor }
     }
 }
 
@@ -610,15 +591,21 @@
 }
 
 /// Receiver flavors.
-pub enum ReceiverFlavor<T> {
-    /// A regular channel (array, list, or zero flavor).
-    Channel(Arc<Channel<T>>),
+enum ReceiverFlavor<T> {
+    /// Bounded channel based on a preallocated array.
+    Array(counter::Receiver<flavors::array::Channel<T>>),
+
+    /// Unbounded channel implemented as a linked list.
+    List(counter::Receiver<flavors::list::Channel<T>>),
+
+    /// Zero-capacity channel.
+    Zero(counter::Receiver<flavors::zero::Channel<T>>),
 
     /// The after flavor.
-    After(flavors::after::Channel),
+    After(Arc<flavors::after::Channel>),
 
     /// The tick flavor.
-    Tick(flavors::tick::Channel),
+    Tick(Arc<flavors::tick::Channel>),
 
     /// The never flavor.
     Never(flavors::never::Channel<T>),
@@ -631,22 +618,6 @@
 impl<T> RefUnwindSafe for Receiver<T> {}
 
 impl<T> Receiver<T> {
-    /// Creates a receiver handle for the channel and increments the receiver count.
-    fn new(chan: Arc<Channel<T>>) -> Self {
-        let old_count = chan.receivers.fetch_add(1, Ordering::SeqCst);
-
-        // Cloning receivers and calling `mem::forget` on the clones could potentially overflow the
-        // counter. It's very difficult to recover sensibly from such degenerate scenarios so we
-        // just abort when the count becomes very large.
-        if old_count > isize::MAX as usize {
-            process::abort();
-        }
-
-        Receiver {
-            flavor: ReceiverFlavor::Channel(chan),
-        }
-    }
-
     /// Attempts to receive a message from the channel without blocking.
     ///
     /// This method will either receive a message from the channel immediately or return an error
@@ -671,11 +642,9 @@
     /// ```
     pub fn try_recv(&self) -> Result<T, TryRecvError> {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.try_recv(),
-                ChannelFlavor::List(chan) => chan.try_recv(),
-                ChannelFlavor::Zero(chan) => chan.try_recv(),
-            },
+            ReceiverFlavor::Array(chan) => chan.try_recv(),
+            ReceiverFlavor::List(chan) => chan.try_recv(),
+            ReceiverFlavor::Zero(chan) => chan.try_recv(),
             ReceiverFlavor::After(chan) => {
                 let msg = chan.try_recv();
                 unsafe {
@@ -726,11 +695,9 @@
     /// ```
     pub fn recv(&self) -> Result<T, RecvError> {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.recv(None),
-                ChannelFlavor::List(chan) => chan.recv(None),
-                ChannelFlavor::Zero(chan) => chan.recv(None),
-            },
+            ReceiverFlavor::Array(chan) => chan.recv(None),
+            ReceiverFlavor::List(chan) => chan.recv(None),
+            ReceiverFlavor::Zero(chan) => chan.recv(None),
             ReceiverFlavor::After(chan) => {
                 let msg = chan.recv(None);
                 unsafe {
@@ -794,11 +761,9 @@
         let deadline = Instant::now() + timeout;
 
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.recv(Some(deadline)),
-                ChannelFlavor::List(chan) => chan.recv(Some(deadline)),
-                ChannelFlavor::Zero(chan) => chan.recv(Some(deadline)),
-            },
+            ReceiverFlavor::Array(chan) => chan.recv(Some(deadline)),
+            ReceiverFlavor::List(chan) => chan.recv(Some(deadline)),
+            ReceiverFlavor::Zero(chan) => chan.recv(Some(deadline)),
             ReceiverFlavor::After(chan) => {
                 let msg = chan.recv(Some(deadline));
                 unsafe {
@@ -838,11 +803,9 @@
     /// ```
     pub fn is_empty(&self) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.is_empty(),
-                ChannelFlavor::List(chan) => chan.is_empty(),
-                ChannelFlavor::Zero(chan) => chan.is_empty(),
-            },
+            ReceiverFlavor::Array(chan) => chan.is_empty(),
+            ReceiverFlavor::List(chan) => chan.is_empty(),
+            ReceiverFlavor::Zero(chan) => chan.is_empty(),
             ReceiverFlavor::After(chan) => chan.is_empty(),
             ReceiverFlavor::Tick(chan) => chan.is_empty(),
             ReceiverFlavor::Never(chan) => chan.is_empty(),
@@ -866,11 +829,9 @@
     /// ```
     pub fn is_full(&self) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.is_full(),
-                ChannelFlavor::List(chan) => chan.is_full(),
-                ChannelFlavor::Zero(chan) => chan.is_full(),
-            },
+            ReceiverFlavor::Array(chan) => chan.is_full(),
+            ReceiverFlavor::List(chan) => chan.is_full(),
+            ReceiverFlavor::Zero(chan) => chan.is_full(),
             ReceiverFlavor::After(chan) => chan.is_full(),
             ReceiverFlavor::Tick(chan) => chan.is_full(),
             ReceiverFlavor::Never(chan) => chan.is_full(),
@@ -893,11 +854,9 @@
     /// ```
     pub fn len(&self) -> usize {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.len(),
-                ChannelFlavor::List(chan) => chan.len(),
-                ChannelFlavor::Zero(chan) => chan.len(),
-            },
+            ReceiverFlavor::Array(chan) => chan.len(),
+            ReceiverFlavor::List(chan) => chan.len(),
+            ReceiverFlavor::Zero(chan) => chan.len(),
             ReceiverFlavor::After(chan) => chan.len(),
             ReceiverFlavor::Tick(chan) => chan.len(),
             ReceiverFlavor::Never(chan) => chan.len(),
@@ -922,11 +881,9 @@
     /// ```
     pub fn capacity(&self) -> Option<usize> {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.capacity(),
-                ChannelFlavor::List(chan) => chan.capacity(),
-                ChannelFlavor::Zero(chan) => chan.capacity(),
-            },
+            ReceiverFlavor::Array(chan) => chan.capacity(),
+            ReceiverFlavor::List(chan) => chan.capacity(),
+            ReceiverFlavor::Zero(chan) => chan.capacity(),
             ReceiverFlavor::After(chan) => chan.capacity(),
             ReceiverFlavor::Tick(chan) => chan.capacity(),
             ReceiverFlavor::Never(chan) => chan.capacity(),
@@ -1005,13 +962,14 @@
 
 impl<T> Drop for Receiver<T> {
     fn drop(&mut self) {
-        if let ReceiverFlavor::Channel(chan) = &self.flavor {
-            if chan.receivers.fetch_sub(1, Ordering::SeqCst) == 1 {
-                match &chan.flavor {
-                    ChannelFlavor::Array(chan) => chan.disconnect(),
-                    ChannelFlavor::List(chan) => chan.disconnect(),
-                    ChannelFlavor::Zero(chan) => chan.disconnect(),
-                }
+        unsafe {
+            match &self.flavor {
+                ReceiverFlavor::Array(chan) => chan.release(|c| c.disconnect()),
+                ReceiverFlavor::List(chan) => chan.release(|c| c.disconnect()),
+                ReceiverFlavor::Zero(chan) => chan.release(|c| c.disconnect()),
+                ReceiverFlavor::After(_) => {},
+                ReceiverFlavor::Tick(_) => {},
+                ReceiverFlavor::Never(_) => {},
             }
         }
     }
@@ -1019,18 +977,16 @@
 
 impl<T> Clone for Receiver<T> {
     fn clone(&self) -> Self {
-        match &self.flavor {
-            ReceiverFlavor::Channel(arc) => Receiver::new(arc.clone()),
-            ReceiverFlavor::After(chan) => Receiver {
-                flavor: ReceiverFlavor::After(chan.clone()),
-            },
-            ReceiverFlavor::Tick(chan) => Receiver {
-                flavor: ReceiverFlavor::Tick(chan.clone()),
-            },
-            ReceiverFlavor::Never(chan) => Receiver {
-                flavor: ReceiverFlavor::Never(chan.clone()),
-            },
-        }
+        let flavor = match &self.flavor {
+            ReceiverFlavor::Array(chan) => ReceiverFlavor::Array(chan.acquire()),
+            ReceiverFlavor::List(chan) => ReceiverFlavor::List(chan.acquire()),
+            ReceiverFlavor::Zero(chan) => ReceiverFlavor::Zero(chan.acquire()),
+            ReceiverFlavor::After(chan) => ReceiverFlavor::After(chan.clone()),
+            ReceiverFlavor::Tick(chan) => ReceiverFlavor::Tick(chan.clone()),
+            ReceiverFlavor::Never(_) => ReceiverFlavor::Never(flavors::never::Channel::new()),
+        };
+
+        Receiver { flavor }
     }
 }
 
@@ -1208,10 +1164,10 @@
 
 impl<T> SelectHandle for Sender<T> {
     fn try_select(&self, token: &mut Token) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().try_select(token),
-            ChannelFlavor::List(chan) => chan.sender().try_select(token),
-            ChannelFlavor::Zero(chan) => chan.sender().try_select(token),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().try_select(token),
+            SenderFlavor::List(chan) => chan.sender().try_select(token),
+            SenderFlavor::Zero(chan) => chan.sender().try_select(token),
         }
     }
 
@@ -1220,50 +1176,50 @@
     }
 
     fn register(&self, oper: Operation, cx: &Context) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().register(oper, cx),
-            ChannelFlavor::List(chan) => chan.sender().register(oper, cx),
-            ChannelFlavor::Zero(chan) => chan.sender().register(oper, cx),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().register(oper, cx),
+            SenderFlavor::List(chan) => chan.sender().register(oper, cx),
+            SenderFlavor::Zero(chan) => chan.sender().register(oper, cx),
         }
     }
 
     fn unregister(&self, oper: Operation) {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().unregister(oper),
-            ChannelFlavor::List(chan) => chan.sender().unregister(oper),
-            ChannelFlavor::Zero(chan) => chan.sender().unregister(oper),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().unregister(oper),
+            SenderFlavor::List(chan) => chan.sender().unregister(oper),
+            SenderFlavor::Zero(chan) => chan.sender().unregister(oper),
         }
     }
 
     fn accept(&self, token: &mut Token, cx: &Context) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().accept(token, cx),
-            ChannelFlavor::List(chan) => chan.sender().accept(token, cx),
-            ChannelFlavor::Zero(chan) => chan.sender().accept(token, cx),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().accept(token, cx),
+            SenderFlavor::List(chan) => chan.sender().accept(token, cx),
+            SenderFlavor::Zero(chan) => chan.sender().accept(token, cx),
         }
     }
 
     fn is_ready(&self) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().is_ready(),
-            ChannelFlavor::List(chan) => chan.sender().is_ready(),
-            ChannelFlavor::Zero(chan) => chan.sender().is_ready(),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().is_ready(),
+            SenderFlavor::List(chan) => chan.sender().is_ready(),
+            SenderFlavor::Zero(chan) => chan.sender().is_ready(),
         }
     }
 
     fn watch(&self, oper: Operation, cx: &Context) -> bool {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().watch(oper, cx),
-            ChannelFlavor::List(chan) => chan.sender().watch(oper, cx),
-            ChannelFlavor::Zero(chan) => chan.sender().watch(oper, cx),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().watch(oper, cx),
+            SenderFlavor::List(chan) => chan.sender().watch(oper, cx),
+            SenderFlavor::Zero(chan) => chan.sender().watch(oper, cx),
         }
     }
 
     fn unwatch(&self, oper: Operation) {
-        match &self.inner.flavor {
-            ChannelFlavor::Array(chan) => chan.sender().unwatch(oper),
-            ChannelFlavor::List(chan) => chan.sender().unwatch(oper),
-            ChannelFlavor::Zero(chan) => chan.sender().unwatch(oper),
+        match &self.flavor {
+            SenderFlavor::Array(chan) => chan.sender().unwatch(oper),
+            SenderFlavor::List(chan) => chan.sender().unwatch(oper),
+            SenderFlavor::Zero(chan) => chan.sender().unwatch(oper),
         }
     }
 }
@@ -1271,11 +1227,9 @@
 impl<T> SelectHandle for Receiver<T> {
     fn try_select(&self, token: &mut Token) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().try_select(token),
-                ChannelFlavor::List(chan) => chan.receiver().try_select(token),
-                ChannelFlavor::Zero(chan) => chan.receiver().try_select(token),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().try_select(token),
+            ReceiverFlavor::List(chan) => chan.receiver().try_select(token),
+            ReceiverFlavor::Zero(chan) => chan.receiver().try_select(token),
             ReceiverFlavor::After(chan) => chan.try_select(token),
             ReceiverFlavor::Tick(chan) => chan.try_select(token),
             ReceiverFlavor::Never(chan) => chan.try_select(token),
@@ -1284,7 +1238,9 @@
 
     fn deadline(&self) -> Option<Instant> {
         match &self.flavor {
-            ReceiverFlavor::Channel(_) => None,
+            ReceiverFlavor::Array(_) => None,
+            ReceiverFlavor::List(_) => None,
+            ReceiverFlavor::Zero(_) => None,
             ReceiverFlavor::After(chan) => chan.deadline(),
             ReceiverFlavor::Tick(chan) => chan.deadline(),
             ReceiverFlavor::Never(chan) => chan.deadline(),
@@ -1293,11 +1249,9 @@
 
     fn register(&self, oper: Operation, cx: &Context) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().register(oper, cx),
-                ChannelFlavor::List(chan) => chan.receiver().register(oper, cx),
-                ChannelFlavor::Zero(chan) => chan.receiver().register(oper, cx),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().register(oper, cx),
+            ReceiverFlavor::List(chan) => chan.receiver().register(oper, cx),
+            ReceiverFlavor::Zero(chan) => chan.receiver().register(oper, cx),
             ReceiverFlavor::After(chan) => chan.register(oper, cx),
             ReceiverFlavor::Tick(chan) => chan.register(oper, cx),
             ReceiverFlavor::Never(chan) => chan.register(oper, cx),
@@ -1306,11 +1260,9 @@
 
     fn unregister(&self, oper: Operation) {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().unregister(oper),
-                ChannelFlavor::List(chan) => chan.receiver().unregister(oper),
-                ChannelFlavor::Zero(chan) => chan.receiver().unregister(oper),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().unregister(oper),
+            ReceiverFlavor::List(chan) => chan.receiver().unregister(oper),
+            ReceiverFlavor::Zero(chan) => chan.receiver().unregister(oper),
             ReceiverFlavor::After(chan) => chan.unregister(oper),
             ReceiverFlavor::Tick(chan) => chan.unregister(oper),
             ReceiverFlavor::Never(chan) => chan.unregister(oper),
@@ -1319,11 +1271,9 @@
 
     fn accept(&self, token: &mut Token, cx: &Context) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().accept(token, cx),
-                ChannelFlavor::List(chan) => chan.receiver().accept(token, cx),
-                ChannelFlavor::Zero(chan) => chan.receiver().accept(token, cx),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().accept(token, cx),
+            ReceiverFlavor::List(chan) => chan.receiver().accept(token, cx),
+            ReceiverFlavor::Zero(chan) => chan.receiver().accept(token, cx),
             ReceiverFlavor::After(chan) => chan.accept(token, cx),
             ReceiverFlavor::Tick(chan) => chan.accept(token, cx),
             ReceiverFlavor::Never(chan) => chan.accept(token, cx),
@@ -1332,11 +1282,9 @@
 
     fn is_ready(&self) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().is_ready(),
-                ChannelFlavor::List(chan) => chan.receiver().is_ready(),
-                ChannelFlavor::Zero(chan) => chan.receiver().is_ready(),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().is_ready(),
+            ReceiverFlavor::List(chan) => chan.receiver().is_ready(),
+            ReceiverFlavor::Zero(chan) => chan.receiver().is_ready(),
             ReceiverFlavor::After(chan) => chan.is_ready(),
             ReceiverFlavor::Tick(chan) => chan.is_ready(),
             ReceiverFlavor::Never(chan) => chan.is_ready(),
@@ -1345,11 +1293,9 @@
 
     fn watch(&self, oper: Operation, cx: &Context) -> bool {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().watch(oper, cx),
-                ChannelFlavor::List(chan) => chan.receiver().watch(oper, cx),
-                ChannelFlavor::Zero(chan) => chan.receiver().watch(oper, cx),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().watch(oper, cx),
+            ReceiverFlavor::List(chan) => chan.receiver().watch(oper, cx),
+            ReceiverFlavor::Zero(chan) => chan.receiver().watch(oper, cx),
             ReceiverFlavor::After(chan) => chan.watch(oper, cx),
             ReceiverFlavor::Tick(chan) => chan.watch(oper, cx),
             ReceiverFlavor::Never(chan) => chan.watch(oper, cx),
@@ -1358,11 +1304,9 @@
 
     fn unwatch(&self, oper: Operation) {
         match &self.flavor {
-            ReceiverFlavor::Channel(arc) => match &arc.flavor {
-                ChannelFlavor::Array(chan) => chan.receiver().unwatch(oper),
-                ChannelFlavor::List(chan) => chan.receiver().unwatch(oper),
-                ChannelFlavor::Zero(chan) => chan.receiver().unwatch(oper),
-            },
+            ReceiverFlavor::Array(chan) => chan.receiver().unwatch(oper),
+            ReceiverFlavor::List(chan) => chan.receiver().unwatch(oper),
+            ReceiverFlavor::Zero(chan) => chan.receiver().unwatch(oper),
             ReceiverFlavor::After(chan) => chan.unwatch(oper),
             ReceiverFlavor::Tick(chan) => chan.unwatch(oper),
             ReceiverFlavor::Never(chan) => chan.unwatch(oper),
@@ -1372,21 +1316,19 @@
 
 /// Writes a message into the channel.
 pub unsafe fn write<T>(s: &Sender<T>, token: &mut Token, msg: T) -> Result<(), T> {
-    match &s.inner.flavor {
-        ChannelFlavor::Array(chan) => chan.write(token, msg),
-        ChannelFlavor::List(chan) => chan.write(token, msg),
-        ChannelFlavor::Zero(chan) => chan.write(token, msg),
+    match &s.flavor {
+        SenderFlavor::Array(chan) => chan.write(token, msg),
+        SenderFlavor::List(chan) => chan.write(token, msg),
+        SenderFlavor::Zero(chan) => chan.write(token, msg),
     }
 }
 
 /// Reads a message from the channel.
 pub unsafe fn read<T>(r: &Receiver<T>, token: &mut Token) -> Result<T, ()> {
     match &r.flavor {
-        ReceiverFlavor::Channel(arc) => match &arc.flavor {
-            ChannelFlavor::Array(chan) => chan.read(token),
-            ChannelFlavor::List(chan) => chan.read(token),
-            ChannelFlavor::Zero(chan) => chan.read(token),
-        },
+        ReceiverFlavor::Array(chan) => chan.read(token),
+        ReceiverFlavor::List(chan) => chan.read(token),
+        ReceiverFlavor::Zero(chan) => chan.read(token),
         ReceiverFlavor::After(chan) => {
             mem::transmute_copy::<Result<Instant, ()>, Result<T, ()>>(&chan.read(token))
         }
diff --git a/rustc_deps/vendor/crossbeam-channel/src/context.rs b/rustc_deps/vendor/crossbeam-channel/src/context.rs
index ba00bbb..cd1613a 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/context.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/context.rs
@@ -6,8 +6,9 @@
 use std::thread::{self, Thread, ThreadId};
 use std::time::Instant;
 
+use crossbeam_utils::Backoff;
+
 use select::Selected;
-use utils::Backoff;
 
 /// Thread-local context used in select.
 #[derive(Clone)]
@@ -118,7 +119,7 @@
     /// Waits until a packet is provided and returns it.
     #[inline]
     pub fn wait_packet(&self) -> usize {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         loop {
             let packet = self.inner.packet.load(Ordering::Acquire);
             if packet != 0 {
@@ -134,15 +135,17 @@
     #[inline]
     pub fn wait_until(&self, deadline: Option<Instant>) -> Selected {
         // Spin for a short time, waiting until an operation is selected.
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         loop {
             let sel = Selected::from(self.inner.select.load(Ordering::Acquire));
             if sel != Selected::Waiting {
                 return sel;
             }
 
-            if !backoff.snooze() {
+            if backoff.is_completed() {
                 break;
+            } else {
+                backoff.snooze();
             }
         }
 
diff --git a/rustc_deps/vendor/crossbeam-channel/src/counter.rs b/rustc_deps/vendor/crossbeam-channel/src/counter.rs
new file mode 100644
index 0000000..1d76480
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-channel/src/counter.rs
@@ -0,0 +1,132 @@
+///! Reference counter for channels.
+
+use std::isize;
+use std::ops;
+use std::process;
+use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
+
+/// Reference counter internals.
+struct Counter<C> {
+    /// The number of senders associated with the channel.
+    senders: AtomicUsize,
+
+    /// The number of receivers associated with the channel.
+    receivers: AtomicUsize,
+
+    /// If `true`, either the sending or receiving side has been dropped.
+    disconnected: AtomicBool,
+
+    /// The internal channel.
+    chan: C,
+}
+
+/// Wraps a channel into the reference counter.
+pub fn new<C>(chan: C) -> (Sender<C>, Receiver<C>) {
+    let counter = Box::into_raw(Box::new(Counter {
+        senders: AtomicUsize::new(1),
+        receivers: AtomicUsize::new(1),
+        disconnected: AtomicBool::new(false),
+        chan,
+    }));
+    let s = Sender { counter };
+    let r = Receiver { counter };
+    (s, r)
+}
+
+/// The sending side.
+pub struct Sender<C> {
+    counter: *mut Counter<C>,
+}
+
+impl<C> Sender<C> {
+    /// Returns the internal `Counter`.
+    fn counter(&self) -> &Counter<C> {
+        unsafe { &*self.counter }
+    }
+
+    /// Acquires another sender reference.
+    pub fn acquire(&self) -> Sender<C> {
+        let count = self.counter().senders.fetch_add(1, Ordering::Relaxed);
+
+        // Cloning senders and calling `mem::forget` on the clones could potentially overflow the
+        // counter. It's very difficult to recover sensibly from such degenerate scenarios so we
+        // just abort when the count becomes very large.
+        if count > isize::MAX as usize {
+            process::abort();
+        }
+
+        Sender {
+            counter: self.counter,
+        }
+    }
+
+    /// Releases the sender reference.
+    ///
+    /// Function `f` will be called if this is the last sender reference.
+    pub unsafe fn release<F: FnOnce(&C)>(&self, f: F) {
+        if self.counter().senders.fetch_sub(1, Ordering::AcqRel) == 1 {
+            f(&self.counter().chan);
+
+            if self.counter().disconnected.swap(true, Ordering::AcqRel) {
+                drop(Box::from_raw(self.counter));
+            }
+        }
+    }
+}
+
+impl<C> ops::Deref for Sender<C> {
+    type Target = C;
+
+    fn deref(&self) -> &C {
+        &self.counter().chan
+    }
+}
+
+/// The receiving side.
+pub struct Receiver<C> {
+    counter: *mut Counter<C>,
+}
+
+impl<C> Receiver<C> {
+    /// Returns the internal `Counter`.
+    fn counter(&self) -> &Counter<C> {
+        unsafe { &*self.counter }
+    }
+
+    /// Acquires another receiver reference.
+    pub fn acquire(&self) -> Receiver<C> {
+        let count = self.counter().receivers.fetch_add(1, Ordering::Relaxed);
+
+        // Cloning receivers and calling `mem::forget` on the clones could potentially overflow the
+        // counter. It's very difficult to recover sensibly from such degenerate scenarios so we
+        // just abort when the count becomes very large.
+        if count > isize::MAX as usize {
+            process::abort();
+        }
+
+        Receiver {
+            counter: self.counter,
+        }
+    }
+
+    /// Releases the receiver reference.
+    ///
+    /// Function `f` will be called if this is the last receiver reference.
+    pub unsafe fn release<F: FnOnce(&C)>(&self, f: F) {
+        if self.counter().receivers.fetch_sub(1, Ordering::AcqRel) == 1 {
+            f(&self.counter().chan);
+
+            if self.counter().disconnected.swap(true, Ordering::AcqRel) {
+                drop(Box::from_raw(self.counter));
+            }
+        }
+    }
+}
+
+impl<C> ops::Deref for Receiver<C> {
+    type Target = C;
+
+    fn deref(&self) -> &C {
+        &self.counter().chan
+    }
+}
diff --git a/rustc_deps/vendor/crossbeam-channel/src/err.rs b/rustc_deps/vendor/crossbeam-channel/src/err.rs
index 991311b..02c7d44 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/err.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/err.rs
@@ -142,7 +142,7 @@
     ///
     /// # Examples
     ///
-    /// ```rust
+    /// ```
     /// use crossbeam_channel::unbounded;
     ///
     /// let (s, r) = unbounded();
@@ -201,7 +201,7 @@
     ///
     /// # Examples
     ///
-    /// ```rust
+    /// ```
     /// use crossbeam_channel::bounded;
     ///
     /// let (s, r) = bounded(0);
@@ -272,7 +272,7 @@
     ///
     /// # Examples
     ///
-    /// ```rust
+    /// ```
     /// use std::time::Duration;
     /// use crossbeam_channel::unbounded;
     ///
diff --git a/rustc_deps/vendor/crossbeam-channel/src/flavors/after.rs b/rustc_deps/vendor/crossbeam-channel/src/flavors/after.rs
index 873b541..b57f8a7 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/flavors/after.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/flavors/after.rs
@@ -3,7 +3,6 @@
 //! Messages cannot be sent into this kind of channel; they are materialized on demand.
 
 use std::sync::atomic::{AtomicBool, Ordering};
-use std::sync::Arc;
 use std::thread;
 use std::time::{Duration, Instant};
 
@@ -21,7 +20,7 @@
     delivery_time: Instant,
 
     /// `true` if the message has been received.
-    received: Arc<AtomicBool>,
+    received: AtomicBool,
 }
 
 impl Channel {
@@ -30,7 +29,7 @@
     pub fn new(dur: Duration) -> Self {
         Channel {
             delivery_time: Instant::now() + dur,
-            received: Arc::new(AtomicBool::new(false)),
+            received: AtomicBool::new(false),
         }
     }
 
@@ -147,16 +146,6 @@
     }
 }
 
-impl Clone for Channel {
-    #[inline]
-    fn clone(&self) -> Channel {
-        Channel {
-            delivery_time: self.delivery_time,
-            received: self.received.clone(),
-        }
-    }
-}
-
 impl SelectHandle for Channel {
     #[inline]
     fn try_select(&self, token: &mut Token) -> bool {
diff --git a/rustc_deps/vendor/crossbeam-channel/src/flavors/array.rs b/rustc_deps/vendor/crossbeam-channel/src/flavors/array.rs
index f8324a6..d38dc28 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/flavors/array.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/flavors/array.rs
@@ -20,12 +20,11 @@
 use std::sync::atomic::{self, AtomicUsize, Ordering};
 use std::time::Instant;
 
-use crossbeam_utils::CachePadded;
+use crossbeam_utils::{Backoff, CachePadded};
 
 use context::Context;
 use err::{RecvTimeoutError, SendTimeoutError, TryRecvError, TrySendError};
 use select::{Operation, SelectHandle, Selected, Token};
-use utils::Backoff;
 use waker::SyncWaker;
 
 /// A slot in a channel.
@@ -169,7 +168,7 @@
 
     /// Attempts to reserve a slot for sending a message.
     fn start_send(&self, token: &mut Token) -> bool {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         let mut tail = self.tail.load(Ordering::Relaxed);
 
         loop {
@@ -256,7 +255,7 @@
 
     /// Attempts to reserve a slot for receiving a message.
     fn start_recv(&self, token: &mut Token) -> bool {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         let mut head = self.head.load(Ordering::Relaxed);
 
         loop {
@@ -300,8 +299,7 @@
                 atomic::fence(Ordering::SeqCst);
                 let tail = self.tail.load(Ordering::Relaxed);
 
-                // If the tail lags one lap behind the head as well, that means the channel is
-                // empty.
+                // If the tail equals the head, that means the channel is empty.
                 if (tail & !self.mark_bit) == head {
                     // If the channel is disconnected...
                     if tail & self.mark_bit != 0 {
@@ -358,14 +356,17 @@
         let token = &mut Token::default();
         loop {
             // Try sending a message several times.
-            let mut backoff = Backoff::new();
+            let backoff = Backoff::new();
             loop {
                 if self.start_send(token) {
                     let res = unsafe { self.write(token, msg) };
                     return res.map_err(SendTimeoutError::Disconnected);
                 }
-                if !backoff.snooze() {
+
+                if backoff.is_completed() {
                     break;
+                } else {
+                    backoff.snooze();
                 }
             }
 
@@ -415,14 +416,17 @@
         let token = &mut Token::default();
         loop {
             // Try receiving a message several times.
-            let mut backoff = Backoff::new();
+            let backoff = Backoff::new();
             loop {
                 if self.start_recv(token) {
                     let res = unsafe { self.read(token) };
                     return res.map_err(|_| RecvTimeoutError::Disconnected);
                 }
-                if !backoff.snooze() {
+
+                if backoff.is_completed() {
                     break;
+                } else {
+                    backoff.snooze();
                 }
             }
 
diff --git a/rustc_deps/vendor/crossbeam-channel/src/flavors/list.rs b/rustc_deps/vendor/crossbeam-channel/src/flavors/list.rs
index 2ca029b..fae0600 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/flavors/list.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/flavors/list.rs
@@ -7,12 +7,11 @@
 use std::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering};
 use std::time::Instant;
 
-use crossbeam_utils::CachePadded;
+use crossbeam_utils::{Backoff, CachePadded};
 
 use context::Context;
 use err::{RecvTimeoutError, SendTimeoutError, TryRecvError, TrySendError};
 use select::{Operation, SelectHandle, Selected, Token};
-use utils::Backoff;
 use waker::SyncWaker;
 
 // TODO(stjepang): Once we bump the minimum required Rust version to 1.28 or newer, re-apply the
@@ -52,7 +51,7 @@
 impl<T> Slot<T> {
     /// Waits until a message is written into the slot.
     fn wait_write(&self) {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         while self.state.load(Ordering::Acquire) & WRITE == 0 {
             backoff.snooze();
         }
@@ -78,7 +77,7 @@
 
     /// Waits until the next pointer is set.
     fn wait_next(&self) -> *mut Block<T> {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         loop {
             let next = self.next.load(Ordering::Acquire);
             if !next.is_null() {
@@ -188,7 +187,7 @@
 
     /// Attempts to reserve a slot for sending a message.
     fn start_send(&self, token: &mut Token) -> bool {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         let mut tail = self.tail.index.load(Ordering::Acquire);
         let mut block = self.tail.block.load(Ordering::Acquire);
         let mut next_block = None;
@@ -287,7 +286,7 @@
 
     /// Attempts to reserve a slot for receiving a message.
     fn start_recv(&self, token: &mut Token) -> bool {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         let mut head = self.head.index.load(Ordering::Acquire);
         let mut block = self.head.block.load(Ordering::Acquire);
 
@@ -432,15 +431,18 @@
         let token = &mut Token::default();
         loop {
             // Try receiving a message several times.
-            let mut backoff = Backoff::new();
+            let backoff = Backoff::new();
             loop {
                 if self.start_recv(token) {
                     unsafe {
                         return self.read(token).map_err(|_| RecvTimeoutError::Disconnected);
                     }
                 }
-                if !backoff.snooze() {
+
+                if backoff.is_completed() {
                     break;
+                } else {
+                    backoff.snooze();
                 }
             }
 
diff --git a/rustc_deps/vendor/crossbeam-channel/src/flavors/never.rs b/rustc_deps/vendor/crossbeam-channel/src/flavors/never.rs
index 1ac2e25..5fb12e6 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/flavors/never.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/flavors/never.rs
@@ -71,13 +71,6 @@
     }
 }
 
-impl<T> Clone for Channel<T> {
-    #[inline]
-    fn clone(&self) -> Channel<T> {
-        Channel::new()
-    }
-}
-
 impl<T> SelectHandle for Channel<T> {
     #[inline]
     fn try_select(&self, _token: &mut Token) -> bool {
diff --git a/rustc_deps/vendor/crossbeam-channel/src/flavors/tick.rs b/rustc_deps/vendor/crossbeam-channel/src/flavors/tick.rs
index d1e3929..7418661 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/flavors/tick.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/flavors/tick.rs
@@ -2,7 +2,6 @@
 //!
 //! Messages cannot be sent into this kind of channel; they are materialized on demand.
 
-use std::sync::Arc;
 use std::thread;
 use std::time::{Duration, Instant};
 
@@ -18,7 +17,7 @@
 /// Channel that delivers messages periodically.
 pub struct Channel {
     /// The instant at which the next message will be delivered.
-    delivery_time: Arc<AtomicCell<Instant>>,
+    delivery_time: AtomicCell<Instant>,
 
     /// The time interval in which messages get delivered.
     duration: Duration,
@@ -29,7 +28,7 @@
     #[inline]
     pub fn new(dur: Duration) -> Self {
         Channel {
-            delivery_time: Arc::new(AtomicCell::new(Instant::now() + dur)),
+            delivery_time: AtomicCell::new(Instant::now() + dur),
             duration: dur,
         }
     }
@@ -125,16 +124,6 @@
     }
 }
 
-impl Clone for Channel {
-    #[inline]
-    fn clone(&self) -> Channel {
-        Channel {
-            delivery_time: self.delivery_time.clone(),
-            duration: self.duration,
-        }
-    }
-}
-
 impl SelectHandle for Channel {
     #[inline]
     fn try_select(&self, token: &mut Token) -> bool {
diff --git a/rustc_deps/vendor/crossbeam-channel/src/flavors/zero.rs b/rustc_deps/vendor/crossbeam-channel/src/flavors/zero.rs
index adcd7f2..031bfb8 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/flavors/zero.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/flavors/zero.rs
@@ -7,12 +7,12 @@
 use std::sync::atomic::{AtomicBool, Ordering};
 use std::time::Instant;
 
-use parking_lot::Mutex;
+use crossbeam_utils::Backoff;
 
 use context::Context;
 use err::{RecvTimeoutError, SendTimeoutError, TryRecvError, TrySendError};
 use select::{Operation, SelectHandle, Selected, Token};
-use utils::Backoff;
+use utils::Mutex;
 use waker::Waker;
 
 /// A pointer to a packet.
@@ -60,7 +60,7 @@
 
     /// Waits until the packet becomes ready for reading or writing.
     fn wait_ready(&self) {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         while !self.ready.load(Ordering::Acquire) {
             backoff.snooze();
         }
diff --git a/rustc_deps/vendor/crossbeam-channel/src/lib.rs b/rustc_deps/vendor/crossbeam-channel/src/lib.rs
index dab2384..877378c 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/lib.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/lib.rs
@@ -122,16 +122,16 @@
 //! It's also possible to share senders and receivers by reference:
 //!
 //! ```
-//! # extern crate crossbeam;
 //! # extern crate crossbeam_channel;
+//! # extern crate crossbeam_utils;
 //! # fn main() {
 //! use std::thread;
-//! use crossbeam;
 //! use crossbeam_channel::bounded;
+//! use crossbeam_utils::thread::scope;
 //!
 //! let (s, r) = bounded(0);
 //!
-//! crossbeam::scope(|scope| {
+//! scope(|scope| {
 //!     // Spawn a thread that receives a message and then sends one.
 //!     scope.spawn(|_| {
 //!         r.recv().unwrap();
@@ -348,12 +348,11 @@
 #![warn(missing_debug_implementations)]
 
 extern crate crossbeam_utils;
-extern crate parking_lot;
-extern crate rand;
 extern crate smallvec;
 
 mod channel;
 mod context;
+mod counter;
 mod err;
 mod flavors;
 mod select;
diff --git a/rustc_deps/vendor/crossbeam-channel/src/select.rs b/rustc_deps/vendor/crossbeam-channel/src/select.rs
index e83b7d4..c7a8fa5 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/select.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/select.rs
@@ -5,15 +5,16 @@
 use std::mem;
 use std::time::{Duration, Instant};
 
+use crossbeam_utils::Backoff;
+use smallvec::SmallVec;
+
 use channel::{self, Receiver, Sender};
 use context::Context;
 use err::{ReadyTimeoutError, TryReadyError};
 use err::{RecvError, SendError};
 use err::{SelectTimeoutError, TrySelectError};
-use smallvec::SmallVec;
-use utils::{self, Backoff};
-
 use flavors;
+use utils;
 
 /// Temporary data that gets initialized during select or a blocking operation, and is consumed by
 /// `read` or `write`.
@@ -340,7 +341,7 @@
     utils::shuffle(handles);
 
     loop {
-        let mut backoff = Backoff::new();
+        let backoff = Backoff::new();
         loop {
             // Check operations for readiness.
             for &(handle, i, _) in handles.iter() {
@@ -349,8 +350,10 @@
                 }
             }
 
-            if !backoff.snooze() {
+            if backoff.is_completed() {
                 break;
+            } else {
+                backoff.snooze();
             }
         }
 
@@ -460,7 +463,8 @@
 /// * Wait for an operation to become ready with [`try_ready`], [`ready`], or [`ready_timeout`]. If
 ///   successful, we may attempt to execute the operation, but are not obliged to. In fact, it's
 ///   possible for another thread to make the operation not ready just before we try executing it,
-///   so it's wise to use a retry loop.
+///   so it's wise to use a retry loop. However, note that these methods might return with success
+///   spuriously, so it's a good idea to always double check if the operation is really ready.
 ///
 /// # Examples
 ///
@@ -777,8 +781,8 @@
     /// An operation is considered to be ready if it doesn't have to block. Note that it is ready
     /// even when it will simply return an error because the channel is disconnected.
     ///
-    /// Note that this method might return with success spuriously, so it's a good idea to double
-    /// check if the operation is really ready.
+    /// Note that this method might return with success spuriously, so it's a good idea to always
+    /// double check if the operation is really ready.
     ///
     /// # Examples
     ///
@@ -819,8 +823,8 @@
     /// An operation is considered to be ready if it doesn't have to block. Note that it is ready
     /// even when it will simply return an error because the channel is disconnected.
     ///
-    /// Note that this method might return with success spuriously, so it's a good idea to double
-    /// check if the operation is really ready.
+    /// Note that this method might return with success spuriously, so it's a good idea to always
+    /// double check if the operation is really ready.
     ///
     /// # Panics
     ///
@@ -919,6 +923,12 @@
     }
 }
 
+impl<'a> Default for Select<'a> {
+    fn default() -> Select<'a> {
+        Select::new()
+    }
+}
+
 impl<'a> fmt::Debug for Select<'a> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.pad("Select { .. }")
diff --git a/rustc_deps/vendor/crossbeam-channel/src/utils.rs b/rustc_deps/vendor/crossbeam-channel/src/utils.rs
index a8ab2b7..c02e565 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/utils.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/utils.rs
@@ -1,55 +1,13 @@
 //! Miscellaneous utilities.
 
-use std::cell::Cell;
+use std::cell::{Cell, UnsafeCell};
 use std::num::Wrapping;
-use std::sync::atomic;
+use std::ops::{Deref, DerefMut};
+use std::sync::atomic::{AtomicBool, Ordering};
 use std::thread;
 use std::time::{Duration, Instant};
 
-use rand;
-
-/// A counter that performs exponential backoff in spin loops.
-pub struct Backoff(u32);
-
-impl Backoff {
-    /// Creates a new `Backoff`.
-    #[inline]
-    pub fn new() -> Self {
-        Backoff(0)
-    }
-
-    /// Backs off in a spin loop.
-    ///
-    /// This method may yield the current processor. Use it in lock-free retry loops.
-    #[inline]
-    pub fn spin(&mut self) {
-        for _ in 0..1 << self.0.min(6) {
-            atomic::spin_loop_hint();
-        }
-        self.0 = self.0.wrapping_add(1);
-    }
-
-    /// Backs off in a wait loop.
-    ///
-    /// Returns `true` if snoozing has reached a threshold where we should consider parking the
-    /// thread instead.
-    ///
-    /// This method may yield the current processor or the current thread. Use it when waiting on a
-    /// resource.
-    #[inline]
-    pub fn snooze(&mut self) -> bool {
-        if self.0 <= 6 {
-            for _ in 0..1 << self.0 {
-                atomic::spin_loop_hint();
-            }
-        } else {
-            thread::yield_now();
-        }
-
-        self.0 = self.0.wrapping_add(1);
-        self.0 <= 10
-    }
-}
+use crossbeam_utils::Backoff;
 
 /// Randomly shuffles a slice.
 pub fn shuffle<T>(v: &mut [T]) {
@@ -59,10 +17,7 @@
     }
 
     thread_local! {
-        static RNG: Cell<Wrapping<u32>> = {
-            let init = rand::random::<u32>() | 1;
-            Cell::new(Wrapping(init))
-        }
+        static RNG: Cell<Wrapping<u32>> = Cell::new(Wrapping(1406868647));
     }
 
     let _ = RNG.try_with(|rng| {
@@ -105,3 +60,59 @@
         }
     }
 }
+
+/// A simple spinlock-based mutex.
+pub struct Mutex<T> {
+    flag: AtomicBool,
+    value: UnsafeCell<T>,
+}
+
+impl<T> Mutex<T> {
+    /// Returns a new mutex initialized with `value`.
+    pub fn new(value: T) -> Mutex<T> {
+        Mutex {
+            flag: AtomicBool::new(false),
+            value: UnsafeCell::new(value),
+        }
+    }
+
+    /// Locks the mutex.
+    pub fn lock(&self) -> MutexGuard<'_, T> {
+        let backoff = Backoff::new();
+        while self.flag.swap(true, Ordering::Acquire) {
+            backoff.snooze();
+        }
+        MutexGuard {
+            parent: self,
+        }
+    }
+}
+
+/// A guard holding a mutex locked.
+pub struct MutexGuard<'a, T: 'a> {
+    parent: &'a Mutex<T>,
+}
+
+impl<'a, T> Drop for MutexGuard<'a, T> {
+    fn drop(&mut self) {
+        self.parent.flag.store(false, Ordering::Release);
+    }
+}
+
+impl<'a, T> Deref for MutexGuard<'a, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        unsafe {
+            &*self.parent.value.get()
+        }
+    }
+}
+
+impl<'a, T> DerefMut for MutexGuard<'a, T> {
+    fn deref_mut(&mut self) -> &mut T {
+        unsafe {
+            &mut *self.parent.value.get()
+        }
+    }
+}
diff --git a/rustc_deps/vendor/crossbeam-channel/src/waker.rs b/rustc_deps/vendor/crossbeam-channel/src/waker.rs
index 30f34f4..d22bc64 100644
--- a/rustc_deps/vendor/crossbeam-channel/src/waker.rs
+++ b/rustc_deps/vendor/crossbeam-channel/src/waker.rs
@@ -3,10 +3,9 @@
 use std::sync::atomic::{AtomicBool, Ordering};
 use std::thread::{self, ThreadId};
 
-use parking_lot::Mutex;
-
 use context::Context;
 use select::{Operation, Selected};
+use utils::Mutex;
 
 /// Represents a thread blocked on a specific channel operation.
 pub struct Entry {
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/array.rs b/rustc_deps/vendor/crossbeam-channel/tests/array.rs
index fca0207..80e811f 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/array.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/array.rs
@@ -391,6 +391,49 @@
 }
 
 #[test]
+fn stress_oneshot() {
+    const COUNT: usize = 10_000;
+
+    for _ in 0..COUNT {
+        let (s, r) = bounded(1);
+
+        scope(|scope| {
+            scope.spawn(|_| r.recv().unwrap());
+            scope.spawn(|_| s.send(0).unwrap());
+        }).unwrap();
+    }
+}
+
+#[test]
+fn stress_iter() {
+    const COUNT: usize = 100_000;
+
+    let (request_s, request_r) = bounded(1);
+    let (response_s, response_r) = bounded(1);
+
+    scope(|scope| {
+        scope.spawn(move |_| {
+            let mut count = 0;
+            loop {
+                for x in response_r.try_iter() {
+                    count += x;
+                    if count == COUNT {
+                        return;
+                    }
+                }
+                request_s.send(()).unwrap();
+            }
+        });
+
+        for _ in request_r.iter() {
+            if response_s.send(1).is_err() {
+                break;
+            }
+        }
+    }).unwrap();
+}
+
+#[test]
 fn stress_timeout_two_threads() {
     const COUNT: usize = 100;
 
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/golang.rs b/rustc_deps/vendor/crossbeam-channel/tests/golang.rs
index cac47b1..718f9ca 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/golang.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/golang.rs
@@ -11,16 +11,14 @@
 
 #[macro_use]
 extern crate crossbeam_channel;
-extern crate parking_lot;
 
 use std::any::Any;
 use std::collections::HashMap;
-use std::sync::Arc;
+use std::sync::{Arc, Condvar, Mutex};
 use std::thread;
 use std::time::Duration;
 
 use crossbeam_channel::{bounded, Receiver, Select, Sender};
-use parking_lot::{Condvar, Mutex};
 
 fn ms(ms: u64) -> Duration {
     Duration::from_millis(ms)
@@ -48,6 +46,7 @@
         let s = self
             .inner
             .lock()
+            .unwrap()
             .s
             .as_ref()
             .expect("sending into closed channel")
@@ -56,25 +55,50 @@
     }
 
     fn try_recv(&self) -> Option<T> {
-        let r = self.inner.lock().r.clone();
+        let r = self
+            .inner
+            .lock()
+            .unwrap()
+            .r
+            .clone();
         r.try_recv().ok()
     }
 
     fn recv(&self) -> Option<T> {
-        let r = self.inner.lock().r.clone();
+        let r = self
+            .inner
+            .lock()
+            .unwrap()
+            .r
+            .clone();
         r.recv().ok()
     }
 
     fn close(&self) {
-        self.inner.lock().s.take().expect("channel already closed");
+        self.inner
+            .lock()
+            .unwrap()
+            .s
+            .take()
+            .expect("channel already closed");
     }
 
     fn rx(&self) -> Receiver<T> {
-        self.inner.lock().r.clone()
+        self.inner
+            .lock()
+            .unwrap()
+            .r
+            .clone()
     }
 
     fn tx(&self) -> Sender<T> {
-        match self.inner.lock().s.as_ref() {
+        match self
+            .inner
+            .lock()
+            .unwrap()
+            .s
+            .as_ref()
+        {
             None => {
                 let (s, r) = bounded(0);
                 std::mem::forget(r);
@@ -126,7 +150,7 @@
     }
 
     fn add(&self, delta: i32) {
-        let mut count = self.0.count.lock();
+        let mut count = self.0.count.lock().unwrap();
         *count += delta;
         assert!(*count >= 0);
         self.0.cond.notify_all();
@@ -137,9 +161,9 @@
     }
 
     fn wait(&self) {
-        let mut count = self.0.count.lock();
+        let mut count = self.0.count.lock().unwrap();
         while *count > 0 {
-            self.0.cond.wait(&mut count);
+            count = self.0.cond.wait(count).unwrap();
         }
     }
 }
@@ -413,18 +437,18 @@
                 let recv1 = Arc::new(Mutex::new(false));
                 go!(c, recv1, {
                     c.recv();
-                    *recv1.lock() = true;
+                    *recv1.lock().unwrap() = true;
                 });
 
                 let recv2 = Arc::new(Mutex::new(false));
                 go!(c, recv2, {
                     c.recv();
-                    *recv2.lock() = true;
+                    *recv2.lock().unwrap() = true;
                 });
 
                 thread::sleep(ms(1));
 
-                if *recv1.lock() || *recv2.lock() {
+                if *recv1.lock().unwrap() || *recv2.lock().unwrap() {
                     panic!();
                 }
 
@@ -452,12 +476,12 @@
                 let sent = Arc::new(Mutex::new(0));
                 go!(sent, c, {
                     c.send(0);
-                    *sent.lock() = 1;
+                    *sent.lock().unwrap() = 1;
                 });
 
                 thread::sleep(ms(1));
 
-                if *sent.lock() != 0 {
+                if *sent.lock().unwrap() != 0 {
                     panic!();
                 }
 
@@ -867,7 +891,7 @@
             let done = make::<bool>(0);
 
             go!(c, done, l, {
-                let mut l = l.lock();
+                let mut l = l.lock().unwrap();
                 for i in 0..N {
                     thread::yield_now();
                     l[i] = c.recv().unwrap();
@@ -885,7 +909,7 @@
 
             let mut n0 = 0;
             let mut n1 = 0;
-            for &i in l.lock().iter() {
+            for &i in l.lock().unwrap().iter() {
                 n0 += (i + 1) % 2;
                 n1 += i;
             }
@@ -928,7 +952,7 @@
         go!(q, r, expect, wg, pn, {
             for i in 0..NITER {
                 let v = pn[i % pn.len()];
-                *expect.lock() += v;
+                *expect.lock().unwrap() += v;
                 q.send(v);
             }
             q.close();
@@ -943,7 +967,7 @@
             s += v;
         }
 
-        if n != NITER || s != *expect.lock() {
+        if n != NITER || s != *expect.lock().unwrap() {
             panic!();
         }
     }
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/iter.rs b/rustc_deps/vendor/crossbeam-channel/tests/iter.rs
index f5b86c9..68bbd1c 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/iter.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/iter.rs
@@ -67,7 +67,6 @@
                 for x in response_r.try_iter() {
                     count += x;
                     if count == 6 {
-                        assert_eq!(count, 6);
                         return;
                     }
                 }
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/list.rs b/rustc_deps/vendor/crossbeam-channel/tests/list.rs
index bc915ac..09d3a46 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/list.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/list.rs
@@ -292,6 +292,49 @@
 }
 
 #[test]
+fn stress_oneshot() {
+    const COUNT: usize = 10_000;
+
+    for _ in 0..COUNT {
+        let (s, r) = unbounded();
+
+        scope(|scope| {
+            scope.spawn(|_| r.recv().unwrap());
+            scope.spawn(|_| s.send(0).unwrap());
+        }).unwrap();
+    }
+}
+
+#[test]
+fn stress_iter() {
+    const COUNT: usize = 100_000;
+
+    let (request_s, request_r) = unbounded();
+    let (response_s, response_r) = unbounded();
+
+    scope(|scope| {
+        scope.spawn(move |_| {
+            let mut count = 0;
+            loop {
+                for x in response_r.try_iter() {
+                    count += x;
+                    if count == COUNT {
+                        return;
+                    }
+                }
+                request_s.send(()).unwrap();
+            }
+        });
+
+        for _ in request_r.iter() {
+            if response_s.send(1).is_err() {
+                break;
+            }
+        }
+    }).unwrap();
+}
+
+#[test]
 fn stress_timeout_two_threads() {
     const COUNT: usize = 100;
 
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/ready.rs b/rustc_deps/vendor/crossbeam-channel/tests/ready.rs
index 2a7906a..1242eea 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/ready.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/ready.rs
@@ -793,20 +793,28 @@
             sel.recv(&r1);
             sel.recv(&r2);
             sel.recv(&r3);
-            match sel.ready() {
-                0 => {
-                    r1.try_recv().unwrap();
-                    hits[0].set(hits[0].get() + 1);
+            loop {
+                match sel.ready() {
+                    0 => {
+                        if r1.try_recv().is_ok() {
+                            hits[0].set(hits[0].get() + 1);
+                            break;
+                        }
+                    }
+                    1 => {
+                        if r2.try_recv().is_ok() {
+                            hits[1].set(hits[1].get() + 1);
+                            break;
+                        }
+                    }
+                    2 => {
+                        if r3.try_recv().is_ok() {
+                            hits[2].set(hits[2].get() + 1);
+                            break;
+                        }
+                    }
+                    _ => unreachable!(),
                 }
-                1 => {
-                    r2.try_recv().unwrap();
-                    hits[1].set(hits[1].get() + 1);
-                }
-                2 => {
-                    r3.try_recv().unwrap();
-                    hits[2].set(hits[2].get() + 1);
-                }
-                _ => unreachable!(),
             }
         }
         assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 10));
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/select.rs b/rustc_deps/vendor/crossbeam-channel/tests/select.rs
index bc7dd3d..b8c3e05 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/select.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/select.rs
@@ -1190,7 +1190,7 @@
                 _ => unreachable!(),
             }
         }
-        assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 10));
+        assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 50));
     }).unwrap();
 }
 
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/select_macro.rs b/rustc_deps/vendor/crossbeam-channel/tests/select_macro.rs
index 44b1df9..3b02e51 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/select_macro.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/select_macro.rs
@@ -857,7 +857,7 @@
                 recv(r3) -> _ => hits[2].set(hits[2].get() + 1),
             }
         }
-        assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 10));
+        assert!(hits.iter().all(|x| x.get() >= COUNT / hits.len() / 50));
     }).unwrap();
 }
 
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/thread_locals.rs b/rustc_deps/vendor/crossbeam-channel/tests/thread_locals.rs
index 9995054..bc4af4d 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/thread_locals.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/thread_locals.rs
@@ -38,12 +38,11 @@
 
     scope(|scope| {
         scope.spawn(|_| {
-            // First initialize `FOO`, then the thread-locals related to crossbeam-channel and
-            // crossbeam-epoch.
+            // First initialize `FOO`, then the thread-locals related to crossbeam-channel.
             FOO.with(|_| ());
             r.recv().unwrap();
-            // At thread exit, the crossbeam-related thread-locals get dropped first and `FOO` is
-            // dropped last.
+            // At thread exit, thread-locals related to crossbeam-channel get dropped first and
+            // `FOO` is dropped last.
         });
 
         scope.spawn(|_| {
diff --git a/rustc_deps/vendor/crossbeam-channel/tests/zero.rs b/rustc_deps/vendor/crossbeam-channel/tests/zero.rs
index f5424ca..cb989e3 100644
--- a/rustc_deps/vendor/crossbeam-channel/tests/zero.rs
+++ b/rustc_deps/vendor/crossbeam-channel/tests/zero.rs
@@ -294,6 +294,49 @@
 }
 
 #[test]
+fn stress_oneshot() {
+    const COUNT: usize = 10_000;
+
+    for _ in 0..COUNT {
+        let (s, r) = bounded(1);
+
+        scope(|scope| {
+            scope.spawn(|_| r.recv().unwrap());
+            scope.spawn(|_| s.send(0).unwrap());
+        }).unwrap();
+    }
+}
+
+#[test]
+fn stress_iter() {
+    const COUNT: usize = 1000;
+
+    let (request_s, request_r) = bounded(0);
+    let (response_s, response_r) = bounded(0);
+
+    scope(|scope| {
+        scope.spawn(move |_| {
+            let mut count = 0;
+            loop {
+                for x in response_r.try_iter() {
+                    count += x;
+                    if count == COUNT {
+                        return;
+                    }
+                }
+                let _ = request_s.try_send(());
+            }
+        });
+
+        for _ in request_r.iter() {
+            if response_s.send(1).is_err() {
+                break;
+            }
+        }
+    }).unwrap();
+}
+
+#[test]
 fn stress_timeout_two_threads() {
     const COUNT: usize = 100;
 
diff --git a/rustc_deps/vendor/crossbeam-epoch/.cargo-checksum.json b/rustc_deps/vendor/crossbeam-epoch/.cargo-checksum.json
index 8977156..82097eb 100644
--- a/rustc_deps/vendor/crossbeam-epoch/.cargo-checksum.json
+++ b/rustc_deps/vendor/crossbeam-epoch/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"055d48c2537b2fd751b1d2a90f75b625a7c2695ae21c25bef9c82929280e7e5d","Cargo.toml":"ed64813fadbee31a08b4e1a9291c95cdc777270808acf0187297cfea22f262a5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"25649442c32dde2c89cfe95fe0e8f80127748255a73d4ab4ac5b418a49502dd0","benches/defer.rs":"c4fcf1ebb596c1cde9661b64d6ea18e380b4ef56ae426d0c76edb5226cc591bb","benches/flush.rs":"773685fe76781e0d2d295af2153cf8a0320559306f2dab5bb407bfa94f8442c5","benches/pin.rs":"260ff2bc470b7e39075163a7eb70d4576b179873b460b6b58e37ddb5eac13d7e","examples/sanitize.rs":"487855c366f86e9fa8036a7ac8698fb318e03b01cbb7e8591cf9deff18c2cdc4","src/atomic.rs":"f2690b5fcf263355eb59ad57c470e90ff7435929bf7732f8bc3abf840e392f53","src/collector.rs":"b1378d4540597a6ef892c12015a3635c2fc577f9b4adf34f6bb57adffd7d9377","src/default.rs":"6afda8fd141ad594bed62baeb73f2e97c5ef33b051969a542bb908946fe39dd1","src/deferred.rs":"d5ace4be72e926cedb699cd19ae4076bbe87d795d650aa68f264106e6ff15bee","src/epoch.rs":"76dd63356d5bc52e741883d39abb636e4ccb04d20499fb2a0ce797bb81aa4e91","src/guard.rs":"81d75ee5847b6a9f1db0f517a5b6db886a4818b1e36450d3b6164b4108e7196f","src/internal.rs":"683fefec63de32750e1e873196542dcdbf76fdd744649984c831c8035f6f4c4b","src/lib.rs":"8633a59dd9a4d167dfb3b4470102fa6e70f6902f265f179f5bf522b9084ec6a6","src/sync/list.rs":"96f0acfa33197c6ba0711e1a7e21eab68faa811283544317b6844bf00f6be490","src/sync/mod.rs":"2da979ca3a2293f7626a2e6a9ab2fad758d92e3d2bed6cc712ef59eeeea87eab","src/sync/queue.rs":"94f80d8163c9ecac875cd8dbe7120e9067c7fee19dee57a4ba2f0912822dcc5a"},"package":"f10a4f8f409aaac4b16a5474fb233624238fcdeefb9ba50d5ea059aab63ba31c"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"07d12c10c21688eb540d75106930bc5789525b40e8fc5502b3ee1742b86488f9","Cargo.toml":"d5ab00475fd595eaa4093d015f3e9ea4105baf61b51834021cbfa594eb7da56a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"8d165ab5cada21a377029d1ad9f4f1e6e134460fb67a2132bc1c4fb161b79984","benches/defer.rs":"c4fcf1ebb596c1cde9661b64d6ea18e380b4ef56ae426d0c76edb5226cc591bb","benches/flush.rs":"773685fe76781e0d2d295af2153cf8a0320559306f2dab5bb407bfa94f8442c5","benches/pin.rs":"260ff2bc470b7e39075163a7eb70d4576b179873b460b6b58e37ddb5eac13d7e","examples/sanitize.rs":"487855c366f86e9fa8036a7ac8698fb318e03b01cbb7e8591cf9deff18c2cdc4","examples/treiber_stack.rs":"a0938c34bf1251ec2aa8768573758d6c190f93049eabe282fcecdb4dac2ac88d","src/atomic.rs":"3f882cb2b0df02e78e559aada5834f8c832a17fb0b17522c9eb70dee80670cd5","src/collector.rs":"bf9bf52a0b04f5f47f3ccce1a82804d173e5ec010f262d6767dc9f3e08fd5953","src/default.rs":"6afda8fd141ad594bed62baeb73f2e97c5ef33b051969a542bb908946fe39dd1","src/deferred.rs":"d5ace4be72e926cedb699cd19ae4076bbe87d795d650aa68f264106e6ff15bee","src/epoch.rs":"76dd63356d5bc52e741883d39abb636e4ccb04d20499fb2a0ce797bb81aa4e91","src/guard.rs":"1d90d690b02ee735263e845827f720be44faea871852731dd8444b92796f1539","src/internal.rs":"e48c7cfd1e7f764ee3af1e9bd69165641cfce65d9ff8a8c62233aa891cee1e81","src/lib.rs":"8633a59dd9a4d167dfb3b4470102fa6e70f6902f265f179f5bf522b9084ec6a6","src/sync/list.rs":"96f0acfa33197c6ba0711e1a7e21eab68faa811283544317b6844bf00f6be490","src/sync/mod.rs":"2da979ca3a2293f7626a2e6a9ab2fad758d92e3d2bed6cc712ef59eeeea87eab","src/sync/queue.rs":"94f80d8163c9ecac875cd8dbe7120e9067c7fee19dee57a4ba2f0912822dcc5a"},"package":"04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/crossbeam-epoch/CHANGELOG.md b/rustc_deps/vendor/crossbeam-epoch/CHANGELOG.md
index 712a91b..73a8581 100644
--- a/rustc_deps/vendor/crossbeam-epoch/CHANGELOG.md
+++ b/rustc_deps/vendor/crossbeam-epoch/CHANGELOG.md
@@ -1,3 +1,8 @@
+# Version 0.7.1
+
+- Add `Shared::deref_mut()`.
+- Add a Treiber stack to examples.
+
 # Version 0.7.0
 
 - Remove `Guard::clone()`.
diff --git a/rustc_deps/vendor/crossbeam-epoch/Cargo.toml b/rustc_deps/vendor/crossbeam-epoch/Cargo.toml
index 9db9afd..9e24d71 100644
--- a/rustc_deps/vendor/crossbeam-epoch/Cargo.toml
+++ b/rustc_deps/vendor/crossbeam-epoch/Cargo.toml
@@ -12,14 +12,14 @@
 
 [package]
 name = "crossbeam-epoch"
-version = "0.7.0"
+version = "0.7.1"
 authors = ["The Crossbeam Project Developers"]
 description = "Epoch-based garbage collection"
-homepage = "https://github.com/crossbeam-rs/crossbeam"
+homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-epoch"
 documentation = "https://docs.rs/crossbeam-epoch"
 readme = "README.md"
 keywords = ["lock-free", "rcu", "atomic", "garbage"]
-categories = ["concurrency", "memory-management"]
+categories = ["concurrency", "memory-management", "no-std"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/crossbeam-rs/crossbeam"
 [dependencies.arrayvec]
diff --git a/rustc_deps/vendor/crossbeam-epoch/README.md b/rustc_deps/vendor/crossbeam-epoch/README.md
index 48fa390..abc73ef 100644
--- a/rustc_deps/vendor/crossbeam-epoch/README.md
+++ b/rustc_deps/vendor/crossbeam-epoch/README.md
@@ -18,6 +18,8 @@
 immediately. Epoch-based GC is an efficient mechanism for deferring destruction of
 shared objects until no pointers to them can exist.
 
+Everything in this crate except the global GC can be used in `no_std` + `alloc` environments.
+
 ## Usage
 
 Add this to your `Cargo.toml`:
@@ -33,12 +35,6 @@
 extern crate crossbeam_epoch as epoch;
 ```
 
-## Compatibility
-
-The minimum supported Rust version is 1.26.
-
-This crate can be used in `no_std` environments, but only on nightly Rust.
-
 ## License
 
 Licensed under either of
@@ -48,7 +44,7 @@
 
 at your option.
 
-### Contribution
+#### Contribution
 
 Unless you explicitly state otherwise, any contribution intentionally submitted
 for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
diff --git a/rustc_deps/vendor/crossbeam-epoch/examples/treiber_stack.rs b/rustc_deps/vendor/crossbeam-epoch/examples/treiber_stack.rs
new file mode 100644
index 0000000..1dbd6b0
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-epoch/examples/treiber_stack.rs
@@ -0,0 +1,109 @@
+extern crate crossbeam_epoch as epoch;
+extern crate crossbeam_utils as utils;
+
+use std::mem::ManuallyDrop;
+use std::ptr;
+use std::sync::atomic::Ordering::{Acquire, Relaxed, Release};
+
+use epoch::{Atomic, Owned};
+use utils::thread::scope;
+
+/// Treiber's lock-free stack.
+///
+/// Usable with any number of producers and consumers.
+#[derive(Debug)]
+pub struct TreiberStack<T> {
+    head: Atomic<Node<T>>,
+}
+
+#[derive(Debug)]
+struct Node<T> {
+    data: ManuallyDrop<T>,
+    next: Atomic<Node<T>>,
+}
+
+impl<T> TreiberStack<T> {
+    /// Creates a new, empty stack.
+    pub fn new() -> TreiberStack<T> {
+        TreiberStack {
+            head: Atomic::null(),
+        }
+    }
+
+    /// Pushes a value on top of the stack.
+    pub fn push(&self, t: T) {
+        let mut n = Owned::new(Node {
+            data: ManuallyDrop::new(t),
+            next: Atomic::null(),
+        });
+
+        let guard = epoch::pin();
+
+        loop {
+            let head = self.head.load(Relaxed, &guard);
+            n.next.store(head, Relaxed);
+
+            match self.head.compare_and_set(head, n, Release, &guard) {
+                Ok(_) => break,
+                Err(e) => n = e.new,
+            }
+        }
+    }
+
+    /// Attempts to pop the top element from the stack.
+    ///
+    /// Returns `None` if the stack is empty.
+    pub fn pop(&self) -> Option<T> {
+        let guard = epoch::pin();
+        loop {
+            let head = self.head.load(Acquire, &guard);
+
+            match unsafe { head.as_ref() } {
+                Some(h) => {
+                    let next = h.next.load(Relaxed, &guard);
+
+                    if self
+                        .head
+                        .compare_and_set(head, next, Release, &guard)
+                        .is_ok()
+                    {
+                        unsafe {
+                            guard.defer_destroy(head);
+                            return Some(ManuallyDrop::into_inner(ptr::read(&(*h).data)));
+                        }
+                    }
+                }
+                None => return None,
+            }
+        }
+    }
+
+    /// Returns `true` if the stack is empty.
+    pub fn is_empty(&self) -> bool {
+        let guard = epoch::pin();
+        self.head.load(Acquire, &guard).is_null()
+    }
+}
+
+impl<T> Drop for TreiberStack<T> {
+    fn drop(&mut self) {
+        while self.pop().is_some() {}
+    }
+}
+
+fn main() {
+    let stack = TreiberStack::new();
+
+    scope(|scope| {
+        for _ in 0..10 {
+            scope.spawn(|_| {
+                for i in 0..10_000 {
+                    stack.push(i);
+                    assert!(stack.pop().is_some());
+                }
+            });
+        }
+    }).unwrap();
+
+    assert!(stack.pop().is_none());
+}
diff --git a/rustc_deps/vendor/crossbeam-epoch/src/atomic.rs b/rustc_deps/vendor/crossbeam-epoch/src/atomic.rs
index a69e061..899ce4d 100644
--- a/rustc_deps/vendor/crossbeam-epoch/src/atomic.rs
+++ b/rustc_deps/vendor/crossbeam-epoch/src/atomic.rs
@@ -6,8 +6,7 @@
 use core::mem;
 use core::ops::{Deref, DerefMut};
 use core::ptr;
-use core::sync::atomic::Ordering;
-use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT};
+use core::sync::atomic::{AtomicUsize, Ordering};
 
 use crossbeam_utils::atomic::AtomicConsume;
 use guard::Guard;
@@ -154,7 +153,7 @@
     #[cfg(not(feature = "nightly"))]
     pub fn null() -> Atomic<T> {
         Self {
-            data: ATOMIC_USIZE_INIT,
+            data: AtomicUsize::new(0),
             _marker: PhantomData,
         }
     }
@@ -171,7 +170,7 @@
     #[cfg(feature = "nightly")]
     pub const fn null() -> Atomic<T> {
         Self {
-            data: ATOMIC_USIZE_INIT,
+            data: AtomicUsize::new(0),
             _marker: PhantomData,
         }
     }
@@ -936,6 +935,46 @@
         &*self.as_raw()
     }
 
+    /// Dereferences the pointer.
+    ///
+    /// Returns a mutable reference to the pointee that is valid during the lifetime `'g`.
+    ///
+    /// # Safety
+    ///
+    /// * There is no guarantee that there are no more threads attempting to read/write from/to the
+    ///   actual object at the same time.
+    ///
+    ///   The user must know that there are no concurrent accesses towards the object itself.
+    ///
+    /// * Other than the above, all safety concerns of `deref()` applies here.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_epoch::{self as epoch, Atomic};
+    /// use std::sync::atomic::Ordering::SeqCst;
+    ///
+    /// let a = Atomic::new(vec![1, 2, 3, 4]);
+    /// let guard = &epoch::pin();
+    ///
+    /// let mut p = a.load(SeqCst, guard);
+    /// unsafe {
+    ///     assert!(!p.is_null());
+    ///     let b = p.deref_mut();
+    ///     assert_eq!(b, &vec![1, 2, 3, 4]);
+    ///     b.push(5);
+    ///     assert_eq!(b, &vec![1, 2, 3, 4, 5]);
+    /// }
+    ///
+    /// let p = a.load(SeqCst, guard);
+    /// unsafe {
+    ///     assert_eq!(p.deref(), &vec![1, 2, 3, 4, 5]);
+    /// }
+    /// ```
+    pub unsafe fn deref_mut(&mut self) -> &'g mut T {
+        &mut *(self.as_raw() as *mut T)
+    }
+
     /// Converts the pointer to a reference.
     ///
     /// Returns `None` if the pointer is null, or else a reference to the object wrapped in `Some`.
diff --git a/rustc_deps/vendor/crossbeam-epoch/src/collector.rs b/rustc_deps/vendor/crossbeam-epoch/src/collector.rs
index e6cd0d6..00a80bb 100644
--- a/rustc_deps/vendor/crossbeam-epoch/src/collector.rs
+++ b/rustc_deps/vendor/crossbeam-epoch/src/collector.rs
@@ -106,8 +106,7 @@
 #[cfg(test)]
 mod tests {
     use std::mem;
-    use std::sync::atomic::Ordering;
-    use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT};
+    use std::sync::atomic::{AtomicUsize, Ordering};
 
     use crossbeam_utils::thread;
 
@@ -196,7 +195,7 @@
     #[test]
     fn incremental() {
         const COUNT: usize = 100_000;
-        static DESTROYS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DESTROYS: AtomicUsize = AtomicUsize::new(0);
 
         let collector = Collector::new();
         let handle = collector.register();
@@ -229,7 +228,7 @@
     #[test]
     fn buffering() {
         const COUNT: usize = 10;
-        static DESTROYS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DESTROYS: AtomicUsize = AtomicUsize::new(0);
 
         let collector = Collector::new();
         let handle = collector.register();
@@ -262,7 +261,7 @@
     #[test]
     fn count_drops() {
         const COUNT: usize = 100_000;
-        static DROPS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DROPS: AtomicUsize = AtomicUsize::new(0);
 
         struct Elem(i32);
 
@@ -295,7 +294,7 @@
     #[test]
     fn count_destroy() {
         const COUNT: usize = 100_000;
-        static DESTROYS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DESTROYS: AtomicUsize = AtomicUsize::new(0);
 
         let collector = Collector::new();
         let handle = collector.register();
@@ -323,7 +322,7 @@
     #[test]
     fn drop_array() {
         const COUNT: usize = 700;
-        static DROPS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DROPS: AtomicUsize = AtomicUsize::new(0);
 
         struct Elem(i32);
 
@@ -361,7 +360,7 @@
     #[test]
     fn destroy_array() {
         const COUNT: usize = 100_000;
-        static DESTROYS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DESTROYS: AtomicUsize = AtomicUsize::new(0);
 
         let collector = Collector::new();
         let handle = collector.register();
@@ -396,7 +395,7 @@
     fn stress() {
         const THREADS: usize = 8;
         const COUNT: usize = 100_000;
-        static DROPS: AtomicUsize = ATOMIC_USIZE_INIT;
+        static DROPS: AtomicUsize = AtomicUsize::new(0);
 
         struct Elem(i32);
 
diff --git a/rustc_deps/vendor/crossbeam-epoch/src/guard.rs b/rustc_deps/vendor/crossbeam-epoch/src/guard.rs
index e4ab51b..6777d97 100644
--- a/rustc_deps/vendor/crossbeam-epoch/src/guard.rs
+++ b/rustc_deps/vendor/crossbeam-epoch/src/guard.rs
@@ -156,7 +156,7 @@
     /// get dropped. This method can defer deallocation until all those threads get unpinned and
     /// consequently drop all their references on the stack.
     ///
-    /// ```rust
+    /// ```
     /// use crossbeam_epoch::{self as epoch, Atomic, Owned};
     /// use std::sync::atomic::Ordering::SeqCst;
     ///
@@ -241,7 +241,7 @@
     /// get dropped. This method can defer deallocation until all those threads get unpinned and
     /// consequently drop all their references on the stack.
     ///
-    /// ```rust
+    /// ```
     /// use crossbeam_epoch::{self as epoch, Atomic, Owned};
     /// use std::sync::atomic::Ordering::SeqCst;
     ///
diff --git a/rustc_deps/vendor/crossbeam-epoch/src/internal.rs b/rustc_deps/vendor/crossbeam-epoch/src/internal.rs
index b21f436..aba2cef 100644
--- a/rustc_deps/vendor/crossbeam-epoch/src/internal.rs
+++ b/rustc_deps/vendor/crossbeam-epoch/src/internal.rs
@@ -509,14 +509,13 @@
 
 #[cfg(test)]
 mod tests {
-    use std::sync::atomic::Ordering;
-    use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT};
+    use std::sync::atomic::{AtomicUsize, Ordering};
 
     use super::*;
 
     #[test]
     fn check_defer() {
-        static FLAG: AtomicUsize = ATOMIC_USIZE_INIT;
+        static FLAG: AtomicUsize = AtomicUsize::new(0);
         fn set() {
             FLAG.store(42, Ordering::Relaxed);
         }
@@ -529,7 +528,7 @@
 
     #[test]
     fn check_bag() {
-        static FLAG: AtomicUsize = ATOMIC_USIZE_INIT;
+        static FLAG: AtomicUsize = AtomicUsize::new(0);
         fn incr() {
             FLAG.fetch_add(1, Ordering::Relaxed);
         }
diff --git a/rustc_deps/vendor/crossbeam-utils/.cargo-checksum.json b/rustc_deps/vendor/crossbeam-utils/.cargo-checksum.json
index af9c2cd..ec17be0 100644
--- a/rustc_deps/vendor/crossbeam-utils/.cargo-checksum.json
+++ b/rustc_deps/vendor/crossbeam-utils/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"632777ff129c108f4b3a445f99604f98565345570f0688f68d0d906b6e62a713","Cargo.toml":"5a3bf61003b6175a0de19ad055afb9f99bd09af200910c5de9dcdfce8fd21fc2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"fbf8251ad672babe9db82a62ef76d06854c96ee0195fd3d043be222a96b428ec","benches/atomic_cell.rs":"9e80d3c120df4e6e766ed4fa3df3ed1be5256f6e6cd96a1ced71bedab291bf7f","src/atomic/atomic_cell.rs":"bdb746cabb68eb12f1ddd531838e1732403d42f98f7bd5ce187a982e2bae051b","src/atomic/consume.rs":"bfdc7e2d8370a5a3bb1699b6214347c359d66fcc92a2d1345a513676ac91d821","src/atomic/mod.rs":"d37c5edec55b31dacf0f97f28cee8f91b06c551f04582e70aea6aea91390aa25","src/cache_padded.rs":"95b10657b4e50316d2213894e195c61602ff0c6655cc965301de1584fb7d61c7","src/lib.rs":"2459c04964ec61aff53201e941b3086c903bb3c651825efb4978ff5173478781","src/sync/mod.rs":"d37870028432ad0c3c7fa82d0ee99b3f4bdd9a8410a0a4255a80fe7cc8bdcf38","src/sync/parker.rs":"55324bbea5b7c6838a0f8467a5b8a5dbd5526c8e1c7fd4f6d64dad1ab19f9be9","src/thread.rs":"c01d49383e773fedac9abec3cfb008caec13f959a78f3ddcbf282f32ebecadd7","tests/atomic_cell.rs":"690f516c7e827b18adec5da1c3249ebb26ff674c5887d863ddc94fe1600b9c28","tests/cache_padded.rs":"02235757a554279dae5053d46314a765059ec036c63a05336353994c2aa344d1","tests/parker.rs":"996212c084286567638919c27d46a250a5d592d8e1a97c1e6a4d7e10c060e4dd","tests/thread.rs":"0d86998085a8aace79e5b3dae61aa8bd864492f44aafcce6ec85778954f55809"},"package":"41ee4864f4797060e52044376f7d107429ce1fb43460021b126424b7180ee21a"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"e58bfef23e76d04b244941fd4ecdb35837a1a6f1370bf4596cc0280193c9a4f9","Cargo.toml":"2d4d20231a89e61fa6d1d83ad853b274e71d243c992eda5a9de0c9e8ca428ba5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"63ba61fd2e75aa90572476eda5246fc766846af40d31e0bdccbf763d9f0799ba","benches/atomic_cell.rs":"ada69698def9d4eab485a6e0da235aaac001efe49a6b0d6f5c5be381a645310f","src/atomic/atomic_cell.rs":"97a9ec7ac2625ee0a951b984a419fbeab62173ed9c23cab47dfc13ed25e8ee6c","src/atomic/consume.rs":"bfdc7e2d8370a5a3bb1699b6214347c359d66fcc92a2d1345a513676ac91d821","src/atomic/mod.rs":"404eacae422012f3628cb44262df73a5891fe02a17ab345b832e3062982b5a20","src/backoff.rs":"029fede365eaa3408c7359cf868303120903976304aee546aeedcb80085568d5","src/cache_padded.rs":"95b10657b4e50316d2213894e195c61602ff0c6655cc965301de1584fb7d61c7","src/lib.rs":"957df3bd2875147aa1b939fc47f1a8a72719748e9001f27dba2f3589e27a73b4","src/sync/mod.rs":"4c8ad6ec4601f212791b0b531b46ee5decec2f1d14746aa7f2c18e36c609cd8e","src/sync/parker.rs":"55324bbea5b7c6838a0f8467a5b8a5dbd5526c8e1c7fd4f6d64dad1ab19f9be9","src/sync/sharded_lock.rs":"7a401ba621233732c26cf49324748269359d7bc5dc27e0ec26c9493e9a5ec97d","src/sync/wait_group.rs":"21708bbd46daa98e9f788765a9a4ef3b087a8d1e97a6e9406b4a960c95e44ca0","src/thread.rs":"384e3c6e6db565e752169223205991f1eadb1258b1d416758172a40a6c9bd645","tests/atomic_cell.rs":"690f516c7e827b18adec5da1c3249ebb26ff674c5887d863ddc94fe1600b9c28","tests/cache_padded.rs":"02235757a554279dae5053d46314a765059ec036c63a05336353994c2aa344d1","tests/parker.rs":"996212c084286567638919c27d46a250a5d592d8e1a97c1e6a4d7e10c060e4dd","tests/sharded_lock.rs":"1e2e8a355b74d89569873fbba7772235bc64d13a7209ee673f368f4fe6f70c65","tests/thread.rs":"0d86998085a8aace79e5b3dae61aa8bd864492f44aafcce6ec85778954f55809","tests/wait_group.rs":"e3d5168581fb511b760f4249ca487b919cffc60ac2b4610a78db99899772dd5b"},"package":"f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/crossbeam-utils/CHANGELOG.md b/rustc_deps/vendor/crossbeam-utils/CHANGELOG.md
index 0d0d7b0..e3a2bdd 100644
--- a/rustc_deps/vendor/crossbeam-utils/CHANGELOG.md
+++ b/rustc_deps/vendor/crossbeam-utils/CHANGELOG.md
@@ -1,3 +1,13 @@
+# Version 0.6.5
+
+- Rename `Backoff::is_complete()` to `Backoff::is_completed()`.
+
+# Version 0.6.4
+
+- Add `WaitGroup`, `ShardedLock`, and `Backoff`.
+- Add `fetch_*` methods for `AtomicCell<i128>` and `AtomicCell<u128>`.
+- Expand documentation.
+
 # Version 0.6.3
 
 - Add `AtomicCell`.
diff --git a/rustc_deps/vendor/crossbeam-utils/Cargo.toml b/rustc_deps/vendor/crossbeam-utils/Cargo.toml
index 61e9db1..5c2c84b 100644
--- a/rustc_deps/vendor/crossbeam-utils/Cargo.toml
+++ b/rustc_deps/vendor/crossbeam-utils/Cargo.toml
@@ -12,20 +12,26 @@
 
 [package]
 name = "crossbeam-utils"
-version = "0.6.3"
+version = "0.6.5"
 authors = ["The Crossbeam Project Developers"]
 description = "Utilities for concurrent programming"
-homepage = "https://github.com/crossbeam-rs/crossbeam"
+homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-utils"
 documentation = "https://docs.rs/crossbeam-utils"
 readme = "README.md"
 keywords = ["scoped", "thread", "atomic", "cache"]
-categories = ["algorithms", "concurrency", "data-structures"]
+categories = ["algorithms", "concurrency", "data-structures", "no-std"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/crossbeam-rs/crossbeam"
 [dependencies.cfg-if]
 version = "0.1"
 
+[dependencies.lazy_static]
+version = "1.1.0"
+optional = true
+[dev-dependencies.rand]
+version = "0.6"
+
 [features]
 default = ["std"]
 nightly = []
-std = []
+std = ["lazy_static"]
diff --git a/rustc_deps/vendor/crossbeam-utils/README.md b/rustc_deps/vendor/crossbeam-utils/README.md
index 69cb9a6..a454c14 100644
--- a/rustc_deps/vendor/crossbeam-utils/README.md
+++ b/rustc_deps/vendor/crossbeam-utils/README.md
@@ -11,11 +11,35 @@
 [![Rust 1.26+](https://img.shields.io/badge/rust-1.26+-lightgray.svg)](
 https://www.rust-lang.org)
 
-This crate provides miscellaneous utilities for concurrent programming:
+This crate provides miscellaneous tools for concurrent programming:
 
-* `AtomicConsume` allows reading from primitive atomic types with "consume" ordering.
-* `CachePadded<T>` pads and aligns a value to the length of a cache line.
-* `scope()` can spawn threads that borrow local variables from the stack. 
+#### Atomics
+
+* [`AtomicCell`], a thread-safe mutable memory location.<sup>(\*)</sup>
+* [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering.<sup>(\*)</sup>
+
+#### Thread synchronization
+
+* [`Parker`], a thread parking primitive.
+* [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads.
+* [`WaitGroup`], for synchronizing the beginning or end of some computation.
+
+#### Utilities
+
+* [`Backoff`], for exponential backoff in spin loops.<sup>(\*)</sup>
+* [`CachePadded`], for padding and aligning a value to the length of a cache line.<sup>(\*)</sup>
+* [`scope`], for spawning threads that borrow local variables from the stack.
+
+*Features marked with <sup>(\*)</sup> can be used in `no_std` environments.*
+
+[`AtomicCell`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/atomic/struct.AtomicCell.html
+[`AtomicConsume`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/atomic/trait.AtomicConsume.html
+[`Parker`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/sync/struct.Parker.html
+[`ShardedLock`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/sync/struct.ShardedLock.html
+[`WaitGroup`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/sync/struct.WaitGroup.html
+[`Backoff`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/struct.Backoff.html
+[`CachePadded`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/struct.CachePadded.html
+[`scope`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/thread/fn.scope.html
 
 ## Usage
 
@@ -32,15 +56,6 @@
 extern crate crossbeam_utils;
 ```
 
-## Compatibility
-
-The minimum supported Rust version is 1.26.
-
-Features available in `no_std` environments:
-
-* `AtomicConsume`
-* `CachePadded<T>`
-
 ## License
 
 Licensed under either of
@@ -50,7 +65,7 @@
 
 at your option.
 
-### Contribution
+#### Contribution
 
 Unless you explicitly state otherwise, any contribution intentionally submitted
 for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
diff --git a/rustc_deps/vendor/crossbeam-utils/benches/atomic_cell.rs b/rustc_deps/vendor/crossbeam-utils/benches/atomic_cell.rs
old mode 100755
new mode 100644
index ee06152..aae17d4
--- a/rustc_deps/vendor/crossbeam-utils/benches/atomic_cell.rs
+++ b/rustc_deps/vendor/crossbeam-utils/benches/atomic_cell.rs
@@ -51,18 +51,20 @@
 
     thread::scope(|scope| {
         for _ in 0..THREADS {
-            scope.spawn(|| loop {
-                start.wait();
+            scope.spawn(|_| {
+                loop {
+                    start.wait();
 
-                let mut sum = 0;
-                for _ in 0..STEPS {
-                    sum += a.load();
-                }
-                test::black_box(sum);
+                    let mut sum = 0;
+                    for _ in 0..STEPS {
+                        sum += a.load();
+                    }
+                    test::black_box(sum);
 
-                end.wait();
-                if exit.load() {
-                    break;
+                    end.wait();
+                    if exit.load() {
+                        break;
+                    }
                 }
             });
         }
@@ -124,18 +126,20 @@
 
     thread::scope(|scope| {
         for _ in 0..THREADS {
-            scope.spawn(|| loop {
-                start.wait();
+            scope.spawn(|_| {
+                loop {
+                    start.wait();
 
-                let mut sum = 0;
-                for _ in 0..STEPS {
-                    sum += a.load();
-                }
-                test::black_box(sum);
+                    let mut sum = 0;
+                    for _ in 0..STEPS {
+                        sum += a.load();
+                    }
+                    test::black_box(sum);
 
-                end.wait();
-                if exit.load() {
-                    break;
+                    end.wait();
+                    if exit.load() {
+                        break;
+                    }
                 }
             });
         }
diff --git a/rustc_deps/vendor/crossbeam-utils/src/atomic/atomic_cell.rs b/rustc_deps/vendor/crossbeam-utils/src/atomic/atomic_cell.rs
index cc9495d..31ad7d3 100644
--- a/rustc_deps/vendor/crossbeam-utils/src/atomic/atomic_cell.rs
+++ b/rustc_deps/vendor/crossbeam-utils/src/atomic/atomic_cell.rs
@@ -5,6 +5,8 @@
 use core::slice;
 use core::sync::atomic::{self, AtomicBool, AtomicUsize, Ordering};
 
+use Backoff;
+
 /// A thread-safe mutable memory location.
 ///
 /// This type is equivalent to [`Cell`], except it can also be shared among multiple threads.
@@ -464,18 +466,24 @@
             }
         }
     };
+    ($t:ty, $size:tt, $atomic:ty, $example:tt) => {
+        #[cfg(target_has_atomic = $size)]
+        impl_arithmetic!($t, $atomic, $example);
+    };
 }
 
 cfg_if! {
     if #[cfg(feature = "nightly")] {
-        impl_arithmetic!(u8, atomic::AtomicU8, "let a = AtomicCell::new(7u8);");
-        impl_arithmetic!(i8, atomic::AtomicI8, "let a = AtomicCell::new(7i8);");
-        impl_arithmetic!(u16, atomic::AtomicU16, "let a = AtomicCell::new(7u16);");
-        impl_arithmetic!(i16, atomic::AtomicI16, "let a = AtomicCell::new(7i16);");
-        impl_arithmetic!(u32, atomic::AtomicU32, "let a = AtomicCell::new(7u32);");
-        impl_arithmetic!(i32, atomic::AtomicI32, "let a = AtomicCell::new(7i32);");
-        impl_arithmetic!(u64, atomic::AtomicU64, "let a = AtomicCell::new(7u64);");
-        impl_arithmetic!(i64, atomic::AtomicI64, "let a = AtomicCell::new(7i64);");
+        impl_arithmetic!(u8, "8", atomic::AtomicU8, "let a = AtomicCell::new(7u8);");
+        impl_arithmetic!(i8, "8", atomic::AtomicI8, "let a = AtomicCell::new(7i8);");
+        impl_arithmetic!(u16, "16", atomic::AtomicU16, "let a = AtomicCell::new(7u16);");
+        impl_arithmetic!(i16, "16", atomic::AtomicI16, "let a = AtomicCell::new(7i16);");
+        impl_arithmetic!(u32, "32", atomic::AtomicU32, "let a = AtomicCell::new(7u32);");
+        impl_arithmetic!(i32, "32", atomic::AtomicI32, "let a = AtomicCell::new(7i32);");
+        impl_arithmetic!(u64, "64", atomic::AtomicU64, "let a = AtomicCell::new(7u64);");
+        impl_arithmetic!(i64, "64", atomic::AtomicI64, "let a = AtomicCell::new(7i64);");
+        impl_arithmetic!(u128, "let a = AtomicCell::new(7u128);");
+        impl_arithmetic!(i128, "let a = AtomicCell::new(7i128);");
     } else {
         impl_arithmetic!(u8, "let a = AtomicCell::new(7u8);");
         impl_arithmetic!(i8, "let a = AtomicCell::new(7i8);");
@@ -485,6 +493,8 @@
         impl_arithmetic!(i32, "let a = AtomicCell::new(7i32);");
         impl_arithmetic!(u64, "let a = AtomicCell::new(7u64);");
         impl_arithmetic!(i64, "let a = AtomicCell::new(7i64);");
+        impl_arithmetic!(u128, "let a = AtomicCell::new(7u128);");
+        impl_arithmetic!(i128, "let a = AtomicCell::new(7i128);");
     }
 }
 
@@ -629,8 +639,7 @@
     /// Grabs the lock for writing.
     #[inline]
     fn write(&'static self) -> WriteGuard {
-        let mut step = 0usize;
-
+        let backoff = Backoff::new();
         loop {
             let previous = self.state.swap(1, Ordering::Acquire);
 
@@ -643,17 +652,7 @@
                 };
             }
 
-            if step < 10 {
-                atomic::spin_loop_hint();
-            } else {
-                #[cfg(not(feature = "std"))]
-                atomic::spin_loop_hint();
-
-                #[cfg(feature = "std")]
-                ::std::thread::yield_now();
-            }
-
-            step = step.wrapping_add(1);
+            backoff.snooze();
         }
     }
 }
@@ -696,7 +695,28 @@
 #[inline]
 #[must_use]
 fn lock(addr: usize) -> &'static Lock {
-    // The number of locks is prime.
+    // The number of locks is a prime number because we want to make sure `addr % LEN` gets
+    // dispersed across all locks.
+    //
+    // Note that addresses are always aligned to some power of 2, depending on type `T` in
+    // `AtomicCell<T>`. If `LEN` was an even number, then `addr % LEN` would be an even number,
+    // too, which means only half of the locks would get utilized!
+    //
+    // It is also possible for addresses to accidentally get aligned to a number that is not a
+    // power of 2. Consider this example:
+    //
+    // ```
+    // #[repr(C)]
+    // struct Foo {
+    //     a: AtomicCell<u8>,
+    //     b: u8,
+    //     c: u8,
+    // }
+    // ```
+    //
+    // Now, if we have a slice of type `&[Foo]`, it is possible that field `a` in all items gets
+    // stored at addresses that are multiples of 3. It'd be too bad if `LEN` was divisible by 3.
+    // In order to protect from such cases, we simply choose a large prime number for `LEN`.
     const LEN: usize = 97;
 
     const L: Lock = Lock {
diff --git a/rustc_deps/vendor/crossbeam-utils/src/atomic/mod.rs b/rustc_deps/vendor/crossbeam-utils/src/atomic/mod.rs
index 91eae0e..4205993 100644
--- a/rustc_deps/vendor/crossbeam-utils/src/atomic/mod.rs
+++ b/rustc_deps/vendor/crossbeam-utils/src/atomic/mod.rs
@@ -1,4 +1,4 @@
-//! Additional utilities for atomics.
+//! Atomic types.
 
 mod atomic_cell;
 mod consume;
diff --git a/rustc_deps/vendor/crossbeam-utils/src/backoff.rs b/rustc_deps/vendor/crossbeam-utils/src/backoff.rs
new file mode 100644
index 0000000..4961991
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-utils/src/backoff.rs
@@ -0,0 +1,294 @@
+use core::cell::Cell;
+use core::fmt;
+use core::sync::atomic;
+
+const SPIN_LIMIT: u32 = 6;
+const YIELD_LIMIT: u32 = 10;
+
+/// Performs exponential backoff in spin loops.
+///
+/// Backing off in spin loops reduces contention and improves overall performance.
+///
+/// This primitive can execute *YIELD* and *PAUSE* instructions, yield the current thread to the OS
+/// scheduler, and tell when is a good time to block the thread using a different synchronization
+/// mechanism. Each step of the back off procedure takes roughly twice as long as the previous
+/// step.
+///
+/// # Examples
+///
+/// Backing off in a lock-free loop:
+///
+/// ```
+/// use crossbeam_utils::Backoff;
+/// use std::sync::atomic::AtomicUsize;
+/// use std::sync::atomic::Ordering::SeqCst;
+///
+/// fn fetch_mul(a: &AtomicUsize, b: usize) -> usize {
+///     let backoff = Backoff::new();
+///     loop {
+///         let val = a.load(SeqCst);
+///         if a.compare_and_swap(val, val.wrapping_mul(b), SeqCst) == val {
+///             return val;
+///         }
+///         backoff.spin();
+///     }
+/// }
+/// ```
+///
+/// Waiting for an [`AtomicBool`] to become `true`:
+///
+/// ```
+/// use crossbeam_utils::Backoff;
+/// use std::sync::atomic::AtomicBool;
+/// use std::sync::atomic::Ordering::SeqCst;
+///
+/// fn spin_wait(ready: &AtomicBool) {
+///     let backoff = Backoff::new();
+///     while !ready.load(SeqCst) {
+///         backoff.snooze();
+///     }
+/// }
+/// ```
+///
+/// Waiting for an [`AtomicBool`] to become `true` and parking the thread after a long wait.
+/// Note that whoever sets the atomic variable to `true` must notify the parked thread by calling
+/// [`unpark()`]:
+///
+/// ```
+/// use crossbeam_utils::Backoff;
+/// use std::sync::atomic::AtomicBool;
+/// use std::sync::atomic::Ordering::SeqCst;
+/// use std::thread;
+///
+/// fn blocking_wait(ready: &AtomicBool) {
+///     let backoff = Backoff::new();
+///     while !ready.load(SeqCst) {
+///         if backoff.is_completed() {
+///             thread::park();
+///         } else {
+///             backoff.snooze();
+///         }
+///     }
+/// }
+/// ```
+///
+/// [`is_completed`]: struct.Backoff.html#method.is_completed
+/// [`std::thread::park()`]: https://doc.rust-lang.org/std/thread/fn.park.html
+/// [`Condvar`]: https://doc.rust-lang.org/std/sync/struct.Condvar.html
+/// [`AtomicBool`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html
+/// [`unpark()`]: https://doc.rust-lang.org/std/thread/struct.Thread.html#method.unpark
+pub struct Backoff {
+    step: Cell<u32>,
+}
+
+impl Backoff {
+    /// Creates a new `Backoff`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::Backoff;
+    ///
+    /// let backoff = Backoff::new();
+    /// ```
+    #[inline]
+    pub fn new() -> Self {
+        Backoff {
+            step: Cell::new(0),
+        }
+    }
+
+    /// Resets the `Backoff`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::Backoff;
+    ///
+    /// let backoff = Backoff::new();
+    /// backoff.reset();
+    /// ```
+    #[inline]
+    pub fn reset(&self) {
+        self.step.set(0);
+    }
+
+    /// Backs off in a lock-free loop.
+    ///
+    /// This method should be used when we need to retry an operation because another thread made
+    /// progress.
+    ///
+    /// The processor may yield using the *YIELD* or *PAUSE* instruction.
+    ///
+    /// # Examples
+    ///
+    /// Backing off in a lock-free loop:
+    ///
+    /// ```
+    /// use crossbeam_utils::Backoff;
+    /// use std::sync::atomic::AtomicUsize;
+    /// use std::sync::atomic::Ordering::SeqCst;
+    ///
+    /// fn fetch_mul(a: &AtomicUsize, b: usize) -> usize {
+    ///     let backoff = Backoff::new();
+    ///     loop {
+    ///         let val = a.load(SeqCst);
+    ///         if a.compare_and_swap(val, val.wrapping_mul(b), SeqCst) == val {
+    ///             return val;
+    ///         }
+    ///         backoff.spin();
+    ///     }
+    /// }
+    ///
+    /// let a = AtomicUsize::new(7);
+    /// assert_eq!(fetch_mul(&a, 8), 7);
+    /// assert_eq!(a.load(SeqCst), 56);
+    /// ```
+    #[inline]
+    pub fn spin(&self) {
+        for _ in 0..1 << self.step.get().min(SPIN_LIMIT) {
+            atomic::spin_loop_hint();
+        }
+
+        if self.step.get() <= SPIN_LIMIT {
+            self.step.set(self.step.get() + 1);
+        }
+    }
+
+    /// Backs off in a blocking loop.
+    ///
+    /// This method should be used when we need to wait for another thread to make progress.
+    ///
+    /// The processor may yield using the *YIELD* or *PAUSE* instruction and the current thread
+    /// may yield by giving up a timeslice to the OS scheduler.
+    ///
+    /// In `#[no_std]` environments, this method is equivalent to [`spin`].
+    ///
+    /// If possible, use [`is_completed`] to check when it is advised to stop using backoff and
+    /// block the current thread using a different synchronization mechanism instead.
+    ///
+    /// [`spin`]: struct.Backoff.html#method.spin
+    /// [`is_completed`]: struct.Backoff.html#method.is_completed
+    ///
+    /// # Examples
+    ///
+    /// Waiting for an [`AtomicBool`] to become `true`:
+    ///
+    /// ```
+    /// use crossbeam_utils::Backoff;
+    /// use std::sync::Arc;
+    /// use std::sync::atomic::AtomicBool;
+    /// use std::sync::atomic::Ordering::SeqCst;
+    /// use std::thread;
+    /// use std::time::Duration;
+    ///
+    /// fn spin_wait(ready: &AtomicBool) {
+    ///     let backoff = Backoff::new();
+    ///     while !ready.load(SeqCst) {
+    ///         backoff.snooze();
+    ///     }
+    /// }
+    ///
+    /// let ready = Arc::new(AtomicBool::new(false));
+    /// let ready2 = ready.clone();
+    ///
+    /// thread::spawn(move || {
+    ///     thread::sleep(Duration::from_millis(100));
+    ///     ready2.store(true, SeqCst);
+    /// });
+    ///
+    /// assert_eq!(ready.load(SeqCst), false);
+    /// spin_wait(&ready);
+    /// assert_eq!(ready.load(SeqCst), true);
+    /// ```
+    ///
+    /// [`AtomicBool`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html
+    #[inline]
+    pub fn snooze(&self) {
+        if self.step.get() <= SPIN_LIMIT {
+            for _ in 0..1 << self.step.get() {
+                atomic::spin_loop_hint();
+            }
+        } else {
+            #[cfg(not(feature = "std"))]
+            for _ in 0..1 << self.step.get() {
+                atomic::spin_loop_hint();
+            }
+
+            #[cfg(feature = "std")]
+            ::std::thread::yield_now();
+        }
+
+        if self.step.get() <= YIELD_LIMIT {
+            self.step.set(self.step.get() + 1);
+        }
+    }
+
+    /// Returns `true` if exponential backoff has completed and blocking the thread is advised.
+    ///
+    /// # Examples
+    ///
+    /// Waiting for an [`AtomicBool`] to become `true` and parking the thread after a long wait:
+    ///
+    /// ```
+    /// use crossbeam_utils::Backoff;
+    /// use std::sync::Arc;
+    /// use std::sync::atomic::AtomicBool;
+    /// use std::sync::atomic::Ordering::SeqCst;
+    /// use std::thread;
+    /// use std::time::Duration;
+    ///
+    /// fn blocking_wait(ready: &AtomicBool) {
+    ///     let backoff = Backoff::new();
+    ///     while !ready.load(SeqCst) {
+    ///         if backoff.is_completed() {
+    ///             thread::park();
+    ///         } else {
+    ///             backoff.snooze();
+    ///         }
+    ///     }
+    /// }
+    ///
+    /// let ready = Arc::new(AtomicBool::new(false));
+    /// let ready2 = ready.clone();
+    /// let waiter = thread::current();
+    ///
+    /// thread::spawn(move || {
+    ///     thread::sleep(Duration::from_millis(100));
+    ///     ready2.store(true, SeqCst);
+    ///     waiter.unpark();
+    /// });
+    ///
+    /// assert_eq!(ready.load(SeqCst), false);
+    /// blocking_wait(&ready);
+    /// assert_eq!(ready.load(SeqCst), true);
+    /// ```
+    ///
+    /// [`AtomicBool`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html
+    #[inline]
+    pub fn is_completed(&self) -> bool {
+        self.step.get() > YIELD_LIMIT
+    }
+
+    #[inline]
+    #[doc(hidden)]
+    #[deprecated(note = "use `is_completed` instead")]
+    pub fn is_complete(&self) -> bool {
+        self.is_completed()
+    }
+}
+
+impl fmt::Debug for Backoff {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("Backoff")
+            .field("step", &self.step)
+            .field("is_completed", &self.is_completed())
+            .finish()
+    }
+}
+
+impl Default for Backoff {
+    fn default() -> Backoff {
+        Backoff::new()
+    }
+}
diff --git a/rustc_deps/vendor/crossbeam-utils/src/lib.rs b/rustc_deps/vendor/crossbeam-utils/src/lib.rs
index b093963..82b49aa 100644
--- a/rustc_deps/vendor/crossbeam-utils/src/lib.rs
+++ b/rustc_deps/vendor/crossbeam-utils/src/lib.rs
@@ -1,11 +1,36 @@
-//! Utilities for concurrent programming.
+//! Miscellaneous tools for concurrent programming.
+//!
+//! ## Atomics
+//!
+//! * [`AtomicCell`], a thread-safe mutable memory location.
+//! * [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering.
+//!
+//! ## Thread synchronization
+//!
+//! * [`Parker`], a thread parking primitive.
+//! * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads.
+//! * [`WaitGroup`], for synchronizing the beginning or end of some computation.
+//!
+//! ## Utilities
+//!
+//! * [`Backoff`], for exponential backoff in spin loops.
+//! * [`CachePadded`], for padding and aligning a value to the length of a cache line.
+//! * [`scope`], for spawning threads that borrow local variables from the stack.
+//!
+//! [`AtomicCell`]: atomic/struct.AtomicCell.html
+//! [`AtomicConsume`]: atomic/trait.AtomicConsume.html
+//! [`Parker`]: sync/struct.Parker.html
+//! [`ShardedLock`]: sync/struct.ShardedLock.html
+//! [`WaitGroup`]: sync/struct.WaitGroup.html
+//! [`Backoff`]: struct.Backoff.html
+//! [`CachePadded`]: struct.CachePadded.html
+//! [`scope`]: thread/fn.scope.html
 
 #![warn(missing_docs)]
 #![warn(missing_debug_implementations)]
 #![cfg_attr(not(feature = "std"), no_std)]
 #![cfg_attr(feature = "nightly", feature(alloc))]
 #![cfg_attr(feature = "nightly", feature(cfg_target_has_atomic))]
-#![cfg_attr(feature = "nightly", feature(integer_atomics))]
 
 #[macro_use]
 extern crate cfg_if;
@@ -28,8 +53,14 @@
 mod cache_padded;
 pub use cache_padded::CachePadded;
 
+mod backoff;
+pub use backoff::Backoff;
+
 cfg_if! {
     if #[cfg(feature = "std")] {
+        #[macro_use]
+        extern crate lazy_static;
+
         pub mod sync;
         pub mod thread;
     }
diff --git a/rustc_deps/vendor/crossbeam-utils/src/sync/mod.rs b/rustc_deps/vendor/crossbeam-utils/src/sync/mod.rs
index 176250e..31c8ffe 100644
--- a/rustc_deps/vendor/crossbeam-utils/src/sync/mod.rs
+++ b/rustc_deps/vendor/crossbeam-utils/src/sync/mod.rs
@@ -1,5 +1,17 @@
-//! Synchronization tools.
+//! Thread synchronization primitives.
+//!
+//! * [`Parker`], a thread parking primitive.
+//! * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads.
+//! * [`WaitGroup`], for synchronizing the beginning or end of some computation.
+//!
+//! [`Parker`]: struct.Parker.html
+//! [`ShardedLock`]: struct.ShardedLock.html
+//! [`WaitGroup`]: struct.WaitGroup.html
 
 mod parker;
+mod sharded_lock;
+mod wait_group;
 
+pub use self::sharded_lock::{ShardedLock, ShardedLockReadGuard, ShardedLockWriteGuard};
 pub use self::parker::{Parker, Unparker};
+pub use self::wait_group::WaitGroup;
diff --git a/rustc_deps/vendor/crossbeam-utils/src/sync/sharded_lock.rs b/rustc_deps/vendor/crossbeam-utils/src/sync/sharded_lock.rs
new file mode 100644
index 0000000..0fbb291
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-utils/src/sync/sharded_lock.rs
@@ -0,0 +1,600 @@
+use std::cell::UnsafeCell;
+use std::collections::HashMap;
+use std::fmt;
+use std::marker::PhantomData;
+use std::mem;
+use std::ops::{Deref, DerefMut};
+use std::panic::{RefUnwindSafe, UnwindSafe};
+use std::sync::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard};
+use std::sync::{LockResult, PoisonError, TryLockError, TryLockResult};
+use std::thread::{self, ThreadId};
+
+use CachePadded;
+
+/// The number of shards per sharded lock. Must be a power of two.
+const NUM_SHARDS: usize = 8;
+
+/// A shard containing a single reader-writer lock.
+struct Shard {
+    /// The inner reader-writer lock.
+    lock: RwLock<()>,
+
+    /// The write-guard keeping this shard locked.
+    ///
+    /// Write operations will lock each shard and store the guard here. These guards get dropped at
+    /// the same time the big guard is dropped.
+    write_guard: UnsafeCell<Option<RwLockWriteGuard<'static, ()>>>,
+}
+
+/// A sharded reader-writer lock.
+///
+/// This lock is equivalent to [`RwLock`], except read operations are faster and write operations
+/// are slower.
+///
+/// A `ShardedLock` is internally made of a list of *shards*, each being a [`RwLock`] occupying a
+/// single cache line. Read operations will pick one of the shards depending on the current thread
+/// and lock it. Write operations need to lock all shards in succession.
+///
+/// By splitting the lock into shards, concurrent read operations will in most cases choose
+/// different shards and thus update different cache lines, which is good for scalability. However,
+/// write operations need to do more work and are therefore slower than usual.
+///
+/// The priority policy of the lock is dependent on the underlying operating system's
+/// implementation, and this type does not guarantee that any particular policy will be used.
+///
+/// # Poisoning
+///
+/// A `ShardedLock`, like [`RwLock`], will become poisoned on a panic. Note that it may only be
+/// poisoned if a panic occurs while a write operation is in progress. If a panic occurs in any
+/// read operation, the lock will not be poisoned.
+///
+/// # Examples
+///
+/// ```
+/// use crossbeam_utils::sync::ShardedLock;
+///
+/// let lock = ShardedLock::new(5);
+///
+/// // Any number of read locks can be held at once.
+/// {
+///     let r1 = lock.read().unwrap();
+///     let r2 = lock.read().unwrap();
+///     assert_eq!(*r1, 5);
+///     assert_eq!(*r2, 5);
+/// } // Read locks are dropped at this point.
+///
+/// // However, only one write lock may be held.
+/// {
+///     let mut w = lock.write().unwrap();
+///     *w += 1;
+///     assert_eq!(*w, 6);
+/// } // Write lock is dropped here.
+/// ```
+///
+/// [`RwLock`]: https://doc.rust-lang.org/std/sync/struct.RwLock.html
+pub struct ShardedLock<T: ?Sized> {
+    /// A list of locks protecting the internal data.
+    shards: Box<[CachePadded<Shard>]>,
+
+    /// The internal data.
+    value: UnsafeCell<T>,
+}
+
+unsafe impl<T: ?Sized + Send> Send for ShardedLock<T> {}
+unsafe impl<T: ?Sized + Send + Sync> Sync for ShardedLock<T> {}
+
+impl<T: ?Sized> UnwindSafe for ShardedLock<T> {}
+impl<T: ?Sized> RefUnwindSafe for ShardedLock<T> {}
+
+impl<T> ShardedLock<T> {
+    /// Creates a new sharded reader-writer lock.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    ///
+    /// let lock = ShardedLock::new(5);
+    /// ```
+    pub fn new(value: T) -> ShardedLock<T> {
+        ShardedLock {
+            shards: (0..NUM_SHARDS)
+                .map(|_| CachePadded::new(Shard {
+                    lock: RwLock::new(()),
+                    write_guard: UnsafeCell::new(None),
+                }))
+                .collect::<Vec<_>>()
+                .into_boxed_slice(),
+            value: UnsafeCell::new(value),
+        }
+    }
+
+    /// Consumes this lock, returning the underlying data.
+    ///
+    /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write
+    /// operation panics.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    ///
+    /// let lock = ShardedLock::new(String::new());
+    /// {
+    ///     let mut s = lock.write().unwrap();
+    ///     *s = "modified".to_owned();
+    /// }
+    /// assert_eq!(lock.into_inner().unwrap(), "modified");
+    /// ```
+    pub fn into_inner(self) -> LockResult<T> {
+        let is_poisoned = self.is_poisoned();
+        let inner = self.value.into_inner();
+
+        if is_poisoned {
+            Err(PoisonError::new(inner))
+        } else {
+            Ok(inner)
+        }
+    }
+}
+
+impl<T: ?Sized> ShardedLock<T> {
+    /// Returns `true` if the lock is poisoned.
+    ///
+    /// If another thread can still access the lock, it may become poisoned at any time. A `false`
+    /// result should not be trusted without additional synchronization.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    /// use std::sync::Arc;
+    /// use std::thread;
+    ///
+    /// let lock = Arc::new(ShardedLock::new(0));
+    /// let c_lock = lock.clone();
+    ///
+    /// let _ = thread::spawn(move || {
+    ///     let _lock = c_lock.write().unwrap();
+    ///     panic!(); // the lock gets poisoned
+    /// }).join();
+    /// assert_eq!(lock.is_poisoned(), true);
+    /// ```
+    pub fn is_poisoned(&self) -> bool {
+        self.shards[0].lock.is_poisoned()
+    }
+
+    /// Returns a mutable reference to the underlying data.
+    ///
+    /// Since this call borrows the lock mutably, no actual locking needs to take place.
+    ///
+    /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write
+    /// operation panics.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    ///
+    /// let mut lock = ShardedLock::new(0);
+    /// *lock.get_mut().unwrap() = 10;
+    /// assert_eq!(*lock.read().unwrap(), 10);
+    /// ```
+    pub fn get_mut(&mut self) -> LockResult<&mut T> {
+        let is_poisoned = self.is_poisoned();
+        let inner = unsafe { &mut *self.value.get() };
+
+        if is_poisoned {
+            Err(PoisonError::new(inner))
+        } else {
+            Ok(inner)
+        }
+    }
+
+    /// Attempts to acquire this lock with shared read access.
+    ///
+    /// If the access could not be granted at this time, an error is returned. Otherwise, a guard
+    /// is returned which will release the shared access when it is dropped. This method does not
+    /// provide any guarantees with respect to the ordering of whether contentious readers or
+    /// writers will acquire the lock first.
+    ///
+    /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write
+    /// operation panics.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    ///
+    /// let lock = ShardedLock::new(1);
+    ///
+    /// match lock.try_read() {
+    ///     Ok(n) => assert_eq!(*n, 1),
+    ///     Err(_) => unreachable!(),
+    /// };
+    /// ```
+    pub fn try_read(&self) -> TryLockResult<ShardedLockReadGuard<T>> {
+        // Take the current thread index and map it to a shard index. Thread indices will tend to
+        // distribute shards among threads equally, thus reducing contention due to read-locking.
+        let current_index = current_index().unwrap_or(0);
+        let shard_index = current_index & (self.shards.len() - 1);
+
+        match self.shards[shard_index].lock.try_read() {
+            Ok(guard) => Ok(ShardedLockReadGuard {
+                lock: self,
+                _guard: guard,
+                _marker: PhantomData,
+            }),
+            Err(TryLockError::Poisoned(err)) => {
+                let guard = ShardedLockReadGuard {
+                    lock: self,
+                    _guard: err.into_inner(),
+                    _marker: PhantomData,
+                };
+                Err(TryLockError::Poisoned(PoisonError::new(guard)))
+            },
+            Err(TryLockError::WouldBlock) => Err(TryLockError::WouldBlock),
+        }
+    }
+
+    /// Locks with shared read access, blocking the current thread until it can be acquired.
+    ///
+    /// The calling thread will be blocked until there are no more writers which hold the lock.
+    /// There may be other readers currently inside the lock when this method returns. This method
+    /// does not provide any guarantees with respect to the ordering of whether contentious readers
+    /// or writers will acquire the lock first.
+    ///
+    /// Returns a guard which will release the shared access when dropped.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    /// use std::sync::Arc;
+    /// use std::thread;
+    ///
+    /// let lock = Arc::new(ShardedLock::new(1));
+    /// let c_lock = lock.clone();
+    ///
+    /// let n = lock.read().unwrap();
+    /// assert_eq!(*n, 1);
+    ///
+    /// thread::spawn(move || {
+    ///     let r = c_lock.read();
+    ///     assert!(r.is_ok());
+    /// }).join().unwrap();
+    /// ```
+    pub fn read(&self) -> LockResult<ShardedLockReadGuard<T>> {
+        // Take the current thread index and map it to a shard index. Thread indices will tend to
+        // distribute shards among threads equally, thus reducing contention due to read-locking.
+        let current_index = current_index().unwrap_or(0);
+        let shard_index = current_index & (self.shards.len() - 1);
+
+        match self.shards[shard_index].lock.read() {
+            Ok(guard) => Ok(ShardedLockReadGuard {
+                lock: self,
+                _guard: guard,
+                _marker: PhantomData,
+            }),
+            Err(err) => Err(PoisonError::new(ShardedLockReadGuard {
+                lock: self,
+                _guard: err.into_inner(),
+                _marker: PhantomData,
+            })),
+        }
+    }
+
+    /// Attempts to acquire this lock with exclusive write access.
+    ///
+    /// If the access could not be granted at this time, an error is returned. Otherwise, a guard
+    /// is returned which will release the exclusive access when it is dropped. This method does
+    /// not provide any guarantees with respect to the ordering of whether contentious readers or
+    /// writers will acquire the lock first.
+    ///
+    /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write
+    /// operation panics.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    ///
+    /// let lock = ShardedLock::new(1);
+    ///
+    /// let n = lock.read().unwrap();
+    /// assert_eq!(*n, 1);
+    ///
+    /// assert!(lock.try_write().is_err());
+    /// ```
+    pub fn try_write(&self) -> TryLockResult<ShardedLockWriteGuard<T>> {
+        let mut poisoned = false;
+        let mut blocked = None;
+
+        // Write-lock each shard in succession.
+        for (i, shard) in self.shards.iter().enumerate() {
+            let guard = match shard.lock.try_write() {
+                Ok(guard) => guard,
+                Err(TryLockError::Poisoned(err)) => {
+                    poisoned = true;
+                    err.into_inner()
+                },
+                Err(TryLockError::WouldBlock) => {
+                    blocked = Some(i);
+                    break;
+                }
+            };
+
+            // Store the guard into the shard.
+            unsafe {
+                let guard: RwLockWriteGuard<'static, ()> = mem::transmute(guard);
+                let dest: *mut _ = shard.write_guard.get();
+                *dest = Some(guard);
+            }
+        }
+
+        if let Some(i) = blocked {
+            // Unlock the shards in reverse order of locking.
+            for shard in self.shards[0..i].iter().rev() {
+                unsafe {
+                    let dest: *mut _ = shard.write_guard.get();
+                    let guard = mem::replace(&mut *dest, None);
+                    drop(guard);
+                }
+            }
+            Err(TryLockError::WouldBlock)
+        } else if poisoned {
+            let guard = ShardedLockWriteGuard {
+                lock: self,
+                _marker: PhantomData,
+            };
+            Err(TryLockError::Poisoned(PoisonError::new(guard)))
+        } else {
+            Ok(ShardedLockWriteGuard {
+                lock: self,
+                _marker: PhantomData,
+            })
+        }
+    }
+
+    /// Locks with exclusive write access, blocking the current thread until it can be acquired.
+    ///
+    /// The calling thread will be blocked until there are no more writers which hold the lock.
+    /// There may be other readers currently inside the lock when this method returns. This method
+    /// does not provide any guarantees with respect to the ordering of whether contentious readers
+    /// or writers will acquire the lock first.
+    ///
+    /// Returns a guard which will release the exclusive access when dropped.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::ShardedLock;
+    ///
+    /// let lock = ShardedLock::new(1);
+    ///
+    /// let mut n = lock.write().unwrap();
+    /// *n = 2;
+    ///
+    /// assert!(lock.try_read().is_err());
+    /// ```
+    pub fn write(&self) -> LockResult<ShardedLockWriteGuard<T>> {
+        let mut poisoned = false;
+
+        // Write-lock each shard in succession.
+        for shard in self.shards.iter() {
+            let guard = match shard.lock.write() {
+                Ok(guard) => guard,
+                Err(err) => {
+                    poisoned = true;
+                    err.into_inner()
+                }
+            };
+
+            // Store the guard into the shard.
+            unsafe {
+                let guard: RwLockWriteGuard<'_, ()> = guard;
+                let guard: RwLockWriteGuard<'static, ()> = mem::transmute(guard);
+                let dest: *mut _ = shard.write_guard.get();
+                *dest = Some(guard);
+            }
+        }
+
+        if poisoned {
+            Err(PoisonError::new(ShardedLockWriteGuard {
+                lock: self,
+                _marker: PhantomData,
+            }))
+        } else {
+            Ok(ShardedLockWriteGuard {
+                lock: self,
+                _marker: PhantomData,
+            })
+        }
+    }
+}
+
+impl<T: ?Sized + fmt::Debug> fmt::Debug for ShardedLock<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.try_read() {
+            Ok(guard) => f.debug_struct("ShardedLock").field("data", &&*guard).finish(),
+            Err(TryLockError::Poisoned(err)) => {
+                f.debug_struct("ShardedLock").field("data", &&**err.get_ref()).finish()
+            },
+            Err(TryLockError::WouldBlock) => {
+                struct LockedPlaceholder;
+                impl fmt::Debug for LockedPlaceholder {
+                    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+                        f.write_str("<locked>")
+                    }
+                }
+                f.debug_struct("ShardedLock").field("data", &LockedPlaceholder).finish()
+            }
+        }
+    }
+}
+
+impl<T: Default> Default for ShardedLock<T> {
+    fn default() -> ShardedLock<T> {
+        ShardedLock::new(Default::default())
+    }
+}
+
+impl<T> From<T> for ShardedLock<T> {
+    fn from(t: T) -> Self {
+        ShardedLock::new(t)
+    }
+}
+
+/// A guard used to release the shared read access of a [`ShardedLock`] when dropped.
+///
+/// [`ShardedLock`]: struct.ShardedLock.html
+pub struct ShardedLockReadGuard<'a, T: ?Sized + 'a> {
+    lock: &'a ShardedLock<T>,
+    _guard: RwLockReadGuard<'a, ()>,
+    _marker: PhantomData<RwLockReadGuard<'a, T>>,
+}
+
+unsafe impl<'a, T: ?Sized + Sync> Sync for ShardedLockReadGuard<'a, T> {}
+
+impl<'a, T: ?Sized> Deref for ShardedLockReadGuard<'a, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        unsafe { &*self.lock.value.get() }
+    }
+}
+
+impl<'a, T: fmt::Debug> fmt::Debug for ShardedLockReadGuard<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("ShardedLockReadGuard")
+            .field("lock", &self.lock)
+            .finish()
+    }
+}
+
+impl<'a, T: ?Sized + fmt::Display> fmt::Display for ShardedLockReadGuard<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        (**self).fmt(f)
+    }
+}
+
+/// A guard used to release the exclusive write access of a [`ShardedLock`] when dropped.
+///
+/// [`ShardedLock`]: struct.ShardedLock.html
+pub struct ShardedLockWriteGuard<'a, T: ?Sized + 'a> {
+    lock: &'a ShardedLock<T>,
+    _marker: PhantomData<RwLockWriteGuard<'a, T>>,
+}
+
+unsafe impl<'a, T: ?Sized + Sync> Sync for ShardedLockWriteGuard<'a, T> {}
+
+impl<'a, T: ?Sized> Drop for ShardedLockWriteGuard<'a, T> {
+    fn drop(&mut self) {
+        // Unlock the shards in reverse order of locking.
+        for shard in self.lock.shards.iter().rev() {
+            unsafe {
+                let dest: *mut _ = shard.write_guard.get();
+                let guard = mem::replace(&mut *dest, None);
+                drop(guard);
+            }
+        }
+    }
+}
+
+impl<'a, T: fmt::Debug> fmt::Debug for ShardedLockWriteGuard<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.debug_struct("ShardedLockWriteGuard")
+            .field("lock", &self.lock)
+            .finish()
+    }
+}
+
+impl<'a, T: ?Sized + fmt::Display> fmt::Display for ShardedLockWriteGuard<'a, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        (**self).fmt(f)
+    }
+}
+
+impl<'a, T: ?Sized> Deref for ShardedLockWriteGuard<'a, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T {
+        unsafe { &*self.lock.value.get() }
+    }
+}
+
+impl<'a, T: ?Sized> DerefMut for ShardedLockWriteGuard<'a, T> {
+    fn deref_mut(&mut self) -> &mut T {
+        unsafe { &mut *self.lock.value.get() }
+    }
+}
+
+/// Returns a `usize` that identifies the current thread.
+///
+/// Each thread is associated with an 'index'. While there are no particular guarantees, indices
+/// usually tend to be consecutive numbers between 0 and the number of running threads.
+///
+/// Since this function accesses TLS, `None` might be returned if the current thread's TLS is
+/// tearing down.
+#[inline]
+fn current_index() -> Option<usize> {
+    REGISTRATION.try_with(|reg| reg.index).ok()
+}
+
+/// The global registry keeping track of registered threads and indices.
+struct ThreadIndices {
+    /// Mapping from `ThreadId` to thread index.
+    mapping: HashMap<ThreadId, usize>,
+
+    /// A list of free indices.
+    free_list: Vec<usize>,
+
+    /// The next index to allocate if the free list is empty.
+    next_index: usize,
+}
+
+lazy_static! {
+    static ref THREAD_INDICES: Mutex<ThreadIndices> = Mutex::new(ThreadIndices {
+        mapping: HashMap::new(),
+        free_list: Vec::new(),
+        next_index: 0,
+    });
+}
+
+/// A registration of a thread with an index.
+///
+/// When dropped, unregisters the thread and frees the reserved index.
+struct Registration {
+    index: usize,
+    thread_id: ThreadId,
+}
+
+impl Drop for Registration {
+    fn drop(&mut self) {
+        let mut indices = THREAD_INDICES.lock().unwrap();
+        indices.mapping.remove(&self.thread_id);
+        indices.free_list.push(self.index);
+    }
+}
+
+thread_local! {
+    static REGISTRATION: Registration = {
+        let thread_id = thread::current().id();
+        let mut indices = THREAD_INDICES.lock().unwrap();
+
+        let index = match indices.free_list.pop() {
+            Some(i) => i,
+            None => {
+                let i = indices.next_index;
+                indices.next_index += 1;
+                i
+            }
+        };
+        indices.mapping.insert(thread_id, index);
+
+        Registration {
+            index,
+            thread_id,
+        }
+    };
+}
diff --git a/rustc_deps/vendor/crossbeam-utils/src/sync/wait_group.rs b/rustc_deps/vendor/crossbeam-utils/src/sync/wait_group.rs
new file mode 100644
index 0000000..16ddc30
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-utils/src/sync/wait_group.rs
@@ -0,0 +1,139 @@
+use std::fmt;
+use std::sync::{Arc, Condvar, Mutex};
+
+/// Enables threads to synchronize the beginning or end of some computation.
+///
+/// # Wait groups vs barriers
+///
+/// `WaitGroup` is very similar to [`Barrier`], but there are a few differences:
+///
+/// * `Barrier` needs to know the number of threads at construction, while `WaitGroup` is cloned to
+///   register more threads.
+///
+/// * A `Barrier` can be reused even after all threads have synchronized, while a `WaitGroup`
+///   synchronizes threads only once.
+///
+/// * All threads wait for others to reach the `Barrier`. With `WaitGroup`, each thread can choose
+///   to either wait for other threads or to continue without blocking.
+///
+/// # Examples
+///
+/// ```
+/// use crossbeam_utils::sync::WaitGroup;
+/// use std::thread;
+///
+/// // Create a new wait group.
+/// let wg = WaitGroup::new();
+///
+/// for _ in 0..4 {
+///     // Create another reference to the wait group.
+///     let wg = wg.clone();
+///
+///     thread::spawn(move || {
+///         // Do some work.
+///
+///         // Drop the reference to the wait group.
+///         drop(wg);
+///     });
+/// }
+///
+/// // Block until all threads have finished their work.
+/// wg.wait();
+/// ```
+///
+/// [`Barrier`]: https://doc.rust-lang.org/std/sync/struct.Barrier.html
+pub struct WaitGroup {
+    inner: Arc<Inner>,
+}
+
+/// Inner state of a `WaitGroup`.
+struct Inner {
+    cvar: Condvar,
+    count: Mutex<usize>,
+}
+
+impl WaitGroup {
+    /// Creates a new wait group and returns the single reference to it.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::WaitGroup;
+    ///
+    /// let wg = WaitGroup::new();
+    /// ```
+    pub fn new() -> WaitGroup {
+        WaitGroup {
+            inner: Arc::new(Inner {
+                cvar: Condvar::new(),
+                count: Mutex::new(1),
+            }),
+        }
+    }
+
+    /// Drops this reference and waits until all other references are dropped.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::sync::WaitGroup;
+    /// use std::thread;
+    ///
+    /// let wg = WaitGroup::new();
+    ///
+    /// thread::spawn({
+    ///     let wg = wg.clone();
+    ///     move || {
+    ///         // Block until both threads have reached `wait()`.
+    ///         wg.wait();
+    ///     }
+    /// });
+    ///
+    /// // Block until both threads have reached `wait()`.
+    /// wg.wait();
+    /// ```
+    pub fn wait(self) {
+        if *self.inner.count.lock().unwrap() == 1 {
+            return;
+        }
+
+        let inner = self.inner.clone();
+        drop(self);
+
+        let mut count = inner.count.lock().unwrap();
+        while *count > 0 {
+            count = inner.cvar.wait(count).unwrap();
+        }
+    }
+}
+
+impl Drop for WaitGroup {
+    fn drop(&mut self) {
+        let mut count = self.inner.count.lock().unwrap();
+        *count -= 1;
+
+        if *count == 0 {
+            self.inner.cvar.notify_all();
+        }
+    }
+}
+
+impl Clone for WaitGroup {
+    fn clone(&self) -> WaitGroup {
+        let mut count = self.inner.count.lock().unwrap();
+        *count += 1;
+
+        WaitGroup {
+            inner: self.inner.clone(),
+        }
+    }
+}
+
+impl fmt::Debug for WaitGroup {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let count: &usize = &*self.inner.count.lock().unwrap();
+        f.debug_struct("WaitGroup")
+            .field("count", count)
+            .finish()
+    }
+}
diff --git a/rustc_deps/vendor/crossbeam-utils/src/thread.rs b/rustc_deps/vendor/crossbeam-utils/src/thread.rs
index 994e3c5..495e9b1 100644
--- a/rustc_deps/vendor/crossbeam-utils/src/thread.rs
+++ b/rustc_deps/vendor/crossbeam-utils/src/thread.rs
@@ -11,9 +11,9 @@
 //!     "Carol".to_string(),
 //! ];
 //!
-//! thread::scope(|scope| {
+//! thread::scope(|s| {
 //!     for person in &people {
-//!         scope.spawn(move |_| {
+//!         s.spawn(move |_| {
 //!             println!("Hello, {}!", person);
 //!         });
 //!     }
@@ -74,10 +74,43 @@
 //! `'static` lifetime because the borrow checker cannot be sure when the thread will complete.
 //!
 //! A scope creates a clear boundary between variables outside the scope and threads inside the
-//! scope. Whenever a scope spawns a thread, it promises to join the thread before the scope ends.
+//! scope. Whenever a s.spawns a thread, it promises to join the thread before the scope ends.
 //! This way we guarantee to the borrow checker that scoped threads only live within the scope and
 //! can safely access variables outside it.
 //!
+//! # Nesting scoped threads
+//!
+//! Sometimes scoped threads need to spawn more threads within the same scope. This is a little
+//! tricky because argument `s` lives *inside* the invocation of `thread::scope()` and as such
+//! cannot be borrowed by scoped threads:
+//!
+//! ```ignore
+//! use crossbeam_utils::thread;
+//!
+//! thread::scope(|s| {
+//!     s.spawn(|_| {
+//!         // Not going to compile because we're trying to borrow `s`,
+//!         // which lives *inside* the scope! :(
+//!         s.spawn(|_| println!("nested thread"));
+//!     }});
+//! });
+//! ```
+//!
+//! Fortunately, there is a solution. Every scoped thread is passed a reference to its scope as an
+//! argument, which can be used for spawning nested threads:
+//!
+//! ```ignore
+//! use crossbeam_utils::thread;
+//!
+//! thread::scope(|s| {
+//!     // Note the `|s|` here.
+//!     s.spawn(|s| {
+//!         // Yay, this works because we're using a fresh argument `s`! :)
+//!         s.spawn(|_| println!("nested thread"));
+//!     }});
+//! });
+//! ```
+//!
 //! [`std::thread::spawn`]: https://doc.rust-lang.org/std/thread/fn.spawn.html
 
 use std::fmt;
@@ -85,39 +118,42 @@
 use std::marker::PhantomData;
 use std::mem;
 use std::panic;
-use std::sync::{Arc, Mutex, mpsc};
+use std::sync::{Arc, Mutex};
 use std::thread;
 
+use sync::WaitGroup;
+
 type SharedVec<T> = Arc<Mutex<Vec<T>>>;
 type SharedOption<T> = Arc<Mutex<Option<T>>>;
 
-/// Creates a new `Scope` for [*scoped thread spawning*](struct.Scope.html#method.spawn).
+/// Creates a new scope for spawning threads.
 ///
-/// No matter what happens, before the `Scope` is dropped, it is guaranteed that all the unjoined
-/// spawned scoped threads are joined.
-///
-/// `thread::scope()` returns `Ok(())` if all the unjoined spawned threads did not panic. It returns
-/// `Err(e)` if one of them panics with `e`. If many of them panic, it is still guaranteed that all
-/// the threads are joined, and `thread::scope()` returns `Err(e)` with `e` from a panicking thread.
+/// All child threads that haven't been manually joined will be automatically joined just before
+/// this function invocation ends. If all joined threads have successfully completed, `Ok` is
+/// returned with the return value of `f`. If any of the joined threads has panicked, an `Err` is
+/// returned containing errors from panicked threads.
 ///
 /// # Examples
 ///
-/// Creating and using a scope:
-///
 /// ```
-/// crossbeam_utils::thread::scope(|scope| {
-///     scope.spawn(|_| println!("Exiting scope"));
-///     scope.spawn(|_| println!("Running child thread in scope"));
+/// use crossbeam_utils::thread;
+///
+/// let var = vec![1, 2, 3];
+///
+/// thread::scope(|s| {
+///     s.spawn(|_| {
+///         println!("A child thread borrowing `var`: {:?}", var);
+///     });
 /// }).unwrap();
 /// ```
 pub fn scope<'env, F, R>(f: F) -> thread::Result<R>
 where
     F: FnOnce(&Scope<'env>) -> R,
 {
-    let (tx, rx) = mpsc::channel();
+    let wg = WaitGroup::new();
     let scope = Scope::<'env> {
         handles: SharedVec::default(),
-        chan: tx,
+        wait_group: wg.clone(),
         _marker: PhantomData,
     };
 
@@ -125,8 +161,8 @@
     let result = panic::catch_unwind(panic::AssertUnwindSafe(|| f(&scope)));
 
     // Wait until all nested scopes are dropped.
-    drop(scope.chan);
-    let _ = rx.recv();
+    drop(scope.wait_group);
+    wg.wait();
 
     // Join all remaining spawned threads.
     let panics: Vec<_> = {
@@ -163,7 +199,7 @@
     handles: SharedVec<SharedOption<thread::JoinHandle<()>>>,
 
     /// Used to wait until all subscopes all dropped.
-    chan: mpsc::Sender<()>,
+    wait_group: WaitGroup,
 
     /// Borrows data with invariant lifetime `'env`.
     _marker: PhantomData<&'env mut &'env ()>,
@@ -172,14 +208,35 @@
 unsafe impl<'env> Sync for Scope<'env> {}
 
 impl<'env> Scope<'env> {
-    /// Create a scoped thread.
+    /// Spawns a scoped thread.
     ///
-    /// `spawn` is similar to the [`spawn`] function in Rust's standard library. The difference is
-    /// that this thread is scoped, meaning that it's guaranteed to terminate before the current
-    /// stack frame goes away, allowing you to reference the parent stack frame directly. This is
-    /// ensured by having the parent thread join on the child thread before the scope exits.
+    /// This method is similar to the [`spawn`] function in Rust's standard library. The difference
+    /// is that this thread is scoped, meaning it's guaranteed to terminate before the scope exits,
+    /// allowing it to reference variables outside the scope.
+    ///
+    /// The scoped thread is passed a reference to this scope as an argument, which can be used for
+    /// spawning nested threads.
+    ///
+    /// The returned handle can be used to manually join the thread before the scope exits.
     ///
     /// [`spawn`]: https://doc.rust-lang.org/std/thread/fn.spawn.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    ///
+    /// thread::scope(|s| {
+    ///     let handle = s.spawn(|_| {
+    ///         println!("A child thread is running");
+    ///         42
+    ///     });
+    ///
+    ///     // Join the thread and retrieve its result.
+    ///     let res = handle.join().unwrap();
+    ///     assert_eq!(res, 42);
+    /// }).unwrap();
+    /// ```
     pub fn spawn<'scope, F, T>(&'scope self, f: F) -> ScopedJoinHandle<'scope, T>
     where
         F: FnOnce(&Scope<'env>) -> T,
@@ -189,8 +246,20 @@
         self.builder().spawn(f).unwrap()
     }
 
-    /// Generates the base configuration for spawning a scoped thread, from which configuration
-    /// methods can be chained.
+    /// Creates a builder that can configure a thread before spawning.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    /// use std::thread::current;
+    ///
+    /// thread::scope(|s| {
+    ///     s.builder()
+    ///         .spawn(|_| println!("A child thread is running"))
+    ///         .unwrap();
+    /// }).unwrap();
+    /// ```
     pub fn builder<'scope>(&'scope self) -> ScopedThreadBuilder<'scope, 'env> {
         ScopedThreadBuilder {
             scope: self,
@@ -205,8 +274,39 @@
     }
 }
 
-/// Scoped thread configuration. Provides detailed control over the properties and behavior of new
-/// scoped threads.
+/// Configures the properties of a new thread.
+///
+/// The two configurable properties are:
+///
+/// - [`name`]: Specifies an [associated name for the thread][naming-threads].
+/// - [`stack_size`]: Specifies the [desired stack size for the thread][stack-size].
+///
+/// The [`spawn`] method will take ownership of the builder and return an [`io::Result`] of the
+/// thread handle with the given configuration.
+///
+/// The [`Scope::spawn`] method uses a builder with default configuration and unwraps its return
+/// value. You may want to use this builder when you want to recover from a failure to launch a
+/// thread.
+///
+/// # Examples
+///
+/// ```
+/// use crossbeam_utils::thread;
+///
+/// thread::scope(|s| {
+///     s.builder()
+///         .spawn(|_| println!("Running a child thread"))
+///         .unwrap();
+/// }).unwrap();
+/// ```
+///
+/// [`name`]: struct.ScopedThreadBuilder.html#method.name
+/// [`stack_size`]: struct.ScopedThreadBuilder.html#method.stack_size
+/// [`spawn`]: struct.ScopedThreadBuilder.html#method.spawn
+/// [`Scope::spawn`]: struct.Scope.html#method.spawn
+/// [`io::Result`]: https://doc.rust-lang.org/std/io/type.Result.html
+/// [naming-threads]: https://doc.rust-lang.org/std/thread/index.html#naming-threads
+/// [stack-size]: https://doc.rust-lang.org/std/thread/index.html#stack-size
 #[derive(Debug)]
 pub struct ScopedThreadBuilder<'scope, 'env: 'scope> {
     scope: &'scope Scope<'env>,
@@ -214,20 +314,77 @@
 }
 
 impl<'scope, 'env> ScopedThreadBuilder<'scope, 'env> {
-    /// Names the thread-to-be. Currently the name is used for identification only in panic
-    /// messages.
+    /// Sets the name for the new thread.
+    ///
+    /// The name must not contain null bytes. For more information about named threads, see
+    /// [here][naming-threads].
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    /// use std::thread::current;
+    ///
+    /// thread::scope(|s| {
+    ///     s.builder()
+    ///         .name("my thread".to_string())
+    ///         .spawn(|_| assert_eq!(current().name(), Some("my thread")))
+    ///         .unwrap();
+    /// }).unwrap();
+    /// ```
+    ///
+    /// [naming-threads]: https://doc.rust-lang.org/std/thread/index.html#naming-threads
     pub fn name(mut self, name: String) -> ScopedThreadBuilder<'scope, 'env> {
         self.builder = self.builder.name(name);
         self
     }
 
     /// Sets the size of the stack for the new thread.
+    ///
+    /// The stack size is measured in bytes.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    ///
+    /// thread::scope(|s| {
+    ///     s.builder()
+    ///         .stack_size(32 * 1024)
+    ///         .spawn(|_| println!("Running a child thread"))
+    ///         .unwrap();
+    /// }).unwrap();
+    /// ```
     pub fn stack_size(mut self, size: usize) -> ScopedThreadBuilder<'scope, 'env> {
         self.builder = self.builder.stack_size(size);
         self
     }
 
-    /// Spawns a new thread, and returns a join handle for it.
+    /// Spawns a scoped thread with this configuration.
+    ///
+    /// The scoped thread is passed a reference to this scope as an argument, which can be used for
+    /// spawning nested threads.
+    ///
+    /// The returned handle can be used to manually join the thread before the scope exits.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    ///
+    /// thread::scope(|s| {
+    ///     let handle = s.builder()
+    ///         .spawn(|_| {
+    ///             println!("A child thread is running");
+    ///             42
+    ///         })
+    ///         .unwrap();
+    ///
+    ///     // Join the thread and retrieve its result.
+    ///     let res = handle.join().unwrap();
+    ///     assert_eq!(res, 42);
+    /// }).unwrap();
+    /// ```
     pub fn spawn<F, T>(self, f: F) -> io::Result<ScopedJoinHandle<'scope, T>>
     where
         F: FnOnce(&Scope<'env>) -> T,
@@ -244,7 +401,7 @@
             // A clone of the scope that will be moved into the new thread.
             let scope = Scope::<'env> {
                 handles: Arc::clone(&self.scope.handles),
-                chan: self.scope.chan.clone(),
+                wait_group: self.scope.wait_group.clone(),
                 _marker: PhantomData,
             };
 
@@ -294,7 +451,7 @@
 unsafe impl<'scope, T> Send for ScopedJoinHandle<'scope, T> {}
 unsafe impl<'scope, T> Sync for ScopedJoinHandle<'scope, T> {}
 
-/// A handle to a scoped thread
+/// A handle that can be used to join its scoped thread.
 pub struct ScopedJoinHandle<'scope, T> {
     /// A join handle to the spawned thread.
     handle: SharedOption<thread::JoinHandle<()>>,
@@ -310,17 +467,33 @@
 }
 
 impl<'scope, T> ScopedJoinHandle<'scope, T> {
-    /// Waits for the associated thread to finish.
+    /// Waits for the thread to finish and returns its result.
     ///
-    /// If the child thread panics, [`Err`] is returned with the parameter given to [`panic`].
-    ///
-    /// [`Err`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
-    /// [`panic`]: https://doc.rust-lang.org/std/macro.panic.html
+    /// If the child thread panics, an error is returned.
     ///
     /// # Panics
     ///
     /// This function may panic on some platforms if a thread attempts to join itself or otherwise
     /// may create a deadlock with joining threads.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    ///
+    /// thread::scope(|s| {
+    ///     let handle1 = s.spawn(|_| println!("I'm a happy thread :)"));
+    ///     let handle2 = s.spawn(|_| panic!("I'm a sad thread :("));
+    ///
+    ///     // Join the first thread and verify that it succeeded.
+    ///     let res = handle1.join();
+    ///     assert!(res.is_ok());
+    ///
+    ///     // Join the second thread and verify that it panicked.
+    ///     let res = handle2.join();
+    ///     assert!(res.is_err());
+    /// }).unwrap();
+    /// ```
     pub fn join(self) -> thread::Result<T> {
         // Take out the handle. The handle will surely be available because the root scope waits
         // for nested scopes before joining remaining threads.
@@ -332,9 +505,18 @@
             .map(|()| self.result.lock().unwrap().take().unwrap())
     }
 
-    /// Gets the underlying [`std::thread::Thread`] handle.
+    /// Returns a handle to the underlying thread.
     ///
-    /// [`std::thread::Thread`]: https://doc.rust-lang.org/std/thread/struct.Thread.html
+    /// # Examples
+    ///
+    /// ```
+    /// use crossbeam_utils::thread;
+    ///
+    /// thread::scope(|s| {
+    ///     let handle = s.spawn(|_| println!("A child thread is running"));
+    ///     println!("The child thread ID: {:?}", handle.thread().id());
+    /// }).unwrap();
+    /// ```
     pub fn thread(&self) -> &thread::Thread {
         &self.thread
     }
diff --git a/rustc_deps/vendor/crossbeam-utils/tests/sharded_lock.rs b/rustc_deps/vendor/crossbeam-utils/tests/sharded_lock.rs
new file mode 100644
index 0000000..374c3c3
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-utils/tests/sharded_lock.rs
@@ -0,0 +1,245 @@
+extern crate crossbeam_utils;
+extern crate rand;
+
+use std::sync::mpsc::channel;
+use std::thread;
+use std::sync::{Arc, TryLockError};
+use std::sync::atomic::{AtomicUsize, Ordering};
+
+use crossbeam_utils::sync::ShardedLock;
+use rand::Rng;
+
+#[derive(Eq, PartialEq, Debug)]
+struct NonCopy(i32);
+
+#[test]
+fn smoke() {
+    let l = ShardedLock::new(());
+    drop(l.read().unwrap());
+    drop(l.write().unwrap());
+    drop((l.read().unwrap(), l.read().unwrap()));
+    drop(l.write().unwrap());
+}
+
+#[test]
+fn frob() {
+    const N: u32 = 10;
+    const M: usize = 1000;
+
+    let r = Arc::new(ShardedLock::new(()));
+
+    let (tx, rx) = channel::<()>();
+    for _ in 0..N {
+        let tx = tx.clone();
+        let r = r.clone();
+        thread::spawn(move || {
+            let mut rng = rand::thread_rng();
+            for _ in 0..M {
+                if rng.gen_bool(1.0 / (N as f64)) {
+                    drop(r.write().unwrap());
+                } else {
+                    drop(r.read().unwrap());
+                }
+            }
+            drop(tx);
+        });
+    }
+    drop(tx);
+    let _ = rx.recv();
+}
+
+#[test]
+fn arc_poison_wr() {
+    let arc = Arc::new(ShardedLock::new(1));
+    let arc2 = arc.clone();
+    let _: Result<(), _> = thread::spawn(move || {
+        let _lock = arc2.write().unwrap();
+        panic!();
+    }).join();
+    assert!(arc.read().is_err());
+}
+
+#[test]
+fn arc_poison_ww() {
+    let arc = Arc::new(ShardedLock::new(1));
+    assert!(!arc.is_poisoned());
+    let arc2 = arc.clone();
+    let _: Result<(), _> = thread::spawn(move || {
+        let _lock = arc2.write().unwrap();
+        panic!();
+    }).join();
+    assert!(arc.write().is_err());
+    assert!(arc.is_poisoned());
+}
+
+#[test]
+fn arc_no_poison_rr() {
+    let arc = Arc::new(ShardedLock::new(1));
+    let arc2 = arc.clone();
+    let _: Result<(), _> = thread::spawn(move || {
+        let _lock = arc2.read().unwrap();
+        panic!();
+    }).join();
+    let lock = arc.read().unwrap();
+    assert_eq!(*lock, 1);
+}
+#[test]
+fn arc_no_poison_sl() {
+    let arc = Arc::new(ShardedLock::new(1));
+    let arc2 = arc.clone();
+    let _: Result<(), _> = thread::spawn(move || {
+        let _lock = arc2.read().unwrap();
+        panic!()
+    }).join();
+    let lock = arc.write().unwrap();
+    assert_eq!(*lock, 1);
+}
+
+#[test]
+fn arc() {
+    let arc = Arc::new(ShardedLock::new(0));
+    let arc2 = arc.clone();
+    let (tx, rx) = channel();
+
+    thread::spawn(move || {
+        let mut lock = arc2.write().unwrap();
+        for _ in 0..10 {
+            let tmp = *lock;
+            *lock = -1;
+            thread::yield_now();
+            *lock = tmp + 1;
+        }
+        tx.send(()).unwrap();
+    });
+
+    // Readers try to catch the writer in the act
+    let mut children = Vec::new();
+    for _ in 0..5 {
+        let arc3 = arc.clone();
+        children.push(thread::spawn(move || {
+            let lock = arc3.read().unwrap();
+            assert!(*lock >= 0);
+        }));
+    }
+
+    // Wait for children to pass their asserts
+    for r in children {
+        assert!(r.join().is_ok());
+    }
+
+    // Wait for writer to finish
+    rx.recv().unwrap();
+    let lock = arc.read().unwrap();
+    assert_eq!(*lock, 10);
+}
+
+#[test]
+fn arc_access_in_unwind() {
+    let arc = Arc::new(ShardedLock::new(1));
+    let arc2 = arc.clone();
+    let _ = thread::spawn(move || -> () {
+        struct Unwinder {
+            i: Arc<ShardedLock<isize>>,
+        }
+        impl Drop for Unwinder {
+            fn drop(&mut self) {
+                let mut lock = self.i.write().unwrap();
+                *lock += 1;
+            }
+        }
+        let _u = Unwinder { i: arc2 };
+        panic!();
+    }).join();
+    let lock = arc.read().unwrap();
+    assert_eq!(*lock, 2);
+}
+
+#[test]
+fn unsized_type() {
+    let sl: &ShardedLock<[i32]> = &ShardedLock::new([1, 2, 3]);
+    {
+        let b = &mut *sl.write().unwrap();
+        b[0] = 4;
+        b[2] = 5;
+    }
+    let comp: &[i32] = &[4, 2, 5];
+    assert_eq!(&*sl.read().unwrap(), comp);
+}
+
+#[test]
+fn try_write() {
+    let lock = ShardedLock::new(0isize);
+    let read_guard = lock.read().unwrap();
+
+    let write_result = lock.try_write();
+    match write_result {
+        Err(TryLockError::WouldBlock) => (),
+        Ok(_) => assert!(false, "try_write should not succeed while read_guard is in scope"),
+        Err(_) => assert!(false, "unexpected error"),
+    }
+
+    drop(read_guard);
+}
+
+#[test]
+fn test_into_inner() {
+    let m = ShardedLock::new(NonCopy(10));
+    assert_eq!(m.into_inner().unwrap(), NonCopy(10));
+}
+
+#[test]
+fn test_into_inner_drop() {
+    struct Foo(Arc<AtomicUsize>);
+    impl Drop for Foo {
+        fn drop(&mut self) {
+            self.0.fetch_add(1, Ordering::SeqCst);
+        }
+    }
+    let num_drops = Arc::new(AtomicUsize::new(0));
+    let m = ShardedLock::new(Foo(num_drops.clone()));
+    assert_eq!(num_drops.load(Ordering::SeqCst), 0);
+    {
+        let _inner = m.into_inner().unwrap();
+        assert_eq!(num_drops.load(Ordering::SeqCst), 0);
+    }
+    assert_eq!(num_drops.load(Ordering::SeqCst), 1);
+}
+
+#[test]
+fn test_into_inner_poison() {
+    let m = Arc::new(ShardedLock::new(NonCopy(10)));
+    let m2 = m.clone();
+    let _ = thread::spawn(move || {
+        let _lock = m2.write().unwrap();
+        panic!("test panic in inner thread to poison ShardedLock");
+    }).join();
+
+    assert!(m.is_poisoned());
+    match Arc::try_unwrap(m).unwrap().into_inner() {
+        Err(e) => assert_eq!(e.into_inner(), NonCopy(10)),
+        Ok(x) => panic!("into_inner of poisoned ShardedLock is Ok: {:?}", x),
+    }
+}
+
+#[test]
+fn test_get_mut() {
+    let mut m = ShardedLock::new(NonCopy(10));
+    *m.get_mut().unwrap() = NonCopy(20);
+    assert_eq!(m.into_inner().unwrap(), NonCopy(20));
+}
+
+#[test]
+fn test_get_mut_poison() {
+    let m = Arc::new(ShardedLock::new(NonCopy(10)));
+    let m2 = m.clone();
+    let _ = thread::spawn(move || {
+        let _lock = m2.write().unwrap();
+        panic!("test panic in inner thread to poison ShardedLock");
+    }).join();
+
+    assert!(m.is_poisoned());
+    match Arc::try_unwrap(m).unwrap().get_mut() {
+        Err(e) => assert_eq!(*e.into_inner(), NonCopy(10)),
+        Ok(x) => panic!("get_mut of poisoned ShardedLock is Ok: {:?}", x),
+    }
+}
diff --git a/rustc_deps/vendor/crossbeam-utils/tests/wait_group.rs b/rustc_deps/vendor/crossbeam-utils/tests/wait_group.rs
new file mode 100644
index 0000000..1aa9199
--- /dev/null
+++ b/rustc_deps/vendor/crossbeam-utils/tests/wait_group.rs
@@ -0,0 +1,66 @@
+extern crate crossbeam_utils;
+
+use std::sync::mpsc;
+use std::thread;
+use std::time::Duration;
+
+use crossbeam_utils::sync::WaitGroup;
+
+const THREADS: usize = 10;
+
+#[test]
+fn wait() {
+    let wg = WaitGroup::new();
+    let (tx, rx) = mpsc::channel();
+
+    for _ in 0..THREADS {
+        let wg = wg.clone();
+        let tx = tx.clone();
+
+        thread::spawn(move || {
+            wg.wait();
+            tx.send(()).unwrap();
+        });
+    }
+
+    thread::sleep(Duration::from_millis(100));
+
+    // At this point, all spawned threads should be blocked, so we shouldn't get anything from the
+    // channel.
+    assert!(rx.try_recv().is_err());
+
+    wg.wait();
+
+    // Now, the wait group is cleared and we should receive messages.
+    for _ in 0..THREADS {
+        rx.recv().unwrap();
+    }
+}
+
+#[test]
+fn wait_and_drop() {
+    let wg = WaitGroup::new();
+    let (tx, rx) = mpsc::channel();
+
+    for _ in 0..THREADS {
+        let wg = wg.clone();
+        let tx = tx.clone();
+
+        thread::spawn(move || {
+            thread::sleep(Duration::from_millis(100));
+            tx.send(()).unwrap();
+            drop(wg);
+        });
+    }
+
+    // At this point, all spawned threads should be sleeping, so we shouldn't get anything from the
+    // channel.
+    assert!(rx.try_recv().is_err());
+
+    wg.wait();
+
+    // Now, the wait group is cleared and we should receive messages.
+    for _ in 0..THREADS {
+        rx.try_recv().unwrap();
+    }
+}
diff --git a/rustc_deps/vendor/euclid/.cargo-checksum.json b/rustc_deps/vendor/euclid/.cargo-checksum.json
index 919ebe8..8f7d809 100644
--- a/rustc_deps/vendor/euclid/.cargo-checksum.json
+++ b/rustc_deps/vendor/euclid/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"COPYRIGHT":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"67de143fd7f5aa450d230b26c25cabccce0fc3c3512c47ff5d485f0329baeac1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"625bec69c76ce5423fdd05cfe46922b2680ec517f97c5854ce34798d1d8a9541","src/approxeq.rs":"6594377e8f6c20f88f628520d8de9b9a59c5892a0ee9a6ccd13c8400c1499911","src/homogen.rs":"cb26346ad1ea2797bdc1cac7f532872becabf28a1f9c60792f86ad4a655582f9","src/length.rs":"3171315822707728b1bfbdd04a4190ffb7206b4bfc59e9dd072bb2caa05ff292","src/lib.rs":"f89c2b86cabae4431a956b88c630c5cbdf51f7329dfeb677ab4fd4ff02e7d53b","src/macros.rs":"d2b7b391f58fe9cedb426780cfa1d2771f9ac786a6237b0f89d3e5788f5ec1b7","src/num.rs":"4439479fad5729073e0bfe0b96b547672a237430d48e564519759b9550baa033","src/point.rs":"2c399e282c2e81528775a1fc6ee1a0f2f6f71ed4a14bbe426115ae78b4cf2149","src/rect.rs":"43aad88856645bb9601e076b9ddc3376ee71f59bb8fdb7839a17f0198121824a","src/rotation.rs":"982aaca640215bacc5d2dc60a8949bb2510d5b6d492975b8b6946a7c8f69b496","src/scale.rs":"fc07bcf47f3a1215023c830059f0d270e570cbd37fe8c367ef4a47b191f4ae3e","src/side_offsets.rs":"f114cb881256bbeff2ee2aa305d363e2dea65aa8535140f104f6fa9364bd02f5","src/size.rs":"1fe99377bee13835ca416adbccdb0d163091a3dcf2977c3222da2d6b22d70621","src/transform2d.rs":"2f9bafe40b9a6dd9c41747aabfdefbfc9ee48daf4f4297d2320ccbdac185a30d","src/transform3d.rs":"90decfc535c4b24199cab9614037f27f0cdefad82580fcd6d132f49dfa88f77d","src/translation.rs":"c835abaf167234b288e95323f9e693099be9fd992fc137cd6e692edbe4456f19","src/trig.rs":"97a263c4f178b0332501659ca8143f9f637a0755aca189dd31ac551bcd4cb73c","src/vector.rs":"b0b41eac9c823e05bf6357e69c71dac977db2d8ab27b25f80f1f44b056d15f6d"},"package":"dbbf962bb6f877239a34491f2e0a12c6b824f389bc789eb90f1d70d4780b0727"}
\ No newline at end of file
+{"files":{"COPYRIGHT":"ec82b96487e9e778ee610c7ab245162464782cfa1f555c2299333f8dbe5c036a","Cargo.toml":"4c50cb6cf03b2ab58cf9c017fdeee3f3d918b6143adeb529910f329bb07e7fd3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","README.md":"625bec69c76ce5423fdd05cfe46922b2680ec517f97c5854ce34798d1d8a9541","src/approxeq.rs":"6594377e8f6c20f88f628520d8de9b9a59c5892a0ee9a6ccd13c8400c1499911","src/homogen.rs":"7b02aa671fffcb554557ad790f598bd5d7440dc1aa4a6d1c5a97d8bc3c8f64d6","src/length.rs":"3171315822707728b1bfbdd04a4190ffb7206b4bfc59e9dd072bb2caa05ff292","src/lib.rs":"e8b1317127ec281fd42318f2c470558c2ecbb2e1459cebd4f9c63a2af807eb3d","src/macros.rs":"3b475e84d00cceee6c7e96e9f2c97ba15d8dc7f4094efb82c5ed10bd60d86a64","src/num.rs":"4439479fad5729073e0bfe0b96b547672a237430d48e564519759b9550baa033","src/point.rs":"689a8348428d12f6c5262965c505395bde37b4b1776369d93e93d73406d5344b","src/rect.rs":"ae16bb9ccb95cf329439d0ea4eb4c3821c4cd769cce4a544904b65d7e4af04b7","src/rotation.rs":"3d765a8e8e8c7181cc10d39be617779a8676d2611b408c69c841c3a10ce78a47","src/scale.rs":"fc07bcf47f3a1215023c830059f0d270e570cbd37fe8c367ef4a47b191f4ae3e","src/side_offsets.rs":"b79d43cca4c2e9fac7482a95661f72cb3ed51008f1d3e0c3f4fe608c68ef3658","src/size.rs":"49088bf3bf0e1ce740c1fe92761c18a43a6287d1d81a945bc92b21af63ef3416","src/transform2d.rs":"641acc1c9de9368bdbe0bb64b5ba4c1069ebeda6d6ad31463c81bdf85d678043","src/transform3d.rs":"c47dda0759629c1a836861fabf65e889001cf2d5ab59258544c1c04167cd7a67","src/translation.rs":"9787de1bccdd402774ba9a5bc55ec6d4b2ee36e0a146baecee417ee9cc753db5","src/trig.rs":"97a263c4f178b0332501659ca8143f9f637a0755aca189dd31ac551bcd4cb73c","src/vector.rs":"d57493649da9d8a728dcba49bb80c579a4d2bf6f3557dd4b4c770cfcef6ee395"},"package":"d1a7698bdda3d7444a79d33bdc96e8b518d44ea3ff101d8492a6ca1207b886ea"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/euclid/Cargo.toml b/rustc_deps/vendor/euclid/Cargo.toml
index a89da77..6000b07 100644
--- a/rustc_deps/vendor/euclid/Cargo.toml
+++ b/rustc_deps/vendor/euclid/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "euclid"
-version = "0.19.4"
+version = "0.19.5"
 authors = ["The Servo Project Developers"]
 description = "Geometry primitives"
 documentation = "https://docs.rs/euclid/"
@@ -20,6 +20,9 @@
 categories = ["science"]
 license = "MIT / Apache-2.0"
 repository = "https://github.com/servo/euclid"
+[dependencies.euclid_macros]
+version = "0.1"
+
 [dependencies.mint]
 version = "0.5.1"
 optional = true
diff --git a/rustc_deps/vendor/euclid/src/homogen.rs b/rustc_deps/vendor/euclid/src/homogen.rs
index b8448a9..29a5073 100644
--- a/rustc_deps/vendor/euclid/src/homogen.rs
+++ b/rustc_deps/vendor/euclid/src/homogen.rs
@@ -17,14 +17,16 @@
 use core::ops::Div;
 
 
-define_matrix! {
-    /// Homogeneous vector in 3D space.
-    pub struct HomogeneousVector<T, U> {
-        pub x: T,
-        pub y: T,
-        pub z: T,
-        pub w: T,
-    }
+/// Homogeneous vector in 3D space.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct HomogeneousVector<T, U> {
+    pub x: T,
+    pub y: T,
+    pub z: T,
+    pub w: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
 
 
diff --git a/rustc_deps/vendor/euclid/src/lib.rs b/rustc_deps/vendor/euclid/src/lib.rs
index 2f080ab..79873fd 100644
--- a/rustc_deps/vendor/euclid/src/lib.rs
+++ b/rustc_deps/vendor/euclid/src/lib.rs
@@ -62,6 +62,8 @@
 
 #[cfg(feature = "mint")]
 pub extern crate mint;
+#[macro_use]
+extern crate euclid_macros;
 extern crate num_traits;
 #[cfg(test)]
 extern crate rand;
diff --git a/rustc_deps/vendor/euclid/src/macros.rs b/rustc_deps/vendor/euclid/src/macros.rs
index cf422a8..9cc392e 100644
--- a/rustc_deps/vendor/euclid/src/macros.rs
+++ b/rustc_deps/vendor/euclid/src/macros.rs
@@ -7,84 +7,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-macro_rules! define_matrix {
-    (
-        $(#[$attr:meta])*
-        pub struct $name:ident<T, $($phantom:ident),+> {
-            $(pub $field:ident: T,)+
-        }
-    ) => (
-        #[repr(C)]
-        $(#[$attr])*
-        pub struct $name<T, $($phantom),+> {
-            $(pub $field: T,)+
-
-            // Keep this (secretly) public for the few cases where we would like to
-            // create static constants which currently can't be initialized with a
-            // function.
-            #[doc(hidden)]
-            pub _unit: PhantomData<($($phantom),+)>
-        }
-
-        impl<T: Clone, $($phantom),+> Clone for $name<T, $($phantom),+> {
-            fn clone(&self) -> Self {
-                $name {
-                    $($field: self.$field.clone(),)+
-                    _unit: PhantomData,
-                }
-            }
-        }
-
-        impl<T: Copy, $($phantom),+> Copy for $name<T, $($phantom),+> {}
-
-        #[cfg(feature = "serde")]
-        impl<'de, T, $($phantom),+> ::serde::Deserialize<'de> for $name<T, $($phantom),+>
-            where T: ::serde::Deserialize<'de>
-        {
-            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
-                where D: ::serde::Deserializer<'de>
-            {
-                let ($($field,)+) =
-                    try!(::serde::Deserialize::deserialize(deserializer));
-                Ok($name {
-                    $($field: $field,)+
-                    _unit: PhantomData,
-                })
-            }
-        }
-
-        #[cfg(feature = "serde")]
-        impl<T, $($phantom),+> ::serde::Serialize for $name<T, $($phantom),+>
-            where T: ::serde::Serialize
-        {
-            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-                where S: ::serde::Serializer
-            {
-                ($(&self.$field,)+).serialize(serializer)
-            }
-        }
-
-        impl<T, $($phantom),+> ::core::cmp::Eq for $name<T, $($phantom),+>
-            where T: ::core::cmp::Eq {}
-
-        impl<T, $($phantom),+> ::core::cmp::PartialEq for $name<T, $($phantom),+>
-            where T: ::core::cmp::PartialEq
-        {
-            fn eq(&self, other: &Self) -> bool {
-                true $(&& self.$field == other.$field)+
-            }
-        }
-
-        impl<T, $($phantom),+> ::core::hash::Hash for $name<T, $($phantom),+>
-            where T: ::core::hash::Hash
-        {
-            fn hash<H: ::core::hash::Hasher>(&self, h: &mut H) {
-                $(self.$field.hash(h);)+
-            }
-        }
-    )
-}
-
 macro_rules! mint_vec {
     ($name:ident [ $($field:ident),* ] = $std_name:ident) => {
         #[cfg(feature = "mint")]
diff --git a/rustc_deps/vendor/euclid/src/point.rs b/rustc_deps/vendor/euclid/src/point.rs
index 9168e15..b9df69d 100644
--- a/rustc_deps/vendor/euclid/src/point.rs
+++ b/rustc_deps/vendor/euclid/src/point.rs
@@ -21,13 +21,16 @@
 use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
 use core::marker::PhantomData;
 
-define_matrix! {
-    /// A 2d Point tagged with a unit.
-    pub struct TypedPoint2D<T, U> {
-        pub x: T,
-        pub y: T,
-    }
+/// A 2d Point tagged with a unit.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedPoint2D<T, U> {
+    pub x: T,
+    pub y: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
+
 mint_vec!(TypedPoint2D[x, y] = Point2);
 
 /// Default 2d point type with no unit.
@@ -408,14 +411,17 @@
     }
 }
 
-define_matrix! {
-    /// A 3d Point tagged with a unit.
-    pub struct TypedPoint3D<T, U> {
-        pub x: T,
-        pub y: T,
-        pub z: T,
-    }
+/// A 3d Point tagged with a unit.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedPoint3D<T, U> {
+    pub x: T,
+    pub y: T,
+    pub z: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
+
 mint_vec!(TypedPoint3D[x, y, z] = Point3);
 
 /// Default 3d point type with no unit.
diff --git a/rustc_deps/vendor/euclid/src/rect.rs b/rustc_deps/vendor/euclid/src/rect.rs
index e9b46ec..a382e37 100644
--- a/rustc_deps/vendor/euclid/src/rect.rs
+++ b/rustc_deps/vendor/euclid/src/rect.rs
@@ -24,7 +24,7 @@
 use core::cmp::PartialOrd;
 use core::fmt;
 use core::hash::{Hash, Hasher};
-use core::ops::{Add, Div, Mul, Sub};
+use core::ops::{Add, Div, Mul, Sub, Range};
 
 
 /// A 2d Rectangle optionally tagged with a unit.
@@ -169,6 +169,16 @@
     }
 
     #[inline]
+    pub fn x_range(&self) -> Range<T> {
+        self.min_x()..self.max_x()
+    }
+
+    #[inline]
+    pub fn y_range(&self) -> Range<T> {
+        self.min_y()..self.max_y()
+    }
+
+    #[inline]
     pub fn intersection(&self, other: &Self) -> Option<Self> {
         if !self.intersects(other) {
             return None;
diff --git a/rustc_deps/vendor/euclid/src/rotation.rs b/rustc_deps/vendor/euclid/src/rotation.rs
index 5405686..a76265e 100644
--- a/rustc_deps/vendor/euclid/src/rotation.rs
+++ b/rustc_deps/vendor/euclid/src/rotation.rs
@@ -185,11 +185,13 @@
     }
 }
 
-define_matrix! {
-    /// A transform that can represent rotations in 2d, represented as an angle in radians.
-    pub struct TypedRotation2D<T, Src, Dst> {
-        pub angle : T,
-    }
+/// A transform that can represent rotations in 2d, represented as an angle in radians.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedRotation2D<T, Src, Dst> {
+    pub angle : T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<(Src, Dst)>,
 }
 
 /// The default 2d rotation type with no units.
@@ -311,26 +313,28 @@
     }
 }
 
-define_matrix! {
-    /// A transform that can represent rotations in 3d, represented as a quaternion.
-    ///
-    /// Most methods expect the quaternion to be normalized.
-    /// When in doubt, use `unit_quaternion` instead of `quaternion` to create
-    /// a rotation as the former will ensure that its result is normalized.
-    ///
-    /// Some people use the `x, y, z, w` (or `w, x, y, z`) notations. The equivalence is
-    /// as follows: `x -> i`, `y -> j`, `z -> k`, `w -> r`.
-    /// The memory layout of this type corresponds to the `x, y, z, w` notation
-    pub struct TypedRotation3D<T, Src, Dst> {
-        // Component multiplied by the imaginary number `i`.
-        pub i: T,
-        // Component multiplied by the imaginary number `j`.
-        pub j: T,
-        // Component multiplied by the imaginary number `k`.
-        pub k: T,
-        // The real part.
-        pub r: T,
-    }
+/// A transform that can represent rotations in 3d, represented as a quaternion.
+///
+/// Most methods expect the quaternion to be normalized.
+/// When in doubt, use `unit_quaternion` instead of `quaternion` to create
+/// a rotation as the former will ensure that its result is normalized.
+///
+/// Some people use the `x, y, z, w` (or `w, x, y, z`) notations. The equivalence is
+/// as follows: `x -> i`, `y -> j`, `z -> k`, `w -> r`.
+/// The memory layout of this type corresponds to the `x, y, z, w` notation
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedRotation3D<T, Src, Dst> {
+    /// Component multiplied by the imaginary number `i`.
+    pub i: T,
+    /// Component multiplied by the imaginary number `j`.
+    pub j: T,
+    /// Component multiplied by the imaginary number `k`.
+    pub k: T,
+    /// The real part.
+    pub r: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<(Src, Dst)>,
 }
 
 /// The default 3d rotation type with no units.
diff --git a/rustc_deps/vendor/euclid/src/side_offsets.rs b/rustc_deps/vendor/euclid/src/side_offsets.rs
index 581aa28..2d5c993 100644
--- a/rustc_deps/vendor/euclid/src/side_offsets.rs
+++ b/rustc_deps/vendor/euclid/src/side_offsets.rs
@@ -19,13 +19,15 @@
 
 /// A group of side offsets, which correspond to top/left/bottom/right for borders, padding,
 /// and margins in CSS, optionally tagged with a unit.
-define_matrix! {
-    pub struct TypedSideOffsets2D<T, U> {
-        pub top: T,
-        pub right: T,
-        pub bottom: T,
-        pub left: T,
-    }
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedSideOffsets2D<T, U> {
+    pub top: T,
+    pub right: T,
+    pub bottom: T,
+    pub left: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
 
 impl<T: fmt::Debug, U> fmt::Debug for TypedSideOffsets2D<T, U> {
diff --git a/rustc_deps/vendor/euclid/src/size.rs b/rustc_deps/vendor/euclid/src/size.rs
index 068c4bb..044ca8e 100644
--- a/rustc_deps/vendor/euclid/src/size.rs
+++ b/rustc_deps/vendor/euclid/src/size.rs
@@ -21,11 +21,13 @@
 use core::marker::PhantomData;
 
 /// A 2d size tagged with a unit.
-define_matrix! {
-    pub struct TypedSize2D<T, U> {
-        pub width: T,
-        pub height: T,
-    }
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedSize2D<T, U> {
+    pub width: T,
+    pub height: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
 
 /// Default 2d size type with no unit.
diff --git a/rustc_deps/vendor/euclid/src/transform2d.rs b/rustc_deps/vendor/euclid/src/transform2d.rs
index 9ff19bd..789e866 100644
--- a/rustc_deps/vendor/euclid/src/transform2d.rs
+++ b/rustc_deps/vendor/euclid/src/transform2d.rs
@@ -24,23 +24,25 @@
 use core::fmt;
 use num_traits::NumCast;
 
-define_matrix! {
-    /// A 2d transform stored as a 3 by 2 matrix in row-major order in memory.
-    ///
-    /// Transforms can be parametrized over the source and destination units, to describe a
-    /// transformation from a space to another.
-    /// For example, `TypedTransform2D<f32, WorldSpace, ScreenSpace>::transform_point4d`
-    /// takes a `TypedPoint2D<f32, WorldSpace>` and returns a `TypedPoint2D<f32, ScreenSpace>`.
-    ///
-    /// Transforms expose a set of convenience methods for pre- and post-transformations.
-    /// A pre-transformation corresponds to adding an operation that is applied before
-    /// the rest of the transformation, while a post-transformation adds an operation
-    /// that is applied after.
-    pub struct TypedTransform2D<T, Src, Dst> {
-        pub m11: T, pub m12: T,
-        pub m21: T, pub m22: T,
-        pub m31: T, pub m32: T,
-    }
+/// A 2d transform stored as a 3 by 2 matrix in row-major order in memory.
+///
+/// Transforms can be parametrized over the source and destination units, to describe a
+/// transformation from a space to another.
+/// For example, `TypedTransform2D<f32, WorldSpace, ScreenSpace>::transform_point4d`
+/// takes a `TypedPoint2D<f32, WorldSpace>` and returns a `TypedPoint2D<f32, ScreenSpace>`.
+///
+/// Transforms expose a set of convenience methods for pre- and post-transformations.
+/// A pre-transformation corresponds to adding an operation that is applied before
+/// the rest of the transformation, while a post-transformation adds an operation
+/// that is applied after.
+#[repr(C)]
+#[derive(EuclidMatrix)]
+pub struct TypedTransform2D<T, Src, Dst> {
+    pub m11: T, pub m12: T,
+    pub m21: T, pub m22: T,
+    pub m31: T, pub m32: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<(Src, Dst)>,
 }
 
 /// The default 2d transform type with no units.
diff --git a/rustc_deps/vendor/euclid/src/transform3d.rs b/rustc_deps/vendor/euclid/src/transform3d.rs
index 224ae5f..a681732 100644
--- a/rustc_deps/vendor/euclid/src/transform3d.rs
+++ b/rustc_deps/vendor/euclid/src/transform3d.rs
@@ -26,24 +26,26 @@
 use core::fmt;
 use num_traits::NumCast;
 
-define_matrix! {
-    /// A 3d transform stored as a 4 by 4 matrix in row-major order in memory.
-    ///
-    /// Transforms can be parametrized over the source and destination units, to describe a
-    /// transformation from a space to another.
-    /// For example, `TypedTransform3D<f32, WorldSpace, ScreenSpace>::transform_point3d`
-    /// takes a `TypedPoint3D<f32, WorldSpace>` and returns a `TypedPoint3D<f32, ScreenSpace>`.
-    ///
-    /// Transforms expose a set of convenience methods for pre- and post-transformations.
-    /// A pre-transformation corresponds to adding an operation that is applied before
-    /// the rest of the transformation, while a post-transformation adds an operation
-    /// that is applied after.
-    pub struct TypedTransform3D<T, Src, Dst> {
-        pub m11: T, pub m12: T, pub m13: T, pub m14: T,
-        pub m21: T, pub m22: T, pub m23: T, pub m24: T,
-        pub m31: T, pub m32: T, pub m33: T, pub m34: T,
-        pub m41: T, pub m42: T, pub m43: T, pub m44: T,
-    }
+/// A 3d transform stored as a 4 by 4 matrix in row-major order in memory.
+///
+/// Transforms can be parametrized over the source and destination units, to describe a
+/// transformation from a space to another.
+/// For example, `TypedTransform3D<f32, WorldSpace, ScreenSpace>::transform_point3d`
+/// takes a `TypedPoint3D<f32, WorldSpace>` and returns a `TypedPoint3D<f32, ScreenSpace>`.
+///
+/// Transforms expose a set of convenience methods for pre- and post-transformations.
+/// A pre-transformation corresponds to adding an operation that is applied before
+/// the rest of the transformation, while a post-transformation adds an operation
+/// that is applied after.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedTransform3D<T, Src, Dst> {
+    pub m11: T, pub m12: T, pub m13: T, pub m14: T,
+    pub m21: T, pub m22: T, pub m23: T, pub m24: T,
+    pub m31: T, pub m32: T, pub m33: T, pub m34: T,
+    pub m41: T, pub m42: T, pub m43: T, pub m44: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<(Src, Dst)>,
 }
 
 /// The default 3d transform type with no units.
diff --git a/rustc_deps/vendor/euclid/src/translation.rs b/rustc_deps/vendor/euclid/src/translation.rs
index 0480882..cf70c24 100644
--- a/rustc_deps/vendor/euclid/src/translation.rs
+++ b/rustc_deps/vendor/euclid/src/translation.rs
@@ -15,31 +15,33 @@
 use core::marker::PhantomData;
 use core::fmt;
 
-define_matrix! {
-    /// A 2d transformation from a space to another that can only express translations.
-    ///
-    /// The main benefit of this type over a TypedVector2D is the ability to cast
-    /// between a source and a destination spaces.
-    ///
-    /// Example:
-    ///
-    /// ```
-    /// use euclid::{TypedTranslation2D, TypedPoint2D, point2};
-    /// struct ParentSpace;
-    /// struct ChildSpace;
-    /// type ScrollOffset = TypedTranslation2D<i32, ParentSpace, ChildSpace>;
-    /// type ParentPoint = TypedPoint2D<i32, ParentSpace>;
-    /// type ChildPoint = TypedPoint2D<i32, ChildSpace>;
-    ///
-    /// let scrolling = ScrollOffset::new(0, 100);
-    /// let p1: ParentPoint = point2(0, 0);
-    /// let p2: ChildPoint = scrolling.transform_point(&p1);
-    /// ```
-    ///
-    pub struct TypedTranslation2D<T, Src, Dst> {
-        pub x: T,
-        pub y: T,
-    }
+/// A 2d transformation from a space to another that can only express translations.
+///
+/// The main benefit of this type over a TypedVector2D is the ability to cast
+/// between a source and a destination spaces.
+///
+/// Example:
+///
+/// ```
+/// use euclid::{TypedTranslation2D, TypedPoint2D, point2};
+/// struct ParentSpace;
+/// struct ChildSpace;
+/// type ScrollOffset = TypedTranslation2D<i32, ParentSpace, ChildSpace>;
+/// type ParentPoint = TypedPoint2D<i32, ParentSpace>;
+/// type ChildPoint = TypedPoint2D<i32, ChildSpace>;
+///
+/// let scrolling = ScrollOffset::new(0, 100);
+/// let p1: ParentPoint = point2(0, 0);
+/// let p2: ChildPoint = scrolling.transform_point(&p1);
+/// ```
+///
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedTranslation2D<T, Src, Dst> {
+    pub x: T,
+    pub y: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<(Src, Dst)>,
 }
 
 impl<T, Src, Dst> TypedTranslation2D<T, Src, Dst> {
@@ -228,16 +230,18 @@
 
 
 
-define_matrix! {
-    /// A 3d transformation from a space to another that can only express translations.
-    ///
-    /// The main benefit of this type over a TypedVector3D is the ability to cast
-    /// between a source and a destination spaces.
-    pub struct TypedTranslation3D<T, Src, Dst> {
-        pub x: T,
-        pub y: T,
-        pub z: T,
-    }
+/// A 3d transformation from a space to another that can only express translations.
+///
+/// The main benefit of this type over a TypedVector3D is the ability to cast
+/// between a source and a destination spaces.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedTranslation3D<T, Src, Dst> {
+    pub x: T,
+    pub y: T,
+    pub z: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<(Src, Dst)>,
 }
 
 impl<T, Src, Dst> TypedTranslation3D<T, Src, Dst> {
diff --git a/rustc_deps/vendor/euclid/src/vector.rs b/rustc_deps/vendor/euclid/src/vector.rs
index 5fe7963..9170080 100644
--- a/rustc_deps/vendor/euclid/src/vector.rs
+++ b/rustc_deps/vendor/euclid/src/vector.rs
@@ -23,13 +23,16 @@
 use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
 use core::marker::PhantomData;
 
-define_matrix! {
-    /// A 2d Vector tagged with a unit.
-    pub struct TypedVector2D<T, U> {
-        pub x: T,
-        pub y: T,
-    }
+/// A 2d Vector tagged with a unit.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedVector2D<T, U> {
+    pub x: T,
+    pub y: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
+
 mint_vec!(TypedVector2D[x, y] = Vector2);
 
 /// Default 2d vector type with no unit.
@@ -468,14 +471,17 @@
     }
 }
 
-define_matrix! {
-    /// A 3d Vector tagged with a unit.
-    pub struct TypedVector3D<T, U> {
-        pub x: T,
-        pub y: T,
-        pub z: T,
-    }
+/// A 3d Vector tagged with a unit.
+#[derive(EuclidMatrix)]
+#[repr(C)]
+pub struct TypedVector3D<T, U> {
+    pub x: T,
+    pub y: T,
+    pub z: T,
+    #[doc(hidden)]
+    pub _unit: PhantomData<U>,
 }
+
 mint_vec!(TypedVector3D[x, y, z] = Vector3);
 
 /// Default 3d vector type with no unit.
diff --git a/rustc_deps/vendor/euclid_macros/.cargo-checksum.json b/rustc_deps/vendor/euclid_macros/.cargo-checksum.json
new file mode 100644
index 0000000..0b6ee43
--- /dev/null
+++ b/rustc_deps/vendor/euclid_macros/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"12f4357876f09242153fbbd912c70861b03d5a8f983fce3de0d3696389452be6","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3","euclid_matrix.rs":"0643b38d8284278c3d54a3791aa0eae7edd5f73a54e1edec38e1bcdb4af66e0b","lib.rs":"845b9a82365e06d51edce03560a5abe617f955c9c640e90140c87fb594c65fbd"},"package":"fdcb84c18ea5037a1c5a23039b4ff29403abce2e0d6b1daa11cf0bde2b30be15"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/euclid_macros/Cargo.toml b/rustc_deps/vendor/euclid_macros/Cargo.toml
new file mode 100644
index 0000000..9627ec9
--- /dev/null
+++ b/rustc_deps/vendor/euclid_macros/Cargo.toml
@@ -0,0 +1,31 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "euclid_macros"
+version = "0.1.0"
+authors = ["Emilio Cobos Álvarez <emilio@crisal.io>", "The Servo project developers"]
+description = "Euclid implementation detail"
+license = "MIT / Apache-2.0"
+
+[lib]
+path = "lib.rs"
+proc-macro = true
+[dependencies.proc-macro2]
+version = "0.4"
+
+[dependencies.quote]
+version = "0.6"
+
+[dependencies.syn]
+version = "0.15"
+features = ["visit"]
diff --git a/rustc_deps/vendor/euclid_macros/LICENSE-APACHE b/rustc_deps/vendor/euclid_macros/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/rustc_deps/vendor/euclid_macros/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+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.
diff --git a/rustc_deps/vendor/euclid_macros/LICENSE-MIT b/rustc_deps/vendor/euclid_macros/LICENSE-MIT
new file mode 100644
index 0000000..807526f
--- /dev/null
+++ b/rustc_deps/vendor/euclid_macros/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2012-2013 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/rustc_deps/vendor/euclid_macros/euclid_matrix.rs b/rustc_deps/vendor/euclid_macros/euclid_matrix.rs
new file mode 100644
index 0000000..5c0e867
--- /dev/null
+++ b/rustc_deps/vendor/euclid_macros/euclid_matrix.rs
@@ -0,0 +1,247 @@
+use proc_macro2::TokenStream;
+use syn::{self, DeriveInput};
+
+type Fields = syn::punctuated::Punctuated<syn::Field, syn::token::Comma>;
+
+fn derive_trait<F>(
+    input: &DeriveInput,
+    trait_name: TokenStream,
+    generics: &syn::Generics,
+    body: F
+) -> TokenStream
+where
+    F: FnOnce() -> TokenStream,
+{
+    let struct_name = &input.ident;
+
+    let (impl_generics, _, where_clause) = generics.split_for_impl();
+    let (_, ty_generics, _) = input.generics.split_for_impl();
+
+    let body = body();
+    quote! {
+        impl #impl_generics #trait_name for #struct_name #ty_generics #where_clause {
+            #body
+        }
+    }
+}
+
+fn derive_simple_trait<F>(
+    input: &DeriveInput,
+    trait_name: TokenStream,
+    t: &syn::TypeParam,
+    body: F,
+) -> TokenStream
+where
+    F: FnOnce() -> TokenStream,
+{
+    let mut generics = input.generics.clone();
+    generics
+        .make_where_clause()
+        .predicates
+        .push(parse_quote!(#t: #trait_name));
+    derive_trait(input, trait_name, &generics, body)
+}
+
+fn each_field_except_unit<F>(
+    fields: &Fields,
+    unit: &syn::Field,
+    mut field_expr: F,
+) -> TokenStream
+where
+    F: FnMut(&syn::Ident) -> TokenStream,
+{
+    fields.iter().filter(|f| f.ident != unit.ident).fold(quote! {}, |body, field| {
+        let name = field.ident.as_ref().unwrap();
+        let expr = field_expr(name);
+        quote! {
+            #body
+            #expr
+        }
+    })
+}
+
+
+fn derive_struct_body<F>(
+    fields: &Fields,
+    unit: &syn::Field,
+    mut field_expr: F,
+) -> TokenStream
+where
+    F: FnMut(&syn::Ident) -> TokenStream,
+{
+    let body = each_field_except_unit(fields, unit, |name| {
+        let expr = field_expr(name);
+        quote! {
+            #name: #expr,
+        }
+    });
+
+    let unit_name = unit.ident.as_ref().unwrap();
+    quote! {
+        Self {
+            #body
+            #unit_name: PhantomData,
+        }
+    }
+}
+
+fn clone_impl(input: &DeriveInput, fields: &Fields, unit: &syn::Field, t: &syn::TypeParam) -> TokenStream {
+    derive_simple_trait(input, quote! { Clone }, t, || {
+        let body = derive_struct_body(fields, unit, |name| {
+            quote! { self.#name.clone() }
+        });
+        quote! {
+            fn clone(&self) -> Self {
+                #body
+            }
+        }
+    })
+}
+
+fn copy_impl(input: &DeriveInput, t: &syn::TypeParam) -> TokenStream {
+    derive_simple_trait(input, quote!{ Copy }, t, || quote! {})
+}
+
+fn eq_impl(input: &DeriveInput, t: &syn::TypeParam) -> TokenStream {
+    derive_simple_trait(input, quote!{ ::core::cmp::Eq }, t, || quote! {})
+}
+
+fn partialeq_impl(input: &DeriveInput, fields: &Fields, unit: &syn::Field, t: &syn::TypeParam) -> TokenStream {
+    derive_simple_trait(input, quote!{ ::core::cmp::PartialEq }, t, || {
+        let body = each_field_except_unit(fields, unit, |name| {
+            quote! { && self.#name == other.#name }
+        });
+
+        quote! {
+            fn eq(&self, other: &Self) -> bool {
+                true #body
+            }
+        }
+    })
+}
+
+fn hash_impl(input: &DeriveInput, fields: &Fields, unit: &syn::Field, t: &syn::TypeParam) -> TokenStream {
+    derive_simple_trait(input, quote!{ ::core::hash::Hash }, t, || {
+        let body = each_field_except_unit(fields, unit, |name| {
+            quote! { self.#name.hash(h); }
+        });
+
+        quote! {
+            fn hash<H: ::core::hash::Hasher>(&self, h: &mut H) {
+                #body
+            }
+        }
+    })
+}
+
+fn serde_impl(
+    input: &DeriveInput,
+    fields: &Fields,
+    unit: &syn::Field,
+    t: &syn::TypeParam,
+) -> TokenStream {
+    let deserialize_impl = {
+        let mut generics = input.generics.clone();
+        generics.params.insert(0, parse_quote!('de));
+        generics
+            .make_where_clause()
+            .predicates
+            .push(parse_quote!(#t: ::serde::Deserialize<'de>));
+        derive_trait(input, quote!{ ::serde::Deserialize<'de> }, &generics, || {
+            let tuple = each_field_except_unit(fields, unit, |name| {
+                quote! { #name, }
+            });
+            let body = derive_struct_body(fields, unit, |name| quote! { #name });
+            quote! {
+                fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+                where
+                    D: ::serde::Deserializer<'de>,
+                {
+                    let (#tuple) = ::serde::Deserialize::deserialize(deserializer)?;
+                    Ok(#body)
+                }
+            }
+        })
+    };
+
+    let serialize_impl = derive_simple_trait(input, quote! { ::serde::Serialize }, t, || {
+        let tuple = each_field_except_unit(fields, unit, |name| {
+            quote! { &self.#name, }
+        });
+        quote! {
+            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+            where
+                S: ::serde::Serializer,
+            {
+                (#tuple).serialize(serializer)
+            }
+        }
+    });
+
+    quote! {
+        #[cfg(feature = "serde")]
+        #serialize_impl
+        #[cfg(feature = "serde")]
+        #deserialize_impl
+    }
+}
+
+pub fn derive(input: DeriveInput) -> TokenStream {
+    let s = match input.data {
+        syn::Data::Struct(ref s) => s,
+        _ => panic!("Need to derive this on a struct"),
+    };
+
+    let fields = match s.fields {
+        syn::Fields::Named(ref named) => &named.named,
+        _ => panic!("Need to use named fields"),
+    };
+
+    assert!(!fields.is_empty());
+
+    let unit_field = fields.last().unwrap();
+    assert_eq!(
+        unit_field.value().ident.as_ref().unwrap().to_string(),
+        "_unit",
+        "You need to have a _unit field to derive this trait",
+    );
+
+    assert!(match unit_field.value().vis {
+        syn::Visibility::Public(..) => true,
+        _ => false,
+    }, "Unit field should be public");
+
+    assert!(input.attrs.iter().filter_map(|attr| attr.interpret_meta()).any(|attr| {
+        match attr {
+            syn::Meta::Word(..) |
+            syn::Meta::NameValue(..) => false,
+            syn::Meta::List(ref list) => {
+                list.ident == "repr" && list.nested.iter().any(|meta| {
+                    match *meta {
+                        syn::NestedMeta::Meta(syn::Meta::Word(ref w)) => w == "C",
+                        _ => false,
+                    }
+                })
+            }
+        }
+    }), "struct should be #[repr(C)]");
+
+    let type_param =
+        input.generics.type_params().next().cloned().expect("Need a T");
+
+    let clone = clone_impl(&input, fields, unit_field.value(), &type_param);
+    let copy = copy_impl(&input, &type_param);
+    let serde = serde_impl(&input, fields, unit_field.value(), &type_param);
+    let eq = eq_impl(&input, &type_param);
+    let partialeq = partialeq_impl(&input, fields, unit_field.value(), &type_param);
+    let hash = hash_impl(&input, fields, unit_field.value(), &type_param);
+
+    quote! {
+        #clone
+        #copy
+        #serde
+        #eq
+        #partialeq
+        #hash
+    }
+}
diff --git a/rustc_deps/vendor/euclid_macros/lib.rs b/rustc_deps/vendor/euclid_macros/lib.rs
new file mode 100644
index 0000000..d138e8e
--- /dev/null
+++ b/rustc_deps/vendor/euclid_macros/lib.rs
@@ -0,0 +1,16 @@
+extern crate proc_macro;
+extern crate proc_macro2;
+#[macro_use]
+extern crate quote;
+#[macro_use]
+extern crate syn;
+
+use proc_macro::TokenStream;
+
+mod euclid_matrix;
+
+#[proc_macro_derive(EuclidMatrix)]
+pub fn derive_euclid_matrix(input: TokenStream) -> TokenStream {
+    let input = syn::parse(input).unwrap();
+    euclid_matrix::derive(input).into()
+}
diff --git a/rustc_deps/vendor/h2/.cargo-checksum.json b/rustc_deps/vendor/h2/.cargo-checksum.json
index b1bfc87..1eb91d6 100644
--- a/rustc_deps/vendor/h2/.cargo-checksum.json
+++ b/rustc_deps/vendor/h2/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"9e43e4ce7daea8369a86d29e770e2565ed801771854dee3f3f00b70e21f69a4d","CONTRIBUTING.md":"149e2dfd4f8b2a8d8bcfaab09c444ff3974a7bdb070ded1de4c2d87ccb8db6f3","Cargo.toml":"512c30736fb52306c8b41056d9c66d0ae13aebc11437b6c33c8c35b64cac44c4","LICENSE":"b21623012e6c453d944b0342c515b631cfcbf30704c2621b291526b69c10724d","README.md":"210f8a721f506b1b42110bfd77f798e5c48bbb6c1c338c1016f0128f182e7885","examples/akamai.rs":"1954d75ae192c688d71f34e91fb1a2acdb61a72ef7125f9f460f06d807d07525","examples/client.rs":"dc16c9613934914486bc0c2cfb83f10d057f6a803ac88282e74f2235f390b426","examples/server.rs":"10995d8bdda80e9fc942d46e6d1d95fba114682279fe6654a7170b22fc5177c4","src/client.rs":"f0285193fddff9477bfb8f04eb09455e51eb108875e44724a866f25078091d54","src/codec/error.rs":"f03da60918bf9f41e4eabb9be802c8aa7230c59118e53efe97ad9804c17057d4","src/codec/framed_read.rs":"c7f7221481b0dee5ca5d1c7c42e0ef1f51b7110b79f6f546edecc6ad90afd61c","src/codec/framed_write.rs":"3a46fd36a9f2237d14eca0e95aa9436dbaaed49940cbf44c1c517ba3c101d0c4","src/codec/mod.rs":"a2a22a4b58602a310fa8901cc4ad60deb2b6e3a8679717a41937c27d2d4f53b9","src/error.rs":"513d608f79b8e8325f67a6a01c49b136329c1487dfa0dd61a830fe0cb729828b","src/frame/data.rs":"5856440713abd9106b4895b51f6cc0aa32749435adf7207d1b8d7988076c6134","src/frame/go_away.rs":"2024f4fd475a78c2206d28a668d8931e4e579d32f2291db97a259db4abfe334f","src/frame/head.rs":"9e8763b719c4d7116d7b12b4dcc9c344791c3c64500e0acfd52d3679e4ca8a58","src/frame/headers.rs":"dccc0871ff2761e3bd5efe83c51783581444d808ec0cbe57a481e2775e4d190c","src/frame/mod.rs":"fa81b4fdbcdde4855aa6c107c9f3a92196dfd966c226d80699b6b091e9c7220b","src/frame/ping.rs":"68e2fe2f53c39c37a3c121f10b2c0665fc4ff448f36cba4a3603b0fd3e5c9b52","src/frame/priority.rs":"3ad33b4e9a24bb5b2b8b1c92a134efa790ee8ea963b6f4475161034b99f8b5d3","src/frame/reason.rs":"5f8303d1dacc78d622d87da2fcc2324d56adbcde4ca24df7b82194774055c7e4","src/frame/reset.rs":"0595e02a3f83b4451864caecee177fdf003b10fe275a88f23cebb467c71a4444","src/frame/settings.rs":"7956e98f7a8620b904cc6ded5c0f64e32f437cf8871fba29a79b266cb2b756b4","src/frame/stream_id.rs":"088580143cdd34740c2673f50c6e0d6983b2271c011a3583621af01517f862c5","src/frame/util.rs":"f22b3e53aa402ee6c24d69a675ce443e98b06341badd26e17af87b643fa06352","src/frame/window_update.rs":"9c664df42fc789050726eb4005cd38660cad7b92f46117a8fd9528761fd76ff5","src/hpack/decoder.rs":"4108a1ac1d15662f2acf8438a2bfe345e5477511a9b40d8f6ad195143bc1efb9","src/hpack/encoder.rs":"a89486e2a53bfc79806fd4ed83edd508dc9ccd495fc884cb83c940cd575c8a99","src/hpack/header.rs":"957d0180b3f475c13685761532c4e8e55013e1a13a1229ff051362b38ddded5d","src/hpack/huffman/mod.rs":"bc3bf001db39efe34f5e142723d03f1718f51cb5ab72ec5974cd7fb9b881eab9","src/hpack/huffman/table.rs":"062ddb1e4f0d4808fd64a4e62b420ea5b6a5ace0546b90f31b36d3f72b3f6619","src/hpack/mod.rs":"858049d8af16288c328e279b1d9feebf3d6a110f1991d4de3fdd64a9f4c8ed5f","src/hpack/table.rs":"f168c1e7621765fd1464c58be021a77b1da83902ded2ee7cb591eec28f6dcc52","src/hpack/test/fixture.rs":"e9c4eee1b69a8bd912532818e2fbda1a1ff8ef769070c71df1618e9f6d5c73ef","src/hpack/test/fuzz.rs":"0eebfa28de8b68f7a7b5803440b37646e8acfea5ee1ef5a4852c0b5241639fa3","src/hpack/test/mod.rs":"56ad5643e7f1e273e5bce8a6fc0552be39c326dacfffd7f9757ccdbe75e9b66e","src/lib.rs":"46cd5658d81a818769809f07403d04607d3dec7481cbb4b69ab4cf89d1740171","src/proto/connection.rs":"ccf3dc258f38869dd95f516c5fa179b921b4cf98eea6d0f81f38b76a32273dd2","src/proto/error.rs":"917228534afb2f21977a3eabbb5bad72882134c0bd59f1277999fbe16f30a5d9","src/proto/go_away.rs":"1c5513658f85c8783d25578c32d0654d77609c972bac93fb941c76f3b9a5787d","src/proto/mod.rs":"d091593f4c3bd3e1196c06f34e9b93f2511c1ecbbef0376ad61a22861e219ed3","src/proto/peer.rs":"6ffd23080daff48c398ec01d6d2e97c9216a9af773ecadbfd67149e33790596f","src/proto/ping_pong.rs":"3747fa1fc1547d0291212030e1c9b98e17e1cf82bfa31be79d8e866cbf593459","src/proto/settings.rs":"91690f4e1c31554c26c4830ffee68de1e89a67e726dcc9119832cdc7ebaeb5e2","src/proto/streams/buffer.rs":"d88060142edd50e23e519e9a67f926e5f5fa5e49fe5c2c2868f330f840290ec9","src/proto/streams/counts.rs":"6ee0e1dc45b6dae820a6f7297b8ea64e0b0ceafe614e40277ef0c577df909683","src/proto/streams/flow_control.rs":"c39d5b77a94c12c724d7a9d391266119af355b12caf2c24169c11b3dfd3bbafa","src/proto/streams/mod.rs":"80877f6f7325d40a41cf0c6f24f22469cedbc9eaf70aa190198cec9c8cd54758","src/proto/streams/prioritize.rs":"d32b574d84e3dcabcfb9d7e8e29140c0a01ce0322c3a5350ac94d04702b7be07","src/proto/streams/recv.rs":"d40ee0e65c2929f4988bf2ea174fdb90f9e242368dda07286400bec50c48a8e3","src/proto/streams/send.rs":"9109f1155e17d70c79b2dc4b080cb9361f80e8fc58d50c9ea03b4bb26381fb10","src/proto/streams/state.rs":"0bddf933578280d1bc5e9780b7fc5ec6f1148579412a28dbce0a25bd67bd3f1a","src/proto/streams/store.rs":"13c0867be760f71942df98d5e964d56a467996faed338a2056a7735fbb770719","src/proto/streams/stream.rs":"988e61b8a90216a809a6bd2c920e2b46a34f0fc3d25fb0e5ba997091c0c0af6a","src/proto/streams/streams.rs":"8ee561a86f4a4018c6e6411053dd868b023b9f8519f498e251bb627fa9c3543a","src/server.rs":"33353eb33327a9e1051769688014a8920ba7894e90d4233c31f358b0ce86e865","src/share.rs":"15f0d94daddb266902f2661a7eb4ba578053bffbdc4df5b46ac89a23f34e2ea1"},"package":"1ac030ae20dee464c5d0f36544d8b914a6bc606da44a57e052d2b0f5dae129e0"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"210ae09f39a1a30833f428ed5629790e372437ca208a7c1a80eccc5571bb6cbc","CONTRIBUTING.md":"149e2dfd4f8b2a8d8bcfaab09c444ff3974a7bdb070ded1de4c2d87ccb8db6f3","Cargo.toml":"9a6deb0c913929865d0e683cc76c02bbbc41a800bf6fbbff053003777ed4837f","LICENSE":"b21623012e6c453d944b0342c515b631cfcbf30704c2621b291526b69c10724d","README.md":"a4a5c1c033fb242b660f908518dfc3fbdf04b28cd463ff633ef1ffff8521a400","examples/akamai.rs":"1954d75ae192c688d71f34e91fb1a2acdb61a72ef7125f9f460f06d807d07525","examples/client.rs":"dc16c9613934914486bc0c2cfb83f10d057f6a803ac88282e74f2235f390b426","examples/server.rs":"10995d8bdda80e9fc942d46e6d1d95fba114682279fe6654a7170b22fc5177c4","src/client.rs":"f0285193fddff9477bfb8f04eb09455e51eb108875e44724a866f25078091d54","src/codec/error.rs":"f03da60918bf9f41e4eabb9be802c8aa7230c59118e53efe97ad9804c17057d4","src/codec/framed_read.rs":"c7f7221481b0dee5ca5d1c7c42e0ef1f51b7110b79f6f546edecc6ad90afd61c","src/codec/framed_write.rs":"3a46fd36a9f2237d14eca0e95aa9436dbaaed49940cbf44c1c517ba3c101d0c4","src/codec/mod.rs":"a2a22a4b58602a310fa8901cc4ad60deb2b6e3a8679717a41937c27d2d4f53b9","src/error.rs":"513d608f79b8e8325f67a6a01c49b136329c1487dfa0dd61a830fe0cb729828b","src/frame/data.rs":"5856440713abd9106b4895b51f6cc0aa32749435adf7207d1b8d7988076c6134","src/frame/go_away.rs":"2024f4fd475a78c2206d28a668d8931e4e579d32f2291db97a259db4abfe334f","src/frame/head.rs":"9e8763b719c4d7116d7b12b4dcc9c344791c3c64500e0acfd52d3679e4ca8a58","src/frame/headers.rs":"dccc0871ff2761e3bd5efe83c51783581444d808ec0cbe57a481e2775e4d190c","src/frame/mod.rs":"fa81b4fdbcdde4855aa6c107c9f3a92196dfd966c226d80699b6b091e9c7220b","src/frame/ping.rs":"68e2fe2f53c39c37a3c121f10b2c0665fc4ff448f36cba4a3603b0fd3e5c9b52","src/frame/priority.rs":"3ad33b4e9a24bb5b2b8b1c92a134efa790ee8ea963b6f4475161034b99f8b5d3","src/frame/reason.rs":"5f8303d1dacc78d622d87da2fcc2324d56adbcde4ca24df7b82194774055c7e4","src/frame/reset.rs":"0595e02a3f83b4451864caecee177fdf003b10fe275a88f23cebb467c71a4444","src/frame/settings.rs":"7956e98f7a8620b904cc6ded5c0f64e32f437cf8871fba29a79b266cb2b756b4","src/frame/stream_id.rs":"088580143cdd34740c2673f50c6e0d6983b2271c011a3583621af01517f862c5","src/frame/util.rs":"f22b3e53aa402ee6c24d69a675ce443e98b06341badd26e17af87b643fa06352","src/frame/window_update.rs":"9c664df42fc789050726eb4005cd38660cad7b92f46117a8fd9528761fd76ff5","src/hpack/decoder.rs":"4108a1ac1d15662f2acf8438a2bfe345e5477511a9b40d8f6ad195143bc1efb9","src/hpack/encoder.rs":"a89486e2a53bfc79806fd4ed83edd508dc9ccd495fc884cb83c940cd575c8a99","src/hpack/header.rs":"957d0180b3f475c13685761532c4e8e55013e1a13a1229ff051362b38ddded5d","src/hpack/huffman/mod.rs":"bc3bf001db39efe34f5e142723d03f1718f51cb5ab72ec5974cd7fb9b881eab9","src/hpack/huffman/table.rs":"062ddb1e4f0d4808fd64a4e62b420ea5b6a5ace0546b90f31b36d3f72b3f6619","src/hpack/mod.rs":"858049d8af16288c328e279b1d9feebf3d6a110f1991d4de3fdd64a9f4c8ed5f","src/hpack/table.rs":"f168c1e7621765fd1464c58be021a77b1da83902ded2ee7cb591eec28f6dcc52","src/hpack/test/fixture.rs":"e9c4eee1b69a8bd912532818e2fbda1a1ff8ef769070c71df1618e9f6d5c73ef","src/hpack/test/fuzz.rs":"0eebfa28de8b68f7a7b5803440b37646e8acfea5ee1ef5a4852c0b5241639fa3","src/hpack/test/mod.rs":"56ad5643e7f1e273e5bce8a6fc0552be39c326dacfffd7f9757ccdbe75e9b66e","src/lib.rs":"f0bd14b1a4a259557f05fbe0bb28d042fc59d1bf11dc6bf822462a62c277c69c","src/proto/connection.rs":"ccf3dc258f38869dd95f516c5fa179b921b4cf98eea6d0f81f38b76a32273dd2","src/proto/error.rs":"917228534afb2f21977a3eabbb5bad72882134c0bd59f1277999fbe16f30a5d9","src/proto/go_away.rs":"1c5513658f85c8783d25578c32d0654d77609c972bac93fb941c76f3b9a5787d","src/proto/mod.rs":"d091593f4c3bd3e1196c06f34e9b93f2511c1ecbbef0376ad61a22861e219ed3","src/proto/peer.rs":"6ffd23080daff48c398ec01d6d2e97c9216a9af773ecadbfd67149e33790596f","src/proto/ping_pong.rs":"3747fa1fc1547d0291212030e1c9b98e17e1cf82bfa31be79d8e866cbf593459","src/proto/settings.rs":"91690f4e1c31554c26c4830ffee68de1e89a67e726dcc9119832cdc7ebaeb5e2","src/proto/streams/buffer.rs":"d88060142edd50e23e519e9a67f926e5f5fa5e49fe5c2c2868f330f840290ec9","src/proto/streams/counts.rs":"6ee0e1dc45b6dae820a6f7297b8ea64e0b0ceafe614e40277ef0c577df909683","src/proto/streams/flow_control.rs":"c39d5b77a94c12c724d7a9d391266119af355b12caf2c24169c11b3dfd3bbafa","src/proto/streams/mod.rs":"80877f6f7325d40a41cf0c6f24f22469cedbc9eaf70aa190198cec9c8cd54758","src/proto/streams/prioritize.rs":"d32b574d84e3dcabcfb9d7e8e29140c0a01ce0322c3a5350ac94d04702b7be07","src/proto/streams/recv.rs":"d40ee0e65c2929f4988bf2ea174fdb90f9e242368dda07286400bec50c48a8e3","src/proto/streams/send.rs":"d0ec4a47193d79c909caf3be284892deaa625f350af42ad84953e4a0904853f2","src/proto/streams/state.rs":"0bddf933578280d1bc5e9780b7fc5ec6f1148579412a28dbce0a25bd67bd3f1a","src/proto/streams/store.rs":"13c0867be760f71942df98d5e964d56a467996faed338a2056a7735fbb770719","src/proto/streams/stream.rs":"988e61b8a90216a809a6bd2c920e2b46a34f0fc3d25fb0e5ba997091c0c0af6a","src/proto/streams/streams.rs":"4774f034b70948d0161b4153433209bd55863d5846253db53c433c773d258f8b","src/server.rs":"edb4c06b5a7c67db2ac00adfceab697e56f169252e5eed6974ff0902adab10ef","src/share.rs":"15f0d94daddb266902f2661a7eb4ba578053bffbdc4df5b46ac89a23f34e2ea1"},"package":"ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/h2/CHANGELOG.md b/rustc_deps/vendor/h2/CHANGELOG.md
index b93caf1..efac7f8 100644
--- a/rustc_deps/vendor/h2/CHANGELOG.md
+++ b/rustc_deps/vendor/h2/CHANGELOG.md
@@ -1,3 +1,11 @@
+# 0.1.16 (January 24, 2019)
+
+* Log header values when malformed (#342).
+
+# 0.1.15 (January 12, 2019)
+
+* Fix race condition bug related to shutting down the client (#338).
+
 # 0.1.14 (December 5, 2018)
 
 * Fix closed streams to always return window capacity to the connection (#334).
diff --git a/rustc_deps/vendor/h2/Cargo.toml b/rustc_deps/vendor/h2/Cargo.toml
index e437a03..d666ac5 100644
--- a/rustc_deps/vendor/h2/Cargo.toml
+++ b/rustc_deps/vendor/h2/Cargo.toml
@@ -12,12 +12,12 @@
 
 [package]
 name = "h2"
-version = "0.1.14"
+version = "0.1.16"
 authors = ["Carl Lerche <me@carllerche.com>"]
 exclude = ["fixtures/**", "ci/**"]
 description = "An HTTP/2.0 client and server"
 homepage = "https://github.com/carllerche/h2"
-documentation = "https://docs.rs/h2"
+documentation = "https://docs.rs/h2/0.1.16/h2/"
 readme = "README.md"
 keywords = ["http", "async", "non-blocking"]
 categories = ["asynchronous", "web-programming", "network-programming"]
diff --git a/rustc_deps/vendor/h2/README.md b/rustc_deps/vendor/h2/README.md
index d12edee..8a7dcd9 100644
--- a/rustc_deps/vendor/h2/README.md
+++ b/rustc_deps/vendor/h2/README.md
@@ -9,7 +9,7 @@
 
 More information about this crate can be found in the [crate documentation][dox].
 
-[dox]: https://docs.rs/h2
+[dox]: https://docs.rs/h2/0.1.15/h2/
 
 ## Features
 
@@ -38,7 +38,7 @@
 
 ```toml
 [dependencies]
-h2 = "0.1"
+h2 = "0.1.15"
 ```
 
 Next, add this to your crate:
diff --git a/rustc_deps/vendor/h2/src/lib.rs b/rustc_deps/vendor/h2/src/lib.rs
index c8b1d6d..b56c1be 100644
--- a/rustc_deps/vendor/h2/src/lib.rs
+++ b/rustc_deps/vendor/h2/src/lib.rs
@@ -84,7 +84,7 @@
 //! [`server::handshake`]: server/fn.handshake.html
 //! [`client::handshake`]: client/fn.handshake.html
 
-#![doc(html_root_url = "https://docs.rs/h2/0.1.14")]
+#![doc(html_root_url = "https://docs.rs/h2/0.1.16")]
 #![deny(missing_debug_implementations, missing_docs)]
 #![cfg_attr(test, deny(warnings))]
 
diff --git a/rustc_deps/vendor/h2/src/proto/streams/send.rs b/rustc_deps/vendor/h2/src/proto/streams/send.rs
index 806f25d..941a7f4 100644
--- a/rustc_deps/vendor/h2/src/proto/streams/send.rs
+++ b/rustc_deps/vendor/h2/src/proto/streams/send.rs
@@ -128,8 +128,8 @@
              is_reset={:?}; is_closed={:?}; pending_send.is_empty={:?}; \
              state={:?} \
             ",
-            stream.id,
             reason,
+            stream.id,
             is_reset,
             is_closed,
             is_empty,
diff --git a/rustc_deps/vendor/h2/src/proto/streams/streams.rs b/rustc_deps/vendor/h2/src/proto/streams/streams.rs
index d91921f..e92fea2 100644
--- a/rustc_deps/vendor/h2/src/proto/streams/streams.rs
+++ b/rustc_deps/vendor/h2/src/proto/streams/streams.rs
@@ -63,6 +63,9 @@
 
     /// Stores stream state
     store: Store,
+
+    /// The number of stream refs to this shared state.
+    refs: usize,
 }
 
 #[derive(Debug)]
@@ -106,6 +109,7 @@
                     conn_error: None,
                 },
                 store: Store::new(),
+                refs: 1,
             })),
             send_buffer: Arc::new(SendBuffer::new()),
             _p: ::std::marker::PhantomData,
@@ -485,7 +489,9 @@
         let mut me = self.inner.lock().unwrap();
         let me = &mut *me;
         let key = me.actions.recv.next_incoming(&mut me.store);
-
+        // TODO: ideally, OpaqueStreamRefs::new would do this, but we're holding
+        // the lock, so it can't.
+        me.refs += 1;
         key.map(|key| {
             let stream = &mut me.store.resolve(key);
             trace!("next_incoming; id={:?}, state={:?}", stream.id, stream.state);
@@ -635,6 +641,10 @@
         // closed state.
         debug_assert!(!stream.state.is_closed());
 
+        // TODO: ideally, OpaqueStreamRefs::new would do this, but we're holding
+        // the lock, so it can't.
+        me.refs += 1;
+
         Ok(StreamRef {
             opaque: OpaqueStreamRef::new(
                 self.inner.clone(),
@@ -748,16 +758,8 @@
     }
 
     pub fn has_streams_or_other_references(&self) -> bool {
-        if Arc::strong_count(&self.inner) > 1 {
-            return true;
-        }
-
-        if Arc::strong_count(&self.send_buffer) > 1 {
-            return true;
-        }
-
         let me = self.inner.lock().unwrap();
-        me.counts.has_streams()
+        me.counts.has_streams() || me.refs > 1
     }
 
     #[cfg(feature = "unstable")]
@@ -773,6 +775,7 @@
     P: Peer,
 {
     fn clone(&self) -> Self {
+        self.inner.lock().unwrap().refs += 1;
         Streams {
             inner: self.inner.clone(),
             send_buffer: self.send_buffer.clone(),
@@ -781,6 +784,16 @@
     }
 }
 
+impl<B, P> Drop for Streams<B, P>
+where
+    P: Peer,
+{
+    fn drop(&mut self) {
+        let _ = self.inner.lock().map(|mut inner| inner.refs -= 1);
+    }
+}
+
+
 // ===== impl StreamRef =====
 
 impl<B> StreamRef<B> {
@@ -978,6 +991,7 @@
             try_ready!(me.actions.recv.poll_pushed(&mut stream))
         };
         Ok(Async::Ready(res.map(|(h, key)| {
+            me.refs += 1;
             let opaque_ref =
                 OpaqueStreamRef::new(self.inner.clone(), &mut me.store.resolve(key));
             (h, opaque_ref)
@@ -1070,7 +1084,9 @@
 impl Clone for OpaqueStreamRef {
     fn clone(&self) -> Self {
         // Increment the ref count
-        self.inner.lock().unwrap().store.resolve(self.key).ref_inc();
+        let mut inner = self.inner.lock().unwrap();
+        inner.store.resolve(self.key).ref_inc();
+        inner.refs += 1;
 
         OpaqueStreamRef {
             inner: self.inner.clone(),
@@ -1098,7 +1114,7 @@
     };
 
     let me = &mut *me;
-
+    me.refs -= 1;
     let mut stream = me.store.resolve(key);
 
     trace!("drop_stream_ref; stream={:?}", stream);
diff --git a/rustc_deps/vendor/h2/src/server.rs b/rustc_deps/vendor/h2/src/server.rs
index 15558ea..6072db5 100644
--- a/rustc_deps/vendor/h2/src/server.rs
+++ b/rustc_deps/vendor/h2/src/server.rs
@@ -1226,15 +1226,19 @@
         let mut parts = uri::Parts::default();
 
         if let Some(scheme) = pseudo.scheme {
-            parts.scheme = Some(uri::Scheme::from_shared(scheme.into_inner())
-                .or_else(|_| malformed!("malformed headers: malformed scheme"))?);
+            let maybe_scheme = uri::Scheme::from_shared(scheme.clone().into_inner());
+            parts.scheme = Some(maybe_scheme.or_else(|why| malformed!(
+                "malformed headers: malformed scheme ({:?}): {}", scheme, why,
+            ))?);
         } else {
             malformed!("malformed headers: missing scheme");
         }
 
         if let Some(authority) = pseudo.authority {
-            parts.authority = Some(uri::Authority::from_shared(authority.into_inner())
-                .or_else(|_| malformed!("malformed headers: malformed authority"))?);
+            let maybe_authority = uri::Authority::from_shared(authority.clone().into_inner());
+            parts.authority = Some(maybe_authority.or_else(|why| malformed!(
+                "malformed headers: malformed authority ({:?}): {}", authority, why,
+            ))?);
         }
 
         if let Some(path) = pseudo.path {
@@ -1243,8 +1247,10 @@
                 malformed!("malformed headers: missing path");
             }
 
-            parts.path_and_query = Some(uri::PathAndQuery::from_shared(path.into_inner())
-                .or_else(|_| malformed!("malformed headers: malformed path"))?);
+            let maybe_path = uri::PathAndQuery::from_shared(path.clone().into_inner());
+            parts.path_and_query = Some(maybe_path.or_else(|why| malformed!(
+                "malformed headers: malformed path ({:?}): {}", path, why,
+            ))?);
         }
 
         b.uri(parts);
diff --git a/rustc_deps/vendor/http/.cargo-checksum.json b/rustc_deps/vendor/http/.cargo-checksum.json
index bb8cdc1..880aeaa 100644
--- a/rustc_deps/vendor/http/.cargo-checksum.json
+++ b/rustc_deps/vendor/http/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"CHANGELOG.md":"de42210c0bd01aedd8a2690575900762cc91ca61bb69cf685896d6f3327dd299","Cargo.toml":"ff701d959b36f8d2a0701104754fd554d6f881d44bdf3cc29f173c8c190bba4e","LICENSE-APACHE":"8bb1b50b0e5c9399ae33bd35fab2769010fa6c14e8860c729a52295d84896b7a","LICENSE-MIT":"dc91f8200e4b2a1f9261035d4c18c33c246911a6c0f7b543d75347e61b249cff","README.md":"f73e225735ebdcafa1ba79216261fe24828f873d8940c9f96adb37d933a93aaf","benches/header_map/basic.rs":"7e91c67c5ee59bb0f12bba735e4b2ed0b0fc2a4c0007c3920dfc66d266eeaeeb","benches/header_map/mod.rs":"601ab90cdb234f0d1e15c98d9d407f1dd44984d6abb0ecaccd9f64f1fc5255e2","benches/header_map/vec_map.rs":"6cee49372f891c21355d04c336ebd26971c42b78a2edb7e8281174d771856d2f","benches/header_value.rs":"53c765dff1ad2c7e7f9bfcb35bdbb3f9b42e3e0a537401dc691226488389062c","benches/uri.rs":"5e3e5c4cbaa69390317a32b1e8f15aa4e9425466739dd81c3d3d379c47da1457","src/byte_str.rs":"87688714c2d8fb1086e362d1d239bd3353a7f4bc6839740eeea3fcbbfd3d71e5","src/convert.rs":"b4ef00e97f56ebdcd98ee43a3d1460f4b50aa0dcef39a8e25d13b31d16d148d4","src/error.rs":"0e4df207f49be5af249870837607f8fc24102a4641a7b775f907688deff6930a","src/extensions.rs":"7e57d0ff5251bb8fb212c36168849a3f9b14ee8aa1aeed8483153908562aa07a","src/header/map.rs":"33a3ace9d4165c4611a69b122b81c8e1352240986d8e92aeb8f475e919230d12","src/header/mod.rs":"59c0431016f797e4d700b5aabb9c6092c40acde3d2003d3c70bc373fa6fe37b2","src/header/name.rs":"09647672d74ffa56c83e437150e5d2b9c0e5828cf0361b09c201c0679472c832","src/header/value.rs":"0456bd07ac6a623888a5f5cb87a4be750440da10d24aaf887d52cc465f9bb732","src/lib.rs":"7985b6336db651c34d5f9d4e394be52e14f137726c71b56b036bc299f789c656","src/method.rs":"63b72090a01b7d920c2d5f487b580c4bd93fb522514a5dc2dd3b2ed11d3dee5a","src/request.rs":"b58595e74e51339c7ecb7f66c07d3ce54a553e819a9457e2aa7221a0f4fb4119","src/response.rs":"90cb51393bb27ef589c4b29fa438d4d3488ae74178a24be169bfba33700e557d","src/status.rs":"11440c53df112388613a1bde2ad1b9a3bf46aacf700e070c7aa4131e3f242e14","src/uri/authority.rs":"9117201be463e6589cbd1bd0b5da60bc82bf2ebf8e4d25e4f0b97db341eac573","src/uri/builder.rs":"6dc27c738fd57f0e44313c511dd1e14dcc9fa1362638a6b5255c73ef00307d90","src/uri/mod.rs":"6aa7f4506ed3907c978ec128731c51de7c0fc90000e22e2d3b2548b7c052e6bd","src/uri/path.rs":"9fc8b66498b1806175efd07961c35ab0cd5312da0219fd98674cd072db952f6e","src/uri/port.rs":"a52c7d16d21f22897d5007c673dbd2a6fdfa550385cff663b6d7642893e4e71e","src/uri/scheme.rs":"2152ec76ad60c5de2182f3714f7ce2ee514d632d510917a7c4ddc8a9ec36292d","src/uri/tests.rs":"448bb3090832ea375757c5b0dec61674bc15c5ae0dad8ee5255096ddf0cb4f36","src/version.rs":"d7cea6976335425a1fd10766083f9ac74b9f8c6667c2e71abf5f0886c0a93186","tests/header_map.rs":"4b52dfd11e37353ecc242220a3db7ea8b000c373ae33f3a527c3cfeb020c6cc0","tests/header_map_fuzz.rs":"9fc39a62f89dc7794d1e29dbf70ac352b1ddf981501a59cfcca02f6fd11acd98","tests/status_code.rs":"112e27e367e2adc16d5734b6a523d6dd5208e69fd6b9e596d95111051881d10b"},"package":"02096a6d2c55e63f7fcb800690e4f889a25f6ec342e3adb4594e293b625215ab"}
\ No newline at end of file
+{"files":{"CHANGELOG.md":"13b0f685dda24d8292863299facde90206d1aa9a059128b7664f34eff5abee41","Cargo.toml":"e190526ef579a3c1aad69736f950a3c441b6212d5fd4c6280a6b5e731fd71150","LICENSE-APACHE":"8bb1b50b0e5c9399ae33bd35fab2769010fa6c14e8860c729a52295d84896b7a","LICENSE-MIT":"dc91f8200e4b2a1f9261035d4c18c33c246911a6c0f7b543d75347e61b249cff","README.md":"f73e225735ebdcafa1ba79216261fe24828f873d8940c9f96adb37d933a93aaf","benches/header_map/basic.rs":"7e91c67c5ee59bb0f12bba735e4b2ed0b0fc2a4c0007c3920dfc66d266eeaeeb","benches/header_map/mod.rs":"601ab90cdb234f0d1e15c98d9d407f1dd44984d6abb0ecaccd9f64f1fc5255e2","benches/header_map/vec_map.rs":"6cee49372f891c21355d04c336ebd26971c42b78a2edb7e8281174d771856d2f","benches/header_value.rs":"53c765dff1ad2c7e7f9bfcb35bdbb3f9b42e3e0a537401dc691226488389062c","benches/uri.rs":"5e3e5c4cbaa69390317a32b1e8f15aa4e9425466739dd81c3d3d379c47da1457","src/byte_str.rs":"87688714c2d8fb1086e362d1d239bd3353a7f4bc6839740eeea3fcbbfd3d71e5","src/convert.rs":"b4ef00e97f56ebdcd98ee43a3d1460f4b50aa0dcef39a8e25d13b31d16d148d4","src/error.rs":"0e4df207f49be5af249870837607f8fc24102a4641a7b775f907688deff6930a","src/extensions.rs":"7e57d0ff5251bb8fb212c36168849a3f9b14ee8aa1aeed8483153908562aa07a","src/header/map.rs":"33a3ace9d4165c4611a69b122b81c8e1352240986d8e92aeb8f475e919230d12","src/header/mod.rs":"59c0431016f797e4d700b5aabb9c6092c40acde3d2003d3c70bc373fa6fe37b2","src/header/name.rs":"09647672d74ffa56c83e437150e5d2b9c0e5828cf0361b09c201c0679472c832","src/header/value.rs":"0456bd07ac6a623888a5f5cb87a4be750440da10d24aaf887d52cc465f9bb732","src/lib.rs":"df900587ffc8b8d80e174bebaa7565b2a42153da34251da8e33a61efd344e238","src/method.rs":"63b72090a01b7d920c2d5f487b580c4bd93fb522514a5dc2dd3b2ed11d3dee5a","src/request.rs":"b9e99d5cb00d82bd2239832ddbc3bb6f684efd08410d08f498f50cdcf4ef3062","src/response.rs":"90cb51393bb27ef589c4b29fa438d4d3488ae74178a24be169bfba33700e557d","src/status.rs":"11440c53df112388613a1bde2ad1b9a3bf46aacf700e070c7aa4131e3f242e14","src/uri/authority.rs":"f43757cdcd8bfc75e6e389cf76d241e8fe4ce2376d5736334d38f6e511d0c792","src/uri/builder.rs":"6dc27c738fd57f0e44313c511dd1e14dcc9fa1362638a6b5255c73ef00307d90","src/uri/mod.rs":"f5c4b634f380003456d00a5f40e727b1c05512b4e2e796f26785472a9f25ec6e","src/uri/path.rs":"9fc8b66498b1806175efd07961c35ab0cd5312da0219fd98674cd072db952f6e","src/uri/port.rs":"a52c7d16d21f22897d5007c673dbd2a6fdfa550385cff663b6d7642893e4e71e","src/uri/scheme.rs":"2152ec76ad60c5de2182f3714f7ce2ee514d632d510917a7c4ddc8a9ec36292d","src/uri/tests.rs":"97b6150971ed284de0407d37faf2decb402a611543fda29fee61f471937f81e5","src/version.rs":"d7cea6976335425a1fd10766083f9ac74b9f8c6667c2e71abf5f0886c0a93186","tests/header_map.rs":"4b52dfd11e37353ecc242220a3db7ea8b000c373ae33f3a527c3cfeb020c6cc0","tests/header_map_fuzz.rs":"9fc39a62f89dc7794d1e29dbf70ac352b1ddf981501a59cfcca02f6fd11acd98","tests/status_code.rs":"112e27e367e2adc16d5734b6a523d6dd5208e69fd6b9e596d95111051881d10b"},"package":"1a10e5b573b9a0146545010f50772b9e8b1dd0a256564cc4307694c68832a2f5"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/http/CHANGELOG.md b/rustc_deps/vendor/http/CHANGELOG.md
index e21e65d..94e1851 100644
--- a/rustc_deps/vendor/http/CHANGELOG.md
+++ b/rustc_deps/vendor/http/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 0.1.15 (January 22, 2019)
+
+* Fix `Uri::host()` to include brackets of IPv6 literals (#292)
+* Add `scheme_str` and `port_u16` methods to `Uri` (#287)
+* Add `method_ref`, `uri_ref`, and `headers_ref` to `request::Builder` (#284)
+
 # 0.1.14 (November 21, 2018)
 
 * Add `Port` struct (#252, #255, #265)
diff --git a/rustc_deps/vendor/http/Cargo.toml b/rustc_deps/vendor/http/Cargo.toml
index c2220db..272e819 100644
--- a/rustc_deps/vendor/http/Cargo.toml
+++ b/rustc_deps/vendor/http/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "http"
-version = "0.1.14"
+version = "0.1.15"
 authors = ["Alex Crichton <alex@alexcrichton.com>", "Carl Lerche <me@carllerche.com>", "Sean McArthur <sean@seanmonstar.com>"]
 description = "A set of types for representing HTTP requests and responses.\n"
 homepage = "https://github.com/hyperium/http"
diff --git a/rustc_deps/vendor/http/src/lib.rs b/rustc_deps/vendor/http/src/lib.rs
index 69f236c..788ec97 100644
--- a/rustc_deps/vendor/http/src/lib.rs
+++ b/rustc_deps/vendor/http/src/lib.rs
@@ -1,4 +1,4 @@
-#![doc(html_root_url = "https://docs.rs/http/0.1.14")]
+#![doc(html_root_url = "https://docs.rs/http/0.1.15")]
 
 //! A general purpose library of common HTTP types
 //!
diff --git a/rustc_deps/vendor/http/src/request.rs b/rustc_deps/vendor/http/src/request.rs
index 382af1e..2fc1163 100644
--- a/rustc_deps/vendor/http/src/request.rs
+++ b/rustc_deps/vendor/http/src/request.rs
@@ -771,6 +771,34 @@
         self
     }
 
+    /// Get the HTTP Method for this request.
+    /// 
+    /// By default this is `GET`.
+    /// if builder has error, returns None.
+    /// 
+    /// # Examples
+    /// 
+    /// ```
+    /// # use http::*;
+    /// 
+    /// let mut req = Request::builder();
+    /// assert_eq!(req.method_ref(),Some(&Method::GET));
+    /// req.method("POST");
+    /// assert_eq!(req.method_ref(),Some(&Method::POST));
+    /// req.method("DELETE");
+    /// assert_eq!(req.method_ref(),Some(&Method::DELETE));
+    /// ```
+    pub fn method_ref(&self) -> Option<&Method>
+    {
+        if self.err.is_some() {
+            return None
+        }
+        match self.head {
+            Some(ref head) => Some(&head.method),
+            None => None
+        }
+    }
+
     /// Set the URI for this request.
     ///
     /// This function will configure the URI of the `Request` that will
@@ -800,6 +828,31 @@
         self
     }
 
+    /// Get the URI for this request
+    /// 
+    /// By default this is `/`
+    /// # Examples
+    /// 
+    /// ```
+    /// # use http::*;
+    /// 
+    /// let mut req = Request::builder();
+    /// assert_eq!(req.uri_ref().unwrap().to_string(), "/" );
+    /// req.uri("https://www.rust-lang.org/");
+    /// assert_eq!(req.uri_ref().unwrap().to_string(), "https://www.rust-lang.org/" );
+    /// ```
+    pub fn uri_ref(&self) -> Option<&Uri>
+    {
+        if self.err.is_some() {
+            return None;
+        }
+        match self.head
+        {
+            Some(ref head) => Some(&head.uri),
+            None => None
+        }
+    }
+
     /// Set the HTTP version for this request.
     ///
     /// This function will configure the HTTP version of the `Request` that
@@ -860,6 +913,33 @@
         self
     }
 
+    /// Get header on this request builder.
+    /// when builder has error returns None
+    /// 
+    /// # Example
+    /// 
+    /// ```
+    /// # use http::*;
+    /// # use http::header::HeaderValue;
+    /// # use http::request::Builder;
+    /// let mut req = Request::builder();
+    /// req.header("Accept", "text/html")
+    ///    .header("X-Custom-Foo", "bar");
+    /// let headers = req.headers_ref().unwrap();
+    /// assert_eq!( headers["Accept"], "text/html" );
+    /// assert_eq!( headers["X-Custom-Foo"], "bar" );
+    /// ```
+    pub fn headers_ref(&self) -> Option<&HeaderMap<HeaderValue>> {
+        if self.err.is_some() {
+            return None;
+        }
+        match self.head
+        {
+            Some(ref head) => Some(&head.headers),
+            None => None
+        }
+    }
+
     /// Adds an extension to this builder
     ///
     /// # Examples
diff --git a/rustc_deps/vendor/http/src/uri/authority.rs b/rustc_deps/vendor/http/src/uri/authority.rs
index 4782285..724712c 100644
--- a/rustc_deps/vendor/http/src/uri/authority.rs
+++ b/rustc_deps/vendor/http/src/uri/authority.rs
@@ -197,10 +197,10 @@
         host(self.as_str())
     }
 
-    #[deprecated(since="0.1.14", note="use `port_part` instead")]
+    #[deprecated(since="0.1.14", note="use `port_part` or `port_u16` instead")]
     #[doc(hidden)]
     pub fn port(&self) -> Option<u16> {
-        self.port_part().and_then(|p| Some(p.as_u16()))
+        self.port_u16()
     }
 
     /// Get the port part of this `Authority`.
@@ -227,6 +227,7 @@
     ///
     /// let port = authority.port_part().unwrap();
     /// assert_eq!(port.as_u16(), 80);
+    /// assert_eq!(port.as_str(), "80");
     /// ```
     ///
     /// Authority without port
@@ -244,6 +245,20 @@
             .and_then(|i| Port::from_str(&bytes[i + 1..]).ok())
     }
 
+    /// Get the port of this `Authority` as a `u16`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # use http::uri::Authority;
+    /// let authority: Authority = "example.org:80".parse().unwrap();
+    ///
+    /// assert_eq!(authority.port_u16(), Some(80));
+    /// ```
+    pub fn port_u16(&self) -> Option<u16> {
+        self.port_part().and_then(|p| Some(p.as_u16()))
+    }
+
     /// Return a str representation of the authority
     #[inline]
     pub fn as_str(&self) -> &str {
@@ -482,7 +497,8 @@
     if host_port.as_bytes()[0] == b'[' {
         let i = host_port.find(']')
             .expect("parsing should validate brackets");
-        &host_port[1..i]
+        // ..= ranges aren't available in 1.20, our minimum Rust version...
+        &host_port[0 .. i + 1]
     } else {
         host_port.split(':')
             .next()
diff --git a/rustc_deps/vendor/http/src/uri/mod.rs b/rustc_deps/vendor/http/src/uri/mod.rs
index 925d994..0d2f34b 100644
--- a/rustc_deps/vendor/http/src/uri/mod.rs
+++ b/rustc_deps/vendor/http/src/uri/mod.rs
@@ -437,10 +437,11 @@
     /// Absolute URI
     ///
     /// ```
-    /// # use http::Uri;
+    /// use http::uri::{Scheme, Uri};
+    ///
     /// let uri: Uri = "http://example.org/hello/world".parse().unwrap();
     ///
-    /// assert_eq!(uri.scheme_part().map(|s| s.as_str()), Some("http"));
+    /// assert_eq!(uri.scheme_part(), Some(&Scheme::HTTP));
     /// ```
     ///
     ///
@@ -461,10 +462,25 @@
         }
     }
 
-    #[deprecated(since = "0.1.2", note = "use scheme_part instead")]
+    #[deprecated(since = "0.1.2", note = "use scheme_part or scheme_str instead")]
     #[doc(hidden)]
     #[inline]
     pub fn scheme(&self) -> Option<&str> {
+        self.scheme_str()
+    }
+
+    /// Get the scheme of this `Uri` as a `&str`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # use http::Uri;
+    /// let uri: Uri = "http://example.org/hello/world".parse().unwrap();
+    ///
+    /// assert_eq!(uri.scheme_str(), Some("http"));
+    /// ```
+    #[inline]
+    pub fn scheme_str(&self) -> Option<&str> {
         if self.scheme.inner.is_none() {
             None
         } else {
@@ -569,10 +585,10 @@
         self.authority_part().map(|a| a.host())
     }
 
-    #[deprecated(since="0.1.14", note="use `port_part` instead")]
+    #[deprecated(since="0.1.14", note="use `port_part` or `port_u16` instead")]
     #[doc(hidden)]
     pub fn port(&self) -> Option<u16> {
-        self.port_part().and_then(|p| Some(p.as_u16()))
+        self.port_u16()
     }
 
     /// Get the port part of this `Uri`.
@@ -594,7 +610,7 @@
     /// Absolute URI with port
     ///
     /// ```
-    /// # use http::{Uri, uri::Port};
+    /// # use http::Uri;
     /// let uri: Uri = "http://example.org:80/hello/world".parse().unwrap();
     ///
     /// let port = uri.port_part().unwrap();
@@ -623,6 +639,21 @@
             .and_then(|a| a.port_part())
     }
 
+    /// Get the port of this `Uri` as a `u16`.
+    ///
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # use http::{Uri, uri::Port};
+    /// let uri: Uri = "http://example.org:80/hello/world".parse().unwrap();
+    ///
+    /// assert_eq!(uri.port_u16(), Some(80));
+    /// ```
+    pub fn port_u16(&self) -> Option<u16> {
+        self.port_part().and_then(|p| Some(p.as_u16()))
+    }
+
     /// Get the query string of this `Uri`, starting after the `?`.
     ///
     /// The query component contains non-hierarchical data that, along with data
diff --git a/rustc_deps/vendor/http/src/uri/tests.rs b/rustc_deps/vendor/http/src/uri/tests.rs
index f580e89..70f63a6 100644
--- a/rustc_deps/vendor/http/src/uri/tests.rs
+++ b/rustc_deps/vendor/http/src/uri/tests.rs
@@ -298,7 +298,7 @@
 
     scheme_part = part!("http"),
     authority_part = part!("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]"),
-    host = Some("2001:0db8:85a3:0000:0000:8a2e:0370:7334"),
+    host = Some("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]"),
     path = "/",
     query = None,
     port_part = None,
@@ -311,7 +311,7 @@
 
     scheme_part = part!("http"),
     authority_part = part!("[::1]"),
-    host = Some("::1"),
+    host = Some("[::1]"),
     path = "/",
     query = None,
     port_part = None,
@@ -324,7 +324,7 @@
 
     scheme_part = part!("http"),
     authority_part = part!("[::]"),
-    host = Some("::"),
+    host = Some("[::]"),
     path = "/",
     query = None,
     port_part = None,
@@ -337,7 +337,7 @@
 
     scheme_part = part!("http"),
     authority_part = part!("[2001:db8::2:1]"),
-    host = Some("2001:db8::2:1"),
+    host = Some("[2001:db8::2:1]"),
     path = "/",
     query = None,
     port_part = None,
@@ -350,7 +350,7 @@
 
     scheme_part = part!("http"),
     authority_part = part!("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:8008"),
-    host = Some("2001:0db8:85a3:0000:0000:8a2e:0370:7334"),
+    host = Some("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]"),
     path = "/",
     query = None,
     port_part = Port::from_str("8008").ok(),
diff --git a/rustc_deps/vendor/hyper/.cargo-checksum.json b/rustc_deps/vendor/hyper/.cargo-checksum.json
index bddd6da..6281181 100644
--- a/rustc_deps/vendor/hyper/.cargo-checksum.json
+++ b/rustc_deps/vendor/hyper/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"7a913af71f08cf43573eaffe3846e7185cbdb4b85f25fef108e92b3a9326ca45","LICENSE":"0008012e192415992a45a8161c08d7adb429f8032de62d43afc9fd2c6f0b5323","src/body/body.rs":"7b45e29ed498cb2d543ada08d4e3e3f7faff8a96d76cc15d4d61070a79044f6a","src/body/chunk.rs":"74edcd27bb824094fd2cccffbdf1cb0561949520eab228185986495bc0a7986c","src/body/mod.rs":"aaa253d1e4aa6128388c22b6107600af450ff5c2610eeafe53ecbca31ac2d7f7","src/body/payload.rs":"3d44bf7a99b4a51651f0f2518590b89f332b0263e1bba2352547da4ef0be63e1","src/client/conn.rs":"e43752cc8a581c482fca5e3187a9655823180369ea97d2ac614f015fa8582a09","src/client/connect/dns.rs":"deb0906ad7158bea09b1455755fce0a7ed65e66427655c8ec0bc5e957bf72625","src/client/connect/http.rs":"85a50bbb88760cc82eedb9e9b64d4bc715aca9ab01970a44226bb98865f1d842","src/client/connect/mod.rs":"efc3017d9d1b8ff2707adf6c5a897324c64430d2f8aebc834e00b1af8fc3c68d","src/client/dispatch.rs":"7a155b77f5b4dd7735dce1dc9936cba778a1de2c4497964ee927b1d2fbdb1e8a","src/client/mod.rs":"68364268b3d5062e8571c945220d9b50a73b9fe7d94ed128950a964f241ac470","src/client/pool.rs":"73c4f9eebcf1cbd20934eec44c33ef5a19732af5335cb7d4605620c59aac9019","src/client/tests.rs":"f31a26a2d0d115b98514b11e4fb70fa73196db95bc54759eb035bba4fe85b0c8","src/common/buf.rs":"5ff16c21fc0c73577781dee68ef43d38eaefdcfa8e4d0a11bdb5cff663a76e8a","src/common/drain.rs":"c5e1fb98ae9da657c817898b284d77dfe362e8a5ed2b5bcc3ab661094cdbcc5b","src/common/exec.rs":"4bf41e883cf3cef427d1b6e9bd5278970febd99b200399dfdf2c0c623b2f2ac7","src/common/io/mod.rs":"6f8e4518df7f24d81fc59b46a2deb61557e8d92700bdc62539fe0f034066fc89","src/common/io/rewind.rs":"205d904384476023969b134609486bbd8c2ee8457d0c7cd486c8424f576577e8","src/common/lazy.rs":"c065c2117cf79f91cebab6a0919ae34c2929b4eec75deb843fd2a9b4b7424a59","src/common/mod.rs":"8ec60e8e3c39087c1c8b6ab4f27e2548b6a20ed0cf46abd771183a1f7fe33d7e","src/common/never.rs":"d2f6345add7df1a32a6a37179d9abc9c25e633d422abde923201b9c54bf00bd0","src/error.rs":"8f940c490ca8ee0e42a7807270256139ae846d613afe59c7a7c9dcdb80d7f732","src/headers.rs":"a7a847d48c731a22d0fb105b8d668fb58020831b40ce29edd0622781eb99937b","src/lib.rs":"f7fc6a40a52075698994644a307fb7397676d4b9009049aacb41ea828aff44c3","src/mock.rs":"bb9f3e1f8b302dca7bf9387c7313f9c5a654bb6a2d822e5fe3b80b772b80e30e","src/proto/h1/conn.rs":"3d8574d9dbbb3b3e63cf4ac04562c30620dddbe54e35f4cd7da06de40983c2d5","src/proto/h1/date.rs":"67ce8f2d8f2a615080f059feefd9e19ec8ba064c7e09c5efbb774c5c8e92cf0d","src/proto/h1/decode.rs":"fbd2b09a46537d88c7cd8d908bdd34b7aacc390086fb044756c8a8ea0913a90f","src/proto/h1/dispatch.rs":"199058936df3479c913b99d77c51fde53da72ecf3e8096ad4a93a90aaaaba3e9","src/proto/h1/encode.rs":"b20efa2b5fcf2959d7da59b6153a9e30bcdc2d4b218b6c442877e275e0acd6c8","src/proto/h1/io.rs":"a49bb49ff3e787a9a69a3b4d9f1bcf4e4c07d618d30152d55d63c1b9345b3620","src/proto/h1/mod.rs":"4f5e18d15886f60510cdbe39366c91c18d5ddf90254cec4030499831f7a404d6","src/proto/h1/role.rs":"6d0dc397574f4e0f1adf2bd0487e713d7cf348eee0fb4ee02948db4686c9a174","src/proto/h2/client.rs":"e8ddc2d96315d5becf4d4d23e75db2acf21a80c115453a648f7bb946f6801c4b","src/proto/h2/mod.rs":"7e0689ab34c89db4537af83e67f89a18cd9d6a5c871c10fed9a5d4745788555e","src/proto/h2/server.rs":"d9a4f460a452f306b6f58e45b6e7afb01dc159d92b656c57489a1e8133d06d08","src/proto/mod.rs":"1762e5443c8ee6ea7ecb4870ade6e750799d86b4667bb5162f11d60cd87c41a5","src/rt.rs":"df55114f40696f5a1e79c7c818c6feb91d479fc00ac5f1775c1d0fdb30168118","src/server/conn.rs":"c04f4e8116d44f4538d740ff43ae098ad5a8428479942ebf413f051484be6298","src/server/mod.rs":"a0d43d5c7c97f1b1a82097d018f002c736feb6923ae41a84d71ec018738aedea","src/server/shutdown.rs":"1a6cd98fa752dc1c9d148c589a19fe694f25a8327b61512c46fc7e12f8113f7d","src/server/tcp.rs":"a06ed3b3403d0b33ba04c9bf2a4cf6fca36168197db774c732566ee69e593971","src/service/make_service.rs":"97e35a177e47f46f5c3e2abe8e82fadbb446ba2e0f5961008e5d371418b23956","src/service/mod.rs":"a6651599c1a518cbe0644fd8fb8762904f6e8ad98147a7e7460a3f470189f14c","src/service/new_service.rs":"84fece081fdf9fc3d5a860245895cca34d8d24ada161de126baf22070c426aac","src/service/service.rs":"e6e8edebef5a5b855350f71b1351574f90267f7e6ddae24d6f409ddd6bddb130","src/upgrade.rs":"75ce6ceb7e4b4e2f8bd5a3992327332955ea63aafbb2acd635b559dd4d62c86b"},"package":"80eeda66c9ef8e18f5122fff2c54604c053420b11dae951cfb74cf1dcba2e93f"}
\ No newline at end of file
+{"files":{"Cargo.toml":"c267f5c7d46f2ac8b67414ef42974cee8a6c226562b1f7769d0c066e19c13544","LICENSE":"0008012e192415992a45a8161c08d7adb429f8032de62d43afc9fd2c6f0b5323","src/body/body.rs":"7b45e29ed498cb2d543ada08d4e3e3f7faff8a96d76cc15d4d61070a79044f6a","src/body/chunk.rs":"74edcd27bb824094fd2cccffbdf1cb0561949520eab228185986495bc0a7986c","src/body/mod.rs":"ad2c08cfde03025784b937360192becc699d0884d9c59b493c1bbe9303a6e98f","src/body/payload.rs":"d2609c4f4a0dccb82e20019bbe5b7c2bccfb42ed86cc0df4dc34cac1c58515c8","src/client/conn.rs":"c6864760fd4a37a69912ab7e85a79a0f21fc446d4c22935e8aee524973542ee7","src/client/connect/dns.rs":"fafa0a77567bb83dd053ccb2686dad2d24a6ec48dde54a5d55d3db5a8b383f3e","src/client/connect/http.rs":"7d1b46ddfb902fffda38ddc432c744975ca88be9133e53e1ae26a77feaa767e3","src/client/connect/mod.rs":"aca0b543ad1bb6303a7deb1123aec1fefd2aaea604ddce04ce8d6b203722d766","src/client/dispatch.rs":"7a155b77f5b4dd7735dce1dc9936cba778a1de2c4497964ee927b1d2fbdb1e8a","src/client/mod.rs":"0e4d224edd1d7ccb32e0e38793f4dc70beaf9df15467899dd74698ce5a8238c4","src/client/pool.rs":"73c4f9eebcf1cbd20934eec44c33ef5a19732af5335cb7d4605620c59aac9019","src/client/tests.rs":"f31a26a2d0d115b98514b11e4fb70fa73196db95bc54759eb035bba4fe85b0c8","src/common/buf.rs":"5ff16c21fc0c73577781dee68ef43d38eaefdcfa8e4d0a11bdb5cff663a76e8a","src/common/drain.rs":"c5e1fb98ae9da657c817898b284d77dfe362e8a5ed2b5bcc3ab661094cdbcc5b","src/common/exec.rs":"4bf41e883cf3cef427d1b6e9bd5278970febd99b200399dfdf2c0c623b2f2ac7","src/common/io/mod.rs":"6f8e4518df7f24d81fc59b46a2deb61557e8d92700bdc62539fe0f034066fc89","src/common/io/rewind.rs":"205d904384476023969b134609486bbd8c2ee8457d0c7cd486c8424f576577e8","src/common/lazy.rs":"c065c2117cf79f91cebab6a0919ae34c2929b4eec75deb843fd2a9b4b7424a59","src/common/mod.rs":"8ec60e8e3c39087c1c8b6ab4f27e2548b6a20ed0cf46abd771183a1f7fe33d7e","src/common/never.rs":"d2f6345add7df1a32a6a37179d9abc9c25e633d422abde923201b9c54bf00bd0","src/error.rs":"8f940c490ca8ee0e42a7807270256139ae846d613afe59c7a7c9dcdb80d7f732","src/headers.rs":"a7a847d48c731a22d0fb105b8d668fb58020831b40ce29edd0622781eb99937b","src/lib.rs":"dae3c23737397330d462091e6e85a0d15f7e2dfe09b00724017945e96083ccce","src/mock.rs":"35082ebf72c1de6f06320e63eb59d05f48339709928a7bcff38643c83da139a4","src/proto/h1/conn.rs":"3d8574d9dbbb3b3e63cf4ac04562c30620dddbe54e35f4cd7da06de40983c2d5","src/proto/h1/date.rs":"67ce8f2d8f2a615080f059feefd9e19ec8ba064c7e09c5efbb774c5c8e92cf0d","src/proto/h1/decode.rs":"fbd2b09a46537d88c7cd8d908bdd34b7aacc390086fb044756c8a8ea0913a90f","src/proto/h1/dispatch.rs":"199058936df3479c913b99d77c51fde53da72ecf3e8096ad4a93a90aaaaba3e9","src/proto/h1/encode.rs":"b20efa2b5fcf2959d7da59b6153a9e30bcdc2d4b218b6c442877e275e0acd6c8","src/proto/h1/io.rs":"62da8aa64df1e024489ab8567d6d1da1819dd7e84bc440c840a0a5201f1d773a","src/proto/h1/mod.rs":"4f5e18d15886f60510cdbe39366c91c18d5ddf90254cec4030499831f7a404d6","src/proto/h1/role.rs":"6d0dc397574f4e0f1adf2bd0487e713d7cf348eee0fb4ee02948db4686c9a174","src/proto/h2/client.rs":"e8ddc2d96315d5becf4d4d23e75db2acf21a80c115453a648f7bb946f6801c4b","src/proto/h2/mod.rs":"7e0689ab34c89db4537af83e67f89a18cd9d6a5c871c10fed9a5d4745788555e","src/proto/h2/server.rs":"d9a4f460a452f306b6f58e45b6e7afb01dc159d92b656c57489a1e8133d06d08","src/proto/mod.rs":"1762e5443c8ee6ea7ecb4870ade6e750799d86b4667bb5162f11d60cd87c41a5","src/rt.rs":"df55114f40696f5a1e79c7c818c6feb91d479fc00ac5f1775c1d0fdb30168118","src/server/conn.rs":"c04f4e8116d44f4538d740ff43ae098ad5a8428479942ebf413f051484be6298","src/server/mod.rs":"7d37d8c36dbb6fffab918c9cb3d2f1768c3a9dd5755b617ad49021af816d8d85","src/server/shutdown.rs":"1a6cd98fa752dc1c9d148c589a19fe694f25a8327b61512c46fc7e12f8113f7d","src/server/tcp.rs":"786b7d48768dae7b2a4eaa2faf2ead1634682b95198c2871810283c90c3ae75e","src/service/make_service.rs":"97e35a177e47f46f5c3e2abe8e82fadbb446ba2e0f5961008e5d371418b23956","src/service/mod.rs":"094b1857b47f92ef96b8411013b3e4285f1b64e2331f8e71ef5619565dfde159","src/service/new_service.rs":"84fece081fdf9fc3d5a860245895cca34d8d24ada161de126baf22070c426aac","src/service/service.rs":"e6e8edebef5a5b855350f71b1351574f90267f7e6ddae24d6f409ddd6bddb130","src/upgrade.rs":"75ce6ceb7e4b4e2f8bd5a3992327332955ea63aafbb2acd635b559dd4d62c86b"},"package":"fdfa9b401ef6c4229745bb6e9b2529192d07b920eed624cdee2a82348cd550af"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/hyper/Cargo.toml b/rustc_deps/vendor/hyper/Cargo.toml
index ad78d1f..152a641 100644
--- a/rustc_deps/vendor/hyper/Cargo.toml
+++ b/rustc_deps/vendor/hyper/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "hyper"
-version = "0.12.20"
+version = "0.12.24"
 authors = ["Sean McArthur <sean@seanmonstar.com>"]
 include = ["Cargo.toml", "LICENSE", "src/**/*"]
 description = "A fast and correct HTTP library."
@@ -134,7 +134,7 @@
 version = "0.1.10"
 
 [dependencies.http]
-version = "0.1.14"
+version = "0.1.15"
 
 [dependencies.httparse]
 version = "1.0"
diff --git a/rustc_deps/vendor/hyper/src/body/mod.rs b/rustc_deps/vendor/hyper/src/body/mod.rs
index 951fa98..e9d8135 100644
--- a/rustc_deps/vendor/hyper/src/body/mod.rs
+++ b/rustc_deps/vendor/hyper/src/body/mod.rs
@@ -7,7 +7,7 @@
 //!
 //! There are two pieces to this in hyper:
 //!
-//! - The [`Payload`](Payload) trait the describes all possible bodies. hyper
+//! - The [`Payload`](body::Payload) trait the describes all possible bodies. hyper
 //!   allows any body type that implements `Payload`, allowing applications to
 //!   have fine-grained control over their streaming.
 //! - The [`Body`](Body) concrete type, which is an implementation of `Payload`,
diff --git a/rustc_deps/vendor/hyper/src/body/payload.rs b/rustc_deps/vendor/hyper/src/body/payload.rs
index 9003261..53bb445 100644
--- a/rustc_deps/vendor/hyper/src/body/payload.rs
+++ b/rustc_deps/vendor/hyper/src/body/payload.rs
@@ -6,7 +6,7 @@
 
 /// This trait represents a streaming body of a `Request` or `Response`.
 ///
-/// The built-in implementation of this trait is [`Body`](Body), in case you
+/// The built-in implementation of this trait is [`Body`](::Body), in case you
 /// don't need to customize a send stream for your own application.
 pub trait Payload: Send + 'static {
     /// A buffer of bytes representing a single chunk of a body.
diff --git a/rustc_deps/vendor/hyper/src/client/conn.rs b/rustc_deps/vendor/hyper/src/client/conn.rs
index ae9d904..ee76710 100644
--- a/rustc_deps/vendor/hyper/src/client/conn.rs
+++ b/rustc_deps/vendor/hyper/src/client/conn.rs
@@ -75,6 +75,7 @@
     h1_writev: bool,
     h1_title_case_headers: bool,
     h1_read_buf_exact_size: Option<usize>,
+    h1_max_buf_size: Option<usize>,
     http2: bool,
 }
 
@@ -435,6 +436,7 @@
             h1_writev: true,
             h1_read_buf_exact_size: None,
             h1_title_case_headers: false,
+            h1_max_buf_size: None,
             http2: false,
         }
     }
@@ -460,8 +462,21 @@
 
     pub(super) fn h1_read_buf_exact_size(&mut self, sz: Option<usize>) -> &mut Builder {
         self.h1_read_buf_exact_size = sz;
+        self.h1_max_buf_size = None;
         self
     }
+
+    pub(super) fn h1_max_buf_size(&mut self, max: usize) -> &mut Self {
+        assert!(
+            max >= proto::h1::MINIMUM_MAX_BUFFER_SIZE,
+            "the max_buf_size cannot be smaller than the minimum that h1 specifies."
+        );
+
+        self.h1_max_buf_size = Some(max);
+        self.h1_read_buf_exact_size = None;
+        self
+    }
+
     /// Sets whether HTTP2 is required.
     ///
     /// Default is false.
@@ -510,6 +525,9 @@
             if let Some(sz) = self.builder.h1_read_buf_exact_size {
                 conn.set_read_buf_exact_size(sz);
             }
+            if let Some(max) = self.builder.h1_max_buf_size {
+                conn.set_max_buf_size(max);
+            }
             let cd = proto::h1::dispatch::Client::new(rx);
             let dispatch = proto::h1::Dispatcher::new(cd, conn);
             Either::A(dispatch)
diff --git a/rustc_deps/vendor/hyper/src/client/connect/dns.rs b/rustc_deps/vendor/hyper/src/client/connect/dns.rs
index 2160eff..fa7db2a 100644
--- a/rustc_deps/vendor/hyper/src/client/connect/dns.rs
+++ b/rustc_deps/vendor/hyper/src/client/connect/dns.rs
@@ -2,16 +2,18 @@
 //!
 //! This module contains:
 //!
-//! - A [`GaiResolver`](GaiResolver) that is the default resolver for the
+//! - A [`GaiResolver`](dns::GaiResolver) that is the default resolver for the
 //!   `HttpConnector`.
-//! - The [`Resolve`](Resolve) trait and related types to build a custom
+//! - The [`Resolve`](dns::Resolve) trait and related types to build a custom
 //!   resolver for use with the `HttpConnector`.
 use std::{fmt, io, vec};
+use std::error::Error;
 use std::net::{
     IpAddr, Ipv4Addr, Ipv6Addr,
     SocketAddr, ToSocketAddrs,
     SocketAddrV4, SocketAddrV6,
 };
+use std::str::FromStr;
 use std::sync::Arc;
 
 use futures::{Async, Future, Poll};
@@ -33,6 +35,7 @@
 }
 
 /// A domain name to resolve into IP addresses.
+#[derive(Clone, Hash, Eq, PartialEq)]
 pub struct Name {
     host: String,
 }
@@ -72,6 +75,38 @@
     }
 }
 
+impl fmt::Display for Name {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        fmt::Display::fmt(&self.host, f)
+    }
+}
+
+impl FromStr for Name {
+    type Err = InvalidNameError;
+
+    fn from_str(host: &str) -> Result<Self, Self::Err> {
+        // Possibly add validation later
+        Ok(Name::new(host.to_owned()))
+    }
+}
+
+/// Error indicating a given string was not a valid domain name.
+#[derive(Debug)]
+pub struct InvalidNameError(());
+
+impl fmt::Display for InvalidNameError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        self.description().fmt(f)
+    }
+}
+
+impl Error for InvalidNameError {
+    fn description(&self) -> &str {
+        "Not a valid domain name"
+    }
+}
+
+
 impl GaiResolver {
     /// Construct a new `GaiResolver`.
     ///
@@ -193,6 +228,16 @@
             let addr = SocketAddrV4::new(addr, port);
             return Some(IpAddrs { iter: vec![SocketAddr::V4(addr)].into_iter() })
         }
+        let host = {
+            // trim_left/trim_right deprecated...
+            // TODO: use trim_start/trim_end in Rust 1.30
+            #[allow(deprecated)]
+            {
+                host
+                .trim_left_matches('[')
+                .trim_right_matches(']')
+            }
+        };
         if let Ok(addr) = host.parse::<Ipv6Addr>() {
             let addr = SocketAddrV6::new(addr, port, 0, 0);
             return Some(IpAddrs { iter: vec![SocketAddr::V6(addr)].into_iter() })
@@ -317,4 +362,27 @@
         assert!(preferred.next().unwrap().is_ipv6());
         assert!(fallback.next().unwrap().is_ipv4());
     }
+
+    #[test]
+    fn test_name_from_str() {
+        const DOMAIN: &str = "test.example.com";
+        let name = Name::from_str(DOMAIN).expect("Should be a valid domain");
+        assert_eq!(name.as_str(), DOMAIN);
+        assert_eq!(name.to_string(), DOMAIN);
+    }
+
+    #[test]
+    fn ip_addrs_try_parse_v6() {
+        let uri = ::http::Uri::from_static("http://[::1]:8080/");
+        let dst = super::super::Destination { uri };
+
+        let mut addrs = IpAddrs::try_parse(
+            dst.host(),
+            dst.port().expect("port")
+        ).expect("try_parse");
+
+        let expected = "[::1]:8080".parse::<SocketAddr>().expect("expected");
+
+        assert_eq!(addrs.next(), Some(expected));
+    }
 }
diff --git a/rustc_deps/vendor/hyper/src/client/connect/http.rs b/rustc_deps/vendor/hyper/src/client/connect/http.rs
index c828666..07ef470 100644
--- a/rustc_deps/vendor/hyper/src/client/connect/http.rs
+++ b/rustc_deps/vendor/hyper/src/client/connect/http.rs
@@ -41,13 +41,14 @@
 ///
 /// # Example
 ///
-/// ```rust
+/// ```
+/// use hyper::Uri;
 /// use hyper::client::{Client, connect::HttpInfo};
 /// use hyper::rt::Future;
 ///
 /// let client = Client::new();
 ///
-/// let fut = client.get("http://example.local".parse().unwrap())
+/// let fut = client.get(Uri::from_static("http://example.local"))
 ///     .inspect(|resp| {
 ///         resp
 ///             .extensions()
@@ -332,7 +333,7 @@
                     }
                 },
                 State::Resolving(ref mut future, local_addr) => {
-                    match try!(future.poll()) {
+                    match future.poll()? {
                         Async::NotReady => return Ok(Async::NotReady),
                         Async::Ready(addrs) => {
                             let port = self.port;
diff --git a/rustc_deps/vendor/hyper/src/client/connect/mod.rs b/rustc_deps/vendor/hyper/src/client/connect/mod.rs
index 310983b..764835c 100644
--- a/rustc_deps/vendor/hyper/src/client/connect/mod.rs
+++ b/rustc_deps/vendor/hyper/src/client/connect/mod.rs
@@ -34,6 +34,8 @@
 }
 
 /// A set of properties to describe where and how to try to connect.
+///
+/// This type is passed an argument for the [`Connect`](Connect) trait.
 #[derive(Clone, Debug)]
 pub struct Destination {
     pub(super) uri: Uri,
@@ -59,12 +61,23 @@
 }
 
 impl Destination {
+    /// Try to convert a `Uri` into a `Destination`
+    ///
+    /// # Error
+    ///
+    /// Returns an error if the uri contains no authority or
+    /// no scheme.
+    pub fn try_from_uri(uri: Uri) -> ::Result<Self> {
+        uri.authority_part().ok_or(::error::Parse::Uri)?;
+        uri.scheme_part().ok_or(::error::Parse::Uri)?;
+        Ok(Destination { uri })
+    }
+
     /// Get the protocol scheme.
     #[inline]
     pub fn scheme(&self) -> &str {
         self.uri
-            .scheme_part()
-            .map(|s| s.as_str())
+            .scheme_str()
             .unwrap_or("")
     }
 
@@ -79,10 +92,7 @@
     /// Get the port, if specified.
     #[inline]
     pub fn port(&self) -> Option<u16> {
-         match self.uri.port_part() {
-            Some(port) => Some(port.as_u16()),
-            None => None
-        }
+        self.uri.port_u16()
     }
 
     /// Update the scheme of this destination.
@@ -254,8 +264,19 @@
     /// Set whether the connected transport is to an HTTP proxy.
     ///
     /// This setting will affect if HTTP/1 requests written on the transport
-    /// will have the request-target in absolute-form or origin-form (such as
-    /// `GET http://hyper.rs/guide HTTP/1.1` or `GET /guide HTTP/1.1`).
+    /// will have the request-target in absolute-form or origin-form:
+    ///
+    /// - When `proxy(false)`:
+    ///
+    /// ```http
+    /// GET /guide HTTP/1.1
+    /// ```
+    ///
+    /// - When `proxy(true)`:
+    ///
+    /// ```http
+    /// GET http://hyper.rs/guide HTTP/1.1
+    /// ```
     ///
     /// Default is `false`.
     pub fn proxy(mut self, is_proxied: bool) -> Connected {
@@ -414,12 +435,12 @@
 
         // Allow IPv6 hosts
         dst.set_host("[::1]").expect("set_host with IPv6");
-        assert_eq!(dst.host(), "::1");
+        assert_eq!(dst.host(), "[::1]");
         assert_eq!(dst.port(), None, "IPv6 didn't affect port");
 
         // However, IPv6 with a port is rejected.
         dst.set_host("[::2]:1337").expect_err("set_host with IPv6 and sneaky port");
-        assert_eq!(dst.host(), "::1");
+        assert_eq!(dst.host(), "[::1]");
         assert_eq!(dst.port(), None);
 
         // -----------------
@@ -457,12 +478,12 @@
 
         // Allow IPv6 hosts
         dst.set_host("[::1]").expect("set_host with IPv6");
-        assert_eq!(dst.host(), "::1");
+        assert_eq!(dst.host(), "[::1]");
         assert_eq!(dst.port(), Some(8080), "IPv6 didn't affect port");
 
         // However, IPv6 with a port is rejected.
         dst.set_host("[::2]:1337").expect_err("set_host with IPv6 and sneaky port");
-        assert_eq!(dst.host(), "::1");
+        assert_eq!(dst.host(), "[::1]");
         assert_eq!(dst.port(), Some(8080));
     }
 
@@ -577,4 +598,3 @@
         assert_eq!(res2.extensions().get::<Ex2>(), Some(&Ex2("hiccup")));
     }
 }
-
diff --git a/rustc_deps/vendor/hyper/src/client/mod.rs b/rustc_deps/vendor/hyper/src/client/mod.rs
index e55f852..dbaa5c3 100644
--- a/rustc_deps/vendor/hyper/src/client/mod.rs
+++ b/rustc_deps/vendor/hyper/src/client/mod.rs
@@ -3,7 +3,7 @@
 //! There are two levels of APIs provided for construct HTTP clients:
 //!
 //! - The higher-level [`Client`](Client) type.
-//! - The lower-level [conn](conn) module.
+//! - The lower-level [`conn`](client::conn) module.
 //!
 //! # Client
 //!
@@ -29,7 +29,7 @@
 //! ```
 //! extern crate hyper;
 //!
-//! use hyper::Client;
+//! use hyper::{Client, Uri};
 //! # #[cfg(feature = "runtime")]
 //! use hyper::rt::{self, Future, Stream};
 //!
@@ -40,7 +40,7 @@
 //! let fut = client
 //!
 //!     // Make a GET /ip to 'http://httpbin.org'
-//!     .get("http://httpbin.org/ip".parse().unwrap())
+//!     .get(Uri::from_static("http://httpbin.org/ip"))
 //!
 //!     // And then, if the request gets a response...
 //!     .and_then(|res| {
@@ -120,12 +120,13 @@
 
 #[cfg(feature = "runtime")]
 impl Client<HttpConnector, Body> {
-    /// Create a new Client with the default config.
+    /// Create a new Client with the default [config](Builder).
     ///
     /// # Note
     ///
     /// The default connector does **not** handle TLS. Speaking to `https`
-    /// destinations will require configuring a connector that implements TLS.
+    /// destinations will require [configuring a connector that implements
+    /// TLS](https://hyper.rs/guides/client/configuration).
     #[inline]
     pub fn new() -> Client<HttpConnector, Body> {
         Builder::default().build_http()
@@ -140,18 +141,19 @@
 }
 
 impl Client<(), Body> {
-    /// Configure a Client.
+    /// Create a builder to configure a new `Client`.
     ///
     /// # Example
     ///
     /// ```
     /// # extern crate hyper;
     /// # #[cfg(feature  = "runtime")]
-    /// fn run () {
+    /// # fn run () {
     /// use hyper::Client;
     ///
     /// let client = Client::builder()
     ///     .keep_alive(true)
+    ///     .http2_only(true)
     ///     .build_http();
     /// # let infer: Client<_, hyper::Body> = client;
     /// # drop(infer);
@@ -171,7 +173,6 @@
       B: Payload + Send + 'static,
       B::Data: Send,
 {
-
     /// Send a `GET` request to the supplied `Uri`.
     ///
     /// # Note
@@ -179,6 +180,21 @@
     /// This requires that the `Payload` type have a `Default` implementation.
     /// It *should* return an "empty" version of itself, such that
     /// `Payload::is_end_stream` is `true`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # extern crate hyper;
+    /// # #[cfg(feature  = "runtime")]
+    /// # fn run () {
+    /// use hyper::{Client, Uri};
+    ///
+    /// let client = Client::new();
+    ///
+    /// let future = client.get(Uri::from_static("http://httpbin.org/ip"));
+    /// # }
+    /// # fn main() {}
+    /// ```
     pub fn get(&self, uri: Uri) -> ResponseFuture
     where
         B: Default,
@@ -193,7 +209,28 @@
         self.request(req)
     }
 
-    /// Send a constructed Request using this Client.
+    /// Send a constructed `Request` using this `Client`.
+    ///
+    /// # Example
+    ///
+    /// ```
+    /// # extern crate hyper;
+    /// # #[cfg(feature  = "runtime")]
+    /// # fn run () {
+    /// use hyper::{Body, Client, Request};
+    ///
+    /// let client = Client::new();
+    ///
+    /// let req = Request::builder()
+    ///     .method("POST")
+    ///     .uri("http://httpin.org/post")
+    ///     .body(Body::from("Hallo!"))
+    ///     .expect("request builder");
+    ///
+    /// let future = client.request(req);
+    /// # }
+    /// # fn main() {}
+    /// ```
     pub fn request(&self, mut req: Request<B>) -> ResponseFuture {
         let is_http_connect = req.method() == &Method::CONNECT;
         match req.version() {
@@ -208,28 +245,10 @@
             }
         };
 
-        let uri = req.uri().clone();
-        let domain = match (uri.scheme_part(), uri.authority_part()) {
-            (Some(scheme), Some(auth)) => {
-                format!("{}://{}", scheme, auth)
-            }
-            (None, Some(auth)) if is_http_connect => {
-                let port = auth.port_part().unwrap();
-                let scheme = match port.as_str() {
-                    "443" => {
-                        set_scheme(req.uri_mut(), Scheme::HTTPS);
-                        "https"
-                    },
-                    _ => {
-                        set_scheme(req.uri_mut(), Scheme::HTTP);
-                        "http"
-                    },
-                };
-                format!("{}://{}", scheme, auth)
-            },
-            _ => {
-                debug!("Client requires absolute-form URIs, received: {:?}", uri);
-                return ResponseFuture::new(Box::new(future::err(::Error::new_user_absolute_uri_required())))
+        let domain = match extract_domain(req.uri_mut(), is_http_connect) {
+            Ok(s) => s,
+            Err(err) => {
+                return ResponseFuture::new(Box::new(future::err(err)));
             }
         };
 
@@ -558,6 +577,8 @@
 }
 
 /// A `Future` that will resolve to an HTTP Response.
+///
+/// This is returned by `Client::request` (and `Client::get`).
 #[must_use = "futures do nothing unless polled"]
 pub struct ResponseFuture {
     inner: Box<Future<Item=Response<Body>, Error=::Error> + Send>,
@@ -769,6 +790,33 @@
     };
 }
 
+fn extract_domain(uri: &mut Uri, is_http_connect: bool) -> ::Result<String> {
+    let uri_clone = uri.clone();
+    match (uri_clone.scheme_part(), uri_clone.authority_part()) {
+        (Some(scheme), Some(auth)) => {
+            Ok(format!("{}://{}", scheme, auth))
+        }
+        (None, Some(auth)) if is_http_connect => {
+            let port = auth.port_part();
+            let scheme = match port.as_ref().map(|p| p.as_str()) {
+                Some("443") => {
+                    set_scheme(uri, Scheme::HTTPS);
+                    "https"
+                }
+                _ => {
+                    set_scheme(uri, Scheme::HTTP);
+                    "http"
+                },
+            };
+            Ok(format!("{}://{}", scheme, auth))
+        },
+        _ => {
+            debug!("Client requires absolute-form URIs, received: {:?}", uri);
+            Err(::Error::new_user_absolute_uri_required())
+        }
+    }
+}
+
 fn set_scheme(uri: &mut Uri, scheme: Scheme) {
     debug_assert!(uri.scheme_part().is_none(), "set_scheme expects no existing scheme");
     let old = mem::replace(uri, Uri::default());
@@ -778,7 +826,25 @@
     *uri = Uri::from_parts(parts).expect("scheme is valid");
 }
 
-/// Builder for a Client
+/// A builder to configure a new [`Client`](Client).
+///
+/// # Example
+///
+/// ```
+/// # extern crate hyper;
+/// # #[cfg(feature  = "runtime")]
+/// # fn run () {
+/// use hyper::Client;
+///
+/// let client = Client::builder()
+///     .keep_alive(true)
+///     .http2_only(true)
+///     .build_http();
+/// # let infer: Client<_, hyper::Body> = client;
+/// # drop(infer);
+/// # }
+/// # fn main() {}
+/// ```
 #[derive(Clone)]
 pub struct Builder {
     client_config: Config,
@@ -844,6 +910,8 @@
 
     /// Sets the exact size of the read buffer to *always* use.
     ///
+    /// Note that setting this option unsets the `http1_max_buf_size` option.
+    ///
     /// Default is an adaptive read buffer.
     #[inline]
     pub fn http1_read_buf_exact_size(&mut self, sz: usize) -> &mut Self {
@@ -851,6 +919,21 @@
         self
     }
 
+    /// Set the maximum buffer size for the connection.
+    ///
+    /// Default is ~400kb.
+    ///
+    /// Note that setting this option unsets the `http1_read_exact_buf_size` option.
+    ///
+    /// # Panics
+    ///
+    /// The minimum value allowed is 8192. This method panics if the passed `max` is less than the minimum.
+    #[inline]
+    pub fn http1_max_buf_size(&mut self, max: usize) -> &mut Self {
+        self.conn_builder.h1_max_buf_size(max);
+        self
+    }
+
     /// Set whether HTTP/1 connections will write header names as title case at
     /// the socket level.
     ///
@@ -1015,4 +1098,11 @@
         authority_form(&mut uri);
         assert_eq!(uri.to_string(), "hyper.rs");
     }
+
+    #[test]
+    fn test_extract_domain_connect_no_port() {
+        let mut uri = "hyper.rs".parse().unwrap();
+        let domain = extract_domain(&mut uri, true).expect("extract domain");
+        assert_eq!(domain, "http://hyper.rs");
+    }
 }
diff --git a/rustc_deps/vendor/hyper/src/lib.rs b/rustc_deps/vendor/hyper/src/lib.rs
index ec0ef3d..1dd6462 100644
--- a/rustc_deps/vendor/hyper/src/lib.rs
+++ b/rustc_deps/vendor/hyper/src/lib.rs
@@ -1,4 +1,4 @@
-#![doc(html_root_url = "https://docs.rs/hyper/0.12.20")]
+#![doc(html_root_url = "https://docs.rs/hyper/0.12.24")]
 #![deny(missing_docs)]
 #![deny(missing_debug_implementations)]
 #![cfg_attr(test, deny(warnings))]
@@ -13,6 +13,9 @@
 //!
 //! If just starting out, **check out the [Guides](https://hyper.rs/guides)
 //! first.**
+//!
+//! If looking for just a convenient HTTP client, consider the
+//! [reqwest](https://crates.io/crates/reqwest) crate.
 
 extern crate bytes;
 #[macro_use] extern crate futures;
diff --git a/rustc_deps/vendor/hyper/src/mock.rs b/rustc_deps/vendor/hyper/src/mock.rs
index b27bf65..492b8c7 100644
--- a/rustc_deps/vendor/hyper/src/mock.rs
+++ b/rustc_deps/vendor/hyper/src/mock.rs
@@ -213,7 +213,7 @@
             Err(self.would_block())
         } else {
             let n = cmp::min(self.bytes_until_block, buf.len());
-            let n = try!(self.inner.read(&mut buf[..n]));
+            let n = self.inner.read(&mut buf[..n])?;
             self.bytes_until_block -= n;
             Ok(n)
         }
@@ -234,7 +234,7 @@
             trace!("AsyncIo::write; {} bytes", data.len());
             self.flushed = false;
             let n = cmp::min(self.bytes_until_block, data.len());
-            let n = try!(self.inner.write(&data[..n]));
+            let n = self.inner.write(&data[..n])?;
             self.bytes_until_block -= n;
             Ok(n)
         }
diff --git a/rustc_deps/vendor/hyper/src/proto/h1/io.rs b/rustc_deps/vendor/hyper/src/proto/h1/io.rs
index 99435c4..738bc99 100644
--- a/rustc_deps/vendor/hyper/src/proto/h1/io.rs
+++ b/rustc_deps/vendor/hyper/src/proto/h1/io.rs
@@ -141,7 +141,10 @@
         S: Http1Transaction,
     {
         loop {
-            match try!(S::parse(&mut self.read_buf, ParseContext { cached_headers: ctx.cached_headers, req_method: ctx.req_method, })) {
+            match S::parse(&mut self.read_buf, ParseContext {
+                cached_headers: ctx.cached_headers,
+                req_method: ctx.req_method,
+            })? {
                 Some(msg) => {
                     debug!("parsed {} headers", msg.head.headers.len());
                     return Ok(Async::Ready(msg))
diff --git a/rustc_deps/vendor/hyper/src/server/mod.rs b/rustc_deps/vendor/hyper/src/server/mod.rs
index 99a83b8..ef7144b 100644
--- a/rustc_deps/vendor/hyper/src/server/mod.rs
+++ b/rustc_deps/vendor/hyper/src/server/mod.rs
@@ -6,7 +6,7 @@
 //! There are two levels of APIs provide for constructing HTTP servers:
 //!
 //! - The higher-level [`Server`](Server) type.
-//! - The lower-level [conn](conn) module.
+//! - The lower-level [`conn`](server::conn) module.
 //!
 //! # Server
 //!
@@ -302,6 +302,14 @@
         self
     }
 
+    /// Set the maximum buffer size.
+    ///
+    /// Default is ~ 400kb.
+    pub fn http1_max_buf_size(mut self, val: usize) -> Self {
+        self.protocol.max_buf_size(val);
+        self
+    }
+
     /// Sets the `Executor` to deal with connection tasks.
     ///
     /// Default is `tokio::spawn`.
diff --git a/rustc_deps/vendor/hyper/src/server/tcp.rs b/rustc_deps/vendor/hyper/src/server/tcp.rs
index efab961..48143ba 100644
--- a/rustc_deps/vendor/hyper/src/server/tcp.rs
+++ b/rustc_deps/vendor/hyper/src/server/tcp.rs
@@ -219,6 +219,12 @@
         pub fn remote_addr(&self) -> SocketAddr {
             self.remote_addr
         }
+
+        /// Consumes the AddrStream and returns the underlying IO object
+        #[inline]
+        pub fn into_inner(self) -> TcpStream {
+            self.inner
+        }
     }
 
     impl Read for AddrStream {
diff --git a/rustc_deps/vendor/hyper/src/service/mod.rs b/rustc_deps/vendor/hyper/src/service/mod.rs
index 54faca8..8bd5a70 100644
--- a/rustc_deps/vendor/hyper/src/service/mod.rs
+++ b/rustc_deps/vendor/hyper/src/service/mod.rs
@@ -1,10 +1,10 @@
 //! Services and MakeServices
 //!
-//! - A [`Service`](Service) is a trait representing an asynchronous function
-//!   of a request to a response. It's similar to
+//! - A [`Service`](service::Service) is a trait representing an asynchronous
+//!   function of a request to a response. It's similar to
 //!   `async fn(Request) -> Result<Response, Error>`.
-//! - A [`MakeService`](MakeService) is a trait creating specific instances of a
-//!   `Service`.
+//! - A [`MakeService`](service::MakeService) is a trait creating specific
+//!   instances of a `Service`.
 //!
 //! These types are conceptually similar to those in
 //! [tower](https://crates.io/crates/tower), while being specific to hyper.
@@ -16,8 +16,9 @@
 //! connection will receive.
 //!
 //! While it's possible to implement `Service` for a type manually, the helpers
-//! [`service_fn`](service_fn) and [`service_fn_ok`](service_fn_ok) should be
-//! sufficient for most cases.
+//! [`service_fn`](service::service_fn) and
+//! [`service_fn_ok`](service::service_fn_ok) should be sufficient for most
+//! cases.
 //!
 //! # MakeService
 //!
diff --git a/rustc_deps/vendor/memchr/.cargo-checksum.json b/rustc_deps/vendor/memchr/.cargo-checksum.json
index bf4b139..fdd7a17 100644
--- a/rustc_deps/vendor/memchr/.cargo-checksum.json
+++ b/rustc_deps/vendor/memchr/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"b34ae4e39ec2755b354ac8bbe951d687aa7803d3087a654cffabc33e295c60ec","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"21eb8e15c7eb21e7983e7f8a832fd7fd9abb261e09b1a19c24d808c55e7cf2b4","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","build.rs":"055d99d7ae5e1c40db4bc24a4d8adeb8250c27afee6b7eb6950105df2411135d","src/c.rs":"86fe35cbb46c8bece9927fbde20f1ca3af526defdde05ac969ad2f4bc9bb25e9","src/fallback.rs":"a79752e3bdc3c16febef90fcddb560f80659f802fac202cce3fdffd0b78f6d08","src/iter.rs":"5949fd42b266d3edebf133172c74700d1c0249bdd26c203bcfd1409583e7b502","src/lib.rs":"1eeeabfb45fb631c806ad517b959571bcce0b36ca1579cbc9bba6b4af7ba8873","src/naive.rs":"d908e5895586ef88913ee10ff3135aabd20363e0e0871c7006a5d40457851deb","src/tests/iter.rs":"262c09e5cabd1caef533475832da8716638b142ec8015e8270c6f5240e478ac1","src/tests/memchr.rs":"f30074eeab99a16ce5ca8a30f1890f86c43c0422523a7195cbb3ca5f3e465b67","src/tests/mod.rs":"8ad1d065d422877ee043f66f987a736a0216757ba66dc1a05bee2a7c949c8037","src/x86/avx.rs":"11d4a149007fde9f34168fa43b3cba700667782c987796dca8526564b3e01007","src/x86/mod.rs":"f2e558e364e64b90c1bd55659332f54a3d6d36badc1aab9f67c4cfc2689c557a","src/x86/sse2.rs":"103bb9d555be789e678f1af5baa737e13911f60e90888d25fa2883b39a9dffce","src/x86/sse42.rs":"f671ae9dd2b518a823e499a09ce32d4957bc5ae043db90d61c027e32f688f2b2"},"package":"e1dd4eaac298c32ce07eb6ed9242eda7d82955b9170b7d6db59b2e02cc63fcb8"}
\ No newline at end of file
+{"files":{"COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"47408824ff8a0861c0df0cb499f687f7463e461c3b81ea20edf1662b7dc5a121","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"ea4632001f2b384c67278e7114a843ab7094d6011ef87a793881e73cfb525120","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","build.rs":"a8483a0649fa418db667ccd2a16a60e57d886964b54c1af12923b6f6cb4f2c92","src/c.rs":"86fe35cbb46c8bece9927fbde20f1ca3af526defdde05ac969ad2f4bc9bb25e9","src/fallback.rs":"a79752e3bdc3c16febef90fcddb560f80659f802fac202cce3fdffd0b78f6d08","src/iter.rs":"5949fd42b266d3edebf133172c74700d1c0249bdd26c203bcfd1409583e7b502","src/lib.rs":"1b3c131d6ec66837d3d76ad42aa5fc4aebfae232587787bdedb5be2352be4502","src/naive.rs":"d908e5895586ef88913ee10ff3135aabd20363e0e0871c7006a5d40457851deb","src/tests/iter.rs":"262c09e5cabd1caef533475832da8716638b142ec8015e8270c6f5240e478ac1","src/tests/memchr.rs":"f30074eeab99a16ce5ca8a30f1890f86c43c0422523a7195cbb3ca5f3e465b67","src/tests/mod.rs":"8ad1d065d422877ee043f66f987a736a0216757ba66dc1a05bee2a7c949c8037","src/x86/avx.rs":"11d4a149007fde9f34168fa43b3cba700667782c987796dca8526564b3e01007","src/x86/mod.rs":"5032eec7355bc110ec99b06b2cfd916d8bc1e28c44a33f6c92c3cc86f797d683","src/x86/sse2.rs":"103bb9d555be789e678f1af5baa737e13911f60e90888d25fa2883b39a9dffce","src/x86/sse42.rs":"f671ae9dd2b518a823e499a09ce32d4957bc5ae043db90d61c027e32f688f2b2"},"package":"2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/memchr/Cargo.toml b/rustc_deps/vendor/memchr/Cargo.toml
index f7b546b..e918f9e 100644
--- a/rustc_deps/vendor/memchr/Cargo.toml
+++ b/rustc_deps/vendor/memchr/Cargo.toml
@@ -12,9 +12,9 @@
 
 [package]
 name = "memchr"
-version = "2.1.3"
+version = "2.2.0"
 authors = ["Andrew Gallant <jamslam@gmail.com>", "bluss"]
-exclude = ["/ci/*", "/.travis.yml", "/Makefile", "/appveyor.yml", "/ctags.rust", "/session.vim"]
+exclude = ["/ci/*", "/.travis.yml", "/Makefile", "/appveyor.yml"]
 description = "Safe interface to memchr."
 homepage = "https://github.com/BurntSushi/rust-memchr"
 documentation = "https://docs.rs/memchr/"
@@ -28,9 +28,6 @@
 [lib]
 name = "memchr"
 bench = false
-[dependencies.cfg-if]
-version = "0.1.5"
-
 [dependencies.libc]
 version = "0.2.18"
 optional = true
@@ -40,8 +37,8 @@
 default-features = false
 
 [features]
-default = ["use_std", "libc"]
-use_std = ["libc", "libc/use_std"]
+default = ["use_std"]
+use_std = []
 [badges.appveyor]
 repository = "BurntSushi/rust-memchr"
 
diff --git a/rustc_deps/vendor/memchr/README.md b/rustc_deps/vendor/memchr/README.md
index c42f9ef..3e7ff33 100644
--- a/rustc_deps/vendor/memchr/README.md
+++ b/rustc_deps/vendor/memchr/README.md
@@ -43,3 +43,8 @@
 [dependencies]
 memchr = { version = "2", default-features = false }
 ```
+
+On x86 platforms, when the `use_std` feature is disabled, the SSE2
+implementation of memchr will be used in compilers that support it. When
+`use_std` is enabled, the AVX implementation of memchr will be used if the CPU
+is determined to support it at runtime.
diff --git a/rustc_deps/vendor/memchr/build.rs b/rustc_deps/vendor/memchr/build.rs
index f245ada..35f06f9 100644
--- a/rustc_deps/vendor/memchr/build.rs
+++ b/rustc_deps/vendor/memchr/build.rs
@@ -11,10 +11,15 @@
         }
     };
     enable_simd_optimizations(version);
+    enable_libc();
 }
 
+// This adds various simd cfgs if this compiler supports it.
+//
+// This can be disabled with RUSTFLAGS="--cfg memchr_disable_auto_simd", but
+// this is generally only intended for testing.
 fn enable_simd_optimizations(version: Version) {
-    if env::var_os("CARGO_CFG_MEMCHR_DISABLE_AUTO_SIMD").is_some() {
+    if is_env_set("CARGO_CFG_MEMCHR_DISABLE_AUTO_SIMD") {
         return;
     }
     if version < (Version { major: 1, minor: 27, patch: 0 }) {
@@ -27,6 +32,47 @@
     println!("cargo:rustc-cfg=memchr_runtime_avx");
 }
 
+// This adds a `memchr_libc` cfg if and only if libc can be used, if no other
+// better option is available.
+//
+// This could be performed in the source code, but it's simpler to do it once
+// here and consolidate it into one cfg knob.
+//
+// Basically, we use libc only if its enabled and if we aren't targeting a
+// known bad platform. For example, wasm32 doesn't have a libc and the
+// performance of memchr on Windows is seemingly worse than the fallback
+// implementation.
+fn enable_libc() {
+    const NO_ARCH: &'static [&'static str] = &["wasm32", "windows"];
+    const NO_ENV: &'static [&'static str] = &["sgx"];
+
+    if !is_feature_set("LIBC") {
+        return;
+    }
+
+    let arch = match env::var("CARGO_CFG_TARGET_ARCH") {
+        Err(_) => return,
+        Ok(arch) => arch,
+    };
+    let env = match env::var("CARGO_CFG_TARGET_ENV") {
+        Err(_) => return,
+        Ok(env) => env,
+    };
+    if NO_ARCH.contains(&&*arch) || NO_ENV.contains(&&*env) {
+        return;
+    }
+
+    println!("cargo:rustc-cfg=memchr_libc");
+}
+
+fn is_feature_set(name: &str) -> bool {
+    is_env_set(&format!("CARGO_FEATURE_{}",  name))
+}
+
+fn is_env_set(name: &str) -> bool {
+    env::var_os(name).is_some()
+}
+
 #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
 struct Version {
     major: u32,
diff --git a/rustc_deps/vendor/memchr/src/lib.rs b/rustc_deps/vendor/memchr/src/lib.rs
index b2694ff..b828475 100644
--- a/rustc_deps/vendor/memchr/src/lib.rs
+++ b/rustc_deps/vendor/memchr/src/lib.rs
@@ -33,8 +33,6 @@
 #[cfg(feature = "use_std")]
 extern crate core;
 
-#[macro_use]
-extern crate cfg_if;
 #[cfg(test)]
 #[macro_use]
 extern crate quickcheck;
@@ -43,17 +41,14 @@
 
 pub use iter::{Memchr, Memchr2, Memchr3};
 
-#[cfg(all(
-    feature = "libc",
-    not(target_arch = "wasm32"),
-    not(target_env = "sgx"),
-))]
+// N.B. If you're looking for the cfg knobs for libc, see build.rs.
+#[cfg(memchr_libc)]
 mod c;
 #[allow(dead_code)]
 mod fallback;
 mod iter;
 mod naive;
-#[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))]
+#[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
 mod x86;
 #[cfg(test)]
 mod tests;
@@ -134,29 +129,30 @@
 /// ```
 #[inline]
 pub fn memchr(needle: u8, haystack: &[u8]) -> Option<usize> {
-    cfg_if! {
-        if #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))] {
-            #[inline(always)]
-            fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
-                x86::memchr(n1, haystack)
-            }
-        } else if #[cfg(all(
-            feature = "libc",
-            not(target_arch = "wasm32"),
-            not(target_arch = "windows"),
-            not(target_env = "sgx"),
-        ))] {
-            #[inline(always)]
-            fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
-                c::memchr(n1, haystack)
-            }
-        } else {
-            #[inline(always)]
-            fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
-                fallback::memchr(n1, haystack)
-            }
-        }
+    #[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
+    #[inline(always)]
+    fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
+        x86::memchr(n1, haystack)
     }
+
+    #[cfg(all(
+        memchr_libc,
+        not(all(target_arch = "x86_64", memchr_runtime_simd))
+    ))]
+    #[inline(always)]
+    fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
+        c::memchr(n1, haystack)
+    }
+
+    #[cfg(all(
+        not(memchr_libc),
+        not(all(target_arch = "x86_64", memchr_runtime_simd))
+    ))]
+    #[inline(always)]
+    fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
+        fallback::memchr(n1, haystack)
+    }
+
     if haystack.is_empty() {
         None
     } else {
@@ -167,19 +163,18 @@
 /// Like `memchr`, but searches for two bytes instead of one.
 #[inline]
 pub fn memchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option<usize> {
-    cfg_if! {
-        if #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))] {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
-                x86::memchr2(n1, n2, haystack)
-            }
-        } else {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
-                fallback::memchr2(n1, n2, haystack)
-            }
-        }
+    #[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
+        x86::memchr2(n1, n2, haystack)
     }
+
+    #[cfg(not(all(target_arch = "x86_64", memchr_runtime_simd)))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
+        fallback::memchr2(n1, n2, haystack)
+    }
+
     if haystack.is_empty() {
         None
     } else {
@@ -195,19 +190,18 @@
     needle3: u8,
     haystack: &[u8],
 ) -> Option<usize> {
-    cfg_if! {
-        if #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))] {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
-                x86::memchr3(n1, n2, n3, haystack)
-            }
-        } else {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
-                fallback::memchr3(n1, n2, n3, haystack)
-            }
-        }
+    #[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
+        x86::memchr3(n1, n2, n3, haystack)
     }
+
+    #[cfg(not(all(target_arch = "x86_64", memchr_runtime_simd)))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
+        fallback::memchr3(n1, n2, n3, haystack)
+    }
+
     if haystack.is_empty() {
         None
     } else {
@@ -237,30 +231,30 @@
 /// ```
 #[inline]
 pub fn memrchr(needle: u8, haystack: &[u8]) -> Option<usize> {
-    cfg_if! {
-        if #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))] {
-            #[inline(always)]
-            fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
-                x86::memrchr(n1, haystack)
-            }
-        } else if #[cfg(all(
-            feature = "libc",
-            target_os = "linux",
-            not(target_arch = "wasm32"),
-            not(target_arch = "windows"),
-            not(target_env = "sgx"),
-        ))] {
-            #[inline(always)]
-            fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
-                c::memrchr(n1, haystack)
-            }
-        } else {
-            #[inline(always)]
-            fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
-                fallback::memrchr(n1, haystack)
-            }
-        }
+    #[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
+    #[inline(always)]
+    fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
+        x86::memrchr(n1, haystack)
     }
+
+    #[cfg(all(
+        all(memchr_libc, target_os = "linux"),
+        not(all(target_arch = "x86_64", memchr_runtime_simd))
+    ))]
+    #[inline(always)]
+    fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
+        c::memrchr(n1, haystack)
+    }
+
+    #[cfg(all(
+        not(all(memchr_libc, target_os = "linux")),
+        not(all(target_arch = "x86_64", memchr_runtime_simd))
+    ))]
+    #[inline(always)]
+    fn imp(n1: u8, haystack: &[u8]) -> Option<usize> {
+        fallback::memrchr(n1, haystack)
+    }
+
     if haystack.is_empty() {
         None
     } else {
@@ -271,19 +265,18 @@
 /// Like `memrchr`, but searches for two bytes instead of one.
 #[inline]
 pub fn memrchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option<usize> {
-    cfg_if! {
-        if #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))] {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
-                x86::memrchr2(n1, n2, haystack)
-            }
-        } else {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
-                fallback::memrchr2(n1, n2, haystack)
-            }
-        }
+    #[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
+        x86::memrchr2(n1, n2, haystack)
     }
+
+    #[cfg(not(all(target_arch = "x86_64", memchr_runtime_simd)))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, haystack: &[u8]) -> Option<usize> {
+        fallback::memrchr2(n1, n2, haystack)
+    }
+
     if haystack.is_empty() {
         None
     } else {
@@ -299,19 +292,18 @@
     needle3: u8,
     haystack: &[u8],
 ) -> Option<usize> {
-    cfg_if! {
-        if #[cfg(all(target_arch = "x86_64", memchr_runtime_simd, feature = "use_std"))] {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
-                x86::memrchr3(n1, n2, n3, haystack)
-            }
-        } else {
-            #[inline(always)]
-            fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
-                fallback::memrchr3(n1, n2, n3, haystack)
-            }
-        }
+    #[cfg(all(target_arch = "x86_64", memchr_runtime_simd))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
+        x86::memrchr3(n1, n2, n3, haystack)
     }
+
+    #[cfg(not(all(target_arch = "x86_64", memchr_runtime_simd)))]
+    #[inline(always)]
+    fn imp(n1: u8, n2: u8, n3: u8, haystack: &[u8]) -> Option<usize> {
+        fallback::memrchr3(n1, n2, n3, haystack)
+    }
+
     if haystack.is_empty() {
         None
     } else {
diff --git a/rustc_deps/vendor/memchr/src/x86/mod.rs b/rustc_deps/vendor/memchr/src/x86/mod.rs
index 4f3e0a0..6599da3 100644
--- a/rustc_deps/vendor/memchr/src/x86/mod.rs
+++ b/rustc_deps/vendor/memchr/src/x86/mod.rs
@@ -1,8 +1,8 @@
-use std::mem;
-use std::sync::atomic::{AtomicUsize, Ordering};
-
 use fallback;
 
+// We only use AVX when we can detect at runtime whether it's available, which
+// requires std.
+#[cfg(feature = "use_std")]
 mod avx;
 mod sse2;
 
@@ -27,30 +27,49 @@
 // probably can't be inlined anyway---unless you've compiled your entire
 // program with AVX2 enabled. However, even then, the various memchr
 // implementations aren't exactly small, so inlining might not help anyway!
+#[cfg(feature = "use_std")]
 macro_rules! ifunc {
     ($fnty:ty, $name:ident, $haystack:ident, $($needle:ident),+) => {{
-        static mut FN: $fnty = detect;
+        use std::mem;
+        use std::sync::atomic::{AtomicPtr, Ordering};
+
+        type FnRaw = *mut ();
+
+        static FN: AtomicPtr<()> = AtomicPtr::new(detect as FnRaw);
 
         fn detect($($needle: u8),+, haystack: &[u8]) -> Option<usize> {
             let fun =
                 if cfg!(memchr_runtime_avx) && is_x86_feature_detected!("avx2") {
-                    avx::$name as usize
+                    avx::$name as FnRaw
                 } else if cfg!(memchr_runtime_sse2) {
-                    sse2::$name as usize
+                    sse2::$name as FnRaw
                 } else {
-                    fallback::$name as usize
+                    fallback::$name as FnRaw
                 };
-            let slot = unsafe { &*(&FN as *const _ as *const AtomicUsize) };
-            slot.store(fun as usize, Ordering::Relaxed);
+            FN.store(fun as FnRaw, Ordering::Relaxed);
             unsafe {
-                mem::transmute::<usize, $fnty>(fun)($($needle),+, haystack)
+                mem::transmute::<FnRaw, $fnty>(fun)($($needle),+, haystack)
             }
         }
 
         unsafe {
-            let slot = &*(&FN as *const _ as *const AtomicUsize);
-            let fun = slot.load(Ordering::Relaxed);
-            mem::transmute::<usize, $fnty>(fun)($($needle),+, $haystack)
+            let fun = FN.load(Ordering::Relaxed);
+            mem::transmute::<FnRaw, $fnty>(fun)($($needle),+, $haystack)
+        }
+    }}
+}
+
+// When std isn't enable (which provides runtime CPU feature detection), or if
+// runtime CPU feature detection has been explicitly disabled, then just call
+// our optimized SSE2 routine directly. SSE2 is avalbale on all x86_64 targets,
+// so no CPU feature detection is necessary.
+#[cfg(not(feature = "use_std"))]
+macro_rules! ifunc {
+    ($fnty:ty, $name:ident, $haystack:ident, $($needle:ident),+) => {{
+        if cfg!(memchr_runtime_sse2) {
+            unsafe { sse2::$name($($needle),+, $haystack) }
+        } else {
+            fallback::$name($($needle),+, $haystack)
         }
     }}
 }
diff --git a/rustc_deps/vendor/miniz_oxide/.cargo-checksum.json b/rustc_deps/vendor/miniz_oxide/.cargo-checksum.json
index 00937af..5a50f62 100644
--- a/rustc_deps/vendor/miniz_oxide/.cargo-checksum.json
+++ b/rustc_deps/vendor/miniz_oxide/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"535d1254a0dc6bebfec8ecbfbf2c63157fb717fb2b0f715456ab53f5e71b8555","LICENSE":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","Readme.md":"78fe2edfd0d8d14dbf30823ba7f5d985395606543ee7a0e97f84944176be5e57","src/deflate/buffer.rs":"e2b00cc64ffca3bfe28291a9c19589628f9c55558e37bd46756822aa472b39dd","src/deflate/core.rs":"2c9d9c3ee062924a90a8cd27f4f2d7d4606468a73d5fe26ae27ef6b64a8ec828","src/deflate/mod.rs":"8fab92afd5e7f3f722f5a4865aac45a27ebd11a8bf91980305f7f1a80bb986a2","src/inflate/core.rs":"1906ebd0cb5b703d870137926eb6bf9056ce0c8ca24c399ed84d0144e8edffe6","src/inflate/mod.rs":"31bc3fef8e6924a6af3c3e9767fb55316dab74181dd0bc2a04211debdf8b2afe","src/inflate/output_buffer.rs":"bc0b90e385a6f097f5e7269dcc1fe355f1f0123d587f74ec816d69b4bd57be03","src/lib.rs":"06abbdc6dc6ef2b70366de34de8ba372e7432d70542048f1ed0224bef839b64d","src/shared.rs":"abae3f3cc3d8e13ebb19cb79082004ec113f5ff69c917976acb10327e096ac13","tests/test.rs":"e5df402ab983a0c8cda206f8f97db67e0b28e273ab59565a1c9781e5a7d6c95e","tests/test_data/invalid_code_len_oom":"83bbc3ef852079eac34ba21d91434079d23f71da6ffd93c9fb438e3be48be0ba","tests/test_data/invalid_code_len_short":"f8b65f7327234574ec243875500d21bf29966d5cc6ba3b374fbe7dd51cd87da1","tests/test_data/issue_14.zlib":"2f8841d57ed549cdd1a037ef2f24adaa79d6df84bc71dba1af5958005a8e7fb8","tests/test_data/issue_19.deflate":"14ccf218d1c71dae13399a03f51f15e0479d820554c244959f1012d971fde196"},"package":"5ad30a47319c16cde58d0314f5d98202a80c9083b5f61178457403dfb14e509c"}
\ No newline at end of file
+{"files":{"Cargo.toml":"1d4ae324adff696d2a628c31770331d00e66c825292808cf1ef9a19f692accf3","LICENSE":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","Readme.md":"78fe2edfd0d8d14dbf30823ba7f5d985395606543ee7a0e97f84944176be5e57","src/deflate/buffer.rs":"e2b00cc64ffca3bfe28291a9c19589628f9c55558e37bd46756822aa472b39dd","src/deflate/core.rs":"2c9d9c3ee062924a90a8cd27f4f2d7d4606468a73d5fe26ae27ef6b64a8ec828","src/deflate/mod.rs":"8fab92afd5e7f3f722f5a4865aac45a27ebd11a8bf91980305f7f1a80bb986a2","src/inflate/core.rs":"1906ebd0cb5b703d870137926eb6bf9056ce0c8ca24c399ed84d0144e8edffe6","src/inflate/mod.rs":"31bc3fef8e6924a6af3c3e9767fb55316dab74181dd0bc2a04211debdf8b2afe","src/inflate/output_buffer.rs":"bc0b90e385a6f097f5e7269dcc1fe355f1f0123d587f74ec816d69b4bd57be03","src/lib.rs":"06abbdc6dc6ef2b70366de34de8ba372e7432d70542048f1ed0224bef839b64d","src/shared.rs":"abae3f3cc3d8e13ebb19cb79082004ec113f5ff69c917976acb10327e096ac13","tests/test.rs":"e5df402ab983a0c8cda206f8f97db67e0b28e273ab59565a1c9781e5a7d6c95e","tests/test_data/invalid_code_len_oom":"83bbc3ef852079eac34ba21d91434079d23f71da6ffd93c9fb438e3be48be0ba","tests/test_data/invalid_code_len_short":"f8b65f7327234574ec243875500d21bf29966d5cc6ba3b374fbe7dd51cd87da1","tests/test_data/issue_14.zlib":"2f8841d57ed549cdd1a037ef2f24adaa79d6df84bc71dba1af5958005a8e7fb8","tests/test_data/issue_19.deflate":"14ccf218d1c71dae13399a03f51f15e0479d820554c244959f1012d971fde196"},"package":"c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/miniz_oxide/Cargo.toml b/rustc_deps/vendor/miniz_oxide/Cargo.toml
index dcd61b7..20a66e6 100644
--- a/rustc_deps/vendor/miniz_oxide/Cargo.toml
+++ b/rustc_deps/vendor/miniz_oxide/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "miniz_oxide"
-version = "0.2.0"
+version = "0.2.1"
 authors = ["Frommi <daniil.liferenko@gmail.com>"]
 description = "DEFLATE compression and decompression library rewritten in Rust based on miniz"
 homepage = "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide"
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/.cargo-checksum.json b/rustc_deps/vendor/miniz_oxide_c_api/.cargo-checksum.json
index 60d12d8..5e3f459 100644
--- a/rustc_deps/vendor/miniz_oxide_c_api/.cargo-checksum.json
+++ b/rustc_deps/vendor/miniz_oxide_c_api/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"ccd64cc84810bd375465898b416a81d0d3560395719cf04ba7fa2a3f4244fad0","LICENSE":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","README.md":"96858c0e7fa911f76546fa22d62e50d46a1f0f6186917cd53240cf2ec1d8568d","benches/bench.rs":"ee8f4652ebff6f6dc0aaa4622a24ba7cdb6aa1583aeded5a23506087553970e5","build.sh":"b3220dd05f7b613393dd1b4116ae09eaee0e1a024de023072c05937765015ad6","build_orig_miniz.sh":"8f1a7490752c6d222c95885121ee1cd6ba3de0d6e056c0cd959d7cb5b34fd0eb","examples/example1.c":"599c928a7afff9098ef8a6bd9f064f220d4859a57684a0f75fb5d9f2af93a83a","examples/example2.c":"1fcd0152b48cc27633baa80790a5e62af3338ff0cf4befc386d0ba030c058008","examples/example3.c":"adc613e0ea7e1b958227f6366f2c5f11b5415ff31e853932da43391dfa520241","examples/example4.c":"3bc92b0c7472c50b5186701cbec6329c13cabb2ab9c539acf092f55662635809","examples/example5.c":"cba6d29ac45e27ce0a0adbfe6e0f6048966e2765de3eda44c450542862c76a14","examples/example6.c":"1869ec509b69280657f006968b8d7bf13ce191b36588d953dee4d0cee22219b2","miniz.h":"d9c62e6d1f14da400ba924acb90696df593e01384a587bc9306df949b02fdf8f","miniz/miniz.c":"9e9639d74e98ab110897dcb027a774e0e176699a75df3a5cd8ddd57fa42e4ae5","miniz/miniz_tdef.c":"2b21aef9640a51ab13cb0201d73a15ea4520030e319e34aa530e594f64b99296","miniz/miniz_tinfl.c":"5b8f8dda0448bf24ff1ef59a644a7bcaabbeb6816cd79d5a3f25e42cd525ce3d","miniz/miniz_zip.c":"59c072b1a613c59a23c3ec5c6c40172291f07c61b2ab7ff1dfbc10de08de8a33","miniz_common.h":"87fa7aef5c11a143033251d12bbd23fe14c996d7d20f49e927e096a86ecd0255","miniz_stub/miniz.c":"4c16c2bf6b76cd0303b4ea97c1d4d8e213c4e58db06ed34a4dc9ea81fd9dd5fd","miniz_stub/miniz_tdef.c":"f310f62360e0135944806f7296f81ab0e048b125d9f336de22f66e4f7b57aa32","miniz_stub/miniz_tinfl.c":"e56d711e23fdf2f0e6abefc9a5c0f12a3a6779c58022493cb255fbaac1250147","miniz_stub/miniz_zip.c":"e3d1cc22e92d540d6e2005c33e72779b38cc638f347b4f6785cd27ac1e1c746b","miniz_tdef.h":"7fd704f55c30bb36dfd5d81f9a8de1751061ad472c5fe3dd2b3a5374655e6121","miniz_tinfl.h":"21570b0688bb840106432f24a70d24eeedd7595e37965ccf3f0e0188ca2f604b","miniz_zip.h":"a6d19a9fb619cc647c6cc287210ae8d7a50c2018e65f2b259be1c8efd68885af","performance.sh":"05605fb3f74e3e46ede94b7810982b56e34225e9f2419c144f6248885df3de17","redefine.txt":"04ba694491b181e8d5125aa3175ef49a497fe89f2ef9c9faa7d6cfb132f31701","run_fuzz.sh":"94c91a2a900d6fd6696c285bff3829908bbd7f63cd4e8caa8ded8be85161e5a2","src/build.rs":"6cceadbf99e458e11a832328e42ad025ac2fa1acfe41f9fa98952c71728208d9","src/lib.rs":"c41776e274d2f07e055b37f51083b1bf27af6dced0e03c86c20f01adea5176fe","src/lib_oxide.rs":"0e215ad5cbfb8959078edd472c61f364dd05957e0d28c3d743f798847662fbbd","src/tdef.rs":"4da73f16802011aa6a3c427d2c074a86198a828a1a191f247fc9fc20df24339b","src/tinfl.rs":"2494dbb929139ba035e147442f979afc1ae382e7e4017e9c822a608fe9184149","src/unmangle.rs":"132c66c5b0e3b463d92ee1e026c62b0fee75cdbe92e290a5f0d9403d668c9982","test.sh":"187eb19a91cd56b5cba984f9b56e56d3278578afde2a779b1800b2b5d6c14d76","tests/miniz_tester.cpp":"9d0443d575b6a398f217422041b9955597d96be7e3723a328c1c5b689b698674","tests/test.rs":"0d8536f89ac1f8008c34b215ea567a977bdae37b9b8fe9865edab53887efec41","tests/timer.cpp":"2a748c3d9ea374bd7fd224420b6611357245b8d8e5ce619821b773a390f2b348","tests/timer.h":"dd48b88a80d68410cdf6a8764cd2999989fb094ce6efb718db9c112af803749a","travis-after-success.sh":"32379ef1e9ab46c8ff57fb76d30448b08c13fd0e89a1333e4abcc0156f2b6803"},"package":"28edaef377517fd9fe3e085c37d892ce7acd1fbeab9239c5a36eec352d8a8b7e"}
\ No newline at end of file
+{"files":{"Cargo.toml":"3c6fc9cf684118394f02188ed6d548d5d4e4149543326dc55c53386c6e2b54af","LICENSE":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","README.md":"96858c0e7fa911f76546fa22d62e50d46a1f0f6186917cd53240cf2ec1d8568d","benches/bench.rs":"ee8f4652ebff6f6dc0aaa4622a24ba7cdb6aa1583aeded5a23506087553970e5","examples/example1.c":"599c928a7afff9098ef8a6bd9f064f220d4859a57684a0f75fb5d9f2af93a83a","examples/example2.c":"1fcd0152b48cc27633baa80790a5e62af3338ff0cf4befc386d0ba030c058008","examples/example3.c":"adc613e0ea7e1b958227f6366f2c5f11b5415ff31e853932da43391dfa520241","examples/example4.c":"3bc92b0c7472c50b5186701cbec6329c13cabb2ab9c539acf092f55662635809","examples/example5.c":"cba6d29ac45e27ce0a0adbfe6e0f6048966e2765de3eda44c450542862c76a14","examples/example6.c":"1869ec509b69280657f006968b8d7bf13ce191b36588d953dee4d0cee22219b2","miniz.h":"d9c62e6d1f14da400ba924acb90696df593e01384a587bc9306df949b02fdf8f","miniz/miniz.c":"9e9639d74e98ab110897dcb027a774e0e176699a75df3a5cd8ddd57fa42e4ae5","miniz/miniz_tdef.c":"2b21aef9640a51ab13cb0201d73a15ea4520030e319e34aa530e594f64b99296","miniz/miniz_tinfl.c":"5b8f8dda0448bf24ff1ef59a644a7bcaabbeb6816cd79d5a3f25e42cd525ce3d","miniz/miniz_zip.c":"59c072b1a613c59a23c3ec5c6c40172291f07c61b2ab7ff1dfbc10de08de8a33","miniz_common.h":"87fa7aef5c11a143033251d12bbd23fe14c996d7d20f49e927e096a86ecd0255","miniz_stub/miniz.c":"4c16c2bf6b76cd0303b4ea97c1d4d8e213c4e58db06ed34a4dc9ea81fd9dd5fd","miniz_stub/miniz_tdef.c":"f310f62360e0135944806f7296f81ab0e048b125d9f336de22f66e4f7b57aa32","miniz_stub/miniz_tinfl.c":"e56d711e23fdf2f0e6abefc9a5c0f12a3a6779c58022493cb255fbaac1250147","miniz_stub/miniz_zip.c":"e3d1cc22e92d540d6e2005c33e72779b38cc638f347b4f6785cd27ac1e1c746b","miniz_tdef.h":"7fd704f55c30bb36dfd5d81f9a8de1751061ad472c5fe3dd2b3a5374655e6121","miniz_tinfl.h":"21570b0688bb840106432f24a70d24eeedd7595e37965ccf3f0e0188ca2f604b","miniz_zip.h":"a6d19a9fb619cc647c6cc287210ae8d7a50c2018e65f2b259be1c8efd68885af","src/build.rs":"6cceadbf99e458e11a832328e42ad025ac2fa1acfe41f9fa98952c71728208d9","src/lib.rs":"2fb066d8bcd021d201158b8e1f9a005f4b9c7029143f036c6d49b22545ec9b16","src/lib_oxide.rs":"0e215ad5cbfb8959078edd472c61f364dd05957e0d28c3d743f798847662fbbd","src/tdef.rs":"4da73f16802011aa6a3c427d2c074a86198a828a1a191f247fc9fc20df24339b","src/tinfl.rs":"2494dbb929139ba035e147442f979afc1ae382e7e4017e9c822a608fe9184149","src/unmangle.rs":"132c66c5b0e3b463d92ee1e026c62b0fee75cdbe92e290a5f0d9403d668c9982","tests/miniz_tester.cpp":"9d0443d575b6a398f217422041b9955597d96be7e3723a328c1c5b689b698674","tests/test.rs":"0d8536f89ac1f8008c34b215ea567a977bdae37b9b8fe9865edab53887efec41","tests/timer.cpp":"2a748c3d9ea374bd7fd224420b6611357245b8d8e5ce619821b773a390f2b348","tests/timer.h":"dd48b88a80d68410cdf6a8764cd2999989fb094ce6efb718db9c112af803749a"},"package":"b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/Cargo.toml b/rustc_deps/vendor/miniz_oxide_c_api/Cargo.toml
index c8de9f3..d07f70a 100644
--- a/rustc_deps/vendor/miniz_oxide_c_api/Cargo.toml
+++ b/rustc_deps/vendor/miniz_oxide_c_api/Cargo.toml
@@ -12,10 +12,10 @@
 
 [package]
 name = "miniz_oxide_c_api"
-version = "0.2.0"
+version = "0.2.1"
 authors = ["Frommi <daniil.liferenko@gmail.com>"]
 build = "src/build.rs"
-exclude = ["benches/data/*"]
+exclude = ["benches/data/*", "/*.sh", "/redefine.txt"]
 description = "DEFLATE compression and decompression API designed to be Rust drop-in replacement for miniz"
 homepage = "https://github.com/Frommi/miniz_oxide/"
 documentation = "https://docs.rs/miniz_oxide_c_api"
@@ -39,7 +39,7 @@
 version = "0.2.22"
 
 [dependencies.miniz_oxide]
-version = "0.2.0"
+version = "0.2.1"
 [build-dependencies.cc]
 version = "1.0"
 
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/build.sh b/rustc_deps/vendor/miniz_oxide_c_api/build.sh
deleted file mode 100755
index 824ec5a..0000000
--- a/rustc_deps/vendor/miniz_oxide_c_api/build.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-
-cd $(dirname $0)
-
-OLD="\#CRATE_TYPE"
-NEW="crate-type = \['staticlib', 'rlib'\]"
-
-# Tell cargo that we want a static library to link with.
-# --crate-type=staticlib doesn't seem to work, so we modify
-# Cargo.toml temoprarily instead.
-sed -i "s/$OLD/$NEW/g" Cargo.toml
-
-rm -f libminiz_oxide_c_api.a
-
-if [[ ($# == 0 || $1 == "--release" ) ]]; then
-    RUSTFLAGS="-g" cargo build --release --features=miniz_zip -- || exit 1
-    cp target/release/libminiz_oxide_c_api.a .
-elif [[ $1 == "--debug" ]]; then
-    cargo build --features=miniz_zip || exit 1
-    cp target/debug/libminiz_oxide_c_api.a .
-else
-    echo --relese or --debug
-fi
-
-sed -i "s/$NEW/$OLD/g" Cargo.toml
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/build_orig_miniz.sh b/rustc_deps/vendor/miniz_oxide_c_api/build_orig_miniz.sh
deleted file mode 100755
index 1782074..0000000
--- a/rustc_deps/vendor/miniz_oxide_c_api/build_orig_miniz.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-
-mkdir -p bin
-
-rm bin/libminiz.a
-gcc -O2 -c -fPIC miniz/*.c
-for f in *.o ; do mv "$f" "c_$f" ; done
-
-for f in c_*.o ; do objcopy "$f" --redefine-syms redefine.txt; done
-
-gcc -O2 -c -fPIC miniz_stub/*.c
-ar rsc -o bin/libminiz.a *.o
-
-rm *.o
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/performance.sh b/rustc_deps/vendor/miniz_oxide_c_api/performance.sh
deleted file mode 100755
index 6583150..0000000
--- a/rustc_deps/vendor/miniz_oxide_c_api/performance.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-./build.sh --release
-
-mkdir -p bin
-g++ tests/miniz_tester.cpp tests/timer.cpp -o bin/miniz_tester -I. -O2 -L. -lminiz_oxide_c_api -lutil -ldl -lrt -lpthread -lgcc_s -lc -lm -lrt -lpthread -lutil
-#g++ tests/miniz_tester.cpp tests/timer.cpp miniz/* -o bin/miniz_tester -I. -O2
-
-mkdir -p test_scratch
-if ! test -e "test_scratch/linux-4.8.11"
-then
-    cd test_scratch
-    wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.8.11.tar.xz -O linux-4.8.11.tar.xz
-    tar xf linux-4.8.11.tar.xz
-    cd ..
-fi
-
-cd test_scratch
-#../bin/miniz_tester -v a linux-4.8.11
-perf stat /usr/bin/time "../bin/miniz_tester" -v a linux-4.8.11
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/redefine.txt b/rustc_deps/vendor/miniz_oxide_c_api/redefine.txt
deleted file mode 100644
index 2c518f3..0000000
--- a/rustc_deps/vendor/miniz_oxide_c_api/redefine.txt
+++ /dev/null
@@ -1,163 +0,0 @@
-mz_compress c_mz_compress
-mz_compress2 c_mz_compress2
-mz_compressBound c_mz_compressBound
-mz_deflate c_mz_deflate
-mz_deflateBound c_mz_deflateBound
-mz_deflateEnd c_mz_deflateEnd
-mz_deflateInit c_mz_deflateInit
-mz_deflateInit2 c_mz_deflateInit2
-mz_deflateReset c_mz_deflateReset
-mz_error c_mz_error
-mz_free c_mz_free
-mz_inflate c_mz_inflate
-mz_inflateEnd c_mz_inflateEnd
-mz_inflateInit c_mz_inflateInit
-mz_inflateInit2 c_mz_inflateInit2
-mz_uncompress c_mz_uncompress
-mz_version c_mz_version
-mz_adler32 c_mz_adler32
-mz_bitmasks c_mz_bitmasks
-s_tdefl_large_dist_extra c_s_tdefl_large_dist_extra
-s_tdefl_large_dist_sym c_s_tdefl_large_dist_sym
-s_tdefl_len_extra c_s_tdefl_len_extra
-s_tdefl_len_sym c_s_tdefl_len_sym
-s_tdefl_num_probes c_s_tdefl_num_probes
-s_tdefl_packed_code_size_syms_swizzle c_s_tdefl_packed_code_size_syms_swizzle
-s_tdefl_png_num_probes.4093 c_s_tdefl_png_num_probes.4093
-s_tdefl_small_dist_extra c_s_tdefl_small_dist_extra
-s_tdefl_small_dist_sym c_s_tdefl_small_dist_sym
-tdefl_calculate_minimum_redundancy c_tdefl_calculate_minimum_redundancy
-tdefl_compress c_tdefl_compress
-tdefl_compress_block c_tdefl_compress_block
-tdefl_compress_fast c_tdefl_compress_fast
-tdefl_compress_lz_codes c_tdefl_compress_lz_codes
-tdefl_compress_mem_to_heap c_tdefl_compress_mem_to_heap
-tdefl_compress_mem_to_mem c_tdefl_compress_mem_to_mem
-tdefl_compress_mem_to_output c_tdefl_compress_mem_to_output
-tdefl_compress_normal c_tdefl_compress_normal
-tdefl_compressor_alloc c_tdefl_compressor_alloc
-tdefl_compressor_free c_tdefl_compressor_free
-tdefl_flush_block c_tdefl_flush_block
-tdefl_flush_output_buffer c_tdefl_flush_output_buffer
-tdefl_get_adler32 c_tdefl_get_adler32
-tdefl_get_prev_return_status c_tdefl_get_prev_return_status
-tdefl_huffman_enforce_max_code_size c_tdefl_huffman_enforce_max_code_size
-tdefl_optimize_huffman_table c_tdefl_optimize_huffman_table
-tdefl_output_buffer_putter c_tdefl_output_buffer_putter
-tdefl_radix_sort_syms c_tdefl_radix_sort_syms
-tdefl_start_dynamic_block c_tdefl_start_dynamic_block
-tdefl_start_static_block c_tdefl_start_static_block
-tdefl_write_image_to_png_file_in_memory c_tdefl_write_image_to_png_file_in_memory
-tdefl_write_image_to_png_file_in_memory_ex c_tdefl_write_image_to_png_file_in_memory_ex
-tinfl_decompress_mem_to_callback c_tinfl_decompress_mem_to_callback
-tinfl_decompress_mem_to_heap c_tinfl_decompress_mem_to_heap
-tinfl_decompress_mem_to_mem c_tinfl_decompress_mem_to_mem
-tinfl_decompressor_alloc c_tinfl_decompressor_alloc
-tinfl_decompressor_free c_tinfl_decompressor_free
-miniz_def_alloc_func c_miniz_def_alloc_func
-miniz_def_free_func c_miniz_def_free_func
-miniz_def_realloc_func c_miniz_def_realloc_func
-mz_crc32 c_mz_crc32
-mz_zip_add_mem_to_archive_file_in_place c_mz_zip_add_mem_to_archive_file_in_place
-mz_zip_add_mem_to_archive_file_in_place_v2 c_mz_zip_add_mem_to_archive_file_in_place_v2
-mz_zip_array_ensure_capacity c_mz_zip_array_ensure_capacity
-mz_zip_clear_last_error c_mz_zip_clear_last_error
-mz_zip_compute_crc32_callback c_mz_zip_compute_crc32_callback
-mz_zip_dos_to_time_t c_mz_zip_dos_to_time_t
-mz_zip_end c_mz_zip_end
-mz_zip_extract_archive_file_to_heap c_mz_zip_extract_archive_file_to_heap
-mz_zip_extract_archive_file_to_heap_v2 c_mz_zip_extract_archive_file_to_heap_v2
-mz_zip_file_read_func c_mz_zip_file_read_func
-mz_zip_file_stat_internal c_mz_zip_file_stat_internal
-mz_zip_file_write_callback c_mz_zip_file_write_callback
-mz_zip_file_write_func c_mz_zip_file_write_func
-mz_zip_get_archive_file_start_offset c_mz_zip_get_archive_file_start_offset
-mz_zip_get_archive_size c_mz_zip_get_archive_size
-mz_zip_get_central_dir_size c_mz_zip_get_central_dir_size
-mz_zip_get_cfile c_mz_zip_get_cfile
-mz_zip_get_error_string c_mz_zip_get_error_string
-mz_zip_get_file_modified_time c_mz_zip_get_file_modified_time
-mz_zip_get_last_error c_mz_zip_get_last_error
-mz_zip_get_mode c_mz_zip_get_mode
-mz_zip_get_type c_mz_zip_get_type
-mz_zip_heap_write_func c_mz_zip_heap_write_func
-mz_zip_is_zip64 c_mz_zip_is_zip64
-mz_zip_locate_file_binary_search c_mz_zip_locate_file_binary_search
-mz_zip_mem_read_func c_mz_zip_mem_read_func
-mz_zip_peek_last_error c_mz_zip_peek_last_error
-mz_zip_read_archive_data c_mz_zip_read_archive_data
-mz_zip_reader_end c_mz_zip_reader_end
-mz_zip_reader_end_internal c_mz_zip_reader_end_internal
-mz_zip_reader_extract_file_iter_new c_mz_zip_reader_extract_file_iter_new
-mz_zip_reader_extract_file_to_callback c_mz_zip_reader_extract_file_to_callback
-mz_zip_reader_extract_file_to_cfile c_mz_zip_reader_extract_file_to_cfile
-mz_zip_reader_extract_file_to_file c_mz_zip_reader_extract_file_to_file
-mz_zip_reader_extract_file_to_heap c_mz_zip_reader_extract_file_to_heap
-mz_zip_reader_extract_file_to_mem c_mz_zip_reader_extract_file_to_mem
-mz_zip_reader_extract_file_to_mem_no_alloc c_mz_zip_reader_extract_file_to_mem_no_alloc
-mz_zip_reader_extract_iter_free c_mz_zip_reader_extract_iter_free
-mz_zip_reader_extract_iter_new c_mz_zip_reader_extract_iter_new
-mz_zip_reader_extract_iter_read c_mz_zip_reader_extract_iter_read
-mz_zip_reader_extract_to_callback c_mz_zip_reader_extract_to_callback
-mz_zip_reader_extract_to_cfile c_mz_zip_reader_extract_to_cfile
-mz_zip_reader_extract_to_file c_mz_zip_reader_extract_to_file
-mz_zip_reader_extract_to_heap c_mz_zip_reader_extract_to_heap
-mz_zip_reader_extract_to_mem c_mz_zip_reader_extract_to_mem
-mz_zip_reader_extract_to_mem_no_alloc c_mz_zip_reader_extract_to_mem_no_alloc
-mz_zip_reader_file_stat c_mz_zip_reader_file_stat
-mz_zip_reader_get_filename c_mz_zip_reader_get_filename
-mz_zip_reader_get_num_files c_mz_zip_reader_get_num_files
-mz_zip_reader_init c_mz_zip_reader_init
-mz_zip_reader_init_cfile c_mz_zip_reader_init_cfile
-mz_zip_reader_init_file c_mz_zip_reader_init_file
-mz_zip_reader_init_file_v2 c_mz_zip_reader_init_file_v2
-mz_zip_reader_init_internal c_mz_zip_reader_init_internal
-mz_zip_reader_init_mem c_mz_zip_reader_init_mem
-mz_zip_reader_is_file_a_directory c_mz_zip_reader_is_file_a_directory
-mz_zip_reader_is_file_encrypted c_mz_zip_reader_is_file_encrypted
-mz_zip_reader_is_file_supported c_mz_zip_reader_is_file_supported
-mz_zip_reader_locate_file c_mz_zip_reader_locate_file
-mz_zip_reader_locate_file_v2 c_mz_zip_reader_locate_file_v2
-mz_zip_reader_locate_header_sig c_mz_zip_reader_locate_header_sig
-mz_zip_reader_read_central_dir c_mz_zip_reader_read_central_dir
-mz_zip_reader_sort_central_dir_offsets_by_filename c_mz_zip_reader_sort_central_dir_offsets_by_filename
-mz_zip_set_file_times c_mz_zip_set_file_times
-mz_zip_set_last_error c_mz_zip_set_last_error
-mz_zip_time_t_to_dos_time c_mz_zip_time_t_to_dos_time
-mz_zip_validate_archive c_mz_zip_validate_archive
-mz_zip_validate_file c_mz_zip_validate_file
-mz_zip_validate_file_archive c_mz_zip_validate_file_archive
-mz_zip_validate_mem_archive c_mz_zip_validate_mem_archive
-mz_zip_writer_add_cfile c_mz_zip_writer_add_cfile
-mz_zip_writer_add_file c_mz_zip_writer_add_file
-mz_zip_writer_add_from_zip_reader c_mz_zip_writer_add_from_zip_reader
-mz_zip_writer_add_mem c_mz_zip_writer_add_mem
-mz_zip_writer_add_mem_ex c_mz_zip_writer_add_mem_ex
-mz_zip_writer_add_mem_ex_v2 c_mz_zip_writer_add_mem_ex_v2
-mz_zip_writer_add_put_buf_callback c_mz_zip_writer_add_put_buf_callback
-mz_zip_writer_add_to_central_dir c_mz_zip_writer_add_to_central_dir
-mz_zip_writer_compute_padding_needed_for_file_alignment c_mz_zip_writer_compute_padding_needed_for_file_alignment
-mz_zip_writer_create_central_dir_header c_mz_zip_writer_create_central_dir_header
-mz_zip_writer_create_local_dir_header c_mz_zip_writer_create_local_dir_header
-mz_zip_writer_create_zip64_extra_data c_mz_zip_writer_create_zip64_extra_data
-mz_zip_writer_end c_mz_zip_writer_end
-mz_zip_writer_end_internal c_mz_zip_writer_end_internal
-mz_zip_writer_finalize_archive c_mz_zip_writer_finalize_archive
-mz_zip_writer_finalize_heap_archive c_mz_zip_writer_finalize_heap_archive
-mz_zip_writer_init c_mz_zip_writer_init
-mz_zip_writer_init_cfile c_mz_zip_writer_init_cfile
-mz_zip_writer_init_file c_mz_zip_writer_init_file
-mz_zip_writer_init_file_v2 c_mz_zip_writer_init_file_v2
-mz_zip_writer_init_from_reader c_mz_zip_writer_init_from_reader
-mz_zip_writer_init_from_reader_v2 c_mz_zip_writer_init_from_reader_v2
-mz_zip_writer_init_heap c_mz_zip_writer_init_heap
-mz_zip_writer_init_heap_v2 c_mz_zip_writer_init_heap_v2
-mz_zip_writer_init_v2 c_mz_zip_writer_init_v2
-mz_zip_writer_update_zip64_extension_block c_mz_zip_writer_update_zip64_extension_block
-mz_zip_writer_validate_archive_name c_mz_zip_writer_validate_archive_name
-mz_zip_writer_write_zeros c_mz_zip_writer_write_zeros
-mz_zip_zero_struct c_mz_zip_zero_struct
-tdefl_compress_buffer c_tdefl_compress_buffer
-tdefl_create_comp_flags_from_zip_params c_tdefl_create_comp_flags_from_zip_params
-tdefl_init c_tdefl_init
-tinfl_decompress c_tinfl_decompress
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/run_fuzz.sh b/rustc_deps/vendor/miniz_oxide_c_api/run_fuzz.sh
deleted file mode 100755
index 2278187..0000000
--- a/rustc_deps/vendor/miniz_oxide_c_api/run_fuzz.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env bash
-
-# TODO: This is broken at the moment.
-cargo fuzz run fuzz_high -- -max_len=900
diff --git a/rustc_deps/vendor/miniz_oxide_c_api/src/lib.rs b/rustc_deps/vendor/miniz_oxide_c_api/src/lib.rs
index 7af5d06..de1c2fa 100644
--- a/rustc_deps/vendor/miniz_oxide_c_api/src/lib.rs
+++ b/rustc_deps/vendor/miniz_oxide_c_api/src/lib.rs
@@ -1,5 +1,3 @@
-#![cfg_attr(any(feature = "libc_stub", all(target_arch = "wasm32", not(target_os = "emscripten"))), feature(allocator_api))]
-
 extern crate crc;
 #[cfg(not(any(feature = "libc_stub", all(target_arch = "wasm32", not(target_os = "emscripten")))))]
 extern crate libc;
@@ -7,7 +5,7 @@
 mod libc {
     #![allow(non_camel_case_types)]
 
-    use std::alloc::{Alloc, Global, Layout};
+    use std::alloc::{alloc as rust_alloc, realloc as rust_realloc, dealloc as rust_dealloc, Layout};
     use std::mem;
     use std::ptr::NonNull;
 
@@ -24,10 +22,7 @@
             Ok(n) => n,
             Err(_) => return 0 as *mut c_void,
         };
-        let ptr = match Global.alloc(layout) {
-            Ok(addr) => addr.as_ptr() as *mut size_t,
-            Err(_) => return 0 as *mut c_void,
-        };
+        let ptr = rust_alloc(layout) as *mut size_t;
         *ptr.offset(0) = size;
         ptr.offset(1) as *mut c_void
     }
@@ -37,10 +32,7 @@
         let ptr = (ptr as *mut size_t).offset(-1);
         let old_size = *ptr.offset(0);
         let layout = Layout::from_size_align_unchecked(old_size, mem::size_of::<size_t>());
-        let ptr = match Global.realloc(NonNull::new_unchecked(ptr as *mut _), layout, new_size) {
-            Ok(addr) => addr.as_ptr() as *mut size_t,
-            Err(_) => return 0 as *mut c_void,
-        };
+        let ptr = rust_realloc(ptr as *mut _, layout, new_size) as *mut size_t;
         *ptr.offset(0) = new_size;
         ptr.offset(1) as *mut c_void
     }
@@ -50,7 +42,7 @@
         let size = *ptr.offset(0);
         let align = mem::size_of::<size_t>();
         let layout = Layout::from_size_align_unchecked(size, align);
-        Global.dealloc(NonNull::new_unchecked(ptr as *mut _), layout);
+        rust_dealloc(ptr as *mut _, layout);
     }
 }
 extern crate miniz_oxide;
diff --git