Bug 1436830 - Drop slog dependency. r?rillian,jgraham draft
authorAndreas Tolfsen <ato@sny.no>
Wed, 14 Feb 2018 13:04:39 +0000
changeset 754872 f5ce7d24a2f82f965dcc2b989a3624e8701373ff
parent 754871 dafbcc5ccbe2570615d1ee16a39d2431e21f4ff6
push id99022
push userbmo:ato@sny.no
push dateWed, 14 Feb 2018 13:12:55 +0000
reviewersrillian, jgraham
bugs1436830
milestone60.0a1
Bug 1436830 - Drop slog dependency. r?rillian,jgraham MozReview-Commit-ID: A9BZF9VoQuN
third_party/rust/crossbeam/.cargo-checksum.json
third_party/rust/crossbeam/.travis.yml
third_party/rust/crossbeam/CHANGELOG.md
third_party/rust/crossbeam/Cargo.toml
third_party/rust/crossbeam/LICENSE-APACHE
third_party/rust/crossbeam/LICENSE-MIT
third_party/rust/crossbeam/README.md
third_party/rust/crossbeam/scala-bench/bench.scala
third_party/rust/crossbeam/src/bin/bench.rs
third_party/rust/crossbeam/src/bin/extra_impls/mod.rs
third_party/rust/crossbeam/src/bin/extra_impls/mpsc_queue.rs
third_party/rust/crossbeam/src/bin/stress-msq.rs
third_party/rust/crossbeam/src/lib.rs
third_party/rust/crossbeam/src/mem/cache_padded.rs
third_party/rust/crossbeam/src/mem/epoch/atomic.rs
third_party/rust/crossbeam/src/mem/epoch/garbage.rs
third_party/rust/crossbeam/src/mem/epoch/global.rs
third_party/rust/crossbeam/src/mem/epoch/guard.rs
third_party/rust/crossbeam/src/mem/epoch/local.rs
third_party/rust/crossbeam/src/mem/epoch/mod.rs
third_party/rust/crossbeam/src/mem/epoch/participant.rs
third_party/rust/crossbeam/src/mem/epoch/participants.rs
third_party/rust/crossbeam/src/mem/mod.rs
third_party/rust/crossbeam/src/scoped.rs
third_party/rust/crossbeam/src/sync/arc_cell.rs
third_party/rust/crossbeam/src/sync/atomic_option.rs
third_party/rust/crossbeam/src/sync/chase_lev.rs
third_party/rust/crossbeam/src/sync/mod.rs
third_party/rust/crossbeam/src/sync/ms_queue.rs
third_party/rust/crossbeam/src/sync/seg_queue.rs
third_party/rust/crossbeam/src/sync/treiber_stack.rs
third_party/rust/isatty/.cargo-checksum.json
third_party/rust/isatty/.travis.yml
third_party/rust/isatty/Cargo.toml
third_party/rust/isatty/LICENSE-APACHE
third_party/rust/isatty/LICENSE-MIT
third_party/rust/isatty/README.md
third_party/rust/isatty/appveyor.yml
third_party/rust/isatty/src/lib.rs
third_party/rust/slog-atomic/.cargo-checksum.json
third_party/rust/slog-atomic/.travis.yml
third_party/rust/slog-atomic/CHANGELOG.md
third_party/rust/slog-atomic/Cargo.toml
third_party/rust/slog-atomic/LICENSE-MPL2
third_party/rust/slog-atomic/Makefile
third_party/rust/slog-atomic/README.md
third_party/rust/slog-atomic/examples/signal.rs
third_party/rust/slog-atomic/lib.rs
third_party/rust/slog-extra/.cargo-checksum.json
third_party/rust/slog-extra/.travis.yml
third_party/rust/slog-extra/CHANGELOG.md
third_party/rust/slog-extra/Cargo.toml
third_party/rust/slog-extra/LICENSE-MPL2
third_party/rust/slog-extra/Makefile
third_party/rust/slog-extra/README.md
third_party/rust/slog-extra/lib.rs
third_party/rust/slog-stdlog/.cargo-checksum.json
third_party/rust/slog-stdlog/CHANGELOG.md
third_party/rust/slog-stdlog/Cargo.toml
third_party/rust/slog-stdlog/lib.rs
third_party/rust/slog-stream/.cargo-checksum.json
third_party/rust/slog-stream/.travis.yml
third_party/rust/slog-stream/CHANGELOG.md
third_party/rust/slog-stream/Cargo.toml
third_party/rust/slog-stream/LICENSE-MPL2
third_party/rust/slog-stream/Makefile
third_party/rust/slog-stream/README.md
third_party/rust/slog-stream/format.rs
third_party/rust/slog-stream/lib.rs
third_party/rust/slog-stream/rusty-tags.vi
third_party/rust/slog-term/.cargo-checksum.json
third_party/rust/slog-term/.travis.yml
third_party/rust/slog-term/CHANGELOG.md
third_party/rust/slog-term/Cargo.toml
third_party/rust/slog-term/LICENSE-MPL2
third_party/rust/slog-term/Makefile
third_party/rust/slog-term/README.md
third_party/rust/slog-term/lib.rs
third_party/rust/slog/.cargo-checksum.json
third_party/rust/slog/.cargo/config
third_party/rust/slog/.travis.yml
third_party/rust/slog/CHANGELOG.md
third_party/rust/slog/Cargo.toml
third_party/rust/slog/LICENSE-MPL2
third_party/rust/slog/Makefile
third_party/rust/slog/README.md
third_party/rust/slog/benches.txt
third_party/rust/slog/examples.txt
third_party/rust/slog/rusty-tags.vi
third_party/rust/slog/src/_drain.rs
third_party/rust/slog/src/_level.rs
third_party/rust/slog/src/_logger.rs
third_party/rust/slog/src/lib.rs
third_party/rust/slog/src/ser.rs
third_party/rust/slog/src/tests.rs
deleted file mode 100644
--- a/third_party/rust/crossbeam/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"5c1a66c2f3f70d7a6fd7ee40b87863d95b78294244cc037453220d64fc431362","CHANGELOG.md":"729d4632f518b0c699d1b947e5d8ddd3fc6a8878bd7796d7b96b2f58772f0478","Cargo.toml":"778cf5a227b5f6a0200d9385d2a8adc59a559a6822ab4d1941348f3eee92d791","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"ea4153526db8a7b7c33fba324fd87f9e43ecac4c973ec1af242c325768c1a4b3","scala-bench/bench.scala":"8f203f98f2c938115247a8ed5ef9d0848fe0f8dca49fc43e2dba88bdd61029e3","src/bin/bench.rs":"7826ed26fcce96f0e2fe3d0b46c36bbfde70168546124018394b1aae8fbf1ec3","src/bin/extra_impls/mod.rs":"b72e67187cbfc1672faacd7d906604f3adc0c7540c781db88c6f4f1726229db9","src/bin/extra_impls/mpsc_queue.rs":"94551cbe0075c40472bae74cb500070c5c621e3690e15c1374b56c5cb7dd6639","src/bin/stress-msq.rs":"f49ba9adb0308013dbd7ed748572659c8b25d045e20609a21ed29ce35784f8f7","src/lib.rs":"b84c7a07bcae8342ce791e42566d103bfc7ac072994a2fe4d6f0b14c8d905f2d","src/mem/cache_padded.rs":"710de7fc76c04bda2e9eafa9f2e9a038fd381330f0e2ac657b56552a9bd9223c","src/mem/epoch/atomic.rs":"ec73c5e271b6b16bc489d3a6b47a48c5ef21cd1d8320d5ed01a6cac271afb42a","src/mem/epoch/garbage.rs":"dd3a3270481da756cf2e8aece5518642059d72492ffbdb107ad9c92d608ed3d3","src/mem/epoch/global.rs":"901df28fdb255cf2466962fa1fcfe3f3006325b94d80a5edb71e3251cecd592e","src/mem/epoch/guard.rs":"75c2a771d88e859f1f53a79a9466ed1e62a6854a1ddca99c6dcaa3d4ca3520e1","src/mem/epoch/local.rs":"d451c2c05fe50e80bdc92313d074b7db13f54d6caa3cf6df6ba5b717566932ae","src/mem/epoch/mod.rs":"a57570492cc2b23b5d6164e0738af5b8d7d65c4b2de08fdfaa2283a47481fce0","src/mem/epoch/participant.rs":"d16e9a81d34f8368340126e9e420bdeec9e661c94aec7a26057be26cad0982df","src/mem/epoch/participants.rs":"c7f4edd7e632130cd149afad8abbeb21888df55b7e4db4206a8840a218bf764d","src/mem/mod.rs":"c60aaeee01ce6abe2418f6f2a3cdd38564a6a46d3c47285d9730a358f52fa6bf","src/scoped.rs":"9ef97832dea5dbdebc88f6c1c8dee5ac5e801f302b70ba17b667214fc3fe57ed","src/sync/arc_cell.rs":"d12dcaca3d59cb0a7c34470dff60c11cb8e25ecde87baf3940bd0747bb107672","src/sync/atomic_option.rs":"dcdfd1080c35d782f041edc7d6c52c1c8fc05f4fe75a9dad261a8982f954ae97","src/sync/chase_lev.rs":"9679cb37bf777466c714e3b8aca7c583638e4534cbb298449130cfa7a07c1d78","src/sync/mod.rs":"35e5f793530e198e891e6ef619da161bbcd31a1de1419dc5b9e9a954d3542c02","src/sync/ms_queue.rs":"cf735b32c12d3227364b2a2abf75a99e5f36f2980b58f34821462cdaf1aac209","src/sync/seg_queue.rs":"e9178f259a0fec71aeb4fb9d5c2bd668eb3dc5f3a3808f167eaae263d76f6646","src/sync/treiber_stack.rs":"60e7f82a42379fbcc2b418b9d50cef98ebc743d9747bf646eb1f3d723189bea4"},"package":"0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/crossbeam/.travis.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-language: rust
-# necessary for `travis-cargo coveralls --no-sudo`
-addons:
-  apt:
-    packages:
-      - libcurl4-openssl-dev
-      - libelf-dev
-      - libdw-dev
-
-# run builds for all the trains (and more)
-rust:
-  - nightly
-  - beta
-  - stable
-
-# load travis-cargo
-before_script:
-  - |
-      pip install 'travis-cargo<0.2' --user &&
-      export PATH=$HOME/.local/bin:$PATH
-
-# the main build
-script:
-  - |
-      travis-cargo build &&
-      travis-cargo test &&
-      travis-cargo test -- --release &&
-      travis-cargo run -- --bin bench --release &&
-      travis-cargo --only stable doc
-env:
-  global:
-    # override the default `--features unstable` used for the nightly branch (optional)
-    - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
-notifications:
-  email:
-    on_success: never
deleted file mode 100644
--- a/third_party/rust/crossbeam/CHANGELOG.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Version 0.2
-
-- Changed existing non-blocking `pop` methods to `try_pop`
-- Added blocking `pop` support to Michael-Scott queue
-- Added Chase-Lev work-stealing deque
-
-# Version 0.1
-
-- Added [epoch-based memory management](http://aturon.github.io/blog/2015/08/27/epoch/)
-- Added Michael-Scott queue
-- Added Segmented array queue
deleted file mode 100644
--- a/third_party/rust/crossbeam/Cargo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-[package]
-name = "crossbeam"
-version = "0.2.10"
-authors = ["Aaron Turon <aturon@mozilla.com>"]
-description = "Support for lock-free data structures, synchronizers, and parallel programming"
-repository = "https://github.com/aturon/crossbeam"
-documentation = "http://aturon.github.io/crossbeam-doc/crossbeam/"
-readme = "README.md"
-license = "Apache-2.0/MIT"
-
-[features]
-nightly = []
-
-[dev-dependencies]
-rand = "0.3"
deleted file mode 100644
--- a/third_party/rust/crossbeam/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              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.
deleted file mode 100644
--- a/third_party/rust/crossbeam/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2015 The Rust Project Developers
-
-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.
deleted file mode 100644
--- a/third_party/rust/crossbeam/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Crossbeam: support for concurrent and parallel programming
-
-[![Build Status](https://travis-ci.org/aturon/crossbeam.svg?branch=master)](https://travis-ci.org/aturon/crossbeam)
-
-This crate is an early work in progress. The focus for the moment is
-concurrency:
-
-- **Non-blocking data structures**. These data structures allow for high
-performance, highly-concurrent access, much superior to wrapping with a
-`Mutex`. Ultimately the goal is to include stacks, queues, deques, bags, sets
-and maps.
-
-- **Memory management**. Because non-blocking data structures avoid global
-synchronization, it is not easy to tell when internal data can be safely
-freed. The `mem` module provides generic, easy to use, and high-performance APIs
-for managing memory in these cases.
-
-- **Synchronization**. The standard library provides a few synchronization
-primitives (locks, semaphores, barriers, etc) but this crate seeks to expand
-that set to include more advanced/niche primitives, as well as userspace
-alternatives.
-
-- **Scoped thread API**. Finally, the crate provides a "scoped" thread API,
-making it possible to spawn threads that share stack data with their parents.
-
-# Usage
-
-To use Crossbeam, add this to your `Cargo.toml`:
-
-```toml
-[dependencies]
-crossbeam = "0.2"
-```
-
-For examples of what Crossbeam is capable of, see the
-[documentation][docs].
-
-[docs]: http://aturon.github.io/crossbeam-doc/crossbeam/
deleted file mode 100644
--- a/third_party/rust/crossbeam/scala-bench/bench.scala
+++ /dev/null
@@ -1,195 +0,0 @@
-import scala.concurrent.ExecutionContext.Implicits.global
-import scala.concurrent._
-import scala.concurrent.duration._
-import java.util.concurrent.ConcurrentLinkedQueue
-import java.util.concurrent.atomic._
-import java.util.Stack
-
-import scala.annotation.tailrec
-
-final class MSQueue[A](a: A) {
-  private abstract class Q
-  private final case class Node(data: A, next: AtomicReference[Q] = new AtomicReference(Emp)) extends Q
-  private final case object Emp extends Q
-  private val head = new AtomicReference(Node(a))
-  private val tail = new AtomicReference(head.get())
-
-  def enq(a: A) {
-    val newNode = new Node(a)
-    while (true) {
-      val curTail = tail.get()
-      curTail.next.get()match {
-        case n@Node(_,_) => tail.compareAndSet(curTail, n)
-        case Emp => {
-          if (curTail.next.compareAndSet(Emp, newNode)) {
-            tail.compareAndSet(curTail, newNode)
-            return
-          }
-        }
-      }
-    }
-  }
-
-  def deq(): Option[A] = {
-    while (true) {
-      val cur_head = head.get()
-      cur_head.next.get() match {
-        case Emp => return None
-        case n@Node(data, _) => {
-          if (head.compareAndSet(cur_head, n)) {
-            return Some(data)
-          }
-        }
-      }
-    }
-    None
-  }
-}
-
-abstract class MyBool
-final case class MyTrue() extends MyBool
-final case class MyFalse() extends MyBool
-
-object Bench {
-  def time(block: => Unit): Long = {
-    val t0 = System.nanoTime()
-    val result = block    // call-by-name
-    val t1 = System.nanoTime()
-    t1 - t0
-  }
-
-  def do_linked(threads: Int, count: Int) {
-    val q: ConcurrentLinkedQueue[MyBool] = new ConcurrentLinkedQueue();
-
-    val t = time {
-      var s = new Stack[Future[Unit]]
-      for (i <- 1 to threads) {
-        s.push(Future {
-          for (i <- 1 to count+1) {
-            //if (i % 100000 == 0) { println(q.size()) }
-            q.offer(MyTrue())
-          }
-        })
-      }
-
-      var rn = 0
-      while (rn < count) {
-        if (q.poll() != null) {
-          rn += 1
-        }
-      }
-
-      while (!s.empty()) {
-        Await.ready(s.pop(), Duration.Inf)
-      }
-    }
-
-    println("Linked: " + t / (count * threads))
-  }
-
-  def do_linked_mpmc(threads: Int, count: Int) {
-    val q = new ConcurrentLinkedQueue[MyBool];
-    val prod = new AtomicInteger();
-
-    val t = time {
-      var s = new Stack[Future[Unit]]
-      for (i <- 1 to threads) {
-        s.push(Future {
-          for (i <- 1 to count+1) {
-            q.offer(MyTrue())
-            //if (i % 100000 == 0) { println(q.size()) }
-          }
-          if (prod.incrementAndGet() == threads) {
-            for (i <- 0 to threads) { q.offer(MyFalse()) }
-          }
-        })
-        s.push(Future {
-          var done = false;
-          while (!done) {
-            q.poll() match {
-              case MyFalse() => done = true
-              case _ => {}
-            }
-          }
-        })
-      }
-
-      while (!s.empty()) {
-        Await.ready(s.pop(), Duration.Inf)
-      }
-    }
-
-    println("Linked mpmc: " + t / (count * threads) + " (" + t / 1000000000 + ")")
-  }
-
-
-  def do_msq(threads: Int, count: Int) {
-    val q = new MSQueue[Int](0);
-
-    val t = time {
-      var s = new Stack[Future[Unit]]
-      for (i <- 1 to threads) {
-        s.push(Future { for (i <- 1 to count+1) { q.enq(i) } })
-      }
-
-      var rn = 0
-      while (rn < count) {
-        if (q.deq() != None) {
-          rn += 1
-        }
-      }
-
-      while (!s.empty()) {
-        Await.ready(s.pop(), Duration.Inf)
-      }
-    }
-
-    println("MSQ: " + t / (count * threads) + " (" + t / 1000000000 + ")")
-  }
-
-  def do_msq_mpmc(threads: Int, count: Int) {
-    val q = new MSQueue[Boolean](true);
-    val prod = new AtomicInteger();
-
-    val t = time {
-      var s = new Stack[Future[Unit]]
-      for (i <- 1 to threads) {
-        s.push(Future {
-          for (i <- 1 to count+1) { q.enq(true) }
-          if (prod.incrementAndGet() == threads) {
-            for (i <- 1 to threads) { q.enq(false) }
-          }
-        })
-        s.push(Future {
-          var done = false;
-          while (!done) {
-            q.deq() match {
-              case Some(false) => done = true
-              case _ => {}
-            }
-          }
-        })
-      }
-
-      while (!s.empty()) {
-        Await.ready(s.pop(), Duration.Inf)
-      }
-    }
-
-    println("MSQ mpmc: " + t / (count * threads) + " (" + t / 1000000000 + ")")
-  }
-
-  def main(args: Array[String]) {
-    do_linked(2, 1000000)
-    do_linked(2, 10000000)
-
-    do_msq(2, 1000000)
-    do_msq(2, 10000000)
-
-    do_linked_mpmc(2, 1000000)
-    do_linked_mpmc(2, 10000000)
-
-    do_msq_mpmc(2, 1000000)
-    do_msq_mpmc(2, 10000000)
-  }
-}
deleted file mode 100755
--- a/third_party/rust/crossbeam/src/bin/bench.rs
+++ /dev/null
@@ -1,165 +0,0 @@
-extern crate crossbeam;
-
-use std::collections::VecDeque;
-use std::sync::Mutex;
-use std::sync::mpsc::channel;
-use std::time::Duration;
-
-use crossbeam::scope;
-use crossbeam::sync::MsQueue;
-use crossbeam::sync::SegQueue;
-
-use extra_impls::mpsc_queue::Queue as MpscQueue;
-
-mod extra_impls;
-
-const COUNT: u64 = 10000000;
-const THREADS: u64 = 2;
-
-#[cfg(feature = "nightly")]
-fn time<F: FnOnce()>(f: F) -> Duration {
-    let start = ::std::time::Instant::now();
-    f();
-    start.elapsed()
-}
-
-#[cfg(not(feature = "nightly"))]
-fn time<F: FnOnce()>(_f: F) -> Duration {
-    Duration::new(0, 0)
-}
-
-fn nanos(d: Duration) -> f64 {
-    d.as_secs() as f64 * 1000000000f64 + (d.subsec_nanos() as f64)
-}
-
-trait Queue<T> {
-    fn push(&self, T);
-    fn try_pop(&self) -> Option<T>;
-}
-
-impl<T> Queue<T> for MsQueue<T> {
-    fn push(&self, t: T) { self.push(t) }
-    fn try_pop(&self) -> Option<T> { self.try_pop() }
-}
-
-impl<T> Queue<T> for SegQueue<T> {
-    fn push(&self, t: T) { self.push(t) }
-    fn try_pop(&self) -> Option<T> { self.try_pop() }
-}
-
-impl<T> Queue<T> for MpscQueue<T> {
-    fn push(&self, t: T) { self.push(t) }
-    fn try_pop(&self) -> Option<T> {
-        use extra_impls::mpsc_queue::*;
-
-        loop {
-            match self.pop() {
-                Data(t) => return Some(t),
-                Empty => return None,
-                Inconsistent => (),
-            }
-        }
-    }
-}
-
-impl<T> Queue<T> for Mutex<VecDeque<T>> {
-    fn push(&self, t: T) { self.lock().unwrap().push_back(t) }
-    fn try_pop(&self) -> Option<T> { self.lock().unwrap().pop_front() }
-}
-
-fn bench_queue_mpsc<Q: Queue<u64> + Sync>(q: Q) -> f64 {
-    let d = time(|| {
-        scope(|scope| {
-            for _i in 0..THREADS {
-                let qr = &q;
-                scope.spawn(move || {
-                    for x in 0..COUNT {
-                        let _ = qr.push(x);
-                    }
-                });
-            }
-
-            let mut count = 0;
-            while count < COUNT*THREADS {
-                if q.try_pop().is_some() {
-                    count += 1;
-                }
-            }
-        });
-    });
-
-    nanos(d) / ((COUNT * THREADS) as f64)
-}
-
-fn bench_queue_mpmc<Q: Queue<bool> + Sync>(q: Q) -> f64 {
-    use std::sync::atomic::AtomicUsize;
-    use std::sync::atomic::Ordering::Relaxed;
-
-    let prod_count = AtomicUsize::new(0);
-
-    let d = time(|| {
-        scope(|scope| {
-            for _i in 0..THREADS {
-                let qr = &q;
-                let pcr = &prod_count;
-                scope.spawn(move || {
-                    for _x in 0..COUNT {
-                        qr.push(true);
-                    }
-                    if pcr.fetch_add(1, Relaxed) == (THREADS as usize) - 1 {
-                        for _x in 0..THREADS {
-                            qr.push(false)
-                        }
-                    }
-                });
-                scope.spawn(move || {
-                    loop {
-                        if let Some(false) = qr.try_pop() { break }
-                    }
-                });
-            }
-
-
-        });
-    });
-
-    nanos(d) / ((COUNT * THREADS) as f64)
-}
-
-fn bench_chan_mpsc() -> f64 {
-    let (tx, rx) = channel();
-
-    let d = time(|| {
-        scope(|scope| {
-            for _i in 0..THREADS {
-                let my_tx = tx.clone();
-
-                scope.spawn(move || {
-                    for x in 0..COUNT {
-                        let _ = my_tx.send(x);
-                    }
-                });
-            }
-
-            for _i in 0..COUNT*THREADS {
-                let _ = rx.recv().unwrap();
-            }
-        });
-    });
-
-    nanos(d) / ((COUNT * THREADS) as f64)
-}
-
-fn main() {
-    println!("MSQ mpsc: {}", bench_queue_mpsc(MsQueue::new()));
-    println!("chan mpsc: {}", bench_chan_mpsc());
-    println!("mpsc mpsc: {}", bench_queue_mpsc(MpscQueue::new()));
-    println!("Seg mpsc: {}", bench_queue_mpsc(SegQueue::new()));
-
-    println!("MSQ mpmc: {}", bench_queue_mpmc(MsQueue::new()));
-    println!("Seg mpmc: {}", bench_queue_mpmc(SegQueue::new()));
-
-//    println!("queue_mpsc: {}", bench_queue_mpsc());
-//    println!("queue_mpmc: {}", bench_queue_mpmc());
-//   println!("mutex_mpmc: {}", bench_mutex_mpmc());
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/bin/extra_impls/mod.rs
+++ /dev/null
@@ -1,1 +0,0 @@
-pub mod mpsc_queue;
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/bin/extra_impls/mpsc_queue.rs
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Copyright (c) 2010-2011 Dmitry Vyukov. All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *    1. Redistributions of source code must retain the above copyright notice,
- *       this list of conditions and the following disclaimer.
- *
- *    2. Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY DMITRY VYUKOV "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL DMITRY VYUKOV OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * The views and conclusions contained in the software and documentation are
- * those of the authors and should not be interpreted as representing official
- * policies, either expressed or implied, of Dmitry Vyukov.
- */
-
-//! A mostly lock-free multi-producer, single consumer queue.
-//!
-//! This module contains an implementation of a concurrent MPSC queue. This
-//! queue can be used to share data between threads, and is also used as the
-//! building block of channels in rust.
-//!
-//! Note that the current implementation of this queue has a caveat of the `pop`
-//! method, and see the method for more information about it. Due to this
-//! caveat, this queue may not be appropriate for all use-cases.
-
-// http://www.1024cores.net/home/lock-free-algorithms
-//                         /queues/non-intrusive-mpsc-node-based-queue
-
-pub use self::PopResult::*;
-
-use std::fmt;
-use std::ptr;
-use std::cell::UnsafeCell;
-
-use std::sync::atomic::{AtomicPtr, Ordering};
-
-/// A result of the `pop` function.
-#[derive(Debug)]
-pub enum PopResult<T> {
-    /// Some data has been popped
-    Data(T),
-    /// The queue is empty
-    Empty,
-    /// The queue is in an inconsistent state. Popping data should succeed, but
-    /// some pushers have yet to make enough progress in order allow a pop to
-    /// succeed. It is recommended that a pop() occur "in the near future" in
-    /// order to see if the sender has made progress or not
-    Inconsistent,
-}
-
-#[derive(Debug)]
-struct Node<T> {
-    next: AtomicPtr<Node<T>>,
-    value: Option<T>,
-}
-
-/// The multi-producer single-consumer structure. This is not cloneable, but it
-/// may be safely shared so long as it is guaranteed that there is only one
-/// popper at a time (many pushers are allowed).
-pub struct Queue<T> {
-    head: AtomicPtr<Node<T>>,
-    tail: UnsafeCell<*mut Node<T>>,
-}
-
-impl<T> fmt::Debug for Queue<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Queue {{ ... }}")
-    }
-}
-
-unsafe impl<T: Send> Send for Queue<T> { }
-unsafe impl<T: Send> Sync for Queue<T> { }
-
-impl<T> Node<T> {
-    unsafe fn new(v: Option<T>) -> *mut Node<T> {
-        Box::into_raw(Box::new(Node {
-            next: AtomicPtr::new(ptr::null_mut()),
-            value: v,
-        }))
-    }
-}
-
-impl<T> Queue<T> {
-    /// Creates a new queue that is safe to share among multiple producers and
-    /// one consumer.
-    pub fn new() -> Queue<T> {
-        let stub = unsafe { Node::new(None) };
-        Queue {
-            head: AtomicPtr::new(stub),
-            tail: UnsafeCell::new(stub),
-        }
-    }
-
-    /// Pushes a new value onto this queue.
-    pub fn push(&self, t: T) {
-        unsafe {
-            let n = Node::new(Some(t));
-            let prev = self.head.swap(n, Ordering::AcqRel);
-            (*prev).next.store(n, Ordering::Release);
-        }
-    }
-
-    /// Pops some data from this queue.
-    ///
-    /// Note that the current implementation means that this function cannot
-    /// return `Option<T>`. It is possible for this queue to be in an
-    /// inconsistent state where many pushes have succeeded and completely
-    /// finished, but pops cannot return `Some(t)`. This inconsistent state
-    /// happens when a pusher is pre-empted at an inopportune moment.
-    ///
-    /// This inconsistent state means that this queue does indeed have data, but
-    /// it does not currently have access to it at this time.
-    pub fn pop(&self) -> PopResult<T> {
-        unsafe {
-            let tail = *self.tail.get();
-            let next = (*tail).next.load(Ordering::Acquire);
-
-            if !next.is_null() {
-                *self.tail.get() = next;
-                assert!((*tail).value.is_none());
-                assert!((*next).value.is_some());
-                let ret = (*next).value.take().unwrap();
-                let _ = Box::from_raw(tail);
-                return Data(ret);
-            }
-
-            if self.head.load(Ordering::Acquire) == tail {Empty} else {Inconsistent}
-        }
-    }
-}
-
-impl<T> Drop for Queue<T> {
-    fn drop(&mut self) {
-        unsafe {
-            let mut cur = *self.tail.get();
-            while !cur.is_null() {
-                let next = (*cur).next.load(Ordering::Relaxed);
-                let _ = Box::from_raw(cur);
-                cur = next;
-            }
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/bin/stress-msq.rs
+++ /dev/null
@@ -1,36 +0,0 @@
-extern crate crossbeam;
-
-use crossbeam::sync::MsQueue;
-use crossbeam::scope;
-
-use std::sync::Arc;
-
-const DUP: usize = 4;
-const THREADS: u32 = 2;
-const COUNT: u64 = 100000;
-
-fn main() {
-    scope(|s| {
-        for _i in 0..DUP {
-            let q = Arc::new(MsQueue::new());
-            let qs = q.clone();
-
-            s.spawn(move || {
-                for i in 1..COUNT { qs.push(i) }
-            });
-
-            for _i in 0..THREADS {
-                let qr = q.clone();
-                s.spawn(move || {
-                    let mut cur: u64 = 0;
-                    for _j in 0..COUNT {
-                        if let Some(new) = qr.try_pop() {
-                            assert!(new > cur);
-                            cur = new;
-                        }
-                    }
-                });
-            }
-        }
-    });
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/lib.rs
+++ /dev/null
@@ -1,54 +0,0 @@
-//! Support for concurrent and parallel programming.
-//!
-//! This crate is an early work in progress. The focus for the moment is
-//! concurrency:
-//!
-//! - **Non-blocking data structures**. These data structures allow for high
-//! performance, highly-concurrent access, much superior to wrapping with a
-//! `Mutex`. Ultimately the goal is to include stacks, queues, deques, bags,
-//! sets and maps. These live in the `sync` module.
-//!
-//! - **Memory management**. Because non-blocking data structures avoid global
-//! synchronization, it is not easy to tell when internal data can be safely
-//! freed. The `mem` module provides generic, easy to use, and high-performance
-//! APIs for managing memory in these cases. These live in the `mem` module.
-//!
-//! - **Synchronization**. The standard library provides a few synchronization
-//! primitives (locks, semaphores, barriers, etc) but this crate seeks to expand
-//! that set to include more advanced/niche primitives, as well as userspace
-//! alternatives. These live in the `sync` module.
-//!
-//! - **Scoped thread API**. Finally, the crate provides a "scoped" thread API,
-//! making it possible to spawn threads that share stack data with their
-//! parents. This functionality is exported at the top-level.
-
-//#![deny(missing_docs)]
-
-#![cfg_attr(feature = "nightly",
-            feature(const_fn, repr_simd, optin_builtin_traits))]
-
-use std::thread;
-
-pub use scoped::{scope, Scope, ScopedJoinHandle};
-
-pub mod mem;
-pub mod sync;
-mod scoped;
-
-#[doc(hidden)]
-trait FnBox {
-    fn call_box(self: Box<Self>);
-}
-
-impl<F: FnOnce()> FnBox for F {
-    fn call_box(self: Box<Self>) { (*self)() }
-}
-
-/// Like `std::thread::spawn`, but without the closure bounds.
-pub unsafe fn spawn_unsafe<'a, F>(f: F) -> thread::JoinHandle<()> where F: FnOnce() + Send + 'a {
-    use std::mem;
-
-    let closure: Box<FnBox + 'a> = Box::new(f);
-    let closure: Box<FnBox + Send> = mem::transmute(closure);
-    thread::spawn(move || closure.call_box())
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/cache_padded.rs
+++ /dev/null
@@ -1,149 +0,0 @@
-use std::marker;
-use std::cell::UnsafeCell;
-use std::fmt;
-use std::mem;
-use std::ptr;
-use std::ops::{Deref, DerefMut};
-
-// For now, treat this as an arch-independent constant.
-const CACHE_LINE: usize = 32;
-
-#[cfg_attr(feature = "nightly",
-           repr(simd))]
-#[derive(Debug)]
-struct Padding(u64, u64, u64, u64);
-
-/// Pad `T` to the length of a cacheline.
-///
-/// Sometimes concurrent programming requires a piece of data to be padded out
-/// to the size of a cacheline to avoid "false sharing": cachelines being
-/// invalidated due to unrelated concurrent activity. Use the `CachePadded` type
-/// when you want to *avoid* cache locality.
-///
-/// At the moment, cache lines are assumed to be 32 * sizeof(usize) on all
-/// architectures.
-///
-/// **Warning**: the wrapped data is never dropped; move out using `ptr::read`
-/// if you need to run dtors.
-pub struct CachePadded<T> {
-    data: UnsafeCell<[usize; CACHE_LINE]>,
-    _marker: ([Padding; 0], marker::PhantomData<T>),
-}
-
-impl<T> fmt::Debug for CachePadded<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "CachePadded {{ ... }}")
-    }
-}
-
-unsafe impl<T: Send> Send for CachePadded<T> {}
-unsafe impl<T: Sync> Sync for CachePadded<T> {}
-
-/// Types for which mem::zeroed() is safe.
-///
-/// If a type `T: ZerosValid`, then a sequence of zeros the size of `T` must be
-/// a valid member of the type `T`.
-pub unsafe trait ZerosValid {}
-
-#[cfg(feature = "nightly")]
-unsafe impl ZerosValid for .. {}
-
-macro_rules! zeros_valid { ($( $T:ty )*) => ($(
-    unsafe impl ZerosValid for $T {}
-)*)}
-
-zeros_valid!(u8 u16 u32 u64 usize);
-zeros_valid!(i8 i16 i32 i64 isize);
-
-unsafe impl ZerosValid for ::std::sync::atomic::AtomicUsize {}
-unsafe impl<T> ZerosValid for ::std::sync::atomic::AtomicPtr<T> {}
-
-impl<T: ZerosValid> CachePadded<T> {
-    /// A const fn equivalent to mem::zeroed().
-    #[cfg(not(feature = "nightly"))]
-    pub fn zeroed() -> CachePadded<T> {
-        CachePadded {
-            data: UnsafeCell::new(([0; CACHE_LINE])),
-            _marker: ([], marker::PhantomData),
-        }
-    }
-
-    /// A const fn equivalent to mem::zeroed().
-    #[cfg(feature = "nightly")]
-    pub const fn zeroed() -> CachePadded<T> {
-        CachePadded {
-            data: UnsafeCell::new(([0; CACHE_LINE])),
-            _marker: ([], marker::PhantomData),
-        }
-    }
-}
-
-#[inline]
-/// Assert that the size and alignment of `T` are consistent with `CachePadded<T>`.
-fn assert_valid<T>() {
-    assert!(mem::size_of::<T>() <= mem::size_of::<CachePadded<T>>());
-    assert!(mem::align_of::<T>() <= mem::align_of::<CachePadded<T>>());
-}
-
-impl<T> CachePadded<T> {
-    /// Wrap `t` with cacheline padding.
-    ///
-    /// **Warning**: the wrapped data is never dropped; move out using
-    /// `ptr:read` if you need to run dtors.
-    pub fn new(t: T) -> CachePadded<T> {
-        assert_valid::<T>();
-        let ret = CachePadded {
-            data: UnsafeCell::new(([0; CACHE_LINE])),
-            _marker: ([], marker::PhantomData),
-        };
-        unsafe {
-            let p: *mut T = mem::transmute(&ret.data);
-            ptr::write(p, t);
-        }
-        ret
-    }
-}
-
-impl<T> Deref for CachePadded<T> {
-    type Target = T;
-    fn deref(&self) -> &T {
-        assert_valid::<T>();
-        unsafe { mem::transmute(&self.data) }
-    }
-}
-
-impl<T> DerefMut for CachePadded<T> {
-    fn deref_mut(&mut self) -> &mut T {
-        assert_valid::<T>();
-        unsafe { mem::transmute(&mut self.data) }
-    }
-}
-
-// FIXME: support Drop by pulling out a version usable for statics
-/*
-impl<T> Drop for CachePadded<T> {
-    fn drop(&mut self) {
-        assert_valid::<T>();
-        let p: *mut T = mem::transmute(&self.data);
-        mem::drop(ptr::read(p));
-    }
-}
-*/
-
-#[cfg(test)]
-mod test {
-    use super::*;
-
-    #[test]
-    fn cache_padded_store_u64() {
-        let x: CachePadded<u64> = CachePadded::new(17);
-        assert_eq!(*x, 17);
-    }
-
-    #[test]
-    fn cache_padded_store_pair() {
-        let x: CachePadded<(u64, u64)> = CachePadded::new((17, 37));
-        assert_eq!(x.0, 17);
-        assert_eq!(x.1, 37);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/atomic.rs
+++ /dev/null
@@ -1,181 +0,0 @@
-use std::marker::PhantomData;
-use std::mem;
-use std::ptr;
-use std::sync::atomic::{self, Ordering};
-
-use super::{Owned, Shared, Guard};
-
-/// Like `std::sync::atomic::AtomicPtr`.
-///
-/// Provides atomic access to a (nullable) pointer of type `T`, interfacing with
-/// the `Owned` and `Shared` types.
-#[derive(Debug)]
-pub struct Atomic<T> {
-    ptr: atomic::AtomicPtr<T>,
-    _marker: PhantomData<*const ()>,
-}
-
-unsafe impl<T: Sync> Send for Atomic<T> {}
-unsafe impl<T: Sync> Sync for Atomic<T> {}
-
-fn opt_shared_into_raw<T>(val: Option<Shared<T>>) -> *mut T {
-    val.map(|p| p.as_raw()).unwrap_or(ptr::null_mut())
-}
-
-fn opt_owned_as_raw<T>(val: &Option<Owned<T>>) -> *mut T {
-    val.as_ref().map(Owned::as_raw).unwrap_or(ptr::null_mut())
-}
-
-fn opt_owned_into_raw<T>(val: Option<Owned<T>>) -> *mut T {
-    let ptr = val.as_ref().map(Owned::as_raw).unwrap_or(ptr::null_mut());
-    mem::forget(val);
-    ptr
-}
-
-impl<T> Atomic<T> {
-    /// Create a new, null atomic pointer.
-    #[cfg(feature = "nightly")]
-    pub const fn null() -> Atomic<T> {
-        Atomic {
-            ptr: atomic::AtomicPtr::new(0 as *mut _),
-            _marker: PhantomData
-        }
-    }
-
-    #[cfg(not(feature = "nightly"))]
-    pub fn null() -> Atomic<T> {
-        Atomic {
-            ptr: atomic::AtomicPtr::new(0 as *mut _),
-            _marker: PhantomData
-        }
-    }
-
-    /// Create a new atomic pointer
-    pub fn new(data: T) -> Atomic<T> {
-        Atomic {
-            ptr: atomic::AtomicPtr::new(Box::into_raw(Box::new(data))),
-            _marker: PhantomData
-        }
-    }
-
-    /// Do an atomic load with the given memory ordering.
-    ///
-    /// In order to perform the load, we must pass in a borrow of a
-    /// `Guard`. This is a way of guaranteeing that the thread has pinned the
-    /// epoch for the entire lifetime `'a`. In return, you get an optional
-    /// `Shared` pointer back (`None` if the `Atomic` is currently null), with
-    /// lifetime tied to the guard.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `ord` is `Release` or `AcqRel`.
-    pub fn load<'a>(&self, ord: Ordering, _: &'a Guard) -> Option<Shared<'a, T>> {
-        unsafe { Shared::from_raw(self.ptr.load(ord)) }
-    }
-
-    /// Do an atomic store with the given memory ordering.
-    ///
-    /// Transfers ownership of the given `Owned` pointer, if any. Since no
-    /// lifetime information is acquired, no `Guard` value is needed.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `ord` is `Acquire` or `AcqRel`.
-    pub fn store(&self, val: Option<Owned<T>>, ord: Ordering) {
-        self.ptr.store(opt_owned_into_raw(val), ord)
-    }
-
-    /// Do an atomic store with the given memory ordering, immediately yielding
-    /// a shared reference to the pointer that was stored.
-    ///
-    /// Transfers ownership of the given `Owned` pointer, yielding a `Shared`
-    /// reference to it. Since the reference is valid only for the curent epoch,
-    /// it's lifetime is tied to a `Guard` value.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `ord` is `Acquire` or `AcqRel`.
-    pub fn store_and_ref<'a>(&self, val: Owned<T>, ord: Ordering, _: &'a Guard)
-                             -> Shared<'a, T>
-    {
-        unsafe {
-            let shared = Shared::from_owned(val);
-            self.store_shared(Some(shared), ord);
-            shared
-        }
-    }
-
-    /// Do an atomic store of a `Shared` pointer with the given memory ordering.
-    ///
-    /// This operation does not require a guard, because it does not yield any
-    /// new information about the lifetime of a pointer.
-    ///
-    /// # Panics
-    ///
-    /// Panics if `ord` is `Acquire` or `AcqRel`.
-    pub fn store_shared(&self, val: Option<Shared<T>>, ord: Ordering) {
-        self.ptr.store(opt_shared_into_raw(val), ord)
-    }
-
-    /// Do a compare-and-set from a `Shared` to an `Owned` pointer with the
-    /// given memory ordering.
-    ///
-    /// As with `store`, this operation does not require a guard; it produces no new
-    /// lifetime information. The `Result` indicates whether the CAS succeeded; if
-    /// not, ownership of the `new` pointer is returned to the caller.
-    pub fn cas(&self, old: Option<Shared<T>>, new: Option<Owned<T>>, ord: Ordering)
-               -> Result<(), Option<Owned<T>>>
-    {
-        if self.ptr.compare_and_swap(opt_shared_into_raw(old),
-                                     opt_owned_as_raw(&new),
-                                     ord) == opt_shared_into_raw(old)
-        {
-            mem::forget(new);
-            Ok(())
-        } else {
-            Err(new)
-        }
-    }
-
-    /// Do a compare-and-set from a `Shared` to an `Owned` pointer with the
-    /// given memory ordering, immediatley acquiring a new `Shared` reference to
-    /// the previously-owned pointer if successful.
-    ///
-    /// This operation is analogous to `store_and_ref`.
-    pub fn cas_and_ref<'a>(&self, old: Option<Shared<T>>, new: Owned<T>,
-                           ord: Ordering, _: &'a Guard)
-                           -> Result<Shared<'a, T>, Owned<T>>
-    {
-        if self.ptr.compare_and_swap(opt_shared_into_raw(old), new.as_raw(), ord)
-            == opt_shared_into_raw(old)
-        {
-            Ok(unsafe { Shared::from_owned(new) })
-        } else {
-            Err(new)
-        }
-    }
-
-    /// Do a compare-and-set from a `Shared` to another `Shared` pointer with
-    /// the given memory ordering.
-    ///
-    /// The boolean return value is `true` when the CAS is successful.
-    pub fn cas_shared(&self, old: Option<Shared<T>>, new: Option<Shared<T>>, ord: Ordering)
-                      -> bool
-    {
-        self.ptr.compare_and_swap(opt_shared_into_raw(old),
-                                  opt_shared_into_raw(new),
-                                  ord) == opt_shared_into_raw(old)
-    }
-
-    /// Do an atomic swap with an `Owned` pointer with the given memory ordering.
-    pub fn swap<'a>(&self, new: Option<Owned<T>>, ord: Ordering, _: &'a Guard)
-                    -> Option<Shared<'a, T>> {
-        unsafe { Shared::from_raw(self.ptr.swap(opt_owned_into_raw(new), ord)) }
-    }
-
-    /// Do an atomic swap with a `Shared` pointer with the given memory ordering.
-    pub fn swap_shared<'a>(&self, new: Option<Shared<T>>, ord: Ordering, _: &'a Guard)
-                           -> Option<Shared<'a, T>> {
-        unsafe { Shared::from_raw(self.ptr.swap(opt_shared_into_raw(new), ord)) }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/garbage.rs
+++ /dev/null
@@ -1,144 +0,0 @@
-// Data structures for storing garbage to be freed later (once the
-// epochs have sufficiently advanced).
-//
-// In general, we try to manage the garbage thread locally whenever
-// possible. Each thread keep track of three bags of garbage. But if a
-// thread is exiting, these bags must be moved into the global garbage
-// bags.
-
-use std::ptr;
-use std::mem;
-use std::sync::atomic::AtomicPtr;
-use std::sync::atomic::Ordering::{Relaxed, Release, Acquire};
-
-use mem::ZerosValid;
-
-/// One item of garbage.
-///
-/// Stores enough information to do a deallocation.
-#[derive(Debug)]
-struct Item {
-    ptr: *mut u8,
-    free: unsafe fn(*mut u8),
-}
-
-/// A single, thread-local bag of garbage.
-#[derive(Debug)]
-pub struct Bag(Vec<Item>);
-
-impl Bag {
-    fn new() -> Bag {
-        Bag(vec![])
-    }
-
-    fn insert<T>(&mut self, elem: *mut T) {
-        let size = mem::size_of::<T>();
-        if size > 0 {
-            self.0.push(Item {
-                ptr: elem as *mut u8,
-                free: free::<T>,
-            })
-        }
-        unsafe fn free<T>(t: *mut u8) {
-            drop(Vec::from_raw_parts(t as *mut T, 0, 1));
-        }
-    }
-
-    fn len(&self) -> usize {
-        self.0.len()
-    }
-
-    /// Deallocate all garbage in the bag
-    pub unsafe fn collect(&mut self) {
-        let mut data = mem::replace(&mut self.0, Vec::new());
-        for item in data.iter() {
-            (item.free)(item.ptr);
-        }
-        data.truncate(0);
-        self.0 = data;
-    }
-}
-
-// needed because the bags store raw pointers.
-unsafe impl Send for Bag {}
-unsafe impl Sync for Bag {}
-
-/// A thread-local set of garbage bags.
-#[derive(Debug)]
-pub struct Local {
-    /// Garbage added at least one epoch behind the current local epoch
-    pub old: Bag,
-    /// Garbage added in the current local epoch or earlier
-    pub cur: Bag,
-    /// Garbage added in the current *global* epoch
-    pub new: Bag,
-}
-
-impl Local {
-    pub fn new() -> Local {
-        Local {
-            old: Bag::new(),
-            cur: Bag::new(),
-            new: Bag::new(),
-        }
-    }
-
-    pub fn insert<T>(&mut self, elem: *mut T) {
-        self.new.insert(elem)
-    }
-
-    /// Collect one epoch of garbage, rotating the local garbage bags.
-    pub unsafe fn collect(&mut self) {
-        let ret = self.old.collect();
-        mem::swap(&mut self.old, &mut self.cur);
-        mem::swap(&mut self.cur, &mut self.new);
-        ret
-    }
-
-    pub fn size(&self) -> usize {
-        self.old.len() + self.cur.len() + self.new.len()
-    }
-}
-
-/// A concurrent garbage bag, currently based on Treiber's stack.
-///
-/// The elements are themselves owned `Bag`s.
-#[derive(Debug)]
-pub struct ConcBag {
-    head: AtomicPtr<Node>,
-}
-
-unsafe impl ZerosValid for ConcBag {}
-
-#[derive(Debug)]
-struct Node {
-    data: Bag,
-    next: AtomicPtr<Node>,
-}
-
-impl ConcBag {
-    pub fn insert(&self, t: Bag){
-        let n = Box::into_raw(Box::new(
-            Node { data: t, next: AtomicPtr::new(ptr::null_mut()) }));
-        loop {
-            let head = self.head.load(Acquire);
-            unsafe { (*n).next.store(head, Relaxed) };
-            if self.head.compare_and_swap(head, n, Release) == head { break }
-        }
-    }
-
-    pub unsafe fn collect(&self) {
-        // check to avoid xchg instruction
-        // when no garbage exists
-        let mut head = self.head.load(Relaxed);
-        if head != ptr::null_mut() {
-            head = self.head.swap(ptr::null_mut(), Acquire);
-
-            while head != ptr::null_mut() {
-                let mut n = Box::from_raw(head);
-                n.data.collect();
-                head = n.next.load(Relaxed);
-            }
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/global.rs
+++ /dev/null
@@ -1,95 +0,0 @@
-// Definition of global epoch state. The `get` function is the way to
-// access this data externally (until const fn is stabilized...).
-
-use std::sync::atomic::AtomicUsize;
-
-use mem::CachePadded;
-use mem::epoch::garbage;
-use mem::epoch::participants::Participants;
-
-/// Global epoch state
-#[derive(Debug)]
-pub struct EpochState {
-    /// Current global epoch
-    pub epoch: CachePadded<AtomicUsize>,
-
-    // FIXME: move this into the `garbage` module, rationalize API
-    /// Global garbage bags
-    pub garbage: [CachePadded<garbage::ConcBag>; 3],
-
-    /// Participant list
-    pub participants: Participants,
-}
-
-unsafe impl Send for EpochState {}
-unsafe impl Sync for EpochState {}
-
-pub use self::imp::get;
-
-#[cfg(not(feature = "nightly"))]
-mod imp {
-    use std::mem;
-    use std::sync::atomic::{self, AtomicUsize};
-    use std::sync::atomic::Ordering::Relaxed;
-
-    use super::EpochState;
-    use mem::CachePadded;
-    use mem::epoch::participants::Participants;
-
-    impl EpochState {
-        fn new() -> EpochState {
-            EpochState {
-                epoch: CachePadded::zeroed(),
-                garbage: [CachePadded::zeroed(),
-                          CachePadded::zeroed(),
-                          CachePadded::zeroed()],
-                participants: Participants::new(),
-            }
-        }
-    }
-
-    static EPOCH: AtomicUsize = atomic::ATOMIC_USIZE_INIT;
-
-    pub fn get() -> &'static EpochState {
-        let mut addr = EPOCH.load(Relaxed);
-
-        if addr == 0 {
-            let boxed = Box::new(EpochState::new());
-            let raw = Box::into_raw(boxed);
-
-            addr = EPOCH.compare_and_swap(0, raw as usize, Relaxed);
-            if addr != 0 {
-                let boxed = unsafe { Box::from_raw(raw) };
-                mem::drop(boxed);
-            } else {
-                addr = raw as usize;
-            }
-        }
-
-        unsafe {
-            &*(addr as *mut EpochState)
-        }
-    }
-}
-
-#[cfg(feature = "nightly")]
-mod imp {
-    use super::EpochState;
-    use mem::CachePadded;
-    use mem::epoch::participants::Participants;
-
-    impl EpochState {
-        const fn new() -> EpochState {
-            EpochState {
-                epoch: CachePadded::zeroed(),
-                garbage: [CachePadded::zeroed(),
-                          CachePadded::zeroed(),
-                          CachePadded::zeroed()],
-                participants: Participants::new(),
-            }
-        }
-    }
-
-    static EPOCH: EpochState = EpochState::new();
-    pub fn get() -> &'static EpochState { &EPOCH }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/guard.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-use std::marker;
-
-use super::{local, Shared};
-
-/// An RAII-style guard for pinning the current epoch.
-///
-/// A guard must be acquired before most operations on an `Atomic` pointer. On
-/// destruction, it unpins the epoch.
-#[must_use]
-#[derive(Debug)]
-pub struct Guard {
-    _marker: marker::PhantomData<*mut ()>, // !Send and !Sync
-}
-
-/// Pin the current epoch.
-///
-/// Threads generally pin before interacting with a lock-free data
-/// structure. Pinning requires a full memory barrier, so is somewhat
-/// expensive. It is rentrant -- you can safely acquire nested guards, and only
-/// the first guard requires a barrier. Thus, in cases where you expect to
-/// perform several lock-free operations in quick succession, you may consider
-/// pinning around the entire set of operations.
-pub fn pin() -> Guard {
-    local::with_participant(|p| {
-        p.enter();
-
-        let g = Guard {
-            _marker: marker::PhantomData,
-        };
-
-        if p.should_gc() {
-            p.try_collect(&g);
-        }
-
-        g
-    })
-}
-
-impl Guard {
-    /// Assert that the value is no longer reachable from a lock-free data
-    /// structure and should be collected when sufficient epochs have passed.
-    pub unsafe fn unlinked<T>(&self, val: Shared<T>) {
-        local::with_participant(|p| p.reclaim(val.as_raw()))
-    }
-
-    /// Move the thread-local garbage into the global set of garbage.
-    pub fn migrate_garbage(&self) {
-        local::with_participant(|p| p.migrate_garbage())
-    }
-}
-
-impl Drop for Guard {
-    fn drop(&mut self) {
-        local::with_participant(|p| p.exit());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/local.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Manage the thread-local state, providing access to a `Participant` record.
-
-use std::sync::atomic::Ordering::Relaxed;
-
-use mem::epoch::participant::Participant;
-use mem::epoch::global;
-
-#[derive(Debug)]
-struct LocalEpoch {
-    participant: *const Participant,
-}
-
-impl LocalEpoch {
-    fn new() -> LocalEpoch {
-        LocalEpoch { participant: global::get().participants.enroll() }
-    }
-
-    fn get(&self) -> &Participant {
-        unsafe { &*self.participant }
-    }
-}
-
-// FIXME: avoid leaking when all threads have exited
-impl Drop for LocalEpoch {
-    fn drop(&mut self) {
-        let p = self.get();
-        p.enter();
-        p.migrate_garbage();
-        p.exit();
-        p.active.store(false, Relaxed);
-    }
-}
-
-thread_local!(static LOCAL_EPOCH: LocalEpoch = LocalEpoch::new() );
-
-pub fn with_participant<F, T>(f: F) -> T where F: FnOnce(&Participant) -> T {
-    LOCAL_EPOCH.with(|e| f(e.get()))
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/mod.rs
+++ /dev/null
@@ -1,265 +0,0 @@
-//! Epoch-based memory management
-//!
-//! This module provides fast, easy to use memory management for lock free data
-//! structures. It's inspired by [Keir Fraser's *epoch-based
-//! reclamation*](https://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-579.pdf).
-//!
-//! The basic problem this is solving is the fact that when one thread has
-//! removed a node from a data structure, other threads may still have pointers
-//! to that node (in the form of snapshots that will be validated through things
-//! like compare-and-swap), so the memory cannot be immediately freed. Put differently:
-//!
-//! 1. There are two sources of reachability at play -- the data structure, and
-//! the snapshots in threads accessing it. Before we delete a node, we need to know
-//! that it cannot be reached in either of these ways.
-//!
-//! 2. Once a node has been unliked from the data structure, no *new* snapshots
-//! reaching it will be created.
-//!
-//! Using the epoch scheme is fairly straightforward, and does not require
-//! understanding any of the implementation details:
-//!
-//! - When operating on a shared data structure, a thread must "pin the current
-//! epoch", which is done by calling `pin()`. This function returns a `Guard`
-//! which unpins the epoch when destroyed.
-//!
-//! - When the thread subsequently reads from a lock-free data structure, the
-//! pointers it extracts act like references with lifetime tied to the
-//! `Guard`. This allows threads to safely read from snapshotted data, being
-//! guaranteed that the data will remain allocated until they exit the epoch.
-//!
-//! To put the `Guard` to use, Crossbeam provides a set of three pointer types meant to work together:
-//!
-//! - `Owned<T>`, akin to `Box<T>`, which points to uniquely-owned data that has
-//!   not yet been published in a concurrent data structure.
-//!
-//! - `Shared<'a, T>`, akin to `&'a T`, which points to shared data that may or may
-//!   not be reachable from a data structure, but it guaranteed not to be freed
-//!   during lifetime `'a`.
-//!
-//! - `Atomic<T>`, akin to `std::sync::atomic::AtomicPtr`, which provides atomic
-//!   updates to a pointer using the `Owned` and `Shared` types, and connects them
-//!   to a `Guard`.
-//!
-//! Each of these types provides further documentation on usage.
-//!
-//! # Example
-//!
-//! ```
-//! use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
-//! use std::ptr;
-//!
-//! use crossbeam::mem::epoch::{self, Atomic, Owned};
-//!
-//! struct TreiberStack<T> {
-//!     head: Atomic<Node<T>>,
-//! }
-//!
-//! struct Node<T> {
-//!     data: T,
-//!     next: Atomic<Node<T>>,
-//! }
-//!
-//! impl<T> TreiberStack<T> {
-//!     fn new() -> TreiberStack<T> {
-//!         TreiberStack {
-//!             head: Atomic::null()
-//!         }
-//!     }
-//!
-//!     fn push(&self, t: T) {
-//!         // allocate the node via Owned
-//!         let mut n = Owned::new(Node {
-//!             data: t,
-//!             next: Atomic::null(),
-//!         });
-//!
-//!         // become active
-//!         let guard = epoch::pin();
-//!
-//!         loop {
-//!             // snapshot current head
-//!             let head = self.head.load(Relaxed, &guard);
-//!
-//!             // update `next` pointer with snapshot
-//!             n.next.store_shared(head, Relaxed);
-//!
-//!             // if snapshot is still good, link in the new node
-//!             match self.head.cas_and_ref(head, n, Release, &guard) {
-//!                 Ok(_) => return,
-//!                 Err(owned) => n = owned,
-//!             }
-//!         }
-//!     }
-//!
-//!     fn pop(&self) -> Option<T> {
-//!         // become active
-//!         let guard = epoch::pin();
-//!
-//!         loop {
-//!             // take a snapshot
-//!             match self.head.load(Acquire, &guard) {
-//!                 // the stack is non-empty
-//!                 Some(head) => {
-//!                     // read through the snapshot, *safely*!
-//!                     let next = head.next.load(Relaxed, &guard);
-//!
-//!                     // if snapshot is still good, update from `head` to `next`
-//!                     if self.head.cas_shared(Some(head), next, Release) {
-//!                         unsafe {
-//!                             // mark the node as unlinked
-//!                             guard.unlinked(head);
-//!
-//!                             // extract out the data from the now-unlinked node
-//!                             return Some(ptr::read(&(*head).data))
-//!                         }
-//!                     }
-//!                 }
-//!
-//!                 // we observed the stack empty
-//!                 None => return None
-//!             }
-//!         }
-//!     }
-//! }
-//! ```
-
-// FIXME: document implementation details
-
-mod atomic;
-mod garbage;
-mod global;
-mod guard;
-mod local;
-mod participant;
-mod participants;
-
-pub use self::atomic::Atomic;
-pub use self::guard::{pin, Guard};
-
-use std::ops::{Deref, DerefMut};
-use std::ptr;
-use std::mem;
-
-/// Like `Box<T>`: an owned, heap-allocated data value of type `T`.
-#[derive(Debug)]
-pub struct Owned<T> {
-    data: Box<T>,
-}
-
-impl<T> Owned<T> {
-    /// Move `t` to a new heap allocation.
-    pub fn new(t: T) -> Owned<T> {
-        Owned { data: Box::new(t) }
-    }
-
-    fn as_raw(&self) -> *mut T {
-        self.deref() as *const _ as *mut _
-    }
-
-    /// Move data out of the owned box, deallocating the box.
-    pub fn into_inner(self) -> T {
-        *self.data
-    }
-}
-
-impl<T> Deref for Owned<T> {
-    type Target = T;
-    fn deref(&self) -> &T {
-        &self.data
-    }
-}
-
-impl<T> DerefMut for Owned<T> {
-    fn deref_mut(&mut self) -> &mut T {
-        &mut self.data
-    }
-}
-
-#[derive(PartialEq, Eq)]
-/// Like `&'a T`: a shared reference valid for lifetime `'a`.
-#[derive(Debug)]
-pub struct Shared<'a, T: 'a> {
-    data: &'a T,
-}
-
-impl<'a, T> Copy for Shared<'a, T> {}
-impl<'a, T> Clone for Shared<'a, T> {
-    fn clone(&self) -> Shared<'a, T> {
-        Shared { data: self.data }
-    }
-}
-
-impl<'a, T> Deref for Shared<'a, T> {
-    type Target = &'a T;
-    fn deref(&self) -> &&'a T {
-        &self.data
-    }
-}
-
-impl<'a, T> Shared<'a, T> {
-    unsafe fn from_raw(raw: *mut T) -> Option<Shared<'a, T>> {
-        if raw == ptr::null_mut() { None }
-        else {
-            Some(Shared {
-                data: mem::transmute::<*mut T, &T>(raw)
-            })
-        }
-    }
-
-    unsafe fn from_ref(r: &T) -> Shared<'a, T> {
-        Shared { data: mem::transmute(r) }
-    }
-
-    unsafe fn from_owned(owned: Owned<T>) -> Shared<'a, T> {
-        let ret = Shared::from_ref(owned.deref());
-        mem::forget(owned);
-        ret
-    }
-
-    pub fn as_raw(&self) -> *mut T {
-        self.data as *const _ as *mut _
-    }
-}
-
-
-#[cfg(test)]
-mod test {
-    use std::sync::atomic::Ordering;
-    use super::*;
-    use mem::epoch;
-
-    #[test]
-    fn test_no_drop() {
-        static mut DROPS: i32 = 0;
-        struct Test;
-        impl Drop for Test {
-            fn drop(&mut self) {
-                unsafe {
-                    DROPS += 1;
-                }
-            }
-        }
-        let g = pin();
-
-        let x = Atomic::null();
-        x.store(Some(Owned::new(Test)), Ordering::Relaxed);
-        x.store_and_ref(Owned::new(Test), Ordering::Relaxed, &g);
-        let y = x.load(Ordering::Relaxed, &g);
-        let z = x.cas_and_ref(y, Owned::new(Test), Ordering::Relaxed, &g).ok();
-        let _ = x.cas(z, Some(Owned::new(Test)), Ordering::Relaxed);
-        x.swap(Some(Owned::new(Test)), Ordering::Relaxed, &g);
-
-        unsafe {
-            assert_eq!(DROPS, 0);
-        }
-    }
-
-    #[test]
-    fn test_new() {
-        let guard = epoch::pin();
-        let my_atomic = Atomic::new(42);
-
-        assert_eq!(**my_atomic.load(Ordering::Relaxed, &guard).unwrap(), 42);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/participant.rs
+++ /dev/null
@@ -1,133 +0,0 @@
-// Manages a single participant in the epoch scheme. This is where all
-// of the actual epoch management logic happens!
-
-use std::mem;
-use std::cell::UnsafeCell;
-use std::fmt;
-use std::sync::atomic::{self, AtomicUsize, AtomicBool};
-use std::sync::atomic::Ordering::{Relaxed, Acquire, Release, SeqCst};
-
-use mem::epoch::{Atomic, Guard, garbage, global};
-use mem::epoch::participants::ParticipantNode;
-
-/// Thread-local data for epoch participation.
-pub struct Participant {
-    /// The local epoch.
-    epoch: AtomicUsize,
-
-    /// Number of pending uses of `epoch::pin()`; keeping a count allows for
-    /// reentrant use of epoch management.
-    in_critical: AtomicUsize,
-
-    /// Thread-local garbage tracking
-    garbage: UnsafeCell<garbage::Local>,
-
-    /// Is the thread still active? Becomes `false` when the thread exits. This
-    /// is ultimately used to free `Participant` records.
-    pub active: AtomicBool,
-
-    /// The participant list is coded intrusively; here's the `next` pointer.
-    pub next: Atomic<ParticipantNode>,
-}
-
-impl fmt::Debug for Participant {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Participant {{ ... }}")
-    }
-}
-
-unsafe impl Sync for Participant {}
-
-const GC_THRESH: usize = 32;
-
-impl Participant {
-    pub fn new() -> Participant {
-        Participant {
-            epoch: AtomicUsize::new(0),
-            in_critical: AtomicUsize::new(0),
-            active: AtomicBool::new(true),
-            garbage: UnsafeCell::new(garbage::Local::new()),
-            next: Atomic::null(),
-        }
-    }
-
-    /// Enter a critical section.
-    ///
-    /// This method is reentrant, allowing for nested critical sections.
-    ///
-    /// Returns `true` is this is the first entry on the stack (as opposed to a
-    /// re-entrant call).
-    pub fn enter(&self) -> bool {
-        let new_count = self.in_critical.load(Relaxed) + 1;
-        self.in_critical.store(new_count, Relaxed);
-        if new_count > 1 { return false }
-
-        atomic::fence(SeqCst);
-
-        let global_epoch = global::get().epoch.load(Relaxed);
-        if global_epoch != self.epoch.load(Relaxed) {
-            self.epoch.store(global_epoch, Relaxed);
-            unsafe { (*self.garbage.get()).collect(); }
-        }
-
-        true
-    }
-
-    /// Exit the current (nested) critical section.
-    pub fn exit(&self) {
-        let new_count = self.in_critical.load(Relaxed) - 1;
-        self.in_critical.store(
-            new_count,
-            if new_count > 0 { Relaxed } else { Release });
-    }
-
-    /// Begin the reclamation process for a piece of data.
-    pub unsafe fn reclaim<T>(&self, data: *mut T) {
-        (*self.garbage.get()).insert(data);
-    }
-
-    /// Attempt to collect garbage by moving the global epoch forward.
-    ///
-    /// Returns `true` on success.
-    pub fn try_collect(&self, guard: &Guard) -> bool {
-        let cur_epoch = global::get().epoch.load(SeqCst);
-
-        for p in global::get().participants.iter(guard) {
-            if p.in_critical.load(Relaxed) > 0 && p.epoch.load(Relaxed) != cur_epoch {
-                return false
-            }
-        }
-
-        let new_epoch = cur_epoch.wrapping_add(1);
-        atomic::fence(Acquire);
-        if global::get().epoch.compare_and_swap(cur_epoch, new_epoch, SeqCst) != cur_epoch {
-            return false
-        }
-
-        unsafe {
-            (*self.garbage.get()).collect();
-            global::get().garbage[new_epoch.wrapping_add(1) % 3].collect();
-        }
-        self.epoch.store(new_epoch, Release);
-
-        true
-    }
-
-    /// Move the current thread-local garbage into the global garbage bags.
-    pub fn migrate_garbage(&self) {
-        let cur_epoch = self.epoch.load(Relaxed);
-        let local = unsafe { mem::replace(&mut *self.garbage.get(), garbage::Local::new()) };
-        global::get().garbage[cur_epoch.wrapping_sub(1) % 3].insert(local.old);
-        global::get().garbage[cur_epoch % 3].insert(local.cur);
-        global::get().garbage[global::get().epoch.load(Relaxed) % 3].insert(local.new);
-    }
-
-    /// How much garbage is this participant currently storing?
-    pub fn garbage_size(&self) -> usize {
-        unsafe { (*self.garbage.get()).size() }
-    }
-    /// Is this participant past its local GC threshhold?
-    pub fn should_gc(&self) -> bool {
-        self.garbage_size() >= GC_THRESH
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/epoch/participants.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-// Manages the global participant list, which is an intrustive list in
-// which items are lazily removed on traversal (after being
-// "logically" deleted by becoming inactive.)
-
-use std::mem;
-use std::ops::{Deref, DerefMut};
-use std::sync::atomic::Ordering::{Relaxed, Acquire, Release};
-
-use mem::epoch::{Atomic, Owned, Guard};
-use mem::epoch::participant::Participant;
-use mem::CachePadded;
-
-/// Global, threadsafe list of threads participating in epoch management.
-#[derive(Debug)]
-pub struct Participants {
-    head: Atomic<ParticipantNode>
-}
-
-#[derive(Debug)]
-pub struct ParticipantNode(CachePadded<Participant>);
-
-impl ParticipantNode {
-    pub fn new() -> ParticipantNode {
-        ParticipantNode(CachePadded::new(Participant::new()))
-    }
-}
-
-impl Deref for ParticipantNode {
-    type Target = Participant;
-    fn deref(&self) -> &Participant {
-        &self.0
-    }
-}
-
-impl DerefMut for ParticipantNode {
-    fn deref_mut(&mut self) -> &mut Participant {
-        &mut self.0
-    }
-}
-
-impl Participants {
-    #[cfg(not(feature = "nightly"))]
-    pub fn new() -> Participants {
-        Participants { head: Atomic::null() }
-    }
-
-    #[cfg(feature = "nightly")]
-    pub const fn new() -> Participants {
-        Participants { head: Atomic::null() }
-    }
-
-    /// Enroll a new thread in epoch management by adding a new `Particpant`
-    /// record to the global list.
-    pub fn enroll(&self) -> *const Participant {
-        let mut participant = Owned::new(ParticipantNode::new());
-
-        // we ultimately use epoch tracking to free Participant nodes, but we
-        // can't actually enter an epoch here, so fake it; we know the node
-        // can't be removed until marked inactive anyway.
-        let fake_guard = ();
-        let g: &'static Guard = unsafe { mem::transmute(&fake_guard) };
-        loop {
-            let head = self.head.load(Relaxed, g);
-            participant.next.store_shared(head, Relaxed);
-            match self.head.cas_and_ref(head, participant, Release, g) {
-                Ok(shared) => {
-                    let shared: &Participant = &shared;
-                    return shared;
-                }
-                Err(owned) => {
-                    participant = owned;
-                }
-            }
-        }
-    }
-
-    pub fn iter<'a>(&'a self, g: &'a Guard) -> Iter<'a> {
-        Iter {
-            guard: g,
-            next: &self.head,
-            needs_acq: true,
-        }
-    }
-}
-
-#[derive(Debug)]
-pub struct Iter<'a> {
-    // pin to an epoch so that we can free inactive nodes
-    guard: &'a Guard,
-    next: &'a Atomic<ParticipantNode>,
-
-    // an Acquire read is needed only for the first read, due to release
-    // sequences
-    needs_acq: bool,
-}
-
-impl<'a> Iterator for Iter<'a> {
-    type Item = &'a Participant;
-    fn next(&mut self) -> Option<&'a Participant> {
-        let mut cur = if self.needs_acq {
-            self.needs_acq = false;
-            self.next.load(Acquire, self.guard)
-        } else {
-            self.next.load(Relaxed, self.guard)
-        };
-
-        while let Some(n) = cur {
-            // attempt to clean up inactive nodes
-            if !n.active.load(Relaxed) {
-                cur = n.next.load(Relaxed, self.guard);
-                // TODO: actually reclaim inactive participants!
-            } else {
-                self.next = &n.next;
-                return Some(&n)
-            }
-        }
-
-        None
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/mem/mod.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-//! Memory management for concurrent data structures
-//!
-//! At the moment, the only memory management scheme is epoch-based reclamation,
-//! found in the `epoch` submodule.
-
-pub use self::cache_padded::{CachePadded, ZerosValid};
-
-pub mod epoch;
-mod cache_padded;
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/scoped.rs
+++ /dev/null
@@ -1,275 +0,0 @@
-use std::cell::RefCell;
-use std::fmt;
-use std::mem;
-use std::rc::Rc;
-use std::sync::atomic::Ordering;
-use std::sync::Arc;
-use std::thread;
-
-use {spawn_unsafe, FnBox};
-use sync::AtomicOption;
-
-pub struct Scope<'a> {
-    dtors: RefCell<Option<DtorChain<'a>>>
-}
-
-struct DtorChain<'a> {
-    dtor: Box<FnBox + 'a>,
-    next: Option<Box<DtorChain<'a>>>
-}
-
-enum JoinState {
-    Running(thread::JoinHandle<()>),
-    Joined,
-}
-
-impl JoinState {
-    fn join(&mut self) {
-        let mut state = JoinState::Joined;
-        mem::swap(self, &mut state);
-        if let JoinState::Running(handle) = state {
-            let res = handle.join();
-
-            if !thread::panicking() { res.unwrap(); }
-        }
-    }
-}
-
-/// A handle to a scoped thread
-pub struct ScopedJoinHandle<T> {
-    inner: Rc<RefCell<JoinState>>,
-    packet: Arc<AtomicOption<T>>,
-    thread: thread::Thread,
-}
-
-/// Create a new `scope`, for deferred destructors.
-///
-/// Scopes, in particular, support [*scoped thread spawning*](struct.Scope.html#method.spawn).
-///
-/// # Examples
-///
-/// Creating and using a scope:
-///
-/// ```
-/// crossbeam::scope(|scope| {
-///     scope.defer(|| println!("Exiting scope"));
-///     scope.spawn(|| println!("Running child thread in scope"))
-/// });
-/// // Prints messages in the reverse order written
-/// ```
-pub fn scope<'a, F, R>(f: F) -> R where F: FnOnce(&Scope<'a>) -> R {
-    let mut scope = Scope { dtors: RefCell::new(None) };
-    let ret = f(&scope);
-    scope.drop_all();
-    ret
-}
-
-impl<'a> fmt::Debug for Scope<'a> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Scope {{ ... }}")
-    }
-}
-
-impl<T> fmt::Debug for ScopedJoinHandle<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "ScopedJoinHandle {{ ... }}")
-    }
-}
-
-impl<'a> Scope<'a> {
-    // This method is carefully written in a transactional style, so
-    // that it can be called directly and, if any dtor panics, can be
-    // resumed in the unwinding this causes. By initially running the
-    // method outside of any destructor, we avoid any leakage problems
-    // due to @rust-lang/rust#14875.
-    fn drop_all(&mut self) {
-        loop {
-            // use a separate scope to ensure that the RefCell borrow
-            // is relinquishe before running `dtor`
-            let dtor = {
-                let mut dtors = self.dtors.borrow_mut();
-                if let Some(mut node) = dtors.take() {
-                    *dtors = node.next.take().map(|b| *b);
-                    node.dtor
-                } else {
-                    return
-                }
-            };
-            dtor.call_box()
-        }
-    }
-
-    /// Schedule code to be executed when exiting the scope.
-    ///
-    /// This is akin to having a destructor on the stack, except that it is
-    /// *guaranteed* to be run.
-    pub fn defer<F>(&self, f: F) where F: FnOnce() + 'a {
-        let mut dtors = self.dtors.borrow_mut();
-        *dtors = Some(DtorChain {
-            dtor: Box::new(f),
-            next: dtors.take().map(Box::new)
-        });
-    }
-
-    /// Create a scoped thread.
-    ///
-    /// `spawn` is similar to the [`spawn`][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.
-    ///
-    /// [spawn]: http://doc.rust-lang.org/std/thread/fn.spawn.html
-    ///
-    /// # Examples
-    ///
-    /// A basic scoped thread:
-    ///
-    /// ```
-    /// crossbeam::scope(|scope| {
-    ///     scope.spawn(|| {
-    ///         println!("Hello from a scoped thread!");
-    ///     });
-    /// });
-    /// ```
-    ///
-    /// When writing concurrent Rust programs, you'll sometimes see a pattern like this, using
-    /// [`std::thread::spawn`][spawn]:
-    ///
-    /// ```ignore
-    /// let array = [1, 2, 3];
-    /// let mut guards = vec![];
-    ///
-    /// for i in &array {
-    ///     let guard = std::thread::spawn(move || {
-    ///         println!("element: {}", i);
-    ///     });
-    ///
-    ///     guards.push(guard);
-    /// }
-    ///
-    /// for guard in guards {
-    ///     guard.join().unwrap();
-    /// }
-    /// ```
-    ///
-    /// The basic pattern is:
-    ///
-    /// 1. Iterate over some collection.
-    /// 2. Spin up a thread to operate on each part of the collection.
-    /// 3. Join all the threads.
-    ///
-    /// However, this code actually gives an error:
-    ///
-    /// ```text
-    /// error: `array` does not live long enough
-    /// for i in &array {
-    ///           ^~~~~
-    /// in expansion of for loop expansion
-    /// note: expansion site
-    /// note: reference must be valid for the static lifetime...
-    /// note: ...but borrowed value is only valid for the block suffix following statement 0 at ...
-    ///     let array = [1, 2, 3];
-    ///     let mut guards = vec![];
-    ///
-    ///     for i in &array {
-    ///         let guard = std::thread::spawn(move || {
-    ///             println!("element: {}", i);
-    /// ...
-    /// error: aborting due to previous error
-    /// ```
-    ///
-    /// Because [`std::thread::spawn`][spawn] doesn't know about this scope, it requires a
-    /// `'static` lifetime. One way of giving it a proper lifetime is to use an [`Arc`][arc]:
-    ///
-    /// [arc]: http://doc.rust-lang.org/stable/std/sync/struct.Arc.html
-    ///
-    /// ```
-    /// use std::sync::Arc;
-    ///
-    /// let array = Arc::new([1, 2, 3]);
-    /// let mut guards = vec![];
-    ///
-    /// for i in (0..array.len()) {
-    ///     let a = array.clone();
-    ///
-    ///     let guard = std::thread::spawn(move || {
-    ///         println!("element: {}", a[i]);
-    ///     });
-    ///
-    ///     guards.push(guard);
-    /// }
-    ///
-    /// for guard in guards {
-    ///     guard.join().unwrap();
-    /// }
-    /// ```
-    ///
-    /// But this introduces unnecessary allocation, as `Arc<T>` puts its data on the heap, and we
-    /// also end up dealing with reference counts. We know that we're joining the threads before
-    /// our function returns, so just taking a reference _should_ be safe. Rust can't know that,
-    /// though.
-    ///
-    /// Enter scoped threads. Here's our original example, using `spawn` from crossbeam rather
-    /// than from `std::thread`:
-    ///
-    /// ```
-    /// let array = [1, 2, 3];
-    ///
-    /// crossbeam::scope(|scope| {
-    ///     for i in &array {
-    ///         scope.spawn(move || {
-    ///             println!("element: {}", i);
-    ///         });
-    ///     }
-    /// });
-    /// ```
-    ///
-    /// Much more straightforward.
-    pub fn spawn<F, T>(&self, f: F) -> ScopedJoinHandle<T> where
-        F: FnOnce() -> T + Send + 'a, T: Send + 'a
-    {
-        let their_packet = Arc::new(AtomicOption::new());
-        let my_packet = their_packet.clone();
-
-        let join_handle = unsafe {
-            spawn_unsafe(move || {
-                their_packet.swap(f(), Ordering::Relaxed);
-            })
-        };
-
-        let thread = join_handle.thread().clone();
-        let deferred_handle = Rc::new(RefCell::new(JoinState::Running(join_handle)));
-        let my_handle = deferred_handle.clone();
-
-        self.defer(move || {
-            let mut state = deferred_handle.borrow_mut();
-            state.join();
-        });
-
-        ScopedJoinHandle {
-            inner: my_handle,
-            packet: my_packet,
-            thread: thread,
-        }
-    }
-}
-
-impl<T> ScopedJoinHandle<T> {
-    /// Join the scoped thread, returning the result it produced.
-    pub fn join(self) -> T {
-        self.inner.borrow_mut().join();
-        self.packet.take(Ordering::Relaxed).unwrap()
-    }
-
-    /// Get the underlying thread handle.
-    pub fn thread(&self) -> &thread::Thread {
-        &self.thread
-    }
-}
-
-impl<'a> Drop for Scope<'a> {
-    fn drop(&mut self) {
-        self.drop_all()
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/arc_cell.rs
+++ /dev/null
@@ -1,90 +0,0 @@
-use std::marker::PhantomData;
-use std::mem;
-use std::sync::Arc;
-use std::sync::atomic::{AtomicUsize, Ordering};
-
-/// A type providing atomic storage and retrieval of an `Arc<T>`.
-#[derive(Debug)]
-pub struct ArcCell<T>(AtomicUsize, PhantomData<Arc<T>>);
-
-impl<T> Drop for ArcCell<T> {
-    fn drop(&mut self) {
-        self.take();
-    }
-}
-
-impl<T> ArcCell<T> {
-    /// Creates a new `ArcCell`.
-    pub fn new(t: Arc<T>) -> ArcCell<T> {
-        ArcCell(AtomicUsize::new(unsafe { mem::transmute(t) }), PhantomData)
-    }
-
-    fn take(&self) -> Arc<T> {
-        loop {
-            match self.0.swap(0, Ordering::Acquire) {
-                0 => {}
-                n => return unsafe { mem::transmute(n) }
-            }
-        }
-    }
-
-    fn put(&self, t: Arc<T>) {
-        debug_assert_eq!(self.0.load(Ordering::SeqCst), 0);
-        self.0.store(unsafe { mem::transmute(t) }, Ordering::Release);
-    }
-
-    /// Stores a new value in the `ArcCell`, returning the previous
-    /// value.
-    pub fn set(&self, t: Arc<T>) -> Arc<T> {
-        let old = self.take();
-        self.put(t);
-        old
-    }
-
-    /// Returns a copy of the value stored by the `ArcCell`.
-    pub fn get(&self) -> Arc<T> {
-        let t = self.take();
-        // NB: correctness here depends on Arc's clone impl not panicking
-        let out = t.clone();
-        self.put(t);
-        out
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use std::sync::Arc;
-    use std::sync::atomic::{ATOMIC_USIZE_INIT, AtomicUsize, Ordering};
-
-    use super::*;
-
-    #[test]
-    fn basic() {
-        let r = ArcCell::new(Arc::new(0));
-        assert_eq!(*r.get(), 0);
-        assert_eq!(*r.set(Arc::new(1)), 0);
-        assert_eq!(*r.get(), 1);
-    }
-
-    #[test]
-    fn drop_runs() {
-        static DROPS: AtomicUsize = ATOMIC_USIZE_INIT;
-
-        struct Foo;
-
-        impl Drop for Foo {
-            fn drop(&mut self) {
-                DROPS.fetch_add(1, Ordering::SeqCst);
-            }
-        }
-
-        let r = ArcCell::new(Arc::new(Foo));
-        let _f = r.get();
-        r.get();
-        r.set(Arc::new(Foo));
-        drop(_f);
-        assert_eq!(DROPS.load(Ordering::SeqCst), 1);
-        drop(r);
-        assert_eq!(DROPS.load(Ordering::SeqCst), 2);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/atomic_option.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-use std::sync::atomic::{AtomicPtr, Ordering};
-use std::ptr;
-
-unsafe impl<T: Send> Send for AtomicOption<T> {}
-unsafe impl<T: Send> Sync for AtomicOption<T> {}
-
-#[derive(Debug)]
-pub struct AtomicOption<T> {
-    inner: AtomicPtr<T>,
-}
-
-impl<T> AtomicOption<T> {
-    pub fn new() -> AtomicOption<T> {
-        AtomicOption { inner: AtomicPtr::new(ptr::null_mut()) }
-    }
-
-    fn swap_inner(&self, ptr: *mut T, order: Ordering) -> Option<Box<T>> {
-        let old = self.inner.swap(ptr, order);
-        if old.is_null() {
-            None
-        } else {
-            Some(unsafe { Box::from_raw(old) })
-        }
-    }
-
-    // allows re-use of allocation
-    pub fn swap_box(&self, t: Box<T>, order: Ordering) -> Option<Box<T>> {
-        self.swap_inner(Box::into_raw(t), order)
-    }
-
-    pub fn swap(&self, t: T, order: Ordering) -> Option<T> {
-        self.swap_box(Box::new(t), order).map(|old| *old)
-    }
-
-    pub fn take(&self, order: Ordering) -> Option<T> {
-        self.swap_inner(ptr::null_mut(), order).map(|old| *old)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/chase_lev.rs
+++ /dev/null
@@ -1,602 +0,0 @@
-// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! A lock-free concurrent work-stealing deque
-//!
-//! This module contains a hybrid implementation of the Chase-Lev work stealing deque
-//! described in ["Dynamic Circular Work-Stealing Deque"][chase_lev] and the improved version
-//! described in ["Correct and Efficient Work-Stealing for Weak Memory Models"][weak_chase_lev].
-//! The implementation is heavily based on the pseudocode found in the papers.
-//!
-//! # Example
-//!
-//! ```
-//! use crossbeam::sync::chase_lev;
-//! let (mut worker, stealer) = chase_lev::deque();
-//!
-//! // Only the worker may push/try_pop
-//! worker.push(1);
-//! worker.try_pop();
-//!
-//! // Stealers take data from the other end of the deque
-//! worker.push(1);
-//! stealer.steal();
-//!
-//! // Stealers can be cloned to have many stealers stealing in parallel
-//! worker.push(1);
-//! let stealer2 = stealer.clone();
-//! stealer2.steal();
-//! ```
-//!
-//! [chase_lev]: http://neteril.org/~jeremie/Dynamic_Circular_Work_Queue.pdf
-//! [weak_chase_lev]: http://www.di.ens.fr/~zappa/readings/ppopp13.pdf
-
-use std::cell::UnsafeCell;
-use std::fmt;
-use std::mem;
-use std::ptr;
-use std::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst};
-use std::sync::atomic::{AtomicIsize, fence};
-use std::sync::Arc;
-
-use mem::epoch::{self, Atomic, Shared, Owned};
-
-// Once the queue is less than 1/K full, then it will be downsized. Note that
-// the deque requires that this number be less than 2.
-const K: isize = 4;
-
-// Minimum number of bits that a buffer size should be. No buffer will resize to
-// under this value, and all deques will initially contain a buffer of this
-// size.
-//
-// The size in question is 1 << MIN_BITS
-const MIN_BITS: u32 = 7;
-
-#[derive(Debug)]
-struct Deque<T> {
-    bottom: AtomicIsize,
-    top: AtomicIsize,
-    array: Atomic<Buffer<T>>,
-}
-
-// FIXME: can these constraints be relaxed?
-unsafe impl<T: Send> Send for Deque<T> {}
-unsafe impl<T: Send> Sync for Deque<T> {}
-
-/// Worker half of the work-stealing deque. This worker has exclusive access to
-/// one side of the deque, and uses `push` and `try_pop` method to manipulate it.
-///
-/// There may only be one worker per deque, and operations on the worker
-/// require mutable access to the worker itself.
-#[derive(Debug)]
-pub struct Worker<T> {
-    deque: Arc<Deque<T>>,
-}
-
-/// The stealing half of the work-stealing deque. Stealers have access to the
-/// opposite end of the deque from the worker, and they only have access to the
-/// `steal` method.
-///
-/// Stealers can be cloned to have more than one handle active at a time.
-#[derive(Debug)]
-pub struct Stealer<T> {
-    deque: Arc<Deque<T>>,
-}
-
-/// When stealing some data, this is an enumeration of the possible outcomes.
-#[derive(PartialEq, Eq, Debug)]
-pub enum Steal<T> {
-    /// The deque was empty at the time of stealing
-    Empty,
-    /// The stealer lost the race for stealing data, and a retry may return more
-    /// data.
-    Abort,
-    /// The stealer has successfully stolen some data.
-    Data(T),
-}
-
-// An internal buffer used by the chase-lev deque. This structure is actually
-// implemented as a circular buffer, and is used as the intermediate storage of
-// the data in the deque.
-//
-// This Vec<T> always has a length of 0, the backing buffer is just used by the
-// code below.
-struct Buffer<T> {
-    storage: UnsafeCell<Vec<T>>,
-    log_size: u32,
-}
-
-impl<T> fmt::Debug for Buffer<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Buffer {{ ... }}")
-    }
-}
-
-impl<T> Worker<T> {
-    /// Pushes data onto the front of this work queue.
-    pub fn push(&mut self, t: T) {
-        unsafe { self.deque.push(t) }
-    }
-
-    /// Pops data off the front of the work queue, returning `None` on an empty
-    /// queue.
-    pub fn try_pop(&mut self) -> Option<T> {
-        unsafe { self.deque.try_pop() }
-    }
-}
-
-impl<T> Stealer<T> {
-    /// Steals work off the end of the queue (opposite of the worker's end)
-    pub fn steal(&self) -> Steal<T> {
-        self.deque.steal()
-    }
-}
-
-impl<T> Clone for Stealer<T> {
-    fn clone(&self) -> Stealer<T> {
-        Stealer { deque: self.deque.clone() }
-    }
-}
-
-/// Creates a new empty deque
-pub fn deque<T>() -> (Worker<T>, Stealer<T>) {
-    let a = Arc::new(Deque::new());
-    let b = a.clone();
-    (Worker { deque: a }, Stealer { deque: b })
-}
-
-// Almost all of this code can be found directly in the paper so I'm not
-// personally going to heavily comment what's going on here.
-
-impl<T> Deque<T> {
-    fn new() -> Deque<T> {
-        let array = Atomic::null();
-        array.store(Some(Owned::new(Buffer::new(MIN_BITS))), SeqCst);
-        Deque {
-            bottom: AtomicIsize::new(0),
-            top: AtomicIsize::new(0),
-            array: array,
-        }
-    }
-
-    unsafe fn push(&self, data: T) {
-        let guard = epoch::pin();
-
-        let mut b = self.bottom.load(Relaxed);
-        let t = self.top.load(Acquire);
-        let mut a = self.array.load(Relaxed, &guard).unwrap();
-
-        let size = b - t;
-        if size >= (a.size() as isize) - 1 {
-            // You won't find this code in the chase-lev deque paper. This is
-            // alluded to in a small footnote, however. We always free a buffer
-            // when growing in order to prevent leaks.
-            a = self.swap_buffer(a, a.resize(b, t, 1), &guard);
-
-            // reload the bottom counter, since swap_buffer modifies it.
-            b = self.bottom.load(Relaxed);
-        }
-        a.put(b, data);
-        fence(Release);
-        self.bottom.store(b + 1, Relaxed);
-    }
-
-    unsafe fn try_pop(&self) -> Option<T> {
-        let guard = epoch::pin();
-
-        let b = self.bottom.load(Relaxed) - 1;
-        let a = self.array.load(Relaxed, &guard).unwrap();
-        self.bottom.store(b, Relaxed);
-        fence(SeqCst); // the store to bottom must occur before loading top.
-        let t = self.top.load(Relaxed);
-
-        let size = b - t;
-        if size >= 0 {
-            // non-empty case
-            let mut data = Some(a.get(b));
-            if size == 0 {
-                // last element in queue, check for races.
-                if self.top.compare_and_swap(t, t + 1, SeqCst) != t {
-                    // lost the race.
-                    mem::forget(data.take());
-                }
-
-                // set the queue to a canonically empty state.
-                self.bottom.store(b + 1, Relaxed);
-            } else {
-                self.maybe_shrink(b, t, &guard);
-            }
-            data
-        } else {
-            // empty queue. revert the decrement of "b" and try to shrink.
-            //
-            // the original chase_lev paper uses "t" here, but the new one uses "b + 1".
-            // don't worry, they're the same thing: pop and steal operations will never leave
-            // the top counter greater than the bottom counter. After we decrement "b" at
-            // the beginning of this function, the lowest possible value it could hold here is "t - 1".
-            // That's also the only value that could cause this branch to be taken.
-            self.bottom.store(b + 1, Relaxed);
-            None
-        }
-    }
-
-    fn steal(&self) -> Steal<T> {
-        let guard = epoch::pin();
-
-        let t = self.top.load(Acquire);
-        fence(SeqCst); // top must be loaded before bottom.
-        let b = self.bottom.load(Acquire);
-
-        let size = b - t;
-        if size <= 0 {
-            return Steal::Empty
-        }
-
-        unsafe {
-            // while the paper uses a "consume" ordering here, the closest thing we have
-            // available is Acquire, which is strictly stronger.
-            let a = self.array.load(Acquire, &guard).unwrap();
-            let data = a.get(t);
-            // we may be racing against other steals and a pop.
-            if self.top.compare_and_swap(t, t + 1, SeqCst) == t {
-                Steal::Data(data)
-            } else {
-                mem::forget(data); // someone else stole this value
-                Steal::Abort
-            }
-        }
-    }
-
-    // potentially shrink the array. This can be called only from the worker.
-    unsafe fn maybe_shrink(&self, b: isize, t: isize, guard: &epoch::Guard) {
-        let a = self.array.load(SeqCst, guard).unwrap();
-        let size = b - t;
-        if size < (a.size() as isize) / K && size > (1 << MIN_BITS) {
-            self.swap_buffer(a, a.resize(b, t, -1), guard);
-        }
-    }
-
-    // Helper routine not mentioned in the paper which is used in growing and
-    // shrinking buffers to swap in a new buffer into place.
-    //
-    // As a bit of a recap, stealers can continue using buffers after this
-    // method has called 'unlinked' on it. The continued usage is simply a read
-    // followed by a forget, but we must make sure that the memory can continue
-    // to be read after we flag this buffer for reclamation. All stealers,
-    // however, have their own epoch pinned during this time so the buffer will
-    // just naturally be free'd once all concurrent stealers have exited.
-    //
-    // This method may only be called safely from the workers due to the way it modifies
-    // the array pointer.
-    unsafe fn swap_buffer<'a>(&self,
-                              old: Shared<'a, Buffer<T>>,
-                              buf: Buffer<T>,
-                              guard: &'a epoch::Guard)
-                              -> Shared<'a, Buffer<T>> {
-        let newbuf = Owned::new(buf);
-        let newbuf = self.array.store_and_ref(newbuf, Release, &guard);
-        guard.unlinked(old);
-
-        newbuf
-    }
-}
-
-
-impl<T> Drop for Deque<T> {
-    fn drop(&mut self) {
-        let guard = epoch::pin();
-
-        // Arc enforces that we have truly exclusive access here.
-
-        let t = self.top.load(Relaxed);
-        let b = self.bottom.load(Relaxed);
-        let a = self.array.swap(None, Relaxed, &guard).unwrap();
-        // Free whatever is leftover in the dequeue, then free the backing
-        // memory itself
-        unsafe {
-            for i in t..b {
-                drop(a.get(i));
-            }
-            guard.unlinked(a);
-        }
-    }
-}
-
-impl<T> Buffer<T> {
-    fn new(log_size: u32) -> Buffer<T> {
-        Buffer {
-            storage: UnsafeCell::new(Vec::with_capacity(1 << log_size)),
-            log_size: log_size,
-        }
-    }
-
-    fn size(&self) -> usize {
-        unsafe { (*self.storage.get()).capacity() }
-    }
-
-    fn mask(&self) -> isize {
-        unsafe {
-            ((*self.storage.get()).capacity() - 1) as isize
-        }
-    }
-
-    unsafe fn elem(&self, i: isize) -> *mut T {
-        (*self.storage.get()).as_mut_ptr().offset(i & self.mask())
-    }
-
-    // This does not protect against loading duplicate values of the same cell,
-    // nor does this clear out the contents contained within. Hence, this is a
-    // very unsafe method which the caller needs to treat specially in case a
-    // race is lost.
-    unsafe fn get(&self, i: isize) -> T {
-        ptr::read(self.elem(i))
-    }
-
-    // Unsafe because this unsafely overwrites possibly uninitialized or
-    // initialized data.
-    unsafe fn put(&self, i: isize, t: T) {
-        ptr::write(self.elem(i), t);
-    }
-
-    // Again, unsafe because this has incredibly dubious ownership violations.
-    // It is assumed that this buffer is immediately dropped.
-    unsafe fn resize(&self, b: isize, t: isize, delta: i32) -> Buffer<T> {
-        let buf = Buffer::new(((self.log_size as i32) + delta) as u32);
-        for i in t..b {
-            buf.put(i, self.get(i));
-        }
-        return buf;
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    extern crate rand;
-
-    use super::{deque, Worker, Stealer, Steal};
-
-    use std::thread;
-    use std::sync::Arc;
-    use std::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT,
-                            AtomicUsize, ATOMIC_USIZE_INIT};
-    use std::sync::atomic::Ordering::SeqCst;
-
-    use self::rand::Rng;
-
-    #[test]
-    fn smoke() {
-        let (mut w, s) = deque();
-        assert_eq!(w.try_pop(), None);
-        assert_eq!(s.steal(), Steal::Empty);
-        w.push(1);
-        assert_eq!(w.try_pop(), Some(1));
-        w.push(1);
-        assert_eq!(s.steal(), Steal::Data(1));
-        w.push(1);
-        assert_eq!(s.clone().steal(), Steal::Data(1));
-    }
-
-    #[test]
-    fn stealpush() {
-        static AMT: isize = 100000;
-        let (mut w, s) = deque();
-        let t = thread::spawn(move || {
-            let mut left = AMT;
-            while left > 0 {
-                match s.steal() {
-                    Steal::Data(i) => {
-                        assert_eq!(i, 1);
-                        left -= 1;
-                    }
-                    Steal::Abort | Steal::Empty => {}
-                }
-            }
-        });
-
-        for _ in 0..AMT {
-            w.push(1);
-        }
-
-        t.join().unwrap();
-    }
-
-    #[test]
-    fn stealpush_large() {
-        static AMT: isize = 100000;
-        let (mut w, s) = deque();
-        let t = thread::spawn(move || {
-            let mut left = AMT;
-            while left > 0 {
-                match s.steal() {
-                    Steal::Data((1, 10)) => { left -= 1; }
-                    Steal::Data(..) => panic!(),
-                    Steal::Abort | Steal::Empty => {}
-                }
-            }
-        });
-
-        for _ in 0..AMT {
-            w.push((1, 10));
-        }
-
-        t.join().unwrap();
-    }
-
-    fn stampede(mut w: Worker<Box<isize>>,
-                s: Stealer<Box<isize>>,
-                nthreads: isize,
-                amt: usize) {
-        for _ in 0..amt {
-            w.push(Box::new(20));
-        }
-        let remaining = Arc::new(AtomicUsize::new(amt));
-
-        let threads = (0..nthreads).map(|_| {
-            let remaining = remaining.clone();
-            let s = s.clone();
-            thread::spawn(move || {
-                while remaining.load(SeqCst) > 0 {
-                    match s.steal() {
-                        Steal::Data(val) => {
-                            if *val == 20 {
-                                remaining.fetch_sub(1, SeqCst);
-                            } else {
-                                panic!()
-                            }
-                        }
-                        Steal::Abort | Steal::Empty => {}
-                    }
-                }
-            })
-        }).collect::<Vec<_>>();
-
-        while remaining.load(SeqCst) > 0 {
-            if let Some(val) = w.try_pop() {
-                if *val == 20 {
-                    remaining.fetch_sub(1, SeqCst);
-                } else {
-                    panic!()
-                }
-            }
-        }
-
-        for thread in threads.into_iter() {
-            thread.join().unwrap();
-        }
-    }
-
-    #[test]
-    fn run_stampede() {
-        let (w, s) = deque();
-        stampede(w, s, 8, 10000);
-    }
-
-    #[test]
-    fn many_stampede() {
-        static AMT: usize = 4;
-        let threads = (0..AMT).map(|_| {
-            let (w, s) = deque();
-            thread::spawn(|| {
-                stampede(w, s, 4, 10000);
-            })
-        }).collect::<Vec<_>>();
-
-        for thread in threads.into_iter() {
-            thread.join().unwrap();
-        }
-    }
-
-    #[test]
-    fn stress() {
-        static AMT: isize = 100000;
-        static NTHREADS: isize = 8;
-        static DONE: AtomicBool = ATOMIC_BOOL_INIT;
-        static HITS: AtomicUsize = ATOMIC_USIZE_INIT;
-        let (mut w, s) = deque();
-
-        let threads = (0..NTHREADS).map(|_| {
-            let s = s.clone();
-            thread::spawn(move || {
-                loop {
-                    match s.steal() {
-                        Steal::Data(2) => { HITS.fetch_add(1, SeqCst); }
-                        Steal::Data(..) => panic!(),
-                        _ if DONE.load(SeqCst) => break,
-                        _ => {}
-                    }
-                }
-            })
-        }).collect::<Vec<_>>();
-
-        let mut rng = rand::thread_rng();
-        let mut expected = 0;
-        while expected < AMT {
-            if rng.gen_range(0, 3) == 2 {
-                match w.try_pop() {
-                    None => {}
-                    Some(2) => { HITS.fetch_add(1, SeqCst); },
-                    Some(_) => panic!(),
-                }
-            } else {
-                expected += 1;
-                w.push(2);
-            }
-        }
-
-        while HITS.load(SeqCst) < AMT as usize {
-            match w.try_pop() {
-                None => {}
-                Some(2) => { HITS.fetch_add(1, SeqCst); },
-                Some(_) => panic!(),
-            }
-        }
-        DONE.store(true, SeqCst);
-
-        for thread in threads.into_iter() {
-            thread.join().unwrap();
-        }
-
-        assert_eq!(HITS.load(SeqCst), expected as usize);
-    }
-
-    #[test]
-    fn no_starvation() {
-        static AMT: isize = 10000;
-        static NTHREADS: isize = 4;
-        static DONE: AtomicBool = ATOMIC_BOOL_INIT;
-        let (mut w, s) = deque();
-
-        let (threads, hits): (Vec<_>, Vec<_>) = (0..NTHREADS).map(|_| {
-            let s = s.clone();
-            let ctr = Arc::new(AtomicUsize::new(0));
-            let ctr2 = ctr.clone();
-            (thread::spawn(move || {
-                loop {
-                    match s.steal() {
-                        Steal::Data((1, 2)) => { ctr.fetch_add(1, SeqCst); }
-                        Steal::Data(..) => panic!(),
-                        _ if DONE.load(SeqCst) => break,
-                        _ => {}
-                    }
-                }
-            }), ctr2)
-        }).unzip();
-
-        let mut rng = rand::thread_rng();
-        let mut myhit = false;
-        'outer: loop {
-            for _ in 0..rng.gen_range(0, AMT) {
-                if !myhit && rng.gen_range(0, 3) == 2 {
-                    match w.try_pop() {
-                        None => {}
-                        Some((1, 2)) => myhit = true,
-                        Some(_) => panic!(),
-                    }
-                } else {
-                    w.push((1, 2));
-                }
-            }
-
-            for slot in hits.iter() {
-                let amt = slot.load(SeqCst);
-                if amt == 0 { continue 'outer; }
-            }
-            if myhit {
-                break
-            }
-        }
-
-        DONE.store(true, SeqCst);
-
-        for thread in threads.into_iter() {
-            thread.join().unwrap();
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/mod.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-//! Synchronization primitives.
-
-pub use self::ms_queue::MsQueue;
-pub use self::atomic_option::AtomicOption;
-pub use self::treiber_stack::TreiberStack;
-pub use self::seg_queue::SegQueue;
-pub use self::arc_cell::ArcCell;
-
-mod atomic_option;
-mod ms_queue;
-mod treiber_stack;
-mod seg_queue;
-pub mod chase_lev;
-mod arc_cell;
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/ms_queue.rs
+++ /dev/null
@@ -1,511 +0,0 @@
-use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
-use std::sync::atomic::AtomicBool;
-use std::{ptr, mem};
-use std::thread::{self, Thread};
-
-use mem::epoch::{self, Atomic, Owned, Shared};
-use mem::CachePadded;
-
-/// A Michael-Scott lock-free queue, with support for blocking `pop`s.
-///
-/// Usable with any number of producers and consumers.
-// The representation here is a singly-linked list, with a sentinel
-// node at the front. In general the `tail` pointer may lag behind the
-// actual tail. Non-sentinal nodes are either all `Data` or all
-// `Blocked` (requests for data from blocked threads).
-#[derive(Debug)]
-pub struct MsQueue<T> {
-    head: CachePadded<Atomic<Node<T>>>,
-    tail: CachePadded<Atomic<Node<T>>>,
-}
-
-#[derive(Debug)]
-struct Node<T> {
-    payload: Payload<T>,
-    next: Atomic<Node<T>>,
-}
-
-#[derive(Debug)]
-enum Payload<T> {
-    /// A node with actual data that can be popped.
-    Data(T),
-    /// A node representing a blocked request for data.
-    Blocked(*mut Signal<T>),
-}
-
-/// A blocked request for data, which includes a slot to write the data.
-#[derive(Debug)]
-struct Signal<T> {
-    /// Thread to unpark when data is ready.
-    thread: Thread,
-    /// The actual data, when available.
-    data: Option<T>,
-    /// Is the data ready? Needed to cope with spurious wakeups.
-    ready: AtomicBool,
-}
-
-impl<T> Node<T> {
-    fn is_data(&self) -> bool {
-        if let Payload::Data(_) = self.payload { true } else { false }
-    }
-}
-
-// Any particular `T` should never accessed concurrently, so no need
-// for Sync.
-unsafe impl<T: Send> Sync for MsQueue<T> {}
-unsafe impl<T: Send> Send for MsQueue<T> {}
-
-impl<T> MsQueue<T> {
-    /// Create a new, empty queue.
-    pub fn new() -> MsQueue<T> {
-        let q = MsQueue {
-            head: CachePadded::new(Atomic::null()),
-            tail: CachePadded::new(Atomic::null()),
-        };
-        let sentinel = Owned::new(Node {
-            payload: Payload::Data(unsafe { mem::uninitialized() }),
-            next: Atomic::null(),
-        });
-        let guard = epoch::pin();
-        let sentinel = q.head.store_and_ref(sentinel, Relaxed, &guard);
-        q.tail.store_shared(Some(sentinel), Relaxed);
-        q
-    }
-
-    #[inline(always)]
-    /// Attempt to atomically place `n` into the `next` pointer of `onto`.
-    ///
-    /// If unsuccessful, returns ownership of `n`, possibly updating
-    /// the queue's `tail` pointer.
-    fn push_internal(&self,
-                     guard: &epoch::Guard,
-                     onto: Shared<Node<T>>,
-                     n: Owned<Node<T>>)
-                     -> Result<(), Owned<Node<T>>>
-    {
-        // is `onto` the actual tail?
-        if let Some(next) = onto.next.load(Acquire, guard) {
-            // if not, try to "help" by moving the tail pointer forward
-            self.tail.cas_shared(Some(onto), Some(next), Release);
-            Err(n)
-        } else {
-            // looks like the actual tail; attempt to link in `n`
-            onto.next.cas_and_ref(None, n, Release, guard).map(|shared| {
-                // try to move the tail pointer forward
-                self.tail.cas_shared(Some(onto), Some(shared), Release);
-            })
-        }
-    }
-
-    /// Add `t` to the back of the queue, possibly waking up threads
-    /// blocked on `pop`.
-    pub fn push(&self, t: T) {
-        /// We may or may not need to allocate a node; once we do,
-        /// we cache that allocation.
-        enum Cache<T> {
-            Data(T),
-            Node(Owned<Node<T>>),
-        }
-
-        impl<T> Cache<T> {
-            /// Extract the node if cached, or allocate if not.
-            fn into_node(self) -> Owned<Node<T>> {
-                match self {
-                    Cache::Data(t) => {
-                        Owned::new(Node {
-                            payload: Payload::Data(t),
-                            next: Atomic::null()
-                        })
-                    }
-                    Cache::Node(n) => n
-                }
-            }
-
-            /// Extract the data from the cache, deallocating any cached node.
-            fn into_data(self) -> T {
-                match self {
-                    Cache::Data(t) => t,
-                    Cache::Node(node) => {
-                        match node.into_inner().payload {
-                            Payload::Data(t) => t,
-                            _ => unreachable!(),
-                        }
-                    }
-                }
-            }
-        }
-
-        let mut cache = Cache::Data(t); // don't allocate up front
-        let guard = epoch::pin();
-
-        loop {
-            // We push onto the tail, so we'll start optimistically by looking
-            // there first.
-            let tail = self.tail.load(Acquire, &guard).unwrap();
-
-            // Is the queue in Data mode (empty queues can be viewed as either mode)?
-            if tail.is_data() ||
-                self.head.load(Relaxed, &guard).unwrap().as_raw() == tail.as_raw()
-            {
-                // Attempt to push onto the `tail` snapshot; fails if
-                // `tail.next` has changed, which will always be the case if the
-                // queue has transitioned to blocking mode.
-                match self.push_internal(&guard, tail, cache.into_node()) {
-                    Ok(_) => return,
-                    Err(n) => {
-                        // replace the cache, retry whole thing
-                        cache = Cache::Node(n)
-                    }
-                }
-            } else {
-                // Queue is in blocking mode. Attempt to unblock a thread.
-                let head = self.head.load(Acquire, &guard).unwrap();
-                // Get a handle on the first blocked node. Racy, so queue might
-                // be empty or in data mode by the time we see it.
-                let request = head.next.load(Acquire, &guard).and_then(|next| {
-                    match next.payload {
-                        Payload::Blocked(signal) => Some((next, signal)),
-                        Payload::Data(_) => None,
-                    }
-                });
-                if let Some((blocked_node, signal)) = request {
-                    // race to dequeue the node
-                    if self.head.cas_shared(Some(head), Some(blocked_node), Release) {
-                        unsafe {
-                            // signal the thread
-                            (*signal).data = Some(cache.into_data());
-                            (*signal).ready.store(true, Relaxed);
-                            (*signal).thread.unpark();
-                            guard.unlinked(head);
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    #[inline(always)]
-    // Attempt to pop a data node. `Ok(None)` if queue is empty or in blocking
-    // mode; `Err(())` if lost race to pop.
-    fn pop_internal(&self, guard: &epoch::Guard) -> Result<Option<T>, ()> {
-        let head = self.head.load(Acquire, guard).unwrap();
-        if let Some(next) = head.next.load(Acquire, guard) {
-            if let Payload::Data(ref t) = next.payload {
-                unsafe {
-                    if self.head.cas_shared(Some(head), Some(next), Release) {
-                        guard.unlinked(head);
-                        Ok(Some(ptr::read(t)))
-                    } else {
-                        Err(())
-                    }
-                }
-            } else {
-                Ok(None)
-            }
-        } else {
-            Ok(None)
-        }
-    }
-
-    /// Check if this queue is empty.
-    pub fn is_empty(&self) -> bool {
-        let guard = epoch::pin();
-        let head = self.head.load(Acquire, &guard).unwrap();
-
-        if let Some(next) = head.next.load(Acquire, &guard) {
-            if let Payload::Data(_) = next.payload {
-                false
-            } else {
-                true
-            }
-        } else {
-            true
-        }
-    }
-
-    /// Attempt to dequeue from the front.
-    ///
-    /// Returns `None` if the queue is observed to be empty.
-    pub fn try_pop(&self) -> Option<T> {
-        let guard = epoch::pin();
-        loop {
-            if let Ok(r) = self.pop_internal(&guard) {
-                return r;
-            }
-        }
-    }
-
-    /// Dequeue an element from the front of the queue, blocking if the queue is
-    /// empty.
-    pub fn pop(&self) -> T {
-        let guard = epoch::pin();
-
-        // Fast path: keep retrying until we observe that the queue has no data,
-        // avoiding the allocation of a blocked node.
-        loop {
-            match self.pop_internal(&guard) {
-                Ok(Some(r)) => {
-                    return r;
-                }
-                Ok(None) => {
-                    break;
-                }
-                Err(()) => {}
-            }
-        }
-
-        // The signal gets to live on the stack, since this stack frame will be
-        // blocked until receiving the signal.
-        let mut signal = Signal {
-            thread: thread::current(),
-            data: None,
-            ready: AtomicBool::new(false),
-        };
-
-        // Go ahead and allocate the blocked node; chances are, we'll need it.
-        let mut node = Owned::new(Node {
-            payload: Payload::Blocked(&mut signal),
-            next: Atomic::null(),
-        });
-
-        loop {
-            // try a normal pop
-            if let Ok(Some(r)) = self.pop_internal(&guard) {
-                return r;
-            }
-
-            // At this point, we believe the queue is empty/blocked.
-            // Snapshot the tail, onto which we want to push a blocked node.
-            let tail = self.tail.load(Relaxed, &guard).unwrap();
-
-            // Double-check that we're in blocking mode
-            if tail.is_data() {
-                // The current tail is in data mode, so we probably need to abort.
-                // BUT, it might be the sentinel, so check for that first.
-                let head = self.head.load(Relaxed, &guard).unwrap();
-                if tail.is_data() && tail.as_raw() != head.as_raw() { continue; }
-            }
-
-            // At this point, the tail snapshot is either a blocked node deep in
-            // the queue, the sentinel, or no longer accessible from the queue.
-            // In *ALL* of these cases, if we succeed in pushing onto the
-            // snapshot, we know we are maintaining the core invariant: all
-            // reachable, non-sentinel nodes have the same payload mode, in this
-            // case, blocked.
-            match self.push_internal(&guard, tail, node) {
-                Ok(()) => {
-                    while !signal.ready.load(Relaxed) {
-                        thread::park();
-                    }
-                    return signal.data.unwrap();
-                }
-                Err(n) => {
-                    node = n;
-                }
-            }
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    const CONC_COUNT: i64 = 1000000;
-
-    use scope;
-    use super::*;
-
-    #[test]
-    fn push_try_pop_1() {
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-        q.push(37);
-        assert!(!q.is_empty());
-        assert_eq!(q.try_pop(), Some(37));
-        assert!(q.is_empty());
-    }
-
-    #[test]
-    fn push_try_pop_2() {
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-        q.push(37);
-        q.push(48);
-        assert_eq!(q.try_pop(), Some(37));
-        assert!(!q.is_empty());
-        assert_eq!(q.try_pop(), Some(48));
-        assert!(q.is_empty());
-    }
-
-    #[test]
-    fn push_try_pop_many_seq() {
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-        for i in 0..200 {
-            q.push(i)
-        }
-        assert!(!q.is_empty());
-        for i in 0..200 {
-            assert_eq!(q.try_pop(), Some(i));
-        }
-        assert!(q.is_empty());
-    }
-
-    #[test]
-    fn push_pop_1() {
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-        q.push(37);
-        assert!(!q.is_empty());
-        assert_eq!(q.pop(), 37);
-        assert!(q.is_empty());
-    }
-
-    #[test]
-    fn push_pop_2() {
-        let q: MsQueue<i64> = MsQueue::new();
-        q.push(37);
-        q.push(48);
-        assert_eq!(q.pop(), 37);
-        assert_eq!(q.pop(), 48);
-    }
-
-    #[test]
-    fn push_pop_many_seq() {
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-        for i in 0..200 {
-            q.push(i)
-        }
-        assert!(!q.is_empty());
-        for i in 0..200 {
-            assert_eq!(q.pop(), i);
-        }
-        assert!(q.is_empty());
-    }
-
-    #[test]
-    fn push_try_pop_many_spsc() {
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-
-        scope(|scope| {
-            scope.spawn(|| {
-                let mut next = 0;
-
-                while next < CONC_COUNT {
-                    if let Some(elem) = q.try_pop() {
-                        assert_eq!(elem, next);
-                        next += 1;
-                    }
-                }
-            });
-
-            for i in 0..CONC_COUNT {
-                q.push(i)
-            }
-        });
-    }
-
-    #[test]
-    fn push_try_pop_many_spmc() {
-        fn recv(_t: i32, q: &MsQueue<i64>) {
-            let mut cur = -1;
-            for _i in 0..CONC_COUNT {
-                if let Some(elem) = q.try_pop() {
-                    assert!(elem > cur);
-                    cur = elem;
-
-                    if cur == CONC_COUNT - 1 { break }
-                }
-            }
-        }
-
-        let q: MsQueue<i64> = MsQueue::new();
-        assert!(q.is_empty());
-        let qr = &q;
-        scope(|scope| {
-            for i in 0..3 {
-                scope.spawn(move || recv(i, qr));
-            }
-
-            scope.spawn(|| {
-                for i in 0..CONC_COUNT {
-                    q.push(i);
-                }
-            })
-        });
-    }
-
-    #[test]
-    fn push_try_pop_many_mpmc() {
-        enum LR { Left(i64), Right(i64) }
-
-        let q: MsQueue<LR> = MsQueue::new();
-        assert!(q.is_empty());
-
-        scope(|scope| {
-            for _t in 0..2 {
-                scope.spawn(|| {
-                    for i in CONC_COUNT-1..CONC_COUNT {
-                        q.push(LR::Left(i))
-                    }
-                });
-                scope.spawn(|| {
-                    for i in CONC_COUNT-1..CONC_COUNT {
-                        q.push(LR::Right(i))
-                    }
-                });
-                scope.spawn(|| {
-                    let mut vl = vec![];
-                    let mut vr = vec![];
-                    for _i in 0..CONC_COUNT {
-                        match q.try_pop() {
-                            Some(LR::Left(x)) => vl.push(x),
-                            Some(LR::Right(x)) => vr.push(x),
-                            _ => {}
-                        }
-                    }
-
-                    let mut vl2 = vl.clone();
-                    let mut vr2 = vr.clone();
-                    vl2.sort();
-                    vr2.sort();
-
-                    assert_eq!(vl, vl2);
-                    assert_eq!(vr, vr2);
-                });
-            }
-        });
-    }
-
-    #[test]
-    fn push_pop_many_spsc() {
-        let q: MsQueue<i64> = MsQueue::new();
-
-        scope(|scope| {
-            scope.spawn(|| {
-                let mut next = 0;
-                while next < CONC_COUNT {
-                    assert_eq!(q.pop(), next);
-                    next += 1;
-                }
-            });
-
-            for i in 0..CONC_COUNT {
-                q.push(i)
-            }
-        });
-        assert!(q.is_empty());
-    }
-
-    #[test]
-    fn is_empty_dont_pop() {
-        let q: MsQueue<i64> = MsQueue::new();
-        q.push(20);
-        q.push(20);
-        assert!(!q.is_empty());
-        assert!(!q.is_empty());
-        assert!(q.try_pop().is_some());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/seg_queue.rs
+++ /dev/null
@@ -1,251 +0,0 @@
-use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
-use std::sync::atomic::{AtomicBool, AtomicUsize};
-use std::fmt;
-use std::{ptr, mem};
-use std::cmp;
-use std::cell::UnsafeCell;
-
-use mem::epoch::{self, Atomic, Owned};
-
-const SEG_SIZE: usize = 32;
-
-/// A Michael-Scott queue that allocates "segments" (arrays of nodes)
-/// for efficiency.
-///
-/// Usable with any number of producers and consumers.
-#[derive(Debug)]
-pub struct SegQueue<T> {
-    head: Atomic<Segment<T>>,
-    tail: Atomic<Segment<T>>,
-}
-
-struct Segment<T> {
-    low: AtomicUsize,
-    data: [UnsafeCell<(T, AtomicBool)>; SEG_SIZE],
-    high: AtomicUsize,
-    next: Atomic<Segment<T>>,
-}
-
-impl<T> fmt::Debug for Segment<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Segment {{ ... }}")
-    }
-}
-
-unsafe impl<T: Send> Sync for Segment<T> {}
-
-impl<T> Segment<T> {
-    fn new() -> Segment<T> {
-        let rqueue = Segment {
-            data: unsafe { mem::uninitialized() },
-            low: AtomicUsize::new(0),
-            high: AtomicUsize::new(0),
-            next: Atomic::null(),
-        };
-        for val in rqueue.data.iter() {
-            unsafe {
-                (*val.get()).1 = AtomicBool::new(false);
-            }
-        }
-        rqueue
-    }
-}
-
-impl<T> SegQueue<T> {
-    /// Create a new, empty queue.
-    pub fn new() -> SegQueue<T> {
-        let q = SegQueue {
-            head: Atomic::null(),
-            tail: Atomic::null(),
-        };
-        let sentinel = Owned::new(Segment::new());
-        let guard = epoch::pin();
-        let sentinel = q.head.store_and_ref(sentinel, Relaxed, &guard);
-        q.tail.store_shared(Some(sentinel), Relaxed);
-        q
-    }
-
-    /// Add `t` to the back of the queue.
-    pub fn push(&self, t: T) {
-        let guard = epoch::pin();
-        loop {
-            let tail = self.tail.load(Acquire, &guard).unwrap();
-            if tail.high.load(Relaxed) >= SEG_SIZE { continue }
-            let i = tail.high.fetch_add(1, Relaxed);
-            unsafe {
-                if i < SEG_SIZE {
-                    let cell = (*tail).data.get_unchecked(i).get();
-                    ptr::write(&mut (*cell).0, t);
-                    (*cell).1.store(true, Release);
-
-                    if i + 1 == SEG_SIZE {
-                        let tail = tail.next.store_and_ref(Owned::new(Segment::new()), Release, &guard);
-                        self.tail.store_shared(Some(tail), Release);
-                    }
-
-                    return
-                }
-            }
-        }
-    }
-
-    /// Attempt to dequeue from the front.
-    ///
-    /// Returns `None` if the queue is observed to be empty.
-    pub fn try_pop(&self) -> Option<T> {
-        let guard = epoch::pin();
-        loop {
-            let head = self.head.load(Acquire, &guard).unwrap();
-            loop {
-                let low = head.low.load(Relaxed);
-                if low >= cmp::min(head.high.load(Relaxed), SEG_SIZE) { break }
-                if head.low.compare_and_swap(low, low+1, Relaxed) == low {
-                    unsafe {
-                        let cell = (*head).data.get_unchecked(low).get();
-                        loop {
-                            if (*cell).1.load(Acquire) { break }
-                        }
-                        if low + 1 == SEG_SIZE {
-                            loop {
-                                if let Some(next) = head.next.load(Acquire, &guard) {
-                                    self.head.store_shared(Some(next), Release);
-                                    guard.unlinked(head);
-                                    break
-                                }
-                            }
-                        }
-                        return Some(ptr::read(&(*cell).0))
-                    }
-                }
-            }
-            if head.next.load(Relaxed, &guard).is_none() { return None }
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    const CONC_COUNT: i64 = 1000000;
-
-    use scope;
-    use super::*;
-
-    #[test]
-    fn push_pop_1() {
-        let q: SegQueue<i64> = SegQueue::new();
-        q.push(37);
-        assert_eq!(q.try_pop(), Some(37));
-    }
-
-    #[test]
-    fn push_pop_2() {
-        let q: SegQueue<i64> = SegQueue::new();
-        q.push(37);
-        q.push(48);
-        assert_eq!(q.try_pop(), Some(37));
-        assert_eq!(q.try_pop(), Some(48));
-    }
-
-    #[test]
-    fn push_pop_many_seq() {
-        let q: SegQueue<i64> = SegQueue::new();
-        for i in 0..200 {
-            q.push(i)
-        }
-        for i in 0..200 {
-            assert_eq!(q.try_pop(), Some(i));
-        }
-    }
-
-    #[test]
-    fn push_pop_many_spsc() {
-        let q: SegQueue<i64> = SegQueue::new();
-
-        scope(|scope| {
-            scope.spawn(|| {
-                let mut next = 0;
-
-                while next < CONC_COUNT {
-                    if let Some(elem) = q.try_pop() {
-                        assert_eq!(elem, next);
-                        next += 1;
-                    }
-                }
-            });
-
-            for i in 0..CONC_COUNT {
-                q.push(i)
-            }
-        });
-    }
-
-    #[test]
-    fn push_pop_many_spmc() {
-        fn recv(_t: i32, q: &SegQueue<i64>) {
-            let mut cur = -1;
-            for _i in 0..CONC_COUNT {
-                if let Some(elem) = q.try_pop() {
-                    assert!(elem > cur);
-                    cur = elem;
-
-                    if cur == CONC_COUNT - 1 { break }
-                }
-            }
-        }
-
-        let q: SegQueue<i64> = SegQueue::new();
-        let qr = &q;
-        scope(|scope| {
-            for i in 0..3 {
-                scope.spawn(move || recv(i, qr));
-            }
-
-            scope.spawn(|| {
-                for i in 0..CONC_COUNT {
-                    q.push(i);
-                }
-            })
-        });
-    }
-
-    #[test]
-    fn push_pop_many_mpmc() {
-        enum LR { Left(i64), Right(i64) }
-
-        let q: SegQueue<LR> = SegQueue::new();
-
-        scope(|scope| {
-            for _t in 0..2 {
-                scope.spawn(|| {
-                    for i in CONC_COUNT-1..CONC_COUNT {
-                        q.push(LR::Left(i))
-                    }
-                });
-                scope.spawn(|| {
-                    for i in CONC_COUNT-1..CONC_COUNT {
-                        q.push(LR::Right(i))
-                    }
-                });
-                scope.spawn(|| {
-                    let mut vl = vec![];
-                    let mut vr = vec![];
-                    for _i in 0..CONC_COUNT {
-                        match q.try_pop() {
-                            Some(LR::Left(x)) => vl.push(x),
-                            Some(LR::Right(x)) => vr.push(x),
-                            _ => {}
-                        }
-                    }
-
-                    let mut vl2 = vl.clone();
-                    let mut vr2 = vr.clone();
-                    vl2.sort();
-                    vr2.sort();
-
-                    assert_eq!(vl, vl2);
-                    assert_eq!(vr, vr2);
-                });
-            }
-        });
-    }
-}
deleted file mode 100644
--- a/third_party/rust/crossbeam/src/sync/treiber_stack.rs
+++ /dev/null
@@ -1,98 +0,0 @@
-use std::sync::atomic::Ordering::{Acquire, Release, Relaxed};
-use std::ptr;
-
-use mem::epoch::{self, Atomic, Owned};
-
-/// 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: T,
-    next: Atomic<Node<T>>,
-}
-
-impl<T> TreiberStack<T> {
-    /// Create a new, empty stack.
-    pub fn new() -> TreiberStack<T> {
-        TreiberStack { head: Atomic::null() }
-    }
-
-    /// Push `t` on top of the stack.
-    pub fn push(&self, t: T) {
-        let mut n = Owned::new(Node {
-            data: t,
-            next: Atomic::null(),
-        });
-        let guard = epoch::pin();
-        loop {
-            let head = self.head.load(Relaxed, &guard);
-            n.next.store_shared(head, Relaxed);
-            match self.head.cas_and_ref(head, n, Release, &guard) {
-                Ok(_) => break,
-                Err(owned) => n = owned,
-            }
-        }
-    }
-
-    /// Attempt to pop the top element of the stack.
-    /// **Deprecated method**, use try_pop
-    ///
-    /// Returns `None` if the stack is observed to be empty.
-    #[cfg_attr(any(feature="beta", feature="nightly"), deprecated(note="The pop method has been renamed to try_pop for consistency with other collections."))]
-    pub fn pop(&self) -> Option<T> {
-        self.try_pop()
-    }
-
-    /// Attempt to pop the top element of the stack.
-    ///
-    /// Returns `None` if the stack is observed to be empty.
-    pub fn try_pop(&self) -> Option<T> {
-        let guard = epoch::pin();
-        loop {
-            match self.head.load(Acquire, &guard) {
-                Some(head) => {
-                    let next = head.next.load(Relaxed, &guard);
-                    if self.head.cas_shared(Some(head), next, Release) {
-                        unsafe {
-                            guard.unlinked(head);
-                            return Some(ptr::read(&(*head).data));
-                        }
-                    }
-                }
-                None => return None,
-            }
-        }
-    }
-
-    /// Check if this queue is empty.
-    pub fn is_empty(&self) -> bool {
-        let guard = epoch::pin();
-        self.head.load(Acquire, &guard).is_none()
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-
-    #[test]
-    fn is_empty() {
-        let q: TreiberStack<i64> = TreiberStack::new();
-        assert!(q.is_empty());
-        q.push(20);
-        q.push(20);
-        assert!(!q.is_empty());
-        assert!(!q.is_empty());
-        assert!(q.try_pop().is_some());
-        assert!(q.try_pop().is_some());
-        assert!(q.is_empty());
-        q.push(25);
-        assert!(!q.is_empty());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/isatty/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"023fbba79a890f1285fba26903ffb000e32c596cb1794d5e4ae64c003cf44f50","Cargo.toml":"3024d1fa541d30eba222b7b775b9bf7b4498b3b6168cf8052aa1d2de13403c50","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"f40b08aaee5559ba4769e5449188fc2a6364d1e0eac57499cdac3fc2be30aeef","README.md":"fcb9d4f832f28616afa8a9a79549331f78787dedfa167156ae59dee751a885cd","appveyor.yml":"17cb92b1e92399402ab1dd7639ba28cea71079d2bdd8fab5cd4d40ab4351940b","src/lib.rs":"71b6383cb72398d413c9fccc72c15e5962ec59b6c0dd53d1dfa059655e51f686"},"package":"00c9301a947a2eaee7ce2556b80285dcc89558d07088962e6e8b9c25730f9dc6"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/isatty/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-sudo: false
-
-language: rust
-
-rust:
-  - 1.8.0
-  - stable
-  - beta
-  - nightly
-
-script:
-  - cargo build --verbose
deleted file mode 100644
--- a/third_party/rust/isatty/Cargo.toml
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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 = "isatty"
-version = "0.1.5"
-authors = ["David Tolnay <dtolnay@gmail.com>"]
-description = "libc::isatty that also works on Windows"
-documentation = "https://github.com/dtolnay/isatty"
-readme = "README.md"
-keywords = ["tty"]
-categories = ["command-line-interface"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/dtolnay/isatty"
-[target."cfg(windows)".dependencies.winapi]
-version = "0.2"
-
-[target."cfg(windows)".dependencies.kernel32-sys]
-version = "0.2"
-[target."cfg(unix)".dependencies.libc]
-version = "0.2"
-[badges.travis-ci]
-repository = "dtolnay/isatty"
-
-[badges.appveyor]
-repository = "dtolnay/isatty"
deleted file mode 100644
--- a/third_party/rust/isatty/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              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.
deleted file mode 100644
--- a/third_party/rust/isatty/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2016
-
-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.
deleted file mode 100644
--- a/third_party/rust/isatty/README.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Rust isatty
-
-[![Build Status](https://travis-ci.org/dtolnay/isatty.svg?branch=master)](https://travis-ci.org/dtolnay/isatty)
-[![Build Status](https://ci.appveyor.com/api/projects/status/5aq0inkv7eip6udp/branch/master?svg=true)](https://ci.appveyor.com/project/dtolnay/isatty/branch/master)
-[![Latest Version](https://img.shields.io/crates/v/isatty.svg)](https://crates.io/crates/isatty)
-
-This crate provides the following three functions:
-
-```rust
-fn stdin_isatty() -> bool
-fn stdout_isatty() -> bool
-fn stderr_isatty() -> bool
-```
-
-On Linux and Mac they are implemented with [`libc::isatty`]. On Windows they are
-implemented with [`kernel32::GetConsoleMode`].
-
-[`libc::isatty`]: http://man7.org/linux/man-pages/man3/isatty.3.html
-[`kernel32::GetConsoleMode`]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167.aspx
-
-The `stdin_isatty` function is not yet implemented for Windows. If you need it,
-please check [dtolnay/isatty#1] and contribute an implementation!
-
-[dtolnay/isatty#1]: https://github.com/dtolnay/isatty/issues/1
-
-## Usage
-
-`Cargo.toml`
-
-> ```toml
-> [dependencies]
-> isatty = "0.1"
-> ```
-
-`src/main.rs`
-
-> ```rust
-> extern crate isatty;
-> use isatty::{stdin_isatty, stdout_isatty, stderr_isatty};
->
-> fn main() {
->     println!("stdin: {}", stdin_isatty());
->     println!("stdout: {}", stdout_isatty());
->     println!("stderr: {}", stderr_isatty());
-> }
-> ```
-
-## License
-
-Licensed under either of
-
- * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-
-at your option.
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in isatty by you, as defined in the Apache-2.0 license, shall be
-dual licensed as above, without any additional terms or conditions.
deleted file mode 100644
--- a/third_party/rust/isatty/appveyor.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-  - TARGET: i686-pc-windows-gnu
-
-install:
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
-  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - SET PATH=%PATH%;C:\MinGW\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo build --verbose
deleted file mode 100644
--- a/third_party/rust/isatty/src/lib.rs
+++ /dev/null
@@ -1,157 +0,0 @@
-//! This crate provides the following three functions:
-//!
-//! ```rust
-//! # trait Ignore {
-//! fn stdin_isatty() -> bool
-//! # ;
-//! fn stdout_isatty() -> bool
-//! # ;
-//! fn stderr_isatty() -> bool
-//! # ;
-//! # }
-//! ```
-//!
-//! On Linux and Mac they are implemented with [`libc::isatty`]. On Windows they
-//! are implemented with [`kernel32::GetConsoleMode`].
-//!
-//! [`libc::isatty`]: http://man7.org/linux/man-pages/man3/isatty.3.html
-//! [`kernel32::GetConsoleMode`]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167.aspx
-//!
-//! The `stdin_isatty` function is not yet implemented for Windows. If you need
-//! it, please check [dtolnay/isatty#1] and contribute an implementation!
-//!
-//! [dtolnay/isatty#1]: https://github.com/dtolnay/isatty/issues/1
-//!
-//! ## Usage
-//!
-//! `Cargo.toml`
-//!
-//! > ```toml
-//! > [dependencies]
-//! > isatty = "0.1"
-//! > ```
-//!
-//! `src/main.rs`
-//!
-//! > ```rust
-//! > extern crate isatty;
-//! > use isatty::{stdin_isatty, stdout_isatty, stderr_isatty};
-//! >
-//! > fn main() {
-//! >     println!("stdin: {}", stdin_isatty());
-//! >     println!("stdout: {}", stdout_isatty());
-//! >     println!("stderr: {}", stderr_isatty());
-//! > }
-//! > ```
-
-#![doc(html_root_url = "https://docs.rs/isatty/0.1.5")]
-
-// Based on:
-//  - https://github.com/rust-lang/cargo/blob/099ad28104fe319f493dc42e0c694d468c65767d/src/cargo/lib.rs#L154-L178
-//  - https://github.com/BurntSushi/ripgrep/issues/94#issuecomment-261761687
-
-#[cfg(unix)]
-pub fn stdin_isatty() -> bool {
-    isatty(stream::Stream::Stdin)
-}
-
-pub fn stdout_isatty() -> bool {
-    isatty(stream::Stream::Stdout)
-}
-
-pub fn stderr_isatty() -> bool {
-    isatty(stream::Stream::Stderr)
-}
-
-mod stream {
-    pub enum Stream {
-        #[cfg(unix)]
-        Stdin,
-        Stdout,
-        Stderr,
-    }
-}
-
-#[cfg(unix)]
-use unix::isatty;
-#[cfg(unix)]
-mod unix {
-    use stream::Stream;
-
-    pub fn isatty(stream: Stream) -> bool {
-        extern crate libc;
-
-        let fd = match stream {
-            Stream::Stdin => libc::STDIN_FILENO,
-            Stream::Stdout => libc::STDOUT_FILENO,
-            Stream::Stderr => libc::STDERR_FILENO,
-        };
-
-        unsafe { libc::isatty(fd) != 0 }
-    }
-}
-
-#[cfg(windows)]
-use windows::isatty;
-#[cfg(windows)]
-mod windows {
-    extern crate kernel32;
-    extern crate winapi;
-
-    use stream::Stream;
-
-    pub fn isatty(stream: Stream) -> bool {
-        let handle = match stream {
-            Stream::Stdout => winapi::winbase::STD_OUTPUT_HANDLE,
-            Stream::Stderr => winapi::winbase::STD_ERROR_HANDLE,
-        };
-
-        unsafe {
-            let handle = kernel32::GetStdHandle(handle);
-
-            // check for msys/cygwin
-            if is_cygwin_pty(handle) {
-                return true;
-            }
-
-            let mut out = 0;
-            kernel32::GetConsoleMode(handle, &mut out) != 0
-        }
-    }
-
-    /// Returns true if there is an MSYS/cygwin tty on the given handle.
-    fn is_cygwin_pty(handle: winapi::HANDLE) -> bool {
-        use std::ffi::OsString;
-        use std::mem;
-        use std::os::raw::c_void;
-        use std::os::windows::ffi::OsStringExt;
-        use std::slice;
-
-        use self::kernel32::GetFileInformationByHandleEx;
-        use self::winapi::fileapi::FILE_NAME_INFO;
-        use self::winapi::minwinbase::FileNameInfo;
-        use self::winapi::minwindef::MAX_PATH;
-
-        unsafe {
-            let size = mem::size_of::<FILE_NAME_INFO>();
-            let mut name_info_bytes = vec![0u8; size + MAX_PATH];
-            let res = GetFileInformationByHandleEx(handle,
-                                                FileNameInfo,
-                                                &mut *name_info_bytes as *mut _ as *mut c_void,
-                                                name_info_bytes.len() as u32);
-            if res == 0 {
-                return true;
-            }
-            let name_info: FILE_NAME_INFO = *(name_info_bytes[0..size]
-                .as_ptr() as *const FILE_NAME_INFO);
-            let name_bytes = &name_info_bytes[size..size + name_info.FileNameLength as usize];
-            let name_u16 = slice::from_raw_parts(name_bytes.as_ptr() as *const u16,
-                                                name_bytes.len() / 2);
-            let name = OsString::from_wide(name_u16)
-                .as_os_str()
-                .to_string_lossy()
-                .into_owned();
-            name.contains("msys-") || name.contains("-pty")
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/slog-atomic/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"4b02f83b1737cb2149dce4ceb26f0f2bb638ca82babfb343119c9fea0e472248","CHANGELOG.md":"0c6701474b807ee3738fa9d06ed9fbea7d07531b209a9da75fbf5bcf172f9b94","Cargo.toml":"1815b813a7345aea82031ed4e7c7b588fd1b3abc97c895421ce2374e7e97a763","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"3da4fe444a3d6052a721dc79930499b43155fee58460e2bd66d07d35a8f2abf7","examples/signal.rs":"799625fe867f896dddeb06a04049128b297526364414351f947976842a1b1405","lib.rs":"1ca3897552e020d754ff809367c0cbe3f9ece094f5a48a5002c94e7cb6340e67"},"package":"d6f5a4e4908d6818fe553b6126ba5377801556ab885c65ebf960b722a6778864"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/slog-atomic/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-
-script:
-  - make all
-  - make travistest
-  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
-
-env:
-  global:
-    - RUST_BACKTRACE=1
-  matrix:
-    -
-    - RELEASE=true
-
-notifications:
-  webhooks:
-    urls:
-      - https://webhooks.gitter.im/e/6d8e17dd2fa83b143168
-    on_success: change  # options: [always|never|change] default: always
-    on_failure: change  # options: [always|never|change] default: always
-    on_start: false     # default: false
deleted file mode 100644
--- a/third_party/rust/slog-atomic/CHANGELOG.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-## 0.4.3 - 2016-11-30
-### Changed
-
-* Moved to own repository
deleted file mode 100644
--- a/third_party/rust/slog-atomic/Cargo.toml
+++ /dev/null
@@ -1,25 +0,0 @@
-[package]
-name = "slog-atomic"
-version = "0.4.3"
-authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
-description = "Atomic run-time controllable drain for slog-rs"
-keywords = ["slog", "logging", "log",  "atomic"]
-license = "MPL-2.0"
-documentation = "https://docs.rs/slog-atomic"
-homepage = "https://github.com/slog-rs/slog"
-repository = "https://github.com/slog-rs/atomic"
-readme = "README.md"
-
-[lib]
-path = "lib.rs"
-
-[dependencies]
-slog = "1"
-crossbeam = "0.2.9"
-
-[dev-dependencies]
-lazy_static = "0.1.16"
-nix = "0.6.0"
-slog-term = "1"
-slog-json = "1"
-slog-stream = "1"
deleted file mode 100644
--- a/third_party/rust/slog-atomic/LICENSE-MPL2
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in 
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
deleted file mode 100644
--- a/third_party/rust/slog-atomic/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
-DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
-ifeq (, $(shell which cargo-check 2> /dev/null))
-DEFAULT_TARGET=build
-else
-DEFAULT_TARGET=build
-endif
-
-default: $(DEFAULT_TARGET)
-
-ALL_TARGETS += build $(EXAMPLES) test doc
-ifneq ($(RELEASE),)
-$(info RELEASE BUILD: $(PKG_NAME))
-CARGO_FLAGS += --release
-else
-$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
-endif
-
-EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
-
-all: $(ALL_TARGETS)
-
-.PHONY: run test build doc clean clippy
-run test build clean:
-	cargo $@ $(CARGO_FLAGS)
-
-check:
-	$(info Running check; use `make build` to actually build)
-	cargo $@ $(CARGO_FLAGS)
-
-clippy:
-	cargo build --features clippy
-
-.PHONY: bench
-bench:
-	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
-
-.PHONY: travistest
-travistest: test
-
-.PHONY: longtest
-longtest:
-	@echo "Running longtest. Press Ctrl+C to stop at any time"
-	@sleep 2
-	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
-
-.PHONY: $(EXAMPLES)
-$(EXAMPLES):
-	cargo build --example $@ $(CARGO_FLAGS)
-
-.PHONY: doc
-doc: FORCE
-	cargo doc
-
-.PHONY: publishdoc
-publishdoc:
-	rm -rf target/doc
-	make doc
-	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
-	ghp-import -n target/doc
-	git push -f origin gh-pages
-
-.PHONY: docview
-docview: doc
-	xdg-open target/doc/$(PKG_NAME)/index.html
-
-.PHONY: FORCE
-FORCE:
deleted file mode 100644
--- a/third_party/rust/slog-atomic/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-<p align="center">
-
-  <a href="https://github.com/slog-rs/slog">
-  <img src="https://cdn.rawgit.com/slog-rs/misc/master/media/slog.svg" alt="slog-rs logo">
-  </a>
-  <br>
-
-  <a href="https://travis-ci.org/slog-rs/atomic">
-      <img src="https://img.shields.io/travis/slog-rs/atomic/master.svg" alt="Travis CI Build Status">
-  </a>
-
-  <a href="https://crates.io/crates/slog-atomic">
-      <img src="https://img.shields.io/crates/d/slog-atomic.svg" alt="slog-atomic on crates.io">
-  </a>
-
-  <a href="https://gitter.im/slog-rs/slog">
-      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
-  </a>
-</p>
-
-# slog-atomic - Atomic run-time controllable drain for [slog-rs]
-
-[slog-rs]: //github.com/slog-rs/slog
-
-Using `slog-atomic` you can create a `slog::Drain` that can change behaviour
-in a thread-safe way, in runtime. This is useful eg. for triggering different
-logging levels from a signal handler.
deleted file mode 100644
--- a/third_party/rust/slog-atomic/examples/signal.rs
+++ /dev/null
@@ -1,70 +0,0 @@
-#[macro_use]
-extern crate slog;
-extern crate slog_term;
-extern crate slog_atomic;
-extern crate slog_json;
-extern crate slog_stream;
-extern crate nix;
-
-#[macro_use]
-extern crate lazy_static;
-
-use nix::sys::signal;
-use std::sync::atomic::AtomicBool;
-use std::sync::atomic::Ordering::SeqCst;
-use std::time::Duration;
-
-use std::{thread, io};
-use slog::*;
-use slog_atomic::*;
-use slog_stream::*;
-
-lazy_static! {
-    // global atomic switch drain control
-    static ref ATOMIC_DRAIN_SWITCH : AtomicSwitchCtrl<io::Error> = AtomicSwitch::new(
-        Discard.map_err(|_| io::Error::new(io::ErrorKind::Other, "should no happen"))
-    ).ctrl();
-
-    // track current state of the atomic switch drain
-    static ref ATOMIC_DRAIN_SWITCH_STATE : AtomicBool = AtomicBool::new(false);
-}
-
-fn atomic_drain_switch() {
-    // XXX: Not atomic. Race?
-    let new = !ATOMIC_DRAIN_SWITCH_STATE.load(SeqCst);
-    ATOMIC_DRAIN_SWITCH_STATE.store(new, SeqCst);
-
-    if new {
-        ATOMIC_DRAIN_SWITCH.set(stream(io::stdout(), slog_json::default()))
-    } else {
-        ATOMIC_DRAIN_SWITCH.set(slog_term::streamer().full().stdout().build())
-    }
-}
-
-extern "C" fn handle_sigusr1(_: i32) {
-    atomic_drain_switch();
-}
-
-fn main() {
-    unsafe {
-        let sig_action = signal::SigAction::new(signal::SigHandler::Handler(handle_sigusr1),
-                                                signal::SaFlags::empty(),
-                                                signal::SigSet::empty());
-        signal::sigaction(signal::SIGUSR1, &sig_action).unwrap();
-    }
-
-    let drain = slog::duplicate(slog_term::streamer().stderr().full().build(), ATOMIC_DRAIN_SWITCH.drain()).fuse();
-
-    atomic_drain_switch();
-
-    let log = Logger::root(drain, o!());
-
-    info!(log, "logging a message every 3s");
-    info!(log, "send SIGUSR1 signal to switch output with");
-    let pid = nix::unistd::getpid();
-    info!(log, "kill -SIGUSR1 {}", pid);
-    loop {
-        info!(log, "tick");
-        thread::sleep(Duration::from_millis(3000));
-    }
-}
deleted file mode 100644
--- a/third_party/rust/slog-atomic/lib.rs
+++ /dev/null
@@ -1,73 +0,0 @@
-//! Slog atomic switching drain
-//!
-//! `AtomicSwitch` allows swapping drain that it wraps atomically, race-free, in
-//! runtime. This can be useful eg. for turning on debug logging
-//! in production.
-//!
-//! See [`slog` `signal.rs`
-//! example](https://github.com/dpc/slog-rs/blob/master/examples/signal.rs)
-#![warn(missing_docs)]
-
-#[macro_use]
-extern crate slog;
-extern crate crossbeam;
-
-use slog::*;
-use std::sync::Arc;
-use crossbeam::sync::ArcCell;
-
-/// Handle to `AtomicSwitch` that controls it.
-pub struct AtomicSwitchCtrl<E>(Arc<ArcCell<Box<Drain<Error=E>+Send+Sync>>>);
-
-/// Drain wrapping another drain, allowing atomic substitution in runtime
-pub struct AtomicSwitch<E>(Arc<ArcCell<Box<Drain<Error=E>+Send+Sync>>>);
-
-impl<E> AtomicSwitch<E> {
-    /// Wrap `drain` in `AtomicSwitch` to allow swapping it later
-    ///
-    /// Use `AtomicSwitch::ctrl()` to get a handle to it
-    pub fn new<D: Drain<Error=E> + 'static + Send+Sync>(drain: D) -> Self {
-        AtomicSwitch::new_from_arc(Arc::new(ArcCell::new(Arc::new(Box::new(drain) as Box<Drain<Error=E>+Send+Sync>))))
-    }
-
-    /// Create new `AtomicSwitch` from an existing `Arc<...>`
-    ///
-    /// See `AtomicSwitch::new()`
-    pub fn new_from_arc(d: Arc<ArcCell<Box<Drain<Error=E>+Send+Sync>>>) -> Self {
-        AtomicSwitch(d)
-    }
-
-    /// Get a `AtomicSwitchCtrl` handle to control this `AtomicSwitch` drain
-    pub fn ctrl(&self) -> AtomicSwitchCtrl<E> {
-        AtomicSwitchCtrl(self.0.clone())
-    }
-}
-
-impl<E> AtomicSwitchCtrl<E> {
-    /// Get Arc to the currently wrapped drain
-    pub fn get(&self) -> Arc<Box<Drain<Error=E>+Send+Sync>> {
-        self.0.get()
-    }
-
-    /// Set the current wrapped drain
-    pub fn set<D: Drain<Error=E>+Send+Sync>(&self, drain: D) {
-        let _ = self.0.set(Arc::new(Box::new(drain)));
-    }
-
-    /// Swap the existing drain with a new one
-    pub fn swap(&self, drain: Arc<Box<Drain<Error=E>+Send+Sync>>) -> Arc<Box<Drain<Error=E>+Send+Sync>> {
-        self.0.set(drain)
-    }
-
-    /// Get a `AtomicSwitch` drain controlled by this `AtomicSwitchCtrl`
-    pub fn drain(&self) -> AtomicSwitch<E> {
-        AtomicSwitch(self.0.clone())
-    }
-}
-
-impl<E> Drain for AtomicSwitch<E> {
-    type Error = E;
-    fn log(&self, info: &Record, logger_values: &OwnedKeyValueList) -> std::result::Result<(), E> {
-        self.0.get().log(info, logger_values)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/slog-extra/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"4b02f83b1737cb2149dce4ceb26f0f2bb638ca82babfb343119c9fea0e472248","CHANGELOG.md":"4de7cbce3846d61e5063e5cc6c64db5fc1c6e0a63c3c4b30206a8441d4b63fef","Cargo.toml":"d3d3f41b9c410ddf2abe7eca75a7e04ed8a8e5d31234778a8dc0adb638e26cae","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"da16c3f07d252efcad1bfb5a31a01d9b21cb05771b928a84ec1b489b8d0cc373","lib.rs":"4cbd62e5b20c363f4f5232b307b7ba78f89141a2518ca1b110bab6c9f7657c8a"},"package":"511581f4dd1dc90e4eca99b60be8a692d9c975e8757558aa774f16007d27492a"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/slog-extra/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-
-script:
-  - make all
-  - make travistest
-  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
-
-env:
-  global:
-    - RUST_BACKTRACE=1
-  matrix:
-    -
-    - RELEASE=true
-
-notifications:
-  webhooks:
-    urls:
-      - https://webhooks.gitter.im/e/6d8e17dd2fa83b143168
-    on_success: change  # options: [always|never|change] default: always
-    on_failure: change  # options: [always|never|change] default: always
-    on_start: false     # default: false
deleted file mode 100644
--- a/third_party/rust/slog-extra/CHANGELOG.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-## 0.1.2 - 2017-02-17
-### Changed
-
-* Small fixes
-* Bumped versions of internal deps.
-
-## 0.1.0 - 2016-10-20
-### Added
-* `Async` drain
deleted file mode 100644
--- a/third_party/rust/slog-extra/Cargo.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[package]
-name = "slog-extra"
-version = "0.1.2"
-authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
-description = "Standard slog-rs extensions"
-keywords = ["slog", "logging", "log"]
-license = "MPL-2.0"
-documentation = "https://docs.rs/slog-extra"
-homepage = "https://github.com/slog-rs/slog"
-repository = "https://github.com/slog-rs/extra"
-readme = "README.md"
-
-[lib]
-path = "lib.rs"
-
-[dependencies]
-slog = "1.2.0"
-thread_local = { version = "0.3.2" }
deleted file mode 100644
--- a/third_party/rust/slog-extra/LICENSE-MPL2
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in 
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
deleted file mode 100644
--- a/third_party/rust/slog-extra/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
-DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
-ifeq (, $(shell which cargo-check 2> /dev/null))
-DEFAULT_TARGET=build
-else
-DEFAULT_TARGET=build
-endif
-
-default: $(DEFAULT_TARGET)
-
-ALL_TARGETS += build $(EXAMPLES) test doc
-ifneq ($(RELEASE),)
-$(info RELEASE BUILD: $(PKG_NAME))
-CARGO_FLAGS += --release
-else
-$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
-endif
-
-EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
-
-all: $(ALL_TARGETS)
-
-.PHONY: run test build doc clean clippy
-run test build clean:
-	cargo $@ $(CARGO_FLAGS)
-
-check:
-	$(info Running check; use `make build` to actually build)
-	cargo $@ $(CARGO_FLAGS)
-
-clippy:
-	cargo build --features clippy
-
-.PHONY: bench
-bench:
-	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
-
-.PHONY: travistest
-travistest: test
-
-.PHONY: longtest
-longtest:
-	@echo "Running longtest. Press Ctrl+C to stop at any time"
-	@sleep 2
-	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
-
-.PHONY: $(EXAMPLES)
-$(EXAMPLES):
-	cargo build --example $@ $(CARGO_FLAGS)
-
-.PHONY: doc
-doc: FORCE
-	cargo doc
-
-.PHONY: publishdoc
-publishdoc:
-	rm -rf target/doc
-	make doc
-	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
-	ghp-import -n target/doc
-	git push -f origin gh-pages
-
-.PHONY: docview
-docview: doc
-	xdg-open target/doc/$(PKG_NAME)/index.html
-
-.PHONY: FORCE
-FORCE:
deleted file mode 100644
--- a/third_party/rust/slog-extra/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# slog-extra - Standard [slog-rs] extensions
-
-<p align="center">
-  <a href="https://travis-ci.org/slog-rs/std">
-      <img src="https://img.shields.io/travis/slog-rs/std/master.svg" alt="Travis CI Build Status">
-  </a>
-
-  <a href="https://crates.io/crates/slog-std">
-      <img src="https://img.shields.io/crates/d/slog-std.svg" alt="slog-std on crates.io">
-  </a>
-
-  <a href="https://gitter.im/dpc/slog-std">
-      <img src="https://img.shields.io/gitter/room/dpc/slog-rs.svg" alt="slog-rs Gitter Chat">
-  </a>
-</p>
-
-[slog-rs]: //github.com/slog-rs/core
-
-This crates contains slog-rs extensions that don't belong to the core `slog` crate due to:
-
-* not supporting `no_std`
-* having additional dependencies
-* other problems
deleted file mode 100644
--- a/third_party/rust/slog-extra/lib.rs
+++ /dev/null
@@ -1,237 +0,0 @@
-//! Standard slog-rs extensions.
-#![warn(missing_docs)]
-
-extern crate slog;
-extern crate thread_local;
-
-use slog::Drain;
-
-use std::sync::{mpsc, Mutex};
-use std::fmt;
-use std::{io, thread};
-use slog::{Record, RecordStatic, Level};
-use slog::ser::{self, Serialize, Serializer};
-
-use slog::OwnedKeyValueList;
-
-
-/// `Async` drain
-///
-/// `Async` will send all the logging records to a wrapped drain running in another thread.
-///
-/// Note: Dropping `Async` waits for it's worker-thread to finish (thus handle all previous
-/// requests). If you can't tolerate the delay, make sure you drop `Async` drain instance eg. in
-/// another thread.
-pub struct Async {
-    ref_sender: Mutex<mpsc::Sender<AsyncMsg>>,
-    tl_sender: thread_local::ThreadLocal<mpsc::Sender<AsyncMsg>>,
-    join: Mutex<Option<thread::JoinHandle<()>>>,
-}
-
-impl Async {
-    /// Create `Async` drain
-    ///
-    /// The wrapped drain must handle all error conditions (`Drain<Error=Never>`). See
-    /// `slog::DrainExt::fuse()` and `slog::DrainExt::ignore_err()` for typical error handling
-    /// strategies.
-    pub fn new<D: slog::Drain<Error=slog::Never> + Send + 'static>(drain: D) -> Self {
-        let (tx, rx) = mpsc::channel();
-        let join = thread::spawn(move || {
-                loop {
-                    match rx.recv().unwrap() {
-                        AsyncMsg::Record(r) => {
-                            let rs = RecordStatic {
-                                level: r.level,
-                                file: r.file,
-                                line: r.line,
-                                column: r.column,
-                                function: r.function,
-                                module: r.module,
-                                target: &r.target,
-                            };
-                            let record_values: Vec<_> = r.record_values
-                                .iter()
-                                .map(|&(k, ref v)| (k, v as &Serialize))
-                                .collect();
-
-                            drain.log(
-                                &Record::new(&rs,
-                                             format_args!("{}", r.msg),
-                                             record_values.as_slice()
-                                            ),
-                                            &r.logger_values
-                                            ).unwrap();
-                        }
-                        AsyncMsg::Finish => return,
-                    }
-                }
-        });
-
-        Async{
-            ref_sender: Mutex::new(tx),
-            tl_sender: thread_local::ThreadLocal::new(),
-            join: Mutex::new(Some(join)),
-        }
-    }
-
-    fn get_sender(&self) -> &mpsc::Sender<AsyncMsg> {
-        self.tl_sender.get_or(|| {
-            // TODO: Change to `get_or_try` https://github.com/Amanieu/thread_local-rs/issues/2
-            Box::new(self.ref_sender.lock().unwrap().clone())
-        })
-    }
-
-    /// Send `AsyncRecord` to a worker thread.
-    fn send(&self, r: AsyncRecord) -> io::Result<()> {
-        let sender = self.get_sender();
-
-        sender.send(AsyncMsg::Record(r))
-            .map_err(|_| io::Error::new(io::ErrorKind::BrokenPipe, "Send failed"))
-    }
-
-}
-
-type RecordValues = Vec<(&'static str, Box<Serialize + Send>)>;
-
-struct ToSendSerializer {
-    record_values: RecordValues,
-}
-
-impl ToSendSerializer {
-    fn new() -> Self {
-        ToSendSerializer { record_values: Vec::new() }
-    }
-
-    fn finish(self) -> RecordValues {
-        self.record_values
-    }
-}
-
-impl Serializer for ToSendSerializer {
-    fn emit_bool(&mut self, key: &'static str, val: bool) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_unit(&mut self, key: &'static str) -> ser::Result {
-        self.record_values.push((key, Box::new(())));
-        Ok(())
-    }
-    fn emit_none(&mut self, key: &'static str) -> ser::Result {
-        let val: Option<()> = None;
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_char(&mut self, key: &'static str, val: char) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_u8(&mut self, key: &'static str, val: u8) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_i8(&mut self, key: &'static str, val: i8) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_u16(&mut self, key: &'static str, val: u16) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_i16(&mut self, key: &'static str, val: i16) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_u32(&mut self, key: &'static str, val: u32) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_i32(&mut self, key: &'static str, val: i32) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_f32(&mut self, key: &'static str, val: f32) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_u64(&mut self, key: &'static str, val: u64) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_i64(&mut self, key: &'static str, val: i64) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_f64(&mut self, key: &'static str, val: f64) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_usize(&mut self, key: &'static str, val: usize) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_isize(&mut self, key: &'static str, val: isize) -> ser::Result {
-        self.record_values.push((key, Box::new(val)));
-        Ok(())
-    }
-    fn emit_str(&mut self, key: &'static str, val: &str) -> ser::Result {
-        self.record_values.push((key, Box::new(String::from(val))));
-        Ok(())
-    }
-    fn emit_arguments(&mut self, key: &'static str, val: &fmt::Arguments) -> ser::Result {
-        self.record_values.push((key, Box::new(fmt::format(*val))));
-        Ok(())
-    }
-}
-
-
-impl Drain for Async {
-    type Error = io::Error;
-
-    fn log(&self, record: &Record, logger_values: &OwnedKeyValueList) -> io::Result<()> {
-
-        let mut ser = ToSendSerializer::new();
-        for &(k, v) in record.values() {
-            try!(v.serialize(record, k, &mut ser))
-        }
-
-        self.send(AsyncRecord {
-            msg: fmt::format(record.msg()),
-            level: record.level(),
-            file: record.file(),
-            line: record.line(),
-            column: record.column(),
-            function: record.function(),
-            module: record.module(),
-            target: String::from(record.target()),
-            logger_values: logger_values.clone(),
-            record_values: ser.finish(),
-        })
-    }
-}
-
-struct AsyncRecord {
-    msg: String,
-    level: Level,
-    file: &'static str,
-    line: u32,
-    column: u32,
-    function: &'static str,
-    module: &'static str,
-    target: String,
-    logger_values: OwnedKeyValueList,
-    record_values: Vec<(&'static str, Box<Serialize + Send>)>,
-}
-
-enum AsyncMsg {
-    Record(AsyncRecord),
-    Finish,
-}
-
-impl Drop for Async {
-    fn drop(&mut self) {
-        let sender = self.get_sender();
-
-        let _ = sender.send(AsyncMsg::Finish);
-        let _ = self.join.lock().unwrap().take().unwrap().join();
-    }
-}
deleted file mode 100644
--- a/third_party/rust/slog-stdlog/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"CHANGELOG.md":"af163c2e549e8f0afa1a9045aa1a9a9f75d0c76eef19a9e13d696751a4befb67","Cargo.toml":"8db2e82b704d6b92c1a63723c5d2ec684fd60745d0706908dbe5d259a61c67a6","lib.rs":"bfffab260c34f0714054d51d2ac3a7fd0cd127fe07059d9327b988599408b8f0"},"package":"56cc08f40c45e0ab41dcfde0a19a22c5b7176d3827fc7d078450ebfdc080a37c"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/slog-stdlog/CHANGELOG.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-## 1.1.0
-### Changed
-
-* BREAKING: Rewrite handling of owned values.
-
-## 1.0.1 - 2016-10-02
-### Changed
-
-* Fixed `StdLog` not serializing the key-value pairs.
-* `StdLog` message to `log` crate is lazily-evaluated.
-
-
-## 1.0.0 - 2016-09-21
-
-First stable release.
deleted file mode 100644
--- a/third_party/rust/slog-stdlog/Cargo.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-name = "slog-stdlog"
-version = "1.1.0"
-authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
-description = "Standard Rust log crate adapter to slog-rs"
-keywords = ["slog", "logging", "json", "log"]
-license = "MPL-2.0"
-documentation = "https://dpc.github.io/slog-rs/"
-homepage = "https://github.com/dpc/slog-rs"
-repository = "https://github.com/dpc/slog-rs"
-readme = "../../README.md"
-
-[lib]
-path = "lib.rs"
-
-[dependencies]
-slog = { version = "1.1", path = "../.." }
-slog-term = { version = "1", path = "../term" }
-log = "0.3.6"
-lazy_static = "0.2.1"
-crossbeam = "0.2.9"
deleted file mode 100644
--- a/third_party/rust/slog-stdlog/lib.rs
+++ /dev/null
@@ -1,430 +0,0 @@
-//! Standard Rust log crate adapter to slog-rs
-//!
-//! This crate allows using `slog` features with code
-//! using legacy `log` statements.
-//!
-//! `log` crate expects a global logger to be registered
-//! (popular one is `env_logger`) as a handler for all
-//! `info!(...)` and similar.
-//!
-//! `slog-stdlog` will register itself as `log` global handler and forward all
-//! legacy logging statements to `slog`'s `Logger`. That means existing logging
-//! `debug!` (even in dependencies crates) work and utilize `slog` composable
-//! drains.
-//!
-//! See `init()` documentation for minimal working example.
-//!
-//! Note: Whilte `slog-scope` provides a similiar functionality, the `slog-scope` and `slog-stdlog`
-//! keep track of distinct logginc scopes.
-#![warn(missing_docs)]
-
-#[macro_use]
-extern crate slog;
-extern crate slog_term;
-extern crate log;
-#[macro_use]
-extern crate lazy_static;
-extern crate crossbeam;
-
-use slog::{DrainExt, ser};
-
-use log::LogMetadata;
-use std::sync::Arc;
-use std::cell::RefCell;
-use std::{io, fmt};
-use std::io::Write;
-
-use slog::Level;
-use crossbeam::sync::ArcCell;
-
-thread_local! {
-    static TL_SCOPES: RefCell<Vec<slog::Logger>> = RefCell::new(Vec::with_capacity(8))
-}
-
-lazy_static! {
-    static ref GLOBAL_LOGGER : ArcCell<slog::Logger> = ArcCell::new(
-        Arc::new(
-            slog::Logger::root(slog::Discard, o!())
-        )
-    );
-}
-
-fn set_global_logger(l: slog::Logger) {
-    let _ = GLOBAL_LOGGER.set(Arc::new(l));
-}
-
-struct Logger;
-
-
-fn log_to_slog_level(level: log::LogLevel) -> Level {
-    match level {
-        log::LogLevel::Trace => Level::Trace,
-        log::LogLevel::Debug => Level::Debug,
-        log::LogLevel::Info => Level::Info,
-        log::LogLevel::Warn => Level::Warning,
-        log::LogLevel::Error => Level::Error,
-    }
-}
-
-impl log::Log for Logger {
-    fn enabled(&self, _: &LogMetadata) -> bool {
-        true
-    }
-
-    fn log(&self, r: &log::LogRecord) {
-        let level = log_to_slog_level(r.metadata().level());
-
-        let args = r.args();
-        let target = r.target();
-        let module = r.location().__module_path;
-        let file = r.location().__file;
-        let line = r.location().line();
-        with_current_logger(|l| {
-            let s = slog::RecordStatic {
-                level: level,
-                file: file,
-                line: line,
-                column: 0,
-                function: "",
-                module: module,
-                target: target,
-            };
-            l.log(&slog::Record::new(&s, *args, &[]))
-        })
-    }
-}
-
-/// Set a `slog::Logger` as a global `log` create handler
-///
-/// This will forward all `log` records to `slog` logger.
-///
-/// ```
-/// // only use `o` macro from `slog` crate
-/// #[macro_use(o)]
-/// extern crate slog;
-/// #[macro_use]
-/// extern crate log;
-/// extern crate slog_stdlog;
-///
-/// fn main() {
-///     let root = slog::Logger::root(
-///         slog::Discard,
-///         o!("build-id" => "8dfljdf"),
-///     );
-///     slog_stdlog::set_logger(root).unwrap();
-///     // Note: this `info!(...)` macro comes from `log` crate
-///     info!("standard logging redirected to slog");
-/// }
-/// ```
-pub fn set_logger(logger: slog::Logger) -> Result<(), log::SetLoggerError> {
-    log::set_logger(|max_log_level| {
-        max_log_level.set(log::LogLevelFilter::max());
-        set_global_logger(logger);
-        Box::new(Logger)
-    })
-}
-
-/// Set a `slog::Logger` as a global `log` create handler
-///
-/// This will forward `log` records that satisfy `log_level_filter` to `slog` logger.
-pub fn set_logger_level(logger: slog::Logger,
-                        log_level_filter: log::LogLevelFilter)
-                        -> Result<(), log::SetLoggerError> {
-    log::set_logger(|max_log_level| {
-        max_log_level.set(log_level_filter);
-        set_global_logger(logger);
-        Box::new(Logger)
-    })
-}
-
-/// Minimal initialization with default drain
-///
-/// The exact default drain is unspecified and will
-/// change in future versions! Use `set_logger` instead
-/// to build customized drain.
-///
-/// ```
-/// #[macro_use]
-/// extern crate log;
-/// extern crate slog_stdlog;
-///
-/// fn main() {
-///     slog_stdlog::init().unwrap();
-///     // Note: this `info!(...)` macro comes from `log` crate
-///     info!("standard logging redirected to slog");
-/// }
-/// ```
-pub fn init() -> Result<(), log::SetLoggerError> {
-    let drain = slog::level_filter(Level::Info, slog_term::streamer().compact().build());
-    set_logger(slog::Logger::root(drain.fuse(), o!()))
-}
-
-struct ScopeGuard;
-
-
-impl ScopeGuard {
-    fn new(logger: slog::Logger) -> Self {
-        TL_SCOPES.with(|s| {
-            s.borrow_mut().push(logger);
-        });
-
-        ScopeGuard
-    }
-}
-
-impl Drop for ScopeGuard {
-    fn drop(&mut self) {
-        TL_SCOPES.with(|s| {
-            s.borrow_mut().pop().expect("TL_SCOPES should contain a logger");
-        })
-    }
-}
-
-
-/// Access the currently active logger
-///
-/// The reference logger will be either:
-/// * global logger, or
-/// * currently active scope logger
-///
-/// **Warning**: Calling `scope` inside `f`
-/// will result in a panic.
-pub fn with_current_logger<F, R>(f: F) -> R
-    where F: FnOnce(&slog::Logger) -> R
-{
-    TL_SCOPES.with(|s| {
-        let s = s.borrow();
-        if s.is_empty() {
-            f(&GLOBAL_LOGGER.get())
-        } else {
-            f(&s[s.len() - 1])
-        }
-    })
-}
-
-/// Access the `Logger` for the current logging scope
-pub fn logger() -> slog::Logger {
-    TL_SCOPES.with(|s| {
-        let s = s.borrow();
-        if s.is_empty() {
-            (*GLOBAL_LOGGER.get()).clone()
-        } else {
-            s[s.len() - 1].clone()
-        }
-    })
-}
-
-/// Execute code in a logging scope
-///
-/// Logging scopes allow using different logger for legacy logging
-/// statements in part of the code.
-///
-/// Logging scopes can be nested and are panic safe.
-///
-/// `logger` is the `Logger` to use during the duration of `f`.
-/// `with_current_logger` can be used to build it as a child of currently active
-/// logger.
-///
-/// `f` is a code to be executed in the logging scope.
-///
-/// Note: Thread scopes are thread-local. Each newly spawned thread starts
-/// with a global logger, as a current logger.
-pub fn scope<SF, R>(logger: slog::Logger, f: SF) -> R
-    where SF: FnOnce() -> R
-{
-    let _guard = ScopeGuard::new(logger);
-    f()
-}
-
-/// Drain logging `Record`s into `log` crate
-///
-/// Using `StdLog` is effectively the same as using `log::info!(...)` and
-/// other standard logging statements.
-///
-/// Caution needs to be taken to prevent circular loop where `Logger`
-/// installed via `slog-stdlog::set_logger` would log things to a `StdLog`
-/// drain, which would again log things to the global `Logger` and so on
-/// leading to an infinite recursion.
-pub struct StdLog;
-
-struct LazyLogString<'a> {
-    info: &'a slog::Record<'a>,
-    logger_values : &'a slog::OwnedKeyValueList
-}
-
-impl<'a> LazyLogString<'a> {
-
-    fn new(info : &'a slog::Record, logger_values : &'a slog::OwnedKeyValueList) -> Self {
-
-        LazyLogString {
-            info: info,
-            logger_values: logger_values,
-        }
-    }
-}
-
-impl<'a> fmt::Display for LazyLogString<'a> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-
-        try!(write!(f, "{}", self.info.msg()));
-
-        let io = io::Cursor::new(Vec::new());
-        let mut ser = KSV::new(io, ": ".into());
-
-        let res = {
-            || -> io::Result<()> {
-
-            for (ref k, ref v) in self.logger_values.iter() {
-                try!(ser.io().write_all(", ".as_bytes()));
-                try!(v.serialize(self.info, k, &mut ser));
-            }
-
-            for &(ref k, ref v) in self.info.values().iter() {
-                try!(ser.io().write_all(", ".as_bytes()));
-                try!(v.serialize(self.info, k, &mut ser));
-            }
-            Ok(())
-        }
-        }().map_err(|_| fmt::Error);
-
-        try!(res);
-
-        let values = ser.into_inner().into_inner();
-
-
-        write!(f, "{}", String::from_utf8_lossy(&values))
-
-    }
-}
-
-impl slog::Drain for StdLog {
-    type Error = io::Error;
-    fn log(&self, info: &slog::Record, logger_values : &slog::OwnedKeyValueList) -> io::Result<()> {
-
-        let level = match info.level() {
-            slog::Level::Critical => log::LogLevel::Error,
-            slog::Level::Error => log::LogLevel::Error,
-            slog::Level::Warning => log::LogLevel::Warn,
-            slog::Level::Info => log::LogLevel::Info,
-            slog::Level::Debug => log::LogLevel::Debug,
-            slog::Level::Trace => log::LogLevel::Trace,
-        };
-
-        let target = info.target();
-
-        let location = log::LogLocation {
-            __module_path: info.module(),
-            __file: info.file(),
-            __line: info.line(),
-        };
-
-        let lazy = LazyLogString::new(info, logger_values);
-        // Please don't yell at me for this! :D
-        // https://github.com/rust-lang-nursery/log/issues/95
-        log::__log(level, target, &location, format_args!("{}", lazy));
-
-        Ok(())
-    }
-}
-
-/// Key-Separator-Value serializer
-struct KSV<W: io::Write> {
-    separator: String,
-    io: W,
-}
-
-impl<W: io::Write> KSV<W> {
-    fn new(io: W, separator: String) -> Self {
-        KSV {
-            io: io,
-            separator: separator,
-        }
-    }
-
-    fn io(&mut self) -> &mut W {
-        &mut self.io
-    }
-
-    fn into_inner(self) -> W {
-        self.io
-    }
-}
-
-impl<W: io::Write> ser::Serializer for KSV<W> {
-    fn emit_none(&mut self, key: &str) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, "None"));
-        Ok(())
-    }
-    fn emit_unit(&mut self, key: &str) -> ser::Result {
-        try!(write!(self.io, "{}", key));
-        Ok(())
-    }
-
-    fn emit_bool(&mut self, key: &str, val: bool) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-
-    fn emit_char(&mut self, key: &str, val: char) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-
-    fn emit_usize(&mut self, key: &str, val: usize) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_isize(&mut self, key: &str, val: isize) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-
-    fn emit_u8(&mut self, key: &str, val: u8) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_i8(&mut self, key: &str, val: i8) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_u16(&mut self, key: &str, val: u16) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_i16(&mut self, key: &str, val: i16) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_u32(&mut self, key: &str, val: u32) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_i32(&mut self, key: &str, val: i32) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_f32(&mut self, key: &str, val: f32) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_u64(&mut self, key: &str, val: u64) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_i64(&mut self, key: &str, val: i64) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_f64(&mut self, key: &str, val: f64) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_str(&mut self, key: &str, val: &str) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> ser::Result {
-        try!(write!(self.io, "{}{}{}", key, self.separator, val));
-        Ok(())
-    }
-}
deleted file mode 100644
--- a/third_party/rust/slog-stream/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"abf49e9a9c5e47bccf61fc38a27486fa13ca5dd39eeffab145c072418bbd98aa","CHANGELOG.md":"aca50d5d669b3414a45410e8ff53f9a98761a149b81262f012884035fb619b90","Cargo.toml":"6a799822989ca386b272fd0982adc749401fb0df3fec6a6a9da501d15ff72fc7","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"40005693579af3edb05aa440b675094cbec955e62eeb0fe5ee43fc5fc47e99fa","format.rs":"1655b17acb3c94f3c5b20bc881de192e57d0570ba372fbd62f4b3d013a5b17ba","lib.rs":"90f57f61cc9ecc1f88f8b6fcbcc76fa4fbd15537be24e410879c50da20e9c9c5","rusty-tags.vi":"f939543b8f86aba0015d7d10be2a6786bb1a8ae3eef7ef4ff248739d8c4d4716"},"package":"3fac4af71007ddb7338f771e059a46051f18d1454d8ac556f234a0573e719daa"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/slog-stream/.travis.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-  
-before_install:
-  - sudo apt-get update -qq
-  - sudo apt-get install -qq graphviz
-
-script:
-  - make all
-  - make travistest
-  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
-  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo build --no-default-features; fi
-
-env:
-  global:
-    - RUST_BACKTRACE=1
-  matrix:
-    -
-    - RELEASE=true
-
-notifications:
-  webhooks:
-    urls:
-      - https://webhooks.gitter.im/e/87a331e1a21456b6e2ad
-    on_success: change  # options: [always|never|change] default: always
-    on_failure: change  # options: [always|never|change] default: always
-    on_start: false     # default: false
deleted file mode 100644
--- a/third_party/rust/slog-stream/CHANGELOG.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-## 1.2.1 - 2017-05-10
-### Changed
-
-* Update dependencies
-
-## 1.1.0 - 2016-09-28
-### Changed
-
-* **BREAKING**: `RecordDecorator` API has been changed to allow formatting
-  without any allocation.
-
-## 1.0.0 - 2016-09-21
-
-First stable release.
-## 1.2.0 - [Unreleased]
-### Changed
-
-* **BREAKING**: Switched `AsyncStramer` to `slog_extra::Async`
-
-## 1.1.0 - 2016-09-28
-### Changed
-
-* **BREAKING**: `RecordDecorator` API has been changed to allow formatting
-  without any allocation.
-
-## 1.0.0 - 2016-09-21
-
-First stable release.
deleted file mode 100644
--- a/third_party/rust/slog-stream/Cargo.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[package]
-name = "slog-stream"
-version = "1.2.1"
-authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
-description = "`io::Write` streamer for slog-rs"
-keywords = ["log", "logging", "structured", "hierarchical", "stream"]
-license = "MPL-2.0"
-documentation = "https://docs.rs/slog-stream"
-homepage = "https://github.com/slog-rs/slog"
-repository = "https://github.com/slog-rs/stream"
-readme = "README.md"
-
-[lib]
-path = "lib.rs"
-
-[dependencies]
-slog = "1.2"
-slog-extra = "0.1.1"
-thread_local = "0.3.2"
deleted file mode 100644
--- a/third_party/rust/slog-stream/LICENSE-MPL2
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in 
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
deleted file mode 100644
--- a/third_party/rust/slog-stream/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
-DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
-ifeq (, $(shell which cargo-check 2> /dev/null))
-DEFAULT_TARGET=build
-else
-DEFAULT_TARGET=build
-endif
-
-default: $(DEFAULT_TARGET)
-
-ALL_TARGETS += build $(EXAMPLES) test doc
-ifneq ($(RELEASE),)
-$(info RELEASE BUILD: $(PKG_NAME))
-CARGO_FLAGS += --release
-else
-$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
-endif
-
-EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
-
-all: $(ALL_TARGETS)
-
-.PHONY: run test build doc clean clippy
-run test build clean:
-	cargo $@ $(CARGO_FLAGS)
-
-check:
-	$(info Running check; use `make build` to actually build)
-	cargo $@ $(CARGO_FLAGS)
-
-clippy:
-	cargo build --features clippy
-
-.PHONY: bench
-bench:
-	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
-
-.PHONY: travistest
-travistest: test
-
-.PHONY: longtest
-longtest:
-	@echo "Running longtest. Press Ctrl+C to stop at any time"
-	@sleep 2
-	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
-
-.PHONY: $(EXAMPLES)
-$(EXAMPLES):
-	cargo build --example $@ $(CARGO_FLAGS)
-
-.PHONY: doc
-doc: FORCE
-	cargo doc
-
-.PHONY: publishdoc
-publishdoc:
-	rm -rf target/doc
-	make doc
-	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
-	ghp-import -n target/doc
-	git push -f origin gh-pages
-
-.PHONY: docview
-docview: doc
-	xdg-open target/doc/$(PKG_NAME)/index.html
-
-.PHONY: FORCE
-FORCE:
deleted file mode 100644
--- a/third_party/rust/slog-stream/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-## slog-stream - `io::Write` streamer for [slog-rs]
-
-<p align="center">
-  <a href="https://travis-ci.org/slog-rs/stream">
-      <img src="https://img.shields.io/travis/slog-rs/stream/master.svg" alt="Travis CI Build Status">
-  </a>
-
-  <a href="https://crates.io/crates/slog-stream">
-      <img src="https://img.shields.io/crates/d/slog-stream.svg" alt="slog-stream on crates.io">
-  </a>
-
-  <a href="https://gitter.im/slog-rs/slog">
-      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
-  </a>
-</p>
-
-[slog-rs]: //github.com/slog-rs/slog
deleted file mode 100644
--- a/third_party/rust/slog-stream/format.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-
-/// Formats `Record`-s into IO
-pub trait Format: Send + Sync + Sized {
-    /// Format one logging record and write into `io`
-    fn format(&self,
-              io: &mut io::Write,
-              info: &Record,
-              logger_values: &OwnedKeyValueList)
-              -> io::Result<()>;
-}
-
-/// Formatted stream decorator
-///
-/// Some `Format`s for which it make sense can use this to parametrize
-/// themselves on the exact behavior of formatting parts of the output. This
-/// can be used eg. to use color when displaying logger records on the terminal.
-pub trait Decorator: Send + Sync + Sized {
-    /// Per-record decorator
-    type RecordDecorator: RecordDecorator;
-
-    /// Get a `RecordDecorator` for a given `record`
-    fn decorate(&self, record: &Record) -> Self::RecordDecorator;
-}
-
-/// Per-record decorator
-// TODO 2.0: Make everything take `&mut self`.
-// TODO 2.0: Make everything take `f: &FnOnce`
-pub trait RecordDecorator {
-    /// Format a field
-    fn fmt_msg(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
-        f(io)
-    }
-    /// Format a key
-    fn fmt_key(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
-        f(io)
-    }
-    /// Format a separator
-    fn fmt_separator(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
-        f(io)
-    }
-    /// Format a value
-    fn fmt_value(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
-        f(io)
-    }
-    /// Format a timestamp
-    fn fmt_timestamp(&self, io: &mut io::Write, f : &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
-        f(io)
-    }
-    /// Format a level
-    fn fmt_level(&self, io: &mut io::Write, f: &Fn(&mut io::Write) -> io::Result<()>) -> io::Result<()> {
-        f(io)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/slog-stream/lib.rs
+++ /dev/null
@@ -1,88 +0,0 @@
-//! `io::Write` streamer for slog-rs
-//!
-//! One of the main drains not included in the core `slog-rs` create.
-//! `Streamer` drain serializes logging records into stream of bytes
-//! using given `Format` and writes it to a given `io::Write`.
-#![warn(missing_docs)]
-
-#[macro_use]
-extern crate slog;
-extern crate slog_extra;
-extern crate thread_local;
-
-use slog::{Drain, DrainExt};
-
-use std::cell::RefCell;
-
-use std::sync::Mutex;
-use std::io;
-use slog::Record;
-
-use slog_extra::Async;
-use slog::OwnedKeyValueList;
-
-include!("format.rs");
-
-thread_local! {
-    static TL_BUF: RefCell<Vec<u8>> = RefCell::new(Vec::with_capacity(128))
-}
-
-/// Drain formating records and writing them to a byte-stream (`io::Write`)
-///
-/// Uses mutex to serialize writes to `io`. Use `AsyncStreamer` for better
-/// performance, but without guarantee of immediate output.
-pub struct Streamer<W: io::Write, F: Format> {
-    io: Mutex<W>,
-    format: F,
-}
-
-impl<W: io::Write, F: Format> Streamer<W, F> {
-    /// Create new `Streamer` writing to `io` using `format`
-    pub fn new(io: W, format: F) -> Self {
-        Streamer {
-            io: Mutex::new(io),
-            format: format,
-        }
-    }
-}
-
-impl<W: 'static + io::Write + Send, F: Format + Send> Drain for Streamer<W, F> {
-    type Error = io::Error;
-
-    fn log(&self, info: &Record, logger_values: &OwnedKeyValueList) -> io::Result<()> {
-
-        TL_BUF.with(|buf| {
-            let mut buf = buf.borrow_mut();
-            let res = {
-                || {
-                    try!(self.format.format(&mut *buf, info, logger_values));
-                    {
-                        let mut io = try!(self.io
-                            .lock()
-                            .map_err(|_| io::Error::new(io::ErrorKind::Other, "lock error")));
-                        try!(io.write_all(&buf));
-                    }
-                    Ok(())
-                }
-            }();
-            buf.clear();
-            res
-        })
-    }
-}
-
-/// Stream logging records to IO
-///
-/// Create `Streamer` drain
-pub fn stream<W: io::Write + Send, F: Format>(io: W, format: F) -> Streamer<W, F> {
-    Streamer::new(io, format)
-}
-
-/// Stream logging records to IO asynchronously
-///
-/// Create `AsyncStreamer` drain
-pub fn async_stream<W: io::Write + Send + 'static, F: Format + Send + 'static>(io: W,
-                                                                               format: F)
-                                                                               -> Async {
-    Async::new(Streamer::new(io, format).fuse())
-}
deleted file mode 100644
--- a/third_party/rust/slog-stream/rusty-tags.vi
+++ /dev/null
@@ -1,341 +0,0 @@
-!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
-!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
-ASCII_LOWERCASE_MAP	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^static ASCII_LOWERCASE_MAP: [u8; 256] = [$/;"	c
-AsFmtSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct AsFmtSerializer<F>(pub F)$/;"	s
-Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Async {$/;"	i
-Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^pub struct Async {$/;"	s
-AsyncMsg	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^enum AsyncMsg {$/;"	g
-AsyncRecord	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^struct AsyncRecord {$/;"	s
-BoxExt	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^trait BoxExt<T: ?Sized> {$/;"	t
-BoxExt for Box	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized> BoxExt<T> for Box<T> {$/;"	i
-CachedIntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub type CachedIntoIter<T> = Chain<OptionIter<Box<T>>, IntoIter<T>>;$/;"	T
-CachedIterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub type CachedIterMut<'a, T> = Chain<OptionIter<&'a mut Box<T>>, IterMut<'a, T>>;$/;"	T
-CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> CachedThreadLocal<T> {$/;"	i
-CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: Send + Default> CachedThreadLocal<T> {$/;"	i
-CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct CachedThreadLocal<T: ?Sized + Send> {$/;"	s
-CheckOwned	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^        struct CheckOwned;$/;"	s
-Clone for TableEntry	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Clone for TableEntry<T> {$/;"	i
-Default for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Default for CachedThreadLocal<T> {$/;"	i
-Default for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Default for ThreadLocal<T> {$/;"	i
-Discard	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Discard;$/;"	s
-Drain	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub trait Drain {$/;"	t
-Drain for Arc	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain+?Sized> Drain for Arc<D> {$/;"	i
-Drain for Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Drain for Async {$/;"	i
-Drain for Box	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain+?Sized> Drain for Box<D> {$/;"	i
-Drain for CheckOwned	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^        impl Drain for CheckOwned {$/;"	i
-Drain for Discard	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl Drain for Discard {$/;"	i
-Drain for Duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D1 : Drain, D2 : Drain> Drain for Duplicate<D1, D2> {$/;"	i
-Drain for Filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for Filter<D> {$/;"	i
-Drain for Fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for Fuse<D> where D::Error : fmt::Display {$/;"	i
-Drain for IgnoreErr	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for IgnoreErr<D> {$/;"	i
-Drain for LevelFilter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Drain for LevelFilter<D> {$/;"	i
-Drain for Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^impl Drain for Logger {$/;"	i
-Drain for MapError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain, E> Drain for MapError<D, E> {$/;"	i
-Drain for Streamer	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^impl<W: 'static + io::Write + Send, F: Format + Send> Drain for Streamer<W, F> {$/;"	i
-DrainExt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub trait DrainExt: Sized + Drain {$/;"	t
-DrainExt for D	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D : Drain> DrainExt for D {}$/;"	i
-Drop for Async	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Drop for Async {$/;"	i
-Drop for PushFnSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Drop for PushFnSerializer<'a> {$/;"	i
-Drop for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Drop for ThreadLocal<T> {$/;"	i
-Duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D1: Drain, D2: Drain> Duplicate<D1, D2> {$/;"	i
-Duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Duplicate<D1: Drain, D2: Drain> {$/;"	s
-DuplicateError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub enum DuplicateError<E1, E2> {$/;"	g
-Err	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    type Err = ();$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    type Error = io::Error;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = D::Error;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = DuplicateError<D1::Error, D2::Error>;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = E;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error = Never;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    type Error;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    type Error = Never;$/;"	T
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub enum Error {$/;"	g
-Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^            type Error = Never;$/;"	T
-Error	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    type Error = io::Error;$/;"	T
-ExactSizeIterator for IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> ExactSizeIterator for IntoIter<T> {}$/;"	i
-ExactSizeIterator for IterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> ExactSizeIterator for IterMut<'a, T> {}$/;"	i
-Filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Filter<D> {$/;"	i
-Filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Filter<D: Drain> {$/;"	s
-FilterLevel	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl FilterLevel {$/;"	i
-FilterLevel	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub enum FilterLevel {$/;"	g
-FnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct FnValue<V: 'static + Value, F>(pub F)$/;"	s
-Format	/home/dpc/lab/rust/slog/slog-stream/format.rs	/^pub trait Format: Send + Sync + Sized {$/;"	t
-From for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl From<core::fmt::Error> for Error {$/;"	i
-From for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl From<std::io::Error> for Error {$/;"	i
-From for std	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl From<Error> for std::io::Error {$/;"	i
-FromStr for FilterLevel	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl FromStr for FilterLevel {$/;"	i
-Fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> Fuse<D> {$/;"	i
-Fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct Fuse<D: Drain> {$/;"	s
-IgnoreErr	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> IgnoreErr<D> {$/;"	i
-IgnoreErr	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct IgnoreErr<D: Drain> {$/;"	s
-IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = CachedIntoIter<T>;$/;"	T
-IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = CachedIterMut<'a, T>;$/;"	T
-IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = IntoIter<T>;$/;"	T
-IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type IntoIter = IterMut<'a, T>;$/;"	T
-IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct IntoIter<T: ?Sized + Send> {$/;"	s
-IntoIterator	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> IntoIterator for &'a mut CachedThreadLocal<T> {$/;"	i
-IntoIterator	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> IntoIterator for &'a mut ThreadLocal<T> {$/;"	i
-IntoIterator for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> IntoIterator for CachedThreadLocal<T> {$/;"	i
-IntoIterator for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> IntoIterator for ThreadLocal<T> {$/;"	i
-Item	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    type Item = &'a KV;$/;"	T
-Item	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type Item = &'a mut Box<T>;$/;"	T
-Item	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    type Item = Box<T>;$/;"	T
-IterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct IterMut<'a, T: ?Sized + Send + 'a> {$/;"	s
-Iterator for IntoIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> Iterator for IntoIter<T> {$/;"	i
-Iterator for IterMut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<'a, T: ?Sized + Send + 'a> Iterator for IterMut<'a, T> {$/;"	i
-Iterator for OwnedKVGroupIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> Iterator for OwnedKVGroupIterator<'a> {$/;"	i
-Iterator for OwnedKVIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> Iterator for OwnedKVIterator<'a> {$/;"	i
-KV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl KV for () {$/;"	i
-KV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T: KV, R: KV> KV for (T, R) {$/;"	i
-KV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait KV {$/;"	t
-KV for SingleKV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<K, V> KV for SingleKV<K, V>$/;"	i
-Key	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Key for &'a str {$/;"	i
-Key	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait Key {$/;"	t
-Key for String	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Key for String {$/;"	i
-Key for str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Key for str {$/;"	i
-LOG_LEVEL_NAMES	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub static LOG_LEVEL_NAMES: [&'static str; 7] = ["OFF", "CRITICAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"];$/;"	c
-LOG_LEVEL_SHORT_NAMES	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub static LOG_LEVEL_SHORT_NAMES: [&'static str; 7] = ["OFF", "CRIT", "ERRO", "WARN", "INFO", "DEBG", "TRCE"];$/;"	c
-Level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl Level {$/;"	i
-Level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^pub enum Level {$/;"	g
-LevelFilter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain> LevelFilter<D> {$/;"	i
-LevelFilter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct LevelFilter<D: Drain> {$/;"	s
-Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^impl Logger {$/;"	i
-Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^pub struct Logger {$/;"	s
-MapError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<D: Drain, E> MapError<D, E> {$/;"	i
-MapError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub struct MapError<D: Drain, E> {$/;"	s
-Never	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/lib.rs	/^pub type Never = ();$/;"	T
-OwnedKVGroup	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVGroup($/;"	s
-OwnedKVGroupIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> OwnedKVGroupIterator<'a> {$/;"	i
-OwnedKVGroupIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVGroupIterator<'a> {$/;"	s
-OwnedKVIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl<'a> OwnedKVIterator<'a> {$/;"	i
-OwnedKVIterator	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVIterator<'a> {$/;"	s
-OwnedKVList	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl OwnedKVList {$/;"	i
-OwnedKVList	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^pub struct OwnedKVList {$/;"	s
-OwnedKVListNode	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^struct OwnedKVListNode {$/;"	s
-PushFnSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> PushFnSerializer<'a> {$/;"	i
-PushFnSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct PushFnSerializer<'a> {$/;"	s
-PushFnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct PushFnValue<F>(pub F)$/;"	s
-RS	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^            static RS : $crate::RecordStatic<'static> = $crate::RecordStatic {$/;"	c
-RawIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> RawIter<T> {$/;"	i
-RawIter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^struct RawIter<T: ?Sized + Send> {$/;"	s
-Record	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^impl<'a> Record<'a> {$/;"	i
-Record	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^pub struct Record<'a> {$/;"	s
-RecordStatic	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^pub struct RecordStatic<'a> {$/;"	s
-RecordValues	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^type RecordValues = Vec<Box<slog::KV+Send>>;$/;"	T
-Result	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub type Result<T=()> = result::Result<T, Error>;$/;"	T
-STATIC_TERMINATOR_UNIT	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^static STATIC_TERMINATOR_UNIT : () = ();$/;"	c
-Serializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait Serializer {$/;"	t
-Serializer for AsFmtSerializer	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<F> Serializer for AsFmtSerializer<F>$/;"	i
-Serializer for ToSendSerializer	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl Serializer for ToSendSerializer {$/;"	i
-SingleKV	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub struct SingleKV<K, V>(pub K, pub V)$/;"	s
-Streamer	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^impl<W: io::Write, F: Format> Streamer<W, F> {$/;"	i
-Streamer	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^pub struct Streamer<W: io::Write, F: Format> {$/;"	s
-Sync for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^unsafe impl<T: ?Sized + Send> Sync for CachedThreadLocal<T> {}$/;"	i
-Sync for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^unsafe impl<T: ?Sized + Send> Sync for ThreadLocal<T> {}$/;"	i
-TL_BUF	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    static TL_BUF: RefCell<Vec<u8>> = RefCell::new(Vec::with_capacity(128))$/;"	c
-Table	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^struct Table<T: ?Sized + Send> {$/;"	s
-TableEntry	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^struct TableEntry<T: ?Sized + Send> {$/;"	s
-ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send> ThreadLocal<T> {$/;"	i
-ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: Send + Default> ThreadLocal<T> {$/;"	i
-ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^pub struct ThreadLocal<T: ?Sized + Send> {$/;"	s
-ToSendSerializer	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^impl ToSendSerializer {$/;"	i
-ToSendSerializer	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^struct ToSendSerializer {$/;"	s
-UncheckedOptionExt	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^trait UncheckedOptionExt<T> {$/;"	t
-UncheckedOptionExt for Option	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T> UncheckedOptionExt<T> for Option<T> {$/;"	i
-UncheckedOptionExt for Result	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T, E> UncheckedOptionExt<T> for Result<T, E> {$/;"	i
-Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^        impl Value for $t {$/;"	i
-Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for () {$/;"	i
-Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Value for &'a str {$/;"	i
-Value	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^pub trait Value {$/;"	t
-Value for Arc	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T> Value for Arc<T>$/;"	i
-Value for Box	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for Box<Value + Send + 'static> {$/;"	i
-Value for F	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<V: 'static + Value, F> Value for F$/;"	i
-Value for FnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<V: 'static + Value, F> Value for FnValue<V, F>$/;"	i
-Value for Option	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T: Value> Value for Option<T> {$/;"	i
-Value for PushFnValue	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<F> Value for PushFnValue<F>$/;"	i
-Value for Rc	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T> Value for Rc<T>$/;"	i
-Value for String	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for String {$/;"	i
-Value for core	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<T> Value for core::num::Wrapping<T>$/;"	i
-Value for fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl<'a> Value for fmt::Arguments<'a> {$/;"	i
-Value for str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl Value for str {$/;"	i
-Void	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    enum Void {}$/;"	g
-__slog_static_max_level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^pub fn __slog_static_max_level() -> FilterLevel {$/;"	f
-append	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn append(&self, other: &OwnedKVList) -> OwnedKVList {$/;"	f
-as_short_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn as_short_str(&self) -> &'static str {$/;"	f
-as_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn as_str(&self) -> &'static str {$/;"	f
-as_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn as_str(&self) -> &str {$/;"	f
-as_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn as_str(&self) -> &str;$/;"	f
-as_usize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn as_usize(&self) -> usize {$/;"	f
-async_stream	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^pub fn async_stream<W: io::Write + Send + 'static, F: Format + Send + 'static>(io: W,$/;"	f
-cause	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn cause(&self) -> Option<&std::error::Error> {$/;"	f
-clear	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn clear(&mut self) {$/;"	f
-clone	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn clone(&self) -> TableEntry<T> {$/;"	f
-column	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn column(&self) -> u32 {$/;"	f
-core::fmt::Display for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl core::fmt::Display for Error {$/;"	i
-crit	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! crit($/;"	d
-debug	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! debug($/;"	d
-default	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn default() -> CachedThreadLocal<T> {$/;"	f
-default	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn default() -> ThreadLocal<T> {$/;"	f
-description	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn description(&self) -> &str {$/;"	f
-different_thread	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn different_thread() {$/;"	f
-different_thread_cached	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn different_thread_cached() {$/;"	f
-drop	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn drop(&mut self) {$/;"	f
-drop	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn drop(&mut self) {$/;"	f
-drop	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn drop(&mut self) {$/;"	f
-duplicate	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub fn duplicate<D1: Drain, D2: Drain>(d1: D1, d2: D2) -> Duplicate<D1, D2> {$/;"	f
-emit_arguments	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> slog::Result {$/;"	f
-emit_arguments	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> Result {$/;"	f
-emit_arguments	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> Result;$/;"	f
-emit_bool	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_bool(&mut self, key: &str, val: bool) -> slog::Result {$/;"	f
-emit_char	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_char(&mut self, key: &str, val: char) -> slog::Result {$/;"	f
-emit_f32	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_f32(&mut self, key: &str, val: f32) -> slog::Result {$/;"	f
-emit_f64	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_f64(&mut self, key: &str, val: f64) -> slog::Result {$/;"	f
-emit_i16	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i16(&mut self, key: &str, val: i16) -> slog::Result {$/;"	f
-emit_i32	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i32(&mut self, key: &str, val: i32) -> slog::Result {$/;"	f
-emit_i64	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i64(&mut self, key: &str, val: i64) -> slog::Result {$/;"	f
-emit_i8	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_i8(&mut self, key: &str, val: i8) -> slog::Result {$/;"	f
-emit_isize	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_isize(&mut self, key: &str, val: isize) -> slog::Result {$/;"	f
-emit_none	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_none(&mut self, key: &str) -> slog::Result {$/;"	f
-emit_none	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_none(&mut self, key: &str) -> Result {$/;"	f
-emit_str	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_str(&mut self, key: &str, val: &str) -> slog::Result {$/;"	f
-emit_u16	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u16(&mut self, key: &str, val: u16) -> slog::Result {$/;"	f
-emit_u32	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u32(&mut self, key: &str, val: u32) -> slog::Result {$/;"	f
-emit_u64	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u64(&mut self, key: &str, val: u64) -> slog::Result {$/;"	f
-emit_u8	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_u8(&mut self, key: &str, val: u8) -> slog::Result {$/;"	f
-emit_unit	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_unit(&mut self, key: &str) -> slog::Result {$/;"	f
-emit_unit	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn emit_unit(&mut self, key: &str) -> Result {$/;"	f
-emit_usize	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn emit_usize(&mut self, key: &str, val: usize) -> slog::Result {$/;"	f
-error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! error($/;"	d
-file	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn file(&self) -> &'static str {$/;"	f
-filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub fn filter<D: Drain, F: 'static + Send + Sync + Fn(&Record) -> bool>($/;"	f
-filterlevel_sanity	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^fn filterlevel_sanity() {$/;"	f
-finish	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn finish(self) -> RecordValues {$/;"	f
-fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
-fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
-fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
-fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
-fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn fmt(&self, fmt: &mut core::fmt::Formatter) -> std::fmt::Result {$/;"	f
-fmt	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {$/;"	f
-fmt::Debug for CachedThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send + fmt::Debug> fmt::Debug for CachedThreadLocal<T> {$/;"	i
-fmt::Debug for Logger	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^impl fmt::Debug for Logger {$/;"	i
-fmt::Debug for OwnedKVList	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^impl fmt::Debug for OwnedKVList {$/;"	i
-fmt::Debug for ThreadLocal	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^impl<T: ?Sized + Send + fmt::Debug> fmt::Debug for ThreadLocal<T> {$/;"	i
-fmt::Display for DuplicateError	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^impl<E1 : fmt::Display, E2 : fmt::Display> fmt::Display for DuplicateError<E1, E2> {$/;"	i
-fmt::Display for Level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^impl fmt::Display for Level {$/;"	i
-foo	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^        fn foo<T: Sync>() {}$/;"	f
-format	/home/dpc/lab/rust/slog/slog-stream/format.rs	/^    fn format(&self,$/;"	f
-from	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn from(_: core::fmt::Error) -> Error {$/;"	f
-from	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn from(e: Error) -> std::io::Error {$/;"	f
-from	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn from(err: std::io::Error) -> Error {$/;"	f
-from_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn from_raw(raw: *mut T) -> Self {$/;"	f
-from_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn from_raw(raw: *mut T) -> Self;$/;"	f
-from_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    fn from_str(level: &str) -> core::result::Result<FilterLevel, ()> {$/;"	f
-from_usize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn from_usize(u: usize) -> Option<FilterLevel> {$/;"	f
-from_usize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn from_usize(u: usize) -> Option<Level> {$/;"	f
-function	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn function(&self) -> &'static str {$/;"	f
-fuse	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn fuse(self) -> Fuse<Self> where <Self as Drain>::Error : fmt::Display {$/;"	f
-get	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get(&self) -> Option<&T> {$/;"	f
-get_default	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get_default(&self) -> &T {$/;"	f
-get_fast	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn get_fast(&self, id: usize) -> Option<&T> {$/;"	f
-get_or	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get_or<F>(&self, create: F) -> &T$/;"	f
-get_or_try	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn get_or_try<F, E>(&self, create: F) -> Result<&T, E>$/;"	f
-get_or_try_slow	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn get_or_try_slow<F, E>(&self, id: usize, owner: usize, create: F) -> Result<&T, E>$/;"	f
-get_sender	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn get_sender(&self) -> &mpsc::Sender<AsyncMsg> {$/;"	f
-get_slow	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn get_slow(&self, id: usize, table_top: &Table<T>) -> Option<&T> {$/;"	f
-hash	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^fn hash(id: usize, bits: usize) -> usize {$/;"	f
-ignore_err	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn ignore_err(self) -> IgnoreErr<Self> {$/;"	f
-impl_default_as_fmt	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^macro_rules! impl_default_as_fmt{$/;"	d
-impl_value_for	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^macro_rules! impl_value_for{$/;"	d
-info	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! info($/;"	d
-insert	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn insert(&self, id: usize, data: Box<T>, new: bool) -> &T {$/;"	f
-into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> CachedIntoIter<T> {$/;"	f
-into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> CachedIterMut<'a, T> {$/;"	f
-into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> IntoIter<T> {$/;"	f
-into_iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_iter(self) -> IterMut<'a, T> {$/;"	f
-into_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_raw(b: Self) -> *mut T;$/;"	f
-into_raw	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn into_raw(mut b: Self) -> *mut T {$/;"	f
-is_at_least	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn is_at_least(&self, level : Self) -> bool {$/;"	f
-is_sync	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn is_sync() {$/;"	f
-iter	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn iter() {$/;"	f
-iter_cached	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn iter_cached() {$/;"	f
-iter_groups	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    pub fn iter_groups(&self) -> OwnedKVGroupIterator {$/;"	f
-iter_mut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn iter_mut(&mut self) -> CachedIterMut<T> {$/;"	f
-iter_mut	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn iter_mut(&mut self) -> IterMut<T> {$/;"	f
-iter_single	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    pub fn iter_single(&self) -> OwnedKVIterator {$/;"	f
-level	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn level(&self) -> Level {$/;"	f
-level_at_least	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^fn level_at_least() {$/;"	f
-level_filter	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^pub fn level_filter<D: Drain>(level: Level, d: D) -> LevelFilter<D> {$/;"	f
-level_from_str	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^fn level_from_str() {$/;"	f
-line	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn line(&self) -> u32 {$/;"	f
-log	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn log(&self, record: &Record, logger_values: &OwnedKVList) -> io::Result<()> {$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self, _: &Record, _: &OwnedKVList) -> result::Result<(), Never> {$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self, info: &Record, o: &OwnedKVList) -> result::Result<(), D::Error> {$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self, record: &Record, values : &OwnedKVList) -> result::Result<(), Self::Error>;$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn log(&self,$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    fn log(&self, record: &Record, values : &OwnedKVList) -> result::Result<(), Self::Error> {$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    pub fn log(&self, record: &Record) {$/;"	f
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! log($/;"	d
-log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^            fn log(&self,$/;"	f
-log	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    fn log(&self, info: &Record, logger_values: &OwnedKVList) -> io::Result<()> {$/;"	f
-logger_fmt_debug_sanity	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn logger_fmt_debug_sanity() {$/;"	f
-lookup	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn lookup(id: usize, table: &Table<T>) -> Option<&UnsafeCell<Option<Box<T>>>> {$/;"	f
-make_create	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn make_create() -> Arc<Fn() -> Box<usize> + Send + Sync> {$/;"	f
-map_err	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    fn map_err<F, E>(self, f : F) -> MapError<Self, E> where F : 'static + Sync + Send + Fn(<Self as Drain>::Error) -> E {$/;"	f
-max	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn max() -> Self {$/;"	f
-min	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_level.rs	/^    pub fn min() -> Self {$/;"	f
-module	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn module(&self) -> &'static str {$/;"	f
-msg	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn msg(&self) -> fmt::Arguments {$/;"	f
-multichain	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn multichain() {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn new() -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    pub fn new<D: slog::Drain<Error=slog::Never> + Send + 'static>(drain: D) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new(drain1: D1, drain2: D2) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new(drain: D) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new(drain: D, level: Level) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new<F: 'static + Sync + Send + Fn(&Record) -> bool>(drain: D, cond: F) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_drain.rs	/^    pub fn new<F: 'static + Sync + Send + Fn(<D as Drain>::Error) -> E>(drain: D, map_fn: F) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn new(list: &'a OwnedKVList) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn new(values: OwnedKVGroup, parent: &OwnedKVList) -> Self {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    pub fn new(&self, values: OwnedKVGroup) -> Logger {$/;"	f
-new	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn new($/;"	f
-new	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn new() -> CachedThreadLocal<T> {$/;"	f
-new	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    pub fn new() -> ThreadLocal<T> {$/;"	f
-new	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^    pub fn new(io: W, format: F) -> Self {$/;"	f
-next	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn next(&mut self) -> Option<Self::Item> {$/;"	f
-next	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn next(&mut self) -> Option<&'a mut Box<T>> {$/;"	f
-next	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn next(&mut self) -> Option<*mut Option<Box<T>>> {$/;"	f
-next	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn next(&mut self) -> Option<Box<T>> {$/;"	f
-no_imports	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^mod no_imports {$/;"	m
-o	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! o($/;"	d
-root	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_kv.rs	/^    fn root(values: OwnedKVGroup) -> Self {$/;"	f
-root	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_logger.rs	/^    pub fn root<D>(d: D, values: OwnedKVGroup) -> Logger$/;"	f
-same_thread	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn same_thread() {$/;"	f
-same_thread_cached	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn same_thread_cached() {$/;"	f
-send	/home/dpc/.cargo/git/checkouts/extra-4841682ba715deeb/35f528f/lib.rs	/^    fn send(&self, r: AsyncRecord) -> io::Result<()> {$/;"	f
-serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^            fn serialize(&self, _record : &Record, key : &str, serializer : &mut Serializer)$/;"	f
-serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn serialize(&self, record: &Record, key: &str, serializer: &mut Serializer)$/;"	f
-serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn serialize(&self,$/;"	f
-serialize	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    pub fn serialize<'b, S: 'b + Value>(mut self, s: S) -> Result {$/;"	f
-size_hint	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    fn size_hint(&self) -> (usize, Option<usize>) {$/;"	f
-slog_crit	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_crit($/;"	d
-slog_debug	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_debug($/;"	d
-slog_error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_error($/;"	d
-slog_info	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_info($/;"	d
-slog_log	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_log($/;"	d
-slog_o	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_o($/;"	d
-slog_trace	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_trace($/;"	d
-slog_warn	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! slog_warn($/;"	d
-split_first	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn split_first(&self) -> Option<(&KV, &KV)> {$/;"	f
-split_first	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^    fn split_first(&self) -> Option<(&KV, &KV)>;$/;"	f
-std::error::Error for Error	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_ser.rs	/^impl std::error::Error for Error {$/;"	i
-std_only	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^mod std_only {$/;"	m
-stream	/home/dpc/lab/rust/slog/slog-stream/lib.rs	/^pub fn stream<W: io::Write + Send, F: Format>(io: W, format: F) -> Streamer<W, F> {$/;"	f
-target	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn target(&self) -> &str {$/;"	f
-test_o_macro_expansion	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn test_o_macro_expansion() {$/;"	f
-test_slog_o_macro_expansion	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/tests.rs	/^    fn test_slog_o_macro_expansion() {$/;"	f
-tests	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/lib.rs	/^mod tests;$/;"	m
-tests	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^mod tests {$/;"	m
-trace	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! trace($/;"	d
-unchecked_unwrap	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn unchecked_unwrap(self) -> T {$/;"	f
-unchecked_unwrap	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^    unsafe fn unchecked_unwrap(self) -> T;$/;"	f
-unreachable	/home/dpc/.cargo/registry/src/github.com-1ecc6299db9ec823/thread_local-0.2.7/src/lib.rs	/^unsafe fn unreachable() -> ! {$/;"	f
-values	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_record.rs	/^    pub fn values(&self) -> &'a [&KV] {$/;"	f
-warn	/home/dpc/.cargo/git/checkouts/slog-1186f70b488e4d02/00b4390/src/_macros.rs	/^macro_rules! warn($/;"	d
deleted file mode 100644
--- a/third_party/rust/slog-term/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"88727d3c65d8328457560104264358b567a339dcebc3f6c4df3ba308f1944acc","CHANGELOG.md":"44eba7dd11980076bfc44fb83fc3b23aee1b82812530e64aac88ccb2b1d9325d","Cargo.toml":"973e07ab059f6448873cea70433c7212b39aff0a53062c1da401a2ab9bb60799","LICENSE-MPL2":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","Makefile":"500a3af82638116a8d782b74091185fa7440b38cce99dd0b246e9965807d48b1","README.md":"134ae4eb1e4799f9aeab997b3e9b5dc1fdc5170b897f9722844d2245c1f6a4c9","lib.rs":"7065ed5a7c9ec2252f1b5f58c7f339502c28f54edc6b444c2f3f0e168714cc19"},"package":"cb53c0bae0745898fd5a7b75b1c389507333470ac4c645ae431890c0f828b6ca"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/slog-term/.travis.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-language: rust
-rust:
-  - stable
-  - 1.12.0
-  - beta
-  - nightly
-
-script:
-  - make all
-  - make travistest
-  - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then make bench ; fi
-
-env:
-  global:
-    - RUST_BACKTRACE=1
-  matrix:
-    -
-    - RELEASE=true
-
-notifications:
-  webhooks:
-    urls:
-      - https://webhooks.gitter.im/e/6d8e17dd2fa83b143168
-    on_success: change  # options: [always|never|change] default: always
-    on_failure: change  # options: [always|never|change] default: always
-    on_start: false     # default: false
deleted file mode 100644
--- a/third_party/rust/slog-term/CHANGELOG.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to [Semantic Versioning](http://semver.org/).
-
-## 1.5.0 - 2017-02-05
-### Change
-
-* Reverse the order of record values in full mode to match slog 1.5
-  definition
-
-## 1.4.0 - 2017-01-29
-### Changed
-
-* Fix a bug in `new_plain` that would make it still use colors.
-* No comma will be printed after an empty "msg" field
-* Changed order of full format values
-
-## 1.3.5 - 2016-01-13
-### Fixed
-
-* [1.3.4 with `?` operator breaks semver](https://github.com/slog-rs/term/issues/6) - fix allows builds on stable Rust back to 1.11
-
-## 1.3.4 - 2016-12-27
-### Fixed
-
-* [Fix compact formatting grouping messages incorrectly](https://github.com/slog-rs/slog/issues/90)
-
-## 1.3.3 - 2016-10-31
-### Changed
-
-* Added `Send+Sync` to `Drain` returned on `build`
-
-## 1.3.2 - 2016-10-22
-### Changed
-
-* Fix compact format, repeating some values unnecessarily.
-
-## 1.3.1 - 2016-10-22
-### Changed
-
-* Make `Format` public so it can be reused
-
-## 1.3.0 - 2016-10-21
-### Changed
-
-* **BREAKING**: Switched `AsyncStramer` to `slog_extra::Async`
-
-## 1.2.0 - 2016-10-17
-### Changed
-
-* **BREAKING**: Rewrite handling of owned values.
-
-## 1.1.0 - 2016-09-28
-### Added
-
-* Custom timestamp function support
-
-### Changed
-
-* Logging level color uses only first 8 ANSI terminal colors for better compatibility
-
-## 1.0.0 - 2016-09-21
-
-First stable release.
deleted file mode 100644
--- a/third_party/rust/slog-term/Cargo.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-name = "slog-term"
-version = "1.5.0"
-authors = ["Dawid Ciężarkiewicz <dpc@dpc.pw>"]
-description = "Unix terminal drain and formatter for slog-rs"
-keywords = ["slog", "logging", "log", "term"]
-license = "MPL-2.0"
-documentation = "https://docs.rs/slog-term"
-homepage = "https://github.com/slog-rs/slog"
-repository = "https://github.com/slog-rs/term"
-readme = "README.md"
-
-[lib]
-path = "lib.rs"
-
-[dependencies]
-slog = "1.5.0"
-slog-stream = "1.2"
-isatty = "0.1"
-chrono = "0.2"
-thread_local = "0.3"
deleted file mode 100644
--- a/third_party/rust/slog-term/LICENSE-MPL2
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
-    means each individual or legal entity that creates, contributes to
-    the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
-    means the combination of the Contributions of others (if any) used
-    by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
-    means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
-    means Source Code Form to which the initial Contributor has attached
-    the notice in Exhibit A, the Executable Form of such Source Code
-    Form, and Modifications of such Source Code Form, in each case
-    including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
-    means
-
-    (a) that the initial Contributor has attached the notice described
-        in Exhibit B to the Covered Software; or
-
-    (b) that the Covered Software was made available under the terms of
-        version 1.1 or earlier of the License, but not also under the
-        terms of a Secondary License.
-
-1.6. "Executable Form"
-    means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
-    means a work that combines Covered Software with other material, in 
-    a separate file or files, that is not Covered Software.
-
-1.8. "License"
-    means this document.
-
-1.9. "Licensable"
-    means having the right to grant, to the maximum extent possible,
-    whether at the time of the initial grant or subsequently, any and
-    all of the rights conveyed by this License.
-
-1.10. "Modifications"
-    means any of the following:
-
-    (a) any file in Source Code Form that results from an addition to,
-        deletion from, or modification of the contents of Covered
-        Software; or
-
-    (b) any new file in Source Code Form that contains any Covered
-        Software.
-
-1.11. "Patent Claims" of a Contributor
-    means any patent claim(s), including without limitation, method,
-    process, and apparatus claims, in any patent Licensable by such
-    Contributor that would be infringed, but for the grant of the
-    License, by the making, using, selling, offering for sale, having
-    made, import, or transfer of either its Contributions or its
-    Contributor Version.
-
-1.12. "Secondary License"
-    means either the GNU General Public License, Version 2.0, the GNU
-    Lesser General Public License, Version 2.1, the GNU Affero General
-    Public License, Version 3.0, or any later versions of those
-    licenses.
-
-1.13. "Source Code Form"
-    means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
-    means an individual or a legal entity exercising rights under this
-    License. For legal entities, "You" includes any entity that
-    controls, is controlled by, or is under common control with You. For
-    purposes of this definition, "control" means (a) the power, direct
-    or indirect, to cause the direction or management of such entity,
-    whether by contract or otherwise, or (b) ownership of more than
-    fifty percent (50%) of the outstanding shares or beneficial
-    ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
-    Licensable by such Contributor to use, reproduce, make available,
-    modify, display, perform, distribute, and otherwise exploit its
-    Contributions, either on an unmodified basis, with Modifications, or
-    as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
-    for sale, have made, import, and otherwise transfer either its
-    Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
-    or
-
-(b) for infringements caused by: (i) Your and any other third party's
-    modifications of Covered Software, or (ii) the combination of its
-    Contributions with other software (except as part of its Contributor
-    Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
-    its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
-    Form, as described in Section 3.1, and You must inform recipients of
-    the Executable Form how they can obtain a copy of such Source Code
-    Form by reasonable means in a timely manner, at a charge no more
-    than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
-    License, or sublicense it under different terms, provided that the
-    license for the Executable Form does not attempt to limit or alter
-    the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-*                                                                      *
-*  6. Disclaimer of Warranty                                           *
-*  -------------------------                                           *
-*                                                                      *
-*  Covered Software is provided under this License on an "as is"       *
-*  basis, without warranty of any kind, either expressed, implied, or  *
-*  statutory, including, without limitation, warranties that the       *
-*  Covered Software is free of defects, merchantable, fit for a        *
-*  particular purpose or non-infringing. The entire risk as to the     *
-*  quality and performance of the Covered Software is with You.        *
-*  Should any Covered Software prove defective in any respect, You     *
-*  (not any Contributor) assume the cost of any necessary servicing,   *
-*  repair, or correction. This disclaimer of warranty constitutes an   *
-*  essential part of this License. No use of any Covered Software is   *
-*  authorized under this License except under this disclaimer.         *
-*                                                                      *
-************************************************************************
-
-************************************************************************
-*                                                                      *
-*  7. Limitation of Liability                                          *
-*  --------------------------                                          *
-*                                                                      *
-*  Under no circumstances and under no legal theory, whether tort      *
-*  (including negligence), contract, or otherwise, shall any           *
-*  Contributor, or anyone who distributes Covered Software as          *
-*  permitted above, be liable to You for any direct, indirect,         *
-*  special, incidental, or consequential damages of any character      *
-*  including, without limitation, damages for lost profits, loss of    *
-*  goodwill, work stoppage, computer failure or malfunction, or any    *
-*  and all other commercial damages or losses, even if such party      *
-*  shall have been informed of the possibility of such damages. This   *
-*  limitation of liability shall not apply to liability for death or   *
-*  personal injury resulting from such party's negligence to the       *
-*  extent applicable law prohibits such limitation. Some               *
-*  jurisdictions do not allow the exclusion or limitation of           *
-*  incidental or consequential damages, so this exclusion and          *
-*  limitation may not apply to You.                                    *
-*                                                                      *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
-  This Source Code Form is subject to the terms of the Mozilla Public
-  License, v. 2.0. If a copy of the MPL was not distributed with this
-  file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
-  This Source Code Form is "Incompatible With Secondary Licenses", as
-  defined by the Mozilla Public License, v. 2.0.
deleted file mode 100644
--- a/third_party/rust/slog-term/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-PKG_NAME=$(shell grep name Cargo.toml | head -n 1 | awk -F \" '{print $$2}')
-DOCS_DEFAULT_MODULE=$(subst -,_,$(PKG_NAME))
-ifeq (, $(shell which cargo-check 2> /dev/null))
-DEFAULT_TARGET=build
-else
-DEFAULT_TARGET=build
-endif
-
-default: $(DEFAULT_TARGET)
-
-ALL_TARGETS += build $(EXAMPLES) test doc
-ifneq ($(RELEASE),)
-$(info RELEASE BUILD: $(PKG_NAME))
-CARGO_FLAGS += --release
-else
-$(info DEBUG BUILD: $(PKG_NAME); use `RELEASE=true make [args]` for release build)
-endif
-
-EXAMPLES = $(shell cd examples 2>/dev/null && ls *.rs 2>/dev/null | sed -e 's/.rs$$//g' )
-
-all: $(ALL_TARGETS)
-
-.PHONY: run test build doc clean clippy
-run test build clean:
-	cargo $@ $(CARGO_FLAGS)
-
-check:
-	$(info Running check; use `make build` to actually build)
-	cargo $@ $(CARGO_FLAGS)
-
-clippy:
-	cargo build --features clippy
-
-.PHONY: bench
-bench:
-	cargo $@ $(filter-out --release,$(CARGO_FLAGS))
-
-.PHONY: travistest
-travistest: test
-
-.PHONY: longtest
-longtest:
-	@echo "Running longtest. Press Ctrl+C to stop at any time"
-	@sleep 2
-	@i=0; while i=$$((i + 1)) && echo "Iteration $$i" && make test ; do :; done
-
-.PHONY: $(EXAMPLES)
-$(EXAMPLES):
-	cargo build --example $@ $(CARGO_FLAGS)
-
-.PHONY: doc
-doc: FORCE
-	cargo doc
-
-.PHONY: publishdoc
-publishdoc:
-	rm -rf target/doc
-	make doc
-	echo '<meta http-equiv="refresh" content="0;url='${DOCS_DEFAULT_MODULE}'/index.html">' > target/doc/index.html
-	ghp-import -n target/doc
-	git push -f origin gh-pages
-
-.PHONY: docview
-docview: doc
-	xdg-open target/doc/$(PKG_NAME)/index.html
-
-.PHONY: FORCE
-FORCE:
deleted file mode 100644
--- a/third_party/rust/slog-term/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-<p align="center">
-
-  <a href="https://github.com/slog-rs/slog">
-  <img src="https://cdn.rawgit.com/slog-rs/misc/master/media/slog.svg" alt="slog-rs logo">
-  </a>
-  <br>
-
-  <a href="https://travis-ci.org/slog-rs/term">
-      <img src="https://img.shields.io/travis/slog-rs/term/master.svg" alt="Travis CI Build Status">
-  </a>
-
-  <a href="https://crates.io/crates/slog-term">
-      <img src="https://img.shields.io/crates/d/slog-term.svg" alt="slog-term on crates.io">
-  </a>
-
-  <a href="https://gitter.im/slog-rs/slog">
-      <img src="https://img.shields.io/gitter/room/slog-rs/slog.svg" alt="slog-rs Gitter Chat">
-  </a>
-</p>
-
-# slog-term  - Unix terminal drain for [slog-rs]
-
-[slog-rs]: //github.com/slog-rs/slog
deleted file mode 100644
--- a/third_party/rust/slog-term/lib.rs
+++ /dev/null
@@ -1,699 +0,0 @@
-//! Unix terminal formatter and drain for slog-rs
-//!
-//! ```
-//! #[macro_use]
-//! extern crate slog;
-//! extern crate slog_term;
-//!
-//! use slog::*;
-//!
-//! fn main() {
-//!     let root = Logger::root(slog_term::streamer().build().fuse(), o!("build-id" => "8dfljdf"));
-//! }
-//! ```
-#![warn(missing_docs)]
-
-extern crate slog;
-extern crate slog_stream;
-extern crate isatty;
-extern crate chrono;
-extern crate thread_local;
-
-use std::{io, fmt, sync, cell};
-use std::io::Write;
-
-use isatty::{stderr_isatty, stdout_isatty};
-
-use slog::Record;
-use slog::ser;
-use slog::{Level, OwnedKeyValueList};
-use slog_stream::Format as StreamFormat;
-use slog_stream::{Decorator, RecordDecorator, stream, async_stream};
-
-thread_local! {
-    static TL_BUF: cell::RefCell<Vec<u8>> = cell::RefCell::new(Vec::with_capacity(128));
-}
-
-// Wrapper for `Write` types that counts total bytes written.
-struct CountingWriter<'a> {
-    wrapped: &'a mut io::Write,
-    count: usize,
-}
-
-impl<'a> CountingWriter<'a> {
-    fn new(wrapped: &'a mut io::Write) -> CountingWriter {
-        CountingWriter {
-            wrapped: wrapped,
-            count: 0,
-        }
-    }
-
-    fn count(&self) -> usize {
-        self.count
-    }
-}
-
-impl<'a> Write for CountingWriter<'a> {
-    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
-        self.wrapped.write(buf).map(|n| {
-            self.count += n;
-            n
-        })
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        self.wrapped.flush()
-    }
-
-    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
-        self.wrapped.write_all(buf).map(|_| {
-            self.count += buf.len();
-            ()
-        })
-    }
-}
-
-type WriterFn = Fn(&mut io::Write) -> io::Result<()>;
-
-// Wrapper for `Write` types that executes a closure before writing anything,
-// but only if the write isn't empty. A `finish` call executes a closure after
-// writing, but again, only if something has been written.
-struct SurroundingWriter<'a> {
-    wrapped: &'a mut io::Write,
-    before: Option<&'a WriterFn>,
-    after: Option<&'a WriterFn>,
-}
-
-impl<'a> SurroundingWriter<'a> {
-    fn new(wrapped: &'a mut io::Write,
-           before: &'a WriterFn,
-           after: &'a WriterFn)
-           -> SurroundingWriter<'a> {
-        SurroundingWriter {
-            wrapped: wrapped,
-            before: Some(before),
-            after: Some(after),
-        }
-    }
-
-    fn do_before(&mut self, buf: &[u8]) -> io::Result<()> {
-        if buf.len() > 0 {
-            if let Some(before) = self.before.take() {
-                try!(before(self.wrapped));
-            }
-        }
-        Ok(())
-    }
-
-    fn finish(&mut self) -> io::Result<()> {
-        if let Some(after) = self.after.take() {
-            if self.before.is_none() {
-                try!(after(self.wrapped));
-            }
-        }
-        Ok(())
-    }
-}
-
-impl<'a> Drop for SurroundingWriter<'a> {
-    fn drop(&mut self) {
-        let _ = self.finish();
-    }
-}
-
-impl<'a> Write for SurroundingWriter<'a> {
-    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
-        try!(self.do_before(buf));
-        self.wrapped.write(buf)
-    }
-
-    fn flush(&mut self) -> io::Result<()> {
-        self.wrapped.flush()
-    }
-
-    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
-        try!(self.do_before(buf));
-        self.wrapped.write_all(buf)
-    }
-}
-
-
-/// Timestamp function type
-pub type TimestampFn = Fn(&mut io::Write) -> io::Result<()> + Send + Sync;
-
-/// Formatting mode
-pub enum FormatMode {
-    /// Compact logging format
-    Compact,
-    /// Full logging format
-    Full,
-}
-
-/// Full formatting with optional color support
-pub struct Format<D: Decorator> {
-    mode: FormatMode,
-    decorator: D,
-    history: sync::Mutex<Vec<Vec<u8>>>,
-    fn_timestamp: Box<TimestampFn>,
-}
-
-impl<D: Decorator> Format<D> {
-    /// New Format format that prints using color
-    pub fn new(mode: FormatMode, d: D, fn_timestamp: Box<TimestampFn>) -> Self {
-        Format {
-            decorator: d,
-            mode: mode,
-            history: sync::Mutex::new(vec![]),
-            fn_timestamp: fn_timestamp,
-        }
-    }
-
-    // Returns `true` if message was not empty
-    fn print_msg_header(&self,
-                        io: &mut io::Write,
-                        rd: &D::RecordDecorator,
-                        record: &Record)
-                        -> io::Result<bool> {
-        try!(rd.fmt_timestamp(io, &*self.fn_timestamp));
-        try!(rd.fmt_level(io,
-                          &|io: &mut io::Write| write!(io, " {} ", record.level().as_short_str())));
-
-        let mut writer = CountingWriter::new(io);
-        try!(rd.fmt_msg(&mut writer, &|io| write!(io, "{}", record.msg())));
-        Ok(writer.count() > 0)
-    }
-
-    fn format_full(&self,
-                   io: &mut io::Write,
-                   record: &Record,
-                   logger_values: &OwnedKeyValueList)
-                   -> io::Result<()> {
-
-        let r_decorator = self.decorator.decorate(record);
-
-
-        let mut comma_needed = try!(self.print_msg_header(io, &r_decorator, record));
-        let mut serializer = Serializer::new(io, r_decorator);
-
-        for &(k, v) in record.values().iter().rev() {
-            if comma_needed {
-                try!(serializer.print_comma());
-            }
-            try!(v.serialize(record, k, &mut serializer));
-            comma_needed |= true;
-        }
-
-        for (k, v) in logger_values.iter() {
-            if comma_needed {
-                try!(serializer.print_comma());
-            }
-            try!(v.serialize(record, k, &mut serializer));
-            comma_needed |= true;
-        }
-
-        let (mut io, _decorator_r) = serializer.finish();
-
-        try!(write!(io, "\n"));
-
-        Ok(())
-    }
-
-
-    fn format_compact(&self,
-                      io: &mut io::Write,
-                      record: &Record,
-                      logger_values: &OwnedKeyValueList)
-                      -> io::Result<()> {
-
-
-        let indent = try!(self.format_recurse(io, record, logger_values));
-
-        try!(self.print_indent(io, indent));
-
-        let r_decorator = self.decorator.decorate(record);
-        let mut ser = Serializer::new(io, r_decorator);
-        let mut comma_needed = try!(self.print_msg_header(ser.io, &ser.decorator, record));
-
-        for &(k, v) in record.values() {
-            if comma_needed {
-                try!(ser.print_comma());
-            }
-            try!(v.serialize(record, k, &mut ser));
-            comma_needed |= true;
-        }
-        try!(write!(&mut ser.io, "\n"));
-
-        Ok(())
-    }
-
-    fn print_indent(&self, io: &mut io::Write, indent: usize) -> io::Result<()> {
-        for _ in 0..indent {
-            try!(write!(io, "  "));
-        }
-        Ok(())
-    }
-
-    // record in the history, and check if should print
-    // given set of values
-    fn should_print(&self, line: &[u8], indent: usize) -> bool {
-        let mut history = self.history.lock().unwrap();
-        if history.len() <= indent {
-            debug_assert_eq!(history.len(), indent);
-            history.push(line.into());
-            true
-        } else {
-            let should = history[indent] != line;
-            if should {
-                history[indent] = line.into();
-                history.truncate(indent + 1);
-            }
-            should
-        }
-    }
-
-    /// Recursively format given `logger_values_ref`
-    ///
-    /// Returns it's indent level
-    fn format_recurse(&self,
-                      io : &mut io::Write,
-                      record: &slog::Record,
-                      logger_values_ref: &slog::OwnedKeyValueList)
-                                    -> io::Result<usize> {
-        let mut indent = if logger_values_ref.parent().is_none() {
-            0
-        } else {
-            try!(self.format_recurse(io, record, logger_values_ref.parent().as_ref().unwrap()))
-        };
-
-
-        if let Some(logger_values) = logger_values_ref.values() {
-            let res : io::Result<()> = TL_BUF.with(|line| {
-                let mut line = line.borrow_mut();
-                line.clear();
-                let r_decorator = self.decorator.decorate(record);
-                let mut ser = Serializer::new(&mut *line, r_decorator);
-
-                try!(self.print_indent(&mut ser.io, indent));
-                let mut clean = true;
-                let mut logger_values = logger_values;
-                let mut kvs = vec!();
-                loop {
-                    let (k, v) = logger_values.head();
-                    kvs.push((k, v));
-
-                    logger_values = if let Some(v) = logger_values.tail() {
-                        v
-                    } else {
-                        break;
-                    }
-                }
-
-                for &(k, v) in kvs.iter().rev() {
-                    if !clean {
-                        try!(ser.print_comma());
-                    }
-                    try!(v.serialize(record, k, &mut ser));
-                    clean = false;
-                }
-
-                let (mut line, _) = ser.finish();
-
-                if self.should_print(line, indent) {
-                    try!(write!(line, "\n"));
-                    try!(io.write_all(line));
-                }
-                Ok(())
-            });
-            try!(res);
-            indent += 1;
-        }
-
-        Ok(indent)
-    }
-}
-
-fn severity_to_color(lvl: Level) -> u8 {
-    match lvl {
-        Level::Critical => 5,
-        Level::Error => 1,
-        Level::Warning => 3,
-        Level::Info => 2,
-        Level::Debug => 6,
-        Level::Trace => 4,
-    }
-}
-
-/// Record decorator (color) for terminal output
-pub struct ColorDecorator {
-    use_color: bool,
-}
-
-impl ColorDecorator {
-    /// New decorator that does color records
-    pub fn new_colored() -> Self {
-        ColorDecorator { use_color: true }
-    }
-    /// New decorator that does not color records
-    pub fn new_plain() -> Self {
-        ColorDecorator { use_color: false }
-    }
-}
-
-/// Particular record decorator (color) for terminal output
-pub struct ColorRecordDecorator {
-    level_color: Option<u8>,
-    key_bold: bool,
-}
-
-
-impl Decorator for ColorDecorator {
-    type RecordDecorator = ColorRecordDecorator;
-
-    fn decorate(&self, record: &Record) -> ColorRecordDecorator {
-        if self.use_color {
-            ColorRecordDecorator {
-                level_color: Some(severity_to_color(record.level())),
-                key_bold: true,
-            }
-        } else {
-            ColorRecordDecorator {
-                level_color: None,
-                key_bold: false,
-            }
-        }
-    }
-}
-
-
-impl RecordDecorator for ColorRecordDecorator {
-    fn fmt_level(&self,
-                 io: &mut io::Write,
-                 f: &Fn(&mut io::Write) -> io::Result<()>)
-                 -> io::Result<()> {
-        if let Some(level_color) = self.level_color {
-            try!(write!(io, "\x1b[3{}m", level_color));
-            try!(f(io));
-            try!(write!(io, "\x1b[39m"));
-        } else {
-            try!(f(io));
-        }
-        Ok(())
-    }
-
-
-    fn fmt_msg(&self,
-               io: &mut io::Write,
-               f: &Fn(&mut io::Write) -> io::Result<()>)
-               -> io::Result<()> {
-        if self.key_bold {
-            let before = |io: &mut io::Write| write!(io, "\x1b[1m");
-            let after = |io: &mut io::Write| write!(io, "\x1b[0m");
-            let mut wrapper = SurroundingWriter::new(io, &before, &after);
-            try!(f(&mut wrapper));
-            try!(wrapper.finish());
-        } else {
-            try!(f(io));
-        }
-        Ok(())
-    }
-
-    fn fmt_key(&self,
-               io: &mut io::Write,
-               f: &Fn(&mut io::Write) -> io::Result<()>)
-               -> io::Result<()> {
-        self.fmt_msg(io, f)
-    }
-}
-
-struct Serializer<W, D: RecordDecorator> {
-    io: W,
-    decorator: D,
-}
-
-impl<W: io::Write, D: RecordDecorator> Serializer<W, D> {
-    fn new(io: W, d: D) -> Self {
-        Serializer {
-            io: io,
-            decorator: d,
-        }
-    }
-
-    fn print_comma(&mut self) -> io::Result<()> {
-        try!(self.decorator.fmt_separator(&mut self.io, &|io: &mut io::Write| write!(io, ", ")));
-        Ok(())
-    }
-
-    fn finish(self) -> (W, D) {
-        (self.io, self.decorator)
-    }
-}
-
-macro_rules! s(
-    ($s:expr, $k:expr, $v:expr) => {
-        try!($s.decorator.fmt_key(&mut $s.io, &|io : &mut io::Write| write!(io, "{}", $k)));
-        try!($s.decorator.fmt_separator(&mut $s.io, &|io : &mut io::Write| write!(io, ": ")));
-        try!($s.decorator.fmt_value(&mut $s.io, &|io : &mut io::Write| write!(io, "{}", $v)));
-    };
-);
-
-
-impl<W: io::Write, D: RecordDecorator> slog::ser::Serializer for Serializer<W, D> {
-    fn emit_none(&mut self, key: &str) -> ser::Result {
-        s!(self, key, "None");
-        Ok(())
-    }
-    fn emit_unit(&mut self, key: &str) -> ser::Result {
-        s!(self, key, "()");
-        Ok(())
-    }
-
-    fn emit_bool(&mut self, key: &str, val: bool) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-
-    fn emit_char(&mut self, key: &str, val: char) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-
-    fn emit_usize(&mut self, key: &str, val: usize) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_isize(&mut self, key: &str, val: isize) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-
-    fn emit_u8(&mut self, key: &str, val: u8) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_i8(&mut self, key: &str, val: i8) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_u16(&mut self, key: &str, val: u16) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_i16(&mut self, key: &str, val: i16) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_u32(&mut self, key: &str, val: u32) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_i32(&mut self, key: &str, val: i32) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_f32(&mut self, key: &str, val: f32) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_u64(&mut self, key: &str, val: u64) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_i64(&mut self, key: &str, val: i64) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_f64(&mut self, key: &str, val: f64) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_str(&mut self, key: &str, val: &str) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-    fn emit_arguments(&mut self, key: &str, val: &fmt::Arguments) -> ser::Result {
-        s!(self, key, val);
-        Ok(())
-    }
-}
-
-impl<D: Decorator + Send + Sync> StreamFormat for Format<D> {
-    fn format(&self,
-              io: &mut io::Write,
-              record: &Record,
-              logger_values: &OwnedKeyValueList)
-              -> io::Result<()> {
-        match self.mode {
-            FormatMode::Compact => self.format_compact(io, record, logger_values),