diff --git a/.gitignore b/.gitignore index 126777e..23b12a9 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ CLAUDE.md extra .direnv .claude +e2e-test/*tfstate* +e2e-test/.terraformrc diff --git a/GNUmakefile b/GNUmakefile index e339a0a..df4f989 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -21,4 +21,15 @@ test: testacc: TF_ACC=1 go test -v -cover -timeout 120m ./... -.PHONY: fmt lint test testacc build install generate +e2e: + @echo "Running end-to-end test..." + cd e2e-test && \ + rm -rf .terraform/ .terraform.lock.hcl terraform.tfstate* && \ + ./setup-dev.sh && \ + TF_CLI_CONFIG_FILE=.terraformrc terraform plan && \ + TF_CLI_CONFIG_FILE=.terraformrc terraform apply -auto-approve && \ + echo "✓ E2E test passed! Cleaning up..." && \ + TF_CLI_CONFIG_FILE=.terraformrc terraform destroy -auto-approve && \ + echo "✓ E2E test completed successfully" + +.PHONY: fmt lint test testacc build install generate e2e diff --git a/docs/data-sources/obfs4_bridge_line.md b/docs/data-sources/obfs4_bridge_line.md index 49777cf..9b2b5c5 100644 --- a/docs/data-sources/obfs4_bridge_line.md +++ b/docs/data-sources/obfs4_bridge_line.md @@ -13,9 +13,6 @@ Generates a complete Tor bridge line using obfs4 state and network details ## Example Usage ```terraform -# Copyright (c) Abel Luck -# SPDX-License-Identifier: GPL-3.0-or-later - terraform { required_providers { tor = { diff --git a/docs/index.md b/docs/index.md index 22d0753..22036bb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,9 +13,6 @@ The Tor provider generates cryptographic identity materials for obfs4 Tor bridge ## Example Usage ```terraform -# Copyright (c) Abel Luck -# SPDX-License-Identifier: GPL-3.0-or-later - terraform { required_providers { tor = { diff --git a/docs/resources/obfs4_state.md b/docs/resources/obfs4_state.md index 2d83ea5..068ca9c 100644 --- a/docs/resources/obfs4_state.md +++ b/docs/resources/obfs4_state.md @@ -13,9 +13,6 @@ Generates obfs4 state and certificate for Tor bridges using external relay ident ## Example Usage ```terraform -# Copyright (c) Abel Luck -# SPDX-License-Identifier: GPL-3.0-or-later - terraform { required_providers { tor = { @@ -27,9 +24,7 @@ terraform { provider "tor" {} # Example: Generate obfs4 state using existing identity keys -resource "tor_relay_identity_rsa" "bridge" { - key_size = 2048 -} +resource "tor_relay_identity_rsa" "bridge" {} resource "tor_relay_identity_ed25519" "bridge" {} diff --git a/docs/resources/relay_identity_ed25519.md b/docs/resources/relay_identity_ed25519.md index 2f3c9a3..b1662d9 100644 --- a/docs/resources/relay_identity_ed25519.md +++ b/docs/resources/relay_identity_ed25519.md @@ -13,9 +13,6 @@ Generates Ed25519 private key for Tor relay identity as required by the Tor spec ## Example Usage ```terraform -# Copyright (c) Abel Luck -# SPDX-License-Identifier: GPL-3.0-or-later - terraform { required_providers { tor = { @@ -40,10 +37,6 @@ output "public_key_pem" { value = tor_relay_identity_ed25519.example.public_key_pem } -output "public_key_fingerprint_sha1" { - description = "SHA1 fingerprint of the Ed25519 public key" - value = tor_relay_identity_ed25519.example.public_key_fingerprint_sha1 -} output "public_key_fingerprint_sha256" { description = "SHA256 fingerprint of the Ed25519 public key" diff --git a/docs/resources/relay_identity_rsa.md b/docs/resources/relay_identity_rsa.md index 3b4a271..b67920d 100644 --- a/docs/resources/relay_identity_rsa.md +++ b/docs/resources/relay_identity_rsa.md @@ -27,9 +27,7 @@ terraform { provider "tor" {} # Example: Generate RSA identity key for Tor relay -resource "tor_relay_identity_rsa" "example" { - key_size = 2048 # Default RSA key size for Tor relays -} +resource "tor_relay_identity_rsa" "example" {} output "private_key_pem" { description = "RSA private key in PEM format" diff --git a/e2e-test/README.md b/e2e-test/README.md new file mode 100644 index 0000000..01c17d1 --- /dev/null +++ b/e2e-test/README.md @@ -0,0 +1,49 @@ +# End-to-End Testing + +This directory contains a complete end-to-end test setup for the terraform-provider-tor. + +## Quick Start + +1. **Setup development environment:** + ```bash + ./setup-dev.sh + ``` + This script will: + - Create local `.terraformrc` with dev overrides (no global config changes) + - Build and install the provider locally + +2. **Run the test:** + ```bash + ./tf plan + ./tf apply + ``` + + Or using the full command: + ```bash + TF_CLI_CONFIG_FILE=.terraformrc terraform plan + TF_CLI_CONFIG_FILE=.terraformrc terraform apply + ``` + + Note: Skip `terraform init` when using dev overrides - it's not needed and may cause errors. + +3. **Clean up:** + ```bash + ./tf destroy + ``` + +## Troubleshooting + +If you encounter issues: + +1. **Provider not found**: Run `./setup-dev.sh` again +2. **Build errors**: Check that Go >= 1.23 is installed +3. **Permission errors**: Ensure the setup script is executable + +## Resetting + +To reset your Terraform configuration: +```bash +rm -rf .terraform/ .terraform.lock.hcl terraform.tfstate* +``` + +Then run the setup and init process again. diff --git a/e2e-test/main.tf b/e2e-test/main.tf new file mode 100644 index 0000000..8c3ecea --- /dev/null +++ b/e2e-test/main.tf @@ -0,0 +1,62 @@ +terraform { + required_providers { + tor = { + source = "guardianproject/tor" + version = "99.0.0" + } + } +} + +provider "tor" {} + +# Generate RSA identity key for the bridge +resource "tor_relay_identity_rsa" "bridge" {} + +# Generate Ed25519 identity key for the bridge +resource "tor_relay_identity_ed25519" "bridge" {} + +# Generate obfs4 state using the identity keys +resource "tor_obfs4_state" "bridge" { + rsa_identity_private_key = tor_relay_identity_rsa.bridge.private_key_pem + ed25519_identity_private_key = tor_relay_identity_ed25519.bridge.private_key_pem +} + +# Generate bridge line for client distribution +data "tor_obfs4_bridge_line" "bridge" { + ip_address = "203.0.113.1" + port = 9001 + identity_fingerprint_sha1 = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha1 + obfs4_state_certificate = tor_obfs4_state.bridge.certificate + obfs4_state_iat_mode = tor_obfs4_state.bridge.iat_mode +} + +# Outputs for verification +output "rsa_fingerprint_sha1" { + description = "RSA identity fingerprint (SHA1)" + value = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha1 +} + +output "rsa_fingerprint_sha256" { + description = "RSA identity fingerprint (SHA256)" + value = tor_relay_identity_rsa.bridge.public_key_fingerprint_sha256 +} + +output "ed25519_fingerprint_sha256" { + description = "Ed25519 identity fingerprint (SHA256)" + value = tor_relay_identity_ed25519.bridge.public_key_fingerprint_sha256 +} + +output "obfs4_certificate" { + description = "obfs4 certificate for bridge line" + value = tor_obfs4_state.bridge.certificate +} + +output "obfs4_iat_mode" { + description = "obfs4 IAT mode" + value = tor_obfs4_state.bridge.iat_mode +} + +output "bridge_line" { + description = "Complete bridge line for clients" + value = data.tor_obfs4_bridge_line.bridge.bridge_line +} diff --git a/e2e-test/setup-dev.sh b/e2e-test/setup-dev.sh new file mode 100755 index 0000000..1899c53 --- /dev/null +++ b/e2e-test/setup-dev.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +set -e + +echo "Setting up development environment for terraform-provider-tor..." + +# Get the Go bin path +GOBIN=$(go env GOPATH)/bin +if [ -z "$GOBIN" ]; then + GOBIN=$(go env GOROOT)/bin +fi + +echo "Go bin path: $GOBIN" + +# Create local .terraformrc with dev overrides +TERRAFORMRC="$(pwd)/.terraformrc" +echo "Creating $TERRAFORMRC..." + +# Create local .terraformrc with dev overrides +cat > "$TERRAFORMRC" << EOF +provider_installation { + dev_overrides { + "guardianproject/tor" = "$GOBIN" + } + direct {} +} +EOF + +echo "✓ Created local $TERRAFORMRC with dev overrides" + +# Build and install the provider +echo "Building and installing provider..." +cd "$(dirname "$0")/.." + +# Build with proper naming for dev overrides +go build -o "$GOBIN/terraform-provider-tor_v99.0.0" + +echo "✓ Provider built and installed to $GOBIN/terraform-provider-tor_v99.0.0" + +echo "" +echo "Setup complete! You can now run:" +echo " cd e2e-test" +echo " ./tf plan" +echo " ./tf apply" +echo "" +echo "Or use the full command:" +echo " TF_CLI_CONFIG_FILE=.terraformrc terraform plan" +echo "" +echo "Note: Using local .terraformrc to avoid modifying your global configuration." diff --git a/e2e-test/tf b/e2e-test/tf new file mode 100755 index 0000000..2df7ce0 --- /dev/null +++ b/e2e-test/tf @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +# Wrapper script to run terraform with local config + +export TF_CLI_CONFIG_FILE=.terraformrc +exec tofu "$@" diff --git a/examples/resources/tor_obfs4_state/resource.tf b/examples/resources/tor_obfs4_state/resource.tf index 67f85f9..f0f3be0 100644 --- a/examples/resources/tor_obfs4_state/resource.tf +++ b/examples/resources/tor_obfs4_state/resource.tf @@ -9,9 +9,7 @@ terraform { provider "tor" {} # Example: Generate obfs4 state using existing identity keys -resource "tor_relay_identity_rsa" "bridge" { - key_size = 2048 -} +resource "tor_relay_identity_rsa" "bridge" {} resource "tor_relay_identity_ed25519" "bridge" {} diff --git a/examples/resources/tor_relay_identity_ed25519/resource.tf b/examples/resources/tor_relay_identity_ed25519/resource.tf index 4a0a251..214c239 100644 --- a/examples/resources/tor_relay_identity_ed25519/resource.tf +++ b/examples/resources/tor_relay_identity_ed25519/resource.tf @@ -22,10 +22,6 @@ output "public_key_pem" { value = tor_relay_identity_ed25519.example.public_key_pem } -output "public_key_fingerprint_sha1" { - description = "SHA1 fingerprint of the Ed25519 public key" - value = tor_relay_identity_ed25519.example.public_key_fingerprint_sha1 -} output "public_key_fingerprint_sha256" { description = "SHA256 fingerprint of the Ed25519 public key" diff --git a/examples/resources/tor_relay_identity_rsa/resource.tf b/examples/resources/tor_relay_identity_rsa/resource.tf index b9d6c5b..d88113f 100644 --- a/examples/resources/tor_relay_identity_rsa/resource.tf +++ b/examples/resources/tor_relay_identity_rsa/resource.tf @@ -12,9 +12,7 @@ terraform { provider "tor" {} # Example: Generate RSA identity key for Tor relay -resource "tor_relay_identity_rsa" "example" { - key_size = 2048 # Default RSA key size for Tor relays -} +resource "tor_relay_identity_rsa" "example" {} output "private_key_pem" { description = "RSA private key in PEM format" diff --git a/flake.nix b/flake.nix index 8b5a7d7..edead20 100644 --- a/flake.nix +++ b/flake.nix @@ -47,6 +47,8 @@ pkgs.go pkgs.golangci-lint pkgs.obfs4 + pkgs.gnumake + pkgs.opentofu ]; buildInputs = libraries; inputsFrom = libraries; diff --git a/go.sum.broken b/go.sum.broken deleted file mode 100644 index 5093bb4..0000000 --- a/go.sum.broken +++ /dev/null @@ -1,134 +0,0 @@ -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= -github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= -github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRjRuY4O1FJmsbNOvSFE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/cli v1.1.6 h1:KMHVPR7kZruGy7vbOn5W2M7PcOWJwkXaHLe8rjUV4dY= -github.com/hashicorp/cli v1.1.6/go.mod h1:6p7uk6XBr7g+W4hy7N7NYqYSBXPa5Z1C/VvQpPCMH9Y= -github.com/hashicorp/go-checkpoint v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU= -github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 h1:1/D3zfFHttUKaCaGKZ/dR2roBXv0vKbSCnssIldfQdI= -github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= -github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKdqZHlqU+s3zB+A/8bV3psmIos= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/hc-install v0.8.0 h1:W5l9fjCIhG/QAImWR0LE4AOKiDUxGR3+V8SCMvQnb2Y= -github.com/hashicorp/hc-install v0.8.0/go.mod h1:vRJU/PIsZbJBT0DgpXzRH7ZQJgE8YlGV2/ZnbTsJgJ8= -github.com/hashicorp/hcl/v2 v2.21.0 h1:lve4q/o/2rqwYOgUg3y3V2YPyD2RtlUIQ/2UyfrxYtI= -github.com/hashicorp/hcl/v2 v2.21.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= -github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ= -github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg= -github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec= -github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= -github.com/hashicorp/terraform-plugin-docs v0.19.4 h1:CfI1r+Fb8jDjdADp5GTDPYB/LEU0CTJ0NkF/1RSSB8A= -github.com/hashicorp/terraform-plugin-docs v0.19.4/go.mod h1:DCF27O5RpcNm/p4v7WMTRmP1DQSA9ZMNj3ux6Nzx7MY= -github.com/hashicorp/terraform-plugin-framework v1.12.0 h1:CZBXAzKXNUCJXAz7my/4LgWDBbKIz+8IW7E6wlJFbOo= -github.com/hashicorp/terraform-plugin-framework v1.12.0/go.mod h1:k0btlrW8IMR7Gq+k2zJzqUK8MhLeR2RSrOGNw8qODmU= -github.com/hashicorp/terraform-plugin-go v0.23.0 h1:AALVuU1gD1kPb48aPQUjug9Ir/125t+AAurhqphJ2Co= -github.com/hashicorp/terraform-plugin-go v0.23.0/go.mod h1:1E3Cr9h2vMlahWMbsSEcNrOCxovCZhOOIXjFHbjc/lQ= -github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= -github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 h1:kJoLKl3xJB54AtNsLvGZVDmzf+qzUlqOTe4jqp7L+ZU= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0/go.mod h1:sl/UbXl1zzUQupPCavdMdAQHGGODhSgVjrOF3Nd1UrA= -github.com/hashicorp/terraform-plugin-testing v1.10.0 h1:j/2S0ZM9m7QVm8b3t2B4PqT4PmQbxkM/CgJnr0YFGyk= -github.com/hashicorp/terraform-plugin-testing v1.10.0/go.mod h1:t7O9LSoYLyT88fT9jEX7sFcMSvKM7pU4pDsb6PrSdq8= -github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTVcLZRu7JseiXNRHbOAyoTI= -github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM= -github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= -github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= -github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= -github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxBiscop= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= -github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWFro0E= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGPiK/92rKx= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= -github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= -github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/zclconf/go-cty v1.15.0 h1:tTCRWxsexYUmtt/wVxgDClUe+uQusuI443uL6e+5sXQ= -github.com/zclconf/go-cty v1.15.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= -gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird v0.4.0 h1:NHnO+9dGWkXpSWwC8Y3xHu9PTLwDfKWYKQeNS1tPBR0= -gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird v0.4.0/go.mod h1:Kxv+0sWNVD5VrFdIGQwE8VWLRtOg4g4lxr5IiMH74o= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= -google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= \ No newline at end of file