From 9da343fcbec08c8844b9784d8449fb9825149a1b Mon Sep 17 00:00:00 2001
From: Dotan Nahum
Date: Fri, 1 Oct 2021 15:10:30 +0300
Subject: [PATCH] open sourcing keyscope :smile:
---
.github/workflows/build.yml | 87 ++
.github/workflows/release.yml | 218 ++++
.gitignore | 3 +
Cargo.lock | 2122 +++++++++++++++++++++++++++++++++
Cargo.toml | 24 +
LICENSE.txt | 201 ++++
README.md | 303 +++++
build.rs | 6 +
custom-defs.example.yaml | 22 +
media/ks.png | Bin 0 -> 243789 bytes
package.json | 13 +
src/data.rs | 48 +
src/defs.yaml | 577 +++++++++
src/main.rs | 240 ++++
tooling/sync-providers.js | 16 +
yarn.lock | 13 +
16 files changed, 3893 insertions(+)
create mode 100644 .github/workflows/build.yml
create mode 100644 .github/workflows/release.yml
create mode 100644 .gitignore
create mode 100644 Cargo.lock
create mode 100644 Cargo.toml
create mode 100644 LICENSE.txt
create mode 100644 README.md
create mode 100644 build.rs
create mode 100644 custom-defs.example.yaml
create mode 100644 media/ks.png
create mode 100644 package.json
create mode 100644 src/data.rs
create mode 100644 src/defs.yaml
create mode 100644 src/main.rs
create mode 100644 tooling/sync-providers.js
create mode 100644 yarn.lock
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..27ee685
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,87 @@
+name: Build
+on:
+ pull_request:
+ push:
+ branches:
+ - master
+ schedule:
+ - cron: '00 01 * * *'
+
+jobs:
+ check:
+ name: Check
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v2
+
+ - name: Install stable toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: stable
+ override: true
+
+ - uses: Swatinem/rust-cache@v1
+
+ - name: Run cargo check
+ uses: actions-rs/cargo@v1
+ with:
+ command: check
+
+ test:
+ name: Test Suite
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ rust: [stable]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v2
+
+ - name: Install stable toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: ${{ matrix.rust }}
+ override: true
+
+ - uses: Swatinem/rust-cache@v1
+
+ - name: Run cargo test
+ uses: actions-rs/cargo@v1
+ with:
+ command: test
+
+
+ lints:
+ name: Lints
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v2
+ with:
+ submodules: true
+
+ - name: Install stable toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: stable
+ override: true
+ components: rustfmt, clippy
+
+ - uses: Swatinem/rust-cache@v1
+
+ - name: Run cargo fmt
+ uses: actions-rs/cargo@v1
+ with:
+ command: fmt
+ args: --all -- --check
+
+ - name: Run cargo clippy
+ uses: actions-rs/cargo@v1
+ with:
+ command: clippy
+ args: -- -D warnings
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..a06aac8
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,218 @@
+name: Release
+on:
+ # schedule:
+ # - cron: '0 0 * * *' # midnight UTC
+
+ push:
+ tags:
+ - 'v[0-9]+.[0-9]+.[0-9]+'
+ ## - release
+
+env:
+ BIN_NAME: keyscope
+ PROJECT_NAME: keyscope
+ REPO_NAME: spectralops/keyscope
+ BREW_TAP: spectralops/homebrew-tap
+
+jobs:
+ dist:
+ name: Dist
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false # don't fail other jobs if one fails
+ matrix:
+ build: [x86_64-linux, x86_64-macos, x86_64-windows] #, x86_64-win-gnu, win32-msvc aarch64-linux,
+ include:
+ - build: x86_64-linux
+ os: ubuntu-20.04
+ rust: stable
+ target: x86_64-unknown-linux-gnu
+ cross: false
+
+ # - build: aarch64-linux # this fails on openssl
+ # os: ubuntu-20.04
+ # rust: stable
+ # target: aarch64-unknown-linux-gnu
+ # cross: true
+
+ - build: x86_64-macos
+ os: macos-latest
+ rust: stable
+ target: x86_64-apple-darwin
+ cross: false
+ - build: x86_64-windows
+ os: windows-2019
+ rust: stable
+ target: x86_64-pc-windows-msvc
+ cross: false
+ # - build: aarch64-macos
+ # os: macos-latest
+ # rust: stable
+ # target: aarch64-apple-darwin
+ # - build: x86_64-win-gnu
+ # os: windows-2019
+ # rust: stable-x86_64-gnu
+ # target: x86_64-pc-windows-gnu
+ # - build: win32-msvc
+ # os: windows-2019
+ # rust: stable
+ # target: i686-pc-windows-msvc
+
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v2
+ with:
+ submodules: true
+
+ - name: Install ${{ matrix.rust }} toolchain
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: ${{ matrix.rust }}
+ target: ${{ matrix.target }}
+ override: true
+
+ - name: Install OpenSSL
+ if: matrix.build == 'aarch64-linux'
+ run: sudo apt-get install libssl-dev pkg-config
+
+ - name: Run cargo test
+ uses: actions-rs/cargo@v1
+ with:
+ use-cross: ${{ matrix.cross }}
+ command: test
+ args: --release --locked --target ${{ matrix.target }}
+
+ - name: Build release binary
+ uses: actions-rs/cargo@v1
+ with:
+ use-cross: ${{ matrix.cross }}
+ command: build
+ args: --release --locked --target ${{ matrix.target }}
+
+ - name: Strip release binary (linux and macos)
+ if: matrix.build == 'x86_64-linux' || matrix.build == 'x86_64-macos'
+ run: strip "target/${{ matrix.target }}/release/$BIN_NAME"
+
+ - name: Strip release binary (arm)
+ if: matrix.build == 'aarch64-linux'
+ run: |
+ docker run --rm -v \
+ "$PWD/target:/target:Z" \
+ rustembedded/cross:${{ matrix.target }} \
+ aarch64-linux-gnu-strip \
+ /target/${{ matrix.target }}/release/$BIN_NAME
+
+ - name: Build archive
+ shell: bash
+ run: |
+ mkdir dist
+ if [ "${{ matrix.os }}" = "windows-2019" ]; then
+ cp "target/${{ matrix.target }}/release/$BIN_NAME.exe" "dist/"
+ else
+ cp "target/${{ matrix.target }}/release/$BIN_NAME" "dist/"
+ fi
+
+ - uses: actions/upload-artifact@v2.2.4
+ with:
+ name: bins-${{ matrix.build }}
+ path: dist
+
+ publish:
+ name: Publish
+ needs: [dist]
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v2
+ with:
+ submodules: false
+
+ - uses: actions/download-artifact@v2
+ # with:
+ # path: dist
+ # - run: ls -al ./dist
+ - run: ls -al bins-*
+
+ - name: Calculate tag name
+ run: |
+ name=dev
+ if [[ $GITHUB_REF == refs/tags/v* ]]; then
+ name=${GITHUB_REF:10}
+ fi
+ echo ::set-output name=val::$name
+ echo TAG=$name >> $GITHUB_ENV
+ id: tagname
+
+ - name: Build archive
+ shell: bash
+ run: |
+ set -ex
+
+ rm -rf tmp
+ mkdir tmp
+ mkdir dist
+
+ for dir in bins-* ; do
+ platform=${dir#"bins-"}
+ if [[ $platform =~ "windows" ]]; then
+ exe=".exe"
+ fi
+ pkgname=$PROJECT_NAME-$TAG-$platform
+ mkdir tmp/$pkgname
+ # cp LICENSE README.md tmp/$pkgname
+ mv bins-$platform/$BIN_NAME$exe tmp/$pkgname
+ chmod +x tmp/$pkgname/$BIN_NAME$exe
+
+ if [ "$exe" = "" ]; then
+ tar cJf dist/$pkgname.tar.xz -C tmp $pkgname
+ else
+ (cd tmp && 7z a -r ../dist/$pkgname.zip $pkgname)
+ fi
+ done
+
+ - name: Upload binaries to release
+ uses: svenstaro/upload-release-action@v2
+ with:
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
+ file: dist/*
+ file_glob: true
+ tag: ${{ steps.tagname.outputs.val }}
+ overwrite: true
+
+
+ # update homebrew
+
+ - name: Extract version
+ id: extract-version
+ run: |
+ printf "::set-output name=%s::%s\n" tag-name "${GITHUB_REF#refs/tags/}"
+
+ - uses: mislav/bump-homebrew-formula-action@v1
+ with:
+ formula-path: ${{env.PROJECT_NAME}}.rb
+ homebrew-tap: ${{ env.BREW_TAP }}
+ download-url: "https://github.com/${{ env.REPO_NAME }}/releases/download/${{ steps.extract-version.outputs.tag-name }}/${{env.PROJECT_NAME}}-${{ steps.extract-version.outputs.tag-name }}-x86_64-macos.tar.xz"
+ commit-message: updating formula for ${{ env.PROJECT_NAME }}
+ env:
+ COMMITTER_TOKEN: ${{ secrets.COMMITTER_TOKEN }}
+
+
+
+
+ #
+ # you can use this initial file in your homebrew-tap if you don't have an initial formula:
+ # .rb
+ #
+ # class < Formula
+ # desc "A test formula"
+ # homepage "http://www.example.com"
+ # url "-----"
+ # version "-----"
+ # sha256 "-----"
+
+ # def install
+ # bin.install ""
+ # end
+ # end
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f7c915c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+target/
+node_modules/
+pkg/
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..d0e5e6a
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,2122 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "async-trait"
+version = "0.1.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e"
+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 = "backtrace"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "base64"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
+
+[[package]]
+name = "bit-set"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[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 = "bstr"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+dependencies = [
+ "lazy_static",
+ "memchr",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
+
+[[package]]
+name = "cc"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0"
+dependencies = [
+ "jobserver",
+]
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "serde",
+ "time",
+ "winapi",
+]
+
+[[package]]
+name = "clap"
+version = "3.0.0-beta.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcd70aa5597dbc42f7217a543f9ef2768b2ef823ba29036072d30e1d88e98406"
+dependencies = [
+ "atty",
+ "bitflags",
+ "clap_derive",
+ "indexmap",
+ "lazy_static",
+ "os_str_bytes",
+ "strsim",
+ "termcolor",
+ "textwrap",
+ "vec_map",
+]
+
+[[package]]
+name = "clap_derive"
+version = "3.0.0-beta.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b5bb0d655624a0b8770d1c178fb8ffcb1f91cc722cb08f451e3dc72465421ac"
+dependencies = [
+ "heck",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "console"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "regex",
+ "terminal_size",
+ "unicode-width",
+ "winapi",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "csv"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
+dependencies = [
+ "bstr",
+ "csv-core",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "csv-core"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "der-parser"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c61ce7e682729d218090106bf253384df68a2047122ed461ae79ec65d6b4985"
+dependencies = [
+ "nom",
+ "num-bigint",
+ "rusticata-macros",
+]
+
+[[package]]
+name = "derive-getters"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c5905670fd9c320154f3a4a01c9e609733cd7b753f3c58777ab7d5ce26686b3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "difference"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "dirs-next"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "dirs-sys-next",
+]
+
+[[package]]
+name = "dirs-sys-next"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "dtoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "enum-iterator"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6"
+dependencies = [
+ "enum-iterator-derive",
+]
+
+[[package]]
+name = "enum-iterator-derive"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "env_logger"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3"
+dependencies = [
+ "atty",
+ "humantime",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "error-chain"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8"
+dependencies = [
+ "backtrace",
+]
+
+[[package]]
+name = "fancy-regex"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d6b8560a05112eb52f04b00e5d3790c0dd75d9d980eb8a122fb23b92a623ccf"
+dependencies = [
+ "bit-set",
+ "regex",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+dependencies = [
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb"
+dependencies = [
+ "autocfg",
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11"
+
+[[package]]
+name = "futures-task"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99"
+
+[[package]]
+name = "futures-util"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481"
+dependencies = [
+ "autocfg",
+ "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 0.9.3",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "getset"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24b328c01a4d71d2d8173daa93562a73ab0fe85616876f02500f53d82948c504"
+dependencies = [
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "gimli"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7"
+
+[[package]]
+name = "git2"
+version = "0.13.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c1cbbfc9a1996c6af82c2b4caf828d2c653af4fcdbb0e5674cc966eee5a4197"
+dependencies = [
+ "bitflags",
+ "libc",
+ "libgit2-sys",
+ "log",
+ "url",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
+[[package]]
+name = "heck"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "histogram"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669"
+
+[[package]]
+name = "hmac"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
+dependencies = [
+ "crypto-mac",
+ "digest",
+]
+
+[[package]]
+name = "http"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503"
+
+[[package]]
+name = "httpdate"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440"
+
+[[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.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15d1cfb9e4f68655fa04c01f59edb405b6074a0f7118ea881e5026e4a1cd8593"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9"
+
+[[package]]
+name = "itoa"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
+
+[[package]]
+name = "jobserver"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "junit-report"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bc92bb61f860b8a88189e67820acdb13fd00149dac50fa365b232d27de34a18"
+dependencies = [
+ "chrono",
+ "derive-getters",
+ "strip-ansi-escapes",
+ "thiserror",
+ "xml-rs",
+]
+
+[[package]]
+name = "keyscope"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "console",
+ "csv",
+ "env_logger",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "serde_yaml",
+ "service_policy_kit",
+ "vergen",
+]
+
+[[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.101"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21"
+
+[[package]]
+name = "libgit2-sys"
+version = "0.12.23+1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29730a445bae719db3107078b46808cc45a5b7a6bae3f31272923af969453356"
+dependencies = [
+ "cc",
+ "libc",
+ "libz-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
+
+[[package]]
+name = "log"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "matches"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
+
+[[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.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.7.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16"
+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 = "native-tls"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "nom"
+version = "4.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
+dependencies = [
+ "memchr",
+ "version_check 0.1.5",
+]
+
+[[package]]
+name = "ntapi"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
+[[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 = "object"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "openapi"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "739caefcf8a5f4638175df8971aba0be5f4651b58d4a217c36f5dd665f83ea00"
+dependencies = [
+ "error-chain",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "serde_yaml",
+]
+
+[[package]]
+name = "openssl"
+version = "0.10.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a"
+dependencies = [
+ "bitflags",
+ "cfg-if 1.0.0",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82"
+dependencies = [
+ "autocfg",
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "os_str_bytes"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6acbef58a60fe69ab50510a55bc8cdd4d6cf2283d27ad338f54cb52747a9cf2d"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "version_check 0.9.3",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check 0.9.3",
+]
+
+[[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.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d"
+dependencies = [
+ "unicode-xid",
+]
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
+dependencies = [
+ "getrandom",
+ "redox_syscall",
+]
+
+[[package]]
+name = "regex"
+version = "1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[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 = "reqwest"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22"
+dependencies = [
+ "base64 0.13.0",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "lazy_static",
+ "log",
+ "mime",
+ "native-tls",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "rusoto_core"
+version = "0.47.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b4f000e8934c1b4f70adde180056812e7ea6b1a247952db8ee98c94cd3116cc"
+dependencies = [
+ "async-trait",
+ "base64 0.13.0",
+ "bytes",
+ "crc32fast",
+ "futures",
+ "http",
+ "hyper",
+ "hyper-tls",
+ "lazy_static",
+ "log",
+ "rusoto_credential",
+ "rusoto_signature",
+ "rustc_version",
+ "serde",
+ "serde_json",
+ "tokio",
+ "xml-rs",
+]
+
+[[package]]
+name = "rusoto_credential"
+version = "0.47.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a46b67db7bb66f5541e44db22b0a02fed59c9603e146db3a9e633272d3bac2f"
+dependencies = [
+ "async-trait",
+ "chrono",
+ "dirs-next",
+ "futures",
+ "hyper",
+ "serde",
+ "serde_json",
+ "shlex",
+ "tokio",
+ "zeroize",
+]
+
+[[package]]
+name = "rusoto_signature"
+version = "0.47.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6264e93384b90a747758bcc82079711eacf2e755c3a8b5091687b5349d870bcc"
+dependencies = [
+ "base64 0.13.0",
+ "bytes",
+ "chrono",
+ "digest",
+ "futures",
+ "hex",
+ "hmac",
+ "http",
+ "hyper",
+ "log",
+ "md-5",
+ "percent-encoding",
+ "pin-project-lite",
+ "rusoto_credential",
+ "rustc_version",
+ "serde",
+ "sha2",
+ "tokio",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rusticata-macros"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe8c976e50876cb3423699b190e799ff4c8a1a4f47dc33f4036dd056c077b7bb"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088"
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "schannel"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
+dependencies = [
+ "lazy_static",
+ "winapi",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012"
+
+[[package]]
+name = "serde"
+version = "1.0.130"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.130"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef8099d3df28273c99a1728190c7a9f19d444c941044f64adf986bee7ec53051"
+dependencies = [
+ "dtoa",
+ "linked-hash-map",
+ "serde",
+ "yaml-rust",
+]
+
+[[package]]
+name = "service_policy_kit"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8568eec154f3120a95838ca1bac1570084786e88ba4c95e6eabe6f6db12f365"
+dependencies = [
+ "anyhow",
+ "atty",
+ "chrono",
+ "console",
+ "difference",
+ "env_logger",
+ "fancy-regex",
+ "histogram",
+ "junit-report",
+ "log",
+ "maplit",
+ "native-tls",
+ "openapi",
+ "reqwest",
+ "rusoto_core",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "serde_yaml",
+ "subprocess",
+ "x509-parser",
+]
+
+[[package]]
+name = "sha2"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa"
+dependencies = [
+ "block-buffer",
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest",
+ "opaque-debug",
+]
+
+[[package]]
+name = "shlex"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590"
+
+[[package]]
+name = "socket2"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "strip-ansi-escapes"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "011cbb39cf7c1f62871aea3cc46e5817b0937b49e9447370c93cacbe93a766d8"
+dependencies = [
+ "vte",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "subprocess"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68713fc0f9d941642c1e020d622e6421dfe09e8891ddd4bfa2109fda9a40431d"
+dependencies = [
+ "crossbeam-utils",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "subtle"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
+
+[[package]]
+name = "syn"
+version = "1.0.76"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e7de153d0438a648bb71e06e300e54fc641685e96af96d49b843f43172d341c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "core-foundation-sys",
+ "doc-comment",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
+dependencies = [
+ "cfg-if 1.0.0",
+ "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 = "terminal_size"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "time"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5241dd6f21443a3606b432718b166d3cedc962fd4b8bea54a8bc7f514ebda986"
+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.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc"
+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.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "log",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[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.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8"
+dependencies = [
+ "cfg-if 1.0.0",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf"
+dependencies = [
+ "lazy_static",
+]
+
+[[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.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b"
+
+[[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 = "url"
+version = "2.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf8parse"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "vergen"
+version = "5.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "265455aab08c55a1ab13f07c8d5e25c7d46900f4484dd7cbd682e77171f93f3c"
+dependencies = [
+ "anyhow",
+ "cfg-if 1.0.0",
+ "chrono",
+ "enum-iterator",
+ "getset",
+ "git2",
+ "rustc_version",
+ "rustversion",
+ "sysinfo",
+ "thiserror",
+]
+
+[[package]]
+name = "version_check"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
+
+[[package]]
+name = "version_check"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
+
+[[package]]
+name = "vte"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6cbce692ab4ca2f1f3047fcf732430249c0e971bfdd2b234cf2c47ad93af5983"
+dependencies = [
+ "arrayvec",
+ "utf8parse",
+ "vte_generate_state_changes",
+]
+
+[[package]]
+name = "vte_generate_state_changes"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff"
+dependencies = [
+ "proc-macro2",
+ "quote",
+]
+
+[[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 = "wasm-bindgen"
+version = "0.2.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce"
+dependencies = [
+ "cfg-if 1.0.0",
+ "serde",
+ "serde_json",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc"
+
+[[package]]
+name = "web-sys"
+version = "0.3.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[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"
+
+[[package]]
+name = "winreg"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "x509-parser"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d567e225454110502c91d95cbc6d65828d4ab60d813a23b4a03ebb799a85c45"
+dependencies = [
+ "base64 0.10.1",
+ "der-parser",
+ "nom",
+ "num-bigint",
+ "rusticata-macros",
+ "time",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
+
+[[package]]
+name = "yaml-rust"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+dependencies = [
+ "linked-hash-map",
+]
+
+[[package]]
+name = "zeroize"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf68b08513768deaa790264a7fac27a58cbf2705cfcdc9448362229217d7e970"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..f19a323
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,24 @@
+[package]
+name = "keyscope"
+version = "0.1.0"
+edition = "2018"
+build = "build.rs"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+
+clap = "3.0.0-beta.4"
+service_policy_kit="0.2.0"
+serde="*"
+serde_json="*"
+serde_derive="*"
+serde_yaml="*"
+env_logger="*"
+anyhow="*"
+console="*"
+csv="*"
+
+[build-dependencies]
+vergen = "*"
+anyhow="*"
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..e1a96db
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2021- Dotan Nahum
+
+ 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.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6ebc29c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
+
+
+:white_check_mark: Automate your key and secret validation workflows
+
+:cowboy_hat_face: Over 30 different providers
+
+:robot: Export to JSON, audit via CSV
+
+
+
+
+
+
+
+
+
+# :key: Keyscope
+
+Keyscope is a key and secret workflow (validation, invalidation, etc.) tool built in Rust, powered by `service_policy_kit`.
+
+Current workflows supported:
+
+* Validation
+
+
+# :rocket: Quick Start
+
+Grab a release from [releases](https://github.com/spectralops/keyscope/releases), or install via Homebrew:
+
+```
+brew tap spectralops/tap && brew install keyscope
+```
+
+## Using keyscope
+
+You can try out validating a key for a provider, say, Github (assuming the key is in the `GITHUB_TOKEN` environment variable):
+
+```
+$ keyscope validate github $GITHUB_TOKEN
+```
+
+You can see which other providers are supported by running:
+
+```
+$ keyscope validate --providers
+
+ .
+ :
+ .
+
+twilio:validation
+keyscope validate twilio -p p1 p2
+
+twitter:validation
+keyscope validate twitter -p p1
+
+zendesk:validation
+keyscope validate zendesk -p p1 p1
+
+Total 33 providers available.
+$
+```
+
+And what parameters are required for a certain provider by running (say, `stripe`):
+
+```
+$ keyscope validate stripe --requirements
+
+provider stripe requires:
+ - param: p1
+ desc: stripe key
+$
+```
+
+Finally the general structure of the `validate` command is:
+
+```
+$ keyscope validate PROVIDER -p PARAM1 PARAM2 .. PARAM_N
+```
+
+# :white_check_mark: Validation: key should be active
+
+
+You can validate a specific provider like so:
+
+```
+$ keyscope validate twilio -p $TWILIO_KEY
+```
+
+With the general pattern of:
+
+```
+$ keyscope validate PROVIDER -p PARAM1 PARAM2 ...
+```
+
+The number of keys/params would change based on authentication type:
+
+* `Bearer` - usually just a single key (token)
+* `Basic Auth` - usually 2 keys: user, password
+* `OAuth` - usually 2 keys: client_id, client_secret
+* And others.
+
+Each provider in Keyscope will tell you what it requires using `requirements`:
+
+```
+$ keyscope validate twilio --requirements
+```
+
+You'll get a report:
+
+```
+$ keyscope --verbose validate stripe -p $STRIPE_KEY
+
+✔ stripe:validation: ok 766ms
+
+Ran 1 interactions with 1 checks in 766ms
+
+Success: 1
+Failure: 0
+ Error: 0
+Skipped: 0
+```
+
+And an executable exit code that reflects success/failure.
+
+You can use the `--verbose` flag to see API responses:
+
+```
+$ keyscope --verbose validate stripe -p $STRIPE_KEY
+
+✗ stripe:validation: failed 413ms
+ status_code: 200 != 401 Unauthorized
+
+Ran 1 interactions with 1 checks in 413ms
+
+Success: 0
+Failure: 1
+ Error: 0
+Skipped: 0
+```
+
+In this case the exit code is `1` (failure).
+
+# :x: Validation: key should be inactive
+
+When you are validating keys that are supposed to be inactive, you can use the `flip` flag. In this mode, a failed API access is a good thing, and the exit code will reflect that.
+
+```
+$ keyscope --flip validate stripe -p $STRIPE_KEY
+
+✔ stripe:validation: ok 766ms
+
+Ran 1 interactions with 1 checks in 766ms
+```
+
+In this case, the key is active - _which is bad for us_. Using `--flip`, the exit code will be `1` (failure).
+
+# :runner: Setting up a validation job
+
+## Audit active keys
+
+You can set up a CI job (or other form of scheduled job you like) to perform an audit, by reading all parameters from a dedicated CSV file like so:
+
+```
+$ keyscope validate --csv-in report.csv
+```
+
+The format of the CSV that you need to prepare should include a header line and look like this:
+
+```
+provider,key1,key2,key3
+twilio,tw-key1,,,
+```
+
+You can specify as many key columns as you like, as long as you provide an _empty_ value for providers which don't have that many keys, and all rows contain the same amount of cells.
+
+
+
+
+## Audit inactive keys
+
+If you have a dump of keys from your vault that are stale have expiry and should have been rotated, you want to test that they are all stale:
+
+```
+$ keyscope --flip validate --csv-in my-key-audit.csv
+```
+
+
+# :link: Supported providers
+
+We're always adding [new providers](src/defs.yaml), keep a link to this list or watch this repo to get updated.
+
+We use our `service_policy_toolkit` library to specify interactions with services and their policies, if you find a service [not in this list](src/defs.yaml) feel free to open an issue or contribute back.
+
+
+
+| provider | actions | params |
+| --------------------- | ---------- | ------------------------------------------------------------------------------------------------------ |
+| hookbin | validation | `hookbin_1` - hookbin ID (https://hookb.in)
`hookbin_2` - fake key to put as a query param |
+| covalenthq | validation | `covalenthq_1` - covalent token |
+| asana | validation | `asana_1` - asana token |
+| bitly | validation | `bitly_1` - bit.ly token |
+| localytics | validation | `localytics_1` - localytics user
`localytics_2` - localytics key |
+| algolia | validation | `algolia_1` - algolia application ID
`algolia_2` - algolia index
`algolia_3` - algolia API key |
+| branchio | validation | `branchio_1` - branch.io key
`branchio_2` - branch.io secret |
+| browserstack | validation | `browserstack_1` - browserstack key
`browserstack_2` - browserstack secret |
+| buildkite | validation | `buildkite_1` - buildkite token |
+| datadog | validation | `datadog_1` - datadog API key |
+| github | validation | `github_1` - github token |
+| dropbox | validation | `dropbox_1` - dropbox token |
+| gitlab | validation | `gitlab_1` - gitlab token |
+| heroku | validation | `heroku_1` - heroku token |
+| mailchimp | validation | `mailchimp_1` - mailchimp datacenter ID
`mailchimp_2` - mailchimp key |
+| mailgun | validation | `mailgun_1` - mailgun key |
+| pagerduty | validation | `pagerduty_1` - pagerduty token |
+| circleci | validation | `circleci_1` - circleci key |
+| facebook-access-token | validation | `facebook-access-token_1` - facebook token |
+| salesforce | validation | `salesforce_1` - salesforce instance name
`salesforce_2` - salesforce token |
+| jumpcloud | validation | `jumpcloud_1` - jumpcloud key |
+| saucelabs-us | validation | `saucelabs-us_1` - saucelabs user
`saucelabs-us_2` - saucelabs key |
+| saucelabs-eu | validation | `saucelabs-eu_1` - saucelabs user
`saucelabs-eu_2` - saucelabs key |
+| sendgrid | validation | `sendgrid_1` - sendgrid key |
+| slack | validation | `slack_1` - slack key |
+| slack-webhook | validation | `slack-webhook_1` - slack webhook |
+| stripe | validation | `stripe_1` - stripe key |
+| travisci | validation | `travisci_1` - travisci domain, choose 'org' or 'com'
`travisci_2` - travisci key |
+| twilio | validation | `twilio_1` - twilio account sid
`twilio_2` - twilio token |
+| twitter | validation | `twitter_1` - twitter API token |
+| zendesk | validation | `zendesk_1` - zendesk domain
`zendesk_2` - zendesk key |
+| firebase | validation | `firebase_1` - firebase API key
`firebase_2` - firebase ID token |
+| aws | validation | `aws_1` - AWS ID
`aws_2` - AWS secret |
+
+
+
+
+
+
+
+# :cake: Adding your own providers
+
+You can specify a custom definitions file (here [is an example](custom-defs.example.yaml)):
+
+```
+$ keyscope -f your-definitions.yaml validate --list
+```
+
+Which is suitable for adding your own internal services, key issuing policies, and infrastructure.
+
+You can also use custom definitions to test out new providers that you'd like to contribute back to keyscope :smile:
+
+## Basics of a definition
+
+All definitions represent an interaction. A request being made, and a policy that's being checked against it.
+
+```yaml
+providers:
+ hookbin:
+ validation:
+ #
+ # the request part
+ #
+ request:
+ params:
+ - name: hookbin_1
+ desc: hookbin ID (https://hookb.in)
+ - name: hookbin_2
+ desc: fake key to put as a query param
+ id: "postbin:validation"
+ desc: "Postbin: valid key"
+ # variable interpolation is good for all fields
+ uri: "https://hookb.in/{{hookbin_1}}?q={{hookbin_2}}"
+ method: post
+ # you can also use headers, body, form, basic_auth and more (see defs.yaml)
+
+ #
+ # the policy part: all values are actually regular expressions and are matched against service response
+ #
+ response:
+ status_code: "200"
+ body: ok
+```
+
+When in doubt, you can check keyscope's own [defs.yaml](src/defs.yaml) for real examples of how to use this infrastructure.
+
+
+
+
+
+# Thanks
+
+To all [Contributors](https://github.com/spectralops/keyscope/graphs/contributors) - you make this happen, thanks!
+
+
+# Copyright
+
+Copyright (c) 2021 [@jondot](http://twitter.com/jondot). See [LICENSE](LICENSE.txt) for further details.
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..49dbe9e
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,6 @@
+use anyhow::Result;
+use vergen::{vergen, Config};
+
+fn main() -> Result<()> {
+ vergen(Config::default())
+}
diff --git a/custom-defs.example.yaml b/custom-defs.example.yaml
new file mode 100644
index 0000000..23b417e
--- /dev/null
+++ b/custom-defs.example.yaml
@@ -0,0 +1,22 @@
+providers:
+ hookbin:
+ validation:
+ request:
+ params:
+ - name: hookbin_1
+ desc: hookbin ID (https://hookb.in)
+ - name: hookbin_2
+ desc: fake key to put as a query param
+ id: "postbin:validation"
+ desc: "Postbin: valid key"
+ uri: "https://hookb.in/{{hookbin_1}}?q={{hookbin_2}}"
+ method: post
+ response:
+ status_code: "200"
+ body: ok
+ examples:
+ ok:
+ status_code: "201"
+ body: hello
+ err:
+ status_code: "500"
diff --git a/media/ks.png b/media/ks.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8bbb002de092fcf68e12d772b740b6be8f35269
GIT binary patch
literal 243789
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