Init

[?]
Jun 4, 2021, 9:08 AM
NPSWSVZNDMXYBVCBFSHZ2PVLUSX45LZVUMD6ROS3KLHNMBTYASZQC

Dependencies

Change contents

  • file addition: src (d--r------)
    [1.0]
  • file addition: main.rs (----------)
    [0.6]
    use etcd_client::Client;
    use hyper::service::{make_service_fn, service_fn};
    use hyper::{Body, Request, Response, Server, StatusCode};
    use log::*;
    use std::convert::Infallible;
    use std::net::SocketAddr;
    use std::sync::Arc;
    use tokio::sync::watch::*;
    use tokio::sync::Mutex;
    use tokio_postgres::NoTls;
    const LEASE_DURATION: i64 = 10;
    #[tokio::main]
    async fn main() {
    env_logger::init();
    let matches = clap::App::new("Postrep")
    .version("0.1")
    .author("Pierre-Étienne Meunier <pe@pijul.org>")
    .arg(
    clap::Arg::with_name("host")
    .long("host")
    .help("Name of this host")
    .required(true)
    .takes_value(true),
    )
    .arg(
    clap::Arg::with_name("signal")
    .long("signal")
    .help("Path to the postgres signal file")
    .required(true)
    .takes_value(true),
    )
    .arg(clap::Arg::with_name("port").long("port").takes_value(true))
    .arg(clap::Arg::with_name("password").long("password").takes_value(true))
    .get_matches();
    let (db, connection) = tokio_postgres::connect("host=localhost user=postgres", NoTls)
    .await
    .unwrap();
    let db = Arc::new(Mutex::new(db));
    let dbt = tokio::spawn(async move {
    if let Err(e) = connection.await {
    eprintln!("connection error: {}", e);
    }
    });
    tokio::pin!(dbt);
    let host = matches.value_of("host").unwrap().to_string();
    let signal = matches.value_of("signal").unwrap().to_string();
    let password = matches.value_of("password").unwrap().to_string();
    let (lead, is_leader) = channel(false);
    let lead = Arc::new(lead);
    let mut election_observer = tokio::spawn(observe_elections(
    host.clone(),
    signal.clone(),
    password.clone(),
    lead.clone(),
    db.clone(),
    ));
    let mut race = tokio::spawn(race(
    host.clone(),
    signal.clone(),
    lead.clone(),
    is_leader.clone(),
    ));
    let addr = SocketAddr::from((
    [0, 0, 0, 0],
    matches
    .value_of("port")
    .and_then(|x| x.parse().ok())
    .unwrap_or(8008),
    ));
    let make_service = make_service_fn(move |_conn| {
    let is_leader = is_leader.clone();
    async move { Ok::<_, Infallible>(service_fn(move |req| handle(req, is_leader.clone()))) }
    });
    loop {
    tokio::select!(
    _ = Server::bind(&addr).serve(make_service.clone()) => {
    debug!("http server stopping");
    break
    },
    _ = &mut dbt => {
    // If this database breaks, release the lock.
    tokio::time::sleep(std::time::Duration::from_secs(1)).await;
    info!("Restarting database connection");
    let (db_, connection) = if let Ok(x) = tokio_postgres::connect("host=localhost user=postgres", NoTls).await {
    x
    } else {
    tokio::time::sleep(std::time::Duration::from_millis(100)).await;
    continue
    };
    lead.send(false).unwrap();
    dbt.set(tokio::spawn(async move {
    if let Err(e) = connection.await {
    eprintln!("connection error: {}", e);
    }
    }));
    *db.lock().await = db_
    }
    _ = &mut race => {
    debug!("race stopped");
    break
    }
    _ = &mut election_observer => {
    debug!("election observer stopped");
    break
    }
    )
    }
    }
    async fn handle(
    _req: Request<Body>,
    is_leader: Receiver<bool>,
    ) -> Result<Response<Body>, Infallible> {
    if *is_leader.borrow() {
    Ok(Response::new(Body::from("OK")))
    } else {
    let mut resp = Response::new(Body::from("Not OK"));
    *resp.status_mut() = StatusCode::NOT_FOUND;
    Ok(resp)
    }
    }
    async fn race(
    host: String,
    signal: String,
    lead: Arc<Sender<bool>>,
    mut is_leader: Receiver<bool>,
    ) -> Result<(), anyhow::Error> {
    loop {
    let mut client = Client::connect(["localhost:2379"], None).await.unwrap();
    let lease = client.lease_grant(LEASE_DURATION, None).await?;
    let id = lease.id();
    info!("Taking lock {:x?}", id);
    let mut lock = client.campaign("postrep", host.as_str(), id).await?;
    debug!("lock = {:?}", lock);
    let (mut keeper, _stream) = client.lease_keep_alive(id).await?;
    let is_leader_ = is_leader.clone();
    let t = tokio::spawn(async move {
    tokio::time::sleep(std::time::Duration::from_secs(LEASE_DURATION as u64 / 2)).await;
    while *is_leader_.borrow() {
    debug!("sending keep alive");
    if let Err(e) = keeper.keep_alive().await {
    error!("{:?}", e);
    break;
    }
    tokio::time::sleep(std::time::Duration::from_secs(LEASE_DURATION as u64 / 2)).await;
    }
    debug!("done renewing");
    });
    let leader = lock.take_leader().unwrap();
    info!("Lock acquired: {:?}", leader);
    std::fs::remove_file(&signal).unwrap_or(());
    lead.send(true).unwrap();
    debug!("waiting for instance to become non-leader");
    loop {
    is_leader.changed().await.unwrap();
    debug!("changed: {:?}", is_leader.borrow());
    if !*is_leader.borrow() {
    info!("Lock released");
    // at.store(false, Ordering::SeqCst);
    t.await.unwrap();
    client
    .resign(Some(etcd_client::ResignOptions::new().with_leader(leader)))
    .await?;
    break;
    }
    }
    }
    }
    async fn observe_elections(
    host: String,
    signal: String,
    password: String,
    lead: Arc<Sender<bool>>,
    pool: Arc<Mutex<tokio_postgres::Client>>,
    ) -> Result<(), anyhow::Error> {
    let mut client = Client::connect(["localhost:2379"], None).await?;
    let mut obs = client.observe("postrep").await?;
    while let Some(m) = obs.message().await? {
    debug!("obs: {:?}", m);
    let leader = m.kv().unwrap().value_str()?;
    if leader != host {
    info!("The leader is {:?}", leader);
    std::fs::write(&signal, "").unwrap_or(());
    lead.send(false).unwrap();
    } else {
    info!("I'm the leader");
    std::fs::remove_file(&signal).unwrap_or(());
    lead.send(true).unwrap();
    }
    let pool = pool.lock().await;
    pool.execute(format!("ALTER SYSTEM SET primary_conninfo='host={} port=5432 user=replication password={}'", leader, password).as_str(), &[]).await?;
    }
    Ok(())
    }
  • file addition: default.nix (----------)
    [1.0]
    with import <nixpkgs> {};
    clangStdenv.mkDerivation rec {
    name = "nest-env";
    PROTOC="${protobuf}/bin/protoc";
    }
  • file addition: README.md (----------)
    [1.0]
    ## Postrep, a basic PostgreSQL custering tool
    Postrep uses a fixed replication strategy (streaming replication), a fixed leader election tool (Etcd 3), to achieve proper failover when the cluster leader fails.
  • file addition: Cargo.toml (----------)
    [1.0]
    [package]
    name = "postrep"
    version = "0.1.0"
    authors = ["Pierre-Étienne Meunier <pmeunier@mailbox.org>"]
    edition = "2018"
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    [dependencies]
    etcd-client = "*"
    futures = "*"
    tokio = { version = "1.4", features = [ "net", "time", "rt-multi-thread", "macros", "io-util", "fs", "sync", "signal" ] }
    hyper = "*"
    clap = "*"
    anyhow = "*"
    log = "*"
    env_logger = "*"
    tokio-postgres = "*"
  • file addition: Cargo.lock (----------)
    [1.0]
    # This file is automatically @generated by Cargo.
    # It is not intended for manual editing.
    [[package]]
    name = "aho-corasick"
    version = "0.7.18"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
    dependencies = [
    "memchr",
    ]
    [[package]]
    name = "ansi_term"
    version = "0.11.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
    dependencies = [
    "winapi",
    ]
    [[package]]
    name = "anyhow"
    version = "1.0.40"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
    [[package]]
    name = "async-stream"
    version = "0.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "0a26cb53174ddd320edfff199a853f93d571f48eeb4dde75e67a9a3dbb7b7e5e"
    dependencies = [
    "async-stream-impl",
    "futures-core",
    ]
    [[package]]
    name = "async-stream-impl"
    version = "0.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "db134ba52475c060f3329a8ef0f8786d6b872ed01515d4b79c162e5798da1340"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "async-trait"
    version = "0.1.50"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "atty"
    version = "0.2.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
    dependencies = [
    "hermit-abi",
    "libc",
    "winapi",
    ]
    [[package]]
    name = "autocfg"
    version = "1.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
    [[package]]
    name = "base64"
    version = "0.13.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
    [[package]]
    name = "bitflags"
    version = "1.2.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
    [[package]]
    name = "block-buffer"
    version = "0.9.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
    dependencies = [
    "generic-array",
    ]
    [[package]]
    name = "byteorder"
    version = "1.4.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
    [[package]]
    name = "bytes"
    version = "1.0.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
    [[package]]
    name = "cfg-if"
    version = "1.0.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
    [[package]]
    name = "clap"
    version = "2.33.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
    dependencies = [
    "ansi_term",
    "atty",
    "bitflags",
    "strsim",
    "textwrap",
    "unicode-width",
    "vec_map",
    ]
    [[package]]
    name = "cpufeatures"
    version = "0.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5cd5a7748210e7ec1a9696610b1015e6e31fbf58f77a160801f124bd1c36592a"
    [[package]]
    name = "crypto-mac"
    version = "0.10.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6"
    dependencies = [
    "generic-array",
    "subtle",
    ]
    [[package]]
    name = "digest"
    version = "0.9.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
    dependencies = [
    "generic-array",
    ]
    [[package]]
    name = "either"
    version = "1.6.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
    [[package]]
    name = "env_logger"
    version = "0.8.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f"
    dependencies = [
    "atty",
    "humantime",
    "log",
    "regex",
    "termcolor",
    ]
    [[package]]
    name = "etcd-client"
    version = "0.6.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3d80294643e620e280bece8df0eca6933c3c3cec2b3179803ef00b76183e9f5e"
    dependencies = [
    "http",
    "prost",
    "tokio",
    "tokio-stream",
    "tonic",
    "tonic-build",
    ]
    [[package]]
    name = "fallible-iterator"
    version = "0.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
    [[package]]
    name = "fixedbitset"
    version = "0.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
    [[package]]
    name = "fnv"
    version = "1.0.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
    [[package]]
    name = "futures"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253"
    dependencies = [
    "futures-channel",
    "futures-core",
    "futures-executor",
    "futures-io",
    "futures-sink",
    "futures-task",
    "futures-util",
    ]
    [[package]]
    name = "futures-channel"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25"
    dependencies = [
    "futures-core",
    "futures-sink",
    ]
    [[package]]
    name = "futures-core"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815"
    [[package]]
    name = "futures-executor"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d"
    dependencies = [
    "futures-core",
    "futures-task",
    "futures-util",
    ]
    [[package]]
    name = "futures-io"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04"
    [[package]]
    name = "futures-macro"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b"
    dependencies = [
    "proc-macro-hack",
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "futures-sink"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23"
    [[package]]
    name = "futures-task"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc"
    [[package]]
    name = "futures-util"
    version = "0.3.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025"
    dependencies = [
    "futures-channel",
    "futures-core",
    "futures-io",
    "futures-macro",
    "futures-sink",
    "futures-task",
    "memchr",
    "pin-project-lite",
    "pin-utils",
    "proc-macro-hack",
    "proc-macro-nested",
    "slab",
    ]
    [[package]]
    name = "generic-array"
    version = "0.14.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
    dependencies = [
    "typenum",
    "version_check",
    ]
    [[package]]
    name = "getrandom"
    version = "0.2.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
    dependencies = [
    "cfg-if",
    "libc",
    "wasi",
    ]
    [[package]]
    name = "h2"
    version = "0.3.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726"
    dependencies = [
    "bytes",
    "fnv",
    "futures-core",
    "futures-sink",
    "futures-util",
    "http",
    "indexmap",
    "slab",
    "tokio",
    "tokio-util",
    "tracing",
    ]
    [[package]]
    name = "hashbrown"
    version = "0.9.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
    [[package]]
    name = "heck"
    version = "0.3.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
    dependencies = [
    "unicode-segmentation",
    ]
    [[package]]
    name = "hermit-abi"
    version = "0.1.18"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
    dependencies = [
    "libc",
    ]
    [[package]]
    name = "hmac"
    version = "0.10.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15"
    dependencies = [
    "crypto-mac",
    "digest",
    ]
    [[package]]
    name = "http"
    version = "0.2.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11"
    dependencies = [
    "bytes",
    "fnv",
    "itoa",
    ]
    [[package]]
    name = "http-body"
    version = "0.4.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737"
    dependencies = [
    "bytes",
    "http",
    "pin-project-lite",
    ]
    [[package]]
    name = "httparse"
    version = "1.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437"
    [[package]]
    name = "httpdate"
    version = "1.0.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9"
    [[package]]
    name = "humantime"
    version = "2.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
    [[package]]
    name = "hyper"
    version = "0.14.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54"
    dependencies = [
    "bytes",
    "futures-channel",
    "futures-core",
    "futures-util",
    "h2",
    "http",
    "http-body",
    "httparse",
    "httpdate",
    "itoa",
    "pin-project",
    "socket2",
    "tokio",
    "tower-service",
    "tracing",
    "want",
    ]
    [[package]]
    name = "indexmap"
    version = "1.6.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
    dependencies = [
    "autocfg",
    "hashbrown",
    ]
    [[package]]
    name = "instant"
    version = "0.1.9"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
    dependencies = [
    "cfg-if",
    ]
    [[package]]
    name = "itertools"
    version = "0.9.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
    dependencies = [
    "either",
    ]
    [[package]]
    name = "itoa"
    version = "0.4.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
    [[package]]
    name = "lazy_static"
    version = "1.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
    [[package]]
    name = "libc"
    version = "0.2.94"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
    [[package]]
    name = "lock_api"
    version = "0.4.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
    dependencies = [
    "scopeguard",
    ]
    [[package]]
    name = "log"
    version = "0.4.14"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
    dependencies = [
    "cfg-if",
    ]
    [[package]]
    name = "matches"
    version = "0.1.8"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
    [[package]]
    name = "md-5"
    version = "0.9.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15"
    dependencies = [
    "block-buffer",
    "digest",
    "opaque-debug",
    ]
    [[package]]
    name = "memchr"
    version = "2.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
    [[package]]
    name = "mio"
    version = "0.7.11"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956"
    dependencies = [
    "libc",
    "log",
    "miow",
    "ntapi",
    "winapi",
    ]
    [[package]]
    name = "miow"
    version = "0.3.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
    dependencies = [
    "winapi",
    ]
    [[package]]
    name = "multimap"
    version = "0.8.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
    [[package]]
    name = "ntapi"
    version = "0.3.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
    dependencies = [
    "winapi",
    ]
    [[package]]
    name = "num_cpus"
    version = "1.13.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
    dependencies = [
    "hermit-abi",
    "libc",
    ]
    [[package]]
    name = "once_cell"
    version = "1.7.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
    [[package]]
    name = "opaque-debug"
    version = "0.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
    [[package]]
    name = "parking_lot"
    version = "0.11.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
    dependencies = [
    "instant",
    "lock_api",
    "parking_lot_core",
    ]
    [[package]]
    name = "parking_lot_core"
    version = "0.8.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"
    dependencies = [
    "cfg-if",
    "instant",
    "libc",
    "redox_syscall",
    "smallvec",
    "winapi",
    ]
    [[package]]
    name = "percent-encoding"
    version = "2.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
    [[package]]
    name = "petgraph"
    version = "0.5.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
    dependencies = [
    "fixedbitset",
    "indexmap",
    ]
    [[package]]
    name = "phf"
    version = "0.8.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
    dependencies = [
    "phf_shared",
    ]
    [[package]]
    name = "phf_shared"
    version = "0.8.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
    dependencies = [
    "siphasher",
    ]
    [[package]]
    name = "pin-project"
    version = "1.0.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4"
    dependencies = [
    "pin-project-internal",
    ]
    [[package]]
    name = "pin-project-internal"
    version = "1.0.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "pin-project-lite"
    version = "0.2.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
    [[package]]
    name = "pin-utils"
    version = "0.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
    [[package]]
    name = "postgres-protocol"
    version = "0.6.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ff3e0f70d32e20923cabf2df02913be7c1842d4c772db8065c00fcfdd1d1bff3"
    dependencies = [
    "base64",
    "byteorder",
    "bytes",
    "fallible-iterator",
    "hmac",
    "md-5",
    "memchr",
    "rand",
    "sha2",
    "stringprep",
    ]
    [[package]]
    name = "postgres-types"
    version = "0.2.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "430f4131e1b7657b0cd9a2b0c3408d77c9a43a042d300b8c77f981dffcc43a2f"
    dependencies = [
    "bytes",
    "fallible-iterator",
    "postgres-protocol",
    ]
    [[package]]
    name = "postrep"
    version = "0.1.0"
    dependencies = [
    "anyhow",
    "clap",
    "env_logger",
    "etcd-client",
    "futures",
    "hyper",
    "log",
    "tokio",
    "tokio-postgres",
    ]
    [[package]]
    name = "ppv-lite86"
    version = "0.2.10"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
    [[package]]
    name = "proc-macro-hack"
    version = "0.5.19"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
    [[package]]
    name = "proc-macro-nested"
    version = "0.1.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
    [[package]]
    name = "proc-macro2"
    version = "1.0.26"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
    dependencies = [
    "unicode-xid",
    ]
    [[package]]
    name = "prost"
    version = "0.7.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2"
    dependencies = [
    "bytes",
    "prost-derive",
    ]
    [[package]]
    name = "prost-build"
    version = "0.7.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "32d3ebd75ac2679c2af3a92246639f9fcc8a442ee420719cc4fe195b98dd5fa3"
    dependencies = [
    "bytes",
    "heck",
    "itertools",
    "log",
    "multimap",
    "petgraph",
    "prost",
    "prost-types",
    "tempfile",
    "which",
    ]
    [[package]]
    name = "prost-derive"
    version = "0.7.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "169a15f3008ecb5160cba7d37bcd690a7601b6d30cfb87a117d45e59d52af5d4"
    dependencies = [
    "anyhow",
    "itertools",
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "prost-types"
    version = "0.7.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb"
    dependencies = [
    "bytes",
    "prost",
    ]
    [[package]]
    name = "quote"
    version = "1.0.9"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
    dependencies = [
    "proc-macro2",
    ]
    [[package]]
    name = "rand"
    version = "0.8.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
    dependencies = [
    "libc",
    "rand_chacha",
    "rand_core",
    "rand_hc",
    ]
    [[package]]
    name = "rand_chacha"
    version = "0.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
    dependencies = [
    "ppv-lite86",
    "rand_core",
    ]
    [[package]]
    name = "rand_core"
    version = "0.6.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"
    dependencies = [
    "getrandom",
    ]
    [[package]]
    name = "rand_hc"
    version = "0.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
    dependencies = [
    "rand_core",
    ]
    [[package]]
    name = "redox_syscall"
    version = "0.2.8"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc"
    dependencies = [
    "bitflags",
    ]
    [[package]]
    name = "regex"
    version = "1.5.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ce5f1ceb7f74abbce32601642fcf8e8508a8a8991e0621c7d750295b9095702b"
    dependencies = [
    "aho-corasick",
    "memchr",
    "regex-syntax",
    ]
    [[package]]
    name = "regex-syntax"
    version = "0.6.25"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
    [[package]]
    name = "remove_dir_all"
    version = "0.5.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
    dependencies = [
    "winapi",
    ]
    [[package]]
    name = "scopeguard"
    version = "1.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
    [[package]]
    name = "sha2"
    version = "0.9.4"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d8f6b75b17576b792bef0db1bcc4b8b8bcdf9506744cf34b974195487af6cff2"
    dependencies = [
    "block-buffer",
    "cfg-if",
    "cpufeatures",
    "digest",
    "opaque-debug",
    ]
    [[package]]
    name = "signal-hook-registry"
    version = "1.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6"
    dependencies = [
    "libc",
    ]
    [[package]]
    name = "siphasher"
    version = "0.3.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cbce6d4507c7e4a3962091436e56e95290cb71fa302d0d270e32130b75fbff27"
    [[package]]
    name = "slab"
    version = "0.4.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527"
    [[package]]
    name = "smallvec"
    version = "1.6.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
    [[package]]
    name = "socket2"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2"
    dependencies = [
    "libc",
    "winapi",
    ]
    [[package]]
    name = "stringprep"
    version = "0.1.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1"
    dependencies = [
    "unicode-bidi",
    "unicode-normalization",
    ]
    [[package]]
    name = "strsim"
    version = "0.8.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
    [[package]]
    name = "subtle"
    version = "2.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2"
    [[package]]
    name = "syn"
    version = "1.0.72"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
    dependencies = [
    "proc-macro2",
    "quote",
    "unicode-xid",
    ]
    [[package]]
    name = "tempfile"
    version = "3.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
    dependencies = [
    "cfg-if",
    "libc",
    "rand",
    "redox_syscall",
    "remove_dir_all",
    "winapi",
    ]
    [[package]]
    name = "termcolor"
    version = "1.1.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4"
    dependencies = [
    "winapi-util",
    ]
    [[package]]
    name = "textwrap"
    version = "0.11.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
    dependencies = [
    "unicode-width",
    ]
    [[package]]
    name = "tinyvec"
    version = "1.2.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342"
    dependencies = [
    "tinyvec_macros",
    ]
    [[package]]
    name = "tinyvec_macros"
    version = "0.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
    [[package]]
    name = "tokio"
    version = "1.5.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5"
    dependencies = [
    "autocfg",
    "bytes",
    "libc",
    "memchr",
    "mio",
    "num_cpus",
    "once_cell",
    "pin-project-lite",
    "signal-hook-registry",
    "tokio-macros",
    "winapi",
    ]
    [[package]]
    name = "tokio-macros"
    version = "1.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "tokio-postgres"
    version = "0.7.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2d2b1383c7e4fb9a09e292c7c6afb7da54418d53b045f1c1fac7a911411a2b8b"
    dependencies = [
    "async-trait",
    "byteorder",
    "bytes",
    "fallible-iterator",
    "futures",
    "log",
    "parking_lot",
    "percent-encoding",
    "phf",
    "pin-project-lite",
    "postgres-protocol",
    "postgres-types",
    "socket2",
    "tokio",
    "tokio-util",
    ]
    [[package]]
    name = "tokio-stream"
    version = "0.1.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "e177a5d8c3bf36de9ebe6d58537d8879e964332f93fb3339e43f618c81361af0"
    dependencies = [
    "futures-core",
    "pin-project-lite",
    "tokio",
    ]
    [[package]]
    name = "tokio-util"
    version = "0.6.6"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e"
    dependencies = [
    "bytes",
    "futures-core",
    "futures-sink",
    "log",
    "pin-project-lite",
    "tokio",
    ]
    [[package]]
    name = "tonic"
    version = "0.4.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "2ac42cd97ac6bd2339af5bcabf105540e21e45636ec6fa6aae5e85d44db31be0"
    dependencies = [
    "async-stream",
    "async-trait",
    "base64",
    "bytes",
    "futures-core",
    "futures-util",
    "h2",
    "http",
    "http-body",
    "hyper",
    "percent-encoding",
    "pin-project",
    "prost",
    "prost-derive",
    "tokio",
    "tokio-stream",
    "tokio-util",
    "tower",
    "tower-service",
    "tracing",
    "tracing-futures",
    ]
    [[package]]
    name = "tonic-build"
    version = "0.4.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c695de27302f4697191dda1c7178131a8cb805463dda02864acb80fe1322fdcf"
    dependencies = [
    "proc-macro2",
    "prost-build",
    "quote",
    "syn",
    ]
    [[package]]
    name = "tower"
    version = "0.4.7"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "bf0aa6dfc29148c3826708dabbfa83c121eeb84df4d1468220825e3a33651687"
    dependencies = [
    "futures-core",
    "futures-util",
    "indexmap",
    "pin-project",
    "rand",
    "slab",
    "tokio",
    "tokio-stream",
    "tokio-util",
    "tower-layer",
    "tower-service",
    "tracing",
    ]
    [[package]]
    name = "tower-layer"
    version = "0.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62"
    [[package]]
    name = "tower-service"
    version = "0.3.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
    [[package]]
    name = "tracing"
    version = "0.1.26"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d"
    dependencies = [
    "cfg-if",
    "log",
    "pin-project-lite",
    "tracing-attributes",
    "tracing-core",
    ]
    [[package]]
    name = "tracing-attributes"
    version = "0.1.15"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2"
    dependencies = [
    "proc-macro2",
    "quote",
    "syn",
    ]
    [[package]]
    name = "tracing-core"
    version = "0.1.18"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052"
    dependencies = [
    "lazy_static",
    ]
    [[package]]
    name = "tracing-futures"
    version = "0.2.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
    dependencies = [
    "pin-project",
    "tracing",
    ]
    [[package]]
    name = "try-lock"
    version = "0.2.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
    [[package]]
    name = "typenum"
    version = "1.13.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06"
    [[package]]
    name = "unicode-bidi"
    version = "0.3.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0"
    dependencies = [
    "matches",
    ]
    [[package]]
    name = "unicode-normalization"
    version = "0.1.17"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"
    dependencies = [
    "tinyvec",
    ]
    [[package]]
    name = "unicode-segmentation"
    version = "1.7.1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
    [[package]]
    name = "unicode-width"
    version = "0.1.8"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
    [[package]]
    name = "unicode-xid"
    version = "0.2.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
    [[package]]
    name = "vec_map"
    version = "0.8.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
    [[package]]
    name = "version_check"
    version = "0.9.3"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
    [[package]]
    name = "want"
    version = "0.3.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
    dependencies = [
    "log",
    "try-lock",
    ]
    [[package]]
    name = "wasi"
    version = "0.10.2+wasi-snapshot-preview1"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
    [[package]]
    name = "which"
    version = "4.1.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe"
    dependencies = [
    "either",
    "libc",
    ]
    [[package]]
    name = "winapi"
    version = "0.3.9"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
    dependencies = [
    "winapi-i686-pc-windows-gnu",
    "winapi-x86_64-pc-windows-gnu",
    ]
    [[package]]
    name = "winapi-i686-pc-windows-gnu"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
    [[package]]
    name = "winapi-util"
    version = "0.1.5"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
    dependencies = [
    "winapi",
    ]
    [[package]]
    name = "winapi-x86_64-pc-windows-gnu"
    version = "0.4.0"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"