From 1888afcc3be4ee1cf32aa43280fdfef37ed0c7a5 Mon Sep 17 00:00:00 2001 From: Otavio Fernandes Date: Wed, 6 Sep 2023 06:53:40 +0200 Subject: [PATCH 1/5] chore: Extract Resource Package --- internal/linter/linter.go | 7 ++++--- internal/render/markdown.go | 5 +++-- internal/{linter => resource}/resource.go | 6 +++--- 3 files changed, 10 insertions(+), 8 deletions(-) rename internal/{linter => resource}/resource.go (88%) diff --git a/internal/linter/linter.go b/internal/linter/linter.go index 3691130e..7caccc1c 100644 --- a/internal/linter/linter.go +++ b/internal/linter/linter.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/openshift-pipelines/tektoncd-catalog/internal/config" + "github.com/openshift-pipelines/tektoncd-catalog/internal/resource" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) @@ -76,9 +77,9 @@ func (l *Linter) Enforce() error { } // NewLinter instantiate the resource linter by reading and decoding the resource file. -func NewLinter(cfg *config.Config, resource string) (*Linter, error) { - cfg.Infof("# Linting resource file %q...\n", resource) - u, err := ReadAndDecodeResourceFile(resource) +func NewLinter(cfg *config.Config, resourceFile string) (*Linter, error) { + cfg.Infof("# Linting resource file %q...\n", resourceFile) + u, err := resource.ReadAndDecodeResourceFile(resourceFile) if err != nil { return nil, err } diff --git a/internal/render/markdown.go b/internal/render/markdown.go index e2e21e21..a1bedad2 100644 --- a/internal/render/markdown.go +++ b/internal/render/markdown.go @@ -5,6 +5,7 @@ import ( "github.com/openshift-pipelines/tektoncd-catalog/internal/config" "github.com/openshift-pipelines/tektoncd-catalog/internal/linter" + "github.com/openshift-pipelines/tektoncd-catalog/internal/resource" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -48,8 +49,8 @@ func (m *Markdown) Render() error { } // NewMarkdown instantiates the markdown render by decoding the informed resource file. -func NewMarkdown(cfg *config.Config, resource string) (*Markdown, error) { - u, err := linter.ReadAndDecodeResourceFile(resource) +func NewMarkdown(cfg *config.Config, resourceFile string) (*Markdown, error) { + u, err := resource.ReadAndDecodeResourceFile(resourceFile) if err != nil { return nil, err } diff --git a/internal/linter/resource.go b/internal/resource/resource.go similarity index 88% rename from internal/linter/resource.go rename to internal/resource/resource.go index dfdb4e60..2dea2b04 100644 --- a/internal/linter/resource.go +++ b/internal/resource/resource.go @@ -1,4 +1,4 @@ -package linter +package resource import ( "os" @@ -13,8 +13,8 @@ import ( // ReadAndDecodeResourceFile reads the informed file and decode contents using Tekton's Kubernetes // schema, returning a Unstructured instance. -func ReadAndDecodeResourceFile(resource string) (*unstructured.Unstructured, error) { - payload, err := os.ReadFile(resource) +func ReadAndDecodeResourceFile(resourceFile string) (*unstructured.Unstructured, error) { + payload, err := os.ReadFile(resourceFile) if err != nil { return nil, err } From 6469d4bf37d902b7b1a9e2ea03d2d0b35eab4072 Mon Sep 17 00:00:00 2001 From: Otavio Fernandes Date: Wed, 13 Sep 2023 11:22:31 +0200 Subject: [PATCH 2/5] chore: Vendoring Dependencies --- go.mod | 315 +- go.sum | 1522 +- .../bitbucket.org/creachadair/shell/LICENSE | 27 - .../bitbucket.org/creachadair/shell/README.md | 7 - .../creachadair/shell/bitbucket-pipelines.yml | 23 - .../bitbucket.org/creachadair/shell/shell.go | 325 - .../go/compute/internal/version.go | 2 +- vendor/cuelang.org/go/cue/ast/ast.go | 60 +- .../cuelang.org/go/cue/ast/astutil/apply.go | 2 - .../cuelang.org/go/cue/ast/astutil/resolve.go | 23 +- .../go/cue/ast/astutil/sanitize.go | 8 +- vendor/cuelang.org/go/cue/ast/astutil/util.go | 6 +- vendor/cuelang.org/go/cue/ast/astutil/walk.go | 5 +- vendor/cuelang.org/go/cue/ast/ident.go | 35 +- vendor/cuelang.org/go/cue/ast/walk.go | 10 +- vendor/cuelang.org/go/cue/attribute.go | 30 +- vendor/cuelang.org/go/cue/build.go | 5 +- vendor/cuelang.org/go/cue/build/context.go | 7 +- vendor/cuelang.org/go/cue/builtinutil.go | 45 - vendor/cuelang.org/go/cue/context.go | 20 +- vendor/cuelang.org/go/cue/cue.go | 14 +- .../go/cue/cuecontext/cuecontext.go | 19 +- vendor/cuelang.org/go/cue/decode.go | 10 +- vendor/cuelang.org/go/cue/errors/errors.go | 88 +- vendor/cuelang.org/go/cue/format.go | 32 +- vendor/cuelang.org/go/cue/format/format.go | 3 - vendor/cuelang.org/go/cue/format/node.go | 57 +- vendor/cuelang.org/go/cue/format/printer.go | 6 +- vendor/cuelang.org/go/cue/instance.go | 7 +- vendor/cuelang.org/go/cue/literal/num.go | 5 +- vendor/cuelang.org/go/cue/literal/string.go | 99 +- vendor/cuelang.org/go/cue/load/config.go | 297 +- vendor/cuelang.org/go/cue/load/errors.go | 9 - vendor/cuelang.org/go/cue/load/fs.go | 39 +- vendor/cuelang.org/go/cue/load/import.go | 519 +- vendor/cuelang.org/go/cue/load/instances.go | 137 + .../go/cue/load/internal/mvs/errors.go | 103 + .../go/cue/load/internal/mvs/graph.go | 225 + .../go/cue/load/internal/mvs/mvs.go | 487 + .../go/cue/load/internal/par/atomic_go1.18.go | 30 + .../go/cue/load/internal/par/atomic_go1.19.go | 11 + .../go/cue/load/internal/par/queue.go | 88 + .../go/cue/load/internal/par/work.go | 222 + .../go/cue/load/internal/slices/slices.go | 12 + vendor/cuelang.org/go/cue/load/loader.go | 174 +- .../cuelang.org/go/cue/load/loader_common.go | 618 + vendor/cuelang.org/go/cue/load/match.go | 113 +- vendor/cuelang.org/go/cue/load/module.go | 179 + .../cuelang.org/go/cue/load/moduleschema.cue | 23 + vendor/cuelang.org/go/cue/load/read.go | 4 +- vendor/cuelang.org/go/cue/load/registry.go | 136 + vendor/cuelang.org/go/cue/load/search.go | 286 +- vendor/cuelang.org/go/cue/load/tags.go | 65 +- vendor/cuelang.org/go/cue/marshal.go | 4 +- vendor/cuelang.org/go/cue/parser/fuzz.go | 1 - vendor/cuelang.org/go/cue/parser/interface.go | 31 +- vendor/cuelang.org/go/cue/parser/parser.go | 115 +- vendor/cuelang.org/go/cue/path.go | 324 +- vendor/cuelang.org/go/cue/query.go | 5 +- vendor/cuelang.org/go/cue/scanner/fuzz.go | 1 - vendor/cuelang.org/go/cue/scanner/scanner.go | 91 +- vendor/cuelang.org/go/cue/stats/stats.go | 122 + vendor/cuelang.org/go/cue/token/position.go | 13 - vendor/cuelang.org/go/cue/token/token.go | 14 +- vendor/cuelang.org/go/cue/types.go | 345 +- .../go/encoding/gocode/gocodec/codec.go | 17 +- vendor/cuelang.org/go/encoding/json/json.go | 2 +- .../go/encoding/jsonschema/constraints.go | 8 +- .../go/encoding/jsonschema/decode.go | 7 +- .../go/encoding/jsonschema/jsonschema.go | 11 +- .../cuelang.org/go/encoding/jsonschema/ref.go | 4 +- .../cuelang.org/go/encoding/openapi/build.go | 256 +- vendor/cuelang.org/go/encoding/openapi/crd.go | 8 +- .../cuelang.org/go/encoding/openapi/cycle.go | 2 +- .../cuelang.org/go/encoding/openapi/decode.go | 2 +- .../cuelang.org/go/encoding/openapi/errors.go | 13 +- .../go/encoding/openapi/openapi.go | 51 +- .../go/encoding/openapi/orderedmap.go | 4 +- .../cuelang.org/go/encoding/openapi/types.go | 2 +- .../go/encoding/protobuf/jsonpb/decoder.go | 48 +- .../go/encoding/protobuf/jsonpb/encoder.go | 24 +- .../cuelang.org/go/encoding/protobuf/parse.go | 16 +- .../go/encoding/protobuf/protobuf.go | 78 +- .../go/encoding/protobuf/textproto/decoder.go | 11 +- .../go/encoding/protobuf/textproto/encoder.go | 5 +- .../cuelang.org/go/encoding/protobuf/util.go | 1 - .../go/internal/astinternal/debugstr.go | 8 +- vendor/cuelang.org/go/internal/attrs.go | 231 +- .../cuelang.org/go/internal/core/adt/adt.go | 17 +- .../cuelang.org/go/internal/core/adt/binop.go | 39 +- .../go/internal/core/adt/closed.go | 102 +- .../go/internal/core/adt/closed2.go | 3 +- .../go/internal/core/adt/composite.go | 553 +- .../go/internal/core/adt/comprehension.go | 444 +- .../go/internal/core/adt/context.go | 372 +- .../cuelang.org/go/internal/core/adt/cycle.go | 525 + .../go/internal/core/adt/decimal.go | 36 +- .../go/internal/core/adt/default.go | 2 +- .../go/internal/core/adt/disjunct.go | 69 +- .../cuelang.org/go/internal/core/adt/doc.go | 50 +- .../go/internal/core/adt/equality.go | 58 +- .../go/internal/core/adt/errors.go | 46 +- .../cuelang.org/go/internal/core/adt/eval.go | 1322 +- .../cuelang.org/go/internal/core/adt/expr.go | 747 +- .../go/internal/core/adt/feature.go | 88 +- .../cuelang.org/go/internal/core/adt/kind.go | 2 + .../go/internal/core/adt/optional.go | 50 +- .../cuelang.org/go/internal/core/adt/prof.go | 47 + .../go/internal/core/adt/simplify.go | 16 +- .../go/internal/core/compile/builtin.go | 15 +- .../go/internal/core/compile/compile.go | 227 +- .../go/internal/core/compile/label.go | 2 +- .../go/internal/core/convert/go.go | 72 +- .../go/internal/core/debug/compact.go | 44 +- .../go/internal/core/debug/debug.go | 75 +- .../cuelang.org/go/internal/core/dep/dep.go | 520 +- .../cuelang.org/go/internal/core/dep/mixed.go | 31 +- .../cuelang.org/go/internal/core/eval/eval.go | 9 +- .../go/internal/core/export/adt.go | 529 +- .../go/internal/core/export/bounds.go | 6 +- .../go/internal/core/export/export.go | 403 +- .../go/internal/core/export/expr.go | 127 +- .../go/internal/core/export/extract.go | 22 +- .../go/internal/core/export/label.go | 60 +- .../go/internal/core/export/self.go | 471 + .../go/internal/core/export/toposort.go | 39 +- .../go/internal/core/export/value.go | 70 +- .../go/internal/core/runtime/build.go | 5 + .../go/internal/core/runtime/errors.go | 2 +- .../go/internal/core/runtime/extern.go | 341 + .../go/internal/core/runtime/imports.go | 11 + .../go/internal/core/runtime/index.go | 4 + .../go/internal/core/runtime/runtime.go | 11 +- .../go/internal/core/subsume/structural.go | 22 +- .../go/internal/core/subsume/vertex.go | 32 +- .../go/internal/core/validate/validate.go | 11 + .../cuelang.org/go/internal/core/walk/walk.go | 34 +- .../go/internal/encoding/encoder.go | 12 +- .../go/internal/encoding/encoding.go | 51 +- .../go/internal/encoding/json/encode.go | 38 +- .../go/internal/encoding/yaml/encode.go | 26 +- .../go/internal/filetypes/filetypes.go | 27 +- .../go/internal/filetypes/types.go | 11 +- .../cuelang.org/go/internal/filetypes/util.go | 5 +- vendor/cuelang.org/go/internal/internal.go | 122 +- .../{pkg/internal => internal/pkg}/builtin.go | 54 +- vendor/cuelang.org/go/internal/pkg/context.go | 351 + vendor/cuelang.org/go/internal/pkg/errors.go | 90 + .../cuelang.org/go/internal/pkg/register.go | 31 + vendor/cuelang.org/go/internal/pkg/types.go | 78 + .../cuelang.org/go/internal/source/source.go | 5 +- vendor/cuelang.org/go/internal/task/task.go | 13 +- .../go/internal/third_party/yaml/apic.go | 2 +- .../go/internal/third_party/yaml/decode.go | 23 +- .../go/internal/third_party/yaml/parserc.go | 140 +- .../go/internal/third_party/yaml/resolve.go | 2 +- .../go/internal/third_party/yaml/scannerc.go | 34 +- .../go/internal/third_party/yaml/yaml.go | 122 +- .../go/internal/third_party/yaml/yamlh.go | 9 +- vendor/cuelang.org/go/internal/value/value.go | 17 +- .../cuelang.org/go/pkg/crypto/ed25519/pkg.go | 17 +- vendor/cuelang.org/go/pkg/crypto/hmac/pkg.go | 17 +- vendor/cuelang.org/go/pkg/crypto/md5/pkg.go | 17 +- vendor/cuelang.org/go/pkg/crypto/sha1/pkg.go | 17 +- .../cuelang.org/go/pkg/crypto/sha256/pkg.go | 21 +- .../cuelang.org/go/pkg/crypto/sha512/pkg.go | 29 +- vendor/cuelang.org/go/pkg/doc.go | 6 +- .../cuelang.org/go/pkg/encoding/base64/pkg.go | 29 +- .../cuelang.org/go/pkg/encoding/csv/manual.go | 8 +- vendor/cuelang.org/go/pkg/encoding/csv/pkg.go | 21 +- vendor/cuelang.org/go/pkg/encoding/hex/hex.go | 2 +- vendor/cuelang.org/go/pkg/encoding/hex/pkg.go | 33 +- .../cuelang.org/go/pkg/encoding/json/json.go | 2 +- .../go/pkg/encoding/json/manual.go | 14 +- .../cuelang.org/go/pkg/encoding/json/pkg.go | 49 +- .../go/pkg/encoding/yaml/manual.go | 22 +- .../cuelang.org/go/pkg/encoding/yaml/pkg.go | 37 +- vendor/cuelang.org/go/pkg/html/html.go | 2 +- vendor/cuelang.org/go/pkg/html/pkg.go | 21 +- vendor/cuelang.org/go/pkg/internal/context.go | 329 - vendor/cuelang.org/go/pkg/internal/errors.go | 97 - .../cuelang.org/go/pkg/internal/register.go | 31 - vendor/cuelang.org/go/pkg/list/list.go | 63 +- vendor/cuelang.org/go/pkg/list/math.go | 7 +- vendor/cuelang.org/go/pkg/list/pkg.go | 107 +- vendor/cuelang.org/go/pkg/list/sort.cue | 11 +- vendor/cuelang.org/go/pkg/list/sort.go | 110 +- vendor/cuelang.org/go/pkg/math/big.go | 2 +- vendor/cuelang.org/go/pkg/math/bits/manual.go | 1 - vendor/cuelang.org/go/pkg/math/bits/pkg.go | 53 +- vendor/cuelang.org/go/pkg/math/manual.go | 30 +- vendor/cuelang.org/go/pkg/math/math.go | 71 +- vendor/cuelang.org/go/pkg/math/pkg.go | 221 +- vendor/cuelang.org/go/pkg/net/doc.go | 9 +- vendor/cuelang.org/go/pkg/net/host.go | 2 +- vendor/cuelang.org/go/pkg/net/pkg.go | 129 +- vendor/cuelang.org/go/pkg/net/url.go | 50 + vendor/cuelang.org/go/pkg/packages.txt | 31 + vendor/cuelang.org/go/pkg/path/match.go | 1 - vendor/cuelang.org/go/pkg/path/path.go | 18 +- vendor/cuelang.org/go/pkg/path/pkg.go | 76 +- vendor/cuelang.org/go/pkg/regexp/manual.go | 11 +- vendor/cuelang.org/go/pkg/regexp/pkg.go | 57 +- vendor/cuelang.org/go/pkg/regexp/regexp.go | 2 +- vendor/cuelang.org/go/pkg/strconv/pkg.go | 93 +- vendor/cuelang.org/go/pkg/strconv/strconv.go | 25 +- vendor/cuelang.org/go/pkg/strings/manual.go | 8 +- vendor/cuelang.org/go/pkg/strings/pkg.go | 149 +- vendor/cuelang.org/go/pkg/strings/strings.go | 16 +- vendor/cuelang.org/go/pkg/struct/pkg.go | 25 +- vendor/cuelang.org/go/pkg/struct/struct.go | 36 +- .../go/pkg/text/tabwriter/manual.go | 8 +- .../cuelang.org/go/pkg/text/tabwriter/pkg.go | 17 +- .../go/pkg/text/template/manual.go | 8 +- .../cuelang.org/go/pkg/text/template/pkg.go | 25 +- .../go/pkg/text/template/template.go | 2 +- vendor/cuelang.org/go/pkg/time/duration.go | 3 +- vendor/cuelang.org/go/pkg/time/pkg.go | 49 +- vendor/cuelang.org/go/pkg/time/time.go | 9 + vendor/cuelang.org/go/pkg/tool/cli/cli.cue | 2 +- vendor/cuelang.org/go/pkg/tool/cli/cli.go | 30 +- vendor/cuelang.org/go/pkg/tool/cli/doc.go | 33 - vendor/cuelang.org/go/pkg/tool/cli/doc.txt | 3 + vendor/cuelang.org/go/pkg/tool/cli/pkg.go | 42 +- vendor/cuelang.org/go/pkg/tool/doc.go | 87 - vendor/cuelang.org/go/pkg/tool/doc.txt | 18 + vendor/cuelang.org/go/pkg/tool/exec/doc.go | 43 - vendor/cuelang.org/go/pkg/tool/exec/doc.txt | 3 + vendor/cuelang.org/go/pkg/tool/exec/exec.cue | 2 +- vendor/cuelang.org/go/pkg/tool/exec/exec.go | 3 - vendor/cuelang.org/go/pkg/tool/exec/pkg.go | 52 +- vendor/cuelang.org/go/pkg/tool/file/doc.go | 128 - vendor/cuelang.org/go/pkg/tool/file/doc.txt | 3 + vendor/cuelang.org/go/pkg/tool/file/file.go | 8 +- vendor/cuelang.org/go/pkg/tool/file/pkg.go | 137 +- vendor/cuelang.org/go/pkg/tool/generate.go | 18 - vendor/cuelang.org/go/pkg/tool/http/doc.go | 53 - vendor/cuelang.org/go/pkg/tool/http/doc.txt | 3 + vendor/cuelang.org/go/pkg/tool/http/http.go | 6 +- vendor/cuelang.org/go/pkg/tool/http/pkg.go | 62 +- vendor/cuelang.org/go/pkg/tool/os/doc.go | 48 - vendor/cuelang.org/go/pkg/tool/os/doc.txt | 3 + vendor/cuelang.org/go/pkg/tool/os/env.go | 3 - vendor/cuelang.org/go/pkg/tool/os/pkg.go | 57 +- vendor/cuelang.org/go/pkg/tool/pkg.go | 87 + vendor/cuelang.org/go/pkg/tool/tool.cue | 7 +- vendor/cuelang.org/go/pkg/uuid/pkg.go | 53 +- vendor/cuelang.org/go/pkg/uuid/uuid.go | 3 +- vendor/filippo.io/edwards25519/LICENSE | 27 + vendor/filippo.io/edwards25519/README.md | 14 + vendor/filippo.io/edwards25519/doc.go | 20 + .../filippo.io/edwards25519/edwards25519.go | 428 + vendor/filippo.io/edwards25519/extra.go | 343 + vendor/filippo.io/edwards25519/field/fe.go | 420 + .../filippo.io/edwards25519/field/fe_amd64.go | 13 + .../filippo.io/edwards25519/field/fe_amd64.s | 378 + .../edwards25519/field/fe_amd64_noasm.go | 12 + .../filippo.io/edwards25519/field/fe_arm64.go | 16 + .../filippo.io/edwards25519/field/fe_arm64.s | 42 + .../edwards25519/field/fe_arm64_noasm.go | 12 + .../filippo.io/edwards25519/field/fe_extra.go | 50 + .../edwards25519/field/fe_generic.go | 266 + vendor/filippo.io/edwards25519/scalar.go | 1030 + vendor/filippo.io/edwards25519/scalarmult.go | 214 + vendor/filippo.io/edwards25519/tables.go | 129 + .../Azure/go-autorest/autorest/adal/token.go | 2 +- .../Azure/go-autorest/autorest/autorest.go | 32 +- .../go-autorest/autorest/azure/auth/README.md | 152 + .../go-autorest/autorest/azure/auth/auth.go | 13 +- .../Azure/go-autorest/autorest/azure/azure.go | 2 +- .../Azure/go-autorest/autorest/utility.go | 6 +- .../DataDog/appsec-internal-go/LICENSE | 200 + .../appsec-internal-go/httpsec/client_ip.go | 126 + .../appsec-internal-go/netip/ip_default.go | 32 + .../appsec-internal-go/netip/ip_go119.go | 34 + .../datadog-agent/pkg/obfuscate/LICENSE | 200 + .../datadog-agent/pkg/obfuscate/cache.go | 90 + .../pkg/obfuscate/credit_cards.go | 211 + .../datadog-agent/pkg/obfuscate/http.go | 60 + .../datadog-agent/pkg/obfuscate/json.go | 201 + .../pkg/obfuscate/json_scanner.go | 565 + .../datadog-agent/pkg/obfuscate/memcached.go | 19 + .../datadog-agent/pkg/obfuscate/obfuscate.go | 254 + .../datadog-agent/pkg/obfuscate/redis.go | 262 + .../pkg/obfuscate/redis_tokenizer.go | 187 + .../datadog-agent/pkg/obfuscate/sql.go | 416 + .../pkg/obfuscate/sql_tokenizer.go | 912 + .../pkg/remoteconfig/state/LICENSE | 200 + .../pkg/remoteconfig/state/configs.go | 479 + .../pkg/remoteconfig/state/path.go | 100 + .../pkg/remoteconfig/state/repository.go | 442 + .../pkg/remoteconfig/state/tuf.go | 233 + .../DataDog/datadog-go/v5/LICENSE.txt | 19 + .../DataDog/datadog-go/v5/statsd/README.md | 4 + .../datadog-go/v5/statsd/aggregator.go | 290 + .../DataDog/datadog-go/v5/statsd/buffer.go | 197 + .../datadog-go/v5/statsd/buffer_pool.go | 40 + .../v5/statsd/buffered_metric_context.go | 82 + .../DataDog/datadog-go/v5/statsd/container.go | 82 + .../DataDog/datadog-go/v5/statsd/event.go | 75 + .../DataDog/datadog-go/v5/statsd/fnv1a.go | 39 + .../DataDog/datadog-go/v5/statsd/format.go | 280 + .../DataDog/datadog-go/v5/statsd/metrics.go | 181 + .../DataDog/datadog-go/v5/statsd/noop.go | 106 + .../DataDog/datadog-go/v5/statsd/options.go | 348 + .../DataDog/datadog-go/v5/statsd/pipe.go | 13 + .../datadog-go/v5/statsd/pipe_windows.go | 75 + .../DataDog/datadog-go/v5/statsd/sender.go | 111 + .../datadog-go/v5/statsd/service_check.go | 57 + .../DataDog/datadog-go/v5/statsd/statsd.go | 838 + .../DataDog/datadog-go/v5/statsd/telemetry.go | 274 + .../DataDog/datadog-go/v5/statsd/udp.go | 34 + .../DataDog/datadog-go/v5/statsd/uds.go | 88 + .../datadog-go/v5/statsd/uds_windows.go | 14 + .../DataDog/datadog-go/v5/statsd/utils.go | 32 + .../DataDog/datadog-go/v5/statsd/worker.go | 150 + .../DataDog/go-libddwaf/.gitattributes | 3 + .../github.com/DataDog/go-libddwaf/.gitignore | 15 + vendor/github.com/DataDog/go-libddwaf/LICENSE | 200 + .../github.com/DataDog/go-libddwaf/README.md | 120 + .../DataDog/go-libddwaf/cgo_ref_pool.go | 90 + .../github.com/DataDog/go-libddwaf/context.go | 155 + .../github.com/DataDog/go-libddwaf/ctypes.go | 176 + .../github.com/DataDog/go-libddwaf/decoder.go | 73 + .../DataDog/go-libddwaf/embed_darwin_amd64.go | 13 + .../DataDog/go-libddwaf/embed_darwin_arm64.go | 13 + .../DataDog/go-libddwaf/embed_linux_amd64.go | 13 + .../DataDog/go-libddwaf/embed_linux_arm64.go | 13 + .../github.com/DataDog/go-libddwaf/encoder.go | 256 + .../github.com/DataDog/go-libddwaf/handle.go | 169 + .../go-libddwaf/internal/noopfree/noopfree.go | 15 + .../go-libddwaf/internal/noopfree/noopfree.s | 10 + .../lib/darwin-amd64/_libddwaf.dylib | Bin 0 -> 1375480 bytes .../lib/darwin-arm64/_libddwaf.dylib | Bin 0 -> 1289856 bytes .../go-libddwaf/lib/linux-amd64/libddwaf.so | Bin 0 -> 2271536 bytes .../go-libddwaf/lib/linux-arm64/libddwaf.so | Bin 0 -> 2124056 bytes .../github.com/DataDog/go-libddwaf/lib_dl.go | 88 + vendor/github.com/DataDog/go-libddwaf/safe.go | 68 + .../DataDog/go-libddwaf/symbols_linux_cgo.go | 21 + .../go-libddwaf/symbols_linux_purego.go | 15 + vendor/github.com/DataDog/go-libddwaf/waf.go | 130 + .../github.com/DataDog/go-libddwaf/waf_dl.go | 168 + .../DataDog/go-libddwaf/waf_dl_unsupported.go | 54 + .../DataDog/go-libddwaf/waf_unsupported_go.go | 17 + .../go-libddwaf/waf_unsupported_target.go | 17 + vendor/github.com/DataDog/go-tuf/LICENSE | 27 + .../DataDog/go-tuf/client/client.go | 997 + .../DataDog/go-tuf/client/delegations.go | 117 + .../DataDog/go-tuf/client/errors.go | 107 + .../DataDog/go-tuf/client/local_store.go | 29 + .../DataDog/go-tuf/client/remote_store.go | 109 + .../DataDog/go-tuf/data/hex_bytes.go | 42 + .../github.com/DataDog/go-tuf/data/types.go | 326 + .../DataDog/go-tuf/internal/roles/roles.go | 41 + .../DataDog/go-tuf/internal/sets/strings.go | 24 + .../DataDog/go-tuf/pkg/keys/ecdsa.go | 71 + .../DataDog/go-tuf/pkg/keys/ed25519.go | 137 + .../DataDog/go-tuf/pkg/keys/keys.go | 79 + .../github.com/DataDog/go-tuf/pkg/keys/rsa.go | 138 + .../DataDog/go-tuf/pkg/targets/delegation.go | 95 + .../DataDog/go-tuf/pkg/targets/hash_bins.go | 113 + vendor/github.com/DataDog/go-tuf/util/util.go | 305 + vendor/github.com/DataDog/go-tuf/verify/db.go | 97 + .../DataDog/go-tuf/verify/errors.go | 71 + .../DataDog/go-tuf/verify/verify.go | 164 + vendor/github.com/DataDog/sketches-go/LICENSE | 13 + .../DataDog/sketches-go/LICENSE-3rdparty.csv | 3 + vendor/github.com/DataDog/sketches-go/NOTICE | 4 + .../DataDog/sketches-go/ddsketch/ddsketch.go | 716 + .../sketches-go/ddsketch/encoding/encoding.go | 208 + .../sketches-go/ddsketch/encoding/flag.go | 160 + .../ddsketch/mapping/bit_operation_helper.go | 35 + .../mapping/cubically_interpolated_mapping.go | 144 + .../ddsketch/mapping/index_mapping.go | 90 + .../mapping/linearly_interpolated_mapping.go | 139 + .../ddsketch/mapping/logarithmic_mapping.go | 119 + .../ddsketch/pb/sketchpb/ddsketch.pb.go | 448 + .../sketches-go/ddsketch/stat/summary.go | 147 + .../DataDog/sketches-go/ddsketch/store/bin.go | 28 + .../ddsketch/store/buffered_paginated.go | 660 + .../store/collapsing_highest_dense_store.go | 187 + .../store/collapsing_lowest_dense_store.go | 206 + .../sketches-go/ddsketch/store/dense_store.go | 329 + .../sketches-go/ddsketch/store/sparse.go | 183 + .../sketches-go/ddsketch/store/store.go | 153 + .../Microsoft/go-winio/.golangci.yml | 27 +- .../github.com/Microsoft/go-winio/hvsock.go | 6 +- .../Microsoft/go-winio/internal/fs/doc.go | 2 + .../Microsoft/go-winio/internal/fs/fs.go | 202 + .../go-winio/internal/fs/security.go | 12 + .../go-winio/internal/fs/zsyscall_windows.go | 64 + .../go-winio/internal/socket/socket.go | 4 +- .../go-winio/internal/stringbuffer/wstring.go | 132 + vendor/github.com/Microsoft/go-winio/pipe.go | 22 +- .../Microsoft/go-winio/zsyscall_windows.go | 19 - .../github.com/ProtonMail/go-crypto/AUTHORS | 3 + .../ProtonMail/go-crypto/CONTRIBUTORS | 3 + .../github.com/ProtonMail/go-crypto/LICENSE | 27 + .../github.com/ProtonMail/go-crypto/PATENTS | 22 + .../go-crypto/bitcurves/bitcurve.go | 381 + .../go-crypto/brainpool/brainpool.go | 134 + .../ProtonMail/go-crypto/brainpool/rcurve.go | 83 + .../ProtonMail/go-crypto/eax/eax.go | 162 + .../go-crypto/eax/eax_test_vectors.go | 58 + .../go-crypto/eax/random_vectors.go | 131 + .../go-crypto/internal/byteutil/byteutil.go | 90 + .../ProtonMail/go-crypto/ocb/ocb.go | 317 + .../go-crypto/ocb/random_vectors.go | 136 + .../ocb/rfc7253_test_vectors_suite_a.go | 78 + .../ocb/rfc7253_test_vectors_suite_b.go | 25 + .../go-crypto/openpgp/aes/keywrap/keywrap.go | 153 + .../go-crypto/openpgp/armor/armor.go | 226 + .../go-crypto/openpgp/armor/encode.go | 161 + .../go-crypto/openpgp/canonical_text.go | 65 + .../ProtonMail/go-crypto/openpgp/ecdh/ecdh.go | 210 + .../go-crypto/openpgp/ecdsa/ecdsa.go | 80 + .../go-crypto/openpgp/eddsa/eddsa.go | 91 + .../go-crypto/openpgp/elgamal/elgamal.go | 124 + .../go-crypto/openpgp/errors/errors.go | 116 + .../ProtonMail/go-crypto/openpgp/hash.go | 24 + .../openpgp/internal/algorithm/aead.go | 65 + .../openpgp/internal/algorithm/cipher.go | 107 + .../openpgp/internal/algorithm/hash.go | 143 + .../openpgp/internal/ecc/curve25519.go | 171 + .../openpgp/internal/ecc/curve_info.go | 140 + .../go-crypto/openpgp/internal/ecc/curves.go | 48 + .../go-crypto/openpgp/internal/ecc/ed25519.go | 112 + .../go-crypto/openpgp/internal/ecc/ed448.go | 111 + .../go-crypto/openpgp/internal/ecc/generic.go | 149 + .../go-crypto/openpgp/internal/ecc/x448.go | 105 + .../openpgp/internal/encoding/encoding.go | 27 + .../openpgp/internal/encoding/mpi.go | 91 + .../openpgp/internal/encoding/oid.go | 88 + .../go-crypto/openpgp/key_generation.go | 389 + .../ProtonMail/go-crypto/openpgp/keys.go | 842 + .../go-crypto/openpgp/keys_test_data.go | 538 + .../go-crypto/openpgp/packet/aead_config.go | 67 + .../go-crypto/openpgp/packet/aead_crypter.go | 264 + .../openpgp/packet/aead_encrypted.go | 96 + .../go-crypto/openpgp/packet/compressed.go | 125 + .../go-crypto/openpgp/packet/config.go | 248 + .../go-crypto/openpgp/packet/encrypted_key.go | 286 + .../go-crypto/openpgp/packet/literal.go | 91 + .../go-crypto/openpgp/packet/notation.go | 29 + .../go-crypto/openpgp/packet/ocfb.go | 137 + .../openpgp/packet/one_pass_signature.go | 73 + .../go-crypto/openpgp/packet/opaque.go | 171 + .../go-crypto/openpgp/packet/packet.go | 551 + .../go-crypto/openpgp/packet/private_key.go | 837 + .../openpgp/packet/private_key_test_data.go | 12 + .../go-crypto/openpgp/packet/public_key.go | 802 + .../openpgp/packet/public_key_test_data.go | 24 + .../go-crypto/openpgp/packet/reader.go | 86 + .../go-crypto/openpgp/packet/signature.go | 1084 + .../openpgp/packet/symmetric_key_encrypted.go | 303 + .../openpgp/packet/symmetrically_encrypted.go | 90 + .../packet/symmetrically_encrypted_aead.go | 155 + .../packet/symmetrically_encrypted_mdc.go | 256 + .../go-crypto/openpgp/packet/userattribute.go | 101 + .../go-crypto/openpgp/packet/userid.go | 167 + .../ProtonMail/go-crypto/openpgp/read.go | 592 + .../go-crypto/openpgp/read_write_test_data.go | 274 + .../ProtonMail/go-crypto/openpgp/s2k/s2k.go | 407 + .../go-crypto/openpgp/s2k/s2k_cache.go | 26 + .../go-crypto/openpgp/s2k/s2k_config.go | 129 + .../ProtonMail/go-crypto/openpgp/write.go | 583 + .../asaskevich/govalidator/validator.go | 33 +- .../github.com/aws/aws-sdk-go-v2/CHANGELOG.md | 1790 +- .../aws/aws-sdk-go-v2/CODE_OF_CONDUCT.md | 4 +- .../aws/aws-sdk-go-v2/CONTRIBUTING.md | 35 +- vendor/github.com/aws/aws-sdk-go-v2/DESIGN.md | 2 +- vendor/github.com/aws/aws-sdk-go-v2/Makefile | 13 +- .../github.com/aws/aws-sdk-go-v2/NOTICE.txt | 2 +- vendor/github.com/aws/aws-sdk-go-v2/README.md | 13 +- .../aws/aws-sdk-go-v2/aws/config.go | 14 + .../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/aws/middleware/metadata.go | 33 +- .../aws/middleware/recursion_detection.go | 94 + .../aws/middleware/user_agent.go | 26 +- .../aws/protocol/xml/error_utils.go | 16 +- .../aws/ratelimit/token_rate_limit.go | 4 - .../aws/aws-sdk-go-v2/aws/retry/middleware.go | 5 +- .../aws/retry/retryable_error.go | 5 + .../aws/aws-sdk-go-v2/aws/retryer.go | 2 +- .../aws/signer/internal/v4/headers.go | 1 + .../aws-sdk-go-v2/aws/signer/v4/middleware.go | 15 +- .../aws/aws-sdk-go-v2/aws/signer/v4/v4.go | 2 +- .../aws/aws-sdk-go-v2/config/CHANGELOG.md | 72 + .../aws/aws-sdk-go-v2/config/config.go | 3 + .../config/go_module_metadata.go | 2 +- .../aws/aws-sdk-go-v2/config/load_options.go | 17 + .../aws/aws-sdk-go-v2/config/provider.go | 17 + .../aws/aws-sdk-go-v2/config/resolve.go | 15 + .../config/resolve_credentials.go | 24 +- .../aws/aws-sdk-go-v2/config/shared_config.go | 13 + .../aws-sdk-go-v2/credentials/CHANGELOG.md | 68 + .../credentials/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/credentials/ssocreds/doc.go | 24 +- .../feature/ec2/imds/CHANGELOG.md | 36 + .../feature/ec2/imds/api_client.go | 10 + .../feature/ec2/imds/go_module_metadata.go | 2 +- .../feature/ec2/imds/token_provider.go | 82 +- .../aws/aws-sdk-go-v2/internal/auth/scheme.go | 186 + .../internal/configsources/CHANGELOG.md | 32 + .../configsources/go_module_metadata.go | 2 +- .../internal/endpoints/awsrulesfn/arn.go | 94 + .../internal/endpoints/awsrulesfn/doc.go | 3 + .../internal/endpoints/awsrulesfn/generate.go | 7 + .../internal/endpoints/awsrulesfn/host.go | 51 + .../endpoints/awsrulesfn/partition.go | 75 + .../endpoints/awsrulesfn/partitions.go | 343 + .../endpoints/awsrulesfn/partitions.json | 203 + .../internal/endpoints/v2/CHANGELOG.md | 32 + .../endpoints/v2/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/internal/ini/CHANGELOG.md | 32 + .../internal/ini/go_module_metadata.go | 2 +- .../github.com/aws/aws-sdk-go-v2/modman.toml | 2 +- .../internal/presigned-url/CHANGELOG.md | 32 + .../presigned-url/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sso/CHANGELOG.md | 53 + .../aws-sdk-go-v2/service/sso/api_client.go | 108 +- .../service/sso/api_op_GetRoleCredentials.go | 149 +- .../service/sso/api_op_ListAccountRoles.go | 144 +- .../service/sso/api_op_ListAccounts.go | 147 +- .../service/sso/api_op_Logout.go | 150 +- .../aws/aws-sdk-go-v2/service/sso/doc.go | 9 +- .../aws-sdk-go-v2/service/sso/endpoints.go | 615 +- .../aws-sdk-go-v2/service/sso/generated.json | 4 +- .../service/sso/go_module_metadata.go | 2 +- .../sso/internal/endpoints/endpoints.go | 48 +- .../aws-sdk-go-v2/service/sso/serializers.go | 36 +- .../aws-sdk-go-v2/service/sso/types/errors.go | 8 +- .../aws-sdk-go-v2/service/sso/types/types.go | 9 +- .../service/ssooidc/CHANGELOG.md | 53 + .../service/ssooidc/api_client.go | 108 +- .../service/ssooidc/api_op_CreateToken.go | 161 +- .../service/ssooidc/api_op_RegisterClient.go | 150 +- .../api_op_StartDeviceAuthorization.go | 157 +- .../aws/aws-sdk-go-v2/service/ssooidc/doc.go | 54 +- .../service/ssooidc/endpoints.go | 615 +- .../service/ssooidc/generated.json | 4 +- .../service/ssooidc/go_module_metadata.go | 2 +- .../ssooidc/internal/endpoints/endpoints.go | 48 +- .../service/ssooidc/serializers.go | 27 +- .../service/ssooidc/types/errors.go | 34 +- .../aws-sdk-go-v2/service/sts/CHANGELOG.md | 61 + .../aws-sdk-go-v2/service/sts/api_client.go | 108 +- .../service/sts/api_op_AssumeRole.go | 309 +- .../service/sts/api_op_AssumeRoleWithSAML.go | 277 +- .../sts/api_op_AssumeRoleWithWebIdentity.go | 328 +- .../sts/api_op_DecodeAuthorizationMessage.go | 174 +- .../service/sts/api_op_GetAccessKeyInfo.go | 155 +- .../service/sts/api_op_GetCallerIdentity.go | 160 +- .../service/sts/api_op_GetFederationToken.go | 299 +- .../service/sts/api_op_GetSessionToken.go | 257 +- .../aws/aws-sdk-go-v2/service/sts/doc.go | 9 +- .../aws-sdk-go-v2/service/sts/endpoints.go | 838 +- .../aws-sdk-go-v2/service/sts/generated.json | 4 +- .../service/sts/go_module_metadata.go | 2 +- .../sts/internal/endpoints/endpoints.go | 51 +- .../aws-sdk-go-v2/service/sts/serializers.go | 36 + .../aws-sdk-go-v2/service/sts/types/errors.go | 35 +- .../aws-sdk-go-v2/service/sts/types/types.go | 44 +- vendor/github.com/aws/smithy-go/.gitignore | 4 + vendor/github.com/aws/smithy-go/CHANGELOG.md | 5 + .../smithy-go/encoding/httpbinding/encode.go | 13 +- .../aws/smithy-go/endpoints/endpoint.go | 23 + .../aws/smithy-go/go_module_metadata.go | 2 +- vendor/github.com/aws/smithy-go/properties.go | 52 + vendor/github.com/benbjohnson/clock/LICENSE | 21 - vendor/github.com/benbjohnson/clock/README.md | 104 - vendor/github.com/benbjohnson/clock/clock.go | 340 - .../github.com/bgentry/speakeasy/.gitignore | 2 - vendor/github.com/bgentry/speakeasy/LICENSE | 24 - .../bgentry/speakeasy/LICENSE_WINDOWS | 201 - vendor/github.com/bgentry/speakeasy/Readme.md | 30 - .../github.com/bgentry/speakeasy/speakeasy.go | 49 - .../bgentry/speakeasy/speakeasy_unix.go | 93 - .../bgentry/speakeasy/speakeasy_windows.go | 41 - .../github.com/buildkite/agent/v3/LICENSE.txt | 21 + .../buildkite/agent/v3/api/agents.go | 69 + .../buildkite/agent/v3/api/annotations.go | 38 + .../buildkite/agent/v3/api/artifacts.go | 154 + .../github.com/buildkite/agent/v3/api/auth.go | 37 + .../buildkite/agent/v3/api/chunks.go | 41 + .../buildkite/agent/v3/api/client.go | 366 + .../github.com/buildkite/agent/v3/api/doc.go | 4 + .../buildkite/agent/v3/api/header_times.go | 29 + .../buildkite/agent/v3/api/heartbeats.go | 31 + .../github.com/buildkite/agent/v3/api/jobs.go | 155 + .../buildkite/agent/v3/api/meta_data.go | 97 + .../github.com/buildkite/agent/v3/api/oidc.go | 43 + .../buildkite/agent/v3/api/pings.go | 27 + .../buildkite/agent/v3/api/pipelines.go | 57 + .../buildkite/agent/v3/api/retryable.go | 72 + .../buildkite/agent/v3/api/steps.go | 56 + .../github.com/buildkite/agent/v3/api/uuid.go | 7 + .../buildkite/agent/v3/env/environment.go | 298 + .../agent/v3/internal/ordered/map.go | 391 + .../agent/v3/internal/ordered/slice.go | 30 + .../agent/v3/internal/ordered/strings.go | 39 + .../agent/v3/internal/ordered/tuple.go | 15 + .../agent/v3/internal/ordered/unmarshal.go | 375 + .../agent/v3/internal/ordered/yaml.go | 260 + .../agent/v3/internal/pipeline/doc.go | 13 + .../agent/v3/internal/pipeline/interpolate.go | 131 + .../agent/v3/internal/pipeline/json.go | 98 + .../agent/v3/internal/pipeline/parser.go | 32 + .../agent/v3/internal/pipeline/pipeline.go | 129 + .../agent/v3/internal/pipeline/plugin.go | 58 + .../agent/v3/internal/pipeline/plugins.go | 80 + .../agent/v3/internal/pipeline/sign.go | 207 + .../agent/v3/internal/pipeline/step.go | 13 + .../v3/internal/pipeline/step_command.go | 170 + .../agent/v3/internal/pipeline/step_group.go | 58 + .../agent/v3/internal/pipeline/step_input.go | 36 + .../agent/v3/internal/pipeline/step_scalar.go | 41 + .../v3/internal/pipeline/step_trigger.go | 25 + .../v3/internal/pipeline/step_unknown.go | 42 + .../agent/v3/internal/pipeline/step_wait.go | 37 + .../agent/v3/internal/pipeline/steps.go | 171 + .../buildkite/agent/v3/logger/buffer.go | 60 + .../buildkite/agent/v3/logger/field.go | 65 + .../buildkite/agent/v3/logger/init_windows.go | 31 + .../buildkite/agent/v3/logger/level.go | 50 + .../buildkite/agent/v3/logger/log.go | 273 + .../buildkite/agent/v3/tracetools/doc.go | 5 + .../agent/v3/tracetools/propagate.go | 55 + .../buildkite/agent/v3/tracetools/span.go | 129 + .../buildkite/agent/v3/version/VERSION | 1 + .../buildkite/agent/v3/version/version.go | 35 + .../buildkite/interpolate/LICENSE.txt | 24 + .../buildkite/interpolate/README.md | 61 + .../github.com/buildkite/interpolate/env.go | 49 + .../buildkite/interpolate/interpolate.go | 212 + .../buildkite/interpolate/parser.go | 287 + .../github.com/cenkalti/backoff/v4/.gitignore | 25 - vendor/github.com/cenkalti/backoff/v4/LICENSE | 20 - .../github.com/cenkalti/backoff/v4/README.md | 32 - .../github.com/cenkalti/backoff/v4/backoff.go | 66 - .../github.com/cenkalti/backoff/v4/context.go | 62 - .../cenkalti/backoff/v4/exponential.go | 161 - .../github.com/cenkalti/backoff/v4/retry.go | 146 - .../github.com/cenkalti/backoff/v4/ticker.go | 97 - .../github.com/cenkalti/backoff/v4/timer.go | 35 - .../github.com/cenkalti/backoff/v4/tries.go | 38 - vendor/github.com/cloudflare/circl/LICENSE | 57 + .../cloudflare/circl/dh/x25519/curve.go | 96 + .../cloudflare/circl/dh/x25519/curve_amd64.go | 30 + .../cloudflare/circl/dh/x25519/curve_amd64.h | 111 + .../cloudflare/circl/dh/x25519/curve_amd64.s | 156 + .../circl/dh/x25519/curve_generic.go | 85 + .../cloudflare/circl/dh/x25519/curve_noasm.go | 11 + .../cloudflare/circl/dh/x25519/doc.go | 19 + .../cloudflare/circl/dh/x25519/key.go | 47 + .../cloudflare/circl/dh/x25519/table.go | 268 + .../cloudflare/circl/dh/x448/curve.go | 104 + .../cloudflare/circl/dh/x448/curve_amd64.go | 30 + .../cloudflare/circl/dh/x448/curve_amd64.h | 111 + .../cloudflare/circl/dh/x448/curve_amd64.s | 193 + .../cloudflare/circl/dh/x448/curve_generic.go | 100 + .../cloudflare/circl/dh/x448/curve_noasm.go | 11 + .../cloudflare/circl/dh/x448/doc.go | 19 + .../cloudflare/circl/dh/x448/key.go | 46 + .../cloudflare/circl/dh/x448/table.go | 460 + .../circl/ecc/goldilocks/constants.go | 71 + .../cloudflare/circl/ecc/goldilocks/curve.go | 80 + .../circl/ecc/goldilocks/isogeny.go | 52 + .../cloudflare/circl/ecc/goldilocks/point.go | 171 + .../cloudflare/circl/ecc/goldilocks/scalar.go | 203 + .../cloudflare/circl/ecc/goldilocks/twist.go | 138 + .../circl/ecc/goldilocks/twistPoint.go | 135 + .../circl/ecc/goldilocks/twistTables.go | 216 + .../circl/ecc/goldilocks/twist_basemult.go | 62 + .../cloudflare/circl/internal/conv/conv.go | 140 + .../cloudflare/circl/internal/sha3/doc.go | 62 + .../cloudflare/circl/internal/sha3/hashes.go | 69 + .../cloudflare/circl/internal/sha3/keccakf.go | 383 + .../cloudflare/circl/internal/sha3/rc.go | 29 + .../cloudflare/circl/internal/sha3/sha3.go | 195 + .../circl/internal/sha3/sha3_s390x.s | 33 + .../cloudflare/circl/internal/sha3/shake.go | 79 + .../cloudflare/circl/internal/sha3/xor.go | 15 + .../circl/internal/sha3/xor_generic.go | 33 + .../circl/internal/sha3/xor_unaligned.go | 61 + .../cloudflare/circl/math/fp25519/fp.go | 205 + .../cloudflare/circl/math/fp25519/fp_amd64.go | 45 + .../cloudflare/circl/math/fp25519/fp_amd64.h | 351 + .../cloudflare/circl/math/fp25519/fp_amd64.s | 111 + .../circl/math/fp25519/fp_generic.go | 317 + .../cloudflare/circl/math/fp25519/fp_noasm.go | 13 + .../cloudflare/circl/math/fp448/fp.go | 164 + .../cloudflare/circl/math/fp448/fp_amd64.go | 43 + .../cloudflare/circl/math/fp448/fp_amd64.h | 591 + .../cloudflare/circl/math/fp448/fp_amd64.s | 74 + .../cloudflare/circl/math/fp448/fp_generic.go | 339 + .../cloudflare/circl/math/fp448/fp_noasm.go | 12 + .../cloudflare/circl/math/fp448/fuzzer.go | 75 + .../cloudflare/circl/math/mlsbset/mlsbset.go | 122 + .../cloudflare/circl/math/mlsbset/power.go | 64 + .../github.com/cloudflare/circl/math/wnaf.go | 84 + .../cloudflare/circl/sign/ed25519/ed25519.go | 453 + .../cloudflare/circl/sign/ed25519/modular.go | 175 + .../cloudflare/circl/sign/ed25519/mult.go | 180 + .../cloudflare/circl/sign/ed25519/point.go | 195 + .../cloudflare/circl/sign/ed25519/pubkey.go | 9 + .../circl/sign/ed25519/pubkey112.go | 7 + .../cloudflare/circl/sign/ed25519/signapi.go | 87 + .../cloudflare/circl/sign/ed25519/tables.go | 213 + .../cloudflare/circl/sign/ed448/ed448.go | 411 + .../cloudflare/circl/sign/ed448/signapi.go | 87 + .../github.com/cloudflare/circl/sign/sign.go | 110 + .../cncf/udpa/go/udpa/type/v1/typed_struct.go | 8 - .../xds/go/udpa/annotations/migrate.pb.go | 415 - .../udpa/annotations/migrate.pb.validate.go | 243 - .../xds/go/udpa/annotations/security.pb.go | 201 - .../udpa/annotations/security.pb.validate.go | 105 - .../xds/go/udpa/annotations/sensitive.pb.go | 98 - .../udpa/annotations/sensitive.pb.validate.go | 34 - .../cncf/xds/go/udpa/annotations/status.pb.go | 258 - .../go/udpa/annotations/status.pb.validate.go | 103 - .../xds/go/udpa/annotations/versioning.pb.go | 183 - .../annotations/versioning.pb.validate.go | 103 - .../xds/go/udpa/type/v1/typed_struct.pb.go | 169 - .../udpa/type/v1/typed_struct.pb.validate.go | 111 - .../xds/go/xds/annotations/v3/migrate.pb.go | 417 - .../xds/annotations/v3/migrate.pb.validate.go | 243 - .../xds/go/xds/annotations/v3/security.pb.go | 202 - .../annotations/v3/security.pb.validate.go | 105 - .../xds/go/xds/annotations/v3/sensitive.pb.go | 98 - .../annotations/v3/sensitive.pb.validate.go | 34 - .../xds/go/xds/annotations/v3/status.pb.go | 500 - .../xds/annotations/v3/status.pb.validate.go | 310 - .../go/xds/annotations/v3/versioning.pb.go | 184 - .../annotations/v3/versioning.pb.validate.go | 103 - .../cncf/xds/go/xds/core/v3/authority.pb.go | 158 - .../go/xds/core/v3/authority.pb.validate.go | 105 - .../cncf/xds/go/xds/core/v3/cidr.pb.go | 177 - .../xds/go/xds/core/v3/cidr.pb.validate.go | 116 - .../xds/go/xds/core/v3/collection_entry.pb.go | 301 - .../core/v3/collection_entry.pb.validate.go | 222 - .../xds/go/xds/core/v3/context_params.pb.go | 165 - .../xds/core/v3/context_params.pb.validate.go | 101 - .../cncf/xds/go/xds/core/v3/extension.pb.go | 172 - .../go/xds/core/v3/extension.pb.validate.go | 119 - .../cncf/xds/go/xds/core/v3/resource.pb.go | 187 - .../go/xds/core/v3/resource.pb.validate.go | 120 - .../xds/go/xds/core/v3/resource_locator.pb.go | 409 - .../core/v3/resource_locator.pb.validate.go | 255 - .../xds/go/xds/core/v3/resource_name.pb.go | 195 - .../xds/core/v3/resource_name.pb.validate.go | 120 - .../xds/data/orca/v3/orca_load_report.pb.go | 236 - .../orca/v3/orca_load_report.pb.validate.go | 138 - .../cncf/xds/go/xds/type/matcher/v3/cel.pb.go | 167 - .../go/xds/type/matcher/v3/cel.pb.validate.go | 115 - .../xds/go/xds/type/matcher/v3/domain.pb.go | 247 - .../xds/type/matcher/v3/domain.pb.validate.go | 201 - .../go/xds/type/matcher/v3/http_inputs.pb.go | 148 - .../matcher/v3/http_inputs.pb.validate.go | 102 - .../cncf/xds/go/xds/type/matcher/v3/ip.pb.go | 261 - .../go/xds/type/matcher/v3/ip.pb.validate.go | 214 - .../xds/go/xds/type/matcher/v3/matcher.pb.go | 1060 - .../type/matcher/v3/matcher.pb.validate.go | 986 - .../xds/go/xds/type/matcher/v3/range.pb.go | 544 - .../xds/type/matcher/v3/range.pb.validate.go | 580 - .../xds/go/xds/type/matcher/v3/regex.pb.go | 246 - .../xds/type/matcher/v3/regex.pb.validate.go | 202 - .../xds/go/xds/type/matcher/v3/string.pb.go | 334 - .../xds/type/matcher/v3/string.pb.validate.go | 249 - .../cncf/xds/go/xds/type/v3/cel.pb.go | 298 - .../xds/go/xds/type/v3/cel.pb.validate.go | 225 - .../cncf/xds/go/xds/type/v3/range.pb.go | 303 - .../xds/go/xds/type/v3/range.pb.validate.go | 239 - .../xds/go/xds/type/v3/typed_struct.pb.go | 168 - .../xds/type/v3/typed_struct.pb.validate.go | 111 - .../github.com/cockroachdb/apd/v2/.travis.yml | 7 - .../github.com/cockroachdb/apd/v2/README.md | 25 - vendor/github.com/cockroachdb/apd/v2/const.go | 122 - .../github.com/cockroachdb/apd/v2/context.go | 1282 - vendor/github.com/cockroachdb/apd/v2/error.go | 188 - .../github.com/cockroachdb/apd/v2/format.go | 208 - vendor/github.com/cockroachdb/apd/v2/loop.go | 89 - vendor/github.com/cockroachdb/apd/v2/round.go | 192 - vendor/github.com/cockroachdb/apd/v2/table.go | 138 - .../cockroachdb/apd/{v2 => v3}/LICENSE | 0 .../github.com/cockroachdb/apd/v3/README.md | 28 + .../github.com/cockroachdb/apd/v3/bigint.go | 1035 + .../cockroachdb/apd/v3/bigint_go1.15.go | 26 + .../cockroachdb/apd/{v2 => v3}/condition.go | 6 +- vendor/github.com/cockroachdb/apd/v3/const.go | 125 + .../github.com/cockroachdb/apd/v3/context.go | 1297 + .../cockroachdb/apd/{v2 => v3}/decimal.go | 169 +- .../cockroachdb/apd/v3/decomposer.go | 99 + .../cockroachdb/apd/{v2 => v3}/doc.go | 0 vendor/github.com/cockroachdb/apd/v3/error.go | 243 + .../cockroachdb/apd/{v2 => v3}/form_string.go | 0 .../github.com/cockroachdb/apd/v3/format.go | 219 + vendor/github.com/cockroachdb/apd/v3/loop.go | 88 + vendor/github.com/cockroachdb/apd/v3/round.go | 205 + vendor/github.com/cockroachdb/apd/v3/table.go | 137 + .../github.com/coreos/go-oidc/v3/oidc/jose.go | 1 + .../github.com/coreos/go-oidc/v3/oidc/jwks.go | 4 +- .../github.com/coreos/go-oidc/v3/oidc/oidc.go | 133 +- .../coreos/go-oidc/v3/oidc/verify.go | 46 +- vendor/github.com/coreos/go-semver/NOTICE | 5 - .../coreos/go-semver/semver/semver.go | 296 - .../coreos/go-semver/semver/sort.go | 38 - .../github.com/coreos/go-systemd/v22/LICENSE | 191 - .../github.com/coreos/go-systemd/v22/NOTICE | 5 - .../coreos/go-systemd/v22/journal/journal.go | 46 - .../go-systemd/v22/journal/journal_unix.go | 267 - .../go-systemd/v22/journal/journal_windows.go | 43 - .../cpuguy83/go-md2man/v2/LICENSE.md | 21 - .../cpuguy83/go-md2man/v2/md2man/md2man.go | 14 - .../cpuguy83/go-md2man/v2/md2man/roff.go | 336 - .../decred/dcrd/dcrec/secp256k1/v4/LICENSE | 17 + .../decred/dcrd/dcrec/secp256k1/v4/README.md | 72 + .../secp256k1/v4/compressedbytepoints.go | 18 + .../decred/dcrd/dcrec/secp256k1/v4/curve.go | 1272 + .../decred/dcrd/dcrec/secp256k1/v4/doc.go | 59 + .../decred/dcrd/dcrec/secp256k1/v4/ecdh.go | 21 + .../dcrec/secp256k1/v4/ellipticadaptor.go | 255 + .../decred/dcrd/dcrec/secp256k1/v4/error.go | 67 + .../decred/dcrd/dcrec/secp256k1/v4/field.go | 1681 + .../dcrec/secp256k1/v4/loadprecomputed.go | 91 + .../dcrd/dcrec/secp256k1/v4/modnscalar.go | 1101 + .../decred/dcrd/dcrec/secp256k1/v4/nonce.go | 263 + .../decred/dcrd/dcrec/secp256k1/v4/privkey.go | 111 + .../decred/dcrd/dcrec/secp256k1/v4/pubkey.go | 237 + .../cmux => digitorus/pkcs7}/.gitignore | 0 vendor/github.com/digitorus/pkcs7/LICENSE | 22 + vendor/github.com/digitorus/pkcs7/Makefile | 20 + vendor/github.com/digitorus/pkcs7/README.md | 69 + vendor/github.com/digitorus/pkcs7/ber.go | 269 + vendor/github.com/digitorus/pkcs7/decrypt.go | 177 + vendor/github.com/digitorus/pkcs7/encrypt.go | 399 + vendor/github.com/digitorus/pkcs7/pkcs7.go | 302 + vendor/github.com/digitorus/pkcs7/sign.go | 456 + vendor/github.com/digitorus/pkcs7/verify.go | 370 + .../digitorus/pkcs7/verify_test_dsa.go | 182 + vendor/github.com/digitorus/timestamp/LICENSE | 25 + .../github.com/digitorus/timestamp/README.md | 13 + .../digitorus/timestamp/borrowed.go | 56 + .../digitorus/timestamp/rfc3161_struct.go | 75 + .../timestamp/signing_cert_v2_struct.go | 26 + .../digitorus/timestamp/timestamp.go | 651 + .../docker/cli/cli/config/configfile/file.go | 1 - vendor/github.com/docker/docker/AUTHORS | 18 + .../docker/pkg/homedir/homedir_linux.go | 9 +- .../github.com/ebitengine/purego/.gitignore | 1 + .../purego}/LICENSE | 0 vendor/github.com/ebitengine/purego/README.md | 70 + vendor/github.com/ebitengine/purego/cgo.go | 15 + .../github.com/ebitengine/purego/dlerror.go | 15 + vendor/github.com/ebitengine/purego/dlfcn.go | 94 + .../ebitengine/purego/dlfcn_darwin.go | 19 + .../ebitengine/purego/dlfcn_linux.go | 14 + .../ebitengine/purego/dlfcn_nocgo_linux.go | 19 + .../ebitengine/purego/dlfcn_stubs.s | 26 + vendor/github.com/ebitengine/purego/dummy.go | 14 + vendor/github.com/ebitengine/purego/func.go | 268 + .../ebitengine/purego/go_runtime.go | 17 + .../purego/internal/abi/abi_amd64.h | 99 + .../purego/internal/abi/abi_arm64.h | 39 + .../ebitengine/purego/internal/abi/dummy.go | 7 + .../purego/internal/cgo/syscall_cgo_linux.go | 56 + .../purego/internal/fakecgo/asm_amd64.s | 76 + .../purego/internal/fakecgo/asm_arm64.s | 36 + .../purego/internal/fakecgo/callbacks.go | 64 + .../ebitengine/purego/internal/fakecgo/doc.go | 33 + .../internal/fakecgo/go_darwin_amd64.go | 71 + .../internal/fakecgo/go_darwin_arm64.go | 86 + .../purego/internal/fakecgo/go_libinit.go | 45 + .../purego/internal/fakecgo/go_linux_amd64.go | 93 + .../purego/internal/fakecgo/go_linux_arm64.go | 96 + .../purego/internal/fakecgo/go_setenv.go | 18 + .../purego/internal/fakecgo/go_util.go | 33 + .../purego/internal/fakecgo/iscgo.go | 19 + .../purego/internal/fakecgo/libcgo.go | 32 + .../purego/internal/fakecgo/setenv.go | 19 + .../purego/internal/fakecgo/symbols.go | 152 + .../purego/internal/fakecgo/symbols_darwin.go | 21 + .../purego/internal/fakecgo/symbols_linux.go | 27 + .../internal/fakecgo/trampolines_amd64.s | 100 + .../internal/fakecgo/trampolines_arm64.s | 68 + .../internal/fakecgo/trampolines_stubs.s | 74 + .../purego/internal/strings/strings.go | 40 + vendor/github.com/ebitengine/purego/is_ios.go | 13 + vendor/github.com/ebitengine/purego/nocgo.go | 25 + .../github.com/ebitengine/purego/sys_amd64.s | 143 + .../github.com/ebitengine/purego/sys_arm64.s | 64 + .../ebitengine/purego/sys_unix_arm64.s | 64 + .../github.com/ebitengine/purego/syscall.go | 40 + .../ebitengine/purego/syscall_cgo_linux.go | 30 + .../ebitengine/purego/syscall_sysv.go | 211 + .../ebitengine/purego/syscall_windows.go | 45 + .../ebitengine/purego/zcallback_amd64.s | 2016 ++ .../ebitengine/purego/zcallback_arm64.s | 4016 +++ .../emicklei/go-restful/v3/CHANGES.md | 20 +- .../emicklei/go-restful/v3/README.md | 4 + .../emicklei/go-restful/v3/constants.go | 2 + .../emicklei/go-restful/v3/request.go | 5 +- .../emicklei/go-restful/v3/response.go | 3 + .../emicklei/go-restful/v3/route.go | 4 +- .../emicklei/go-restful/v3/route_builder.go | 34 +- vendor/github.com/emicklei/proto/.gitignore | 1 + vendor/github.com/emicklei/proto/.travis.yml | 2 + vendor/github.com/emicklei/proto/CHANGES.md | 36 + vendor/github.com/emicklei/proto/Makefile | 5 +- vendor/github.com/emicklei/proto/README.md | 21 +- vendor/github.com/emicklei/proto/comment.go | 13 + vendor/github.com/emicklei/proto/enum.go | 1 + vendor/github.com/emicklei/proto/field.go | 7 +- vendor/github.com/emicklei/proto/group.go | 1 + vendor/github.com/emicklei/proto/message.go | 1 + .../github.com/emicklei/proto/noop_visitor.go | 48 + vendor/github.com/emicklei/proto/oneof.go | 8 +- vendor/github.com/emicklei/proto/parser.go | 39 +- vendor/github.com/emicklei/proto/service.go | 1 + vendor/github.com/emicklei/proto/walk.go | 18 + .../envoy/admin/v3/certs.pb.go | 606 - .../envoy/admin/v3/certs.pb.validate.go | 841 - .../envoy/admin/v3/clusters.pb.go | 732 - .../envoy/admin/v3/clusters.pb.validate.go | 800 - .../envoy/admin/v3/config_dump.pb.go | 2563 -- .../envoy/admin/v3/config_dump.pb.validate.go | 3962 --- .../envoy/admin/v3/init_dump.pb.go | 241 - .../envoy/admin/v3/init_dump.pb.validate.go | 280 - .../envoy/admin/v3/listeners.pb.go | 269 - .../envoy/admin/v3/listeners.pb.validate.go | 334 - .../envoy/admin/v3/memory.pb.go | 228 - .../envoy/admin/v3/memory.pb.validate.go | 146 - .../envoy/admin/v3/metrics.pb.go | 234 - .../envoy/admin/v3/metrics.pb.validate.go | 141 - .../envoy/admin/v3/mutex_stats.pb.go | 191 - .../envoy/admin/v3/mutex_stats.pb.validate.go | 141 - .../envoy/admin/v3/server_info.pb.go | 948 - .../envoy/admin/v3/server_info.pb.validate.go | 504 - .../go-control-plane/envoy/admin/v3/tap.pb.go | 182 - .../envoy/admin/v3/tap.pb.validate.go | 186 - .../envoy/annotations/deprecation.pb.go | 159 - .../annotations/deprecation.pb.validate.go | 36 - .../envoy/annotations/resource.pb.go | 179 - .../envoy/annotations/resource.pb.validate.go | 140 - .../envoy/config/accesslog/v3/accesslog.pb.go | 1810 -- .../accesslog/v3/accesslog.pb.validate.go | 2449 -- .../envoy/config/bootstrap/v3/bootstrap.pb.go | 2739 -- .../bootstrap/v3/bootstrap.pb.validate.go | 3555 --- .../config/cluster/v3/circuit_breaker.pb.go | 506 - .../cluster/v3/circuit_breaker.pb.validate.go | 661 - .../envoy/config/cluster/v3/cluster.pb.go | 4329 --- .../config/cluster/v3/cluster.pb.validate.go | 4768 --- .../envoy/config/cluster/v3/filter.pb.go | 183 - .../config/cluster/v3/filter.pb.validate.go | 174 - .../config/cluster/v3/outlier_detection.pb.go | 584 - .../v3/outlier_detection.pb.validate.go | 624 - .../config/common/matcher/v3/matcher.pb.go | 1771 -- .../common/matcher/v3/matcher.pb.validate.go | 2754 -- .../envoy/config/core/v3/address.pb.go | 935 - .../config/core/v3/address.pb.validate.go | 1149 - .../envoy/config/core/v3/backoff.pb.go | 193 - .../config/core/v3/backoff.pb.validate.go | 207 - .../envoy/config/core/v3/base.pb.go | 2589 -- .../envoy/config/core/v3/base.pb.validate.go | 3206 -- .../envoy/config/core/v3/config_source.pb.go | 1197 - .../core/v3/config_source.pb.validate.go | 1288 - .../config/core/v3/event_service_config.pb.go | 199 - .../v3/event_service_config.pb.validate.go | 183 - .../envoy/config/core/v3/extension.pb.go | 185 - .../config/core/v3/extension.pb.validate.go | 164 - .../config/core/v3/grpc_method_list.pb.go | 246 - .../core/v3/grpc_method_list.pb.validate.go | 294 - .../envoy/config/core/v3/grpc_service.pb.go | 1740 -- .../core/v3/grpc_service.pb.validate.go | 2320 -- .../envoy/config/core/v3/health_check.pb.go | 1586 - .../core/v3/health_check.pb.validate.go | 2099 -- .../envoy/config/core/v3/http_uri.pb.go | 236 - .../config/core/v3/http_uri.pb.validate.go | 213 - .../envoy/config/core/v3/protocol.pb.go | 2289 -- .../config/core/v3/protocol.pb.validate.go | 2880 -- .../envoy/config/core/v3/proxy_protocol.pb.go | 213 - .../core/v3/proxy_protocol.pb.validate.go | 140 - .../envoy/config/core/v3/resolver.pb.go | 265 - .../config/core/v3/resolver.pb.validate.go | 318 - .../envoy/config/core/v3/socket_option.pb.go | 336 - .../core/v3/socket_option.pb.validate.go | 172 - .../core/v3/substitution_format_string.pb.go | 356 - .../substitution_format_string.pb.validate.go | 277 - .../config/core/v3/udp_socket_config.pb.go | 190 - .../core/v3/udp_socket_config.pb.validate.go | 180 - .../envoy/config/endpoint/v3/endpoint.pb.go | 480 - .../endpoint/v3/endpoint.pb.validate.go | 586 - .../endpoint/v3/endpoint_components.pb.go | 870 - .../v3/endpoint_components.pb.validate.go | 1055 - .../config/endpoint/v3/load_report.pb.go | 784 - .../endpoint/v3/load_report.pb.validate.go | 893 - .../config/listener/v3/api_listener.pb.go | 179 - .../listener/v3/api_listener.pb.validate.go | 164 - .../envoy/config/listener/v3/listener.pb.go | 1360 - .../listener/v3/listener.pb.validate.go | 1644 - .../listener/v3/listener_components.pb.go | 1344 - .../v3/listener_components.pb.validate.go | 1544 - .../config/listener/v3/quic_config.pb.go | 299 - .../listener/v3/quic_config.pb.validate.go | 327 - .../listener/v3/udp_listener_config.pb.go | 283 - .../v3/udp_listener_config.pb.validate.go | 327 - .../config/metrics/v3/metrics_service.pb.go | 247 - .../metrics/v3/metrics_service.pb.validate.go | 224 - .../envoy/config/metrics/v3/stats.pb.go | 1174 - .../config/metrics/v3/stats.pb.validate.go | 1292 - .../envoy/config/overload/v3/overload.pb.go | 1074 - .../overload/v3/overload.pb.validate.go | 1491 - .../envoy/config/rbac/v3/rbac.pb.go | 1469 - .../envoy/config/rbac/v3/rbac.pb.validate.go | 1854 -- .../envoy/config/route/v3/route.pb.go | 523 - .../config/route/v3/route.pb.validate.go | 617 - .../config/route/v3/route_components.pb.go | 8566 ----- .../route/v3/route_components.pb.validate.go | 10892 ------- .../envoy/config/route/v3/scoped_route.pb.go | 463 - .../route/v3/scoped_route.pb.validate.go | 492 - .../envoy/config/tap/v3/common.pb.go | 1614 - .../envoy/config/tap/v3/common.pb.validate.go | 2194 -- .../envoy/config/trace/v3/datadog.pb.go | 184 - .../config/trace/v3/datadog.pb.validate.go | 158 - .../envoy/config/trace/v3/dynamic_ot.pb.go | 193 - .../config/trace/v3/dynamic_ot.pb.validate.go | 176 - .../envoy/config/trace/v3/http_tracer.pb.go | 292 - .../trace/v3/http_tracer.pb.validate.go | 308 - .../envoy/config/trace/v3/lightstep.pb.go | 293 - .../config/trace/v3/lightstep.pb.validate.go | 194 - .../envoy/config/trace/v3/opencensus.pb.go | 442 - .../config/trace/v3/opencensus.pb.validate.go | 239 - .../envoy/config/trace/v3/opentelemetry.pb.go | 171 - .../trace/v3/opentelemetry.pb.validate.go | 178 - .../envoy/config/trace/v3/service.pb.go | 174 - .../config/trace/v3/service.pb.validate.go | 178 - .../envoy/config/trace/v3/skywalking.pb.go | 340 - .../config/trace/v3/skywalking.pb.validate.go | 344 - .../envoy/config/trace/v3/trace.pb.go | 99 - .../config/trace/v3/trace.pb.validate.go | 36 - .../envoy/config/trace/v3/xray.pb.go | 310 - .../envoy/config/trace/v3/xray.pb.validate.go | 366 - .../envoy/config/trace/v3/zipkin.pb.go | 328 - .../config/trace/v3/zipkin.pb.validate.go | 192 - .../clusters/aggregate/v3/cluster.pb.go | 174 - .../aggregate/v3/cluster.pb.validate.go | 147 - .../filters/common/fault/v3/fault.pb.go | 620 - .../common/fault/v3/fault.pb.validate.go | 763 - .../filters/http/fault/v3/fault.pb.go | 630 - .../http/fault/v3/fault.pb.validate.go | 594 - .../filters/http/rbac/v3/rbac.pb.go | 329 - .../filters/http/rbac/v3/rbac.pb.validate.go | 380 - .../filters/http/router/v3/router.pb.go | 302 - .../http/router/v3/router.pb.validate.go | 229 - .../v3/http_connection_manager.pb.go | 3957 --- .../v3/http_connection_manager.pb.validate.go | 4356 --- .../transport_sockets/tls/v3/cert.pb.go | 89 - .../tls/v3/cert.pb.validate.go | 36 - .../transport_sockets/tls/v3/common.pb.go | 1515 - .../tls/v3/common.pb.validate.go | 1496 - .../transport_sockets/tls/v3/secret.pb.go | 443 - .../tls/v3/secret.pb.validate.go | 533 - .../transport_sockets/tls/v3/tls.pb.go | 1464 - .../tls/v3/tls.pb.validate.go | 1727 - .../tls/v3/tls_spiffe_validator_config.pb.go | 286 - ...tls_spiffe_validator_config.pb.validate.go | 328 - .../envoy/service/discovery/v3/ads.pb.go | 368 - .../service/discovery/v3/ads.pb.validate.go | 135 - .../service/discovery/v3/discovery.pb.go | 1675 - .../discovery/v3/discovery.pb.validate.go | 2045 -- .../envoy/service/load_stats/v3/lrs.pb.go | 497 - .../service/load_stats/v3/lrs.pb.validate.go | 334 - .../envoy/service/status/v3/csds.pb.go | 1108 - .../service/status/v3/csds.pb.validate.go | 1001 - .../envoy/type/http/v3/cookie.pb.go | 189 - .../envoy/type/http/v3/cookie.pb.validate.go | 177 - .../type/http/v3/path_transformation.pb.go | 402 - .../v3/path_transformation.pb.validate.go | 570 - .../envoy/type/matcher/v3/http_inputs.pb.go | 383 - .../matcher/v3/http_inputs.pb.validate.go | 500 - .../envoy/type/matcher/v3/metadata.pb.go | 302 - .../type/matcher/v3/metadata.pb.validate.go | 364 - .../envoy/type/matcher/v3/node.pb.go | 189 - .../envoy/type/matcher/v3/node.pb.validate.go | 198 - .../envoy/type/matcher/v3/number.pb.go | 212 - .../type/matcher/v3/number.pb.validate.go | 184 - .../envoy/type/matcher/v3/path.pb.go | 196 - .../envoy/type/matcher/v3/path.pb.validate.go | 191 - .../envoy/type/matcher/v3/regex.pb.go | 415 - .../type/matcher/v3/regex.pb.validate.go | 467 - .../envoy/type/matcher/v3/string.pb.go | 373 - .../type/matcher/v3/string.pb.validate.go | 383 - .../envoy/type/matcher/v3/struct.pb.go | 328 - .../type/matcher/v3/struct.pb.validate.go | 350 - .../envoy/type/matcher/v3/value.pb.go | 461 - .../type/matcher/v3/value.pb.validate.go | 525 - .../envoy/type/metadata/v3/metadata.pb.go | 682 - .../type/metadata/v3/metadata.pb.validate.go | 965 - .../envoy/type/tracing/v3/custom_tag.pb.go | 608 - .../type/tracing/v3/custom_tag.pb.validate.go | 800 - .../envoy/type/v3/hash_policy.pb.go | 332 - .../envoy/type/v3/hash_policy.pb.validate.go | 426 - .../go-control-plane/envoy/type/v3/http.pb.go | 144 - .../envoy/type/v3/http.pb.validate.go | 36 - .../envoy/type/v3/http_status.pb.go | 458 - .../envoy/type/v3/http_status.pb.validate.go | 161 - .../envoy/type/v3/percent.pb.go | 316 - .../envoy/type/v3/percent.pb.validate.go | 260 - .../envoy/type/v3/range.pb.go | 324 - .../envoy/type/v3/range.pb.validate.go | 345 - .../envoy/type/v3/ratelimit_unit.pb.go | 155 - .../type/v3/ratelimit_unit.pb.validate.go | 36 - .../envoy/type/v3/semantic_version.pb.go | 181 - .../type/v3/semantic_version.pb.validate.go | 142 - .../envoy/type/v3/token_bucket.pb.go | 204 - .../envoy/type/v3/token_bucket.pb.validate.go | 202 - .../envoyproxy/protoc-gen-validate/NOTICE | 4 - .../protoc-gen-validate/validate/BUILD | 74 - .../protoc-gen-validate/validate/validate.h | 170 - .../validate/validate.pb.go | 4106 --- .../validate/validate.proto | 862 - .../fullstorydev/grpcurl/.gitignore | 3 - .../fullstorydev/grpcurl/.goreleaser.yml | 40 - .../fullstorydev/grpcurl/Dockerfile | 36 - .../github.com/fullstorydev/grpcurl/LICENSE | 21 - .../github.com/fullstorydev/grpcurl/Makefile | 78 - .../github.com/fullstorydev/grpcurl/README.md | 242 - .../grpcurl/cmd/grpcurl/go1_10.go | 9 - .../fullstorydev/grpcurl/cmd/grpcurl/go1_9.go | 9 - .../grpcurl/cmd/grpcurl/grpcurl.go | 844 - .../fullstorydev/grpcurl/cmd/grpcurl/unix.go | 14 - .../fullstorydev/grpcurl/desc_source.go | 304 - .../github.com/fullstorydev/grpcurl/format.go | 529 - .../fullstorydev/grpcurl/grpcurl.go | 699 - .../github.com/fullstorydev/grpcurl/invoke.go | 405 - .../fullstorydev/grpcurl/mk-test-files.sh | 57 - .../gabriel-vasile/mimetype/.gitattributes | 1 + .../mimetype/CODE_OF_CONDUCT.md | 76 + .../gabriel-vasile/mimetype/CONTRIBUTING.md | 12 + .../gabriel-vasile/mimetype/LICENSE | 21 + .../gabriel-vasile/mimetype/README.md | 108 + .../mimetype/internal/charset/charset.go | 309 + .../mimetype/internal/json/json.go | 544 + .../mimetype/internal/magic/archive.go | 124 + .../mimetype/internal/magic/audio.go | 76 + .../mimetype/internal/magic/binary.go | 196 + .../mimetype/internal/magic/database.go | 13 + .../mimetype/internal/magic/document.go | 62 + .../mimetype/internal/magic/font.go | 39 + .../mimetype/internal/magic/ftyp.go | 88 + .../mimetype/internal/magic/geo.go | 55 + .../mimetype/internal/magic/image.go | 110 + .../mimetype/internal/magic/magic.go | 239 + .../mimetype/internal/magic/ms_office.go | 225 + .../mimetype/internal/magic/ogg.go | 42 + .../mimetype/internal/magic/text.go | 375 + .../mimetype/internal/magic/text_csv.go | 51 + .../mimetype/internal/magic/video.go | 85 + .../mimetype/internal/magic/zip.go | 92 + .../gabriel-vasile/mimetype/mime.go | 186 + .../gabriel-vasile/mimetype/mimetype.gif | Bin 0 -> 1343793 bytes .../gabriel-vasile/mimetype/mimetype.go | 123 + .../mimetype/supported_mimes.md | 178 + .../gabriel-vasile/mimetype/tree.go | 260 + vendor/github.com/go-ini/ini/.editorconfig | 12 + vendor/github.com/go-ini/ini/.gitignore | 7 + vendor/github.com/go-ini/ini/.golangci.yml | 27 + vendor/github.com/go-ini/ini/LICENSE | 191 + vendor/github.com/go-ini/ini/Makefile | 15 + vendor/github.com/go-ini/ini/README.md | 43 + vendor/github.com/go-ini/ini/codecov.yml | 16 + vendor/github.com/go-ini/ini/data_source.go | 76 + vendor/github.com/go-ini/ini/deprecated.go | 22 + vendor/github.com/go-ini/ini/error.go | 49 + vendor/github.com/go-ini/ini/file.go | 541 + vendor/github.com/go-ini/ini/helper.go | 24 + vendor/github.com/go-ini/ini/ini.go | 176 + vendor/github.com/go-ini/ini/key.go | 837 + vendor/github.com/go-ini/ini/parser.go | 520 + vendor/github.com/go-ini/ini/section.go | 256 + vendor/github.com/go-ini/ini/struct.go | 747 + .../go-jose/go-jose/v3/jwt/builder.go | 334 + .../go-jose/go-jose/v3/jwt/claims.go | 130 + .../github.com/go-jose/go-jose/v3/jwt/doc.go | 22 + .../go-jose/go-jose/v3/jwt/errors.go | 53 + .../github.com/go-jose/go-jose/v3/jwt/jwt.go | 133 + .../go-jose/go-jose/v3/jwt/validation.go | 120 + vendor/github.com/go-logr/logr/.golangci.yaml | 3 - vendor/github.com/go-logr/logr/discard.go | 32 +- vendor/github.com/go-logr/logr/funcr/funcr.go | 27 +- vendor/github.com/go-logr/logr/logr.go | 166 +- vendor/github.com/go-openapi/errors/api.go | 2 +- .../go-openapi/jsonpointer/.travis.yml | 15 - .../go-openapi/jsonreference/.golangci.yml | 13 +- .../go-openapi/jsonreference/.travis.yml | 24 - .../jsonreference/internal/normalize_url.go | 22 +- .../go-openapi/runtime/client/keepalive.go | 3 +- .../runtime/client/opentelemetry.go | 207 + .../go-openapi/runtime/client/request.go | 25 +- .../go-openapi/runtime/client/runtime.go | 16 +- .../go-openapi/runtime/client_request.go | 3 +- .../go-openapi/runtime/middleware/context.go | 11 + .../runtime/middleware/swaggerui.go | 8 +- .../runtime/middleware/swaggerui_oauth2.go | 122 + vendor/github.com/go-openapi/spec/info.go | 19 + .../github.com/go-openapi/spec/properties.go | 6 +- .../github.com/go-openapi/spec/responses.go | 27 +- .../go-openapi/strfmt/.golangci.yml | 59 +- vendor/github.com/go-openapi/strfmt/bson.go | 2 +- vendor/github.com/go-openapi/strfmt/date.go | 6 +- vendor/github.com/go-openapi/strfmt/format.go | 2 +- vendor/github.com/go-openapi/strfmt/time.go | 27 +- vendor/github.com/go-openapi/strfmt/ulid.go | 11 +- vendor/github.com/go-openapi/swag/util.go | 16 +- .../github.com/go-openapi/validate/values.go | 8 +- vendor/github.com/go-piv/piv-go/piv/key.go | 69 +- .../go-piv/piv-go/piv/pcsc_freebsd.go | 2 +- vendor/github.com/go-piv/piv-go/piv/piv.go | 8 +- .../go-piv/piv-go/third_party/rsa/LICENSE | 27 + .../go-piv/piv-go/third_party/rsa/README | 2 + .../go-piv/piv-go/third_party/rsa/pss.go | 168 + .../go-playground/locales/README.md | 4 +- .../universal-translator/README.md | 4 +- .../universal-translator/import_export.go | 6 +- .../go-playground/validator/v10/.gitignore | 2 + .../go-playground/validator/v10/README.md | 26 +- .../go-playground/validator/v10/baked_in.go | 529 +- .../go-playground/validator/v10/cache.go | 23 +- .../validator/v10/country_codes.go | 1958 +- .../go-playground/validator/v10/doc.go | 402 +- .../go-playground/validator/v10/errors.go | 5 +- .../go-playground/validator/v10/regexes.go | 16 +- .../validator/v10/struct_level.go | 6 +- .../go-playground/validator/v10/util.go | 22 +- .../go-playground/validator/v10/validator.go | 3 +- .../validator/v10/validator_instance.go | 33 +- vendor/github.com/goccy/go-json/.codecov.yml | 32 + vendor/github.com/goccy/go-json/.gitignore | 2 + vendor/github.com/goccy/go-json/.golangci.yml | 83 + vendor/github.com/goccy/go-json/CHANGELOG.md | 425 + vendor/github.com/goccy/go-json/LICENSE | 21 + vendor/github.com/goccy/go-json/Makefile | 39 + vendor/github.com/goccy/go-json/README.md | 529 + vendor/github.com/goccy/go-json/color.go | 68 + vendor/github.com/goccy/go-json/decode.go | 263 + .../goccy/go-json/docker-compose.yml | 13 + vendor/github.com/goccy/go-json/encode.go | 326 + vendor/github.com/goccy/go-json/error.go | 41 + .../internal/decoder/anonymous_field.go | 41 + .../goccy/go-json/internal/decoder/array.go | 176 + .../goccy/go-json/internal/decoder/assign.go | 438 + .../goccy/go-json/internal/decoder/bool.go | 83 + .../goccy/go-json/internal/decoder/bytes.go | 118 + .../goccy/go-json/internal/decoder/compile.go | 487 + .../internal/decoder/compile_norace.go | 29 + .../go-json/internal/decoder/compile_race.go | 37 + .../goccy/go-json/internal/decoder/context.go | 254 + .../goccy/go-json/internal/decoder/float.go | 170 + .../goccy/go-json/internal/decoder/func.go | 146 + .../goccy/go-json/internal/decoder/int.go | 246 + .../go-json/internal/decoder/interface.go | 528 + .../goccy/go-json/internal/decoder/invalid.go | 55 + .../goccy/go-json/internal/decoder/map.go | 280 + .../goccy/go-json/internal/decoder/number.go | 123 + .../goccy/go-json/internal/decoder/option.go | 17 + .../goccy/go-json/internal/decoder/path.go | 670 + .../goccy/go-json/internal/decoder/ptr.go | 96 + .../goccy/go-json/internal/decoder/slice.go | 380 + .../goccy/go-json/internal/decoder/stream.go | 556 + .../goccy/go-json/internal/decoder/string.go | 452 + .../goccy/go-json/internal/decoder/struct.go | 845 + .../goccy/go-json/internal/decoder/type.go | 30 + .../goccy/go-json/internal/decoder/uint.go | 194 + .../internal/decoder/unmarshal_json.go | 104 + .../internal/decoder/unmarshal_text.go | 285 + .../internal/decoder/wrapped_string.go | 73 + .../goccy/go-json/internal/encoder/code.go | 1023 + .../goccy/go-json/internal/encoder/compact.go | 286 + .../go-json/internal/encoder/compiler.go | 935 + .../internal/encoder/compiler_norace.go | 32 + .../go-json/internal/encoder/compiler_race.go | 45 + .../goccy/go-json/internal/encoder/context.go | 105 + .../go-json/internal/encoder/decode_rune.go | 126 + .../goccy/go-json/internal/encoder/encoder.go | 596 + .../goccy/go-json/internal/encoder/indent.go | 211 + .../goccy/go-json/internal/encoder/int.go | 152 + .../goccy/go-json/internal/encoder/map112.go | 9 + .../goccy/go-json/internal/encoder/map113.go | 9 + .../goccy/go-json/internal/encoder/opcode.go | 752 + .../goccy/go-json/internal/encoder/option.go | 48 + .../goccy/go-json/internal/encoder/optype.go | 932 + .../goccy/go-json/internal/encoder/query.go | 135 + .../goccy/go-json/internal/encoder/string.go | 459 + .../go-json/internal/encoder/string_table.go | 415 + .../go-json/internal/encoder/vm/debug_vm.go | 41 + .../goccy/go-json/internal/encoder/vm/hack.go | 9 + .../goccy/go-json/internal/encoder/vm/util.go | 207 + .../goccy/go-json/internal/encoder/vm/vm.go | 4859 +++ .../internal/encoder/vm_color/debug_vm.go | 35 + .../go-json/internal/encoder/vm_color/hack.go | 9 + .../go-json/internal/encoder/vm_color/util.go | 274 + .../go-json/internal/encoder/vm_color/vm.go | 4859 +++ .../encoder/vm_color_indent/debug_vm.go | 35 + .../internal/encoder/vm_color_indent/util.go | 297 + .../internal/encoder/vm_color_indent/vm.go | 4859 +++ .../internal/encoder/vm_indent/debug_vm.go | 35 + .../internal/encoder/vm_indent/hack.go | 9 + .../internal/encoder/vm_indent/util.go | 230 + .../go-json/internal/encoder/vm_indent/vm.go | 4859 +++ .../goccy/go-json/internal/errors/error.go | 183 + .../goccy/go-json/internal/runtime/rtype.go | 263 + .../go-json/internal/runtime/struct_field.go | 91 + .../goccy/go-json/internal/runtime/type.go | 100 + vendor/github.com/goccy/go-json/json.go | 371 + vendor/github.com/goccy/go-json/option.go | 79 + vendor/github.com/goccy/go-json/path.go | 84 + vendor/github.com/goccy/go-json/query.go | 47 + .../gogo/protobuf/gogoproto/Makefile | 37 - .../github.com/gogo/protobuf/gogoproto/doc.go | 169 - .../gogo/protobuf/gogoproto/gogo.pb.go | 874 - .../gogo/protobuf/gogoproto/gogo.pb.golden | 45 - .../gogo/protobuf/gogoproto/gogo.proto | 144 - .../gogo/protobuf/gogoproto/helper.go | 415 - .../protoc-gen-gogo/descriptor/Makefile | 36 - .../protoc-gen-gogo/descriptor/descriptor.go | 118 - .../descriptor/descriptor.pb.go | 2865 -- .../descriptor/descriptor_gostring.gen.go | 752 - .../protoc-gen-gogo/descriptor/helper.go | 390 - vendor/github.com/golang-jwt/jwt/.gitignore | 4 - vendor/github.com/golang-jwt/jwt/LICENSE | 9 - .../golang-jwt/jwt/MIGRATION_GUIDE.md | 22 - vendor/github.com/golang-jwt/jwt/README.md | 113 - .../golang-jwt/jwt/VERSION_HISTORY.md | 131 - vendor/github.com/golang-jwt/jwt/claims.go | 146 - vendor/github.com/golang-jwt/jwt/doc.go | 4 - vendor/github.com/golang-jwt/jwt/ecdsa.go | 142 - .../github.com/golang-jwt/jwt/ecdsa_utils.go | 69 - vendor/github.com/golang-jwt/jwt/ed25519.go | 81 - .../golang-jwt/jwt/ed25519_utils.go | 64 - vendor/github.com/golang-jwt/jwt/errors.go | 59 - vendor/github.com/golang-jwt/jwt/hmac.go | 95 - .../github.com/golang-jwt/jwt/map_claims.go | 120 - vendor/github.com/golang-jwt/jwt/none.go | 52 - vendor/github.com/golang-jwt/jwt/parser.go | 148 - vendor/github.com/golang-jwt/jwt/rsa.go | 101 - vendor/github.com/golang-jwt/jwt/rsa_pss.go | 142 - vendor/github.com/golang-jwt/jwt/rsa_utils.go | 101 - .../golang-jwt/jwt/signing_method.go | 35 - vendor/github.com/golang-jwt/jwt/token.go | 104 - vendor/github.com/golang-jwt/jwt/v4/token.go | 15 +- vendor/github.com/golang/glog/LICENSE | 191 - vendor/github.com/golang/glog/README.md | 36 - vendor/github.com/golang/glog/glog.go | 1180 - vendor/github.com/golang/glog/glog_file.go | 124 - vendor/github.com/golang/mock/AUTHORS | 12 - vendor/github.com/golang/mock/CONTRIBUTORS | 37 - .../github.com/golang/mock/mockgen/mockgen.go | 701 - .../golang/mock/mockgen/model/model.go | 495 - .../github.com/golang/mock/mockgen/parse.go | 644 - .../github.com/golang/mock/mockgen/reflect.go | 256 - .../golang/mock/mockgen/version.1.11.go | 26 - .../golang/mock/mockgen/version.1.12.go | 35 - .../golang/protobuf/descriptor/descriptor.go | 180 - .../protoc-gen-go/descriptor/descriptor.pb.go | 200 - .../protoc-gen-go/plugin/plugin.pb.go | 75 - .../golang/protobuf/ptypes/empty/empty.pb.go | 62 - .../protobuf/ptypes/struct/struct.pb.go | 78 - .../protobuf/ptypes/wrappers/wrappers.pb.go | 71 - .../certificate-transparency-go/.gitignore | 1 - .../.golangci.yaml | 25 +- .../certificate-transparency-go/.travis.yml | 114 - .../certificate-transparency-go/AUTHORS | 1 + .../certificate-transparency-go/CHANGELOG.md | 54 +- .../certificate-transparency-go/CODEOWNERS | 1 + .../certificate-transparency-go/CONTRIBUTORS | 2 + .../certificate-transparency-go/README.md | 38 +- .../certificate-transparency-go/asn1/asn1.go | 20 +- .../cloudbuild.yaml | 20 +- .../cloudbuild_master.yaml | 20 +- .../cloudbuild_tag.yaml | 12 +- .../tls/signature.go | 6 +- .../certificate-transparency-go/tls/tls.go | 46 +- .../certificate-transparency-go/tls/types.go | 2 +- .../certificate-transparency-go/tools.go | 27 - .../certificate-transparency-go/types.go | 14 +- .../certificate-transparency-go/x509/names.go | 7 +- .../x509/ptr_sysptr_windows.go | 1 + .../x509/ptr_uint_windows.go | 1 + .../x509/root_bsd.go | 1 + .../x509/root_cgo_darwin.go | 1 + .../x509/root_darwin.go | 31 +- .../x509/root_darwin_armx.go | 1 + .../x509/root_js.go | 1 + .../x509/root_nocgo_darwin.go | 1 + .../x509/root_plan9.go | 4 +- .../x509/root_unix.go | 8 +- .../certificate-transparency-go/x509/sec1.go | 6 +- .../certificate-transparency-go/x509/x509.go | 164 +- .../x509util/files.go | 15 +- .../x509util/pem_cert_pool.go | 8 +- .../x509util/revoked.go | 22 +- .../x509util/x509util.go | 54 +- .../google/go-cmp/cmp/cmpopts/equate.go | 156 - .../google/go-cmp/cmp/cmpopts/ignore.go | 206 - .../google/go-cmp/cmp/cmpopts/sort.go | 147 - .../go-cmp/cmp/cmpopts/struct_filter.go | 189 - .../google/go-cmp/cmp/cmpopts/xform.go | 36 - .../pkg/authn/keychain.go | 71 +- .../go-containerregistry/pkg/name/registry.go | 6 + .../pkg/v1/empty/index.go | 1 + .../pkg/v1/google/keychain.go | 13 +- .../pkg/v1/google/list.go | 16 +- .../pkg/v1/layout/write.go | 1 + .../pkg/v1/mutate/image.go | 6 + .../pkg/v1/mutate/index.go | 28 + .../pkg/v1/mutate/mutate.go | 4 +- .../pkg/v1/partial/index.go | 80 + .../pkg/v1/remote/catalog.go | 131 +- .../pkg/v1/remote/delete.go | 37 +- .../pkg/v1/remote/descriptor.go | 405 +- .../pkg/v1/remote/fetcher.go | 317 + .../pkg/v1/remote/image.go | 35 +- .../pkg/v1/remote/index.go | 60 +- .../pkg/v1/remote/layer.go | 37 +- .../pkg/v1/remote/list.go | 123 +- .../pkg/v1/remote/multi_write.go | 282 +- .../pkg/v1/remote/options.go | 76 +- .../pkg/v1/remote/progress.go | 7 + .../pkg/v1/remote/puller.go | 222 + .../pkg/v1/remote/pusher.go | 559 + .../pkg/v1/remote/referrers.go | 90 +- .../pkg/v1/remote/schema1.go | 118 + .../pkg/v1/remote/transport/bearer.go | 137 +- .../pkg/v1/remote/transport/error.go | 27 +- .../pkg/v1/remote/transport/ping.go | 60 +- .../pkg/v1/remote/transport/retry.go | 2 +- .../pkg/v1/remote/transport/schemer.go | 2 +- .../pkg/v1/remote/transport/transport.go | 47 +- .../pkg/v1/remote/write.go | 495 +- .../pkg/v1/static/layer.go | 68 + .../pkg/v1/stream/layer.go | 2 + .../pkg/v1/tarball/image.go | 6 +- .../pkg/v1/tarball/layer.go | 5 + .../pkg/v1/types/types.go | 16 + .../github.com/google/go-github/v45/AUTHORS | 357 - .../go-github/v45/github/code-scanning.go | 334 - .../google/go-github/v45/github/doc.go | 213 - .../google/go-github/v45/github/event.go | 158 - .../google/go-github/v45/github/github.go | 1366 - .../go-github/v45/github/orgs_audit_log.go | 116 - .../go-github/v45/github/orgs_custom_roles.go | 46 - .../go-github/v45/github/repos_pages.go | 240 - .../google/go-github/v45/github/search.go | 327 - .../google/go-github/v45/github/timestamp.go | 44 - .../go-github/v45/github/users_emails.go | 72 - .../github.com/google/go-github/v53/AUTHORS | 433 + .../google/go-github/{v45 => v53}/LICENSE | 0 .../go-github/{v45 => v53}/github/actions.go | 0 .../{v45 => v53}/github/actions_artifacts.go | 36 +- .../go-github/v53/github/actions_cache.go | 235 + .../go-github/v53/github/actions_oidc.go | 73 + .../v53/github/actions_required_workflows.go | 247 + .../github/actions_runner_groups.go | 31 +- .../{v45 => v53}/github/actions_runners.go | 54 + .../{v45 => v53}/github/actions_secrets.go | 2 +- .../go-github/v53/github/actions_variables.go | 293 + .../github/actions_workflow_jobs.go | 4 + .../github/actions_workflow_runs.go | 75 +- .../{v45 => v53}/github/actions_workflows.go | 11 +- .../go-github/{v45 => v53}/github/activity.go | 17 +- .../{v45 => v53}/github/activity_events.go | 0 .../github/activity_notifications.go | 10 +- .../{v45 => v53}/github/activity_star.go | 0 .../{v45 => v53}/github/activity_watching.go | 0 .../go-github/{v45 => v53}/github/admin.go | 0 .../{v45 => v53}/github/admin_orgs.go | 0 .../{v45 => v53}/github/admin_stats.go | 0 .../{v45 => v53}/github/admin_users.go | 0 .../go-github/{v45 => v53}/github/apps.go | 35 +- .../{v45 => v53}/github/apps_hooks.go | 0 .../github/apps_hooks_deliveries.go | 0 .../{v45 => v53}/github/apps_installation.go | 0 .../{v45 => v53}/github/apps_manifest.go | 0 .../{v45 => v53}/github/apps_marketplace.go | 12 + .../{v45 => v53}/github/authorizations.go | 0 .../go-github/{v45 => v53}/github/billing.go | 28 +- .../go-github/{v45 => v53}/github/checks.go | 0 .../go-github/v53/github/code-scanning.go | 453 + .../google/go-github/v53/github/codespaces.go | 254 + .../v53/github/codespaces_secrets.go | 405 + .../{v45 => v53}/github/dependabot.go | 0 .../go-github/v53/github/dependabot_alerts.go | 135 + .../{v45 => v53}/github/dependabot_secrets.go | 26 +- .../google/go-github/v53/github/doc.go | 212 + .../{v45 => v53}/github/enterprise.go | 0 .../github/enterprise_actions_runners.go | 19 + .../github/enterprise_audit_log.go | 0 .../enterprise_code_security_and_analysis.go | 78 + .../google/go-github/v53/github/event.go | 167 + .../{v45 => v53}/github/event_types.go | 101 +- .../go-github/{v45 => v53}/github/gists.go | 4 +- .../{v45 => v53}/github/gists_comments.go | 3 +- .../go-github/{v45 => v53}/github/git.go | 0 .../{v45 => v53}/github/git_blobs.go | 0 .../{v45 => v53}/github/git_commits.go | 5 +- .../go-github/{v45 => v53}/github/git_refs.go | 2 +- .../go-github/{v45 => v53}/github/git_tags.go | 0 .../{v45 => v53}/github/git_trees.go | 0 .../{v45 => v53}/github/github-accessors.go | 4902 ++- .../google/go-github/v53/github/github.go | 1540 + .../{v45 => v53}/github/gitignore.go | 0 .../{v45 => v53}/github/interactions.go | 0 .../{v45 => v53}/github/interactions_orgs.go | 0 .../{v45 => v53}/github/interactions_repos.go | 0 .../{v45 => v53}/github/issue_import.go | 15 +- .../go-github/{v45 => v53}/github/issues.go | 30 +- .../{v45 => v53}/github/issues_assignees.go | 0 .../{v45 => v53}/github/issues_comments.go | 4 +- .../{v45 => v53}/github/issues_events.go | 3 +- .../{v45 => v53}/github/issues_labels.go | 0 .../{v45 => v53}/github/issues_milestones.go | 9 +- .../{v45 => v53}/github/issues_timeline.go | 9 +- .../go-github/{v45 => v53}/github/licenses.go | 0 .../go-github/{v45 => v53}/github/messages.go | 73 +- .../{v45 => v53}/github/migrations.go | 0 .../github/migrations_source_import.go | 0 .../{v45 => v53}/github/migrations_user.go | 6 +- .../go-github/{v45 => v53}/github/misc.go | 8 + .../go-github/{v45 => v53}/github/orgs.go | 38 +- .../github/orgs_actions_allowed.go | 0 .../github/orgs_actions_permissions.go | 0 .../go-github/v53/github/orgs_audit_log.go | 148 + .../go-github/v53/github/orgs_custom_roles.go | 120 + .../{v45 => v53}/github/orgs_hooks.go | 0 .../github/orgs_hooks_deliveries.go | 0 .../{v45 => v53}/github/orgs_members.go | 4 +- .../github/orgs_outside_collaborators.go | 0 .../{v45 => v53}/github/orgs_packages.go | 2 +- .../{v45 => v53}/github/orgs_projects.go | 0 .../google/go-github/v53/github/orgs_rules.go | 105 + .../v53/github/orgs_security_managers.go | 57 + .../github/orgs_users_blocking.go | 0 .../go-github/{v45 => v53}/github/packages.go | 0 .../go-github/{v45 => v53}/github/projects.go | 0 .../go-github/{v45 => v53}/github/pulls.go | 9 +- .../{v45 => v53}/github/pulls_comments.go | 4 +- .../{v45 => v53}/github/pulls_reviewers.go | 0 .../{v45 => v53}/github/pulls_reviews.go | 35 +- .../{v45 => v53}/github/pulls_threads.go | 0 .../{v45 => v53}/github/reactions.go | 0 .../go-github/{v45 => v53}/github/repos.go | 438 +- .../v53/github/repos_actions_access.go | 55 + .../github/repos_actions_allowed.go | 0 .../github/repos_actions_permissions.go | 0 .../{v45 => v53}/github/repos_autolinks.go | 12 +- .../go-github/v53/github/repos_codeowners.go | 46 + .../github/repos_collaborators.go | 7 + .../{v45 => v53}/github/repos_comments.go | 5 +- .../{v45 => v53}/github/repos_commits.go | 0 .../github/repos_community_health.go | 3 +- .../{v45 => v53}/github/repos_contents.go | 15 +- .../repos_deployment_branch_policies.go | 123 + .../{v45 => v53}/github/repos_deployments.go | 0 .../{v45 => v53}/github/repos_environments.go | 41 + .../{v45 => v53}/github/repos_forks.go | 13 +- .../{v45 => v53}/github/repos_hooks.go | 60 +- .../github/repos_hooks_deliveries.go | 0 .../{v45 => v53}/github/repos_invitations.go | 0 .../{v45 => v53}/github/repos_keys.go | 0 .../google/go-github/v53/github/repos_lfs.go | 49 + .../{v45 => v53}/github/repos_merging.go | 0 .../go-github/v53/github/repos_pages.go | 306 + .../github/repos_prereceive_hooks.go | 0 .../{v45 => v53}/github/repos_projects.go | 0 .../{v45 => v53}/github/repos_releases.go | 22 +- .../go-github/v53/github/repos_rules.go | 447 + .../{v45 => v53}/github/repos_stats.go | 0 .../{v45 => v53}/github/repos_statuses.go | 5 +- .../google/go-github/v53/github/repos_tags.go | 76 + .../{v45 => v53}/github/repos_traffic.go | 0 .../go-github/{v45 => v53}/github/scim.go | 64 +- .../google/go-github/v53/github/search.go | 333 + .../{v45 => v53}/github/secret_scanning.go | 8 + .../go-github/{v45 => v53}/github/strings.go | 0 .../go-github/{v45 => v53}/github/teams.go | 25 +- .../github/teams_discussion_comments.go | 0 .../{v45 => v53}/github/teams_discussions.go | 0 .../{v45 => v53}/github/teams_members.go | 0 .../google/go-github/v53/github/timestamp.go | 52 + .../go-github/{v45 => v53}/github/users.go | 4 +- .../github/users_administration.go | 0 .../{v45 => v53}/github/users_blocking.go | 0 .../go-github/v53/github/users_emails.go | 97 + .../{v45 => v53}/github/users_followers.go | 0 .../{v45 => v53}/github/users_gpg_keys.go | 5 +- .../{v45 => v53}/github/users_keys.go | 2 + .../{v45 => v53}/github/users_packages.go | 0 .../{v45 => v53}/github/users_projects.go | 0 .../v53/github/users_ssh_signing_keys.go | 108 + .../{v45 => v53}/github/with_appengine.go | 0 .../{v45 => v53}/github/without_appengine.go | 0 vendor/github.com/google/s2a-go/.gitignore | 6 + .../google/s2a-go/CODE_OF_CONDUCT.md | 93 + .../github.com/google/s2a-go/CONTRIBUTING.md | 29 + .../LICENSE => google/s2a-go/LICENSE.md} | 0 vendor/github.com/google/s2a-go/README.md | 17 + .../google/s2a-go/fallback/s2a_fallback.go | 167 + .../s2a-go/internal/authinfo/authinfo.go | 119 + .../s2a-go/internal/handshaker/handshaker.go | 438 + .../internal/handshaker/service/service.go | 99 + .../proto/common_go_proto/common.pb.go | 389 + .../s2a_context_go_proto/s2a_context.pb.go | 267 + .../internal/proto/s2a_go_proto/s2a.pb.go | 1377 + .../proto/s2a_go_proto/s2a_grpc.pb.go | 173 + .../proto/v2/common_go_proto/common.pb.go | 367 + .../v2/s2a_context_go_proto/s2a_context.pb.go | 248 + .../internal/proto/v2/s2a_go_proto/s2a.pb.go | 2494 ++ .../proto/v2/s2a_go_proto/s2a_grpc.pb.go | 159 + .../internal/aeadcrypter/aeadcrypter.go | 34 + .../record/internal/aeadcrypter/aesgcm.go | 70 + .../record/internal/aeadcrypter/chachapoly.go | 67 + .../record/internal/aeadcrypter/common.go | 92 + .../record/internal/halfconn/ciphersuite.go | 98 + .../record/internal/halfconn/counter.go | 60 + .../record/internal/halfconn/expander.go | 59 + .../record/internal/halfconn/halfconn.go | 193 + .../google/s2a-go/internal/record/record.go | 757 + .../s2a-go/internal/record/ticketsender.go | 176 + .../internal/tokenmanager/tokenmanager.go | 70 + .../google/s2a-go/internal/v2/README.md | 1 + .../internal/v2/certverifier/certverifier.go | 122 + .../testdata/client_intermediate_cert.der | Bin 0 -> 998 bytes .../testdata/client_leaf_cert.der | Bin 0 -> 1147 bytes .../testdata/client_root_cert.der | Bin 0 -> 1013 bytes .../testdata/server_intermediate_cert.der | Bin 0 -> 998 bytes .../testdata/server_leaf_cert.der | Bin 0 -> 1147 bytes .../testdata/server_root_cert.der | Bin 0 -> 1013 bytes .../internal/v2/remotesigner/remotesigner.go | 186 + .../v2/remotesigner/testdata/client_cert.der | Bin 0 -> 1013 bytes .../v2/remotesigner/testdata/client_cert.pem | 24 + .../v2/remotesigner/testdata/client_key.pem | 27 + .../v2/remotesigner/testdata/server_cert.der | Bin 0 -> 1013 bytes .../v2/remotesigner/testdata/server_cert.pem | 24 + .../v2/remotesigner/testdata/server_key.pem | 27 + .../google/s2a-go/internal/v2/s2av2.go | 387 + .../internal/v2/testdata/client_cert.pem | 24 + .../internal/v2/testdata/client_key.pem | 27 + .../internal/v2/testdata/server_cert.pem | 24 + .../internal/v2/testdata/server_key.pem | 27 + .../tlsconfigstore/testdata/client_cert.pem | 24 + .../v2/tlsconfigstore/testdata/client_key.pem | 27 + .../tlsconfigstore/testdata/server_cert.pem | 24 + .../v2/tlsconfigstore/testdata/server_key.pem | 27 + .../v2/tlsconfigstore/tlsconfigstore.go | 404 + .../github.com/google/s2a-go/retry/retry.go | 144 + vendor/github.com/google/s2a-go/s2a.go | 424 + .../github.com/google/s2a-go/s2a_options.go | 208 + vendor/github.com/google/s2a-go/s2a_utils.go | 79 + .../google/s2a-go/stream/s2a_stream.go | 34 + .../google/s2a-go/testdata/client_cert.pem | 24 + .../google/s2a-go/testdata/client_key.pem | 27 + .../google/s2a-go/testdata/server_cert.pem | 24 + .../google/s2a-go/testdata/server_key.pem | 27 + vendor/github.com/google/trillian/.gitignore | 24 - .../github.com/google/trillian/.golangci.yaml | 37 - vendor/github.com/google/trillian/AUTHORS | 14 - vendor/github.com/google/trillian/BUILD.bazel | 55 - .../github.com/google/trillian/CHANGELOG.md | 1069 - vendor/github.com/google/trillian/CODEOWNERS | 21 - .../google/trillian/CONTRIBUTING.md | 58 - .../github.com/google/trillian/CONTRIBUTORS | 39 - vendor/github.com/google/trillian/LICENSE | 202 - .../google/trillian/PULL_REQUEST_TEMPLATE.md | 15 - vendor/github.com/google/trillian/README.md | 314 - .../google/trillian/client/admin.go | 124 - .../google/trillian/client/backoff/backoff.go | 130 - .../google/trillian/client/log_client.go | 343 - .../google/trillian/client/log_verifier.go | 91 - .../trillian/client/rpcflags/rpcflags.go | 46 - .../google/trillian/cloudbuild.yaml | 187 - .../google/trillian/cloudbuild_master.yaml | 165 - .../google/trillian/cloudbuild_pr.yaml | 175 - .../google/trillian/cloudbuild_tag.yaml | 51 - .../google/trillian/cmd/createtree/main.go | 132 - .../github.com/google/trillian/cmd/flags.go | 56 - vendor/github.com/google/trillian/codecov.yml | 22 - vendor/github.com/google/trillian/gen.go | 21 - .../github.com/google/trillian/trillian.pb.go | 800 - .../github.com/google/trillian/trillian.proto | 235 - .../google/trillian/trillian_admin_api.pb.go | 621 - .../google/trillian/trillian_admin_api.proto | 107 - .../trillian/trillian_admin_api_grpc.pb.go | 311 - .../google/trillian/trillian_log_api.pb.go | 2070 -- .../google/trillian/trillian_log_api.proto | 363 - .../trillian/trillian_log_api_grpc.pb.go | 461 - .../google/trillian/types/internal/tls/tls.go | 713 - .../google/trillian/types/logroot.go | 102 - vendor/github.com/gorilla/mux/AUTHORS | 8 + vendor/github.com/gorilla/mux/LICENSE | 27 + vendor/github.com/gorilla/mux/README.md | 805 + vendor/github.com/gorilla/mux/doc.go | 306 + vendor/github.com/gorilla/mux/middleware.go | 74 + vendor/github.com/gorilla/mux/mux.go | 606 + vendor/github.com/gorilla/mux/regexp.go | 388 + vendor/github.com/gorilla/mux/route.go | 736 + vendor/github.com/gorilla/mux/test_helpers.go | 19 + .../github.com/gorilla/websocket/.gitignore | 25 - vendor/github.com/gorilla/websocket/AUTHORS | 9 - vendor/github.com/gorilla/websocket/LICENSE | 22 - vendor/github.com/gorilla/websocket/README.md | 39 - vendor/github.com/gorilla/websocket/client.go | 422 - .../gorilla/websocket/compression.go | 148 - vendor/github.com/gorilla/websocket/conn.go | 1230 - vendor/github.com/gorilla/websocket/doc.go | 227 - vendor/github.com/gorilla/websocket/join.go | 42 - vendor/github.com/gorilla/websocket/json.go | 60 - vendor/github.com/gorilla/websocket/mask.go | 55 - .../github.com/gorilla/websocket/mask_safe.go | 16 - .../github.com/gorilla/websocket/prepared.go | 102 - vendor/github.com/gorilla/websocket/proxy.go | 77 - vendor/github.com/gorilla/websocket/server.go | 365 - .../gorilla/websocket/tls_handshake.go | 21 - .../gorilla/websocket/tls_handshake_116.go | 21 - vendor/github.com/gorilla/websocket/util.go | 283 - .../gorilla/websocket/x_net_proxy.go | 473 - .../go-grpc-middleware/.gitignore | 204 - .../go-grpc-middleware/.travis.yml | 16 - .../go-grpc-middleware/CHANGELOG.md | 51 - .../go-grpc-middleware/CONTRIBUTING.md | 20 - .../grpc-ecosystem/go-grpc-middleware/LICENSE | 201 - .../go-grpc-middleware/README.md | 86 - .../go-grpc-middleware/chain.go | 120 - .../grpc-ecosystem/go-grpc-middleware/doc.go | 69 - .../logging/settable/doc.go | 16 - .../logging/settable/logsettable.go | 99 - .../go-grpc-middleware/makefile | 17 - .../go-grpc-middleware/slack.png | Bin 5088 -> 0 bytes .../go-grpc-middleware/wrappers.go | 30 - .../go-grpc-prometheus/.gitignore | 201 - .../go-grpc-prometheus/.travis.yml | 25 - .../go-grpc-prometheus/CHANGELOG.md | 24 - .../grpc-ecosystem/go-grpc-prometheus/LICENSE | 201 - .../go-grpc-prometheus/README.md | 247 - .../go-grpc-prometheus/client.go | 39 - .../go-grpc-prometheus/client_metrics.go | 170 - .../go-grpc-prometheus/client_reporter.go | 46 - .../go-grpc-prometheus/makefile | 16 - .../go-grpc-prometheus/metric_options.go | 41 - .../go-grpc-prometheus/server.go | 48 - .../go-grpc-prometheus/server_metrics.go | 185 - .../go-grpc-prometheus/server_reporter.go | 46 - .../grpc-ecosystem/go-grpc-prometheus/util.go | 50 - .../grpc-ecosystem/grpc-gateway/LICENSE.txt | 27 - .../grpc-gateway/internal/BUILD.bazel | 23 - .../grpc-gateway/internal/errors.pb.go | 189 - .../grpc-gateway/internal/errors.proto | 26 - .../grpc-gateway/runtime/BUILD.bazel | 85 - .../grpc-gateway/runtime/context.go | 291 - .../grpc-gateway/runtime/convert.go | 318 - .../grpc-gateway/runtime/doc.go | 5 - .../grpc-gateway/runtime/errors.go | 186 - .../grpc-gateway/runtime/fieldmask.go | 89 - .../grpc-gateway/runtime/handler.go | 212 - .../runtime/marshal_httpbodyproto.go | 43 - .../grpc-gateway/runtime/marshal_json.go | 45 - .../grpc-gateway/runtime/marshal_jsonpb.go | 262 - .../grpc-gateway/runtime/marshal_proto.go | 62 - .../grpc-gateway/runtime/marshaler.go | 55 - .../runtime/marshaler_registry.go | 99 - .../grpc-gateway/runtime/mux.go | 300 - .../grpc-gateway/runtime/pattern.go | 262 - .../grpc-gateway/runtime/proto2_convert.go | 80 - .../grpc-gateway/runtime/proto_errors.go | 106 - .../grpc-gateway/runtime/query.go | 406 - .../grpc-gateway/utilities/BUILD.bazel | 21 - .../grpc-gateway/utilities/doc.go | 2 - .../grpc-gateway/utilities/pattern.go | 22 - .../grpc-gateway/utilities/readerfactory.go | 20 - .../grpc-gateway/utilities/trie.go | 177 - .../v2/internal/httprule/parse.go | 6 +- .../grpc-gateway/v2/runtime/BUILD.bazel | 4 +- .../grpc-gateway/v2/runtime/context.go | 40 + .../grpc-gateway/v2/runtime/fieldmask.go | 2 +- .../grpc-gateway/v2/runtime/marshal_jsonpb.go | 27 +- .../grpc-gateway/v2/runtime/mux.go | 21 +- .../grpc-gateway/v2/runtime/pattern.go | 2 - .../grpc-gateway/v2/runtime/query.go | 11 +- .../hashicorp/go-retryablehttp/CHANGELOG.md | 9 + .../hashicorp/go-retryablehttp/CODEOWNERS | 1 + .../hashicorp/go-retryablehttp/LICENSE | 2 + .../hashicorp/go-retryablehttp/client.go | 16 +- .../go-retryablehttp/roundtripper.go | 3 + .../github.com/imdario/mergo/CONTRIBUTING.md | 112 + vendor/github.com/imdario/mergo/README.md | 5 +- vendor/github.com/imdario/mergo/SECURITY.md | 14 + vendor/github.com/imdario/mergo/map.go | 6 +- vendor/github.com/imdario/mergo/merge.go | 59 +- vendor/github.com/imdario/mergo/mergo.go | 11 +- .../in-toto-golang/in_toto/attestations.go | 99 + .../in-toto-golang/in_toto/envelope.go | 166 + .../in-toto/in-toto-golang/in_toto/keylib.go | 77 +- .../in-toto/in-toto-golang/in_toto/match.go | 1 - .../in-toto/in-toto-golang/in_toto/model.go | 251 +- .../in-toto/in-toto-golang/in_toto/runlib.go | 152 +- .../in_toto/slsa_provenance/common/common.go | 16 + .../slsa_provenance/v0.1/provenance.go | 50 + .../slsa_provenance/v0.2/provenance.go | 140 +- .../in_toto/slsa_provenance/v1/provenance.go | 151 + .../in-toto/in-toto-golang/in_toto/util.go | 43 + .../in-toto-golang/in_toto/verifylib.go | 251 +- vendor/github.com/jhump/protoreflect/LICENSE | 202 - .../jhump/protoreflect/codec/codec.go | 217 - .../jhump/protoreflect/codec/decode_fields.go | 318 - .../jhump/protoreflect/codec/doc.go | 7 - .../jhump/protoreflect/codec/encode_fields.go | 288 - .../jhump/protoreflect/desc/convert.go | 233 - .../jhump/protoreflect/desc/descriptor.go | 1774 -- .../protoreflect/desc/descriptor_no_unsafe.go | 30 - .../protoreflect/desc/descriptor_unsafe.go | 59 - .../github.com/jhump/protoreflect/desc/doc.go | 62 - .../jhump/protoreflect/desc/imports.go | 319 - .../desc/internal/proto3_optional.go | 74 - .../protoreflect/desc/internal/source_info.go | 107 - .../jhump/protoreflect/desc/internal/util.go | 293 - .../jhump/protoreflect/desc/load.go | 343 - .../protoreflect/desc/protoparse/.gitignore | 1 - .../jhump/protoreflect/desc/protoparse/ast.go | 205 - .../protoreflect/desc/protoparse/ast/doc.go | 27 - .../protoreflect/desc/protoparse/ast/enum.go | 154 - .../protoreflect/desc/protoparse/ast/field.go | 659 - .../protoreflect/desc/protoparse/ast/file.go | 234 - .../desc/protoparse/ast/identifiers.go | 134 - .../desc/protoparse/ast/message.go | 199 - .../desc/protoparse/ast/no_source.go | 103 - .../protoreflect/desc/protoparse/ast/node.go | 200 - .../desc/protoparse/ast/options.go | 361 - .../protoreflect/desc/protoparse/ast/print.go | 86 - .../desc/protoparse/ast/ranges.go | 305 - .../desc/protoparse/ast/service.go | 273 - .../desc/protoparse/ast/source_pos.go | 38 - .../desc/protoparse/ast/values.go | 569 - .../protoreflect/desc/protoparse/ast/walk.go | 492 - .../desc/protoparse/descriptor_protos.go | 588 - .../jhump/protoreflect/desc/protoparse/doc.go | 10 - .../protoreflect/desc/protoparse/errors.go | 181 - .../protoreflect/desc/protoparse/lexer.go | 809 - .../protoreflect/desc/protoparse/linker.go | 1326 - .../protoreflect/desc/protoparse/options.go | 1581 - .../protoreflect/desc/protoparse/parser.go | 847 - .../protoreflect/desc/protoparse/proto.y | 1205 - .../protoreflect/desc/protoparse/proto.y.go | 2588 -- .../desc/protoparse/resolve_files.go | 175 - .../desc/protoparse/source_code_info.go | 544 - .../desc/protoparse/std_imports.go | 50 - .../desc/protoparse/test-source-info.txt | 6390 ---- .../protoreflect/desc/protoparse/validate.go | 383 - .../jhump/protoreflect/desc/protoprint/doc.go | 7 - .../protoreflect/desc/protoprint/print.go | 2656 -- .../protoreflect/desc/protoprint/sort.go | 439 - .../protoreflect/desc/sourceinfo/locations.go | 207 - .../protoreflect/desc/sourceinfo/registry.go | 206 - .../protoreflect/desc/sourceinfo/wrappers.go | 508 - .../jhump/protoreflect/dynamic/binary.go | 185 - .../jhump/protoreflect/dynamic/doc.go | 159 - .../protoreflect/dynamic/dynamic_message.go | 2774 -- .../jhump/protoreflect/dynamic/equal.go | 157 - .../jhump/protoreflect/dynamic/extension.go | 46 - .../dynamic/extension_registry.go | 241 - .../protoreflect/dynamic/grpcdynamic/stub.go | 310 - .../jhump/protoreflect/dynamic/indent.go | 76 - .../jhump/protoreflect/dynamic/json.go | 1256 - .../jhump/protoreflect/dynamic/maps_1.11.go | 130 - .../jhump/protoreflect/dynamic/maps_1.12.go | 138 - .../jhump/protoreflect/dynamic/merge.go | 100 - .../protoreflect/dynamic/message_factory.go | 207 - .../jhump/protoreflect/dynamic/text.go | 1177 - .../jhump/protoreflect/grpcreflect/client.go | 771 - .../jhump/protoreflect/grpcreflect/doc.go | 10 - .../grpc_reflection_v1/reflection.pb.go | 952 - .../grpc_reflection_v1/reflection.proto | 146 - .../grpc_reflection_v1/reflection_grpc.pb.go | 141 - .../internal/grpc_reflection_v1/svc_impl.go | 232 - .../jhump/protoreflect/grpcreflect/server.go | 67 - .../protoreflect/internal/codec/buffer.go | 118 - .../protoreflect/internal/codec/decode.go | 346 - .../protoreflect/internal/codec/encode.go | 147 - .../protoreflect/internal/standard_files.go | 127 - .../protoreflect/internal/unrecognized.go | 41 - .../github.com/klauspost/compress/README.md | 26 + .../klauspost/compress/fse/decompress.go | 4 +- .../klauspost/compress/huff0/bitwriter.go | 16 + .../klauspost/compress/huff0/compress.go | 3 +- .../klauspost/compress/zstd/blockdec.go | 4 + .../klauspost/compress/zstd/blockenc.go | 9 +- .../klauspost/compress/zstd/bytebuf.go | 4 +- .../klauspost/compress/zstd/decoder.go | 7 +- .../klauspost/compress/zstd/enc_best.go | 266 +- .../klauspost/compress/zstd/encoder.go | 78 +- .../compress/zstd/encoder_options.go | 4 +- .../klauspost/compress/zstd/framedec.go | 35 +- .../klauspost/compress/zstd/seqdec.go | 11 +- .../klauspost/compress/zstd/seqdec_amd64.go | 17 +- .../klauspost/compress/zstd/seqdec_amd64.s | 124 +- .../klauspost/compress/zstd/zstd.go | 4 +- vendor/github.com/leodido/go-urn/.gitignore | 3 +- vendor/github.com/leodido/go-urn/.travis.yml | 16 - vendor/github.com/leodido/go-urn/README.md | 28 +- vendor/github.com/leodido/go-urn/machine.go | 3 - vendor/github.com/leodido/go-urn/makefile | 40 +- .../lestrrat-go/blackmagic/.gitignore | 15 + .../github.com/lestrrat-go/blackmagic/LICENSE | 21 + .../lestrrat-go/blackmagic/README.md | 3 + .../lestrrat-go/blackmagic/blackmagic.go | 54 + .../github.com/lestrrat-go/httpcc/.gitignore | 15 + vendor/github.com/lestrrat-go/httpcc/LICENSE | 21 + .../github.com/lestrrat-go/httpcc/README.md | 35 + .../lestrrat-go/httpcc/directives.go | 117 + .../github.com/lestrrat-go/httpcc/httpcc.go | 310 + .../github.com/lestrrat-go/httprc/.gitignore | 15 + .../lestrrat-go/httprc/.golangci.yml | 84 + vendor/github.com/lestrrat-go/httprc/Changes | 17 + vendor/github.com/lestrrat-go/httprc/LICENSE | 21 + .../github.com/lestrrat-go/httprc/README.md | 130 + vendor/github.com/lestrrat-go/httprc/cache.go | 172 + .../github.com/lestrrat-go/httprc/fetcher.go | 182 + .../github.com/lestrrat-go/httprc/httprc.go | 22 + .../lestrrat-go/httprc/options.yaml | 119 + .../lestrrat-go/httprc/options_gen.go | 221 + vendor/github.com/lestrrat-go/httprc/queue.go | 459 + .../lestrrat-go/httprc/whitelist.go | 73 + vendor/github.com/lestrrat-go/iter/LICENSE | 21 + .../lestrrat-go/iter/arrayiter/arrayiter.go | 192 + .../lestrrat-go/iter/mapiter/mapiter.go | 195 + vendor/github.com/lestrrat-go/jwx/v2/LICENSE | 22 + .../lestrrat-go/jwx/v2/cert/BUILD.bazel | 32 + .../lestrrat-go/jwx/v2/cert/cert.go | 48 + .../lestrrat-go/jwx/v2/cert/chain.go | 78 + .../jwx/v2/internal/base64/BUILD.bazel | 21 + .../jwx/v2/internal/base64/asmbase64.go | 39 + .../jwx/v2/internal/base64/base64.go | 134 + .../jwx/v2/internal/ecutil/BUILD.bazel | 15 + .../jwx/v2/internal/ecutil/ecutil.go | 110 + .../jwx/v2/internal/iter/BUILD.bazel | 15 + .../jwx/v2/internal/iter/mapiter.go | 36 + .../jwx/v2/internal/json/BUILD.bazel | 19 + .../lestrrat-go/jwx/v2/internal/json/goccy.go | 51 + .../lestrrat-go/jwx/v2/internal/json/json.go | 112 + .../jwx/v2/internal/json/registry.go | 52 + .../jwx/v2/internal/json/stdlib.go | 49 + .../jwx/v2/internal/keyconv/BUILD.bazel | 31 + .../jwx/v2/internal/keyconv/keyconv.go | 177 + .../jwx/v2/internal/pool/BUILD.bazel | 14 + .../lestrrat-go/jwx/v2/internal/pool/pool.go | 61 + .../lestrrat-go/jwx/v2/jwa/BUILD.bazel | 39 + .../lestrrat-go/jwx/v2/jwa/README.md | 3 + .../lestrrat-go/jwx/v2/jwa/compression_gen.go | 101 + .../jwx/v2/jwa/content_encryption_gen.go | 109 + .../lestrrat-go/jwx/v2/jwa/elliptic_gen.go | 112 + .../github.com/lestrrat-go/jwx/v2/jwa/jwa.go | 61 + .../jwx/v2/jwa/key_encryption_gen.go | 140 + .../lestrrat-go/jwx/v2/jwa/key_type_gen.go | 106 + .../lestrrat-go/jwx/v2/jwa/secp2561k.go | 11 + .../lestrrat-go/jwx/v2/jwa/signature_gen.go | 127 + .../lestrrat-go/jwx/v2/jwk/BUILD.bazel | 78 + .../lestrrat-go/jwx/v2/jwk/README.md | 217 + .../lestrrat-go/jwx/v2/jwk/cache.go | 410 + .../lestrrat-go/jwx/v2/jwk/ecdsa.go | 228 + .../lestrrat-go/jwx/v2/jwk/ecdsa_gen.go | 1181 + .../lestrrat-go/jwx/v2/jwk/es256k.go | 14 + .../lestrrat-go/jwx/v2/jwk/fetch.go | 134 + .../lestrrat-go/jwx/v2/jwk/interface.go | 137 + .../lestrrat-go/jwx/v2/jwk/interface_gen.go | 116 + .../github.com/lestrrat-go/jwx/v2/jwk/io.go | 39 + .../github.com/lestrrat-go/jwx/v2/jwk/jwk.go | 729 + .../lestrrat-go/jwx/v2/jwk/key_ops.go | 58 + .../github.com/lestrrat-go/jwx/v2/jwk/okp.go | 183 + .../lestrrat-go/jwx/v2/jwk/okp_gen.go | 1119 + .../lestrrat-go/jwx/v2/jwk/options.go | 38 + .../lestrrat-go/jwx/v2/jwk/options.yaml | 142 + .../lestrrat-go/jwx/v2/jwk/options_gen.go | 274 + .../github.com/lestrrat-go/jwx/v2/jwk/rsa.go | 243 + .../lestrrat-go/jwx/v2/jwk/rsa_gen.go | 1250 + .../github.com/lestrrat-go/jwx/v2/jwk/set.go | 338 + .../lestrrat-go/jwx/v2/jwk/symmetric.go | 60 + .../lestrrat-go/jwx/v2/jwk/symmetric_gen.go | 520 + .../lestrrat-go/jwx/v2/jwk/usage.go | 30 + .../lestrrat-go/jwx/v2/jwk/whitelist.go | 69 + .../lestrrat-go/jwx/v2/jws/BUILD.bazel | 69 + .../lestrrat-go/jwx/v2/jws/README.md | 111 + .../lestrrat-go/jwx/v2/jws/ecdsa.go | 197 + .../lestrrat-go/jwx/v2/jws/eddsa.go | 73 + .../lestrrat-go/jwx/v2/jws/es256k.go | 12 + .../lestrrat-go/jwx/v2/jws/headers.go | 71 + .../lestrrat-go/jwx/v2/jws/headers_gen.go | 565 + .../github.com/lestrrat-go/jwx/v2/jws/hmac.go | 77 + .../lestrrat-go/jwx/v2/jws/interface.go | 106 + .../github.com/lestrrat-go/jwx/v2/jws/io.go | 33 + .../github.com/lestrrat-go/jwx/v2/jws/jws.go | 749 + .../lestrrat-go/jwx/v2/jws/key_provider.go | 276 + .../lestrrat-go/jwx/v2/jws/message.go | 503 + .../lestrrat-go/jwx/v2/jws/options.go | 204 + .../lestrrat-go/jwx/v2/jws/options.yaml | 167 + .../lestrrat-go/jwx/v2/jws/options_gen.go | 331 + .../github.com/lestrrat-go/jwx/v2/jws/rsa.go | 142 + .../lestrrat-go/jwx/v2/jws/signer.go | 106 + .../lestrrat-go/jwx/v2/jws/verifier.go | 96 + .../lestrrat-go/jwx/v2/x25519/BUILD.bazel | 24 + .../lestrrat-go/jwx/v2/x25519/x25519.go | 115 + .../github.com/lestrrat-go/option/.gitignore | 15 + vendor/github.com/lestrrat-go/option/LICENSE | 21 + .../github.com/lestrrat-go/option/README.md | 245 + .../github.com/lestrrat-go/option/option.go | 38 + .../mitchellh/go-wordwrap/LICENSE.md | 21 + .../mitchellh/go-wordwrap/README.md | 39 + .../mitchellh/go-wordwrap/wordwrap.go | 83 + vendor/github.com/nozzle/throttler/.gitignore | 7 + vendor/github.com/nozzle/throttler/LICENSE | 202 + vendor/github.com/nozzle/throttler/README.md | 69 + .../github.com/nozzle/throttler/throttler.go | 165 + .../github.com/oleiade/reflections/.gitignore | 22 + .../github.com/oleiade/reflections/AUTHORS.md | 9 + vendor/github.com/oleiade/reflections/LICENSE | 20 + .../github.com/oleiade/reflections/README.md | 235 + .../oleiade/reflections/reflections.go | 301 + .../olekukonko/tablewriter/.gitignore | 15 - .../olekukonko/tablewriter/.travis.yml | 22 - .../olekukonko/tablewriter/LICENSE.md | 19 - .../olekukonko/tablewriter/README.md | 431 - .../github.com/olekukonko/tablewriter/csv.go | 52 - .../olekukonko/tablewriter/table.go | 967 - .../tablewriter/table_with_color.go | 136 - .../github.com/olekukonko/tablewriter/util.go | 93 - .../github.com/olekukonko/tablewriter/wrap.go | 99 - vendor/github.com/onsi/gomega/.gitignore | 2 +- vendor/github.com/onsi/gomega/CHANGELOG.md | 43 + .../github.com/onsi/gomega/format/format.go | 4 +- vendor/github.com/onsi/gomega/gomega_dsl.go | 2 +- vendor/github.com/onsi/gomega/matchers.go | 6 +- .../onsi/gomega/matchers/be_a_directory.go | 2 +- .../onsi/gomega/matchers/be_a_regular_file.go | 2 +- .../gomega/matchers/be_an_existing_file.go | 4 +- .../gomega/matchers/have_exact_elements.go | 7 +- .../open-policy-agent/opa/ast/annotations.go | 229 +- .../open-policy-agent/opa/ast/builtins.go | 188 +- .../open-policy-agent/opa/ast/capabilities.go | 15 + .../open-policy-agent/opa/ast/check.go | 137 +- .../open-policy-agent/opa/ast/compare.go | 5 + .../open-policy-agent/opa/ast/compile.go | 812 +- .../open-policy-agent/opa/ast/conflicts.go | 7 +- .../open-policy-agent/opa/ast/doc.go | 46 +- .../open-policy-agent/opa/ast/env.go | 128 +- .../open-policy-agent/opa/ast/fuzz.go | 17 - .../open-policy-agent/opa/ast/index.go | 126 +- .../opa/ast/internal/scanner/scanner.go | 3 +- .../opa/ast/location/location.go | 3 +- .../open-policy-agent/opa/ast/marshal.go | 7 + .../open-policy-agent/opa/ast/parser.go | 302 +- .../open-policy-agent/opa/ast/parser_ext.go | 243 +- .../open-policy-agent/opa/ast/policy.go | 344 +- .../open-policy-agent/opa/ast/strings.go | 3 + .../open-policy-agent/opa/ast/term.go | 291 +- .../open-policy-agent/opa/ast/transform.go | 19 +- .../open-policy-agent/opa/ast/visit.go | 242 +- .../open-policy-agent/opa/bundle/bundle.go | 107 +- .../open-policy-agent/opa/bundle/file.go | 121 +- .../open-policy-agent/opa/bundle/filefs.go | 24 +- .../open-policy-agent/opa/bundle/keys.go | 5 +- .../open-policy-agent/opa/bundle/store.go | 2 +- .../opa/capabilities/capabilities.go | 1 + .../opa/capabilities/v0.46.0.json | 4353 +++ .../opa/capabilities/v0.46.1.json | 4353 +++ .../opa/capabilities/v0.46.2.json | 4353 +++ .../opa/capabilities/v0.46.3.json | 4353 +++ .../opa/capabilities/v0.47.0.json | 4422 +++ .../opa/capabilities/v0.47.1.json | 4422 +++ .../opa/capabilities/v0.47.2.json | 4422 +++ .../opa/capabilities/v0.47.3.json | 4422 +++ .../opa/capabilities/v0.47.4.json | 4422 +++ .../opa/capabilities/v0.48.0.json | 4466 +++ .../opa/capabilities/v0.49.0.json | 4466 +++ .../opa/capabilities/v0.49.1.json | 4466 +++ .../opa/capabilities/v0.49.2.json | 4466 +++ .../opa/capabilities/v0.50.0.json | 4598 +++ .../opa/capabilities/v0.50.1.json | 4598 +++ .../opa/capabilities/v0.50.2.json | 4598 +++ .../opa/capabilities/v0.51.0.json | 4598 +++ .../opa/capabilities/v0.52.0.json | 4615 +++ .../opa/capabilities/v0.53.0.json | 4640 +++ .../opa/capabilities/v0.53.1.json | 4640 +++ .../opa/capabilities/v0.54.0.json | 4640 +++ .../opa/capabilities/v0.55.0.json | 4665 +++ .../open-policy-agent/opa/config/config.go | 257 + .../open-policy-agent/opa/format/format.go | 191 +- .../open-policy-agent/opa/hooks/hooks.go | 77 + .../opa/internal/bundle/utils.go | 55 + .../internal/compiler/wasm/opa/callgraph.csv | 87 +- .../opa/internal/compiler/wasm/opa/opa.wasm | Bin 423668 -> 431451 bytes .../opa/internal/compiler/wasm/wasm.go | 15 +- .../opa/internal/config/config.go | 168 + .../opa/internal/debug/debug.go | 5 +- .../opa/internal/edittree/bitvector/README.md | 15 + .../internal/edittree/bitvector/bitvector.go | 206 + .../internal/edittree/bitvector/license.txt | 27 + .../opa/internal/edittree/edittree.go | 1185 + .../opa/internal/errors/join.go | 53 + .../opa/internal/errors/join_go1.20.go | 7 + .../opa/internal/gojsonschema/README.md | 3 +- .../opa/internal/gojsonschema/jsonLoader.go | 5 +- .../opa/internal/gojsonschema/schema.go | 1 - .../opa/internal/gojsonschema/schemaLoader.go | 2 +- .../opa/internal/gojsonschema/validation.go | 12 +- .../opa/internal/jwx/jwk/key_ops.go | 4 +- .../opa/internal/jwx/jws/jws.go | 5 +- .../opa/internal/jwx/jws/sign/hmac.go | 8 +- .../opa/internal/jwx/jws/sign/rsa.go | 8 +- .../opa/internal/jwx/jws/sign/sign.go | 6 +- .../opa/internal/jwx/jws/verify/ecdsa.go | 8 +- .../opa/internal/jwx/jws/verify/hmac.go | 2 +- .../opa/internal/jwx/jws/verify/rsa.go | 8 +- .../opa/internal/jwx/jws/verify/verify.go | 6 +- .../opa/internal/planner/planner.go | 373 +- .../opa/internal/planner/rules.go | 62 +- .../opa/internal/providers/aws/NOTICE.txt | 3 + .../internal/providers/aws/crypto/compare.go | 30 + .../opa/internal/providers/aws/crypto/ecc.go | 113 + .../opa/internal/providers/aws/ecr.go | 148 + .../opa/internal/providers/aws/kms.go | 106 + .../opa/internal/providers/aws/signing_v4.go | 204 + .../opa/internal/providers/aws/signing_v4a.go | 410 + .../opa/internal/providers/aws/util.go | 45 + .../opa/internal/providers/aws/v4/const.go | 36 + .../internal/providers/aws/v4/header_rules.go | 87 + .../opa/internal/providers/aws/v4/headers.go | 67 + .../opa/internal/providers/aws/v4/host.go | 75 + .../opa/internal/providers/aws/v4/util.go | 64 + .../opa/internal/runtime/init/init.go | 213 + .../opa/internal/strvals/doc.go | 33 + .../opa/internal/strvals/parser.go | 431 + .../opa/internal/wasm/encoding/reader.go | 3 +- .../opa/internal/wasm/encoding/writer.go | 2 +- .../open-policy-agent/opa/keys/keys.go | 3 +- .../opa/loader/extension/extension.go | 40 + .../open-policy-agent/opa/loader/loader.go | 118 +- .../open-policy-agent/opa/logging/logging.go | 233 + .../open-policy-agent/opa/plugins/plugins.go | 983 + .../opa/plugins/rest/auth.go | 878 + .../open-policy-agent/opa/plugins/rest/aws.go | 557 + .../opa/plugins/rest/azure.go | 157 + .../open-policy-agent/opa/plugins/rest/gcp.go | 173 + .../opa/plugins/rest/rest.go | 368 + .../open-policy-agent/opa/rego/plugins.go | 43 + .../open-policy-agent/opa/rego/rego.go | 347 +- .../open-policy-agent/opa/storage/errors.go | 2 +- .../opa/topdown/aggregates.go | 138 +- .../opa/topdown/arithmetic.go | 84 +- .../open-policy-agent/opa/topdown/array.go | 34 +- .../open-policy-agent/opa/topdown/binary.go | 28 +- .../open-policy-agent/opa/topdown/builtins.go | 42 +- .../opa/topdown/builtins/builtins.go | 6 +- .../open-policy-agent/opa/topdown/cache.go | 30 +- .../opa/topdown/cache/cache.go | 48 +- .../open-policy-agent/opa/topdown/casts.go | 84 +- .../open-policy-agent/opa/topdown/cidr.go | 63 +- .../opa/topdown/comparison.go | 18 +- .../copypropagation/copypropagation.go | 48 +- .../open-policy-agent/opa/topdown/crypto.go | 362 +- .../open-policy-agent/opa/topdown/encoding.go | 212 +- .../open-policy-agent/opa/topdown/errors.go | 10 + .../open-policy-agent/opa/topdown/eval.go | 234 +- .../open-policy-agent/opa/topdown/glob.go | 50 +- .../open-policy-agent/opa/topdown/graphql.go | 23 + .../open-policy-agent/opa/topdown/http.go | 423 +- .../open-policy-agent/opa/topdown/json.go | 462 +- .../opa/topdown/jsonschema.go | 109 + .../open-policy-agent/opa/topdown/numbers.go | 6 +- .../open-policy-agent/opa/topdown/object.go | 23 +- .../open-policy-agent/opa/topdown/parse.go | 20 +- .../opa/topdown/providers.go | 191 + .../open-policy-agent/opa/topdown/query.go | 71 +- .../opa/topdown/reachable.go | 41 +- .../open-policy-agent/opa/topdown/regex.go | 122 +- .../opa/topdown/regex_template.go | 6 +- .../open-policy-agent/opa/topdown/semver.go | 10 +- .../open-policy-agent/opa/topdown/sets.go | 42 +- .../open-policy-agent/opa/topdown/strings.go | 306 +- .../open-policy-agent/opa/topdown/subset.go | 4 +- .../open-policy-agent/opa/topdown/time.go | 128 +- .../open-policy-agent/opa/topdown/tokens.go | 141 +- .../open-policy-agent/opa/topdown/trace.go | 27 +- .../open-policy-agent/opa/topdown/type.go | 70 +- .../opa/topdown/type_name.go | 22 +- .../open-policy-agent/opa/topdown/uuid.go | 4 +- .../open-policy-agent/opa/topdown/walk.go | 12 +- .../open-policy-agent/opa/types/types.go | 29 +- .../open-policy-agent/opa/util/backoff.go | 4 +- .../open-policy-agent/opa/util/close.go | 3 +- .../open-policy-agent/opa/util/compare.go | 1 - .../open-policy-agent/opa/util/json.go | 27 +- .../open-policy-agent/opa/version/version.go | 24 +- .../opa/version/version_go1.18.go | 25 - .../image-spec/specs-go/v1/annotations.go | 9 - .../image-spec/specs-go/v1/artifact.go | 34 - .../image-spec/specs-go/v1/config.go | 29 +- .../image-spec/specs-go/v1/descriptor.go | 10 +- .../image-spec/specs-go/v1/index.go | 6 + .../image-spec/specs-go/v1/manifest.go | 3 + .../image-spec/specs-go/v1/mediatype.go | 19 +- .../image-spec/specs-go/version.go | 2 +- .../outcaste-io/ristretto/.deepsource.toml | 17 + .../github.com/outcaste-io/ristretto/.mailmap | 1 + .../outcaste-io/ristretto/CHANGELOG.md | 172 + .../github.com/outcaste-io/ristretto/LICENSE | 176 + .../outcaste-io/ristretto/README.md | 237 + .../github.com/outcaste-io/ristretto/cache.go | 520 + .../outcaste-io/ristretto/metrics.go | 249 + .../outcaste-io/ristretto/policy.go | 388 + .../github.com/outcaste-io/ristretto/ring.go | 91 + .../outcaste-io/ristretto/sketch.go | 155 + .../github.com/outcaste-io/ristretto/store.go | 225 + .../github.com/outcaste-io/ristretto/test.sh | 20 + .../github.com/outcaste-io/ristretto/ttl.go | 155 + .../outcaste-io/ristretto/z/LICENSE | 64 + .../outcaste-io/ristretto/z/README.md | 129 + .../outcaste-io/ristretto/z/allocator.go | 403 + .../outcaste-io/ristretto/z/bbloom.go | 209 + .../outcaste-io/ristretto/z/btree.go | 710 + .../outcaste-io/ristretto/z/buffer.go | 543 + .../outcaste-io/ristretto/z/calloc.go | 42 + .../outcaste-io/ristretto/z/calloc_32bit.go | 14 + .../outcaste-io/ristretto/z/calloc_64bit.go | 14 + .../ristretto/z/calloc_jemalloc.go | 173 + .../ristretto/z/calloc_nojemalloc.go | 37 + .../outcaste-io/ristretto/z/file.go | 217 + .../outcaste-io/ristretto/z/file_default.go | 39 + .../outcaste-io/ristretto/z/file_linux.go | 37 + .../outcaste-io/ristretto/z/flags.go | 310 + .../outcaste-io/ristretto/z/histogram.go | 205 + .../outcaste-io/ristretto/z/mmap.go | 44 + .../outcaste-io/ristretto/z/mmap_darwin.go | 59 + .../outcaste-io/ristretto/z/mmap_linux.go | 97 + .../outcaste-io/ristretto/z/mmap_plan9.go | 44 + .../outcaste-io/ristretto/z/mmap_unix.go | 55 + .../outcaste-io/ristretto/z/mmap_windows.go | 95 + .../outcaste-io/ristretto/z/rtutil.go | 75 + .../outcaste-io/ristretto/z/rtutil.s | 0 .../outcaste-io/ristretto/z/simd/baseline.go | 127 + .../outcaste-io/ristretto/z/simd/search.go | 51 + .../ristretto/z/simd/search_amd64.s | 60 + .../ristretto/z/simd/stub_search_amd64.go | 6 + .../github.com/outcaste-io/ristretto/z/z.go | 163 + vendor/github.com/pborman/uuid/.travis.yml | 10 + .../github.com/pborman/uuid/CONTRIBUTING.md | 10 + vendor/github.com/pborman/uuid/CONTRIBUTORS | 1 + vendor/github.com/pborman/uuid/LICENSE | 27 + vendor/github.com/pborman/uuid/README.md | 15 + vendor/github.com/pborman/uuid/dce.go | 84 + vendor/github.com/pborman/uuid/doc.go | 13 + vendor/github.com/pborman/uuid/hash.go | 53 + vendor/github.com/pborman/uuid/marshal.go | 85 + vendor/github.com/pborman/uuid/node.go | 50 + vendor/github.com/pborman/uuid/sql.go | 68 + vendor/github.com/pborman/uuid/time.go | 57 + vendor/github.com/pborman/uuid/util.go | 32 + vendor/github.com/pborman/uuid/uuid.go | 162 + vendor/github.com/pborman/uuid/version1.go | 23 + vendor/github.com/pborman/uuid/version4.go | 26 + .../github.com/pelletier/go-toml/v2/README.md | 2 +- vendor/github.com/pelletier/go-toml/v2/ci.sh | 2 +- .../pelletier/go-toml/v2/marshaler.go | 26 +- .../pelletier/go-toml/v2/unmarshaler.go | 75 +- .../pelletier/go-toml/v2/unstable/ast.go | 2 +- .../pelletier/go-toml/v2/unstable/parser.go | 134 +- .../pelletier/go-toml/v2/unstable/scanner.go | 1 - vendor/github.com/philhofer/fwd/LICENSE.md | 7 + vendor/github.com/philhofer/fwd/README.md | 359 + vendor/github.com/philhofer/fwd/reader.go | 383 + vendor/github.com/philhofer/fwd/writer.go | 236 + .../philhofer/fwd/writer_appengine.go | 6 + .../github.com/philhofer/fwd/writer_tinygo.go | 19 + .../github.com/philhofer/fwd/writer_unsafe.go | 20 + vendor/github.com/pmezard/go-difflib/LICENSE | 27 - .../pmezard/go-difflib/difflib/difflib.go | 772 - .../client_golang/prometheus/counter.go | 26 +- .../client_golang/prometheus/desc.go | 46 +- .../client_golang/prometheus/doc.go | 44 +- .../client_golang/prometheus/gauge.go | 26 +- .../prometheus/go_collector_latest.go | 7 +- .../client_golang/prometheus/histogram.go | 61 +- .../client_golang/prometheus/labels.go | 72 + .../client_golang/prometheus/metric.go | 6 +- .../client_golang/prometheus/promhttp/http.go | 19 +- .../prometheus/promhttp/instrument_client.go | 26 +- .../prometheus/promhttp/instrument_server.go | 101 +- .../prometheus/promhttp/option.go | 38 +- .../client_golang/prometheus/registry.go | 17 +- .../client_golang/prometheus/summary.go | 39 +- .../client_golang/prometheus/timer.go | 28 +- .../client_golang/prometheus/value.go | 10 +- .../client_golang/prometheus/vec.go | 79 +- .../client_golang/prometheus/vnext.go | 23 + .../client_golang/prometheus/wrap.go | 8 +- .../prometheus/client_model/go/metrics.pb.go | 1530 +- .../prometheus/common/expfmt/decode.go | 39 +- .../prometheus/common/expfmt/encode.go | 13 +- .../prometheus/common/expfmt/expfmt.go | 26 +- .../prometheus/common/expfmt/text_parse.go | 12 +- .../prometheus/common/model/time.go | 89 +- .../prometheus/common/model/value.go | 246 +- .../prometheus/common/model/value_float.go | 100 + .../common/model/value_histogram.go | 178 + .../prometheus/common/model/value_type.go | 83 + .../prometheus/procfs/Makefile.common | 16 +- vendor/github.com/prometheus/procfs/fs.go | 9 +- .../prometheus/procfs/fs_statfs_notype.go | 23 + .../prometheus/procfs/fs_statfs_type.go | 33 + .../prometheus/procfs/internal/util/parse.go | 15 + .../prometheus/procfs/mountstats.go | 6 +- .../prometheus/procfs/net_conntrackstat.go | 88 +- .../prometheus/procfs/net_softnet.go | 5 + .../prometheus/procfs/net_wireless.go | 182 + .../github.com/prometheus/procfs/netstat.go | 25 +- vendor/github.com/prometheus/procfs/proc.go | 22 +- .../github.com/prometheus/procfs/proc_stat.go | 6 +- .../prometheus/procfs/proc_status.go | 32 + vendor/github.com/prometheus/procfs/thread.go | 9 +- .../protocolbuffers/txtpbfmt/ast/ast.go | 125 +- .../protocolbuffers/txtpbfmt/parser/parser.go | 900 +- .../txtpbfmt/unquote/unquote.go | 44 +- .../github.com/puzpuzpuz/xsync/v2/.gitignore | 15 + .../puzpuzpuz/xsync/v2/BENCHMARKS.md | 131 + vendor/github.com/puzpuzpuz/xsync/v2/LICENSE | 21 + .../github.com/puzpuzpuz/xsync/v2/README.md | 138 + .../github.com/puzpuzpuz/xsync/v2/counter.go | 99 + vendor/github.com/puzpuzpuz/xsync/v2/map.go | 785 + vendor/github.com/puzpuzpuz/xsync/v2/mapof.go | 688 + .../puzpuzpuz/xsync/v2/mpmcqueue.go | 137 + .../github.com/puzpuzpuz/xsync/v2/rbmutex.go | 145 + vendor/github.com/puzpuzpuz/xsync/v2/util.go | 55 + .../puzpuzpuz/xsync/v2/util_mapof.go | 22 + .../russross/blackfriday/v2/.gitignore | 8 - .../russross/blackfriday/v2/.travis.yml | 17 - .../russross/blackfriday/v2/LICENSE.txt | 29 - .../russross/blackfriday/v2/README.md | 335 - .../russross/blackfriday/v2/block.go | 1612 - .../github.com/russross/blackfriday/v2/doc.go | 46 - .../russross/blackfriday/v2/entities.go | 2236 -- .../github.com/russross/blackfriday/v2/esc.go | 70 - .../russross/blackfriday/v2/html.go | 952 - .../russross/blackfriday/v2/inline.go | 1228 - .../russross/blackfriday/v2/markdown.go | 950 - .../russross/blackfriday/v2/node.go | 360 - .../russross/blackfriday/v2/smartypants.go | 457 - .../sassoftware/relic/lib/pkcs7/attributes.go | 59 +- .../sassoftware/relic/lib/pkcs7/builder.go | 2 +- .../sassoftware/relic/lib/pkcs7/marshal.go | 69 +- .../sassoftware/relic/lib/pkcs7/structs.go | 6 +- .../sassoftware/relic/lib/pkcs7/verify.go | 52 +- .../relic/lib/x509tools/certpool.go | 13 +- .../sassoftware/relic/lib/x509tools/names.go | 161 +- .../sassoftware/relic/lib/x509tools/pkix.go | 4 +- .../relic/lib/x509tools/x509cmd.go | 6 +- .../relic/signers/sigerrors/errors.go | 53 - .../cjson/canonicaljson.go | 46 +- .../go-securesystemslib/dsse/envelope.go | 64 + .../go-securesystemslib/dsse/sign.go | 137 +- .../dsse/signerverifier.go | 43 + .../go-securesystemslib/dsse/verify.go | 26 +- .../encrypted/encrypted.go | 290 + .../signerverifier/ecdsa.go | 111 + .../signerverifier/ed25519.go | 98 + .../go-securesystemslib/signerverifier/rsa.go | 141 + .../signerverifier/signerverifier.go | 34 + .../signerverifier/utils.go | 150 + vendor/github.com/segmentio/asm/LICENSE | 21 + .../github.com/segmentio/asm/base64/base64.go | 67 + .../segmentio/asm/base64/base64_amd64.go | 78 + .../segmentio/asm/base64/base64_arm64.go | 42 + .../segmentio/asm/base64/base64_asm.go | 94 + .../segmentio/asm/base64/base64_default.go | 14 + .../segmentio/asm/base64/decode_amd64.go | 9 + .../segmentio/asm/base64/decode_amd64.s | 143 + .../segmentio/asm/base64/decode_arm64.go | 7 + .../segmentio/asm/base64/decode_arm64.s | 203 + .../segmentio/asm/base64/encode_amd64.go | 7 + .../segmentio/asm/base64/encode_amd64.s | 87 + .../segmentio/asm/base64/encode_arm64.go | 6 + .../segmentio/asm/base64/encode_arm64.s | 97 + .../github.com/segmentio/asm/cpu/arm/arm.go | 80 + .../segmentio/asm/cpu/arm64/arm64.go | 74 + vendor/github.com/segmentio/asm/cpu/cpu.go | 22 + .../segmentio/asm/cpu/cpuid/cpuid.go | 32 + .../github.com/segmentio/asm/cpu/x86/x86.go | 76 + .../asm/internal/unsafebytes/unsafebytes.go | 20 + vendor/github.com/sigstore/cosign/LICENSE | 201 - .../cosign/cmd/cosign/cli/fulcio/fulcio.go | 212 - .../cli/fulcio/fulcioverifier/ctl/verify.go | 197 - .../fulcio/fulcioverifier/fulcioverifier.go | 41 - .../cmd/cosign/cli/options/annotations.go | 53 - .../cmd/cosign/cli/options/attest_blob.go | 49 - .../cmd/cosign/cli/options/certificate.go | 80 - .../cosign/cmd/cosign/cli/options/clean.go | 32 - .../cosign/cmd/cosign/cli/options/download.go | 31 - .../cosign/cmd/cosign/cli/options/fulcio.go | 44 - .../cosign/cli/options/generate_key_pair.go | 34 - .../cosign/cmd/cosign/cli/options/key.go | 45 - .../cosign/cmd/cosign/cli/options/load.go | 35 - .../cosign/cmd/cosign/cli/options/oidc.go | 77 - .../cosign/cmd/cosign/cli/options/policy.go | 87 - .../cosign/cmd/cosign/cli/options/registry.go | 101 - .../cosign/cmd/cosign/cli/options/rekor.go | 35 - .../cosign/cmd/cosign/cli/options/root.go | 47 - .../cosign/cmd/cosign/cli/options/sign.go | 101 - .../cosign/cmd/cosign/cli/options/signblob.go | 73 - .../cosign/cmd/cosign/cli/options/verify.go | 176 - .../cosign/cmd/cosign/cli/rekor/rekor.go | 30 - .../cosign/cmd/cosign/cli/sign/sign.go | 530 - .../cosign/cmd/cosign/cli/sign/sign_blob.go | 132 - .../cosign/cmd/cosign/cli/verify/verify.go | 399 - .../cosign/cli/verify/verify_attestation.go | 261 - .../cmd/cosign/cli/verify/verify_blob.go | 707 - .../cli/verify/verify_blob_attestation.go | 173 - .../cosign/internal/pkg/cosign/common.go | 28 - .../cosign/internal/pkg/cosign/dsse.go | 30 - .../internal/pkg/cosign/fulcio/signer.go | 60 - .../internal/pkg/cosign/payload/signer.go | 114 - .../internal/pkg/cosign/rekor/signer.go | 113 - .../cosign/internal/pkg/cosign/sign.go | 29 - .../sigstore/cosign/pkg/blob/load.go | 71 - .../pkg/cosign/attestation/attestation.go | 285 - .../cosign/pkg/cosign/certextensions.go | 195 - .../sigstore/cosign/pkg/cosign/common.go | 78 - .../sigstore/cosign/pkg/cosign/errors.go | 50 - .../sigstore/cosign/pkg/cosign/fetch.go | 161 - .../cosign/pkg/cosign/git/github/github.go | 166 - .../sigstore/cosign/pkg/cosign/keys.go | 230 - .../cosign/pkg/cosign/pivkey/disabled.go | 89 - .../cosign/pkg/cosign/pkcs11key/disabled.go | 69 - .../cosign/pkg/cosign/pkcs11key/util.go | 248 - .../sigstore/cosign/pkg/cosign/rego/rego.go | 119 - .../cosign/pkg/cosign/remote/index.go | 161 - .../cosign/pkg/cosign/remote/remote.go | 178 - .../sigstore/cosign/pkg/cosign/tlog.go | 492 - .../sigstore/cosign/pkg/cosign/verify.go | 1104 - .../sigstore/cosign/pkg/oci/interface.go | 31 - .../pkg/oci/internal/signature/layer.go | 117 - .../sigstore/cosign/pkg/oci/layout/index.go | 154 - .../cosign/pkg/oci/layout/signatures.go | 45 - .../sigstore/cosign/pkg/oci/layout/write.go | 93 - .../sigstore/cosign/pkg/oci/mediatypes.go | 32 - .../sigstore/cosign/pkg/oci/mutate/map.go | 171 - .../sigstore/cosign/pkg/oci/mutate/options.go | 107 - .../cosign/pkg/oci/mutate/signature.go | 193 - .../cosign/pkg/oci/mutate/signatures.go | 104 - .../sigstore/cosign/pkg/oci/remote/image.go | 66 - .../sigstore/cosign/pkg/oci/remote/index.go | 94 - .../sigstore/cosign/pkg/oci/remote/options.go | 136 - .../sigstore/cosign/pkg/oci/remote/remote.go | 195 - .../cosign/pkg/oci/remote/signatures.go | 70 - .../sigstore/cosign/pkg/oci/remote/write.go | 129 - .../sigstore/cosign/pkg/oci/signatures.go | 62 - .../sigstore/cosign/pkg/oci/signed/image.go | 53 - .../sigstore/cosign/pkg/oci/signed/index.go | 74 - .../sigstore/cosign/pkg/oci/static/file.go | 83 - .../sigstore/cosign/pkg/oci/static/options.go | 99 - .../cosign/pkg/oci/static/signature.go | 195 - .../sigstore/cosign/pkg/oci/walk/walk.go | 41 - .../sigstore/cosign/pkg/policy/attestation.go | 143 - .../sigstore/cosign/pkg/policy/eval.go | 80 - .../sigstore/cosign/pkg/providers/all/all.go | 33 - .../cosign/pkg/providers/github/github.go | 76 - .../cosign/pkg/providers/google/google.go | 98 - .../cosign/pkg/providers/interface.go | 97 - .../sigstore/cosign/pkg/signature/keys.go | 251 - .../sigstore/cosign/{ => v2}/COPYRIGHT.txt | 0 .../udpa/go => sigstore/cosign/v2}/LICENSE | 0 .../cosign/v2/cmd/cosign/cli/fulcio/fulcio.go | 216 + .../fulcio/fulcioverifier/fulcioverifier.go | 48 + .../v2/cmd/cosign/cli/generate/generate.go | 54 + .../cosign/cli/generate/generate_key_pair.go | 147 + .../v2/cmd/cosign/cli/options/annotations.go | 53 + .../{ => v2}/cmd/cosign/cli/options/attach.go | 36 +- .../{ => v2}/cmd/cosign/cli/options/attest.go | 14 +- .../v2/cmd/cosign/cli/options/attest_blob.go | 101 + .../v2/cmd/cosign/cli/options/certificate.go | 101 + .../cosign/v2/cmd/cosign/cli/options/clean.go | 71 + .../{ => v2}/cmd/cosign/cli/options/copy.go | 0 .../v2/cmd/cosign/cli/options/download.go | 46 + .../cosign/v2/cmd/cosign/cli/options/env.go | 37 + .../{ => v2}/cmd/cosign/cli/options/errors.go | 0 .../cmd/cosign/cli/options/experimental.go | 7 +- .../{ => v2}/cmd/cosign/cli/options/files.go | 2 +- .../{ => v2}/cmd/cosign/cli/options/flags.go | 0 .../v2/cmd/cosign/cli/options/fulcio.go | 44 + .../cmd/cosign/cli/options/generate.go | 0 .../cosign/cli/options/generate_key_pair.go | 37 + .../cmd/cosign/cli/options/import_key_pair.go | 9 +- .../cmd/cosign/cli/options/initialize.go | 2 +- .../cosign/v2/cmd/cosign/cli/options/key.go | 55 + .../cosign/v2/cmd/cosign/cli/options/load.go | 37 + .../cosign/v2/cmd/cosign/cli/options/oidc.go | 77 + .../cmd/cosign/cli/options/options.go | 0 .../cmd/cosign/cli/options/piv_tool.go | 0 .../cmd/cosign/cli/options/pkcs11_tool.go | 6 +- .../cmd/cosign/cli/options/predicate.go | 3 +- .../cmd/cosign/cli/options/public_key.go | 0 .../cmd/cosign/cli/options/reference.go | 0 .../v2/cmd/cosign/cli/options/registry.go | 181 + .../cosign/v2/cmd/cosign/cli/options/rekor.go | 35 + .../cosign/v2/cmd/cosign/cli/options/root.go | 97 + .../{ => v2}/cmd/cosign/cli/options/save.go | 0 .../cmd/cosign/cli/options/security_key.go | 0 .../cosign/v2/cmd/cosign/cli/options/sign.go | 133 + .../cosign/cli/options/signature_digest.go | 0 .../v2/cmd/cosign/cli/options/signblob.go | 105 + .../{ => v2}/cmd/cosign/cli/options/tree.go | 0 .../cmd/cosign/cli/options/triangulate.go | 0 .../{ => v2}/cmd/cosign/cli/options/upload.go | 0 .../cmd/cosign/cli/options/useragent.go | 0 .../v2/cmd/cosign/cli/options/verify.go | 238 + .../cosign/v2/cmd/cosign/cli/rekor/rekor.go | 30 + .../v2/cmd/cosign/cli/sign/privacy/privacy.go | 33 + .../cosign/v2/cmd/cosign/cli/sign/sign.go | 593 + .../v2/cmd/cosign/cli/sign/sign_blob.go | 205 + .../cosign/v2/cmd/cosign/cli/verify/verify.go | 497 + .../cosign/cli/verify/verify_attestation.go | 331 + .../v2/cmd/cosign/cli/verify/verify_blob.go | 349 + .../cli/verify/verify_blob_attestation.go | 349 + .../cosign/v2/cmd/cosign/errors/error_wrap.go | 29 + .../cosign/v2/cmd/cosign/errors/errors.go | 40 + .../v2/cmd/cosign/errors/exit_code_lookup.go | 64 + .../cosign/v2/cmd/cosign/errors/exit_codes.go | 38 + .../v2/cmd/cosign/errors/generate_docs.go | 106 + .../cosign/v2/internal/pkg/cosign/common.go | 68 + .../cosign/v2/internal/pkg/cosign/dsse.go | 30 + .../cosign/fulcio/fulcioroots/fulcioroots.go | 5 +- .../v2/internal/pkg/cosign/fulcio/signer.go | 60 + .../internal/pkg/cosign/payload/attestor.go | 8 +- .../v2/internal/pkg/cosign/payload/signer.go | 114 + .../v2/internal/pkg/cosign/rekor/signer.go | 118 + .../cosign/v2/internal/pkg/cosign/sign.go | 29 + .../internal/pkg/cosign/tsa/client/client.go | 177 + .../v2/internal/pkg/cosign/tsa/signer.go | 114 + .../v2/internal/pkg/cosign/tsa/utils.go | 46 + .../v2/internal/pkg/oci/remote/remote.go | 25 + .../sigstore/cosign/v2/internal/ui/env.go | 89 + .../sigstore/cosign/v2/internal/ui/log.go | 41 + .../sigstore/cosign/v2/internal/ui/prompt.go | 74 + .../cosign/v2/internal/ui/warnings.go | 22 + .../sigstore/cosign/v2/pkg/blob/load.go | 74 + .../v2/pkg/cosign/attestation/attestation.go | 281 + .../{ => v2}/pkg/cosign/bundle/rekor.go | 0 .../cosign/v2/pkg/cosign/bundle/tsa.go | 34 + .../cosign/v2/pkg/cosign/certextensions.go | 86 + .../sigstore/cosign/v2/pkg/cosign/common.go | 59 + .../sigstore/cosign/v2/pkg/cosign/ctlog.go | 68 + .../cosign/{ => v2}/pkg/cosign/cue/cue.go | 0 .../sigstore/cosign/v2/pkg/cosign/env/env.go | 241 + .../sigstore/cosign/v2/pkg/cosign/errors.go | 120 + .../sigstore/cosign/v2/pkg/cosign/fetch.go | 209 + .../cosign}/fulcioverifier/ctutil/ctutil.go | 10 - .../cosign/{ => v2}/pkg/cosign/git/git.go | 6 +- .../cosign/v2/pkg/cosign/git/github/github.go | 177 + .../{ => v2}/pkg/cosign/git/gitlab/gitlab.go | 28 +- .../sigstore/cosign/v2/pkg/cosign/keys.go | 237 + .../{ => v2}/pkg/cosign/kubernetes/client.go | 0 .../{ => v2}/pkg/cosign/kubernetes/secret.go | 2 +- .../sigstore/cosign/v2/pkg/cosign/obsolete.go | 37 + .../cosign/v2/pkg/cosign/pivkey/disabled.go | 89 + .../{ => v2}/pkg/cosign/pivkey/pivkey.go | 0 .../cosign/{ => v2}/pkg/cosign/pivkey/util.go | 0 .../v2/pkg/cosign/pkcs11key/disabled.go | 69 + .../pkg/cosign/pkcs11key/pkcs11key.go | 3 +- .../cosign/v2/pkg/cosign/pkcs11key/util.go | 249 + .../cosign/v2/pkg/cosign/rego/rego.go | 158 + .../{ => v2}/pkg/cosign/rekor_factory.go | 0 .../cosign/v2/pkg/cosign/remote/index.go | 161 + .../cosign/v2/pkg/cosign/remote/remote.go | 178 + .../sigstore/cosign/v2/pkg/cosign/tlog.go | 517 + .../cosign/{ => v2}/pkg/cosign/verifiers.go | 2 +- .../sigstore/cosign/v2/pkg/cosign/verify.go | 1392 + .../cosign/v2/pkg/cosign/verify_sct.go | 157 + .../sigstore/cosign/{ => v2}/pkg/oci/doc.go | 0 .../cosign/{ => v2}/pkg/oci/empty/empty.go | 2 +- .../cosign/{ => v2}/pkg/oci/empty/signed.go | 4 +- .../sigstore/cosign/{ => v2}/pkg/oci/file.go | 0 .../sigstore/cosign/{ => v2}/pkg/oci/image.go | 0 .../sigstore/cosign/{ => v2}/pkg/oci/index.go | 0 .../sigstore/cosign/v2/pkg/oci/interface.go | 36 + .../v2/pkg/oci/internal/signature/layer.go | 141 + .../cosign/v2/pkg/oci/layout/index.go | 154 + .../cosign/v2/pkg/oci/layout/signatures.go | 45 + .../cosign/v2/pkg/oci/layout/write.go | 93 + .../sigstore/cosign/v2/pkg/oci/mediatypes.go | 34 + .../sigstore/cosign/v2/pkg/oci/mutate/map.go | 171 + .../cosign/{ => v2}/pkg/oci/mutate/mutate.go | 119 +- .../cosign/v2/pkg/oci/mutate/options.go | 115 + .../cosign/v2/pkg/oci/mutate/signature.go | 216 + .../cosign/v2/pkg/oci/mutate/signatures.go | 96 + .../cosign/{ => v2}/pkg/oci/remote/digest.go | 0 .../cosign/v2/pkg/oci/remote/image.go | 66 + .../cosign/v2/pkg/oci/remote/index.go | 94 + .../cosign/v2/pkg/oci/remote/options.go | 144 + .../cosign/v2/pkg/oci/remote/referrers.go | 34 + .../cosign/v2/pkg/oci/remote/remote.go | 244 + .../cosign/v2/pkg/oci/remote/signatures.go | 70 + .../cosign/v2/pkg/oci/remote/unknown.go | 60 + .../cosign/v2/pkg/oci/remote/write.go | 223 + .../sigstore/cosign/v2/pkg/oci/signatures.go | 71 + .../cosign/v2/pkg/oci/signed/image.go | 53 + .../cosign/v2/pkg/oci/signed/index.go | 74 + .../sigstore/cosign/v2/pkg/oci/static/file.go | 77 + .../cosign/v2/pkg/oci/static/options.go | 114 + .../cosign/v2/pkg/oci/static/signature.go | 217 + .../sigstore/cosign/v2/pkg/oci/walk/walk.go | 41 + .../cosign/v2/pkg/policy/attestation.go | 152 + .../sigstore/cosign/v2/pkg/policy/errors.go | 27 + .../sigstore/cosign/v2/pkg/policy/eval.go | 78 + .../cosign/v2/pkg/providers/all/all.go | 40 + .../v2/pkg/providers/buildkite/buildkite.go | 71 + .../cosign/v2/pkg/providers/buildkite/doc.go | 15 + .../cosign/{ => v2}/pkg/providers/doc.go | 0 .../cosign/v2/pkg/providers/envvar/env.go | 42 + .../{ => v2}/pkg/providers/filesystem/doc.go | 0 .../pkg/providers/filesystem/filesystem.go | 6 +- .../{ => v2}/pkg/providers/github/doc.go | 0 .../cosign/v2/pkg/providers/github/github.go | 105 + .../{ => v2}/pkg/providers/google/doc.go | 0 .../cosign/v2/pkg/providers/google/google.go | 99 + .../cosign/v2/pkg/providers/interface.go | 105 + .../{ => v2}/pkg/providers/spiffe/doc.go | 0 .../{ => v2}/pkg/providers/spiffe/spiffe.go | 9 +- .../{ => v2}/pkg/signature/annotations.go | 0 .../sigstore/cosign/v2/pkg/signature/keys.go | 251 + .../cosign/{ => v2}/pkg/types/media.go | 2 +- .../cosign/{ => v2}/pkg/types/payload.go | 0 .../sigstore/rekor/pkg/client/options.go | 42 +- .../sigstore/rekor/pkg/client/rekor_client.go | 36 +- .../entries/create_log_entry_responses.go | 25 +- .../get_log_entry_by_index_responses.go | 20 +- .../get_log_entry_by_uuid_responses.go | 20 +- .../entries/search_log_query_responses.go | 94 +- .../generated/client/index/index_client.go | 6 +- .../client/index/search_index_responses.go | 20 +- .../client/pubkey/get_public_key_responses.go | 15 +- .../client/tlog/get_log_info_parameters.go | 49 +- .../client/tlog/get_log_info_responses.go | 15 +- .../client/tlog/get_log_proof_responses.go | 20 +- .../generated/models/alpine_v001_schema.go | 7 + .../pkg/generated/models/cose_v001_schema.go | 11 + .../rekor/pkg/generated/models/dsse.go | 210 + .../rekor/pkg/generated/models/dsse_schema.go | 29 + .../pkg/generated/models/dsse_v001_schema.go | 685 + .../models/hashedrekord_v001_schema.go | 12 + .../pkg/generated/models/helm_v001_schema.go | 13 + .../generated/models/intoto_v001_schema.go | 15 +- .../generated/models/intoto_v002_schema.go | 61 +- .../pkg/generated/models/jar_v001_schema.go | 12 + .../rekor/pkg/generated/models/log_entry.go | 15 + .../rekor/pkg/generated/models/log_info.go | 5 + .../pkg/generated/models/proposed_entry.go | 6 + .../pkg/generated/models/rekor_version.go | 138 - .../generated/models/rekord_v001_schema.go | 8 + .../generated/models/rfc3161_v001_schema.go | 1 + .../pkg/generated/models/rpm_v001_schema.go | 7 + .../pkg/generated/models/search_index.go | 9 +- .../pkg/generated/models/search_log_query.go | 4 + .../pkg/generated/models/tuf_v001_schema.go | 23 +- .../github.com/sigstore/rekor/pkg/log/log.go | 38 +- .../rekor/pkg/pki/minisign/minisign.go | 12 +- .../sigstore/rekor/pkg/pki/pgp/pgp.go | 17 +- .../sigstore/rekor/pkg/pki/pkcs7/pkcs7.go | 36 +- .../github.com/sigstore/rekor/pkg/pki/pki.go | 2 + .../sigstore/rekor/pkg/pki/ssh/ssh.go | 34 +- .../sigstore/rekor/pkg/pki/tuf/tuf.go | 33 +- .../sigstore/rekor/pkg/pki/x509/e2e.go | 193 + .../sigstore/rekor/pkg/pki/x509/x509.go | 45 +- .../sigstore/rekor/pkg/types/README.md | 4 +- .../sigstore/rekor/pkg/types/dsse/README.md | 25 + .../sigstore/rekor/pkg/types/dsse/dsse.go | 74 + .../rekor/pkg/types/dsse/dsse_schema.json | 12 + .../types/dsse/v0.0.1/dsse_v0_0_1_schema.json | 96 + .../rekor/pkg/types/dsse/v0.0.1/entry.go | 427 + .../sigstore/rekor/pkg/types/entries.go | 9 + .../pkg/types/hashedrekord/v0.0.1/entry.go | 39 +- .../rekor/pkg/types/intoto/v0.0.1/entry.go | 68 +- .../intoto/v0.0.1/intoto_v0_0_1_schema.json | 4 +- .../rekor/pkg/types/intoto/v0.0.2/entry.go | 508 + .../intoto/v0.0.2/intoto_v0_0_2_schema.json | 105 + .../rekor/pkg/types/rekord/v0.0.1/entry.go | 56 +- .../sigstore/rekor/pkg/types/test_util.go | 19 +- .../sigstore/rekor/pkg/util/checkpoint.go | 7 +- .../sigstore/rekor/pkg/util/pubkey.go | 44 - .../github.com/sigstore/rekor/pkg/util/sha.go | 20 +- .../sigstore/rekor/pkg/util/timestamp_note.go | 171 - .../sigstore/rekor/pkg/util/util.go | 446 + .../sigstore/rekor/pkg/util/validate.go | 68 - .../sigstore/pkg/cryptoutils/publickey.go | 2 +- .../sigstore/pkg/signature/dsse/adapters.go | 12 +- .../sigstore/pkg/signature/dsse/dsse.go | 6 +- .../sigstore/pkg/signature/dsse/multidsse.go | 17 +- .../sigstore/pkg/signature/options/noop.go | 16 +- .../sigstore/pkg/signature/payload/payload.go | 23 +- .../sigstore/sigstore/pkg/tuf/client.go | 54 +- .../sigstore/sigstore/pkg/tuf/policy.go | 204 - .../sigstore/pkg/tuf/repository/root.json | 144 +- .../pkg/tuf/repository/targets/ctfe_2022.pub | 4 + .../targets/fulcio_intermediate_v1.crt.pem | 14 + .../pkg/tuf/repository/targets/rekor.0.pub | 4 - .../pkg/tuf/repository/targets/rekor.json | 23 - .../tuf/repository/targets/trusted_root.json | 114 + .../sigstore/sigstore/pkg/tuf/signer.go | 48 - .../timestamp-authority/CONTRIBUTORS.md | 116 + .../timestamp-authority/COPYRIGHT.txt | 13 + .../sigstore/timestamp-authority/LICENSE | 201 + .../pkg/verification/verify.go | 303 + .../pkg/verification/verify_request.go | 32 + vendor/github.com/sirupsen/logrus/README.md | 8 +- vendor/github.com/sirupsen/logrus/writer.go | 34 +- vendor/github.com/soheilhy/cmux/.travis.yml | 29 - vendor/github.com/soheilhy/cmux/CONTRIBUTORS | 12 - vendor/github.com/soheilhy/cmux/LICENSE | 202 - vendor/github.com/soheilhy/cmux/README.md | 83 - vendor/github.com/soheilhy/cmux/buffer.go | 67 - vendor/github.com/soheilhy/cmux/cmux.go | 307 - vendor/github.com/soheilhy/cmux/doc.go | 18 - vendor/github.com/soheilhy/cmux/matchers.go | 267 - vendor/github.com/soheilhy/cmux/patricia.go | 179 - vendor/github.com/spf13/afero/afero.go | 2 +- vendor/github.com/spf13/afero/basepath.go | 1 - .../github.com/spf13/afero/copyOnWriteFs.go | 9 +- vendor/github.com/spf13/afero/ioutil.go | 11 +- vendor/github.com/spf13/afero/mem/file.go | 7 +- vendor/github.com/spf13/afero/memmap.go | 21 +- vendor/github.com/spf13/afero/regexpfs.go | 1 - vendor/github.com/spf13/afero/symlink.go | 6 +- vendor/github.com/spf13/afero/unionFile.go | 7 +- vendor/github.com/spf13/afero/util.go | 7 +- vendor/github.com/spf13/cast/README.md | 12 +- vendor/github.com/spf13/cast/caste.go | 32 +- vendor/github.com/spf13/viper/.golangci.yaml | 8 +- vendor/github.com/spf13/viper/Makefile | 4 +- vendor/github.com/spf13/viper/README.md | 3 + vendor/github.com/spf13/viper/util.go | 5 + vendor/github.com/spf13/viper/viper.go | 61 +- .../go-spiffe/v2/bundle/jwtbundle/bundle.go | 2 +- .../v2/bundle/spiffebundle/bundle.go | 2 +- .../v2/proto/spiffe/workload/workload.pb.go | 169 +- .../v2/proto/spiffe/workload/workload.proto | 12 + .../spiffe/go-spiffe/v2/spiffeid/path.go | 12 +- .../go-spiffe/v2/spiffeid/trustdomain.go | 7 +- .../spiffe/go-spiffe/v2/svid/jwtsvid/svid.go | 7 +- .../spiffe/go-spiffe/v2/svid/x509svid/svid.go | 4 + .../spiffe/go-spiffe/v2/workloadapi/client.go | 23 +- vendor/github.com/stretchr/testify/LICENSE | 21 - .../testify/assert/assertion_compare.go | 458 - .../assert/assertion_compare_can_convert.go | 16 - .../assert/assertion_compare_legacy.go | 16 - .../testify/assert/assertion_format.go | 763 - .../testify/assert/assertion_format.go.tmpl | 5 - .../testify/assert/assertion_forward.go | 1514 - .../testify/assert/assertion_forward.go.tmpl | 5 - .../testify/assert/assertion_order.go | 81 - .../stretchr/testify/assert/assertions.go | 1856 -- .../github.com/stretchr/testify/assert/doc.go | 45 - .../stretchr/testify/assert/errors.go | 10 - .../testify/assert/forward_assertions.go | 16 - .../testify/assert/http_assertions.go | 162 - .../tent/canonical-json-go/.travis.yml | 4 - .../github.com/tent/canonical-json-go/LICENSE | 27 - .../tent/canonical-json-go/encode.go | 620 - .../theupdateframework/go-tuf/.golangci.yml | 6 - .../theupdateframework/go-tuf/README.md | 9 +- .../theupdateframework/go-tuf/data/types.go | 9 +- .../go-tuf/encrypted/encrypted.go | 106 +- .../theupdateframework/go-tuf/local_store.go | 2 +- .../pkg/deprecated/set_ecdsa/set_ecdsa.go | 23 - .../go-tuf/pkg/keys/ecdsa.go | 2 + .../theupdateframework/go-tuf/repo.go | 41 +- .../go-tuf/requirements-test.txt | 8 +- .../theupdateframework/go-tuf/sign/sign.go | 61 +- vendor/github.com/tinylib/msgp/LICENSE | 8 + .../tinylib/msgp/msgp/advise_linux.go | 25 + .../tinylib/msgp/msgp/advise_other.go | 18 + .../github.com/tinylib/msgp/msgp/circular.go | 39 + vendor/github.com/tinylib/msgp/msgp/defs.go | 147 + vendor/github.com/tinylib/msgp/msgp/edit.go | 242 + vendor/github.com/tinylib/msgp/msgp/elsize.go | 128 + .../tinylib/msgp/msgp/elsize_default.go | 21 + .../tinylib/msgp/msgp/elsize_tinygo.go | 13 + vendor/github.com/tinylib/msgp/msgp/errors.go | 359 + .../tinylib/msgp/msgp/errors_default.go | 25 + .../tinylib/msgp/msgp/errors_tinygo.go | 42 + .../github.com/tinylib/msgp/msgp/extension.go | 550 + vendor/github.com/tinylib/msgp/msgp/file.go | 93 + .../github.com/tinylib/msgp/msgp/file_port.go | 48 + .../github.com/tinylib/msgp/msgp/integers.go | 174 + vendor/github.com/tinylib/msgp/msgp/json.go | 568 + .../tinylib/msgp/msgp/json_bytes.go | 341 + vendor/github.com/tinylib/msgp/msgp/number.go | 266 + vendor/github.com/tinylib/msgp/msgp/purego.go | 16 + vendor/github.com/tinylib/msgp/msgp/read.go | 1374 + .../tinylib/msgp/msgp/read_bytes.go | 1303 + vendor/github.com/tinylib/msgp/msgp/size.go | 39 + vendor/github.com/tinylib/msgp/msgp/unsafe.go | 37 + vendor/github.com/tinylib/msgp/msgp/write.go | 813 + .../tinylib/msgp/msgp/write_bytes.go | 436 + .../tmc/grpc-websocket-proxy/LICENSE | 7 - .../tmc/grpc-websocket-proxy/wsproxy/doc.go | 2 - .../wsproxy/websocket_proxy.go | 350 - .../transparency-dev/merkle/.golangci.yaml | 11 + .../transparency-dev/merkle/CHANGELOG.md | 10 + .../transparency-dev/merkle/CODEOWNERS | 1 + .../transparency-dev/merkle/cloudbuild.yaml | 26 + .../transparency-dev/merkle/compact/nodes.go | 10 +- .../transparency-dev/merkle/compact/range.go | 6 +- vendor/github.com/urfave/cli/.flake8 | 2 - vendor/github.com/urfave/cli/.gitignore | 5 - .../github.com/urfave/cli/CODE_OF_CONDUCT.md | 74 - vendor/github.com/urfave/cli/LICENSE | 21 - vendor/github.com/urfave/cli/README.md | 70 - vendor/github.com/urfave/cli/app.go | 531 - vendor/github.com/urfave/cli/appveyor.yml | 28 - vendor/github.com/urfave/cli/category.go | 44 - vendor/github.com/urfave/cli/cli.go | 22 - vendor/github.com/urfave/cli/command.go | 384 - vendor/github.com/urfave/cli/context.go | 348 - vendor/github.com/urfave/cli/docs.go | 148 - vendor/github.com/urfave/cli/errors.go | 115 - vendor/github.com/urfave/cli/fish.go | 194 - vendor/github.com/urfave/cli/flag.go | 348 - vendor/github.com/urfave/cli/flag_bool.go | 109 - vendor/github.com/urfave/cli/flag_bool_t.go | 110 - vendor/github.com/urfave/cli/flag_duration.go | 106 - vendor/github.com/urfave/cli/flag_float64.go | 106 - vendor/github.com/urfave/cli/flag_generic.go | 110 - vendor/github.com/urfave/cli/flag_int.go | 105 - vendor/github.com/urfave/cli/flag_int64.go | 106 - .../github.com/urfave/cli/flag_int64_slice.go | 199 - .../github.com/urfave/cli/flag_int_slice.go | 198 - vendor/github.com/urfave/cli/flag_string.go | 98 - .../urfave/cli/flag_string_slice.go | 184 - vendor/github.com/urfave/cli/flag_uint.go | 106 - vendor/github.com/urfave/cli/flag_uint64.go | 106 - vendor/github.com/urfave/cli/funcs.go | 44 - vendor/github.com/urfave/cli/help.go | 363 - vendor/github.com/urfave/cli/parse.go | 94 - vendor/github.com/urfave/cli/sort.go | 29 - vendor/github.com/urfave/cli/template.go | 121 - .../vbatts/tar-split/archive/tar/reader.go | 12 +- vendor/github.com/xanzy/go-gitlab/.gitignore | 3 + .../github.com/xanzy/go-gitlab/.golangci.yml | 12 +- .../xanzy/go-gitlab/CONTRIBUTING.md | 52 + vendor/github.com/xanzy/go-gitlab/Makefile | 22 + vendor/github.com/xanzy/go-gitlab/README.md | 5 + .../xanzy/go-gitlab/access_requests.go | 36 +- .../xanzy/go-gitlab/applications.go | 12 +- .../xanzy/go-gitlab/audit_events.go | 24 +- .../xanzy/go-gitlab/award_emojis.go | 72 +- vendor/github.com/xanzy/go-gitlab/boards.go | 54 +- vendor/github.com/xanzy/go-gitlab/branches.go | 41 +- .../xanzy/go-gitlab/broadcast_messages.go | 80 +- .../xanzy/go-gitlab/ci_yml_templates.go | 27 +- .../xanzy/go-gitlab/client_options.go | 40 +- .../xanzy/go-gitlab/cluster_agents.go | 12 +- vendor/github.com/xanzy/go-gitlab/commits.go | 82 +- .../xanzy/go-gitlab/container_registry.go | 21 +- .../xanzy/go-gitlab/custom_attributes.go | 34 +- .../github.com/xanzy/go-gitlab/deploy_keys.go | 36 +- .../xanzy/go-gitlab/deploy_tokens.go | 40 +- .../github.com/xanzy/go-gitlab/deployments.go | 38 +- .../go-gitlab/deployments_merge_requests.go | 5 +- .../github.com/xanzy/go-gitlab/discussions.go | 184 +- .../xanzy/go-gitlab/dockerfile_templates.go | 93 + .../xanzy/go-gitlab/environments.go | 34 +- .../github.com/xanzy/go-gitlab/epic_issues.go | 8 +- vendor/github.com/xanzy/go-gitlab/epics.go | 11 +- .../xanzy/go-gitlab/error_tracking.go | 10 +- .../xanzy/go-gitlab/event_parsing.go | 94 +- .../xanzy/go-gitlab/event_systemhook_types.go | 21 +- .../xanzy/go-gitlab/event_webhook_types.go | 543 +- vendor/github.com/xanzy/go-gitlab/events.go | 109 +- .../xanzy/go-gitlab/external_status_checks.go | 4 +- .../xanzy/go-gitlab/feature_flags.go | 14 +- .../xanzy/go-gitlab/freeze_periods.go | 28 +- .../xanzy/go-gitlab/generic_packages.go | 2 +- .../github.com/xanzy/go-gitlab/geo_nodes.go | 14 +- .../xanzy/go-gitlab/gitignore_templates.go | 26 +- vendor/github.com/xanzy/go-gitlab/gitlab.go | 340 +- .../xanzy/go-gitlab/group_access_tokens.go | 6 +- .../xanzy/go-gitlab/group_badges.go | 19 +- .../xanzy/go-gitlab/group_boards.go | 52 +- .../xanzy/go-gitlab/group_clusters.go | 8 +- .../xanzy/go-gitlab/group_epic_boards.go | 104 + .../github.com/xanzy/go-gitlab/group_hooks.go | 23 +- .../xanzy/go-gitlab/group_import_export.go | 10 +- .../xanzy/go-gitlab/group_iterations.go | 2 +- .../xanzy/go-gitlab/group_labels.go | 34 +- .../xanzy/go-gitlab/group_members.go | 66 +- .../xanzy/go-gitlab/group_milestones.go | 46 +- .../group_repository_storage_move.go | 195 + .../xanzy/go-gitlab/group_variables.go | 11 +- .../github.com/xanzy/go-gitlab/group_wikis.go | 8 +- vendor/github.com/xanzy/go-gitlab/groups.go | 175 +- .../xanzy/go-gitlab/instance_clusters.go | 8 +- .../xanzy/go-gitlab/instance_variables.go | 11 +- vendor/github.com/xanzy/go-gitlab/invites.go | 16 +- .../github.com/xanzy/go-gitlab/issue_links.go | 45 +- vendor/github.com/xanzy/go-gitlab/issues.go | 276 +- .../xanzy/go-gitlab/issues_statistics.go | 8 +- .../xanzy/go-gitlab/job_token_scope.go | 125 + vendor/github.com/xanzy/go-gitlab/jobs.go | 104 +- vendor/github.com/xanzy/go-gitlab/keys.go | 33 +- vendor/github.com/xanzy/go-gitlab/labels.go | 38 +- vendor/github.com/xanzy/go-gitlab/license.go | 24 +- .../xanzy/go-gitlab/license_templates.go | 16 +- .../go-gitlab/merge_request_approvals.go | 20 +- .../xanzy/go-gitlab/merge_requests.go | 117 +- vendor/github.com/xanzy/go-gitlab/metadata.go | 63 + .../github.com/xanzy/go-gitlab/milestones.go | 41 +- .../github.com/xanzy/go-gitlab/namespaces.go | 20 +- vendor/github.com/xanzy/go-gitlab/notes.go | 86 +- .../xanzy/go-gitlab/notifications.go | 30 +- vendor/github.com/xanzy/go-gitlab/packages.go | 36 +- .../xanzy/go-gitlab/pages_domains.go | 39 +- .../xanzy/go-gitlab/personal_access_tokens.go | 64 +- .../xanzy/go-gitlab/pipeline_schedules.go | 121 +- .../xanzy/go-gitlab/pipeline_triggers.go | 38 +- .../github.com/xanzy/go-gitlab/pipelines.go | 116 +- .../github.com/xanzy/go-gitlab/plan_limits.go | 4 +- .../xanzy/go-gitlab/project_access_tokens.go | 20 +- .../xanzy/go-gitlab/project_badges.go | 10 +- .../xanzy/go-gitlab/project_clusters.go | 8 +- .../xanzy/go-gitlab/project_feature_flags.go | 240 + .../xanzy/go-gitlab/project_import_export.go | 26 +- .../xanzy/go-gitlab/project_iterations.go | 6 +- .../go-gitlab/project_managed_licenses.go | 8 +- .../xanzy/go-gitlab/project_members.go | 36 +- .../xanzy/go-gitlab/project_mirror.go | 22 +- .../project_repository_storage_move.go | 199 + .../xanzy/go-gitlab/project_snippets.go | 51 +- .../xanzy/go-gitlab/project_templates.go | 110 + .../xanzy/go-gitlab/project_variables.go | 29 +- .../go-gitlab/project_vulnerabilities.go | 4 +- vendor/github.com/xanzy/go-gitlab/projects.go | 545 +- .../xanzy/go-gitlab/protected_branches.go | 90 +- .../xanzy/go-gitlab/protected_environments.go | 54 +- .../xanzy/go-gitlab/protected_tags.go | 24 +- .../xanzy/go-gitlab/releaselinks.go | 26 +- vendor/github.com/xanzy/go-gitlab/releases.go | 50 +- .../xanzy/go-gitlab/repositories.go | 129 +- .../xanzy/go-gitlab/repository_files.go | 46 +- .../xanzy/go-gitlab/repository_submodules.go | 2 +- .../xanzy/go-gitlab/request_options.go | 19 + .../xanzy/go-gitlab/resource_label_events.go | 12 +- .../go-gitlab/resource_milestone_events.go | 8 +- .../xanzy/go-gitlab/resource_state_events.go | 8 +- .../xanzy/go-gitlab/resource_weight_events.go | 80 + vendor/github.com/xanzy/go-gitlab/runners.go | 84 +- vendor/github.com/xanzy/go-gitlab/search.go | 53 +- vendor/github.com/xanzy/go-gitlab/services.go | 426 +- vendor/github.com/xanzy/go-gitlab/settings.go | 46 +- .../xanzy/go-gitlab/sidekiq_metrics.go | 26 +- .../snippet_repository_storage_move.go | 203 + vendor/github.com/xanzy/go-gitlab/snippets.go | 142 +- vendor/github.com/xanzy/go-gitlab/strings.go | 1 - .../xanzy/go-gitlab/system_hooks.go | 26 +- vendor/github.com/xanzy/go-gitlab/tags.go | 38 +- .../github.com/xanzy/go-gitlab/time_stats.go | 28 +- vendor/github.com/xanzy/go-gitlab/todos.go | 16 +- vendor/github.com/xanzy/go-gitlab/topics.go | 8 +- vendor/github.com/xanzy/go-gitlab/types.go | 89 +- vendor/github.com/xanzy/go-gitlab/users.go | 338 +- vendor/github.com/xanzy/go-gitlab/validate.go | 17 +- vendor/github.com/xanzy/go-gitlab/version.go | 8 +- vendor/github.com/xanzy/go-gitlab/wikis.go | 28 +- vendor/github.com/xiang90/probing/.gitignore | 24 - vendor/github.com/xiang90/probing/LICENSE | 22 - vendor/github.com/xiang90/probing/README.md | 39 - vendor/github.com/xiang90/probing/prober.go | 139 - vendor/github.com/xiang90/probing/server.go | 25 - vendor/github.com/xiang90/probing/status.go | 108 - .../yashtewari/glob-intersection/glob.go | 6 +- .../yashtewari/glob-intersection/non_empty.go | 17 +- vendor/go.etcd.io/bbolt/.gitignore | 7 - vendor/go.etcd.io/bbolt/.travis.yml | 18 - vendor/go.etcd.io/bbolt/LICENSE | 20 - vendor/go.etcd.io/bbolt/Makefile | 36 - vendor/go.etcd.io/bbolt/README.md | 958 - vendor/go.etcd.io/bbolt/bolt_386.go | 7 - vendor/go.etcd.io/bbolt/bolt_amd64.go | 7 - vendor/go.etcd.io/bbolt/bolt_arm.go | 7 - vendor/go.etcd.io/bbolt/bolt_arm64.go | 9 - vendor/go.etcd.io/bbolt/bolt_linux.go | 10 - vendor/go.etcd.io/bbolt/bolt_mips64x.go | 9 - vendor/go.etcd.io/bbolt/bolt_mipsx.go | 9 - vendor/go.etcd.io/bbolt/bolt_openbsd.go | 27 - vendor/go.etcd.io/bbolt/bolt_ppc.go | 9 - vendor/go.etcd.io/bbolt/bolt_ppc64.go | 9 - vendor/go.etcd.io/bbolt/bolt_ppc64le.go | 9 - vendor/go.etcd.io/bbolt/bolt_riscv64.go | 9 - vendor/go.etcd.io/bbolt/bolt_s390x.go | 9 - vendor/go.etcd.io/bbolt/bolt_unix.go | 86 - vendor/go.etcd.io/bbolt/bolt_unix_aix.go | 90 - vendor/go.etcd.io/bbolt/bolt_unix_solaris.go | 88 - vendor/go.etcd.io/bbolt/bolt_windows.go | 141 - vendor/go.etcd.io/bbolt/boltsync_unix.go | 8 - vendor/go.etcd.io/bbolt/bucket.go | 777 - vendor/go.etcd.io/bbolt/compact.go | 114 - vendor/go.etcd.io/bbolt/cursor.go | 396 - vendor/go.etcd.io/bbolt/db.go | 1232 - vendor/go.etcd.io/bbolt/doc.go | 44 - vendor/go.etcd.io/bbolt/errors.go | 71 - vendor/go.etcd.io/bbolt/freelist.go | 404 - vendor/go.etcd.io/bbolt/freelist_hmap.go | 178 - vendor/go.etcd.io/bbolt/mlock_unix.go | 36 - vendor/go.etcd.io/bbolt/mlock_windows.go | 11 - vendor/go.etcd.io/bbolt/node.go | 602 - vendor/go.etcd.io/bbolt/page.go | 204 - vendor/go.etcd.io/bbolt/tx.go | 723 - vendor/go.etcd.io/bbolt/unsafe.go | 39 - vendor/go.etcd.io/etcd/api/v3/LICENSE | 202 - .../go.etcd.io/etcd/api/v3/authpb/auth.pb.go | 1158 - .../go.etcd.io/etcd/api/v3/authpb/auth.proto | 42 - .../etcd/api/v3/etcdserverpb/etcdserver.pb.go | 1002 - .../etcd/api/v3/etcdserverpb/etcdserver.proto | 34 - .../etcd/api/v3/etcdserverpb/gw/rpc.pb.gw.go | 3771 --- .../api/v3/etcdserverpb/raft_internal.pb.go | 2677 -- .../api/v3/etcdserverpb/raft_internal.proto | 87 - .../v3/etcdserverpb/raft_internal_stringer.go | 183 - .../etcd/api/v3/etcdserverpb/rpc.pb.go | 25935 ---------------- .../etcd/api/v3/etcdserverpb/rpc.proto | 1385 - .../etcd/api/v3/membershippb/membership.pb.go | 1458 - .../etcd/api/v3/membershippb/membership.proto | 56 - vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go | 798 - vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto | 49 - .../etcd/api/v3/v3rpc/rpctypes/doc.go | 16 - .../etcd/api/v3/v3rpc/rpctypes/error.go | 266 - .../etcd/api/v3/v3rpc/rpctypes/md.go | 22 - .../api/v3/v3rpc/rpctypes/metadatafields.go | 20 - .../go.etcd.io/etcd/api/v3/version/version.go | 56 - .../etcd/api/v3/versionpb/version.pb.go | 90 - .../etcd/api/v3/versionpb/version.proto | 28 - vendor/go.etcd.io/etcd/client/pkg/v3/LICENSE | 202 - .../etcd/client/pkg/v3/fileutil/dir_unix.go | 28 - .../client/pkg/v3/fileutil/dir_windows.go | 52 - .../etcd/client/pkg/v3/fileutil/doc.go | 16 - .../etcd/client/pkg/v3/fileutil/fileutil.go | 167 - .../etcd/client/pkg/v3/fileutil/lock.go | 26 - .../etcd/client/pkg/v3/fileutil/lock_flock.go | 50 - .../etcd/client/pkg/v3/fileutil/lock_linux.go | 93 - .../etcd/client/pkg/v3/fileutil/lock_plan9.go | 45 - .../client/pkg/v3/fileutil/lock_solaris.go | 63 - .../etcd/client/pkg/v3/fileutil/lock_unix.go | 30 - .../client/pkg/v3/fileutil/lock_windows.go | 98 - .../client/pkg/v3/fileutil/preallocate.go | 54 - .../pkg/v3/fileutil/preallocate_darwin.go | 67 - .../pkg/v3/fileutil/preallocate_unix.go | 50 - .../v3/fileutil/preallocate_unsupported.go | 26 - .../etcd/client/pkg/v3/fileutil/purge.go | 93 - .../etcd/client/pkg/v3/fileutil/read_dir.go | 70 - .../etcd/client/pkg/v3/fileutil/sync.go | 30 - .../client/pkg/v3/fileutil/sync_darwin.go | 39 - .../etcd/client/pkg/v3/fileutil/sync_linux.go | 35 - .../etcd/client/pkg/v3/logutil/doc.go | 16 - .../etcd/client/pkg/v3/logutil/log_format.go | 38 - .../etcd/client/pkg/v3/logutil/log_level.go | 30 - .../etcd/client/pkg/v3/logutil/zap.go | 91 - .../etcd/client/pkg/v3/logutil/zap_journal.go | 93 - .../etcd/client/pkg/v3/pathutil/path.go | 31 - .../go.etcd.io/etcd/client/pkg/v3/srv/srv.go | 143 - .../etcd/client/pkg/v3/systemd/doc.go | 16 - .../etcd/client/pkg/v3/systemd/journal.go | 29 - .../etcd/client/pkg/v3/testutil/assert.go | 62 - .../etcd/client/pkg/v3/testutil/leak.go | 181 - .../pkg/v3/testutil/pauseable_handler.go | 57 - .../etcd/client/pkg/v3/testutil/recorder.go | 139 - .../etcd/client/pkg/v3/testutil/testingtb.go | 129 - .../etcd/client/pkg/v3/testutil/testutil.go | 106 - .../etcd/client/pkg/v3/testutil/var.go | 22 - .../client/pkg/v3/tlsutil/cipher_suites.go | 39 - .../etcd/client/pkg/v3/tlsutil/doc.go | 16 - .../etcd/client/pkg/v3/tlsutil/tlsutil.go | 73 - .../etcd/client/pkg/v3/transport/doc.go | 17 - .../pkg/v3/transport/keepalive_listener.go | 94 - .../client/pkg/v3/transport/limit_listen.go | 80 - .../etcd/client/pkg/v3/transport/listener.go | 574 - .../client/pkg/v3/transport/listener_opts.go | 90 - .../client/pkg/v3/transport/listener_tls.go | 272 - .../etcd/client/pkg/v3/transport/sockopt.go | 59 - .../pkg/v3/transport/sockopt_solaris.go | 35 - .../client/pkg/v3/transport/sockopt_unix.go | 36 - .../pkg/v3/transport/sockopt_windows.go | 33 - .../client/pkg/v3/transport/timeout_conn.go | 44 - .../client/pkg/v3/transport/timeout_dialer.go | 36 - .../pkg/v3/transport/timeout_listener.go | 45 - .../pkg/v3/transport/timeout_transport.go | 51 - .../etcd/client/pkg/v3/transport/tls.go | 49 - .../etcd/client/pkg/v3/transport/transport.go | 77 - .../client/pkg/v3/transport/unix_listener.go | 40 - .../etcd/client/pkg/v3/types/doc.go | 17 - .../go.etcd.io/etcd/client/pkg/v3/types/id.go | 39 - .../etcd/client/pkg/v3/types/set.go | 195 - .../etcd/client/pkg/v3/types/slice.go | 22 - .../etcd/client/pkg/v3/types/urls.go | 82 - .../etcd/client/pkg/v3/types/urlsmap.go | 107 - vendor/go.etcd.io/etcd/client/v2/LICENSE | 202 - vendor/go.etcd.io/etcd/client/v2/README.md | 112 - vendor/go.etcd.io/etcd/client/v2/auth_role.go | 236 - vendor/go.etcd.io/etcd/client/v2/auth_user.go | 319 - vendor/go.etcd.io/etcd/client/v2/cancelreq.go | 18 - vendor/go.etcd.io/etcd/client/v2/client.go | 719 - .../etcd/client/v2/cluster_error.go | 37 - vendor/go.etcd.io/etcd/client/v2/curl.go | 70 - vendor/go.etcd.io/etcd/client/v2/discover.go | 40 - vendor/go.etcd.io/etcd/client/v2/doc.go | 73 - vendor/go.etcd.io/etcd/client/v2/keys.go | 679 - vendor/go.etcd.io/etcd/client/v2/members.go | 303 - vendor/go.etcd.io/etcd/client/v2/util.go | 53 - vendor/go.etcd.io/etcd/client/v3/LICENSE | 202 - vendor/go.etcd.io/etcd/client/v3/README.md | 89 - vendor/go.etcd.io/etcd/client/v3/auth.go | 236 - vendor/go.etcd.io/etcd/client/v3/client.go | 610 - vendor/go.etcd.io/etcd/client/v3/cluster.go | 141 - .../go.etcd.io/etcd/client/v3/compact_op.go | 51 - vendor/go.etcd.io/etcd/client/v3/compare.go | 140 - .../etcd/client/v3/concurrency/doc.go | 17 - .../etcd/client/v3/concurrency/election.go | 254 - .../etcd/client/v3/concurrency/key.go | 65 - .../etcd/client/v3/concurrency/mutex.go | 167 - .../etcd/client/v3/concurrency/session.go | 141 - .../etcd/client/v3/concurrency/stm.go | 387 - vendor/go.etcd.io/etcd/client/v3/config.go | 92 - .../etcd/client/v3/credentials/credentials.go | 131 - vendor/go.etcd.io/etcd/client/v3/ctx.go | 50 - vendor/go.etcd.io/etcd/client/v3/doc.go | 106 - .../client/v3/internal/endpoint/endpoint.go | 137 - .../client/v3/internal/resolver/resolver.go | 74 - vendor/go.etcd.io/etcd/client/v3/kv.go | 182 - vendor/go.etcd.io/etcd/client/v3/lease.go | 601 - vendor/go.etcd.io/etcd/client/v3/logger.go | 77 - .../go.etcd.io/etcd/client/v3/maintenance.go | 358 - .../etcd/client/v3/mirror/syncer.go | 112 - .../etcd/client/v3/namespace/doc.go | 43 - .../go.etcd.io/etcd/client/v3/namespace/kv.go | 210 - .../etcd/client/v3/namespace/lease.go | 57 - .../etcd/client/v3/namespace/util.go | 42 - .../etcd/client/v3/namespace/watch.go | 83 - .../client/v3/naming/endpoints/endpoints.go | 96 - .../v3/naming/endpoints/endpoints_impl.go | 189 - .../v3/naming/endpoints/internal/update.go | 52 - vendor/go.etcd.io/etcd/client/v3/op.go | 599 - vendor/go.etcd.io/etcd/client/v3/options.go | 69 - vendor/go.etcd.io/etcd/client/v3/retry.go | 306 - .../etcd/client/v3/retry_interceptor.go | 438 - .../go.etcd.io/etcd/client/v3/snapshot/doc.go | 16 - .../etcd/client/v3/snapshot/v3_snapshot.go | 117 - vendor/go.etcd.io/etcd/client/v3/sort.go | 37 - vendor/go.etcd.io/etcd/client/v3/txn.go | 151 - vendor/go.etcd.io/etcd/client/v3/utils.go | 31 - vendor/go.etcd.io/etcd/client/v3/watch.go | 1028 - vendor/go.etcd.io/etcd/etcdctl/v3/LICENSE | 202 - vendor/go.etcd.io/etcd/etcdctl/v3/README.md | 1709 - vendor/go.etcd.io/etcd/etcdctl/v3/READMEv2.md | 336 - .../etcdctl/v3/ctlv2/command/auth_commands.go | 90 - .../v3/ctlv2/command/backup_command.go | 54 - .../v3/ctlv2/command/cluster_health.go | 140 - .../etcd/etcdctl/v3/ctlv2/command/doc.go | 16 - .../etcd/etcdctl/v3/ctlv2/command/error.go | 43 - .../v3/ctlv2/command/exec_watch_command.go | 127 - .../etcd/etcdctl/v3/ctlv2/command/format.go | 60 - .../etcdctl/v3/ctlv2/command/get_command.go | 67 - .../etcdctl/v3/ctlv2/command/ls_command.go | 91 - .../v3/ctlv2/command/member_commands.go | 207 - .../etcdctl/v3/ctlv2/command/mk_command.go | 77 - .../etcdctl/v3/ctlv2/command/mkdir_command.go | 60 - .../etcdctl/v3/ctlv2/command/rm_command.go | 64 - .../etcdctl/v3/ctlv2/command/rmdir_command.go | 55 - .../etcdctl/v3/ctlv2/command/role_commands.go | 255 - .../etcdctl/v3/ctlv2/command/set_command.go | 74 - .../v3/ctlv2/command/set_dir_command.go | 36 - .../v3/ctlv2/command/update_command.go | 64 - .../v3/ctlv2/command/update_dir_command.go | 58 - .../etcdctl/v3/ctlv2/command/user_commands.go | 225 - .../etcd/etcdctl/v3/ctlv2/command/util.go | 341 - .../etcdctl/v3/ctlv2/command/watch_command.go | 87 - .../go.etcd.io/etcd/etcdctl/v3/ctlv2/ctl.go | 84 - .../etcdctl/v3/ctlv3/command/alarm_command.go | 82 - .../etcdctl/v3/ctlv3/command/auth_command.go | 123 - .../etcd/etcdctl/v3/ctlv3/command/check.go | 442 - .../v3/ctlv3/command/compaction_command.go | 63 - .../v3/ctlv3/command/completion_command.go | 84 - .../v3/ctlv3/command/defrag_command.go | 72 - .../etcdctl/v3/ctlv3/command/del_command.go | 95 - .../etcd/etcdctl/v3/ctlv3/command/doc.go | 16 - .../v3/ctlv3/command/downgrade_command.go | 136 - .../etcdctl/v3/ctlv3/command/elect_command.go | 138 - .../etcdctl/v3/ctlv3/command/ep_command.go | 282 - .../etcdctl/v3/ctlv3/command/get_command.go | 191 - .../etcd/etcdctl/v3/ctlv3/command/global.go | 458 - .../etcdctl/v3/ctlv3/command/lease_command.go | 208 - .../etcdctl/v3/ctlv3/command/lock_command.go | 129 - .../v3/ctlv3/command/make_mirror_command.go | 225 - .../v3/ctlv3/command/member_command.go | 256 - .../v3/ctlv3/command/move_leader_command.go | 83 - .../etcd/etcdctl/v3/ctlv3/command/printer.go | 243 - .../v3/ctlv3/command/printer_fields.go | 221 - .../etcdctl/v3/ctlv3/command/printer_json.go | 101 - .../v3/ctlv3/command/printer_protobuf.go | 65 - .../v3/ctlv3/command/printer_simple.go | 304 - .../etcdctl/v3/ctlv3/command/printer_table.go | 66 - .../etcdctl/v3/ctlv3/command/put_command.go | 119 - .../etcdctl/v3/ctlv3/command/role_command.go | 245 - .../v3/ctlv3/command/snapshot_command.go | 144 - .../etcdctl/v3/ctlv3/command/txn_command.go | 208 - .../etcdctl/v3/ctlv3/command/user_command.go | 300 - .../etcd/etcdctl/v3/ctlv3/command/util.go | 168 - .../v3/ctlv3/command/version_command.go | 37 - .../etcdctl/v3/ctlv3/command/watch_command.go | 366 - .../go.etcd.io/etcd/etcdctl/v3/ctlv3/ctl.go | 123 - vendor/go.etcd.io/etcd/etcdctl/v3/main.go | 70 - vendor/go.etcd.io/etcd/etcdutl/v3/LICENSE | 202 - .../etcd/etcdutl/v3/etcdutl/backup_command.go | 334 - .../etcd/etcdutl/v3/etcdutl/common.go | 32 - .../etcdutl/v3/etcdutl/completion_commmand.go | 84 - .../etcd/etcdutl/v3/etcdutl/defrag_command.go | 73 - .../etcdutl/v3/etcdutl/migrate_command.go | 156 - .../etcd/etcdutl/v3/etcdutl/printer.go | 89 - .../etcd/etcdutl/v3/etcdutl/printer_fields.go | 31 - .../etcd/etcdutl/v3/etcdutl/printer_json.go | 45 - .../etcdutl/v3/etcdutl/printer_protobuf.go | 47 - .../etcd/etcdutl/v3/etcdutl/printer_simple.go | 32 - .../etcd/etcdutl/v3/etcdutl/printer_table.go | 36 - .../etcdutl/v3/etcdutl/snapshot_command.go | 168 - .../etcdutl/v3/etcdutl/version_command.go | 37 - .../etcd/etcdutl/v3/snapshot/doc.go | 16 - .../etcd/etcdutl/v3/snapshot/util.go | 31 - .../etcd/etcdutl/v3/snapshot/v3_snapshot.go | 492 - vendor/go.etcd.io/etcd/pkg/v3/LICENSE | 202 - vendor/go.etcd.io/etcd/pkg/v3/adt/README.md | 48 - vendor/go.etcd.io/etcd/pkg/v3/adt/adt.go | 16 - .../etcd/pkg/v3/adt/interval_tree.go | 951 - .../go.etcd.io/etcd/pkg/v3/cobrautl/error.go | 40 - .../go.etcd.io/etcd/pkg/v3/cobrautl/help.go | 173 - .../etcd/pkg/v3/contention/contention.go | 69 - .../go.etcd.io/etcd/pkg/v3/contention/doc.go | 16 - vendor/go.etcd.io/etcd/pkg/v3/cpuutil/doc.go | 16 - .../go.etcd.io/etcd/pkg/v3/cpuutil/endian.go | 36 - vendor/go.etcd.io/etcd/pkg/v3/crc/crc.go | 43 - .../go.etcd.io/etcd/pkg/v3/debugutil/doc.go | 16 - .../go.etcd.io/etcd/pkg/v3/debugutil/pprof.go | 47 - vendor/go.etcd.io/etcd/pkg/v3/flags/flag.go | 132 - .../go.etcd.io/etcd/pkg/v3/flags/ignored.go | 41 - .../etcd/pkg/v3/flags/selective_string.go | 114 - .../go.etcd.io/etcd/pkg/v3/flags/strings.go | 53 - .../etcd/pkg/v3/flags/unique_strings.go | 77 - .../etcd/pkg/v3/flags/unique_urls.go | 93 - vendor/go.etcd.io/etcd/pkg/v3/flags/urls.go | 66 - .../etcd/pkg/v3/grpc_testing/recorder.go | 69 - .../etcd/pkg/v3/grpc_testing/stub_server.go | 112 - .../etcd/pkg/v3/httputil/httputil.go | 49 - vendor/go.etcd.io/etcd/pkg/v3/idutil/id.go | 75 - .../etcd/pkg/v3/ioutil/pagewriter.go | 117 - .../etcd/pkg/v3/ioutil/readcloser.go | 66 - .../go.etcd.io/etcd/pkg/v3/ioutil/reader.go | 40 - vendor/go.etcd.io/etcd/pkg/v3/ioutil/util.go | 43 - vendor/go.etcd.io/etcd/pkg/v3/netutil/doc.go | 16 - .../go.etcd.io/etcd/pkg/v3/netutil/netutil.go | 228 - .../go.etcd.io/etcd/pkg/v3/netutil/routes.go | 34 - .../etcd/pkg/v3/netutil/routes_linux.go | 251 - .../go.etcd.io/etcd/pkg/v3/notify/notify.go | 52 - .../go.etcd.io/etcd/pkg/v3/pbutil/pbutil.go | 56 - vendor/go.etcd.io/etcd/pkg/v3/report/doc.go | 16 - .../go.etcd.io/etcd/pkg/v3/report/report.go | 278 - .../etcd/pkg/v3/report/timeseries.go | 160 - .../go.etcd.io/etcd/pkg/v3/report/weighted.go | 101 - .../etcd/pkg/v3/runtime/fds_linux.go | 47 - .../etcd/pkg/v3/runtime/fds_other.go | 31 - vendor/go.etcd.io/etcd/pkg/v3/schedule/doc.go | 16 - .../etcd/pkg/v3/schedule/schedule.go | 165 - .../go.etcd.io/etcd/pkg/v3/traceutil/trace.go | 240 - vendor/go.etcd.io/etcd/pkg/v3/wait/wait.go | 110 - .../go.etcd.io/etcd/pkg/v3/wait/wait_time.go | 66 - vendor/go.etcd.io/etcd/raft/v3/LICENSE | 202 - vendor/go.etcd.io/etcd/raft/v3/OWNERS | 19 - vendor/go.etcd.io/etcd/raft/v3/README.md | 201 - vendor/go.etcd.io/etcd/raft/v3/bootstrap.go | 80 - .../etcd/raft/v3/confchange/confchange.go | 421 - .../etcd/raft/v3/confchange/restore.go | 155 - vendor/go.etcd.io/etcd/raft/v3/design.md | 57 - vendor/go.etcd.io/etcd/raft/v3/doc.go | 300 - vendor/go.etcd.io/etcd/raft/v3/log.go | 409 - .../go.etcd.io/etcd/raft/v3/log_unstable.go | 157 - vendor/go.etcd.io/etcd/raft/v3/logger.go | 142 - vendor/go.etcd.io/etcd/raft/v3/node.go | 595 - .../go.etcd.io/etcd/raft/v3/quorum/joint.go | 75 - .../etcd/raft/v3/quorum/majority.go | 210 - .../go.etcd.io/etcd/raft/v3/quorum/quorum.go | 58 - .../etcd/raft/v3/quorum/voteresult_string.go | 26 - vendor/go.etcd.io/etcd/raft/v3/raft.go | 1843 -- .../etcd/raft/v3/raftpb/confchange.go | 170 - .../etcd/raft/v3/raftpb/confstate.go | 44 - .../go.etcd.io/etcd/raft/v3/raftpb/raft.pb.go | 2992 -- .../go.etcd.io/etcd/raft/v3/raftpb/raft.proto | 197 - vendor/go.etcd.io/etcd/raft/v3/rawnode.go | 241 - vendor/go.etcd.io/etcd/raft/v3/read_only.go | 121 - vendor/go.etcd.io/etcd/raft/v3/status.go | 105 - vendor/go.etcd.io/etcd/raft/v3/storage.go | 273 - .../etcd/raft/v3/tracker/inflights.go | 132 - .../etcd/raft/v3/tracker/progress.go | 255 - .../go.etcd.io/etcd/raft/v3/tracker/state.go | 42 - .../etcd/raft/v3/tracker/tracker.go | 288 - vendor/go.etcd.io/etcd/raft/v3/util.go | 233 - vendor/go.etcd.io/etcd/server/v3/LICENSE | 202 - vendor/go.etcd.io/etcd/server/v3/auth/doc.go | 16 - vendor/go.etcd.io/etcd/server/v3/auth/jwt.go | 163 - .../go.etcd.io/etcd/server/v3/auth/metrics.go | 43 - vendor/go.etcd.io/etcd/server/v3/auth/nop.go | 35 - .../go.etcd.io/etcd/server/v3/auth/options.go | 191 - .../etcd/server/v3/auth/range_perm_cache.go | 139 - .../etcd/server/v3/auth/simple_token.go | 257 - .../go.etcd.io/etcd/server/v3/auth/store.go | 1203 - .../etcd/server/v3/config/config.go | 352 - .../etcd/server/v3/config/v2_deprecation.go | 50 - .../go.etcd.io/etcd/server/v3/embed/config.go | 1045 - .../etcd/server/v3/embed/config_logging.go | 282 - .../v3/embed/config_logging_journal_unix.go | 36 - .../embed/config_logging_journal_windows.go | 28 - .../etcd/server/v3/embed/config_tracing.go | 117 - vendor/go.etcd.io/etcd/server/v3/embed/doc.go | 45 - .../go.etcd.io/etcd/server/v3/embed/etcd.go | 812 - .../go.etcd.io/etcd/server/v3/embed/serve.go | 436 - .../go.etcd.io/etcd/server/v3/embed/util.go | 29 - .../etcd/server/v3/etcdserver/adapters.go | 90 - .../server/v3/etcdserver/api/capability.go | 96 - .../etcd/server/v3/etcdserver/api/cluster.go | 38 - .../etcd/server/v3/etcdserver/api/doc.go | 16 - .../server/v3/etcdserver/api/etcdhttp/base.go | 155 - .../server/v3/etcdserver/api/etcdhttp/doc.go | 16 - .../v3/etcdserver/api/etcdhttp/metrics.go | 211 - .../server/v3/etcdserver/api/etcdhttp/peer.go | 163 - .../v3/etcdserver/api/membership/cluster.go | 857 - .../etcdserver/api/membership/cluster_opts.go | 43 - .../v3/etcdserver/api/membership/doc.go | 16 - .../v3/etcdserver/api/membership/errors.go | 35 - .../v3/etcdserver/api/membership/member.go | 142 - .../v3/etcdserver/api/membership/metrics.go | 40 - .../v3/etcdserver/api/membership/store.go | 57 - .../v3/etcdserver/api/membership/storev2.go | 210 - .../v3/etcdserver/api/rafthttp/coder.go | 27 - .../server/v3/etcdserver/api/rafthttp/doc.go | 16 - .../server/v3/etcdserver/api/rafthttp/http.go | 531 - .../v3/etcdserver/api/rafthttp/metrics.go | 186 - .../v3/etcdserver/api/rafthttp/msg_codec.go | 68 - .../etcdserver/api/rafthttp/msgappv2_codec.go | 248 - .../server/v3/etcdserver/api/rafthttp/peer.go | 353 - .../v3/etcdserver/api/rafthttp/peer_status.go | 90 - .../v3/etcdserver/api/rafthttp/pipeline.go | 178 - .../etcdserver/api/rafthttp/probing_status.go | 98 - .../v3/etcdserver/api/rafthttp/remote.go | 95 - .../api/rafthttp/snapshot_sender.go | 200 - .../v3/etcdserver/api/rafthttp/stream.go | 713 - .../v3/etcdserver/api/rafthttp/transport.go | 453 - .../v3/etcdserver/api/rafthttp/urlpick.go | 57 - .../server/v3/etcdserver/api/rafthttp/util.go | 204 - .../etcd/server/v3/etcdserver/api/snap/db.go | 99 - .../etcd/server/v3/etcdserver/api/snap/doc.go | 17 - .../server/v3/etcdserver/api/snap/message.go | 64 - .../server/v3/etcdserver/api/snap/metrics.go | 82 - .../v3/etcdserver/api/snap/snappb/snap.pb.go | 344 - .../v3/etcdserver/api/snap/snappb/snap.proto | 14 - .../v3/etcdserver/api/snap/snapshotter.go | 300 - .../etcdserver/api/v2discovery/discovery.go | 412 - .../server/v3/etcdserver/api/v2error/error.go | 161 - .../server/v3/etcdserver/api/v2http/client.go | 50 - .../etcdserver/api/v2http/httptypes/errors.go | 51 - .../v3/etcdserver/api/v2stats/leader.go | 135 - .../server/v3/etcdserver/api/v2stats/queue.go | 110 - .../v3/etcdserver/api/v2stats/server.go | 142 - .../server/v3/etcdserver/api/v2store/doc.go | 17 - .../server/v3/etcdserver/api/v2store/event.go | 71 - .../etcdserver/api/v2store/event_history.go | 129 - .../v3/etcdserver/api/v2store/event_queue.go | 34 - .../v3/etcdserver/api/v2store/metrics.go | 130 - .../server/v3/etcdserver/api/v2store/node.go | 396 - .../v3/etcdserver/api/v2store/node_extern.go | 116 - .../server/v3/etcdserver/api/v2store/stats.go | 145 - .../server/v3/etcdserver/api/v2store/store.go | 799 - .../v3/etcdserver/api/v2store/ttl_key_heap.go | 97 - .../v3/etcdserver/api/v2store/watcher.go | 95 - .../v3/etcdserver/api/v2store/watcher_hub.go | 200 - .../v3/etcdserver/api/v3alarm/alarms.go | 135 - .../server/v3/etcdserver/api/v3client/doc.go | 45 - .../v3/etcdserver/api/v3client/v3client.go | 67 - .../etcdserver/api/v3compactor/compactor.go | 73 - .../v3/etcdserver/api/v3compactor/doc.go | 16 - .../v3/etcdserver/api/v3compactor/periodic.go | 206 - .../v3/etcdserver/api/v3compactor/revision.go | 130 - .../etcdserver/api/v3discovery/discovery.go | 572 - .../v3/etcdserver/api/v3election/doc.go | 16 - .../v3/etcdserver/api/v3election/election.go | 134 - .../v3electionpb/gw/v3election.pb.gw.go | 454 - .../v3election/v3electionpb/v3election.pb.go | 2541 -- .../v3election/v3electionpb/v3election.proto | 119 - .../server/v3/etcdserver/api/v3lock/doc.go | 16 - .../server/v3/etcdserver/api/v3lock/lock.go | 56 - .../api/v3lock/v3lockpb/gw/v3lock.pb.gw.go | 242 - .../api/v3lock/v3lockpb/v3lock.pb.go | 1141 - .../api/v3lock/v3lockpb/v3lock.proto | 65 - .../server/v3/etcdserver/api/v3rpc/auth.go | 166 - .../server/v3/etcdserver/api/v3rpc/codec.go | 34 - .../server/v3/etcdserver/api/v3rpc/grpc.go | 93 - .../server/v3/etcdserver/api/v3rpc/header.go | 49 - .../v3/etcdserver/api/v3rpc/interceptor.go | 351 - .../server/v3/etcdserver/api/v3rpc/key.go | 280 - .../server/v3/etcdserver/api/v3rpc/lease.go | 157 - .../v3/etcdserver/api/v3rpc/maintenance.go | 323 - .../server/v3/etcdserver/api/v3rpc/member.go | 124 - .../server/v3/etcdserver/api/v3rpc/metrics.go | 58 - .../server/v3/etcdserver/api/v3rpc/quota.go | 91 - .../server/v3/etcdserver/api/v3rpc/util.go | 149 - .../server/v3/etcdserver/api/v3rpc/watch.go | 583 - .../etcd/server/v3/etcdserver/apply.go | 1175 - .../etcd/server/v3/etcdserver/apply_auth.go | 247 - .../etcd/server/v3/etcdserver/apply_v2.go | 159 - .../etcd/server/v3/etcdserver/bootstrap.go | 718 - .../server/v3/etcdserver/cindex/cindex.go | 123 - .../etcd/server/v3/etcdserver/cindex/doc.go | 16 - .../etcd/server/v3/etcdserver/cluster_util.go | 415 - .../etcd/server/v3/etcdserver/corrupt.go | 442 - .../etcd/server/v3/etcdserver/doc.go | 16 - .../etcd/server/v3/etcdserver/errors.go | 53 - .../etcd/server/v3/etcdserver/metrics.go | 237 - .../etcd/server/v3/etcdserver/raft.go | 413 - .../etcd/server/v3/etcdserver/server.go | 2298 -- .../v3/etcdserver/server_access_control.go | 65 - .../server/v3/etcdserver/snapshot_merge.go | 85 - .../etcd/server/v3/etcdserver/util.go | 198 - .../etcd/server/v3/etcdserver/v2_server.go | 166 - .../etcd/server/v3/etcdserver/v3_server.go | 958 - .../etcd/server/v3/etcdserver/version/doc.go | 16 - .../server/v3/etcdserver/version/downgrade.go | 75 - .../server/v3/etcdserver/version/errors.go | 23 - .../server/v3/etcdserver/version/monitor.go | 209 - .../server/v3/etcdserver/version/version.go | 81 - .../etcd/server/v3/etcdserver/zap_raft.go | 103 - vendor/go.etcd.io/etcd/server/v3/lease/doc.go | 16 - .../etcd/server/v3/lease/lease_queue.go | 108 - .../etcd/server/v3/lease/leasehttp/doc.go | 16 - .../etcd/server/v3/lease/leasehttp/http.go | 248 - .../etcd/server/v3/lease/leasepb/lease.pb.go | 733 - .../etcd/server/v3/lease/leasepb/lease.proto | 25 - .../go.etcd.io/etcd/server/v3/lease/lessor.go | 953 - .../etcd/server/v3/lease/metrics.go | 59 - .../grpcproxy/adapter/auth_client_adapter.go | 97 - .../v3/proxy/grpcproxy/adapter/chan_stream.go | 167 - .../adapter/cluster_client_adapter.go | 49 - .../server/v3/proxy/grpcproxy/adapter/doc.go | 17 - .../adapter/election_client_adapter.go | 80 - .../grpcproxy/adapter/kv_client_adapter.go | 49 - .../grpcproxy/adapter/lease_client_adapter.go | 82 - .../grpcproxy/adapter/lock_client_adapter.go | 37 - .../adapter/maintenance_client_adapter.go | 92 - .../grpcproxy/adapter/watch_client_adapter.go | 66 - .../etcd/server/v3/proxy/grpcproxy/auth.go | 115 - .../server/v3/proxy/grpcproxy/cache/store.go | 172 - .../etcd/server/v3/proxy/grpcproxy/cluster.go | 177 - .../etcd/server/v3/proxy/grpcproxy/doc.go | 16 - .../server/v3/proxy/grpcproxy/election.go | 65 - .../etcd/server/v3/proxy/grpcproxy/health.go | 76 - .../etcd/server/v3/proxy/grpcproxy/kv.go | 232 - .../etcd/server/v3/proxy/grpcproxy/leader.go | 113 - .../etcd/server/v3/proxy/grpcproxy/lease.go | 384 - .../etcd/server/v3/proxy/grpcproxy/lock.go | 38 - .../server/v3/proxy/grpcproxy/maintenance.go | 95 - .../etcd/server/v3/proxy/grpcproxy/metrics.go | 121 - .../server/v3/proxy/grpcproxy/register.go | 102 - .../etcd/server/v3/proxy/grpcproxy/util.go | 75 - .../etcd/server/v3/proxy/grpcproxy/watch.go | 313 - .../v3/proxy/grpcproxy/watch_broadcast.go | 166 - .../v3/proxy/grpcproxy/watch_broadcasts.go | 135 - .../server/v3/proxy/grpcproxy/watch_ranges.go | 69 - .../etcd/server/v3/proxy/grpcproxy/watcher.go | 130 - .../etcd/server/v3/storage/backend.go | 109 - .../etcd/server/v3/storage/backend/backend.go | 645 - .../server/v3/storage/backend/batch_tx.go | 344 - .../v3/storage/backend/config_default.go | 24 - .../server/v3/storage/backend/config_linux.go | 34 - .../v3/storage/backend/config_windows.go | 27 - .../etcd/server/v3/storage/backend/doc.go | 16 - .../etcd/server/v3/storage/backend/hooks.go | 36 - .../etcd/server/v3/storage/backend/metrics.go | 103 - .../etcd/server/v3/storage/backend/read_tx.go | 150 - .../server/v3/storage/backend/tx_buffer.go | 231 - .../etcd/server/v3/storage/datadir/datadir.go | 40 - .../etcd/server/v3/storage/datadir/doc.go | 17 - .../etcd/server/v3/storage/hooks.go | 60 - .../etcd/server/v3/storage/metrics.go | 30 - .../etcd/server/v3/storage/mvcc/doc.go | 16 - .../etcd/server/v3/storage/mvcc/index.go | 282 - .../etcd/server/v3/storage/mvcc/key_index.go | 378 - .../etcd/server/v3/storage/mvcc/kv.go | 150 - .../etcd/server/v3/storage/mvcc/kv_view.go | 56 - .../etcd/server/v3/storage/mvcc/kvstore.go | 543 - .../v3/storage/mvcc/kvstore_compaction.go | 79 - .../server/v3/storage/mvcc/kvstore_txn.go | 309 - .../etcd/server/v3/storage/mvcc/metrics.go | 306 - .../server/v3/storage/mvcc/metrics_txn.go | 71 - .../etcd/server/v3/storage/mvcc/revision.go | 67 - .../etcd/server/v3/storage/mvcc/store.go | 60 - .../etcd/server/v3/storage/mvcc/util.go | 37 - .../server/v3/storage/mvcc/watchable_store.go | 542 - .../v3/storage/mvcc/watchable_store_txn.go | 56 - .../etcd/server/v3/storage/mvcc/watcher.go | 193 - .../server/v3/storage/mvcc/watcher_group.go | 293 - .../etcd/server/v3/storage/quota.go | 179 - .../etcd/server/v3/storage/schema/actions.go | 93 - .../etcd/server/v3/storage/schema/alarm.go | 96 - .../etcd/server/v3/storage/schema/auth.go | 113 - .../server/v3/storage/schema/auth_roles.go | 88 - .../server/v3/storage/schema/auth_users.go | 82 - .../etcd/server/v3/storage/schema/bucket.go | 98 - .../etcd/server/v3/storage/schema/changes.go | 50 - .../etcd/server/v3/storage/schema/cindex.go | 95 - .../server/v3/storage/schema/confstate.go | 58 - .../etcd/server/v3/storage/schema/lease.go | 84 - .../server/v3/storage/schema/membership.go | 238 - .../server/v3/storage/schema/migration.go | 113 - .../etcd/server/v3/storage/schema/schema.go | 142 - .../etcd/server/v3/storage/schema/version.go | 66 - .../etcd/server/v3/storage/storage.go | 133 - .../go.etcd.io/etcd/server/v3/storage/util.go | 150 - .../etcd/server/v3/storage/wal/decoder.go | 196 - .../etcd/server/v3/storage/wal/doc.go | 75 - .../etcd/server/v3/storage/wal/encoder.go | 124 - .../server/v3/storage/wal/file_pipeline.go | 105 - .../etcd/server/v3/storage/wal/metrics.go | 42 - .../etcd/server/v3/storage/wal/repair.go | 115 - .../etcd/server/v3/storage/wal/util.go | 112 - .../etcd/server/v3/storage/wal/version.go | 282 - .../etcd/server/v3/storage/wal/wal.go | 1011 - .../server/v3/storage/wal/walpb/record.go | 41 - .../server/v3/storage/wal/walpb/record.pb.go | 609 - .../server/v3/storage/wal/walpb/record.proto | 24 - .../go.etcd.io/etcd/server/v3/verify/doc.go | 20 - .../etcd/server/v3/verify/verify.go | 148 - vendor/go.etcd.io/etcd/tests/v3/LICENSE | 202 - .../tests/v3/framework/integration/bridge.go | 219 - .../tests/v3/framework/integration/cluster.go | 1593 - .../framework/integration/cluster_direct.go | 44 - .../v3/framework/integration/cluster_proxy.go | 130 - .../tests/v3/framework/integration/testing.go | 136 - .../etcd/tests/v3/integration/doc.go | 25 - .../etcd/tests/v3/integration/lazy_cluster.go | 121 - vendor/go.etcd.io/etcd/v3/.gitignore | 26 - vendor/go.etcd.io/etcd/v3/.header | 13 - vendor/go.etcd.io/etcd/v3/ADOPTERS.md | 250 - vendor/go.etcd.io/etcd/v3/CONTRIBUTING.md | 94 - vendor/go.etcd.io/etcd/v3/DCO | 36 - .../etcd/v3/Dockerfile-release.amd64 | 22 - .../etcd/v3/Dockerfile-release.arm64 | 17 - .../etcd/v3/Dockerfile-release.ppc64le | 16 - .../etcd/v3/Dockerfile-release.s390x | 17 - vendor/go.etcd.io/etcd/v3/GOVERNANCE.md | 80 - vendor/go.etcd.io/etcd/v3/LICENSE | 202 - vendor/go.etcd.io/etcd/v3/MAINTAINERS | 29 - vendor/go.etcd.io/etcd/v3/Makefile | 165 - vendor/go.etcd.io/etcd/v3/Procfile | 9 - vendor/go.etcd.io/etcd/v3/Procfile.learner | 12 - vendor/go.etcd.io/etcd/v3/Procfile.v2 | 7 - vendor/go.etcd.io/etcd/v3/README.md | 194 - vendor/go.etcd.io/etcd/v3/ROADMAP.md | 21 - .../go.etcd.io/etcd/v3/bill-of-materials.json | 744 - .../etcd/v3/bill-of-materials.override.json | 18 - vendor/go.etcd.io/etcd/v3/code-of-conduct.md | 3 - vendor/go.etcd.io/etcd/v3/codecov.yml | 18 - vendor/go.etcd.io/etcd/v3/dummy.go | 25 - .../go.etcd.io/etcd/v3/etcd.conf.yml.sample | 140 - .../mongo-driver/x/bsonx/bsoncore/value.go | 2 +- .../google.golang.org/grpc/otelgrpc/LICENSE | 201 - .../google.golang.org/grpc/otelgrpc/config.go | 136 - .../grpc/otelgrpc/interceptor.go | 501 - .../grpc/otelgrpc/interceptorinfo.go | 50 - .../grpc/otelgrpc/internal/parse.go | 43 - .../grpc/otelgrpc/metadata_supplier.go | 98 - .../grpc/otelgrpc/semconv.go | 52 - .../grpc/otelgrpc/version.go | 26 - .../go.opentelemetry.io/otel/.codespellignore | 5 + vendor/go.opentelemetry.io/otel/.codespellrc | 10 + vendor/go.opentelemetry.io/otel/.gitignore | 3 + vendor/go.opentelemetry.io/otel/.golangci.yml | 4 +- vendor/go.opentelemetry.io/otel/CHANGELOG.md | 214 +- vendor/go.opentelemetry.io/otel/CODEOWNERS | 2 +- .../go.opentelemetry.io/otel/CONTRIBUTING.md | 106 +- vendor/go.opentelemetry.io/otel/Makefile | 54 +- vendor/go.opentelemetry.io/otel/README.md | 7 +- vendor/go.opentelemetry.io/otel/RELEASING.md | 7 +- .../go.opentelemetry.io/otel/attribute/set.go | 20 +- .../otel/baggage/baggage.go | 56 +- vendor/go.opentelemetry.io/otel/codes/doc.go | 2 +- .../otel/exporters/otlp/internal/config.go | 34 - .../otlp/internal/envconfig/envconfig.go | 199 - .../otel/exporters/otlp/internal/header.go | 24 - .../exporters/otlp/internal/partialsuccess.go | 64 - .../exporters/otlp/internal/retry/LICENSE | 201 - .../exporters/otlp/internal/retry/retry.go | 153 - .../exporters/otlp/internal/wrappederror.go | 61 - .../otel/exporters/otlp/otlptrace/LICENSE | 201 - .../otel/exporters/otlp/otlptrace/README.md | 51 - .../otel/exporters/otlp/otlptrace/clients.go | 54 - .../otel/exporters/otlp/otlptrace/exporter.go | 118 - .../internal/otlpconfig/envconfig.go | 150 - .../otlptrace/internal/otlpconfig/options.go | 308 - .../internal/otlpconfig/optiontypes.go | 48 - .../otlp/otlptrace/internal/otlpconfig/tls.go | 34 - .../internal/tracetransform/attribute.go | 158 - .../tracetransform/instrumentation.go | 30 - .../internal/tracetransform/resource.go | 28 - .../otlptrace/internal/tracetransform/span.go | 205 - .../otlp/otlptrace/otlptracegrpc/LICENSE | 201 - .../otlp/otlptrace/otlptracegrpc/client.go | 296 - .../otlp/otlptrace/otlptracegrpc/exporter.go | 31 - .../otlp/otlptrace/otlptracegrpc/options.go | 189 - vendor/go.opentelemetry.io/otel/handler.go | 64 +- .../otel/internal/global/handler.go | 103 + .../otel/internal/global/instruments.go | 359 + .../otel/internal/global/internal_logging.go | 19 +- .../{metric => }/internal/global/meter.go | 52 +- .../otel/internal/global/state.go | 45 +- vendor/go.opentelemetry.io/otel/metric.go | 53 + .../otel/metric/asyncfloat64.go | 271 + .../otel/metric/asyncint64.go | 269 + .../go.opentelemetry.io/otel/metric/config.go | 25 +- vendor/go.opentelemetry.io/otel/metric/doc.go | 157 +- .../otel/metric/embedded/embedded.go | 234 + .../otel/metric/global/global.go | 42 - .../otel/metric/instrument.go | 332 + .../otel/metric/instrument/asyncfloat64.go | 131 - .../otel/metric/instrument/asyncint64.go | 131 - .../otel/metric/instrument/instrument.go | 90 - .../otel/metric/instrument/syncfloat64.go | 86 - .../otel/metric/instrument/syncint64.go | 86 - .../metric/internal/global/instruments.go | 355 - .../otel/metric/internal/global/state.go | 68 - .../go.opentelemetry.io/otel/metric/meter.go | 204 +- .../go.opentelemetry.io/otel/metric/noop.go | 198 - .../otel/metric/syncfloat64.go | 179 + .../otel/metric/syncint64.go | 179 + .../otel/metric/unit/doc.go | 20 - .../otel/metric/unit/unit.go | 25 - .../go.opentelemetry.io/otel/requirements.txt | 1 + .../otel/sdk/internal/env/env.go | 10 +- .../otel/sdk/internal/internal.go | 11 +- .../otel/sdk/resource/auto.go | 58 +- .../otel/sdk/resource/builtin.go | 8 +- .../otel/sdk/resource/config.go | 7 + .../otel/sdk/resource/container.go | 2 +- .../otel/sdk/resource/doc.go | 3 + .../otel/sdk/resource/env.go | 16 +- .../otel/sdk/resource/host_id.go | 120 + .../otel/sdk/resource/host_id_bsd.go | 23 + .../otel/sdk/resource/host_id_darwin.go | 19 + .../otel/sdk/resource/host_id_exec.go | 29 + .../otel/sdk/resource/host_id_linux.go | 22 + .../otel/sdk/resource/host_id_readfile.go | 28 + .../otel/sdk/resource/host_id_unsupported.go | 36 + .../otel/sdk/resource/host_id_windows.go | 48 + .../otel/sdk/resource/os.go | 2 +- .../otel/sdk/resource/os_release_unix.go | 8 +- .../otel/sdk/resource/process.go | 16 +- .../otel/sdk/resource/resource.go | 18 +- .../otel/sdk/trace/batch_span_processor.go | 2 +- .../otel/sdk/trace/provider.go | 99 +- .../otel/sdk/trace/simple_span_processor.go | 9 +- .../otel/sdk/trace/span.go | 16 +- .../otel/sdk/trace/span_exporter.go | 2 +- .../otel/sdk/trace/span_processor.go | 4 +- .../otel/sdk/trace/tracer.go | 2 +- .../otel/sdk/trace/version.go | 20 + .../go.opentelemetry.io/otel/sdk/version.go | 20 + .../otel/semconv/internal/http.go | 8 +- .../otel/semconv/v1.12.0/doc.go | 20 + .../semconv/{v1.4.0 => v1.12.0}/exception.go | 2 +- .../otel/semconv/v1.12.0/http.go | 114 + .../otel/semconv/v1.12.0/resource.go | 1042 + .../otel/semconv/v1.12.0/schema.go | 20 + .../otel/semconv/v1.12.0/trace.go | 1704 + .../otel/semconv/v1.4.0/doc.go | 20 - .../otel/semconv/v1.4.0/http.go | 114 - .../otel/semconv/v1.4.0/resource.go | 906 - .../otel/semconv/v1.4.0/schema.go | 20 - .../otel/semconv/v1.4.0/trace.go | 1378 - vendor/go.opentelemetry.io/otel/trace/noop.go | 4 +- vendor/go.opentelemetry.io/otel/version.go | 2 +- vendor/go.opentelemetry.io/otel/versions.yaml | 12 +- vendor/go.opentelemetry.io/proto/otlp/LICENSE | 201 - .../collector/trace/v1/trace_service.pb.go | 367 - .../collector/trace/v1/trace_service.pb.gw.go | 167 - .../trace/v1/trace_service_grpc.pb.go | 109 - .../proto/otlp/common/v1/common.pb.go | 627 - .../proto/otlp/resource/v1/resource.pb.go | 193 - .../proto/otlp/trace/v1/trace.pb.go | 1140 - .../cncf/xds/go => go.step.sm/crypto}/LICENSE | 0 .../crypto/fingerprint/fingerprint.go | 78 + .../crypto/internal/bcrypt_pbkdf/LICENSE | 27 + .../crypto/internal/bcrypt_pbkdf/README | 22 + .../internal/bcrypt_pbkdf/bcrypt_pbkdf.go | 100 + .../go.step.sm/crypto/internal/emoji/emoji.go | 274 + vendor/go.step.sm/crypto/internal/utils/io.go | 50 + vendor/go.step.sm/crypto/jose/encrypt.go | 135 + vendor/go.step.sm/crypto/jose/generate.go | 204 + vendor/go.step.sm/crypto/jose/options.go | 125 + vendor/go.step.sm/crypto/jose/parse.go | 408 + vendor/go.step.sm/crypto/jose/types.go | 310 + vendor/go.step.sm/crypto/jose/validate.go | 215 + vendor/go.step.sm/crypto/jose/x25519.go | 66 + .../go.step.sm/crypto/keyutil/fingerprint.go | 74 + vendor/go.step.sm/crypto/keyutil/key.go | 265 + vendor/go.step.sm/crypto/pemutil/cosign.go | 79 + vendor/go.step.sm/crypto/pemutil/pem.go | 709 + vendor/go.step.sm/crypto/pemutil/pkcs8.go | 354 + vendor/go.step.sm/crypto/pemutil/ssh.go | 297 + vendor/go.step.sm/crypto/randutil/random.go | 113 + vendor/go.step.sm/crypto/x25519/x25519.go | 321 + vendor/go.uber.org/atomic/CHANGELOG.md | 10 + vendor/go.uber.org/atomic/bool.go | 2 +- vendor/go.uber.org/atomic/duration.go | 2 +- vendor/go.uber.org/atomic/error.go | 14 +- vendor/go.uber.org/atomic/float32.go | 2 +- vendor/go.uber.org/atomic/float64.go | 2 +- vendor/go.uber.org/atomic/int32.go | 2 +- vendor/go.uber.org/atomic/int64.go | 2 +- vendor/go.uber.org/atomic/pointer_go118.go | 41 +- .../atomic/pointer_go118_pre119.go | 60 + vendor/go.uber.org/atomic/string.go | 23 +- vendor/go.uber.org/atomic/string_ext.go | 15 +- vendor/go.uber.org/atomic/time.go | 2 +- vendor/go.uber.org/atomic/uint32.go | 2 +- vendor/go.uber.org/atomic/uint64.go | 2 +- vendor/go.uber.org/atomic/uintptr.go | 2 +- vendor/go.uber.org/multierr/CHANGELOG.md | 15 + vendor/go.uber.org/multierr/README.md | 22 +- vendor/go.uber.org/multierr/error.go | 63 +- .../go.uber.org/multierr/error_post_go120.go | 48 + .../go.uber.org/multierr/error_pre_go120.go | 79 + vendor/go.uber.org/multierr/glide.yaml | 8 - vendor/go.uber.org/zap/CHANGELOG.md | 21 + vendor/go.uber.org/zap/Makefile | 21 +- vendor/go.uber.org/zap/README.md | 62 +- vendor/go.uber.org/zap/buffer/pool.go | 20 +- vendor/go.uber.org/zap/config.go | 84 +- vendor/go.uber.org/zap/error.go | 9 +- vendor/go.uber.org/zap/field.go | 169 +- .../go.uber.org/zap/internal/level_enabler.go | 2 + vendor/go.uber.org/zap/internal/pool/pool.go | 58 + .../go.uber.org/zap/internal/ztest/clock.go | 50 - vendor/go.uber.org/zap/internal/ztest/doc.go | 24 - .../go.uber.org/zap/internal/ztest/timeout.go | 59 - .../go.uber.org/zap/internal/ztest/writer.go | 96 - vendor/go.uber.org/zap/level.go | 9 +- vendor/go.uber.org/zap/logger.go | 6 + vendor/go.uber.org/zap/stacktrace.go | 16 +- vendor/go.uber.org/zap/sugar.go | 69 +- .../zap/zapcore/console_encoder.go | 14 +- vendor/go.uber.org/zap/zapcore/entry.go | 18 +- vendor/go.uber.org/zap/zapcore/error.go | 9 +- .../go.uber.org/zap/zapcore/json_encoder.go | 14 +- vendor/go.uber.org/zap/zapcore/sampler.go | 9 +- vendor/go.uber.org/zap/zapgrpc/zapgrpc.go | 245 - vendor/go.uber.org/zap/zaptest/doc.go | 22 - vendor/go.uber.org/zap/zaptest/logger.go | 140 - vendor/go.uber.org/zap/zaptest/testingt.go | 47 - vendor/go.uber.org/zap/zaptest/timeout.go | 45 - vendor/go.uber.org/zap/zaptest/writer.go | 44 - vendor/go4.org/intern/LICENSE | 29 + vendor/go4.org/intern/README.md | 4 + vendor/go4.org/intern/intern.go | 183 + .../unsafe/assume-no-moving-gc/LICENSE | 29 + .../unsafe/assume-no-moving-gc/README.md | 13 + .../assume-no-moving-gc.go | 22 + .../unsafe/assume-no-moving-gc/untested.go | 26 + vendor/golang.org/x/crypto/argon2/argon2.go | 283 + vendor/golang.org/x/crypto/argon2/blake2b.go | 53 + .../x/crypto/argon2/blamka_amd64.go | 61 + .../golang.org/x/crypto/argon2/blamka_amd64.s | 244 + .../x/crypto/argon2/blamka_generic.go | 163 + .../golang.org/x/crypto/argon2/blamka_ref.go | 16 + vendor/golang.org/x/crypto/bcrypt/base64.go | 35 - vendor/golang.org/x/crypto/bcrypt/bcrypt.go | 304 - .../chacha20poly1305/chacha20poly1305.go | 98 + .../chacha20poly1305_amd64.go | 87 + .../chacha20poly1305/chacha20poly1305_amd64.s | 2696 ++ .../chacha20poly1305_generic.go | 81 + .../chacha20poly1305_noasm.go | 16 + .../chacha20poly1305/xchacha20poly1305.go | 86 + vendor/golang.org/x/crypto/cryptobyte/asn1.go | 8 + .../x/crypto/curve25519/curve25519.go | 99 +- .../x/crypto/curve25519/curve25519_compat.go | 105 + .../x/crypto/curve25519/curve25519_go120.go | 46 + vendor/golang.org/x/crypto/hkdf/hkdf.go | 93 + .../x/crypto/openpgp/packet/compressed.go | 2 +- vendor/golang.org/x/crypto/ssh/common.go | 51 +- vendor/golang.org/x/crypto/ssh/connection.go | 2 +- vendor/golang.org/x/crypto/ssh/kex.go | 12 + vendor/golang.org/x/crypto/ssh/keys.go | 6 +- vendor/golang.org/x/crypto/ssh/mac.go | 7 + vendor/golang.org/x/crypto/ssh/server.go | 21 +- vendor/golang.org/x/exp/slices/slices.go | 14 +- vendor/golang.org/x/exp/slices/sort.go | 51 +- vendor/golang.org/x/mod/modfile/print.go | 174 - vendor/golang.org/x/mod/modfile/read.go | 958 - vendor/golang.org/x/mod/modfile/rule.go | 1559 - vendor/golang.org/x/mod/modfile/work.go | 234 - vendor/golang.org/x/mod/sumdb/note/note.go | 2 +- vendor/golang.org/x/mod/zip/zip.go | 973 + vendor/golang.org/x/net/html/doc.go | 22 +- vendor/golang.org/x/net/html/render.go | 28 +- vendor/golang.org/x/net/html/token.go | 9 +- vendor/golang.org/x/net/http2/pipe.go | 6 +- vendor/golang.org/x/net/http2/server.go | 16 +- vendor/golang.org/x/net/http2/transport.go | 78 +- vendor/golang.org/x/net/http2/writesched.go | 3 +- .../x/net/http2/writesched_roundrobin.go | 119 + vendor/golang.org/x/net/idna/idna9.0.0.go | 2 +- vendor/golang.org/x/net/idna/tables13.0.0.go | 2988 +- vendor/golang.org/x/net/idna/tables15.0.0.go | 5145 +++ vendor/golang.org/x/net/idna/trie.go | 21 - vendor/golang.org/x/net/idna/trie12.0.0.go | 31 + vendor/golang.org/x/net/idna/trie13.0.0.go | 31 + .../golang.org/x/net/internal/socks/socks.go | 2 +- vendor/golang.org/x/oauth2/README.md | 12 +- .../x/oauth2/google/appengine_gen1.go | 1 - .../x/oauth2/google/appengine_gen2_flex.go | 1 - vendor/golang.org/x/oauth2/google/default.go | 25 +- vendor/golang.org/x/oauth2/google/doc.go | 61 +- vendor/golang.org/x/oauth2/google/google.go | 6 +- .../x/oauth2/internal/client_appengine.go | 1 - vendor/golang.org/x/oauth2/internal/oauth2.go | 2 +- vendor/golang.org/x/oauth2/internal/token.go | 60 +- vendor/golang.org/x/oauth2/oauth2.go | 33 +- vendor/golang.org/x/oauth2/token.go | 33 +- vendor/golang.org/x/sync/errgroup/errgroup.go | 10 +- vendor/golang.org/x/sync/errgroup/go120.go | 14 + .../golang.org/x/sync/errgroup/pre_go120.go | 15 + vendor/golang.org/x/sys/cpu/endian_little.go | 4 +- vendor/golang.org/x/sys/unix/mkall.sh | 2 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 10 +- vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + vendor/golang.org/x/sys/unix/mremap.go | 53 + vendor/golang.org/x/sys/unix/syscall_aix.go | 15 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 14 - .../golang.org/x/sys/unix/syscall_darwin.go | 50 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 88 +- .../x/sys/unix/syscall_linux_amd64.go | 2 +- .../x/sys/unix/syscall_linux_arm64.go | 2 +- .../x/sys/unix/syscall_linux_loong64.go | 2 +- .../x/sys/unix/syscall_linux_mips64x.go | 2 +- .../x/sys/unix/syscall_linux_riscv64.go | 13 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 13 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 17 +- .../golang.org/x/sys/unix/syscall_solaris.go | 14 - vendor/golang.org/x/sys/unix/syscall_unix.go | 8 + .../x/sys/unix/syscall_zos_s390x.go | 14 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 26 +- .../x/sys/unix/zerrors_linux_386.go | 9 + .../x/sys/unix/zerrors_linux_amd64.go | 9 + .../x/sys/unix/zerrors_linux_arm.go | 9 + .../x/sys/unix/zerrors_linux_arm64.go | 11 + .../x/sys/unix/zerrors_linux_loong64.go | 9 + .../x/sys/unix/zerrors_linux_mips.go | 9 + .../x/sys/unix/zerrors_linux_mips64.go | 9 + .../x/sys/unix/zerrors_linux_mips64le.go | 9 + .../x/sys/unix/zerrors_linux_mipsle.go | 9 + .../x/sys/unix/zerrors_linux_ppc.go | 9 + .../x/sys/unix/zerrors_linux_ppc64.go | 9 + .../x/sys/unix/zerrors_linux_ppc64le.go | 9 + .../x/sys/unix/zerrors_linux_riscv64.go | 9 + .../x/sys/unix/zerrors_linux_s390x.go | 9 + .../x/sys/unix/zerrors_linux_sparc64.go | 57 + .../golang.org/x/sys/unix/zsyscall_linux.go | 27 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 16 + .../x/sys/unix/zsyscall_netbsd_386.go | 11 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm64.go | 11 + .../x/sys/unix/zsyscall_openbsd_386.go | 22 + .../x/sys/unix/zsyscall_openbsd_386.s | 10 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 32 +- .../x/sys/unix/zsyscall_openbsd_amd64.s | 10 + .../x/sys/unix/zsyscall_openbsd_arm.go | 22 + .../x/sys/unix/zsyscall_openbsd_arm.s | 10 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 22 + .../x/sys/unix/zsyscall_openbsd_arm64.s | 10 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 22 + .../x/sys/unix/zsyscall_openbsd_mips64.s | 10 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 22 + .../x/sys/unix/zsyscall_openbsd_ppc64.s | 12 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 22 + .../x/sys/unix/zsyscall_openbsd_riscv64.s | 10 + .../x/sys/unix/zsysnum_linux_riscv64.go | 2 + .../x/sys/unix/zsysnum_linux_s390x.go | 1 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 86 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 + .../x/sys/unix/ztypes_linux_amd64.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 + .../x/sys/unix/ztypes_linux_arm64.go | 2 + .../x/sys/unix/ztypes_linux_loong64.go | 2 + .../x/sys/unix/ztypes_linux_mips.go | 2 + .../x/sys/unix/ztypes_linux_mips64.go | 2 + .../x/sys/unix/ztypes_linux_mips64le.go | 2 + .../x/sys/unix/ztypes_linux_mipsle.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 + .../x/sys/unix/ztypes_linux_ppc64.go | 2 + .../x/sys/unix/ztypes_linux_ppc64le.go | 2 + .../x/sys/unix/ztypes_linux_riscv64.go | 25 + .../x/sys/unix/ztypes_linux_s390x.go | 2 + .../x/sys/unix/ztypes_linux_sparc64.go | 2 + vendor/golang.org/x/sys/windows/service.go | 4 + .../x/sys/windows/syscall_windows.go | 17 +- .../x/sys/windows/zsyscall_windows.go | 8 +- vendor/golang.org/x/term/term_unix.go | 2 +- .../text/internal/language/compact/tables.go | 356 +- .../x/text/internal/language/tables.go | 4686 +-- vendor/golang.org/x/text/language/match.go | 2 +- vendor/golang.org/x/text/language/tables.go | 138 +- .../x/text/unicode/bidi/tables13.0.0.go | 4 +- .../x/text/unicode/bidi/tables15.0.0.go | 2043 ++ .../x/text/unicode/norm/tables13.0.0.go | 4 +- .../x/text/unicode/norm/tables15.0.0.go | 7908 +++++ .../golang.org/x/text/width/tables13.0.0.go | 4 +- .../golang.org/x/text/width/tables15.0.0.go | 1368 + .../x/tools/go/ast/astutil/enclosing.go | 636 - .../x/tools/go/ast/astutil/imports.go | 485 - .../x/tools/go/ast/astutil/rewrite.go | 488 - .../golang.org/x/tools/go/ast/astutil/util.go | 18 - .../x/tools/go/gcexportdata/gcexportdata.go | 11 +- .../golang.org/x/tools/go/packages/golist.go | 23 +- .../x/tools/go/packages/packages.go | 3 + .../x/tools/go/types/objectpath/objectpath.go | 762 - vendor/golang.org/x/tools/imports/forward.go | 77 - .../x/tools/internal/event/tag/tag.go | 59 + .../x/tools/internal/fastwalk/fastwalk.go | 196 - .../internal/fastwalk/fastwalk_darwin.go | 119 - .../fastwalk/fastwalk_dirent_fileno.go | 14 - .../internal/fastwalk/fastwalk_dirent_ino.go | 15 - .../fastwalk/fastwalk_dirent_namlen_bsd.go | 14 - .../fastwalk/fastwalk_dirent_namlen_linux.go | 29 - .../internal/fastwalk/fastwalk_portable.go | 38 - .../tools/internal/fastwalk/fastwalk_unix.go | 153 - .../x/tools/internal/gcimporter/bexport.go | 852 - .../x/tools/internal/gcimporter/bimport.go | 907 +- .../x/tools/internal/gcimporter/gcimporter.go | 15 +- .../x/tools/internal/gcimporter/iexport.go | 27 +- .../x/tools/internal/gcimporter/iimport.go | 43 +- .../tools/internal/gcimporter/ureader_yes.go | 9 + .../x/tools/internal/gocommand/invoke.go | 146 +- .../x/tools/internal/gocommand/version.go | 18 +- .../x/tools/internal/gopathwalk/walk.go | 254 - .../x/tools/internal/imports/fix.go | 1738 -- .../x/tools/internal/imports/imports.go | 351 - .../x/tools/internal/imports/mod.go | 716 - .../x/tools/internal/imports/mod_cache.go | 236 - .../x/tools/internal/imports/sortimports.go | 297 - .../x/tools/internal/imports/zstdlib.go | 11115 ------- .../internal/tokeninternal/tokeninternal.go | 92 + .../x/tools/internal/typesinternal/types.go | 9 - vendor/golang.org/x/xerrors/LICENSE | 27 + vendor/golang.org/x/xerrors/PATENTS | 22 + vendor/golang.org/x/xerrors/README | 2 + vendor/golang.org/x/xerrors/adaptor.go | 193 + vendor/golang.org/x/xerrors/codereview.cfg | 1 + vendor/golang.org/x/xerrors/doc.go | 23 + vendor/golang.org/x/xerrors/errors.go | 33 + vendor/golang.org/x/xerrors/fmt.go | 190 + vendor/golang.org/x/xerrors/format.go | 34 + vendor/golang.org/x/xerrors/frame.go | 56 + .../golang.org/x/xerrors/internal/internal.go | 8 + vendor/golang.org/x/xerrors/wrap.go | 112 + .../google.golang.org/api/idtoken/idtoken.go | 7 +- .../api/impersonate/idtoken.go | 3 +- .../api/impersonate/impersonate.go | 3 +- .../google.golang.org/api/impersonate/user.go | 5 +- vendor/google.golang.org/api/internal/cba.go | 300 + .../cert/default_cert.go | 0 .../cert/enterprise_cert.go | 0 .../cert/secureconnect_cert.go | 3 +- .../google.golang.org/api/internal/creds.go | 79 +- .../api/internal/impersonate/impersonate.go | 3 +- vendor/google.golang.org/api/internal/s2a.go | 136 + .../api/internal/settings.go | 1 + .../google.golang.org/api/internal/version.go | 2 +- .../option/internaloption/internaloption.go | 15 + .../api/transport/http/dial.go | 21 +- .../api/transport/internal/dca/dca.go | 143 - .../internal/socket/socket_service.pb.go | 2822 ++ .../internal/socket/socket_service.proto | 460 + .../google.golang.org/appengine/socket/doc.go | 10 + .../appengine/socket/socket_classic.go | 290 + .../appengine/socket/socket_vm.go | 64 + vendor/google.golang.org/genproto/LICENSE | 202 - .../genproto/googleapis/api}/LICENSE | 0 .../api/annotations/annotations.pb.go | 119 - .../googleapis/api/annotations/client.pb.go | 1655 - .../api/annotations/field_behavior.pb.go | 250 - .../googleapis/api/annotations/http.pb.go | 777 - .../googleapis/api/annotations/resource.pb.go | 655 - .../googleapis/api/annotations/routing.pb.go | 693 - .../googleapis/api/httpbody/httpbody.pb.go | 4 +- .../googleapis/api/launch_stage.pb.go | 203 - .../genproto/googleapis/rpc}/LICENSE | 0 .../rpc/errdetails/error_details.pb.go | 1314 - .../genproto/protobuf/api/api.go | 25 - .../protobuf/field_mask/field_mask.go | 23 - .../genproto/protobuf/ptype/type.go | 82 - .../protobuf/source_context/source_context.go | 23 - vendor/google.golang.org/grpc/CONTRIBUTING.md | 4 - .../grpc/attributes/attributes.go | 41 + .../grpc/balancer/balancer.go | 2 +- .../weightedroundrobin/weightedroundrobin.go | 68 - .../grpc/balancer/weightedtarget/logging.go | 34 - .../weightedaggregator/aggregator.go | 301 - .../balancer/weightedtarget/weightedtarget.go | 164 - .../weightedtarget/weightedtarget_config.go | 49 - .../grpc/balancer_conn_wrappers.go | 486 +- .../grpc_binarylog_v1/binarylog.pb.go | 2 +- vendor/google.golang.org/grpc/call.go | 5 + vendor/google.golang.org/grpc/clientconn.go | 709 +- .../grpc/credentials/alts/alts.go | 332 - .../alts/internal/authinfo/authinfo.go | 95 - .../grpc/credentials/alts/internal/common.go | 67 - .../alts/internal/conn/aeadrekey.go | 131 - .../alts/internal/conn/aes128gcm.go | 105 - .../alts/internal/conn/aes128gcmrekey.go | 116 - .../credentials/alts/internal/conn/common.go | 70 - .../credentials/alts/internal/conn/counter.go | 62 - .../credentials/alts/internal/conn/record.go | 275 - .../credentials/alts/internal/conn/utils.go | 63 - .../alts/internal/handshaker/handshaker.go | 391 - .../internal/handshaker/service/service.go | 60 - .../internal/proto/grpc_gcp/altscontext.pb.go | 259 - .../internal/proto/grpc_gcp/handshaker.pb.go | 1423 - .../proto/grpc_gcp/handshaker_grpc.pb.go | 170 - .../grpc_gcp/transport_security_common.pb.go | 321 - .../grpc/credentials/alts/utils.go | 70 - .../grpc/credentials/google/google.go | 145 - .../grpc/credentials/google/xds.go | 128 - .../grpc/credentials/oauth/oauth.go | 244 - .../tls/certprovider/distributor.go | 114 - .../tls/certprovider/pemfile/builder.go | 96 - .../tls/certprovider/pemfile/watcher.go | 260 - .../credentials/tls/certprovider/provider.go | 109 - .../credentials/tls/certprovider/store.go | 156 - vendor/google.golang.org/grpc/dialoptions.go | 53 + .../grpc/encoding/gzip/gzip.go | 132 - .../google.golang.org/grpc/health/client.go | 117 - .../grpc/health/grpc_health_v1/health.pb.go | 2 +- .../google.golang.org/grpc/health/logging.go | 23 - .../google.golang.org/grpc/health/server.go | 163 - vendor/google.golang.org/grpc/idle.go | 287 + .../grpc/internal/admin/admin.go | 60 - .../internal/balancergroup/balancergroup.go | 586 - .../balancergroup/balancerstateaggregator.go | 37 - .../grpc/internal/binarylog/binarylog.go | 3 + .../grpc/internal/binarylog/method_logger.go | 9 + .../grpc/internal/buffer/unbounded.go | 26 +- .../grpc/internal/cache/timeoutCache.go | 144 - .../credentials/xds/handshake_info.go | 319 - .../grpc/internal/envconfig/envconfig.go | 7 + .../grpc/internal/envconfig/observability.go | 6 + .../grpc/internal/envconfig/xds.go | 21 +- .../grpc/internal/googlecloud/googlecloud.go | 72 - .../grpc/internal/googlecloud/manufacturer.go | 26 - .../googlecloud/manufacturer_linux.go | 27 - .../googlecloud/manufacturer_windows.go | 50 - .../grpc/internal/grpcrand/grpcrand.go | 21 + .../internal/grpcsync/callback_serializer.go | 119 + .../grpc/internal/grpcsync/pubsub.go | 136 + .../grpc/internal/hierarchy/hierarchy.go | 112 - .../grpc/internal/internal.go | 24 + .../internal/proto/grpc_lookup_v1/rls.pb.go | 357 - .../proto/grpc_lookup_v1/rls_config.pb.go | 938 - .../proto/grpc_lookup_v1/rls_grpc.pb.go | 125 - .../internal/resolver/dns/dns_resolver.go | 74 +- .../grpc/internal/serviceconfig/duration.go | 130 + .../grpc/internal/transport/controlbuf.go | 17 +- .../grpc/internal/transport/handler_server.go | 11 +- .../grpc/internal/transport/http2_client.go | 27 +- .../grpc/internal/transport/http2_server.go | 65 +- .../grpc/internal/transport/http_util.go | 2 - .../grpc/internal/transport/logging.go | 40 + .../grpc/internal/transport/transport.go | 2 +- .../grpc/internal/wrr/edf.go | 92 - .../grpc/internal/wrr/random.go | 91 - .../grpc/internal/wrr/wrr.go | 32 - .../internal/xds/matcher/matcher_header.go | 243 - .../internal/xds/matcher/string_matcher.go | 184 - .../grpc/internal/xds/rbac/matchers.go | 426 - .../grpc/internal/xds/rbac/rbac_engine.go | 240 - .../google.golang.org/grpc/picker_wrapper.go | 38 +- vendor/google.golang.org/grpc/pickfirst.go | 52 +- .../grpc/reflection/README.md | 18 - .../grpc_reflection_v1alpha/reflection.pb.go | 955 - .../reflection_grpc.pb.go | 161 - .../grpc/reflection/serverreflection.go | 326 - .../grpc/resolver/manual/manual.go | 96 - .../grpc/resolver/resolver.go | 24 +- .../grpc/resolver_conn_wrapper.go | 229 +- vendor/google.golang.org/grpc/rpc_util.go | 27 +- vendor/google.golang.org/grpc/server.go | 85 +- .../google.golang.org/grpc/service_config.go | 75 +- .../grpc/shared_buffer_pool.go | 154 + .../google.golang.org/grpc/status/status.go | 53 +- vendor/google.golang.org/grpc/stream.go | 33 +- .../grpc/test/grpc_testing/test.pb.go | 924 - .../grpc/test/grpc_testing/test.proto | 156 - .../grpc/test/grpc_testing/test_grpc.pb.go | 465 - vendor/google.golang.org/grpc/version.go | 2 +- .../grpc/xds/bootstrap/bootstrap.go | 64 - .../google.golang.org/grpc/xds/csds/csds.go | 181 - .../grpc/xds/internal/balancer/balancer.go | 30 - .../balancer/cdsbalancer/cdsbalancer.go | 607 - .../balancer/cdsbalancer/cluster_handler.go | 370 - .../internal/balancer/cdsbalancer/logging.go | 34 - .../balancer/clusterimpl/clusterimpl.go | 545 - .../internal/balancer/clusterimpl/config.go | 67 - .../internal/balancer/clusterimpl/logging.go | 34 - .../internal/balancer/clusterimpl/picker.go | 190 - .../clustermanager/balancerstateaggregator.go | 260 - .../balancer/clustermanager/clustermanager.go | 156 - .../balancer/clustermanager/config.go | 46 - .../balancer/clustermanager/picker.go | 70 - .../clusterresolver/clusterresolver.go | 372 - .../balancer/clusterresolver/config.go | 166 - .../balancer/clusterresolver/configbuilder.go | 403 - .../configbuilder_childname.go | 88 - .../balancer/clusterresolver/logging.go | 34 - .../clusterresolver/resource_resolver.go | 269 - .../clusterresolver/resource_resolver_dns.go | 140 - .../clusterresolver/resource_resolver_eds.go | 77 - .../balancer/loadstore/load_store_wrapper.go | 120 - .../balancer/outlierdetection/balancer.go | 894 - .../balancer/outlierdetection/callcounter.go | 66 - .../balancer/outlierdetection/config.go | 180 - .../balancer/outlierdetection/logging.go | 34 - .../outlierdetection/subconn_wrapper.go | 68 - .../internal/balancer/priority/balancer.go | 272 - .../balancer/priority/balancer_child.go | 173 - .../balancer/priority/balancer_priority.go | 204 - .../xds/internal/balancer/priority/config.go | 67 - .../balancer/priority/ignore_resolve_now.go | 58 - .../xds/internal/balancer/priority/logging.go | 34 - .../xds/internal/balancer/priority/utils.go | 31 - .../xds/internal/balancer/ringhash/config.go | 63 - .../xds/internal/balancer/ringhash/logging.go | 38 - .../xds/internal/balancer/ringhash/picker.go | 181 - .../xds/internal/balancer/ringhash/ring.go | 169 - .../internal/balancer/ringhash/ringhash.go | 523 - .../xds/internal/balancer/ringhash/util.go | 40 - .../clusterspecifier/cluster_specifier.go | 72 - .../xds/internal/clusterspecifier/rls/rls.go | 109 - .../xds/internal/httpfilter/fault/fault.go | 301 - .../xds/internal/httpfilter/httpfilter.go | 108 - .../grpc/xds/internal/httpfilter/rbac/rbac.go | 215 - .../xds/internal/httpfilter/router/router.go | 114 - .../grpc/xds/internal/internal.go | 85 - .../grpc/xds/internal/resolver/logging.go | 34 - .../xds/internal/resolver/serviceconfig.go | 439 - .../xds/internal/resolver/watch_service.go | 203 - .../xds/internal/resolver/xds_resolver.go | 323 - .../grpc/xds/internal/server/conn_wrapper.go | 165 - .../xds/internal/server/listener_wrapper.go | 442 - .../grpc/xds/internal/server/rds_handler.go | 133 - .../grpc/xds/internal/xdsclient/attributes.go | 36 - .../grpc/xds/internal/xdsclient/authority.go | 582 - .../internal/xdsclient/bootstrap/bootstrap.go | 546 - .../internal/xdsclient/bootstrap/logging.go | 28 - .../internal/xdsclient/bootstrap/template.go | 47 - .../internal/xdsclient/callback_serializer.go | 65 - .../grpc/xds/internal/xdsclient/client.go | 59 - .../grpc/xds/internal/xdsclient/client_new.go | 166 - .../grpc/xds/internal/xdsclient/clientimpl.go | 89 - .../xdsclient/clientimpl_authority.go | 140 - .../xds/internal/xdsclient/clientimpl_dump.go | 53 - .../xdsclient/clientimpl_loadreport.go | 47 - .../internal/xdsclient/clientimpl_watchers.go | 239 - .../xds/internal/xdsclient/load/reporter.go | 27 - .../grpc/xds/internal/xdsclient/load/store.go | 426 - .../grpc/xds/internal/xdsclient/logging.go | 34 - .../internal/xdsclient/requests_counter.go | 107 - .../grpc/xds/internal/xdsclient/singleton.go | 115 - .../xdsclient/transport/loadreport.go | 274 - .../internal/xdsclient/transport/transport.go | 633 - .../xdsresource/cluster_resource_type.go | 148 - .../xdsresource/endpoints_resource_type.go | 144 - .../internal/xdsclient/xdsresource/errors.go | 66 - .../xdsclient/xdsresource/filter_chain.go | 869 - .../xdsresource/listener_resource_type.go | 181 - .../internal/xdsclient/xdsresource/logging.go | 28 - .../internal/xdsclient/xdsresource/matcher.go | 278 - .../xdsclient/xdsresource/matcher_path.go | 102 - .../internal/xdsclient/xdsresource/name.go | 133 - .../xdsclient/xdsresource/resource_type.go | 164 - .../xdsresource/route_config_resource_type.go | 145 - .../internal/xdsclient/xdsresource/type.go | 167 - .../xdsclient/xdsresource/type_cds.go | 174 - .../xdsclient/xdsresource/type_eds.go | 83 - .../xdsclient/xdsresource/type_lds.go | 87 - .../xdsclient/xdsresource/type_rds.go | 255 - .../xdsclient/xdsresource/unmarshal_cds.go | 597 - .../xdsclient/xdsresource/unmarshal_eds.go | 165 - .../xdsclient/xdsresource/unmarshal_lds.go | 278 - .../xdsclient/xdsresource/unmarshal_rds.go | 440 - .../xdsclient/xdsresource/version/version.go | 41 - vendor/google.golang.org/grpc/xds/server.go | 424 - .../grpc/xds/server_options.go | 76 - vendor/google.golang.org/grpc/xds/xds.go | 95 - .../cmd/protoc-gen-go/internal_gengo/init.go | 168 - .../cmd/protoc-gen-go/internal_gengo/main.go | 896 - .../protoc-gen-go/internal_gengo/reflect.go | 372 - .../internal_gengo/well_known_types.go | 1079 - .../protobuf/cmd/protoc-gen-go/main.go | 56 - .../protobuf/compiler/protogen/protogen.go | 1357 - .../protobuf/encoding/protojson/encode.go | 14 +- .../protobuf/encoding/prototext/encode.go | 14 +- .../protobuf/internal/encoding/json/encode.go | 10 +- .../protobuf/internal/encoding/text/encode.go | 10 +- .../protobuf/internal/genid/descriptor_gen.go | 48 + .../protobuf/internal/genid/type_gen.go | 6 + .../protobuf/internal/msgfmt/format.go | 261 - .../protobuf/internal/order/order.go | 2 +- .../protobuf/internal/version/version.go | 2 +- .../google.golang.org/protobuf/proto/size.go | 10 +- .../protobuf/reflect/protopath/path.go | 122 - .../protobuf/reflect/protopath/step.go | 241 - .../protobuf/reflect/protorange/range.go | 316 - .../reflect/protoreflect/source_gen.go | 27 + .../types/descriptorpb/descriptor.pb.go | 1011 +- .../protobuf/types/dynamicpb/types.go | 177 + .../protobuf/types/known/anypb/any.pb.go | 70 +- .../protobuf/types/known/apipb/api.pb.go | 575 - .../sourcecontextpb/source_context.pb.go | 176 - .../types/known/structpb/struct.pb.go | 2 +- .../types/known/timestamppb/timestamp.pb.go | 2 +- .../protobuf/types/known/typepb/type.pb.go | 964 - .../protobuf/types/pluginpb/plugin.pb.go | 656 - .../gopkg.in/DataDog/dd-trace-go.v1/LICENSE | 234 + .../dd-trace-go.v1/LICENSE-3rdparty.csv | 4 + .../DataDog/dd-trace-go.v1/LICENSE-APACHE | 200 + .../DataDog/dd-trace-go.v1/LICENSE-BSD3 | 24 + vendor/gopkg.in/DataDog/dd-trace-go.v1/NOTICE | 4 + .../DataDog/dd-trace-go.v1/ddtrace/ddtrace.go | 158 + .../dd-trace-go.v1/ddtrace/ext/app_types.go | 81 + .../DataDog/dd-trace-go.v1/ddtrace/ext/db.go | 87 + .../dd-trace-go.v1/ddtrace/ext/messaging.go | 25 + .../dd-trace-go.v1/ddtrace/ext/peer.go | 20 + .../dd-trace-go.v1/ddtrace/ext/priority.go | 27 + .../DataDog/dd-trace-go.v1/ddtrace/ext/rpc.go | 34 + .../dd-trace-go.v1/ddtrace/ext/span_kind.go | 32 + .../dd-trace-go.v1/ddtrace/ext/system.go | 12 + .../dd-trace-go.v1/ddtrace/ext/tags.go | 120 + .../ddtrace/internal/globaltracer.go | 104 + .../dd-trace-go.v1/ddtrace/tracer/context.go | 62 + .../dd-trace-go.v1/ddtrace/tracer/doc.go | 110 + .../dd-trace-go.v1/ddtrace/tracer/log.go | 128 + .../dd-trace-go.v1/ddtrace/tracer/metrics.go | 110 + .../dd-trace-go.v1/ddtrace/tracer/option.go | 1052 + .../dd-trace-go.v1/ddtrace/tracer/payload.go | 153 + .../ddtrace/tracer/propagating_tags.go | 68 + .../ddtrace/tracer/propagator.go | 57 + .../dd-trace-go.v1/ddtrace/tracer/rand.go | 56 + .../ddtrace/tracer/rules_sampler.go | 593 + .../dd-trace-go.v1/ddtrace/tracer/sampler.go | 150 + .../dd-trace-go.v1/ddtrace/tracer/span.go | 724 + .../ddtrace/tracer/span_msgp.go | 453 + .../ddtrace/tracer/spancontext.go | 511 + .../ddtrace/tracer/sqlcomment.go | 300 + .../dd-trace-go.v1/ddtrace/tracer/stats.go | 350 + .../ddtrace/tracer/stats_payload.go | 56 + .../ddtrace/tracer/stats_payload_msgp.go | 450 + .../ddtrace/tracer/telemetry.go | 79 + .../dd-trace-go.v1/ddtrace/tracer/textmap.go | 998 + .../dd-trace-go.v1/ddtrace/tracer/time.go | 17 + .../ddtrace/tracer/time_windows.go | 48 + .../dd-trace-go.v1/ddtrace/tracer/tracer.go | 668 + .../ddtrace/tracer/transport.go | 214 + .../dd-trace-go.v1/ddtrace/tracer/util.go | 124 + .../dd-trace-go.v1/ddtrace/tracer/writer.go | 339 + .../DataDog/dd-trace-go.v1/internal/agent.go | 36 + .../dd-trace-go.v1/internal/appsec/appsec.go | 183 + .../internal/appsec/appsec_disabled.go | 38 + .../dd-trace-go.v1/internal/appsec/config.go | 189 + .../appsec/dyngo/instrumentation/common.go | 166 + .../dyngo/instrumentation/grpcsec/grpc.go | 209 + .../dyngo/instrumentation/grpcsec/tags.go | 35 + .../dyngo/instrumentation/httpsec/http.go | 323 + .../dyngo/instrumentation/httpsec/tags.go | 115 + .../instrumentation/sharedsec/actions.go | 135 + .../sharedsec/blocked-template.html | 1 + .../sharedsec/blocked-template.json | 1 + .../dyngo/instrumentation/sharedsec/shared.go | 80 + .../internal/appsec/dyngo/operation.go | 353 + .../dd-trace-go.v1/internal/appsec/limiter.go | 143 + .../internal/appsec/remoteconfig.go | 381 + .../dd-trace-go.v1/internal/appsec/rules.go | 17 + .../dd-trace-go.v1/internal/appsec/rules.json | 7079 +++++ .../internal/appsec/rules_manager.go | 147 + .../dd-trace-go.v1/internal/appsec/waf.go | 555 + .../dd-trace-go.v1/internal/container.go | 71 + .../DataDog/dd-trace-go.v1/internal/env.go | 94 + .../dd-trace-go.v1/internal/gitmetadata.go | 123 + .../internal/gitmetadatabinary.go | 41 + .../internal/gitmetadatabinary_legacy.go | 19 + .../internal/globalconfig/globalconfig.go | 95 + .../internal/hostname/azure/azure.go | 63 + .../internal/hostname/cachedfetch/fetcher.go | 86 + .../internal/hostname/ec2/ec2.go | 72 + .../internal/hostname/ecs/aws.go | 54 + .../internal/hostname/fqdn_nix.go | 28 + .../internal/hostname/fqdn_windows.go | 14 + .../internal/hostname/gce/gce.go | 120 + .../internal/hostname/httputils/helpers.go | 74 + .../internal/hostname/providers.go | 245 + .../internal/hostname/validate/validate.go | 57 + .../dd-trace-go.v1/internal/log/log.go | 243 + .../internal/namingschema/namingschema.go | 117 + .../internal/namingschema/op_cache.go | 46 + .../internal/namingschema/op_client_server.go | 85 + .../internal/namingschema/op_db.go | 50 + .../internal/namingschema/op_messaging.go | 84 + .../internal/namingschema/option.go | 20 + .../internal/namingschema/service_name.go | 50 + .../internal/normalizer/normalizer.go | 50 + .../dd-trace-go.v1/internal/osinfo/osinfo.go | 21 + .../internal/osinfo/osinfo_darwin.go | 24 + .../internal/osinfo/osinfo_default.go | 21 + .../internal/osinfo/osinfo_freebsd.go | 24 + .../internal/osinfo/osinfo_linux.go | 52 + .../internal/osinfo/osinfo_windows.go | 54 + .../internal/remoteconfig/config.go | 75 + .../internal/remoteconfig/remoteconfig.go | 414 + .../internal/remoteconfig/types.go | 83 + .../internal/samplernames/samplernames.go | 37 + .../internal/telemetry/client.go | 580 + .../internal/telemetry/message.go | 257 + .../internal/telemetry/option.go | 142 + .../internal/telemetry/telemetry.go | 115 + .../internal/telemetry/utils.go | 50 + .../dd-trace-go.v1/internal/trace_context.go | 47 + .../internal/traceprof/endpoint_counter.go | 105 + .../internal/traceprof/profiler.go | 35 + .../internal/traceprof/traceprof.go | 21 + .../DataDog/dd-trace-go.v1/internal/utils.go | 64 + .../internal/version/version.go | 43 + vendor/gopkg.in/cheggaaa/pb.v1/.travis.yml | 9 - vendor/gopkg.in/cheggaaa/pb.v1/LICENSE | 12 - vendor/gopkg.in/cheggaaa/pb.v1/README.md | 177 - vendor/gopkg.in/cheggaaa/pb.v1/format.go | 125 - vendor/gopkg.in/cheggaaa/pb.v1/pb.go | 500 - .../gopkg.in/cheggaaa/pb.v1/pb_appengine.go | 11 - vendor/gopkg.in/cheggaaa/pb.v1/pb_win.go | 143 - vendor/gopkg.in/cheggaaa/pb.v1/pb_x.go | 118 - vendor/gopkg.in/cheggaaa/pb.v1/pool.go | 104 - vendor/gopkg.in/cheggaaa/pb.v1/pool_win.go | 45 - vendor/gopkg.in/cheggaaa/pb.v1/pool_x.go | 29 - vendor/gopkg.in/cheggaaa/pb.v1/reader.go | 25 - vendor/gopkg.in/cheggaaa/pb.v1/runecount.go | 17 - vendor/gopkg.in/cheggaaa/pb.v1/termios_bsd.go | 9 - .../gopkg.in/cheggaaa/pb.v1/termios_sysv.go | 13 - .../natefinch/lumberjack.v2/.gitignore | 23 - .../natefinch/lumberjack.v2/.travis.yml | 6 - .../gopkg.in/natefinch/lumberjack.v2/LICENSE | 21 - .../natefinch/lumberjack.v2/README.md | 179 - .../gopkg.in/natefinch/lumberjack.v2/chown.go | 11 - .../natefinch/lumberjack.v2/chown_linux.go | 19 - .../natefinch/lumberjack.v2/lumberjack.go | 541 - .../go-jose.v2/cryptosigner/cryptosigner.go | 138 + vendor/gotest.tools/v3/assert/assert.go | 69 +- vendor/gotest.tools/v3/assert/cmp/compare.go | 25 +- vendor/gotest.tools/v3/assert/cmp/result.go | 12 +- vendor/inet.af/netaddr/.gitignore | 3 + vendor/inet.af/netaddr/.gitmodules | 3 + vendor/inet.af/netaddr/AUTHORS | 4 + vendor/inet.af/netaddr/LICENSE | 27 + vendor/inet.af/netaddr/README.md | 46 + vendor/inet.af/netaddr/fuzz.go | 203 + vendor/inet.af/netaddr/ipset.go | 497 + vendor/inet.af/netaddr/mask6.go | 141 + vendor/inet.af/netaddr/netaddr.go | 1919 ++ vendor/inet.af/netaddr/uint128.go | 82 + .../admissionregistration/v1/generated.pb.go | 484 +- .../admissionregistration/v1/generated.proto | 73 + .../api/admissionregistration/v1/types.go | 73 + .../v1/types_swagger_doc_generated.go | 14 +- .../v1/zz_generated.deepcopy.go | 26 + .../v1alpha1/generated.pb.go | 1565 +- .../v1alpha1/generated.proto | 228 +- .../admissionregistration/v1alpha1/types.go | 217 +- .../v1alpha1/types_swagger_doc_generated.go | 67 +- .../v1alpha1/zz_generated.deepcopy.go | 113 + .../v1beta1/generated.pb.go | 465 +- .../v1beta1/generated.proto | 73 + .../admissionregistration/v1beta1/types.go | 73 + .../v1beta1/types_swagger_doc_generated.go | 14 +- .../v1beta1/zz_generated.deepcopy.go | 26 + .../v1alpha1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/apps/v1/generated.proto | 5 +- vendor/k8s.io/api/apps/v1/types.go | 5 +- .../apps/v1/types_swagger_doc_generated.go | 10 +- .../k8s.io/api/apps/v1beta1/generated.proto | 57 +- vendor/k8s.io/api/apps/v1beta1/types.go | 57 +- .../v1beta1/types_swagger_doc_generated.go | 60 +- .../k8s.io/api/apps/v1beta2/generated.proto | 7 +- vendor/k8s.io/api/apps/v1beta2/types.go | 7 +- .../v1beta2/types_swagger_doc_generated.go | 12 +- .../v1/types_swagger_doc_generated.go | 2 +- .../authentication/v1alpha1/generated.proto | 3 +- .../api/authentication/v1alpha1/types.go | 5 +- .../v1alpha1/types_swagger_doc_generated.go | 4 +- .../zz_generated.prerelease-lifecycle.go | 6 +- .../authentication/v1beta1/generated.pb.go | 476 +- .../authentication/v1beta1/generated.proto | 21 + .../api/authentication/v1beta1/register.go | 1 + .../api/authentication/v1beta1/types.go | 27 + .../v1beta1/types_swagger_doc_generated.go | 21 +- .../v1beta1/zz_generated.deepcopy.go | 44 + .../zz_generated.prerelease-lifecycle.go | 18 + .../v1/types_swagger_doc_generated.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/autoscaling/v1/generated.proto | 42 +- vendor/k8s.io/api/autoscaling/v1/types.go | 79 +- .../v1/types_swagger_doc_generated.go | 42 +- .../k8s.io/api/autoscaling/v2/generated.proto | 20 +- vendor/k8s.io/api/autoscaling/v2/types.go | 61 +- .../v2/types_swagger_doc_generated.go | 22 +- .../api/autoscaling/v2beta1/generated.proto | 2 +- .../k8s.io/api/autoscaling/v2beta1/types.go | 2 +- .../v2beta1/types_swagger_doc_generated.go | 4 +- .../api/autoscaling/v2beta2/generated.proto | 24 +- .../k8s.io/api/autoscaling/v2beta2/types.go | 62 +- .../v2beta2/types_swagger_doc_generated.go | 26 +- vendor/k8s.io/api/batch/v1/generated.proto | 32 +- vendor/k8s.io/api/batch/v1/types.go | 46 +- .../batch/v1/types_swagger_doc_generated.go | 30 +- .../k8s.io/api/batch/v1beta1/generated.pb.go | 317 +- .../k8s.io/api/batch/v1beta1/generated.proto | 15 +- vendor/k8s.io/api/batch/v1beta1/register.go | 1 - vendor/k8s.io/api/batch/v1beta1/types.go | 20 +- .../v1beta1/types_swagger_doc_generated.go | 16 +- .../batch/v1beta1/zz_generated.deepcopy.go | 27 - .../zz_generated.prerelease-lifecycle.go | 18 - vendor/k8s.io/api/certificates/v1/types.go | 3 +- .../v1/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/certificates/v1alpha1/doc.go | 24 + .../api/certificates/v1alpha1/generated.pb.go | 831 + .../api/certificates/v1alpha1/generated.proto | 103 + .../api/certificates/v1alpha1/register.go | 61 + .../k8s.io/api/certificates/v1alpha1/types.go | 106 + .../v1alpha1/types_swagger_doc_generated.go | 60 + .../v1alpha1/zz_generated.deepcopy.go | 102 + .../zz_generated.prerelease-lifecycle.go | 58 + .../api/certificates/v1beta1/generated.proto | 6 +- .../k8s.io/api/certificates/v1beta1/types.go | 9 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../api/coordination/v1/generated.proto | 6 +- vendor/k8s.io/api/coordination/v1/types.go | 6 +- .../v1/types_swagger_doc_generated.go | 8 +- .../api/coordination/v1beta1/generated.proto | 6 +- .../k8s.io/api/coordination/v1beta1/types.go | 6 +- .../v1beta1/types_swagger_doc_generated.go | 8 +- .../api/core/v1/annotation_key_constants.go | 21 +- vendor/k8s.io/api/core/v1/generated.pb.go | 2800 +- vendor/k8s.io/api/core/v1/generated.proto | 148 +- vendor/k8s.io/api/core/v1/toleration.go | 14 +- vendor/k8s.io/api/core/v1/types.go | 227 +- .../core/v1/types_swagger_doc_generated.go | 67 +- .../api/core/v1/zz_generated.deepcopy.go | 40 +- .../k8s.io/api/discovery/v1/generated.proto | 26 +- vendor/k8s.io/api/discovery/v1/types.go | 42 +- .../v1/types_swagger_doc_generated.go | 14 +- .../api/discovery/v1beta1/generated.proto | 13 +- vendor/k8s.io/api/discovery/v1beta1/types.go | 30 +- .../v1beta1/types_swagger_doc_generated.go | 12 +- .../events/v1/types_swagger_doc_generated.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../api/extensions/v1beta1/generated.pb.go | 11046 +++---- .../api/extensions/v1beta1/generated.proto | 289 +- .../k8s.io/api/extensions/v1beta1/register.go | 2 - vendor/k8s.io/api/extensions/v1beta1/types.go | 385 +- .../v1beta1/types_swagger_doc_generated.go | 164 +- .../v1beta1/zz_generated.deepcopy.go | 366 - .../zz_generated.prerelease-lifecycle.go | 48 - .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../v1beta2/types_swagger_doc_generated.go | 2 +- .../v1beta3/types_swagger_doc_generated.go | 2 +- .../k8s.io/api/networking/v1/generated.proto | 176 +- vendor/k8s.io/api/networking/v1/types.go | 188 +- .../v1/types_swagger_doc_generated.go | 120 +- .../api/networking/v1alpha1/generated.pb.go | 1199 +- .../api/networking/v1alpha1/generated.proto | 79 +- .../api/networking/v1alpha1/register.go | 12 +- .../k8s.io/api/networking/v1alpha1/types.go | 86 +- .../v1alpha1/types_swagger_doc_generated.go | 56 +- .../networking/v1alpha1/well_known_labels.go | 33 + .../v1alpha1/zz_generated.deepcopy.go | 97 + .../zz_generated.prerelease-lifecycle.go | 36 + .../api/networking/v1beta1/generated.proto | 78 +- vendor/k8s.io/api/networking/v1beta1/types.go | 87 +- .../v1beta1/types_swagger_doc_generated.go | 72 +- vendor/k8s.io/api/node/v1/generated.proto | 10 +- vendor/k8s.io/api/node/v1/types.go | 12 +- .../node/v1/types_swagger_doc_generated.go | 12 +- .../k8s.io/api/node/v1alpha1/generated.proto | 14 +- vendor/k8s.io/api/node/v1alpha1/types.go | 16 +- .../v1alpha1/types_swagger_doc_generated.go | 14 +- .../k8s.io/api/node/v1beta1/generated.proto | 12 +- vendor/k8s.io/api/node/v1beta1/types.go | 14 +- .../v1beta1/types_swagger_doc_generated.go | 12 +- vendor/k8s.io/api/policy/v1/generated.proto | 4 +- vendor/k8s.io/api/policy/v1/types.go | 4 +- .../policy/v1/types_swagger_doc_generated.go | 4 +- .../k8s.io/api/policy/v1beta1/generated.proto | 4 +- vendor/k8s.io/api/policy/v1beta1/types.go | 4 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../rbac/v1/types_swagger_doc_generated.go | 2 +- .../v1alpha1/types_swagger_doc_generated.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- vendor/k8s.io/api/resource/v1alpha1/doc.go | 24 - .../api/resource/v1alpha1/generated.pb.go | 4593 --- .../api/resource/v1alpha1/generated.proto | 372 - .../k8s.io/api/resource/v1alpha1/register.go | 63 - vendor/k8s.io/api/resource/v1alpha1/types.go | 430 - .../v1alpha1/types_swagger_doc_generated.go | 222 - .../v1alpha1/zz_generated.deepcopy.go | 477 - vendor/k8s.io/api/resource/v1alpha2/doc.go | 24 + .../api/resource/v1alpha2/generated.pb.go | 4817 +++ .../api/resource/v1alpha2/generated.proto | 400 + .../k8s.io/api/resource/v1alpha2/register.go | 63 + vendor/k8s.io/api/resource/v1alpha2/types.go | 462 + .../v1alpha2/types_swagger_doc_generated.go | 232 + .../v1alpha2/zz_generated.deepcopy.go | 498 + .../k8s.io/api/scheduling/v1/generated.proto | 4 +- vendor/k8s.io/api/scheduling/v1/types.go | 4 +- .../v1/types_swagger_doc_generated.go | 6 +- .../api/scheduling/v1alpha1/generated.proto | 4 +- .../k8s.io/api/scheduling/v1alpha1/types.go | 4 +- .../v1alpha1/types_swagger_doc_generated.go | 6 +- .../api/scheduling/v1beta1/generated.proto | 4 +- vendor/k8s.io/api/scheduling/v1beta1/types.go | 4 +- .../v1beta1/types_swagger_doc_generated.go | 6 +- vendor/k8s.io/api/storage/v1/generated.proto | 126 +- vendor/k8s.io/api/storage/v1/types.go | 132 +- .../storage/v1/types_swagger_doc_generated.go | 82 +- .../api/storage/v1alpha1/generated.proto | 38 +- vendor/k8s.io/api/storage/v1alpha1/types.go | 41 +- .../v1alpha1/types_swagger_doc_generated.go | 38 +- .../api/storage/v1beta1/generated.proto | 112 +- vendor/k8s.io/api/storage/v1beta1/types.go | 119 +- .../v1beta1/types_swagger_doc_generated.go | 78 +- .../pkg/apis/apiextensions/v1/generated.proto | 2 +- .../pkg/apis/apiextensions/v1/types.go | 2 +- .../k8s.io/apimachinery/pkg/api/meta/help.go | 3 +- .../pkg/apis/meta/internalversion/defaults.go | 38 + .../pkg/apis/meta/internalversion/types.go | 25 + .../zz_generated.conversion.go | 2 + .../internalversion/zz_generated.deepcopy.go | 5 + .../pkg/apis/meta/v1/generated.pb.go | 385 +- .../pkg/apis/meta/v1/generated.proto | 69 +- .../apimachinery/pkg/apis/meta/v1/types.go | 69 +- .../meta/v1/types_swagger_doc_generated.go | 25 +- .../apis/meta/v1/zz_generated.conversion.go | 7 + .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 5 + .../v1beta1/types_swagger_doc_generated.go | 2 +- .../k8s.io/apimachinery/pkg/labels/labels.go | 2 + .../apimachinery/pkg/labels/selector.go | 131 +- .../pkg/runtime/schema/group_version.go | 6 +- .../k8s.io/apimachinery/pkg/runtime/scheme.go | 3 +- .../pkg/runtime/serializer/codec_factory.go | 3 +- .../serializer/versioning/versioning.go | 2 +- .../k8s.io/apimachinery/pkg/runtime/types.go | 2 +- .../apimachinery/pkg/types/namespacedname.go | 11 + .../pkg/util/duration/duration.go | 4 +- .../apimachinery/pkg/util/errors/errors.go | 2 +- .../apimachinery/pkg/util/framer/framer.go | 2 +- .../pkg/util/managedfields/endpoints.yaml | 7018 +++++ .../pkg/util/managedfields/fieldmanager.go | 57 + .../managedfields/internal/atmostevery.go | 60 + .../internal/buildmanagerinfo.go | 74 + .../managedfields/internal/capmanagers.go | 133 + .../util/managedfields/internal/conflict.go | 89 + .../managedfields/internal/fieldmanager.go | 206 + .../pkg/util/managedfields/internal/fields.go | 47 + .../managedfields/internal/lastapplied.go | 50 + .../internal/lastappliedmanager.go | 171 + .../internal/lastappliedupdater.go | 102 + .../managedfields/internal/managedfields.go | 248 + .../internal/managedfieldsupdater.go | 82 + .../util/managedfields/internal/manager.go | 52 + .../managedfields/internal/pathelement.go | 140 + .../managedfields/internal/skipnonapplied.go | 91 + .../util/managedfields/internal/stripmeta.go | 90 + .../managedfields/internal/structuredmerge.go | 183 + .../managedfields/internal/typeconverter.go | 193 + .../internal/versionconverter.go | 123 + .../pkg/util/managedfields/node.yaml | 261 + .../pkg/util/managedfields/pod.yaml | 121 + .../pkg/util/managedfields/scalehandler.go | 174 + .../pkg/util/managedfields/typeconverter.go | 47 + .../apimachinery/pkg/util/mergepatch/util.go | 3 +- .../k8s.io/apimachinery/pkg/util/sets/set.go | 14 + .../pkg/util/strategicpatch/OWNERS | 1 + .../pkg/util/strategicpatch/patch.go | 2 +- .../pkg/util/validation/validation.go | 8 +- .../apimachinery/pkg/util/wait/backoff.go | 502 + .../apimachinery/pkg/util/wait/delay.go | 51 + .../apimachinery/pkg/util/wait/error.go | 96 + .../k8s.io/apimachinery/pkg/util/wait/loop.go | 86 + .../k8s.io/apimachinery/pkg/util/wait/poll.go | 315 + .../apimachinery/pkg/util/wait/timer.go | 121 + .../k8s.io/apimachinery/pkg/util/wait/wait.go | 634 +- .../v1/matchcondition.go | 48 + .../v1/mutatingwebhook.go | 14 + .../v1/validatingwebhook.go | 14 + .../v1alpha1/admissionpolicyspec.go | 75 - .../v1alpha1/auditannotation.go | 48 + .../v1alpha1/expressionwarning.go | 48 + .../v1alpha1/matchcondition.go | 48 + .../v1alpha1/paramsource.go | 48 - .../admissionregistration/v1alpha1/rule.go | 76 - .../v1alpha1/rulewithoperations.go | 85 - .../v1alpha1/typechecking.go | 44 + .../v1alpha1/validatingadmissionpolicy.go | 11 +- .../validatingadmissionpolicybindingspec.go | 21 +- .../v1alpha1/validatingadmissionpolicyspec.go | 28 + .../validatingadmissionpolicystatus.go | 66 + .../v1alpha1/validation.go | 15 +- .../v1beta1/matchcondition.go | 48 + .../v1beta1/mutatingwebhook.go | 14 + .../admissionregistration/v1beta1/rule.go | 76 - .../v1beta1/rulewithoperations.go | 85 - .../v1beta1/validatingwebhook.go | 14 + .../autoscaling/v2/podresourcemetricsource.go | 52 - .../v1alpha1/clustertrustbundle.go | 247 + .../v1alpha1/clustertrustbundlespec.go | 48 + .../applyconfigurations/core/v1/container.go | 58 +- .../core/v1/containerresizepolicy.go | 52 + .../core/v1/containerstatus.go | 40 +- .../core/v1/ephemeralcontainer.go | 13 + .../core/v1/ephemeralcontainercommon.go | 58 +- .../applyconfigurations/core/v1/podstatus.go | 9 + .../core/v1/servicespec.go | 8 +- .../extensions/v1beta1/allowedcsidriver.go | 39 - .../extensions/v1beta1/allowedflexvolume.go | 39 - .../extensions/v1beta1/allowedhostpath.go | 48 - .../v1beta1/fsgroupstrategyoptions.go | 57 - .../extensions/v1beta1/hostportrange.go | 48 - .../extensions/v1beta1/idrange.go | 48 - .../extensions/v1beta1/podsecuritypolicy.go | 247 - .../v1beta1/podsecuritypolicyspec.go | 285 - .../v1beta1/runasgroupstrategyoptions.go | 57 - .../v1beta1/runasuserstrategyoptions.go | 57 - .../v1beta1/runtimeclassstrategyoptions.go | 50 - .../v1beta1/selinuxstrategyoptions.go | 53 - .../supplementalgroupsstrategyoptions.go | 57 - .../applyconfigurations/internal/internal.go | 554 +- .../meta/v1/groupversionkind.go | 57 - .../applyconfigurations/meta/v1/listmeta.go | 66 - .../applyconfigurations/meta/v1/status.go | 142 - .../meta/v1/statuscause.go | 61 - .../meta/v1/statusdetails.go | 93 - .../networking/v1alpha1/ipaddress.go | 247 + .../networking/v1alpha1/ipaddressspec.go | 39 + .../networking/v1alpha1/parentreference.go | 79 + .../resource/v1alpha1/podscheduling.go | 258 - .../resource/v1alpha1/podschedulingspec.go | 50 - .../resource/v1alpha1/podschedulingstatus.go | 44 - .../resource/v1alpha1/resourceclaim.go | 258 - .../v1alpha1/resourceclaimtemplate.go | 249 - .../resource/v1alpha1/resourceclass.go | 266 - .../allocationresult.go | 19 +- .../resource/v1alpha2/podschedulingcontext.go | 258 + .../v1alpha2/podschedulingcontextspec.go | 50 + .../v1alpha2/podschedulingcontextstatus.go | 44 + .../resource/v1alpha2/resourceclaim.go | 258 + .../resourceclaimconsumerreference.go | 2 +- .../resourceclaimparametersreference.go | 2 +- .../resourceclaimschedulingstatus.go | 2 +- .../resourceclaimspec.go | 8 +- .../resourceclaimstatus.go | 2 +- .../v1alpha2/resourceclaimtemplate.go | 249 + .../resourceclaimtemplatespec.go | 2 +- .../resource/v1alpha2/resourceclass.go | 266 + .../resourceclassparametersreference.go | 2 +- .../resource/v1alpha2/resourcehandle.go | 48 + .../discovery/aggregated_discovery.go | 58 +- .../client-go/discovery/discovery_client.go | 64 +- .../informers/certificates/interface.go | 8 + .../v1alpha1/clustertrustbundle.go | 89 + .../certificates/v1alpha1/interface.go | 45 + vendor/k8s.io/client-go/informers/doc.go | 18 + .../informers/extensions/v1beta1/interface.go | 7 - .../extensions/v1beta1/podsecuritypolicy.go | 89 - vendor/k8s.io/client-go/informers/generic.go | 29 +- .../networking/v1alpha1/interface.go | 7 + .../networking/v1alpha1/ipaddress.go | 89 + .../client-go/informers/resource/interface.go | 12 +- .../informers/resource/v1alpha1/interface.go | 66 - .../resource/v1alpha1/podscheduling.go | 90 - .../resource/v1alpha1/resourceclaim.go | 90 - .../v1alpha1/resourceclaimtemplate.go | 90 - .../resource/v1alpha1/resourceclass.go | 89 - .../informers/resource/v1alpha2/interface.go | 66 + .../resource/v1alpha2/podschedulingcontext.go | 90 + .../resource/v1alpha2/resourceclaim.go | 90 + .../v1alpha2/resourceclaimtemplate.go | 90 + .../resource/v1alpha2/resourceclass.go | 89 + .../k8s.io/client-go/kubernetes/clientset.go | 29 +- vendor/k8s.io/client-go/kubernetes/doc.go | 7 +- .../client-go/kubernetes/scheme/register.go | 6 +- .../v1alpha1/validatingadmissionpolicy.go | 46 + .../v1beta1/authentication_client.go | 5 + .../v1beta1/generated_expansion.go | 2 + .../v1beta1/selfsubjectreview.go | 64 + .../v1alpha1/certificates_client.go | 107 + .../v1alpha1/clustertrustbundle.go | 197 + .../v1alpha1/doc.go | 0 .../v1alpha1/generated_expansion.go | 21 + .../typed/events/v1beta1/event_expansion.go | 3 +- .../extensions/v1beta1/extensions_client.go | 5 - .../extensions/v1beta1/generated_expansion.go | 2 - .../extensions/v1beta1/podsecuritypolicy.go | 197 - .../v1alpha1/generated_expansion.go | 2 + .../typed/networking/v1alpha1/ipaddress.go | 197 + .../networking/v1alpha1/networking_client.go | 5 + .../resource/v1alpha1/generated_expansion.go | 27 - .../typed/resource/v1alpha1/podscheduling.go | 256 - .../resource/v1alpha1/resource_client.go | 122 - .../typed/resource/v1alpha1/resourceclaim.go | 256 - .../v1alpha1/resourceclaimtemplate.go | 208 - .../typed/resource/v1alpha1/resourceclass.go | 197 - .../kubernetes/typed/resource/v1alpha2/doc.go | 20 + .../resource/v1alpha2/generated_expansion.go | 27 + .../resource/v1alpha2/podschedulingcontext.go | 256 + .../resource/v1alpha2/resource_client.go | 122 + .../typed/resource/v1alpha2/resourceclaim.go | 256 + .../v1alpha2/resourceclaimtemplate.go | 208 + .../typed/resource/v1alpha2/resourceclass.go | 197 + .../v1alpha1/clustertrustbundle.go | 68 + .../v1alpha1/expansion_generated.go | 23 + .../extensions/v1beta1/expansion_generated.go | 4 - .../extensions/v1beta1/podsecuritypolicy.go | 68 - .../v1alpha1/expansion_generated.go | 4 + .../listers/networking/v1alpha1/ipaddress.go | 68 + .../resource/v1alpha1/expansion_generated.go | 47 - .../resource/v1alpha1/podscheduling.go | 99 - .../resource/v1alpha1/resourceclaim.go | 99 - .../v1alpha1/resourceclaimtemplate.go | 99 - .../resource/v1alpha1/resourceclass.go | 68 - .../resource/v1alpha2/expansion_generated.go | 47 + .../resource/v1alpha2/podschedulingcontext.go | 99 + .../resource/v1alpha2/resourceclaim.go | 99 + .../v1alpha2/resourceclaimtemplate.go | 99 + .../resource/v1alpha2/resourceclass.go | 68 + vendor/k8s.io/client-go/openapi/OWNERS | 4 + vendor/k8s.io/client-go/openapi/client.go | 7 +- .../k8s.io/client-go/openapi/groupversion.go | 42 +- vendor/k8s.io/client-go/pkg/version/base.go | 3 +- vendor/k8s.io/client-go/rest/client.go | 3 +- vendor/k8s.io/client-go/rest/request.go | 45 +- vendor/k8s.io/client-go/rest/with_retry.go | 18 +- .../client-go/tools/cache/controller.go | 92 +- .../client-go/tools/cache/delta_fifo.go | 142 +- vendor/k8s.io/client-go/tools/cache/fifo.go | 14 +- .../k8s.io/client-go/tools/cache/reflector.go | 477 +- .../client-go/tools/cache/shared_informer.go | 147 +- .../client-go/tools/cache/synctrack/lazy.go | 83 + .../tools/cache/synctrack/synctrack.go | 120 + .../k8s.io/client-go/tools/metrics/metrics.go | 17 + vendor/k8s.io/client-go/util/cert/cert.go | 2 +- .../util/workqueue/delaying_queue.go | 61 +- .../client-go/util/workqueue/metrics.go | 9 +- .../k8s.io/client-go/util/workqueue/queue.go | 53 +- .../util/workqueue/rate_limiting_queue.go | 61 +- vendor/k8s.io/klog/v2/contextual.go | 30 +- vendor/k8s.io/klog/v2/format.go | 65 + .../k8s.io/klog/v2/internal/buffer/buffer.go | 75 +- .../klog/v2/internal/serialize/keyvalues.go | 232 +- vendor/k8s.io/klog/v2/k8s_references.go | 78 +- vendor/k8s.io/klog/v2/klog.go | 148 +- vendor/k8s.io/klog/v2/klogr.go | 12 +- .../k8s.io/kube-openapi/pkg/cached/cache.go | 264 + .../k8s.io/kube-openapi/pkg/common/common.go | 48 +- .../kube-openapi/pkg/handler3/handler.go | 245 +- .../k8s.io/kube-openapi/pkg/internal/flags.go | 4 + .../pkg/internal/handler/handler_cache.go | 57 - .../pkg/internal/serialization.go | 65 + .../go-json-experiment/json/arshal.go | 7 + .../go-json-experiment/json/arshal_any.go | 31 +- .../go-json-experiment/json/arshal_default.go | 147 +- .../go-json-experiment/json/arshal_inlined.go | 57 +- .../go-json-experiment/json/arshal_methods.go | 4 +- .../go-json-experiment/json/arshal_time.go | 99 +- .../go-json-experiment/json/decode.go | 12 +- .../go-json-experiment/json/doc.go | 9 +- .../go-json-experiment/json/encode.go | 24 + .../go-json-experiment/json/pools.go | 32 + .../go-json-experiment/json/state.go | 4 +- .../go-json-experiment/json/token.go | 10 +- .../go-json-experiment/json/value.go | 56 +- .../kube-openapi/pkg/schemaconv/openapi.go | 260 + .../pkg/schemaconv/proto_models.go | 178 + .../k8s.io/kube-openapi/pkg/schemaconv/smd.go | 306 +- .../k8s.io/kube-openapi/pkg/spec3/encoding.go | 22 +- .../k8s.io/kube-openapi/pkg/spec3/example.go | 25 +- .../pkg/spec3/external_documentation.go | 21 +- vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go | 254 + .../k8s.io/kube-openapi/pkg/spec3/header.go | 21 + .../kube-openapi/pkg/spec3/media_type.go | 22 +- .../kube-openapi/pkg/spec3/operation.go | 22 +- .../kube-openapi/pkg/spec3/parameter.go | 22 + vendor/k8s.io/kube-openapi/pkg/spec3/path.go | 82 +- .../kube-openapi/pkg/spec3/request_body.go | 23 +- .../k8s.io/kube-openapi/pkg/spec3/response.go | 121 +- .../pkg/spec3/security_requirement.go | 56 - .../kube-openapi/pkg/spec3/security_scheme.go | 2 +- .../k8s.io/kube-openapi/pkg/spec3/server.go | 41 +- vendor/k8s.io/kube-openapi/pkg/spec3/spec.go | 13 + .../pkg/util/proto/document_v3.go | 4 +- .../pkg/validation/spec/header.go | 23 +- .../kube-openapi/pkg/validation/spec/info.go | 33 +- .../kube-openapi/pkg/validation/spec/items.go | 53 +- .../pkg/validation/spec/operation.go | 36 +- .../pkg/validation/spec/parameter.go | 36 +- .../pkg/validation/spec/path_item.go | 28 +- .../kube-openapi/pkg/validation/spec/paths.go | 24 +- .../kube-openapi/pkg/validation/spec/ref.go | 18 +- .../pkg/validation/spec/response.go | 36 +- .../pkg/validation/spec/responses.go | 24 +- .../pkg/validation/spec/schema.go | 79 +- .../pkg/validation/spec/security_scheme.go | 20 +- .../pkg/validation/spec/swagger.go | 82 +- .../kube-openapi/pkg/validation/spec/tag.go | 19 +- vendor/k8s.io/utils/net/ipfamily.go | 181 + vendor/k8s.io/utils/net/net.go | 126 +- vendor/k8s.io/utils/net/port.go | 18 +- vendor/k8s.io/utils/trace/trace.go | 19 + vendor/knative.dev/pkg/apis/OWNERS | 14 +- vendor/knative.dev/pkg/apis/duck/OWNERS | 6 +- .../pkg/apis/duck/v1/addressable_types.go | 21 +- .../pkg/apis/duck/v1/destination.go | 34 + .../pkg/apis/duck/v1/knative_reference.go | 13 + .../pkg/apis/duck/v1/kresource_type.go | 7 + .../pkg/apis/duck/v1/source_types.go | 5 + .../pkg/apis/duck/v1/zz_generated.deepcopy.go | 34 +- .../apis/duck/v1alpha1/addressable_types.go | 12 +- .../duck/v1alpha1/zz_generated.deepcopy.go | 7 + .../apis/duck/v1beta1/addressable_types.go | 21 +- .../pkg/apis/duck/v1beta1/destination.go | 28 + .../duck/v1beta1/zz_generated.deepcopy.go | 22 + vendor/knative.dev/pkg/apis/field_error.go | 7 +- vendor/knative.dev/pkg/changeset/commit.go | 5 +- vendor/knative.dev/pkg/configmap/OWNERS | 6 - vendor/knative.dev/pkg/kmeta/OWNERS | 5 - vendor/knative.dev/pkg/kmeta/names.go | 17 +- vendor/knative.dev/pkg/logging/OWNERS | 6 - vendor/knative.dev/pkg/metrics/OWNERS | 10 - vendor/knative.dev/pkg/metrics/config.go | 47 +- .../pkg/metrics/config_observability.go | 71 + .../pkg/metrics/opencensus_exporter.go | 2 +- .../pkg/metrics/prometheus_exporter.go | 7 +- vendor/modules.txt | 1139 +- .../internal/golang/encoding/json/decode.go | 5 +- .../internal/golang/encoding/json/encode.go | 37 +- .../internal/golang/encoding/json/fold.go | 5 +- .../internal/golang/encoding/json/scanner.go | 2 + .../internal/golang/encoding/json/stream.go | 1 - vendor/sigs.k8s.io/json/json.go | 28 +- .../release-utils/version/command.go | 5 + .../v4/merge/conflict.go | 121 + .../structured-merge-diff/v4/merge/update.go | 356 + 4879 files changed, 465076 insertions(+), 577081 deletions(-) delete mode 100644 vendor/bitbucket.org/creachadair/shell/LICENSE delete mode 100644 vendor/bitbucket.org/creachadair/shell/README.md delete mode 100644 vendor/bitbucket.org/creachadair/shell/bitbucket-pipelines.yml delete mode 100644 vendor/bitbucket.org/creachadair/shell/shell.go delete mode 100644 vendor/cuelang.org/go/cue/builtinutil.go create mode 100644 vendor/cuelang.org/go/cue/load/instances.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/mvs/errors.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/mvs/graph.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/mvs/mvs.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.18.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.19.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/par/queue.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/par/work.go create mode 100644 vendor/cuelang.org/go/cue/load/internal/slices/slices.go create mode 100644 vendor/cuelang.org/go/cue/load/loader_common.go create mode 100644 vendor/cuelang.org/go/cue/load/module.go create mode 100644 vendor/cuelang.org/go/cue/load/moduleschema.cue create mode 100644 vendor/cuelang.org/go/cue/load/registry.go create mode 100644 vendor/cuelang.org/go/cue/stats/stats.go create mode 100644 vendor/cuelang.org/go/internal/core/adt/cycle.go create mode 100644 vendor/cuelang.org/go/internal/core/adt/prof.go create mode 100644 vendor/cuelang.org/go/internal/core/export/self.go create mode 100644 vendor/cuelang.org/go/internal/core/runtime/extern.go rename vendor/cuelang.org/go/{pkg/internal => internal/pkg}/builtin.go (88%) create mode 100644 vendor/cuelang.org/go/internal/pkg/context.go create mode 100644 vendor/cuelang.org/go/internal/pkg/errors.go create mode 100644 vendor/cuelang.org/go/internal/pkg/register.go create mode 100644 vendor/cuelang.org/go/internal/pkg/types.go delete mode 100644 vendor/cuelang.org/go/pkg/internal/context.go delete mode 100644 vendor/cuelang.org/go/pkg/internal/errors.go delete mode 100644 vendor/cuelang.org/go/pkg/internal/register.go create mode 100644 vendor/cuelang.org/go/pkg/net/url.go create mode 100644 vendor/cuelang.org/go/pkg/packages.txt delete mode 100644 vendor/cuelang.org/go/pkg/tool/cli/doc.go create mode 100644 vendor/cuelang.org/go/pkg/tool/cli/doc.txt delete mode 100644 vendor/cuelang.org/go/pkg/tool/doc.go create mode 100644 vendor/cuelang.org/go/pkg/tool/doc.txt delete mode 100644 vendor/cuelang.org/go/pkg/tool/exec/doc.go create mode 100644 vendor/cuelang.org/go/pkg/tool/exec/doc.txt delete mode 100644 vendor/cuelang.org/go/pkg/tool/file/doc.go create mode 100644 vendor/cuelang.org/go/pkg/tool/file/doc.txt delete mode 100644 vendor/cuelang.org/go/pkg/tool/generate.go delete mode 100644 vendor/cuelang.org/go/pkg/tool/http/doc.go create mode 100644 vendor/cuelang.org/go/pkg/tool/http/doc.txt delete mode 100644 vendor/cuelang.org/go/pkg/tool/os/doc.go create mode 100644 vendor/cuelang.org/go/pkg/tool/os/doc.txt create mode 100644 vendor/cuelang.org/go/pkg/tool/pkg.go create mode 100644 vendor/filippo.io/edwards25519/LICENSE create mode 100644 vendor/filippo.io/edwards25519/README.md create mode 100644 vendor/filippo.io/edwards25519/doc.go create mode 100644 vendor/filippo.io/edwards25519/edwards25519.go create mode 100644 vendor/filippo.io/edwards25519/extra.go create mode 100644 vendor/filippo.io/edwards25519/field/fe.go create mode 100644 vendor/filippo.io/edwards25519/field/fe_amd64.go create mode 100644 vendor/filippo.io/edwards25519/field/fe_amd64.s create mode 100644 vendor/filippo.io/edwards25519/field/fe_amd64_noasm.go create mode 100644 vendor/filippo.io/edwards25519/field/fe_arm64.go create mode 100644 vendor/filippo.io/edwards25519/field/fe_arm64.s create mode 100644 vendor/filippo.io/edwards25519/field/fe_arm64_noasm.go create mode 100644 vendor/filippo.io/edwards25519/field/fe_extra.go create mode 100644 vendor/filippo.io/edwards25519/field/fe_generic.go create mode 100644 vendor/filippo.io/edwards25519/scalar.go create mode 100644 vendor/filippo.io/edwards25519/scalarmult.go create mode 100644 vendor/filippo.io/edwards25519/tables.go create mode 100644 vendor/github.com/Azure/go-autorest/autorest/azure/auth/README.md create mode 100644 vendor/github.com/DataDog/appsec-internal-go/LICENSE create mode 100644 vendor/github.com/DataDog/appsec-internal-go/httpsec/client_ip.go create mode 100644 vendor/github.com/DataDog/appsec-internal-go/netip/ip_default.go create mode 100644 vendor/github.com/DataDog/appsec-internal-go/netip/ip_go119.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/LICENSE create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/cache.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/credit_cards.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/http.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json_scanner.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/memcached.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/obfuscate.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis_tokenizer.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql_tokenizer.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/LICENSE create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/configs.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/path.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/repository.go create mode 100644 vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/tuf.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/LICENSE.txt create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/README.md create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/aggregator.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/buffer.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/buffer_pool.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/buffered_metric_context.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/container.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/event.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/fnv1a.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/format.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/metrics.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/noop.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/options.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/pipe.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/pipe_windows.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/sender.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/service_check.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/statsd.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/telemetry.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/udp.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/uds.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/uds_windows.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/utils.go create mode 100644 vendor/github.com/DataDog/datadog-go/v5/statsd/worker.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/.gitattributes create mode 100644 vendor/github.com/DataDog/go-libddwaf/.gitignore create mode 100644 vendor/github.com/DataDog/go-libddwaf/LICENSE create mode 100644 vendor/github.com/DataDog/go-libddwaf/README.md create mode 100644 vendor/github.com/DataDog/go-libddwaf/cgo_ref_pool.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/context.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/ctypes.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/decoder.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/embed_darwin_amd64.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/embed_darwin_arm64.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/embed_linux_amd64.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/embed_linux_arm64.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/encoder.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/handle.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.s create mode 100644 vendor/github.com/DataDog/go-libddwaf/lib/darwin-amd64/_libddwaf.dylib create mode 100644 vendor/github.com/DataDog/go-libddwaf/lib/darwin-arm64/_libddwaf.dylib create mode 100644 vendor/github.com/DataDog/go-libddwaf/lib/linux-amd64/libddwaf.so create mode 100644 vendor/github.com/DataDog/go-libddwaf/lib/linux-arm64/libddwaf.so create mode 100644 vendor/github.com/DataDog/go-libddwaf/lib_dl.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/safe.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/symbols_linux_cgo.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/symbols_linux_purego.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/waf.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/waf_dl.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/waf_dl_unsupported.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/waf_unsupported_go.go create mode 100644 vendor/github.com/DataDog/go-libddwaf/waf_unsupported_target.go create mode 100644 vendor/github.com/DataDog/go-tuf/LICENSE create mode 100644 vendor/github.com/DataDog/go-tuf/client/client.go create mode 100644 vendor/github.com/DataDog/go-tuf/client/delegations.go create mode 100644 vendor/github.com/DataDog/go-tuf/client/errors.go create mode 100644 vendor/github.com/DataDog/go-tuf/client/local_store.go create mode 100644 vendor/github.com/DataDog/go-tuf/client/remote_store.go create mode 100644 vendor/github.com/DataDog/go-tuf/data/hex_bytes.go create mode 100644 vendor/github.com/DataDog/go-tuf/data/types.go create mode 100644 vendor/github.com/DataDog/go-tuf/internal/roles/roles.go create mode 100644 vendor/github.com/DataDog/go-tuf/internal/sets/strings.go create mode 100644 vendor/github.com/DataDog/go-tuf/pkg/keys/ecdsa.go create mode 100644 vendor/github.com/DataDog/go-tuf/pkg/keys/ed25519.go create mode 100644 vendor/github.com/DataDog/go-tuf/pkg/keys/keys.go create mode 100644 vendor/github.com/DataDog/go-tuf/pkg/keys/rsa.go create mode 100644 vendor/github.com/DataDog/go-tuf/pkg/targets/delegation.go create mode 100644 vendor/github.com/DataDog/go-tuf/pkg/targets/hash_bins.go create mode 100644 vendor/github.com/DataDog/go-tuf/util/util.go create mode 100644 vendor/github.com/DataDog/go-tuf/verify/db.go create mode 100644 vendor/github.com/DataDog/go-tuf/verify/errors.go create mode 100644 vendor/github.com/DataDog/go-tuf/verify/verify.go create mode 100644 vendor/github.com/DataDog/sketches-go/LICENSE create mode 100644 vendor/github.com/DataDog/sketches-go/LICENSE-3rdparty.csv create mode 100644 vendor/github.com/DataDog/sketches-go/NOTICE create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/ddsketch.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/encoding/encoding.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/encoding/flag.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/mapping/bit_operation_helper.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/mapping/cubically_interpolated_mapping.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/mapping/index_mapping.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/mapping/linearly_interpolated_mapping.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/mapping/logarithmic_mapping.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/pb/sketchpb/ddsketch.pb.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/stat/summary.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/bin.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/buffered_paginated.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/collapsing_highest_dense_store.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/collapsing_lowest_dense_store.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/dense_store.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/sparse.go create mode 100644 vendor/github.com/DataDog/sketches-go/ddsketch/store/store.go create mode 100644 vendor/github.com/Microsoft/go-winio/internal/fs/doc.go create mode 100644 vendor/github.com/Microsoft/go-winio/internal/fs/fs.go create mode 100644 vendor/github.com/Microsoft/go-winio/internal/fs/security.go create mode 100644 vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go create mode 100644 vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/AUTHORS create mode 100644 vendor/github.com/ProtonMail/go-crypto/CONTRIBUTORS create mode 100644 vendor/github.com/ProtonMail/go-crypto/LICENSE create mode 100644 vendor/github.com/ProtonMail/go-crypto/PATENTS create mode 100644 vendor/github.com/ProtonMail/go-crypto/bitcurves/bitcurve.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/brainpool/brainpool.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/brainpool/rcurve.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/eax/eax.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/eax/eax_test_vectors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/eax/random_vectors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/internal/byteutil/byteutil.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/ocb.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/random_vectors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_a.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/ocb/rfc7253_test_vectors_suite_b.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/aes/keywrap/keywrap.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/armor/armor.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/armor/encode.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/canonical_text.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/ecdh/ecdh.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/ecdsa/ecdsa.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/eddsa/eddsa.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/elgamal/elgamal.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/errors/errors.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/hash.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/aead.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/cipher.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/algorithm/hash.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve25519.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curve_info.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/curves.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed25519.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/ed448.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/generic.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/ecc/x448.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/encoding.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/mpi.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/internal/encoding/oid.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/key_generation.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/keys.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/keys_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_config.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_crypter.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/aead_encrypted.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/compressed.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/config.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/encrypted_key.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/literal.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/notation.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/ocfb.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/one_pass_signature.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/opaque.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/packet.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/private_key_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/public_key_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/reader.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/signature.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetric_key_encrypted.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_aead.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/symmetrically_encrypted_mdc.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userattribute.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/packet/userid.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/read.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/read_write_test_data.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_cache.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/s2k/s2k_config.go create mode 100644 vendor/github.com/ProtonMail/go-crypto/openpgp/write.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/recursion_detection.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/auth/scheme.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/arn.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/generate.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/host.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partition.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json create mode 100644 vendor/github.com/aws/smithy-go/endpoints/endpoint.go create mode 100644 vendor/github.com/aws/smithy-go/properties.go delete mode 100644 vendor/github.com/benbjohnson/clock/LICENSE delete mode 100644 vendor/github.com/benbjohnson/clock/README.md delete mode 100644 vendor/github.com/benbjohnson/clock/clock.go delete mode 100644 vendor/github.com/bgentry/speakeasy/.gitignore delete mode 100644 vendor/github.com/bgentry/speakeasy/LICENSE delete mode 100644 vendor/github.com/bgentry/speakeasy/LICENSE_WINDOWS delete mode 100644 vendor/github.com/bgentry/speakeasy/Readme.md delete mode 100644 vendor/github.com/bgentry/speakeasy/speakeasy.go delete mode 100644 vendor/github.com/bgentry/speakeasy/speakeasy_unix.go delete mode 100644 vendor/github.com/bgentry/speakeasy/speakeasy_windows.go create mode 100644 vendor/github.com/buildkite/agent/v3/LICENSE.txt create mode 100644 vendor/github.com/buildkite/agent/v3/api/agents.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/annotations.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/artifacts.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/auth.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/chunks.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/client.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/doc.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/header_times.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/heartbeats.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/jobs.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/meta_data.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/oidc.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/pings.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/pipelines.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/retryable.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/steps.go create mode 100644 vendor/github.com/buildkite/agent/v3/api/uuid.go create mode 100644 vendor/github.com/buildkite/agent/v3/env/environment.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/ordered/map.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/ordered/slice.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/ordered/strings.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/ordered/tuple.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/ordered/unmarshal.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/ordered/yaml.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/doc.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/interpolate.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/json.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/parser.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/pipeline.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/plugin.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/plugins.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/sign.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_command.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_group.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_input.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_scalar.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_trigger.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_unknown.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/step_wait.go create mode 100644 vendor/github.com/buildkite/agent/v3/internal/pipeline/steps.go create mode 100644 vendor/github.com/buildkite/agent/v3/logger/buffer.go create mode 100644 vendor/github.com/buildkite/agent/v3/logger/field.go create mode 100644 vendor/github.com/buildkite/agent/v3/logger/init_windows.go create mode 100644 vendor/github.com/buildkite/agent/v3/logger/level.go create mode 100644 vendor/github.com/buildkite/agent/v3/logger/log.go create mode 100644 vendor/github.com/buildkite/agent/v3/tracetools/doc.go create mode 100644 vendor/github.com/buildkite/agent/v3/tracetools/propagate.go create mode 100644 vendor/github.com/buildkite/agent/v3/tracetools/span.go create mode 100644 vendor/github.com/buildkite/agent/v3/version/VERSION create mode 100644 vendor/github.com/buildkite/agent/v3/version/version.go create mode 100644 vendor/github.com/buildkite/interpolate/LICENSE.txt create mode 100644 vendor/github.com/buildkite/interpolate/README.md create mode 100644 vendor/github.com/buildkite/interpolate/env.go create mode 100644 vendor/github.com/buildkite/interpolate/interpolate.go create mode 100644 vendor/github.com/buildkite/interpolate/parser.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/.gitignore delete mode 100644 vendor/github.com/cenkalti/backoff/v4/LICENSE delete mode 100644 vendor/github.com/cenkalti/backoff/v4/README.md delete mode 100644 vendor/github.com/cenkalti/backoff/v4/backoff.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/context.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/exponential.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/retry.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/ticker.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/timer.go delete mode 100644 vendor/github.com/cenkalti/backoff/v4/tries.go create mode 100644 vendor/github.com/cloudflare/circl/LICENSE create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/curve.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.h create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/curve_amd64.s create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/curve_generic.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/curve_noasm.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/doc.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/key.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x25519/table.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/curve.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.h create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/curve_amd64.s create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/curve_generic.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/curve_noasm.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/doc.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/key.go create mode 100644 vendor/github.com/cloudflare/circl/dh/x448/table.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/constants.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/curve.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/isogeny.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/point.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/scalar.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/twist.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/twistPoint.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/twistTables.go create mode 100644 vendor/github.com/cloudflare/circl/ecc/goldilocks/twist_basemult.go create mode 100644 vendor/github.com/cloudflare/circl/internal/conv/conv.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/doc.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/hashes.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/keccakf.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/rc.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/sha3.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/sha3_s390x.s create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/shake.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/xor.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/xor_generic.go create mode 100644 vendor/github.com/cloudflare/circl/internal/sha3/xor_unaligned.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp25519/fp.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.h create mode 100644 vendor/github.com/cloudflare/circl/math/fp25519/fp_amd64.s create mode 100644 vendor/github.com/cloudflare/circl/math/fp25519/fp_generic.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp25519/fp_noasm.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fp.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.h create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fp_amd64.s create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fp_generic.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fp_noasm.go create mode 100644 vendor/github.com/cloudflare/circl/math/fp448/fuzzer.go create mode 100644 vendor/github.com/cloudflare/circl/math/mlsbset/mlsbset.go create mode 100644 vendor/github.com/cloudflare/circl/math/mlsbset/power.go create mode 100644 vendor/github.com/cloudflare/circl/math/wnaf.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/ed25519.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/modular.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/mult.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/point.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/pubkey.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/pubkey112.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/signapi.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed25519/tables.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed448/ed448.go create mode 100644 vendor/github.com/cloudflare/circl/sign/ed448/signapi.go create mode 100644 vendor/github.com/cloudflare/circl/sign/sign.go delete mode 100644 vendor/github.com/cncf/udpa/go/udpa/type/v1/typed_struct.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/migrate.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/migrate.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/security.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/security.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/sensitive.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/sensitive.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/status.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/status.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/versioning.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/annotations/versioning.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/type/v1/typed_struct.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/udpa/type/v1/typed_struct.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/migrate.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/migrate.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/security.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/security.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/sensitive.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/sensitive.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/status.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/status.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/versioning.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/annotations/v3/versioning.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/authority.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/authority.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/cidr.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/cidr.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/collection_entry.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/collection_entry.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/context_params.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/context_params.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/extension.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/extension.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/resource.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/resource.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/resource_locator.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/resource_locator.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/resource_name.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/core/v3/resource_name.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/data/orca/v3/orca_load_report.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/cel.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/cel.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/domain.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/domain.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/http_inputs.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/http_inputs.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/ip.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/ip.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/matcher.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/matcher.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/range.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/range.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/regex.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/regex.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/string.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/matcher/v3/string.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/v3/cel.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/v3/cel.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/v3/range.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/v3/range.pb.validate.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/v3/typed_struct.pb.go delete mode 100644 vendor/github.com/cncf/xds/go/xds/type/v3/typed_struct.pb.validate.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/.travis.yml delete mode 100644 vendor/github.com/cockroachdb/apd/v2/README.md delete mode 100644 vendor/github.com/cockroachdb/apd/v2/const.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/context.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/error.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/format.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/loop.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/round.go delete mode 100644 vendor/github.com/cockroachdb/apd/v2/table.go rename vendor/github.com/cockroachdb/apd/{v2 => v3}/LICENSE (100%) create mode 100644 vendor/github.com/cockroachdb/apd/v3/README.md create mode 100644 vendor/github.com/cockroachdb/apd/v3/bigint.go create mode 100644 vendor/github.com/cockroachdb/apd/v3/bigint_go1.15.go rename vendor/github.com/cockroachdb/apd/{v2 => v3}/condition.go (98%) create mode 100644 vendor/github.com/cockroachdb/apd/v3/const.go create mode 100644 vendor/github.com/cockroachdb/apd/v3/context.go rename vendor/github.com/cockroachdb/apd/{v2 => v3}/decimal.go (85%) create mode 100644 vendor/github.com/cockroachdb/apd/v3/decomposer.go rename vendor/github.com/cockroachdb/apd/{v2 => v3}/doc.go (100%) create mode 100644 vendor/github.com/cockroachdb/apd/v3/error.go rename vendor/github.com/cockroachdb/apd/{v2 => v3}/form_string.go (100%) create mode 100644 vendor/github.com/cockroachdb/apd/v3/format.go create mode 100644 vendor/github.com/cockroachdb/apd/v3/loop.go create mode 100644 vendor/github.com/cockroachdb/apd/v3/round.go create mode 100644 vendor/github.com/cockroachdb/apd/v3/table.go delete mode 100644 vendor/github.com/coreos/go-semver/NOTICE delete mode 100644 vendor/github.com/coreos/go-semver/semver/semver.go delete mode 100644 vendor/github.com/coreos/go-semver/semver/sort.go delete mode 100644 vendor/github.com/coreos/go-systemd/v22/LICENSE delete mode 100644 vendor/github.com/coreos/go-systemd/v22/NOTICE delete mode 100644 vendor/github.com/coreos/go-systemd/v22/journal/journal.go delete mode 100644 vendor/github.com/coreos/go-systemd/v22/journal/journal_unix.go delete mode 100644 vendor/github.com/coreos/go-systemd/v22/journal/journal_windows.go delete mode 100644 vendor/github.com/cpuguy83/go-md2man/v2/LICENSE.md delete mode 100644 vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go delete mode 100644 vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/LICENSE create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/README.md create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/compressedbytepoints.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/curve.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/doc.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ecdh.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/ellipticadaptor.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/error.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/field.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/loadprecomputed.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/modnscalar.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/nonce.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/privkey.go create mode 100644 vendor/github.com/decred/dcrd/dcrec/secp256k1/v4/pubkey.go rename vendor/github.com/{soheilhy/cmux => digitorus/pkcs7}/.gitignore (100%) create mode 100644 vendor/github.com/digitorus/pkcs7/LICENSE create mode 100644 vendor/github.com/digitorus/pkcs7/Makefile create mode 100644 vendor/github.com/digitorus/pkcs7/README.md create mode 100644 vendor/github.com/digitorus/pkcs7/ber.go create mode 100644 vendor/github.com/digitorus/pkcs7/decrypt.go create mode 100644 vendor/github.com/digitorus/pkcs7/encrypt.go create mode 100644 vendor/github.com/digitorus/pkcs7/pkcs7.go create mode 100644 vendor/github.com/digitorus/pkcs7/sign.go create mode 100644 vendor/github.com/digitorus/pkcs7/verify.go create mode 100644 vendor/github.com/digitorus/pkcs7/verify_test_dsa.go create mode 100644 vendor/github.com/digitorus/timestamp/LICENSE create mode 100644 vendor/github.com/digitorus/timestamp/README.md create mode 100644 vendor/github.com/digitorus/timestamp/borrowed.go create mode 100644 vendor/github.com/digitorus/timestamp/rfc3161_struct.go create mode 100644 vendor/github.com/digitorus/timestamp/signing_cert_v2_struct.go create mode 100644 vendor/github.com/digitorus/timestamp/timestamp.go create mode 100644 vendor/github.com/ebitengine/purego/.gitignore rename vendor/github.com/{envoyproxy/go-control-plane => ebitengine/purego}/LICENSE (100%) create mode 100644 vendor/github.com/ebitengine/purego/README.md create mode 100644 vendor/github.com/ebitengine/purego/cgo.go create mode 100644 vendor/github.com/ebitengine/purego/dlerror.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_darwin.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_linux.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_nocgo_linux.go create mode 100644 vendor/github.com/ebitengine/purego/dlfcn_stubs.s create mode 100644 vendor/github.com/ebitengine/purego/dummy.go create mode 100644 vendor/github.com/ebitengine/purego/func.go create mode 100644 vendor/github.com/ebitengine/purego/go_runtime.go create mode 100644 vendor/github.com/ebitengine/purego/internal/abi/abi_amd64.h create mode 100644 vendor/github.com/ebitengine/purego/internal/abi/abi_arm64.h create mode 100644 vendor/github.com/ebitengine/purego/internal/abi/dummy.go create mode 100644 vendor/github.com/ebitengine/purego/internal/cgo/syscall_cgo_linux.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/asm_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/callbacks.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/doc.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_darwin_amd64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_darwin_arm64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux_amd64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_linux_arm64.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_setenv.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/go_util.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/iscgo.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/libcgo.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/setenv.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols_darwin.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/symbols_linux.go create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/internal/fakecgo/trampolines_stubs.s create mode 100644 vendor/github.com/ebitengine/purego/internal/strings/strings.go create mode 100644 vendor/github.com/ebitengine/purego/is_ios.go create mode 100644 vendor/github.com/ebitengine/purego/nocgo.go create mode 100644 vendor/github.com/ebitengine/purego/sys_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/sys_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/sys_unix_arm64.s create mode 100644 vendor/github.com/ebitengine/purego/syscall.go create mode 100644 vendor/github.com/ebitengine/purego/syscall_cgo_linux.go create mode 100644 vendor/github.com/ebitengine/purego/syscall_sysv.go create mode 100644 vendor/github.com/ebitengine/purego/syscall_windows.go create mode 100644 vendor/github.com/ebitengine/purego/zcallback_amd64.s create mode 100644 vendor/github.com/ebitengine/purego/zcallback_arm64.s create mode 100644 vendor/github.com/emicklei/proto/noop_visitor.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/certs.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/certs.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/clusters.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/clusters.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/config_dump.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/init_dump.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/init_dump.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/listeners.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/listeners.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/memory.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/memory.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/metrics.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/metrics.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/mutex_stats.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/mutex_stats.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/server_info.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/server_info.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/tap.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/admin/v3/tap.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/deprecation.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/deprecation.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/resource.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/annotations/resource.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/accesslog/v3/accesslog.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/accesslog/v3/accesslog.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/bootstrap/v3/bootstrap.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/bootstrap/v3/bootstrap.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/circuit_breaker.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/circuit_breaker.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/cluster.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/cluster.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/filter.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/filter.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/outlier_detection.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3/outlier_detection.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/common/matcher/v3/matcher.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/common/matcher/v3/matcher.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/address.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/address.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/backoff.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/backoff.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/base.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/base.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/config_source.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/config_source.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/event_service_config.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/event_service_config.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/extension.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/extension.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_method_list.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_method_list.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_service.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/grpc_service.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/health_check.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/health_check.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_uri.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/http_uri.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/protocol.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/protocol.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/proxy_protocol.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/proxy_protocol.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/resolver.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/resolver.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_option.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/socket_option.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/substitution_format_string.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/substitution_format_string.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/udp_socket_config.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/core/v3/udp_socket_config.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint_components.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/endpoint_components.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/load_report.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3/load_report.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/api_listener.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/api_listener.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener_components.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/listener_components.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/quic_config.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/quic_config.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/udp_listener_config.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/listener/v3/udp_listener_config.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/metrics_service.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/metrics_service.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/stats.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/metrics/v3/stats.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/overload/v3/overload.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/overload/v3/overload.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/rbac/v3/rbac.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/rbac/v3/rbac.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route_components.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/route_components.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/scoped_route.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/route/v3/scoped_route.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/tap/v3/common.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/tap/v3/common.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/datadog.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/datadog.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/dynamic_ot.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/dynamic_ot.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/http_tracer.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/http_tracer.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/lightstep.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/lightstep.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opencensus.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opencensus.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opentelemetry.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/opentelemetry.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/service.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/service.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/skywalking.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/skywalking.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/trace.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/trace.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/xray.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/xray.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/zipkin.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/config/trace/v3/zipkin.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3/cluster.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3/cluster.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/common/fault/v3/fault.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/common/fault/v3/fault.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3/fault.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/fault/v3/fault.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/rbac/v3/rbac.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/rbac/v3/rbac.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3/router.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3/router.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/cert.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/cert.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/common.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/common.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/secret.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/secret.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/ads.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/ads.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/discovery.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3/discovery.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/load_stats/v3/lrs.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/load_stats/v3/lrs.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/status/v3/csds.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/service/status/v3/csds.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/cookie.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/cookie.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/path_transformation.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/http/v3/path_transformation.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/http_inputs.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/http_inputs.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/metadata.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/metadata.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/node.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/node.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/number.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/number.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/path.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/path.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/regex.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/regex.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/string.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/string.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/struct.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/struct.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/value.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3/value.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/metadata/v3/metadata.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/metadata/v3/metadata.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/tracing/v3/custom_tag.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/tracing/v3/custom_tag.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/hash_policy.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/hash_policy.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http_status.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/http_status.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/percent.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/percent.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/range.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/range.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_unit.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/ratelimit_unit.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/semantic_version.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/semantic_version.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/token_bucket.pb.go delete mode 100644 vendor/github.com/envoyproxy/go-control-plane/envoy/type/v3/token_bucket.pb.validate.go delete mode 100644 vendor/github.com/envoyproxy/protoc-gen-validate/NOTICE delete mode 100644 vendor/github.com/envoyproxy/protoc-gen-validate/validate/BUILD delete mode 100644 vendor/github.com/envoyproxy/protoc-gen-validate/validate/validate.h delete mode 100644 vendor/github.com/envoyproxy/protoc-gen-validate/validate/validate.pb.go delete mode 100644 vendor/github.com/envoyproxy/protoc-gen-validate/validate/validate.proto delete mode 100644 vendor/github.com/fullstorydev/grpcurl/.gitignore delete mode 100644 vendor/github.com/fullstorydev/grpcurl/.goreleaser.yml delete mode 100644 vendor/github.com/fullstorydev/grpcurl/Dockerfile delete mode 100644 vendor/github.com/fullstorydev/grpcurl/LICENSE delete mode 100644 vendor/github.com/fullstorydev/grpcurl/Makefile delete mode 100644 vendor/github.com/fullstorydev/grpcurl/README.md delete mode 100644 vendor/github.com/fullstorydev/grpcurl/cmd/grpcurl/go1_10.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/cmd/grpcurl/go1_9.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/cmd/grpcurl/grpcurl.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/cmd/grpcurl/unix.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/desc_source.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/format.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/grpcurl.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/invoke.go delete mode 100644 vendor/github.com/fullstorydev/grpcurl/mk-test-files.sh create mode 100644 vendor/github.com/gabriel-vasile/mimetype/.gitattributes create mode 100644 vendor/github.com/gabriel-vasile/mimetype/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/CONTRIBUTING.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/LICENSE create mode 100644 vendor/github.com/gabriel-vasile/mimetype/README.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/charset/charset.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/json/json.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/archive.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/audio.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/binary.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/database.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/document.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/font.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/ftyp.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/geo.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/image.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/magic.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/ms_office.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/ogg.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/text.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/text_csv.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/video.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/internal/magic/zip.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/mime.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/mimetype.gif create mode 100644 vendor/github.com/gabriel-vasile/mimetype/mimetype.go create mode 100644 vendor/github.com/gabriel-vasile/mimetype/supported_mimes.md create mode 100644 vendor/github.com/gabriel-vasile/mimetype/tree.go create mode 100644 vendor/github.com/go-ini/ini/.editorconfig create mode 100644 vendor/github.com/go-ini/ini/.gitignore create mode 100644 vendor/github.com/go-ini/ini/.golangci.yml create mode 100644 vendor/github.com/go-ini/ini/LICENSE create mode 100644 vendor/github.com/go-ini/ini/Makefile create mode 100644 vendor/github.com/go-ini/ini/README.md create mode 100644 vendor/github.com/go-ini/ini/codecov.yml create mode 100644 vendor/github.com/go-ini/ini/data_source.go create mode 100644 vendor/github.com/go-ini/ini/deprecated.go create mode 100644 vendor/github.com/go-ini/ini/error.go create mode 100644 vendor/github.com/go-ini/ini/file.go create mode 100644 vendor/github.com/go-ini/ini/helper.go create mode 100644 vendor/github.com/go-ini/ini/ini.go create mode 100644 vendor/github.com/go-ini/ini/key.go create mode 100644 vendor/github.com/go-ini/ini/parser.go create mode 100644 vendor/github.com/go-ini/ini/section.go create mode 100644 vendor/github.com/go-ini/ini/struct.go create mode 100644 vendor/github.com/go-jose/go-jose/v3/jwt/builder.go create mode 100644 vendor/github.com/go-jose/go-jose/v3/jwt/claims.go create mode 100644 vendor/github.com/go-jose/go-jose/v3/jwt/doc.go create mode 100644 vendor/github.com/go-jose/go-jose/v3/jwt/errors.go create mode 100644 vendor/github.com/go-jose/go-jose/v3/jwt/jwt.go create mode 100644 vendor/github.com/go-jose/go-jose/v3/jwt/validation.go delete mode 100644 vendor/github.com/go-openapi/jsonpointer/.travis.yml delete mode 100644 vendor/github.com/go-openapi/jsonreference/.travis.yml create mode 100644 vendor/github.com/go-openapi/runtime/client/opentelemetry.go create mode 100644 vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go create mode 100644 vendor/github.com/go-piv/piv-go/third_party/rsa/LICENSE create mode 100644 vendor/github.com/go-piv/piv-go/third_party/rsa/README create mode 100644 vendor/github.com/go-piv/piv-go/third_party/rsa/pss.go create mode 100644 vendor/github.com/goccy/go-json/.codecov.yml create mode 100644 vendor/github.com/goccy/go-json/.gitignore create mode 100644 vendor/github.com/goccy/go-json/.golangci.yml create mode 100644 vendor/github.com/goccy/go-json/CHANGELOG.md create mode 100644 vendor/github.com/goccy/go-json/LICENSE create mode 100644 vendor/github.com/goccy/go-json/Makefile create mode 100644 vendor/github.com/goccy/go-json/README.md create mode 100644 vendor/github.com/goccy/go-json/color.go create mode 100644 vendor/github.com/goccy/go-json/decode.go create mode 100644 vendor/github.com/goccy/go-json/docker-compose.yml create mode 100644 vendor/github.com/goccy/go-json/encode.go create mode 100644 vendor/github.com/goccy/go-json/error.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/anonymous_field.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/array.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/assign.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/bool.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/bytes.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/compile.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/compile_norace.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/compile_race.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/context.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/float.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/func.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/int.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/interface.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/invalid.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/map.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/number.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/option.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/path.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/ptr.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/slice.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/stream.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/string.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/struct.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/type.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/uint.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/unmarshal_json.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/unmarshal_text.go create mode 100644 vendor/github.com/goccy/go-json/internal/decoder/wrapped_string.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/code.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compact.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compiler.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compiler_norace.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/compiler_race.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/context.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/decode_rune.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/encoder.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/indent.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/int.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/map112.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/map113.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/opcode.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/option.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/optype.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/query.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/string.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/string_table.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/hack.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/hack.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_color_indent/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/debug_vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/hack.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/util.go create mode 100644 vendor/github.com/goccy/go-json/internal/encoder/vm_indent/vm.go create mode 100644 vendor/github.com/goccy/go-json/internal/errors/error.go create mode 100644 vendor/github.com/goccy/go-json/internal/runtime/rtype.go create mode 100644 vendor/github.com/goccy/go-json/internal/runtime/struct_field.go create mode 100644 vendor/github.com/goccy/go-json/internal/runtime/type.go create mode 100644 vendor/github.com/goccy/go-json/json.go create mode 100644 vendor/github.com/goccy/go-json/option.go create mode 100644 vendor/github.com/goccy/go-json/path.go create mode 100644 vendor/github.com/goccy/go-json/query.go delete mode 100644 vendor/github.com/gogo/protobuf/gogoproto/Makefile delete mode 100644 vendor/github.com/gogo/protobuf/gogoproto/doc.go delete mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.go delete mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.pb.golden delete mode 100644 vendor/github.com/gogo/protobuf/gogoproto/gogo.proto delete mode 100644 vendor/github.com/gogo/protobuf/gogoproto/helper.go delete mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile delete mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go delete mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go delete mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go delete mode 100644 vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go delete mode 100644 vendor/github.com/golang-jwt/jwt/.gitignore delete mode 100644 vendor/github.com/golang-jwt/jwt/LICENSE delete mode 100644 vendor/github.com/golang-jwt/jwt/MIGRATION_GUIDE.md delete mode 100644 vendor/github.com/golang-jwt/jwt/README.md delete mode 100644 vendor/github.com/golang-jwt/jwt/VERSION_HISTORY.md delete mode 100644 vendor/github.com/golang-jwt/jwt/claims.go delete mode 100644 vendor/github.com/golang-jwt/jwt/doc.go delete mode 100644 vendor/github.com/golang-jwt/jwt/ecdsa.go delete mode 100644 vendor/github.com/golang-jwt/jwt/ecdsa_utils.go delete mode 100644 vendor/github.com/golang-jwt/jwt/ed25519.go delete mode 100644 vendor/github.com/golang-jwt/jwt/ed25519_utils.go delete mode 100644 vendor/github.com/golang-jwt/jwt/errors.go delete mode 100644 vendor/github.com/golang-jwt/jwt/hmac.go delete mode 100644 vendor/github.com/golang-jwt/jwt/map_claims.go delete mode 100644 vendor/github.com/golang-jwt/jwt/none.go delete mode 100644 vendor/github.com/golang-jwt/jwt/parser.go delete mode 100644 vendor/github.com/golang-jwt/jwt/rsa.go delete mode 100644 vendor/github.com/golang-jwt/jwt/rsa_pss.go delete mode 100644 vendor/github.com/golang-jwt/jwt/rsa_utils.go delete mode 100644 vendor/github.com/golang-jwt/jwt/signing_method.go delete mode 100644 vendor/github.com/golang-jwt/jwt/token.go delete mode 100644 vendor/github.com/golang/glog/LICENSE delete mode 100644 vendor/github.com/golang/glog/README.md delete mode 100644 vendor/github.com/golang/glog/glog.go delete mode 100644 vendor/github.com/golang/glog/glog_file.go delete mode 100644 vendor/github.com/golang/mock/AUTHORS delete mode 100644 vendor/github.com/golang/mock/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/mock/mockgen/mockgen.go delete mode 100644 vendor/github.com/golang/mock/mockgen/model/model.go delete mode 100644 vendor/github.com/golang/mock/mockgen/parse.go delete mode 100644 vendor/github.com/golang/mock/mockgen/reflect.go delete mode 100644 vendor/github.com/golang/mock/mockgen/version.1.11.go delete mode 100644 vendor/github.com/golang/mock/mockgen/version.1.12.go delete mode 100644 vendor/github.com/golang/protobuf/descriptor/descriptor.go delete mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go delete mode 100644 vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go delete mode 100644 vendor/github.com/google/certificate-transparency-go/.travis.yml create mode 100644 vendor/github.com/google/certificate-transparency-go/CODEOWNERS delete mode 100644 vendor/github.com/google/certificate-transparency-go/tools.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go create mode 100644 vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.go create mode 100644 vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.go create mode 100644 vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.go create mode 100644 vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.go create mode 100644 vendor/github.com/google/go-containerregistry/pkg/v1/static/layer.go delete mode 100644 vendor/github.com/google/go-github/v45/AUTHORS delete mode 100644 vendor/github.com/google/go-github/v45/github/code-scanning.go delete mode 100644 vendor/github.com/google/go-github/v45/github/doc.go delete mode 100644 vendor/github.com/google/go-github/v45/github/event.go delete mode 100644 vendor/github.com/google/go-github/v45/github/github.go delete mode 100644 vendor/github.com/google/go-github/v45/github/orgs_audit_log.go delete mode 100644 vendor/github.com/google/go-github/v45/github/orgs_custom_roles.go delete mode 100644 vendor/github.com/google/go-github/v45/github/repos_pages.go delete mode 100644 vendor/github.com/google/go-github/v45/github/search.go delete mode 100644 vendor/github.com/google/go-github/v45/github/timestamp.go delete mode 100644 vendor/github.com/google/go-github/v45/github/users_emails.go create mode 100644 vendor/github.com/google/go-github/v53/AUTHORS rename vendor/github.com/google/go-github/{v45 => v53}/LICENSE (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/actions.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_artifacts.go (75%) create mode 100644 vendor/github.com/google/go-github/v53/github/actions_cache.go create mode 100644 vendor/github.com/google/go-github/v53/github/actions_oidc.go create mode 100644 vendor/github.com/google/go-github/v53/github/actions_required_workflows.go rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_runner_groups.go (87%) rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_runners.go (86%) rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_secrets.go (99%) create mode 100644 vendor/github.com/google/go-github/v53/github/actions_variables.go rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_workflow_jobs.go (95%) rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_workflow_runs.go (80%) rename vendor/github.com/google/go-github/{v45 => v53}/github/actions_workflows.go (96%) rename vendor/github.com/google/go-github/{v45 => v53}/github/activity.go (83%) rename vendor/github.com/google/go-github/{v45 => v53}/github/activity_events.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/activity_notifications.go (96%) rename vendor/github.com/google/go-github/{v45 => v53}/github/activity_star.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/activity_watching.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/admin.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/admin_orgs.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/admin_stats.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/admin_users.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/apps.go (90%) rename vendor/github.com/google/go-github/{v45 => v53}/github/apps_hooks.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/apps_hooks_deliveries.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/apps_installation.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/apps_manifest.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/apps_marketplace.go (91%) rename vendor/github.com/google/go-github/{v45 => v53}/github/authorizations.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/billing.go (87%) rename vendor/github.com/google/go-github/{v45 => v53}/github/checks.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/code-scanning.go create mode 100644 vendor/github.com/google/go-github/v53/github/codespaces.go create mode 100644 vendor/github.com/google/go-github/v53/github/codespaces_secrets.go rename vendor/github.com/google/go-github/{v45 => v53}/github/dependabot.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/dependabot_alerts.go rename vendor/github.com/google/go-github/{v45 => v53}/github/dependabot_secrets.go (86%) create mode 100644 vendor/github.com/google/go-github/v53/github/doc.go rename vendor/github.com/google/go-github/{v45 => v53}/github/enterprise.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/enterprise_actions_runners.go (75%) rename vendor/github.com/google/go-github/{v45 => v53}/github/enterprise_audit_log.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/enterprise_code_security_and_analysis.go create mode 100644 vendor/github.com/google/go-github/v53/github/event.go rename vendor/github.com/google/go-github/{v45 => v53}/github/event_types.go (92%) rename vendor/github.com/google/go-github/{v45 => v53}/github/gists.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/gists_comments.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/git.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/git_blobs.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/git_commits.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/git_refs.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/git_tags.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/git_trees.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/github-accessors.go (84%) create mode 100644 vendor/github.com/google/go-github/v53/github/github.go rename vendor/github.com/google/go-github/{v45 => v53}/github/gitignore.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/interactions.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/interactions_orgs.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/interactions_repos.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issue_import.go (91%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues.go (93%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues_assignees.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues_comments.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues_events.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues_labels.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues_milestones.go (95%) rename vendor/github.com/google/go-github/{v45 => v53}/github/issues_timeline.go (95%) rename vendor/github.com/google/go-github/{v45 => v53}/github/licenses.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/messages.go (85%) rename vendor/github.com/google/go-github/{v45 => v53}/github/migrations.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/migrations_source_import.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/migrations_user.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/misc.go (96%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs.go (83%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_actions_allowed.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_actions_permissions.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/orgs_audit_log.go create mode 100644 vendor/github.com/google/go-github/v53/github/orgs_custom_roles.go rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_hooks.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_hooks_deliveries.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_members.go (99%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_outside_collaborators.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_packages.go (97%) rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_projects.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/orgs_rules.go create mode 100644 vendor/github.com/google/go-github/v53/github/orgs_security_managers.go rename vendor/github.com/google/go-github/{v45 => v53}/github/orgs_users_blocking.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/packages.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/projects.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/pulls.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/pulls_comments.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/pulls_reviewers.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/pulls_reviews.go (94%) rename vendor/github.com/google/go-github/{v45 => v53}/github/pulls_threads.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/reactions.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos.go (76%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_actions_access.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_actions_allowed.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_actions_permissions.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_autolinks.go (89%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_codeowners.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_collaborators.go (95%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_comments.go (97%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_commits.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_community_health.go (96%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_contents.go (96%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_deployment_branch_policies.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_deployments.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_environments.go (77%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_forks.go (92%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_hooks.go (77%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_hooks_deliveries.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_invitations.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_keys.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_lfs.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_merging.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_pages.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_prereceive_hooks.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_projects.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_releases.go (95%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_rules.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_stats.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_statuses.go (97%) create mode 100644 vendor/github.com/google/go-github/v53/github/repos_tags.go rename vendor/github.com/google/go-github/{v45 => v53}/github/repos_traffic.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/scim.go (78%) create mode 100644 vendor/github.com/google/go-github/v53/github/search.go rename vendor/github.com/google/go-github/{v45 => v53}/github/secret_scanning.go (94%) rename vendor/github.com/google/go-github/{v45 => v53}/github/strings.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/teams.go (97%) rename vendor/github.com/google/go-github/{v45 => v53}/github/teams_discussion_comments.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/teams_discussions.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/teams_members.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/timestamp.go rename vendor/github.com/google/go-github/{v45 => v53}/github/users.go (98%) rename vendor/github.com/google/go-github/{v45 => v53}/github/users_administration.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/users_blocking.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/users_emails.go rename vendor/github.com/google/go-github/{v45 => v53}/github/users_followers.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/users_gpg_keys.go (96%) rename vendor/github.com/google/go-github/{v45 => v53}/github/users_keys.go (96%) rename vendor/github.com/google/go-github/{v45 => v53}/github/users_packages.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/users_projects.go (100%) create mode 100644 vendor/github.com/google/go-github/v53/github/users_ssh_signing_keys.go rename vendor/github.com/google/go-github/{v45 => v53}/github/with_appengine.go (100%) rename vendor/github.com/google/go-github/{v45 => v53}/github/without_appengine.go (100%) create mode 100644 vendor/github.com/google/s2a-go/.gitignore create mode 100644 vendor/github.com/google/s2a-go/CODE_OF_CONDUCT.md create mode 100644 vendor/github.com/google/s2a-go/CONTRIBUTING.md rename vendor/github.com/{coreos/go-semver/LICENSE => google/s2a-go/LICENSE.md} (100%) create mode 100644 vendor/github.com/google/s2a-go/README.md create mode 100644 vendor/github.com/google/s2a-go/fallback/s2a_fallback.go create mode 100644 vendor/github.com/google/s2a-go/internal/authinfo/authinfo.go create mode 100644 vendor/github.com/google/s2a-go/internal/handshaker/handshaker.go create mode 100644 vendor/github.com/google/s2a-go/internal/handshaker/service/service.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/common_go_proto/common.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/s2a_context_go_proto/s2a_context.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/s2a_go_proto/s2a_grpc.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/v2/common_go_proto/common.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/v2/s2a_context_go_proto/s2a_context.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/proto/v2/s2a_go_proto/s2a_grpc.pb.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aeadcrypter.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/aesgcm.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/chachapoly.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/aeadcrypter/common.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/ciphersuite.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/counter.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/expander.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/internal/halfconn/halfconn.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/record.go create mode 100644 vendor/github.com/google/s2a-go/internal/record/ticketsender.go create mode 100644 vendor/github.com/google/s2a-go/internal/tokenmanager/tokenmanager.go create mode 100644 vendor/github.com/google/s2a-go/internal/v2/README.md create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/certverifier.go create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/testdata/client_intermediate_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/testdata/client_leaf_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/testdata/client_root_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/testdata/server_intermediate_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/testdata/server_leaf_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/certverifier/testdata/server_root_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/remotesigner.go create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/testdata/client_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/testdata/client_cert.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/testdata/client_key.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/testdata/server_cert.der create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/testdata/server_cert.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/remotesigner/testdata/server_key.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/s2av2.go create mode 100644 vendor/github.com/google/s2a-go/internal/v2/testdata/client_cert.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/testdata/client_key.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/testdata/server_cert.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/testdata/server_key.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/testdata/client_cert.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/testdata/client_key.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/testdata/server_cert.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/testdata/server_key.pem create mode 100644 vendor/github.com/google/s2a-go/internal/v2/tlsconfigstore/tlsconfigstore.go create mode 100644 vendor/github.com/google/s2a-go/retry/retry.go create mode 100644 vendor/github.com/google/s2a-go/s2a.go create mode 100644 vendor/github.com/google/s2a-go/s2a_options.go create mode 100644 vendor/github.com/google/s2a-go/s2a_utils.go create mode 100644 vendor/github.com/google/s2a-go/stream/s2a_stream.go create mode 100644 vendor/github.com/google/s2a-go/testdata/client_cert.pem create mode 100644 vendor/github.com/google/s2a-go/testdata/client_key.pem create mode 100644 vendor/github.com/google/s2a-go/testdata/server_cert.pem create mode 100644 vendor/github.com/google/s2a-go/testdata/server_key.pem delete mode 100644 vendor/github.com/google/trillian/.gitignore delete mode 100644 vendor/github.com/google/trillian/.golangci.yaml delete mode 100644 vendor/github.com/google/trillian/AUTHORS delete mode 100644 vendor/github.com/google/trillian/BUILD.bazel delete mode 100644 vendor/github.com/google/trillian/CHANGELOG.md delete mode 100644 vendor/github.com/google/trillian/CODEOWNERS delete mode 100644 vendor/github.com/google/trillian/CONTRIBUTING.md delete mode 100644 vendor/github.com/google/trillian/CONTRIBUTORS delete mode 100644 vendor/github.com/google/trillian/LICENSE delete mode 100644 vendor/github.com/google/trillian/PULL_REQUEST_TEMPLATE.md delete mode 100644 vendor/github.com/google/trillian/README.md delete mode 100644 vendor/github.com/google/trillian/client/admin.go delete mode 100644 vendor/github.com/google/trillian/client/backoff/backoff.go delete mode 100644 vendor/github.com/google/trillian/client/log_client.go delete mode 100644 vendor/github.com/google/trillian/client/log_verifier.go delete mode 100644 vendor/github.com/google/trillian/client/rpcflags/rpcflags.go delete mode 100644 vendor/github.com/google/trillian/cloudbuild.yaml delete mode 100644 vendor/github.com/google/trillian/cloudbuild_master.yaml delete mode 100644 vendor/github.com/google/trillian/cloudbuild_pr.yaml delete mode 100644 vendor/github.com/google/trillian/cloudbuild_tag.yaml delete mode 100644 vendor/github.com/google/trillian/cmd/createtree/main.go delete mode 100644 vendor/github.com/google/trillian/cmd/flags.go delete mode 100644 vendor/github.com/google/trillian/codecov.yml delete mode 100644 vendor/github.com/google/trillian/gen.go delete mode 100644 vendor/github.com/google/trillian/trillian.pb.go delete mode 100644 vendor/github.com/google/trillian/trillian.proto delete mode 100644 vendor/github.com/google/trillian/trillian_admin_api.pb.go delete mode 100644 vendor/github.com/google/trillian/trillian_admin_api.proto delete mode 100644 vendor/github.com/google/trillian/trillian_admin_api_grpc.pb.go delete mode 100644 vendor/github.com/google/trillian/trillian_log_api.pb.go delete mode 100644 vendor/github.com/google/trillian/trillian_log_api.proto delete mode 100644 vendor/github.com/google/trillian/trillian_log_api_grpc.pb.go delete mode 100644 vendor/github.com/google/trillian/types/internal/tls/tls.go delete mode 100644 vendor/github.com/google/trillian/types/logroot.go create mode 100644 vendor/github.com/gorilla/mux/AUTHORS create mode 100644 vendor/github.com/gorilla/mux/LICENSE create mode 100644 vendor/github.com/gorilla/mux/README.md create mode 100644 vendor/github.com/gorilla/mux/doc.go create mode 100644 vendor/github.com/gorilla/mux/middleware.go create mode 100644 vendor/github.com/gorilla/mux/mux.go create mode 100644 vendor/github.com/gorilla/mux/regexp.go create mode 100644 vendor/github.com/gorilla/mux/route.go create mode 100644 vendor/github.com/gorilla/mux/test_helpers.go delete mode 100644 vendor/github.com/gorilla/websocket/.gitignore delete mode 100644 vendor/github.com/gorilla/websocket/AUTHORS delete mode 100644 vendor/github.com/gorilla/websocket/LICENSE delete mode 100644 vendor/github.com/gorilla/websocket/README.md delete mode 100644 vendor/github.com/gorilla/websocket/client.go delete mode 100644 vendor/github.com/gorilla/websocket/compression.go delete mode 100644 vendor/github.com/gorilla/websocket/conn.go delete mode 100644 vendor/github.com/gorilla/websocket/doc.go delete mode 100644 vendor/github.com/gorilla/websocket/join.go delete mode 100644 vendor/github.com/gorilla/websocket/json.go delete mode 100644 vendor/github.com/gorilla/websocket/mask.go delete mode 100644 vendor/github.com/gorilla/websocket/mask_safe.go delete mode 100644 vendor/github.com/gorilla/websocket/prepared.go delete mode 100644 vendor/github.com/gorilla/websocket/proxy.go delete mode 100644 vendor/github.com/gorilla/websocket/server.go delete mode 100644 vendor/github.com/gorilla/websocket/tls_handshake.go delete mode 100644 vendor/github.com/gorilla/websocket/tls_handshake_116.go delete mode 100644 vendor/github.com/gorilla/websocket/util.go delete mode 100644 vendor/github.com/gorilla/websocket/x_net_proxy.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/.gitignore delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/.travis.yml delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/CHANGELOG.md delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/CONTRIBUTING.md delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/LICENSE delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/README.md delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/doc.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/logging/settable/doc.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/logging/settable/logsettable.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/makefile delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/slack.png delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-middleware/wrappers.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/.gitignore delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/.travis.yml delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/CHANGELOG.md delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/LICENSE delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/README.md delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_metrics.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_reporter.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/makefile delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/metric_options.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_metrics.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_reporter.go delete mode 100644 vendor/github.com/grpc-ecosystem/go-grpc-prometheus/util.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/LICENSE.txt delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/internal/BUILD.bazel delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.pb.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/internal/errors.proto delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/BUILD.bazel delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/context.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/convert.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/doc.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/errors.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/fieldmask.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/handler.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_httpbodyproto.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_json.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_jsonpb.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshal_proto.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/marshaler_registry.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/mux.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/pattern.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto2_convert.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/proto_errors.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/runtime/query.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/BUILD.bazel delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/doc.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/pattern.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/readerfactory.go delete mode 100644 vendor/github.com/grpc-ecosystem/grpc-gateway/utilities/trie.go create mode 100644 vendor/github.com/hashicorp/go-retryablehttp/CHANGELOG.md create mode 100644 vendor/github.com/hashicorp/go-retryablehttp/CODEOWNERS create mode 100644 vendor/github.com/imdario/mergo/CONTRIBUTING.md create mode 100644 vendor/github.com/imdario/mergo/SECURITY.md create mode 100644 vendor/github.com/in-toto/in-toto-golang/in_toto/attestations.go create mode 100644 vendor/github.com/in-toto/in-toto-golang/in_toto/envelope.go create mode 100644 vendor/github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/common/common.go create mode 100644 vendor/github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v0.1/provenance.go create mode 100644 vendor/github.com/in-toto/in-toto-golang/in_toto/slsa_provenance/v1/provenance.go delete mode 100644 vendor/github.com/jhump/protoreflect/LICENSE delete mode 100644 vendor/github.com/jhump/protoreflect/codec/codec.go delete mode 100644 vendor/github.com/jhump/protoreflect/codec/decode_fields.go delete mode 100644 vendor/github.com/jhump/protoreflect/codec/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/codec/encode_fields.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/convert.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/descriptor.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/descriptor_no_unsafe.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/descriptor_unsafe.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/imports.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/internal/proto3_optional.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/internal/source_info.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/internal/util.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/load.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/.gitignore delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/enum.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/field.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/file.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/identifiers.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/message.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/no_source.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/node.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/options.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/print.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/ranges.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/service.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/source_pos.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/values.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/ast/walk.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/descriptor_protos.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/errors.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/lexer.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/linker.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/options.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/parser.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/proto.y.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/resolve_files.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/source_code_info.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/std_imports.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/test-source-info.txt delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoparse/validate.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoprint/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoprint/print.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/protoprint/sort.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/sourceinfo/locations.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/sourceinfo/registry.go delete mode 100644 vendor/github.com/jhump/protoreflect/desc/sourceinfo/wrappers.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/binary.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/dynamic_message.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/equal.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/extension.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/extension_registry.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/grpcdynamic/stub.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/indent.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/json.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/maps_1.11.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/maps_1.12.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/merge.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/message_factory.go delete mode 100644 vendor/github.com/jhump/protoreflect/dynamic/text.go delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/client.go delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/doc.go delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/internal/grpc_reflection_v1/reflection.pb.go delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/internal/grpc_reflection_v1/reflection.proto delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/internal/grpc_reflection_v1/reflection_grpc.pb.go delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/internal/grpc_reflection_v1/svc_impl.go delete mode 100644 vendor/github.com/jhump/protoreflect/grpcreflect/server.go delete mode 100644 vendor/github.com/jhump/protoreflect/internal/codec/buffer.go delete mode 100644 vendor/github.com/jhump/protoreflect/internal/codec/decode.go delete mode 100644 vendor/github.com/jhump/protoreflect/internal/codec/encode.go delete mode 100644 vendor/github.com/jhump/protoreflect/internal/standard_files.go delete mode 100644 vendor/github.com/jhump/protoreflect/internal/unrecognized.go delete mode 100644 vendor/github.com/leodido/go-urn/.travis.yml create mode 100644 vendor/github.com/lestrrat-go/blackmagic/.gitignore create mode 100644 vendor/github.com/lestrrat-go/blackmagic/LICENSE create mode 100644 vendor/github.com/lestrrat-go/blackmagic/README.md create mode 100644 vendor/github.com/lestrrat-go/blackmagic/blackmagic.go create mode 100644 vendor/github.com/lestrrat-go/httpcc/.gitignore create mode 100644 vendor/github.com/lestrrat-go/httpcc/LICENSE create mode 100644 vendor/github.com/lestrrat-go/httpcc/README.md create mode 100644 vendor/github.com/lestrrat-go/httpcc/directives.go create mode 100644 vendor/github.com/lestrrat-go/httpcc/httpcc.go create mode 100644 vendor/github.com/lestrrat-go/httprc/.gitignore create mode 100644 vendor/github.com/lestrrat-go/httprc/.golangci.yml create mode 100644 vendor/github.com/lestrrat-go/httprc/Changes create mode 100644 vendor/github.com/lestrrat-go/httprc/LICENSE create mode 100644 vendor/github.com/lestrrat-go/httprc/README.md create mode 100644 vendor/github.com/lestrrat-go/httprc/cache.go create mode 100644 vendor/github.com/lestrrat-go/httprc/fetcher.go create mode 100644 vendor/github.com/lestrrat-go/httprc/httprc.go create mode 100644 vendor/github.com/lestrrat-go/httprc/options.yaml create mode 100644 vendor/github.com/lestrrat-go/httprc/options_gen.go create mode 100644 vendor/github.com/lestrrat-go/httprc/queue.go create mode 100644 vendor/github.com/lestrrat-go/httprc/whitelist.go create mode 100644 vendor/github.com/lestrrat-go/iter/LICENSE create mode 100644 vendor/github.com/lestrrat-go/iter/arrayiter/arrayiter.go create mode 100644 vendor/github.com/lestrrat-go/iter/mapiter/mapiter.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/LICENSE create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/cert/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/cert/cert.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/cert/chain.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/base64/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/base64/asmbase64.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/base64/base64.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/ecutil/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/ecutil/ecutil.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/iter/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/iter/mapiter.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/json/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/json/goccy.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/json/json.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/json/registry.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/json/stdlib.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/keyconv/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/keyconv/keyconv.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/pool/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/internal/pool/pool.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/README.md create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/compression_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/content_encryption_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/elliptic_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/jwa.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/key_encryption_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/key_type_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/secp2561k.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwa/signature_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/README.md create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/cache.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/ecdsa.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/ecdsa_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/es256k.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/fetch.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/interface.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/interface_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/io.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/jwk.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/key_ops.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/okp.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/okp_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/options.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/options.yaml create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/options_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/rsa.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/rsa_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/set.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/symmetric.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/symmetric_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/usage.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jwk/whitelist.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/README.md create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/ecdsa.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/eddsa.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/es256k.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/headers.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/headers_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/hmac.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/interface.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/io.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/jws.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/key_provider.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/message.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/options.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/options.yaml create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/options_gen.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/rsa.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/signer.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/jws/verifier.go create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/x25519/BUILD.bazel create mode 100644 vendor/github.com/lestrrat-go/jwx/v2/x25519/x25519.go create mode 100644 vendor/github.com/lestrrat-go/option/.gitignore create mode 100644 vendor/github.com/lestrrat-go/option/LICENSE create mode 100644 vendor/github.com/lestrrat-go/option/README.md create mode 100644 vendor/github.com/lestrrat-go/option/option.go create mode 100644 vendor/github.com/mitchellh/go-wordwrap/LICENSE.md create mode 100644 vendor/github.com/mitchellh/go-wordwrap/README.md create mode 100644 vendor/github.com/mitchellh/go-wordwrap/wordwrap.go create mode 100644 vendor/github.com/nozzle/throttler/.gitignore create mode 100644 vendor/github.com/nozzle/throttler/LICENSE create mode 100644 vendor/github.com/nozzle/throttler/README.md create mode 100644 vendor/github.com/nozzle/throttler/throttler.go create mode 100644 vendor/github.com/oleiade/reflections/.gitignore create mode 100644 vendor/github.com/oleiade/reflections/AUTHORS.md create mode 100644 vendor/github.com/oleiade/reflections/LICENSE create mode 100644 vendor/github.com/oleiade/reflections/README.md create mode 100644 vendor/github.com/oleiade/reflections/reflections.go delete mode 100644 vendor/github.com/olekukonko/tablewriter/.gitignore delete mode 100644 vendor/github.com/olekukonko/tablewriter/.travis.yml delete mode 100644 vendor/github.com/olekukonko/tablewriter/LICENSE.md delete mode 100644 vendor/github.com/olekukonko/tablewriter/README.md delete mode 100644 vendor/github.com/olekukonko/tablewriter/csv.go delete mode 100644 vendor/github.com/olekukonko/tablewriter/table.go delete mode 100644 vendor/github.com/olekukonko/tablewriter/table_with_color.go delete mode 100644 vendor/github.com/olekukonko/tablewriter/util.go delete mode 100644 vendor/github.com/olekukonko/tablewriter/wrap.go delete mode 100644 vendor/github.com/open-policy-agent/opa/ast/fuzz.go create mode 100644 vendor/github.com/open-policy-agent/opa/ast/marshal.go create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.46.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.46.1.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.46.2.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.46.3.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.47.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.47.1.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.47.2.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.47.3.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.47.4.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.48.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.49.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.49.1.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.49.2.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.50.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.50.1.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.50.2.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.51.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.52.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.53.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.53.1.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.54.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/capabilities/v0.55.0.json create mode 100644 vendor/github.com/open-policy-agent/opa/config/config.go create mode 100644 vendor/github.com/open-policy-agent/opa/hooks/hooks.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/config/config.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/edittree/bitvector/README.md create mode 100644 vendor/github.com/open-policy-agent/opa/internal/edittree/bitvector/bitvector.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/edittree/bitvector/license.txt create mode 100644 vendor/github.com/open-policy-agent/opa/internal/edittree/edittree.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/errors/join.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/errors/join_go1.20.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/NOTICE.txt create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/crypto/compare.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/crypto/ecc.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/ecr.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/kms.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/signing_v4.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/signing_v4a.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/util.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/v4/const.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/v4/header_rules.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/v4/headers.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/v4/host.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/providers/aws/v4/util.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/runtime/init/init.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/strvals/doc.go create mode 100644 vendor/github.com/open-policy-agent/opa/internal/strvals/parser.go create mode 100644 vendor/github.com/open-policy-agent/opa/loader/extension/extension.go create mode 100644 vendor/github.com/open-policy-agent/opa/logging/logging.go create mode 100644 vendor/github.com/open-policy-agent/opa/plugins/plugins.go create mode 100644 vendor/github.com/open-policy-agent/opa/plugins/rest/auth.go create mode 100644 vendor/github.com/open-policy-agent/opa/plugins/rest/aws.go create mode 100644 vendor/github.com/open-policy-agent/opa/plugins/rest/azure.go create mode 100644 vendor/github.com/open-policy-agent/opa/plugins/rest/gcp.go create mode 100644 vendor/github.com/open-policy-agent/opa/plugins/rest/rest.go create mode 100644 vendor/github.com/open-policy-agent/opa/rego/plugins.go create mode 100644 vendor/github.com/open-policy-agent/opa/topdown/jsonschema.go create mode 100644 vendor/github.com/open-policy-agent/opa/topdown/providers.go delete mode 100644 vendor/github.com/opencontainers/image-spec/specs-go/v1/artifact.go create mode 100644 vendor/github.com/outcaste-io/ristretto/.deepsource.toml create mode 100644 vendor/github.com/outcaste-io/ristretto/.mailmap create mode 100644 vendor/github.com/outcaste-io/ristretto/CHANGELOG.md create mode 100644 vendor/github.com/outcaste-io/ristretto/LICENSE create mode 100644 vendor/github.com/outcaste-io/ristretto/README.md create mode 100644 vendor/github.com/outcaste-io/ristretto/cache.go create mode 100644 vendor/github.com/outcaste-io/ristretto/metrics.go create mode 100644 vendor/github.com/outcaste-io/ristretto/policy.go create mode 100644 vendor/github.com/outcaste-io/ristretto/ring.go create mode 100644 vendor/github.com/outcaste-io/ristretto/sketch.go create mode 100644 vendor/github.com/outcaste-io/ristretto/store.go create mode 100644 vendor/github.com/outcaste-io/ristretto/test.sh create mode 100644 vendor/github.com/outcaste-io/ristretto/ttl.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/LICENSE create mode 100644 vendor/github.com/outcaste-io/ristretto/z/README.md create mode 100644 vendor/github.com/outcaste-io/ristretto/z/allocator.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/bbloom.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/btree.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/buffer.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/calloc.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/calloc_32bit.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/calloc_64bit.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/calloc_jemalloc.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/calloc_nojemalloc.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/file.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/file_default.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/file_linux.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/flags.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/histogram.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/mmap.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/mmap_darwin.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/mmap_linux.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/mmap_plan9.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/mmap_unix.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/mmap_windows.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/rtutil.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/rtutil.s create mode 100644 vendor/github.com/outcaste-io/ristretto/z/simd/baseline.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/simd/search.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/simd/search_amd64.s create mode 100644 vendor/github.com/outcaste-io/ristretto/z/simd/stub_search_amd64.go create mode 100644 vendor/github.com/outcaste-io/ristretto/z/z.go create mode 100644 vendor/github.com/pborman/uuid/.travis.yml create mode 100644 vendor/github.com/pborman/uuid/CONTRIBUTING.md create mode 100644 vendor/github.com/pborman/uuid/CONTRIBUTORS create mode 100644 vendor/github.com/pborman/uuid/LICENSE create mode 100644 vendor/github.com/pborman/uuid/README.md create mode 100644 vendor/github.com/pborman/uuid/dce.go create mode 100644 vendor/github.com/pborman/uuid/doc.go create mode 100644 vendor/github.com/pborman/uuid/hash.go create mode 100644 vendor/github.com/pborman/uuid/marshal.go create mode 100644 vendor/github.com/pborman/uuid/node.go create mode 100644 vendor/github.com/pborman/uuid/sql.go create mode 100644 vendor/github.com/pborman/uuid/time.go create mode 100644 vendor/github.com/pborman/uuid/util.go create mode 100644 vendor/github.com/pborman/uuid/uuid.go create mode 100644 vendor/github.com/pborman/uuid/version1.go create mode 100644 vendor/github.com/pborman/uuid/version4.go create mode 100644 vendor/github.com/philhofer/fwd/LICENSE.md create mode 100644 vendor/github.com/philhofer/fwd/README.md create mode 100644 vendor/github.com/philhofer/fwd/reader.go create mode 100644 vendor/github.com/philhofer/fwd/writer.go create mode 100644 vendor/github.com/philhofer/fwd/writer_appengine.go create mode 100644 vendor/github.com/philhofer/fwd/writer_tinygo.go create mode 100644 vendor/github.com/philhofer/fwd/writer_unsafe.go delete mode 100644 vendor/github.com/pmezard/go-difflib/LICENSE delete mode 100644 vendor/github.com/pmezard/go-difflib/difflib/difflib.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vnext.go create mode 100644 vendor/github.com/prometheus/common/model/value_float.go create mode 100644 vendor/github.com/prometheus/common/model/value_histogram.go create mode 100644 vendor/github.com/prometheus/common/model/value_type.go create mode 100644 vendor/github.com/prometheus/procfs/fs_statfs_notype.go create mode 100644 vendor/github.com/prometheus/procfs/fs_statfs_type.go create mode 100644 vendor/github.com/prometheus/procfs/net_wireless.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/.gitignore create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/BENCHMARKS.md create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/LICENSE create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/README.md create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/counter.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/map.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/mapof.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/mpmcqueue.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/rbmutex.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/util.go create mode 100644 vendor/github.com/puzpuzpuz/xsync/v2/util_mapof.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/.gitignore delete mode 100644 vendor/github.com/russross/blackfriday/v2/.travis.yml delete mode 100644 vendor/github.com/russross/blackfriday/v2/LICENSE.txt delete mode 100644 vendor/github.com/russross/blackfriday/v2/README.md delete mode 100644 vendor/github.com/russross/blackfriday/v2/block.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/doc.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/entities.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/esc.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/html.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/inline.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/markdown.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/node.go delete mode 100644 vendor/github.com/russross/blackfriday/v2/smartypants.go delete mode 100644 vendor/github.com/sassoftware/relic/signers/sigerrors/errors.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/dsse/envelope.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/dsse/signerverifier.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/encrypted/encrypted.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/signerverifier/ecdsa.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/signerverifier/ed25519.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/signerverifier/rsa.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/signerverifier/signerverifier.go create mode 100644 vendor/github.com/secure-systems-lab/go-securesystemslib/signerverifier/utils.go create mode 100644 vendor/github.com/segmentio/asm/LICENSE create mode 100644 vendor/github.com/segmentio/asm/base64/base64.go create mode 100644 vendor/github.com/segmentio/asm/base64/base64_amd64.go create mode 100644 vendor/github.com/segmentio/asm/base64/base64_arm64.go create mode 100644 vendor/github.com/segmentio/asm/base64/base64_asm.go create mode 100644 vendor/github.com/segmentio/asm/base64/base64_default.go create mode 100644 vendor/github.com/segmentio/asm/base64/decode_amd64.go create mode 100644 vendor/github.com/segmentio/asm/base64/decode_amd64.s create mode 100644 vendor/github.com/segmentio/asm/base64/decode_arm64.go create mode 100644 vendor/github.com/segmentio/asm/base64/decode_arm64.s create mode 100644 vendor/github.com/segmentio/asm/base64/encode_amd64.go create mode 100644 vendor/github.com/segmentio/asm/base64/encode_amd64.s create mode 100644 vendor/github.com/segmentio/asm/base64/encode_arm64.go create mode 100644 vendor/github.com/segmentio/asm/base64/encode_arm64.s create mode 100644 vendor/github.com/segmentio/asm/cpu/arm/arm.go create mode 100644 vendor/github.com/segmentio/asm/cpu/arm64/arm64.go create mode 100644 vendor/github.com/segmentio/asm/cpu/cpu.go create mode 100644 vendor/github.com/segmentio/asm/cpu/cpuid/cpuid.go create mode 100644 vendor/github.com/segmentio/asm/cpu/x86/x86.go create mode 100644 vendor/github.com/segmentio/asm/internal/unsafebytes/unsafebytes.go delete mode 100644 vendor/github.com/sigstore/cosign/LICENSE delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/fulcio/fulcio.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/fulcio/fulcioverifier/ctl/verify.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/fulcio/fulcioverifier/fulcioverifier.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/annotations.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/attest_blob.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/certificate.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/clean.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/download.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/fulcio.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/generate_key_pair.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/key.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/load.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/oidc.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/policy.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/registry.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/rekor.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/root.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/sign.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/signblob.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/options/verify.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/rekor/rekor.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/sign/sign.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/sign/sign_blob.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/verify/verify.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/verify/verify_attestation.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/verify/verify_blob.go delete mode 100644 vendor/github.com/sigstore/cosign/cmd/cosign/cli/verify/verify_blob_attestation.go delete mode 100644 vendor/github.com/sigstore/cosign/internal/pkg/cosign/common.go delete mode 100644 vendor/github.com/sigstore/cosign/internal/pkg/cosign/dsse.go delete mode 100644 vendor/github.com/sigstore/cosign/internal/pkg/cosign/fulcio/signer.go delete mode 100644 vendor/github.com/sigstore/cosign/internal/pkg/cosign/payload/signer.go delete mode 100644 vendor/github.com/sigstore/cosign/internal/pkg/cosign/rekor/signer.go delete mode 100644 vendor/github.com/sigstore/cosign/internal/pkg/cosign/sign.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/blob/load.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/attestation/attestation.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/certextensions.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/common.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/errors.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/fetch.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/git/github/github.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/keys.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/pivkey/disabled.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/pkcs11key/disabled.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/pkcs11key/util.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/rego/rego.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/remote/index.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/remote/remote.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/tlog.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/cosign/verify.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/interface.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/internal/signature/layer.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/layout/index.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/layout/signatures.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/layout/write.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/mediatypes.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/mutate/map.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/mutate/options.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/mutate/signature.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/mutate/signatures.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/remote/image.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/remote/index.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/remote/options.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/remote/remote.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/remote/signatures.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/remote/write.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/signatures.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/signed/image.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/signed/index.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/static/file.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/static/options.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/static/signature.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/oci/walk/walk.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/policy/attestation.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/policy/eval.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/providers/all/all.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/providers/github/github.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/providers/google/google.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/providers/interface.go delete mode 100644 vendor/github.com/sigstore/cosign/pkg/signature/keys.go rename vendor/github.com/sigstore/cosign/{ => v2}/COPYRIGHT.txt (100%) rename vendor/github.com/{cncf/udpa/go => sigstore/cosign/v2}/LICENSE (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/fulcio/fulcio.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/fulcio/fulcioverifier/fulcioverifier.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/generate/generate.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/generate/generate_key_pair.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/annotations.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/attach.go (75%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/attest.go (88%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/attest_blob.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/certificate.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/clean.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/copy.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/download.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/env.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/errors.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/experimental.go (84%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/files.go (96%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/flags.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/fulcio.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/generate.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/generate_key_pair.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/import_key_pair.go (77%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/initialize.go (91%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/key.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/load.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/oidc.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/options.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/piv_tool.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/pkcs11_tool.go (84%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/predicate.go (96%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/public_key.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/reference.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/registry.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/rekor.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/root.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/save.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/security_key.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/sign.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/signature_digest.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/signblob.go rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/tree.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/triangulate.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/upload.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/cmd/cosign/cli/options/useragent.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/options/verify.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/rekor/rekor.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/sign/privacy/privacy.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/sign/sign.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/sign/sign_blob.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/verify/verify.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/verify/verify_attestation.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/verify/verify_blob.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/cli/verify/verify_blob_attestation.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/errors/error_wrap.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/errors/errors.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/errors/exit_code_lookup.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/errors/exit_codes.go create mode 100644 vendor/github.com/sigstore/cosign/v2/cmd/cosign/errors/generate_docs.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/common.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/dsse.go rename vendor/github.com/sigstore/cosign/{ => v2}/internal/pkg/cosign/fulcio/fulcioroots/fulcioroots.go (96%) create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/fulcio/signer.go rename vendor/github.com/sigstore/cosign/{ => v2}/internal/pkg/cosign/payload/attestor.go (92%) create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/payload/signer.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/rekor/signer.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/sign.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/tsa/client/client.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/tsa/signer.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/cosign/tsa/utils.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/pkg/oci/remote/remote.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/ui/env.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/ui/log.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/ui/prompt.go create mode 100644 vendor/github.com/sigstore/cosign/v2/internal/ui/warnings.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/blob/load.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/attestation/attestation.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/bundle/rekor.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/bundle/tsa.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/certextensions.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/common.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/ctlog.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/cue/cue.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/env/env.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/errors.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/fetch.go rename vendor/github.com/sigstore/cosign/{cmd/cosign/cli/fulcio => v2/pkg/cosign}/fulcioverifier/ctutil/ctutil.go (96%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/git/git.go (86%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/git/github/github.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/git/gitlab/gitlab.go (80%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/keys.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/kubernetes/client.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/kubernetes/secret.go (98%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/obsolete.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/pivkey/disabled.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/pivkey/pivkey.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/pivkey/util.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/pkcs11key/disabled.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/pkcs11key/pkcs11key.go (98%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/pkcs11key/util.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/rego/rego.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/rekor_factory.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/remote/index.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/remote/remote.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/tlog.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/cosign/verifiers.go (98%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/verify.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/cosign/verify_sct.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/doc.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/empty/empty.go (97%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/empty/signed.go (96%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/file.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/image.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/index.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/interface.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/internal/signature/layer.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/layout/index.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/layout/signatures.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/layout/write.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/mediatypes.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/mutate/map.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/mutate/mutate.go (75%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/mutate/options.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/mutate/signature.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/mutate/signatures.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/oci/remote/digest.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/image.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/index.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/options.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/referrers.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/remote.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/signatures.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/unknown.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/remote/write.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/signatures.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/signed/image.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/signed/index.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/static/file.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/static/options.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/static/signature.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/oci/walk/walk.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/policy/attestation.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/policy/errors.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/policy/eval.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/all/all.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/buildkite/buildkite.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/buildkite/doc.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/doc.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/envvar/env.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/filesystem/doc.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/filesystem/filesystem.go (90%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/github/doc.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/github/github.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/google/doc.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/google/google.go create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/providers/interface.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/spiffe/doc.go (100%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/providers/spiffe/spiffe.go (88%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/signature/annotations.go (100%) create mode 100644 vendor/github.com/sigstore/cosign/v2/pkg/signature/keys.go rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/types/media.go (96%) rename vendor/github.com/sigstore/cosign/{ => v2}/pkg/types/payload.go (100%) create mode 100644 vendor/github.com/sigstore/rekor/pkg/generated/models/dsse.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/generated/models/dsse_schema.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/generated/models/dsse_v001_schema.go delete mode 100644 vendor/github.com/sigstore/rekor/pkg/generated/models/rekor_version.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/pki/x509/e2e.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/dsse/README.md create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/dsse/dsse.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/dsse/dsse_schema.json create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/dsse/v0.0.1/dsse_v0_0_1_schema.json create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/dsse/v0.0.1/entry.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/intoto/v0.0.2/entry.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/types/intoto/v0.0.2/intoto_v0_0_2_schema.json delete mode 100644 vendor/github.com/sigstore/rekor/pkg/util/pubkey.go delete mode 100644 vendor/github.com/sigstore/rekor/pkg/util/timestamp_note.go create mode 100644 vendor/github.com/sigstore/rekor/pkg/util/util.go delete mode 100644 vendor/github.com/sigstore/rekor/pkg/util/validate.go delete mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/policy.go create mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/repository/targets/ctfe_2022.pub create mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/repository/targets/fulcio_intermediate_v1.crt.pem delete mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/repository/targets/rekor.0.pub delete mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/repository/targets/rekor.json create mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/repository/targets/trusted_root.json delete mode 100644 vendor/github.com/sigstore/sigstore/pkg/tuf/signer.go create mode 100644 vendor/github.com/sigstore/timestamp-authority/CONTRIBUTORS.md create mode 100644 vendor/github.com/sigstore/timestamp-authority/COPYRIGHT.txt create mode 100644 vendor/github.com/sigstore/timestamp-authority/LICENSE create mode 100644 vendor/github.com/sigstore/timestamp-authority/pkg/verification/verify.go create mode 100644 vendor/github.com/sigstore/timestamp-authority/pkg/verification/verify_request.go delete mode 100644 vendor/github.com/soheilhy/cmux/.travis.yml delete mode 100644 vendor/github.com/soheilhy/cmux/CONTRIBUTORS delete mode 100644 vendor/github.com/soheilhy/cmux/LICENSE delete mode 100644 vendor/github.com/soheilhy/cmux/README.md delete mode 100644 vendor/github.com/soheilhy/cmux/buffer.go delete mode 100644 vendor/github.com/soheilhy/cmux/cmux.go delete mode 100644 vendor/github.com/soheilhy/cmux/doc.go delete mode 100644 vendor/github.com/soheilhy/cmux/matchers.go delete mode 100644 vendor/github.com/soheilhy/cmux/patricia.go delete mode 100644 vendor/github.com/stretchr/testify/LICENSE delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare_legacy.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_forward.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl delete mode 100644 vendor/github.com/stretchr/testify/assert/assertion_order.go delete mode 100644 vendor/github.com/stretchr/testify/assert/assertions.go delete mode 100644 vendor/github.com/stretchr/testify/assert/doc.go delete mode 100644 vendor/github.com/stretchr/testify/assert/errors.go delete mode 100644 vendor/github.com/stretchr/testify/assert/forward_assertions.go delete mode 100644 vendor/github.com/stretchr/testify/assert/http_assertions.go delete mode 100644 vendor/github.com/tent/canonical-json-go/.travis.yml delete mode 100644 vendor/github.com/tent/canonical-json-go/LICENSE delete mode 100644 vendor/github.com/tent/canonical-json-go/encode.go delete mode 100644 vendor/github.com/theupdateframework/go-tuf/pkg/deprecated/set_ecdsa/set_ecdsa.go create mode 100644 vendor/github.com/tinylib/msgp/LICENSE create mode 100644 vendor/github.com/tinylib/msgp/msgp/advise_linux.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/advise_other.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/circular.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/defs.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/edit.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/elsize.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/elsize_default.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/elsize_tinygo.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/errors.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/errors_default.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/errors_tinygo.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/extension.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/file.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/file_port.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/integers.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/json.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/json_bytes.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/number.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/purego.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/read.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/read_bytes.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/size.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/unsafe.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/write.go create mode 100644 vendor/github.com/tinylib/msgp/msgp/write_bytes.go delete mode 100644 vendor/github.com/tmc/grpc-websocket-proxy/LICENSE delete mode 100644 vendor/github.com/tmc/grpc-websocket-proxy/wsproxy/doc.go delete mode 100644 vendor/github.com/tmc/grpc-websocket-proxy/wsproxy/websocket_proxy.go create mode 100644 vendor/github.com/transparency-dev/merkle/.golangci.yaml create mode 100644 vendor/github.com/transparency-dev/merkle/CHANGELOG.md create mode 100644 vendor/github.com/transparency-dev/merkle/CODEOWNERS create mode 100644 vendor/github.com/transparency-dev/merkle/cloudbuild.yaml delete mode 100644 vendor/github.com/urfave/cli/.flake8 delete mode 100644 vendor/github.com/urfave/cli/.gitignore delete mode 100644 vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/urfave/cli/LICENSE delete mode 100644 vendor/github.com/urfave/cli/README.md delete mode 100644 vendor/github.com/urfave/cli/app.go delete mode 100644 vendor/github.com/urfave/cli/appveyor.yml delete mode 100644 vendor/github.com/urfave/cli/category.go delete mode 100644 vendor/github.com/urfave/cli/cli.go delete mode 100644 vendor/github.com/urfave/cli/command.go delete mode 100644 vendor/github.com/urfave/cli/context.go delete mode 100644 vendor/github.com/urfave/cli/docs.go delete mode 100644 vendor/github.com/urfave/cli/errors.go delete mode 100644 vendor/github.com/urfave/cli/fish.go delete mode 100644 vendor/github.com/urfave/cli/flag.go delete mode 100644 vendor/github.com/urfave/cli/flag_bool.go delete mode 100644 vendor/github.com/urfave/cli/flag_bool_t.go delete mode 100644 vendor/github.com/urfave/cli/flag_duration.go delete mode 100644 vendor/github.com/urfave/cli/flag_float64.go delete mode 100644 vendor/github.com/urfave/cli/flag_generic.go delete mode 100644 vendor/github.com/urfave/cli/flag_int.go delete mode 100644 vendor/github.com/urfave/cli/flag_int64.go delete mode 100644 vendor/github.com/urfave/cli/flag_int64_slice.go delete mode 100644 vendor/github.com/urfave/cli/flag_int_slice.go delete mode 100644 vendor/github.com/urfave/cli/flag_string.go delete mode 100644 vendor/github.com/urfave/cli/flag_string_slice.go delete mode 100644 vendor/github.com/urfave/cli/flag_uint.go delete mode 100644 vendor/github.com/urfave/cli/flag_uint64.go delete mode 100644 vendor/github.com/urfave/cli/funcs.go delete mode 100644 vendor/github.com/urfave/cli/help.go delete mode 100644 vendor/github.com/urfave/cli/parse.go delete mode 100644 vendor/github.com/urfave/cli/sort.go delete mode 100644 vendor/github.com/urfave/cli/template.go create mode 100644 vendor/github.com/xanzy/go-gitlab/CONTRIBUTING.md create mode 100644 vendor/github.com/xanzy/go-gitlab/Makefile create mode 100644 vendor/github.com/xanzy/go-gitlab/dockerfile_templates.go create mode 100644 vendor/github.com/xanzy/go-gitlab/group_epic_boards.go create mode 100644 vendor/github.com/xanzy/go-gitlab/group_repository_storage_move.go create mode 100644 vendor/github.com/xanzy/go-gitlab/job_token_scope.go create mode 100644 vendor/github.com/xanzy/go-gitlab/metadata.go create mode 100644 vendor/github.com/xanzy/go-gitlab/project_feature_flags.go create mode 100644 vendor/github.com/xanzy/go-gitlab/project_repository_storage_move.go create mode 100644 vendor/github.com/xanzy/go-gitlab/project_templates.go create mode 100644 vendor/github.com/xanzy/go-gitlab/resource_weight_events.go create mode 100644 vendor/github.com/xanzy/go-gitlab/snippet_repository_storage_move.go delete mode 100644 vendor/github.com/xiang90/probing/.gitignore delete mode 100644 vendor/github.com/xiang90/probing/LICENSE delete mode 100644 vendor/github.com/xiang90/probing/README.md delete mode 100644 vendor/github.com/xiang90/probing/prober.go delete mode 100644 vendor/github.com/xiang90/probing/server.go delete mode 100644 vendor/github.com/xiang90/probing/status.go delete mode 100644 vendor/go.etcd.io/bbolt/.gitignore delete mode 100644 vendor/go.etcd.io/bbolt/.travis.yml delete mode 100644 vendor/go.etcd.io/bbolt/LICENSE delete mode 100644 vendor/go.etcd.io/bbolt/Makefile delete mode 100644 vendor/go.etcd.io/bbolt/README.md delete mode 100644 vendor/go.etcd.io/bbolt/bolt_386.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_amd64.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_arm.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_arm64.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_linux.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_mips64x.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_mipsx.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_openbsd.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_ppc.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_ppc64.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_ppc64le.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_riscv64.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_s390x.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_unix.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_unix_aix.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_unix_solaris.go delete mode 100644 vendor/go.etcd.io/bbolt/bolt_windows.go delete mode 100644 vendor/go.etcd.io/bbolt/boltsync_unix.go delete mode 100644 vendor/go.etcd.io/bbolt/bucket.go delete mode 100644 vendor/go.etcd.io/bbolt/compact.go delete mode 100644 vendor/go.etcd.io/bbolt/cursor.go delete mode 100644 vendor/go.etcd.io/bbolt/db.go delete mode 100644 vendor/go.etcd.io/bbolt/doc.go delete mode 100644 vendor/go.etcd.io/bbolt/errors.go delete mode 100644 vendor/go.etcd.io/bbolt/freelist.go delete mode 100644 vendor/go.etcd.io/bbolt/freelist_hmap.go delete mode 100644 vendor/go.etcd.io/bbolt/mlock_unix.go delete mode 100644 vendor/go.etcd.io/bbolt/mlock_windows.go delete mode 100644 vendor/go.etcd.io/bbolt/node.go delete mode 100644 vendor/go.etcd.io/bbolt/page.go delete mode 100644 vendor/go.etcd.io/bbolt/tx.go delete mode 100644 vendor/go.etcd.io/bbolt/unsafe.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/api/v3/authpb/auth.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/authpb/auth.proto delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/etcdserver.proto delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/gw/rpc.pb.gw.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal.proto delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/raft_internal_stringer.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/etcdserverpb/rpc.proto delete mode 100644 vendor/go.etcd.io/etcd/api/v3/membershippb/membership.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/membershippb/membership.proto delete mode 100644 vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/mvccpb/kv.proto delete mode 100644 vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/doc.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/error.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/md.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/v3rpc/rpctypes/metadatafields.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/version/version.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/versionpb/version.pb.go delete mode 100644 vendor/go.etcd.io/etcd/api/v3/versionpb/version.proto delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_unix.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/dir_windows.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/fileutil.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_flock.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_linux.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_plan9.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_solaris.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_unix.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/lock_windows.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_darwin.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unix.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/preallocate_unsupported.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/read_dir.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_darwin.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/sync_linux.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/logutil/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_format.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/logutil/log_level.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/logutil/zap_journal.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/pathutil/path.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/srv/srv.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/systemd/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/systemd/journal.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/assert.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/leak.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/pauseable_handler.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/recorder.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/testingtb.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/testutil.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/testutil/var.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/cipher_suites.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/tlsutil/tlsutil.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/keepalive_listener.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/limit_listen.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_opts.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/listener_tls.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_solaris.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_unix.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/sockopt_windows.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/timeout_conn.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/timeout_dialer.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/timeout_listener.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/timeout_transport.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/tls.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/transport.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/transport/unix_listener.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/types/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/types/id.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/types/set.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/types/slice.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/types/urls.go delete mode 100644 vendor/go.etcd.io/etcd/client/pkg/v3/types/urlsmap.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/client/v2/README.md delete mode 100644 vendor/go.etcd.io/etcd/client/v2/auth_role.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/auth_user.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/cancelreq.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/client.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/cluster_error.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/curl.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/discover.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/keys.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/members.go delete mode 100644 vendor/go.etcd.io/etcd/client/v2/util.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/client/v3/README.md delete mode 100644 vendor/go.etcd.io/etcd/client/v3/auth.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/client.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/cluster.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/compact_op.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/compare.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/concurrency/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/concurrency/election.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/concurrency/key.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/concurrency/mutex.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/concurrency/session.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/concurrency/stm.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/config.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/credentials/credentials.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/ctx.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/internal/endpoint/endpoint.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/internal/resolver/resolver.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/kv.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/lease.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/logger.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/maintenance.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/mirror/syncer.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/namespace/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/namespace/kv.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/namespace/lease.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/namespace/util.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/namespace/watch.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/naming/endpoints/endpoints.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/naming/endpoints/endpoints_impl.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/naming/endpoints/internal/update.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/op.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/options.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/retry.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/retry_interceptor.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/snapshot/doc.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/snapshot/v3_snapshot.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/sort.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/txn.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/utils.go delete mode 100644 vendor/go.etcd.io/etcd/client/v3/watch.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/README.md delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/READMEv2.md delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/auth_commands.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/backup_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/cluster_health.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/doc.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/error.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/exec_watch_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/format.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/get_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/ls_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/member_commands.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/mk_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/mkdir_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/rm_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/rmdir_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/role_commands.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/set_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/set_dir_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/update_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/update_dir_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/user_commands.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/util.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/command/watch_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv2/ctl.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/alarm_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/auth_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/check.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/compaction_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/completion_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/defrag_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/del_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/doc.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/downgrade_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/elect_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/ep_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/get_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/global.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/lease_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/lock_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/make_mirror_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/member_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/move_leader_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/printer.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/printer_fields.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/printer_json.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/printer_protobuf.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/printer_simple.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/printer_table.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/put_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/role_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/snapshot_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/txn_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/user_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/util.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/version_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/command/watch_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/ctlv3/ctl.go delete mode 100644 vendor/go.etcd.io/etcd/etcdctl/v3/main.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/backup_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/common.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/completion_commmand.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/defrag_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/migrate_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/printer.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/printer_fields.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/printer_json.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/printer_protobuf.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/printer_simple.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/printer_table.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/snapshot_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/etcdutl/version_command.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/snapshot/doc.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/snapshot/util.go delete mode 100644 vendor/go.etcd.io/etcd/etcdutl/v3/snapshot/v3_snapshot.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/adt/README.md delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/adt/adt.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/adt/interval_tree.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/cobrautl/error.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/cobrautl/help.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/contention/contention.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/contention/doc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/cpuutil/doc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/cpuutil/endian.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/crc/crc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/debugutil/doc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/debugutil/pprof.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/flag.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/ignored.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/selective_string.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/strings.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/unique_strings.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/unique_urls.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/flags/urls.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/grpc_testing/recorder.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/grpc_testing/stub_server.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/httputil/httputil.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/idutil/id.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/ioutil/pagewriter.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/ioutil/readcloser.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/ioutil/reader.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/ioutil/util.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/netutil/doc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/netutil/netutil.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/netutil/routes.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/netutil/routes_linux.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/notify/notify.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/pbutil/pbutil.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/report/doc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/report/report.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/report/timeseries.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/report/weighted.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/runtime/fds_linux.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/runtime/fds_other.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/schedule/doc.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/schedule/schedule.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/traceutil/trace.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/wait/wait.go delete mode 100644 vendor/go.etcd.io/etcd/pkg/v3/wait/wait_time.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/OWNERS delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/README.md delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/bootstrap.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/confchange/confchange.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/confchange/restore.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/design.md delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/doc.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/log.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/log_unstable.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/logger.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/node.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/quorum/joint.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/quorum/majority.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/quorum/quorum.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/quorum/voteresult_string.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/raft.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/raftpb/confchange.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/raftpb/confstate.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/raftpb/raft.pb.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/raftpb/raft.proto delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/rawnode.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/read_only.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/status.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/storage.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/tracker/inflights.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/tracker/progress.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/tracker/state.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/tracker/tracker.go delete mode 100644 vendor/go.etcd.io/etcd/raft/v3/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/jwt.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/nop.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/options.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/range_perm_cache.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/simple_token.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/auth/store.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/config/config.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/config/v2_deprecation.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/config.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/config_logging.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/config_logging_journal_unix.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/config_logging_journal_windows.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/config_tracing.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/etcd.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/serve.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/embed/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/adapters.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/capability.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/cluster.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/etcdhttp/base.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/etcdhttp/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/etcdhttp/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/etcdhttp/peer.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/cluster.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/cluster_opts.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/errors.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/member.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/store.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/membership/storev2.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/coder.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/http.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/msg_codec.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/msgappv2_codec.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/peer.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/peer_status.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/pipeline.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/probing_status.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/remote.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/snapshot_sender.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/stream.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/transport.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/urlpick.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/db.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/message.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/snappb/snap.pb.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/snappb/snap.proto delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/snap/snapshotter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2discovery/discovery.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2error/error.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2http/client.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2http/httptypes/errors.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2stats/leader.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2stats/queue.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2stats/server.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/event.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/event_history.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/event_queue.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/node.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/node_extern.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/stats.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/store.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/ttl_key_heap.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/watcher.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v2store/watcher_hub.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3alarm/alarms.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3client/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3client/v3client.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3compactor/compactor.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3compactor/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3compactor/periodic.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3compactor/revision.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3discovery/discovery.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3election/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3election/election.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3election/v3electionpb/gw/v3election.pb.gw.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3election/v3electionpb/v3election.pb.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3election/v3electionpb/v3election.proto delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/lock.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/v3lockpb/gw/v3lock.pb.gw.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/v3lockpb/v3lock.pb.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/v3lockpb/v3lock.proto delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/auth.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/codec.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/grpc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/header.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/interceptor.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/key.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/lease.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/maintenance.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/member.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/quota.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc/watch.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/apply.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/apply_auth.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/apply_v2.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/bootstrap.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/cindex/cindex.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/cindex/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/cluster_util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/corrupt.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/errors.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/raft.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/server.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/server_access_control.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/snapshot_merge.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/v2_server.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/v3_server.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/version/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/version/downgrade.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/version/errors.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/version/monitor.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/version/version.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/etcdserver/zap_raft.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/lease_queue.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/leasehttp/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/leasehttp/http.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/leasepb/lease.pb.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/leasepb/lease.proto delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/lessor.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/lease/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/auth_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/chan_stream.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/cluster_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/election_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/kv_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/lease_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/lock_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/maintenance_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/adapter/watch_client_adapter.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/auth.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/cache/store.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/cluster.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/election.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/health.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/kv.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/leader.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/lease.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/lock.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/maintenance.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/register.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/watch.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/watch_broadcast.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/watch_broadcasts.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/watch_ranges.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/proxy/grpcproxy/watcher.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/backend.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/batch_tx.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/config_default.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/config_linux.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/config_windows.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/hooks.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/read_tx.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/backend/tx_buffer.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/datadir/datadir.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/datadir/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/hooks.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/index.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/key_index.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/kv.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/kv_view.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/kvstore.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/kvstore_compaction.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/kvstore_txn.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/metrics_txn.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/revision.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/store.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/watchable_store.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/watchable_store_txn.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/watcher.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/mvcc/watcher_group.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/quota.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/actions.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/alarm.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/auth.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/auth_roles.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/auth_users.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/bucket.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/changes.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/cindex.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/confstate.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/lease.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/membership.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/migration.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/schema.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/schema/version.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/storage.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/decoder.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/encoder.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/file_pipeline.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/metrics.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/repair.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/util.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/version.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/wal.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/walpb/record.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/walpb/record.pb.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/storage/wal/walpb/record.proto delete mode 100644 vendor/go.etcd.io/etcd/server/v3/verify/doc.go delete mode 100644 vendor/go.etcd.io/etcd/server/v3/verify/verify.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/framework/integration/bridge.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/framework/integration/cluster.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/framework/integration/cluster_direct.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/framework/integration/cluster_proxy.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/framework/integration/testing.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/integration/doc.go delete mode 100644 vendor/go.etcd.io/etcd/tests/v3/integration/lazy_cluster.go delete mode 100644 vendor/go.etcd.io/etcd/v3/.gitignore delete mode 100644 vendor/go.etcd.io/etcd/v3/.header delete mode 100644 vendor/go.etcd.io/etcd/v3/ADOPTERS.md delete mode 100644 vendor/go.etcd.io/etcd/v3/CONTRIBUTING.md delete mode 100644 vendor/go.etcd.io/etcd/v3/DCO delete mode 100644 vendor/go.etcd.io/etcd/v3/Dockerfile-release.amd64 delete mode 100644 vendor/go.etcd.io/etcd/v3/Dockerfile-release.arm64 delete mode 100644 vendor/go.etcd.io/etcd/v3/Dockerfile-release.ppc64le delete mode 100644 vendor/go.etcd.io/etcd/v3/Dockerfile-release.s390x delete mode 100644 vendor/go.etcd.io/etcd/v3/GOVERNANCE.md delete mode 100644 vendor/go.etcd.io/etcd/v3/LICENSE delete mode 100644 vendor/go.etcd.io/etcd/v3/MAINTAINERS delete mode 100644 vendor/go.etcd.io/etcd/v3/Makefile delete mode 100644 vendor/go.etcd.io/etcd/v3/Procfile delete mode 100644 vendor/go.etcd.io/etcd/v3/Procfile.learner delete mode 100644 vendor/go.etcd.io/etcd/v3/Procfile.v2 delete mode 100644 vendor/go.etcd.io/etcd/v3/README.md delete mode 100644 vendor/go.etcd.io/etcd/v3/ROADMAP.md delete mode 100644 vendor/go.etcd.io/etcd/v3/bill-of-materials.json delete mode 100644 vendor/go.etcd.io/etcd/v3/bill-of-materials.override.json delete mode 100644 vendor/go.etcd.io/etcd/v3/code-of-conduct.md delete mode 100644 vendor/go.etcd.io/etcd/v3/codecov.yml delete mode 100644 vendor/go.etcd.io/etcd/v3/dummy.go delete mode 100644 vendor/go.etcd.io/etcd/v3/etcd.conf.yml.sample delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/LICENSE delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/config.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptor.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/interceptorinfo.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal/parse.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/metadata_supplier.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/semconv.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/version.go create mode 100644 vendor/go.opentelemetry.io/otel/.codespellignore create mode 100644 vendor/go.opentelemetry.io/otel/.codespellrc delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/config.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/envconfig/envconfig.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/header.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/partialsuccess.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/LICENSE delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/retry/retry.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/internal/wrappederror.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/LICENSE delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/README.md delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/clients.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/options.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/optiontypes.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/otlpconfig/tls.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/attribute.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/instrumentation.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/resource.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/LICENSE delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/exporter.go delete mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/options.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/handler.go create mode 100644 vendor/go.opentelemetry.io/otel/internal/global/instruments.go rename vendor/go.opentelemetry.io/otel/{metric => }/internal/global/meter.go (79%) create mode 100644 vendor/go.opentelemetry.io/otel/metric.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/asyncfloat64.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/asyncint64.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/embedded/embedded.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/global/global.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument/asyncfloat64.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument/asyncint64.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument/instrument.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument/syncfloat64.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/instrument/syncint64.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/internal/global/instruments.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/internal/global/state.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/noop.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/syncfloat64.go create mode 100644 vendor/go.opentelemetry.io/otel/metric/syncint64.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/unit/doc.go delete mode 100644 vendor/go.opentelemetry.io/otel/metric/unit/unit.go create mode 100644 vendor/go.opentelemetry.io/otel/requirements.txt create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_darwin.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_exec.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_readfile.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/trace/version.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/version.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.12.0/doc.go rename vendor/go.opentelemetry.io/otel/semconv/{v1.4.0 => v1.12.0}/exception.go (91%) create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.12.0/http.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.12.0/resource.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.12.0/schema.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.12.0/trace.go delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.4.0/doc.go delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.4.0/http.go delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.4.0/resource.go delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.4.0/schema.go delete mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.4.0/trace.go delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/LICENSE delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/collector/trace/v1/trace_service.pb.go delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/collector/trace/v1/trace_service.pb.gw.go delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/collector/trace/v1/trace_service_grpc.pb.go delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/resource/v1/resource.pb.go delete mode 100644 vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go rename vendor/{github.com/cncf/xds/go => go.step.sm/crypto}/LICENSE (100%) create mode 100644 vendor/go.step.sm/crypto/fingerprint/fingerprint.go create mode 100644 vendor/go.step.sm/crypto/internal/bcrypt_pbkdf/LICENSE create mode 100644 vendor/go.step.sm/crypto/internal/bcrypt_pbkdf/README create mode 100644 vendor/go.step.sm/crypto/internal/bcrypt_pbkdf/bcrypt_pbkdf.go create mode 100644 vendor/go.step.sm/crypto/internal/emoji/emoji.go create mode 100644 vendor/go.step.sm/crypto/internal/utils/io.go create mode 100644 vendor/go.step.sm/crypto/jose/encrypt.go create mode 100644 vendor/go.step.sm/crypto/jose/generate.go create mode 100644 vendor/go.step.sm/crypto/jose/options.go create mode 100644 vendor/go.step.sm/crypto/jose/parse.go create mode 100644 vendor/go.step.sm/crypto/jose/types.go create mode 100644 vendor/go.step.sm/crypto/jose/validate.go create mode 100644 vendor/go.step.sm/crypto/jose/x25519.go create mode 100644 vendor/go.step.sm/crypto/keyutil/fingerprint.go create mode 100644 vendor/go.step.sm/crypto/keyutil/key.go create mode 100644 vendor/go.step.sm/crypto/pemutil/cosign.go create mode 100644 vendor/go.step.sm/crypto/pemutil/pem.go create mode 100644 vendor/go.step.sm/crypto/pemutil/pkcs8.go create mode 100644 vendor/go.step.sm/crypto/pemutil/ssh.go create mode 100644 vendor/go.step.sm/crypto/randutil/random.go create mode 100644 vendor/go.step.sm/crypto/x25519/x25519.go create mode 100644 vendor/go.uber.org/atomic/pointer_go118_pre119.go create mode 100644 vendor/go.uber.org/multierr/error_post_go120.go create mode 100644 vendor/go.uber.org/multierr/error_pre_go120.go delete mode 100644 vendor/go.uber.org/multierr/glide.yaml create mode 100644 vendor/go.uber.org/zap/internal/pool/pool.go delete mode 100644 vendor/go.uber.org/zap/internal/ztest/clock.go delete mode 100644 vendor/go.uber.org/zap/internal/ztest/doc.go delete mode 100644 vendor/go.uber.org/zap/internal/ztest/timeout.go delete mode 100644 vendor/go.uber.org/zap/internal/ztest/writer.go delete mode 100644 vendor/go.uber.org/zap/zapgrpc/zapgrpc.go delete mode 100644 vendor/go.uber.org/zap/zaptest/doc.go delete mode 100644 vendor/go.uber.org/zap/zaptest/logger.go delete mode 100644 vendor/go.uber.org/zap/zaptest/testingt.go delete mode 100644 vendor/go.uber.org/zap/zaptest/timeout.go delete mode 100644 vendor/go.uber.org/zap/zaptest/writer.go create mode 100644 vendor/go4.org/intern/LICENSE create mode 100644 vendor/go4.org/intern/README.md create mode 100644 vendor/go4.org/intern/intern.go create mode 100644 vendor/go4.org/unsafe/assume-no-moving-gc/LICENSE create mode 100644 vendor/go4.org/unsafe/assume-no-moving-gc/README.md create mode 100644 vendor/go4.org/unsafe/assume-no-moving-gc/assume-no-moving-gc.go create mode 100644 vendor/go4.org/unsafe/assume-no-moving-gc/untested.go create mode 100644 vendor/golang.org/x/crypto/argon2/argon2.go create mode 100644 vendor/golang.org/x/crypto/argon2/blake2b.go create mode 100644 vendor/golang.org/x/crypto/argon2/blamka_amd64.go create mode 100644 vendor/golang.org/x/crypto/argon2/blamka_amd64.s create mode 100644 vendor/golang.org/x/crypto/argon2/blamka_generic.go create mode 100644 vendor/golang.org/x/crypto/argon2/blamka_ref.go delete mode 100644 vendor/golang.org/x/crypto/bcrypt/base64.go delete mode 100644 vendor/golang.org/x/crypto/bcrypt/bcrypt.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go create mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519_compat.go create mode 100644 vendor/golang.org/x/crypto/curve25519/curve25519_go120.go create mode 100644 vendor/golang.org/x/crypto/hkdf/hkdf.go delete mode 100644 vendor/golang.org/x/mod/modfile/print.go delete mode 100644 vendor/golang.org/x/mod/modfile/read.go delete mode 100644 vendor/golang.org/x/mod/modfile/rule.go delete mode 100644 vendor/golang.org/x/mod/modfile/work.go create mode 100644 vendor/golang.org/x/mod/zip/zip.go create mode 100644 vendor/golang.org/x/net/http2/writesched_roundrobin.go create mode 100644 vendor/golang.org/x/net/idna/tables15.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie12.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie13.0.0.go create mode 100644 vendor/golang.org/x/sync/errgroup/go120.go create mode 100644 vendor/golang.org/x/sync/errgroup/pre_go120.go create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/width/tables15.0.0.go delete mode 100644 vendor/golang.org/x/tools/go/ast/astutil/enclosing.go delete mode 100644 vendor/golang.org/x/tools/go/ast/astutil/imports.go delete mode 100644 vendor/golang.org/x/tools/go/ast/astutil/rewrite.go delete mode 100644 vendor/golang.org/x/tools/go/ast/astutil/util.go delete mode 100644 vendor/golang.org/x/tools/go/types/objectpath/objectpath.go delete mode 100644 vendor/golang.org/x/tools/imports/forward.go create mode 100644 vendor/golang.org/x/tools/internal/event/tag/tag.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_darwin.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go delete mode 100644 vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go delete mode 100644 vendor/golang.org/x/tools/internal/gcimporter/bexport.go delete mode 100644 vendor/golang.org/x/tools/internal/gopathwalk/walk.go delete mode 100644 vendor/golang.org/x/tools/internal/imports/fix.go delete mode 100644 vendor/golang.org/x/tools/internal/imports/imports.go delete mode 100644 vendor/golang.org/x/tools/internal/imports/mod.go delete mode 100644 vendor/golang.org/x/tools/internal/imports/mod_cache.go delete mode 100644 vendor/golang.org/x/tools/internal/imports/sortimports.go delete mode 100644 vendor/golang.org/x/tools/internal/imports/zstdlib.go create mode 100644 vendor/golang.org/x/xerrors/LICENSE create mode 100644 vendor/golang.org/x/xerrors/PATENTS create mode 100644 vendor/golang.org/x/xerrors/README create mode 100644 vendor/golang.org/x/xerrors/adaptor.go create mode 100644 vendor/golang.org/x/xerrors/codereview.cfg create mode 100644 vendor/golang.org/x/xerrors/doc.go create mode 100644 vendor/golang.org/x/xerrors/errors.go create mode 100644 vendor/golang.org/x/xerrors/fmt.go create mode 100644 vendor/golang.org/x/xerrors/format.go create mode 100644 vendor/golang.org/x/xerrors/frame.go create mode 100644 vendor/golang.org/x/xerrors/internal/internal.go create mode 100644 vendor/golang.org/x/xerrors/wrap.go create mode 100644 vendor/google.golang.org/api/internal/cba.go rename vendor/google.golang.org/api/{transport => internal}/cert/default_cert.go (100%) rename vendor/google.golang.org/api/{transport => internal}/cert/enterprise_cert.go (100%) rename vendor/google.golang.org/api/{transport => internal}/cert/secureconnect_cert.go (98%) create mode 100644 vendor/google.golang.org/api/internal/s2a.go delete mode 100644 vendor/google.golang.org/api/transport/internal/dca/dca.go create mode 100644 vendor/google.golang.org/appengine/internal/socket/socket_service.pb.go create mode 100644 vendor/google.golang.org/appengine/internal/socket/socket_service.proto create mode 100644 vendor/google.golang.org/appengine/socket/doc.go create mode 100644 vendor/google.golang.org/appengine/socket/socket_classic.go create mode 100644 vendor/google.golang.org/appengine/socket/socket_vm.go delete mode 100644 vendor/google.golang.org/genproto/LICENSE rename vendor/{github.com/envoyproxy/protoc-gen-validate => google.golang.org/genproto/googleapis/api}/LICENSE (100%) delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/annotations.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/field_behavior.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/http.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/resource.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/annotations/routing.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go rename vendor/{github.com/golang/mock => google.golang.org/genproto/googleapis/rpc}/LICENSE (100%) delete mode 100644 vendor/google.golang.org/genproto/googleapis/rpc/errdetails/error_details.pb.go delete mode 100644 vendor/google.golang.org/genproto/protobuf/api/api.go delete mode 100644 vendor/google.golang.org/genproto/protobuf/field_mask/field_mask.go delete mode 100644 vendor/google.golang.org/genproto/protobuf/ptype/type.go delete mode 100644 vendor/google.golang.org/genproto/protobuf/source_context/source_context.go delete mode 100644 vendor/google.golang.org/grpc/balancer/weightedroundrobin/weightedroundrobin.go delete mode 100644 vendor/google.golang.org/grpc/balancer/weightedtarget/logging.go delete mode 100644 vendor/google.golang.org/grpc/balancer/weightedtarget/weightedaggregator/aggregator.go delete mode 100644 vendor/google.golang.org/grpc/balancer/weightedtarget/weightedtarget.go delete mode 100644 vendor/google.golang.org/grpc/balancer/weightedtarget/weightedtarget_config.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/alts.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/authinfo/authinfo.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/common.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcm.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/counter.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/utils.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/utils.go delete mode 100644 vendor/google.golang.org/grpc/credentials/google/google.go delete mode 100644 vendor/google.golang.org/grpc/credentials/google/xds.go delete mode 100644 vendor/google.golang.org/grpc/credentials/oauth/oauth.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls/certprovider/distributor.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls/certprovider/pemfile/builder.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls/certprovider/pemfile/watcher.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls/certprovider/provider.go delete mode 100644 vendor/google.golang.org/grpc/credentials/tls/certprovider/store.go delete mode 100644 vendor/google.golang.org/grpc/encoding/gzip/gzip.go delete mode 100644 vendor/google.golang.org/grpc/health/client.go delete mode 100644 vendor/google.golang.org/grpc/health/logging.go delete mode 100644 vendor/google.golang.org/grpc/health/server.go create mode 100644 vendor/google.golang.org/grpc/idle.go delete mode 100644 vendor/google.golang.org/grpc/internal/admin/admin.go delete mode 100644 vendor/google.golang.org/grpc/internal/balancergroup/balancergroup.go delete mode 100644 vendor/google.golang.org/grpc/internal/balancergroup/balancerstateaggregator.go delete mode 100644 vendor/google.golang.org/grpc/internal/cache/timeoutCache.go delete mode 100644 vendor/google.golang.org/grpc/internal/credentials/xds/handshake_info.go delete mode 100644 vendor/google.golang.org/grpc/internal/googlecloud/googlecloud.go delete mode 100644 vendor/google.golang.org/grpc/internal/googlecloud/manufacturer.go delete mode 100644 vendor/google.golang.org/grpc/internal/googlecloud/manufacturer_linux.go delete mode 100644 vendor/google.golang.org/grpc/internal/googlecloud/manufacturer_windows.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/callback_serializer.go create mode 100644 vendor/google.golang.org/grpc/internal/grpcsync/pubsub.go delete mode 100644 vendor/google.golang.org/grpc/internal/hierarchy/hierarchy.go delete mode 100644 vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls.pb.go delete mode 100644 vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls_config.pb.go delete mode 100644 vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls_grpc.pb.go create mode 100644 vendor/google.golang.org/grpc/internal/serviceconfig/duration.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/logging.go delete mode 100644 vendor/google.golang.org/grpc/internal/wrr/edf.go delete mode 100644 vendor/google.golang.org/grpc/internal/wrr/random.go delete mode 100644 vendor/google.golang.org/grpc/internal/wrr/wrr.go delete mode 100644 vendor/google.golang.org/grpc/internal/xds/matcher/matcher_header.go delete mode 100644 vendor/google.golang.org/grpc/internal/xds/matcher/string_matcher.go delete mode 100644 vendor/google.golang.org/grpc/internal/xds/rbac/matchers.go delete mode 100644 vendor/google.golang.org/grpc/internal/xds/rbac/rbac_engine.go delete mode 100644 vendor/google.golang.org/grpc/reflection/README.md delete mode 100644 vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection.pb.go delete mode 100644 vendor/google.golang.org/grpc/reflection/grpc_reflection_v1alpha/reflection_grpc.pb.go delete mode 100644 vendor/google.golang.org/grpc/reflection/serverreflection.go delete mode 100644 vendor/google.golang.org/grpc/resolver/manual/manual.go create mode 100644 vendor/google.golang.org/grpc/shared_buffer_pool.go delete mode 100644 vendor/google.golang.org/grpc/test/grpc_testing/test.pb.go delete mode 100644 vendor/google.golang.org/grpc/test/grpc_testing/test.proto delete mode 100644 vendor/google.golang.org/grpc/test/grpc_testing/test_grpc.pb.go delete mode 100644 vendor/google.golang.org/grpc/xds/bootstrap/bootstrap.go delete mode 100644 vendor/google.golang.org/grpc/xds/csds/csds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/balancer.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/cdsbalancer/cdsbalancer.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/cdsbalancer/cluster_handler.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/cdsbalancer/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/clusterimpl.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/config.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterimpl/picker.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/balancerstateaggregator.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/clustermanager.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/config.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clustermanager/picker.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/clusterresolver.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/config.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/configbuilder.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/configbuilder_childname.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/resource_resolver.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/resource_resolver_dns.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/clusterresolver/resource_resolver_eds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/loadstore/load_store_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/balancer.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/callcounter.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/config.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/outlierdetection/subconn_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/balancer.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/balancer_child.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/balancer_priority.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/config.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/ignore_resolve_now.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/priority/utils.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/config.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/picker.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/ring.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/ringhash.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/balancer/ringhash/util.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/clusterspecifier/cluster_specifier.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/clusterspecifier/rls/rls.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/httpfilter/fault/fault.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/httpfilter/httpfilter.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/httpfilter/rbac/rbac.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/httpfilter/router/router.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/internal.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/resolver/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/resolver/serviceconfig.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/resolver/watch_service.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/resolver/xds_resolver.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/server/conn_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/server/listener_wrapper.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/server/rds_handler.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/attributes.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/authority.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/bootstrap/bootstrap.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/bootstrap/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/bootstrap/template.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/callback_serializer.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/client.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/client_new.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl_authority.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl_dump.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl_loadreport.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/clientimpl_watchers.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/load/reporter.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/load/store.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/requests_counter.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/singleton.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/transport/loadreport.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/transport/transport.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/cluster_resource_type.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/endpoints_resource_type.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/errors.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/filter_chain.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/listener_resource_type.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/logging.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/matcher.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/matcher_path.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/name.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/resource_type.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/route_config_resource_type.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_cds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_eds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_lds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/type_rds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_cds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_eds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_lds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/unmarshal_rds.go delete mode 100644 vendor/google.golang.org/grpc/xds/internal/xdsclient/xdsresource/version/version.go delete mode 100644 vendor/google.golang.org/grpc/xds/server.go delete mode 100644 vendor/google.golang.org/grpc/xds/server_options.go delete mode 100644 vendor/google.golang.org/grpc/xds/xds.go delete mode 100644 vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/init.go delete mode 100644 vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/main.go delete mode 100644 vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/reflect.go delete mode 100644 vendor/google.golang.org/protobuf/cmd/protoc-gen-go/internal_gengo/well_known_types.go delete mode 100644 vendor/google.golang.org/protobuf/cmd/protoc-gen-go/main.go delete mode 100644 vendor/google.golang.org/protobuf/compiler/protogen/protogen.go delete mode 100644 vendor/google.golang.org/protobuf/internal/msgfmt/format.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protopath/path.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protopath/step.go delete mode 100644 vendor/google.golang.org/protobuf/reflect/protorange/range.go create mode 100644 vendor/google.golang.org/protobuf/types/dynamicpb/types.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/apipb/api.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/sourcecontextpb/source_context.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/known/typepb/type.pb.go delete mode 100644 vendor/google.golang.org/protobuf/types/pluginpb/plugin.pb.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/LICENSE create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/LICENSE-3rdparty.csv create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/LICENSE-APACHE create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/LICENSE-BSD3 create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/NOTICE create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ddtrace.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/app_types.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/db.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/messaging.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/peer.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/priority.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/rpc.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/span_kind.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/system.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext/tags.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal/globaltracer.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/context.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/doc.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/log.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/metrics.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/option.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/payload.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/propagating_tags.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/propagator.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/rand.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/rules_sampler.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/sampler.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/span.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/span_msgp.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/spancontext.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/sqlcomment.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/stats.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/stats_payload.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/stats_payload_msgp.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/telemetry.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/textmap.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/time.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/time_windows.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/tracer.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/transport.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/util.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer/writer.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/agent.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/appsec.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/appsec_disabled.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/common.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/grpcsec/grpc.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/grpcsec/tags.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/httpsec/http.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/httpsec/tags.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/sharedsec/actions.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/sharedsec/blocked-template.html create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/sharedsec/blocked-template.json create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/instrumentation/sharedsec/shared.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo/operation.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/limiter.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/remoteconfig.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/rules.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/rules.json create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/rules_manager.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/waf.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/container.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/env.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/gitmetadata.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/gitmetadatabinary.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/gitmetadatabinary_legacy.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig/globalconfig.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/azure/azure.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/cachedfetch/fetcher.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/ec2/ec2.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/ecs/aws.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/fqdn_nix.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/fqdn_windows.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/gce/gce.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/httputils/helpers.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/providers.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/validate/validate.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/log/log.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/namingschema.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/op_cache.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/op_client_server.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/op_db.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/op_messaging.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/option.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema/service_name.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer/normalizer.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo/osinfo.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo/osinfo_darwin.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo/osinfo_default.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo/osinfo_freebsd.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo/osinfo_linux.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo/osinfo_windows.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig/config.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig/remoteconfig.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig/types.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames/samplernames.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/client.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/message.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/option.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetry.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/utils.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/trace_context.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/endpoint_counter.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/profiler.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/traceprof.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/utils.go create mode 100644 vendor/gopkg.in/DataDog/dd-trace-go.v1/internal/version/version.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/.travis.yml delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/LICENSE delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/README.md delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/format.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pb.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pb_appengine.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pb_win.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pb_x.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pool.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pool_win.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/pool_x.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/reader.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/runecount.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/termios_bsd.go delete mode 100644 vendor/gopkg.in/cheggaaa/pb.v1/termios_sysv.go delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/.gitignore delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/.travis.yml delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/LICENSE delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/README.md delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/chown.go delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/chown_linux.go delete mode 100644 vendor/gopkg.in/natefinch/lumberjack.v2/lumberjack.go create mode 100644 vendor/gopkg.in/square/go-jose.v2/cryptosigner/cryptosigner.go create mode 100644 vendor/inet.af/netaddr/.gitignore create mode 100644 vendor/inet.af/netaddr/.gitmodules create mode 100644 vendor/inet.af/netaddr/AUTHORS create mode 100644 vendor/inet.af/netaddr/LICENSE create mode 100644 vendor/inet.af/netaddr/README.md create mode 100644 vendor/inet.af/netaddr/fuzz.go create mode 100644 vendor/inet.af/netaddr/ipset.go create mode 100644 vendor/inet.af/netaddr/mask6.go create mode 100644 vendor/inet.af/netaddr/netaddr.go create mode 100644 vendor/inet.af/netaddr/uint128.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/doc.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/generated.pb.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/generated.proto create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/register.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/types.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/certificates/v1alpha1/zz_generated.prerelease-lifecycle.go create mode 100644 vendor/k8s.io/api/networking/v1alpha1/well_known_labels.go delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/resource/v1alpha1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/resource/v1alpha2/doc.go create mode 100644 vendor/k8s.io/api/resource/v1alpha2/generated.pb.go create mode 100644 vendor/k8s.io/api/resource/v1alpha2/generated.proto create mode 100644 vendor/k8s.io/api/resource/v1alpha2/register.go create mode 100644 vendor/k8s.io/api/resource/v1alpha2/types.go create mode 100644 vendor/k8s.io/api/resource/v1alpha2/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/resource/v1alpha2/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/defaults.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/endpoints.yaml create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/fieldmanager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/atmostevery.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/buildmanagerinfo.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/capmanagers.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/conflict.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fieldmanager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/fields.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/lastapplied.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/lastappliedmanager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/lastappliedupdater.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/managedfields.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/managedfieldsupdater.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/manager.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/pathelement.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/skipnonapplied.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/stripmeta.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/structuredmerge.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/typeconverter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/internal/versionconverter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/node.yaml create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/pod.yaml create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/scalehandler.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/managedfields/typeconverter.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/backoff.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/delay.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/error.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/loop.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/poll.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/timer.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1/matchcondition.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/admissionpolicyspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/auditannotation.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/expressionwarning.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/matchcondition.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/paramsource.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/rule.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/rulewithoperations.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/typechecking.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1/validatingadmissionpolicystatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/matchcondition.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rule.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1/rulewithoperations.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/autoscaling/v2/podresourcemetricsource.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1alpha1/clustertrustbundle.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/certificates/v1alpha1/clustertrustbundlespec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/core/v1/containerresizepolicy.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedcsidriver.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedflexvolume.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/allowedhostpath.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/fsgroupstrategyoptions.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/hostportrange.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/idrange.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicy.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/podsecuritypolicyspec.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasgroupstrategyoptions.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runasuserstrategyoptions.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/runtimeclassstrategyoptions.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/selinuxstrategyoptions.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/extensions/v1beta1/supplementalgroupsstrategyoptions.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/groupversionkind.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/listmeta.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/status.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/statuscause.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/meta/v1/statusdetails.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/ipaddress.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/ipaddressspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/networking/v1alpha1/parentreference.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podscheduling.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podschedulingspec.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/podschedulingstatus.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaim.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclaimtemplate.go delete mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha1/resourceclass.go rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/allocationresult.go (76%) create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/podschedulingcontext.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/podschedulingcontextspec.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/podschedulingcontextstatus.go create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/resourceclaim.go rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclaimconsumerreference.go (99%) rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclaimparametersreference.go (99%) rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclaimschedulingstatus.go (99%) rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclaimspec.go (93%) rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclaimstatus.go (99%) create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/resourceclaimtemplate.go rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclaimtemplatespec.go (99%) create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/resourceclass.go rename vendor/k8s.io/client-go/applyconfigurations/resource/{v1alpha1 => v1alpha2}/resourceclassparametersreference.go (99%) create mode 100644 vendor/k8s.io/client-go/applyconfigurations/resource/v1alpha2/resourcehandle.go create mode 100644 vendor/k8s.io/client-go/informers/certificates/v1alpha1/clustertrustbundle.go create mode 100644 vendor/k8s.io/client-go/informers/certificates/v1alpha1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/doc.go delete mode 100644 vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/informers/networking/v1alpha1/ipaddress.go delete mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha1/interface.go delete mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha1/podscheduling.go delete mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha1/resourceclaim.go delete mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha1/resourceclaimtemplate.go delete mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha2/interface.go create mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha2/podschedulingcontext.go create mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha2/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha2/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/informers/resource/v1alpha2/resourceclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/selfsubjectreview.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1alpha1/certificates_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1alpha1/clustertrustbundle.go rename vendor/k8s.io/client-go/kubernetes/typed/{resource => certificates}/v1alpha1/doc.go (100%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1alpha1/ipaddress.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/podscheduling.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resource_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclaim.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclaimtemplate.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/doc.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/generated_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/podschedulingcontext.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/resource_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/resource/v1alpha2/resourceclass.go create mode 100644 vendor/k8s.io/client-go/listers/certificates/v1alpha1/clustertrustbundle.go create mode 100644 vendor/k8s.io/client-go/listers/certificates/v1alpha1/expansion_generated.go delete mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/listers/networking/v1alpha1/ipaddress.go delete mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha1/expansion_generated.go delete mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha1/podscheduling.go delete mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha1/resourceclaim.go delete mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha1/resourceclaimtemplate.go delete mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha1/resourceclass.go create mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha2/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha2/podschedulingcontext.go create mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha2/resourceclaim.go create mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha2/resourceclaimtemplate.go create mode 100644 vendor/k8s.io/client-go/listers/resource/v1alpha2/resourceclass.go create mode 100644 vendor/k8s.io/client-go/openapi/OWNERS create mode 100644 vendor/k8s.io/client-go/tools/cache/synctrack/lazy.go create mode 100644 vendor/k8s.io/client-go/tools/cache/synctrack/synctrack.go create mode 100644 vendor/k8s.io/klog/v2/format.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/cached/cache.go delete mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/handler/handler_cache.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/internal/serialization.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/schemaconv/openapi.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/schemaconv/proto_models.go create mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/fuzz.go delete mode 100644 vendor/k8s.io/kube-openapi/pkg/spec3/security_requirement.go create mode 100644 vendor/k8s.io/utils/net/ipfamily.go delete mode 100644 vendor/knative.dev/pkg/configmap/OWNERS delete mode 100644 vendor/knative.dev/pkg/kmeta/OWNERS delete mode 100644 vendor/knative.dev/pkg/logging/OWNERS delete mode 100644 vendor/knative.dev/pkg/metrics/OWNERS create mode 100644 vendor/sigs.k8s.io/structured-merge-diff/v4/merge/conflict.go create mode 100644 vendor/sigs.k8s.io/structured-merge-diff/v4/merge/update.go diff --git a/go.mod b/go.mod index 00fbf7e0..103347b3 100644 --- a/go.mod +++ b/go.mod @@ -4,41 +4,51 @@ go 1.20 require ( github.com/cli/go-gh/v2 v2.0.1 - github.com/onsi/gomega v1.27.6 - github.com/sigstore/cosign v1.13.1 + github.com/go-errors/errors v1.0.1 + github.com/onsi/gomega v1.27.10 + github.com/sigstore/cosign/v2 v2.2.0 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/tektoncd/cli v0.30.0 github.com/tektoncd/pipeline v0.44.0 gopkg.in/h2non/gock.v1 v1.1.2 - gotest.tools/v3 v3.4.0 - k8s.io/api v0.26.3 - k8s.io/apimachinery v0.26.3 - k8s.io/client-go v0.26.3 - knative.dev/pkg v0.0.0-20221123011842-b78020c16606 + gopkg.in/yaml.v3 v3.0.1 + gotest.tools/v3 v3.5.0 + k8s.io/api v0.27.3 + k8s.io/apimachinery v0.27.3 + k8s.io/client-go v0.27.3 + knative.dev/pkg v0.0.0-20230612155445-74c4be5e935e sigs.k8s.io/yaml v1.3.0 ) require ( - bitbucket.org/creachadair/shell v0.0.7 // indirect - cloud.google.com/go/compute v1.18.0 // indirect + cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.0 // indirect - cuelang.org/go v0.4.3 // indirect + cuelang.org/go v0.6.0 // indirect + filippo.io/edwards25519 v1.0.0 // indirect github.com/AlecAivazis/survey/v2 v2.3.6 // indirect github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.11 // indirect + github.com/Azure/go-autorest/autorest v0.11.29 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect + github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/DataDog/appsec-internal-go v1.0.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.45.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.46.0-rc.4 // indirect + github.com/DataDog/datadog-go/v5 v5.3.0 // indirect + github.com/DataDog/go-libddwaf v1.4.1 // indirect + github.com/DataDog/go-tuf v0.3.0--fix-localmeta-fork // indirect + github.com/DataDog/sketches-go v1.2.1 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/agnivade/levenshtein v1.1.1 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect @@ -53,134 +63,131 @@ require ( github.com/alibabacloud-go/tea-xml v1.1.2 // indirect github.com/aliyun/credentials-go v1.2.3 // indirect github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/aws/aws-sdk-go-v2 v1.17.5 // indirect - github.com/aws/aws-sdk-go-v2/config v1.18.14 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.14 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/aws/aws-sdk-go-v2 v1.20.0 // indirect + github.com/aws/aws-sdk-go-v2/config v1.18.32 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.31 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18 // indirect github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.13.17 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.4 // indirect - github.com/aws/smithy-go v1.13.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 // indirect + github.com/aws/smithy-go v1.14.0 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20221004211355-a250ad2ca1e3 // indirect - github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bgentry/speakeasy v0.1.0 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/blendle/zapdriver v1.3.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.0 // indirect + github.com/buildkite/agent/v3 v3.52.1 // indirect + github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chrismellard/docker-credential-acr-env v0.0.0-20221002210726-e883f69e0206 // indirect github.com/clbanning/mxj/v2 v2.5.6 // indirect github.com/cli/safeexec v1.0.0 // indirect github.com/cli/shurcooL-graphql v0.0.3 // indirect - github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect - github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b // indirect - github.com/cockroachdb/apd/v2 v2.0.1 // indirect + github.com/cloudflare/circl v1.3.3 // indirect + github.com/cockroachdb/apd/v3 v3.2.0 // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect - github.com/coreos/go-oidc/v3 v3.5.0 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/cyberphone/json-canonicalization v0.0.0-20210823021906-dc406ceaf94b // indirect + github.com/coreos/go-oidc/v3 v3.6.0 // indirect + github.com/cyberphone/json-canonicalization v0.0.0-20220623050100-57a0ce2678a7 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect + github.com/digitorus/timestamp v0.0.0-20230821155606-d1ad5ca9624c // indirect github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v23.0.1+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v23.0.1+incompatible // indirect + github.com/docker/cli v24.0.0+incompatible // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v24.0.0+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/emicklei/proto v1.6.15 // indirect - github.com/envoyproxy/go-control-plane v0.10.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect + github.com/ebitengine/purego v0.4.0-alpha.4.0.20230519103000-ee8dcecc618f // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/emicklei/proto v1.10.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.15.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/fullstorydev/grpcurl v1.8.7 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.5.3 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-chi/chi v4.1.2+incompatible // indirect - github.com/go-errors/errors v1.0.1 // indirect + github.com/go-ini/ini v1.67.0 // indirect github.com/go-jose/go-jose/v3 v3.0.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.21.4 // indirect - github.com/go-openapi/errors v0.20.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/errors v0.20.4 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/loads v0.21.2 // indirect - github.com/go-openapi/runtime v0.24.2 // indirect - github.com/go-openapi/spec v0.20.7 // indirect - github.com/go-openapi/strfmt v0.21.3 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-openapi/validate v0.22.0 // indirect - github.com/go-piv/piv-go v1.10.0 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect - github.com/go-playground/validator/v10 v10.11.0 // indirect + github.com/go-openapi/runtime v0.26.0 // indirect + github.com/go-openapi/spec v0.20.9 // indirect + github.com/go-openapi/strfmt v0.21.7 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/validate v0.22.1 // indirect + github.com/go-piv/piv-go v1.11.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.15.1 // indirect github.com/gobwas/glob v0.2.3 // indirect + github.com/goccy/go-json v0.10.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.4.3 // indirect - github.com/golang/glog v1.0.0 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.13.0 // indirect - github.com/google/certificate-transparency-go v1.1.3 // indirect + github.com/google/certificate-transparency-go v1.1.6 // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.14.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect + github.com/google/go-containerregistry v0.16.1 // indirect + github.com/google/go-github/v53 v53.2.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.5 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/trillian v1.5.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/henvic/httpretty v0.0.6 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/in-toto/in-toto-golang v0.3.4-0.20220709202702-fa494aaa0add // indirect + github.com/imdario/mergo v0.3.15 // indirect + github.com/in-toto/in-toto-golang v0.9.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jedisct1/go-minisign v0.0.0-20211028175153-1c139d1cc84b // indirect - github.com/jhump/protoreflect v1.14.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jonboulle/clockwork v0.3.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.16.0 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/ktr0731/go-ansisgr v0.1.0 // indirect github.com/ktr0731/go-fuzzyfinder v0.7.0 // indirect - github.com/leodido/go-urn v1.2.1 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/lestrrat-go/blackmagic v1.0.1 // indirect + github.com/lestrrat-go/httpcc v1.0.1 // indirect + github.com/lestrrat-go/httprc v1.0.4 // indirect + github.com/lestrrat-go/iter v1.0.2 // indirect + github.com/lestrrat-go/jwx/v2 v2.0.11 // indirect + github.com/lestrrat-go/option v1.0.1 // indirect github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -193,6 +200,7 @@ require ( github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -201,123 +209,110 @@ require ( github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect github.com/muesli/termenv v0.12.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect github.com/nsf/termbox-go v1.1.1 // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/open-policy-agent/opa v0.45.0 // indirect + github.com/oleiade/reflections v1.0.1 // indirect + github.com/open-policy-agent/opa v0.55.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc2 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/outcaste-io/ristretto v0.2.1 // indirect + github.com/pborman/uuid v1.2.1 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/philhofer/fwd v1.1.2 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect - github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc // indirect + github.com/protocolbuffers/txtpbfmt v0.0.0-20230328191034-3462fbc510c0 // indirect + github.com/puzpuzpuz/xsync/v2 v2.4.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sassoftware/relic v0.0.0-20210427151427-dfb082b79b74 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.4.0 // indirect + github.com/sassoftware/relic v7.2.1+incompatible // indirect + github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect + github.com/segmentio/asm v1.2.0 // indirect github.com/segmentio/ksuid v1.0.4 // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect - github.com/sigstore/fulcio v0.6.0 // indirect - github.com/sigstore/rekor v0.12.1-0.20220915152154-4bb6f441c1b2 // indirect - github.com/sigstore/sigstore v1.5.2 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sigstore/fulcio v1.4.0 // indirect + github.com/sigstore/rekor v1.2.2 // indirect + github.com/sigstore/sigstore v1.7.2 // indirect + github.com/sigstore/timestamp-authority v1.1.2 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.15.0 // indirect - github.com/spiffe/go-spiffe/v2 v2.1.2 // indirect + github.com/spf13/viper v1.16.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.1.6 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/stretchr/testify v1.8.2 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tchap/go-patricia/v2 v2.3.1 // indirect github.com/tektoncd/triggers v0.23.0 // indirect - github.com/tent/canonical-json-go v0.0.0-20130607151641-96e4ba3a7613 // indirect github.com/thales-e-security/pool v0.0.2 // indirect - github.com/theupdateframework/go-tuf v0.5.2 // indirect + github.com/theupdateframework/go-tuf v0.6.1 // indirect github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e // indirect + github.com/tinylib/msgp v1.1.8 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect github.com/tjfoc/gmsm v1.3.2 // indirect - github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 // indirect - github.com/transparency-dev/merkle v0.0.1 // indirect - github.com/urfave/cli v1.22.7 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/xanzy/go-gitlab v0.73.1 // indirect + github.com/transparency-dev/merkle v0.0.2 // indirect + github.com/vbatts/tar-split v0.11.3 // indirect + github.com/xanzy/go-gitlab v0.90.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect github.com/xlab/treeprint v1.1.0 // indirect - github.com/yashtewari/glob-intersection v0.1.0 // indirect + github.com/yashtewari/glob-intersection v0.2.0 // indirect github.com/zeebo/errs v1.3.0 // indirect - go.etcd.io/bbolt v1.3.6 // indirect - go.etcd.io/etcd/api/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/client/v2 v2.306.0-alpha.0 // indirect - go.etcd.io/etcd/client/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/etcdctl/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/etcdutl/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/pkg/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/raft/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/server/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/tests/v3 v3.6.0-alpha.0 // indirect - go.etcd.io/etcd/v3 v3.6.0-alpha.0 // indirect - go.mongodb.org/mongo-driver v1.11.0 // indirect + go.mongodb.org/mongo-driver v1.11.3 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0 // indirect - go.opentelemetry.io/otel v1.14.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 // indirect - go.opentelemetry.io/otel/metric v0.36.0 // indirect - go.opentelemetry.io/otel/sdk v1.13.0 // indirect - go.opentelemetry.io/otel/trace v1.14.0 // indirect - go.opentelemetry.io/proto/otlp v0.19.0 // indirect + go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/sdk v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.9.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.7.0 // indirect - golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.6.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect + go.step.sm/crypto v0.35.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.25.0 // indirect + go4.org/intern v0.0.0-20211027215823-ae77deb06f29 // indirect + go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.9.3 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.110.0 // indirect + google.golang.org/api v0.138.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514 // indirect - google.golang.org/grpc v1.54.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect - gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect + google.golang.org/grpc v1.57.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/DataDog/dd-trace-go.v1 v1.53.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.25.3 // indirect + inet.af/netaddr v0.0.0-20220811202034-502d2d690317 // indirect + k8s.io/apiextensions-apiserver v0.26.5 // indirect k8s.io/cli-runtime v0.26.3 // indirect - k8s.io/klog/v2 v2.80.1 // indirect - k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect - k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect + k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.12.1 // indirect sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect - sigs.k8s.io/release-utils v0.7.3 // indirect + sigs.k8s.io/release-utils v0.7.4 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect ) diff --git a/go.sum b/go.sum index f91e3279..df2be495 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,6 @@ -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -bitbucket.org/creachadair/shell v0.0.7 h1:Z96pB6DkSb7F3Y3BBnJeOZH2gazyMTWlvecSD4vDqfk= -bitbucket.org/creachadair/shell v0.0.7/go.mod h1:oqtXSSvSYr4624lnnabXHaBsYW6RD80caLi2b3hJk0U= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= @@ -22,95 +17,62 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.17.0/go.mod h1:pUlbH9kNOnp6ayShsqKLB6w49z14ILAaq0hrjh93Ajw= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.5.0/go.mod h1:RGUNM0FFAVkYA94BLTxoXBgfIyY1Riq67TwaBXH0lwc= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw= -cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= +cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= +cloud.google.com/go/kms v1.15.1 h1:HUC3fAoepH3RpcQXiJhXWWYizjQ5r7YjI7SO9ZbHf9s= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.11.0-beta.schemas/go.mod h1:llNLsvx+RnsZJoY481TzC1XcdB2hWdR6gSWM5O4vgfs= -cloud.google.com/go/spanner v1.17.0/go.mod h1:+17t2ixFwRG4lWRwE+5kipDR9Ef07Jkmc8z0IbMDKUs= -cloud.google.com/go/spanner v1.18.0/go.mod h1:LvAjUXPeJRGNuGpikMULjhLj/t9cRvdc+fxRoLiugXA= -cloud.google.com/go/spanner v1.31.0/go.mod h1:ztDJVUZgEA2xc7HjSNQG+d+2L0bOSsw876/5Hnr78U8= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI= -cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= -code.gitea.io/sdk/gitea v0.11.3/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= -contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI= contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= -contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= -contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -contrib.go.opencensus.io/exporter/stackdriver v0.13.12/go.mod h1:mmxnWlrvrFdpiOHOhxBaVi1rkc0WOqhgfknj4Yg0SeQ= -contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= -contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= -cuelang.org/go v0.4.3 h1:W3oBBjDTm7+IZfCKZAmC8uDG0eYfJL4Pp/xbbCMKaVo= -cuelang.org/go v0.4.3/go.mod h1:7805vR9H+VoBNdWFdI7jyDR3QLUPp4+naHfbcgp55HI= +cuelang.org/go v0.6.0 h1:dJhgKCog+FEZt7OwAYV1R+o/RZPmE8aqFoptmxSWyr8= +cuelang.org/go v0.6.0/go.mod h1:9CxOX8aawrr3BgSdqPj7V0RYoXo7XIb+yDFC6uESrOQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230618160516-e936619f9f18 h1:rd389Q26LMy03gG4anandGFC2LW/xvjga5GezeeaxQk= github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw= github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 h1:8+4G8JaejP8Xa6W46PzJEwisNgBXMvFcz78N6zG/ARw= github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0/go.mod h1:GgeIE+1be8Ivm7Sh4RgwI42aTtC9qrcj+Y9Y6CjJhJs= -github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-sdk-for-go v29.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v30.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= -github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= -github.com/Azure/go-autorest v12.0.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1 h1:/iHxaJhsFr0+xVFfbMr5vxz848jyiWuIEDhYq3y5odY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.0 h1:yfJe15aSwEQ6Oo6J+gdfdulPNoZ3TEhmbhLIoxZcA+U= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= -github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= -github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= +github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw= +github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.11 h1:P6bYXFoao05z5uhOQzbC3Qd8JqF3jUoocoTeIxkp2cA= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.11/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= +github.com/Azure/go-autorest/autorest/adal v0.9.22 h1:/GblQdIudfEM3AWWZ0mrYJQSd7JS4S/Mbzh6F0ov0Xc= +github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 h1:wkAZRgT/pn8HhFyzfe9UnqOjJYqlembgCTi72Bm/xKk= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.12/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= @@ -119,48 +81,53 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/DataDog/appsec-internal-go v1.0.0 h1:2u5IkF4DBj3KVeQn5Vg2vjPUtt513zxEYglcqnd500U= +github.com/DataDog/appsec-internal-go v1.0.0/go.mod h1:+Y+4klVWKPOnZx6XESG7QHydOaUGEXyH2j/vSg9JiNM= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.45.0-rc.1 h1:XyYvstMFpSyZtfJHWJm1Sf1meNyCdfhKJrjB6+rUNOk= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.45.0-rc.1/go.mod h1:e933RWa4kAWuHi5jpzEuOiULlv21HcCFEVIYegmaB5c= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.46.0-rc.4 h1:KE/ntoEPODxVGYXjWXFVVRniprifNhE4OOrylNolUv0= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.46.0-rc.4/go.mod h1:VVMDDibJxYEkwcLdZBT2g8EHKpbMT4JdOhRbQ9GdjbM= +github.com/DataDog/datadog-go/v5 v5.1.1/go.mod h1:KhiYb2Badlv9/rofz+OznKoEF5XKTonWyhx5K83AP8E= +github.com/DataDog/datadog-go/v5 v5.3.0 h1:2q2qjFOb3RwAZNU+ez27ZVDwErJv5/VpbBPprz7Z+s8= +github.com/DataDog/datadog-go/v5 v5.3.0/go.mod h1:XRDJk1pTc00gm+ZDiBKsjh7oOOtJfYfglVCmFb8C2+Q= +github.com/DataDog/go-libddwaf v1.4.1 h1:dZTypHGyf38vDk5QbbsqaB8w5X213dFOZKT8SnMLmSI= +github.com/DataDog/go-libddwaf v1.4.1/go.mod h1:qLZEuaF5amEVMP5NTYtr/6m30m73voPL4i7SK7dnnt4= +github.com/DataDog/go-tuf v0.3.0--fix-localmeta-fork h1:yBq5PrAtrM4yVeSzQ+bn050+Ysp++RKF1QmtkL4VqvU= +github.com/DataDog/go-tuf v0.3.0--fix-localmeta-fork/go.mod h1:yA5JwkZsHTLuqq3zaRgUQf35DfDkpOZqgtBqHKpwrBs= +github.com/DataDog/gostackparse v0.5.0 h1:jb72P6GFHPHz2W0onsN51cS3FkaMDcjb0QzgxxA4gDk= +github.com/DataDog/sketches-go v1.2.1 h1:qTBzWLnZ3kM2kw39ymh6rMcnN+5VULwFs++lEYUUsro= +github.com/DataDog/sketches-go v1.2.1/go.mod h1:1xYmPLY1So10AwxV6MJV0J53XVH+WL9Ad1KetxVivVI= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek= +github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/ThalesIgnite/crypto11 v1.2.5 h1:1IiIIEqYmBvUYFeMnHqRft4bwf/O36jryEUpY+9ef8E= github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.2/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= @@ -199,125 +166,82 @@ github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCE github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= github.com/aliyun/credentials-go v1.2.3 h1:Vmodnr52Rz1mcbwn0kzMhLRKb6soizewuKXdfZiNemU= github.com/aliyun/credentials-go v1.2.3/go.mod h1:/KowD1cfGSLrLsH28Jr8W+xwoId0ywIy5lNzDz6O1vw= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/beam v2.28.0+incompatible/go.mod h1:/8NX3Qi8vGstDLLaeaU7+lzVEu/ACaQhYjeefzQ0y1o= -github.com/apache/beam/sdks/v2 v2.0.0-20211012030016-ef4364519c94/go.mod h1:/kOom7hCyHVzAC/Z7HbZywkZZv6ywF+wb4CvgDVdcB8= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= -github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= -github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= -github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.19.45/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/aws/aws-sdk-go v1.44.318 h1:Yl66rpbQHFUbxe9JBKLcvOvRivhVgP6+zH0b9KzARX8= github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= -github.com/aws/aws-sdk-go-v2 v1.17.5 h1:TzCUW1Nq4H8Xscph5M/skINUitxM5UBAyvm2s7XBzL4= -github.com/aws/aws-sdk-go-v2 v1.17.5/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.20.0 h1:INUDpYLt4oiPOJl0XwZDK2OVAVf0Rzo+MGVTv9f+gy8= +github.com/aws/aws-sdk-go-v2 v1.20.0/go.mod h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4= github.com/aws/aws-sdk-go-v2/config v1.17.8/go.mod h1:UkCI3kb0sCdvtjiXYiU4Zx5h07BOpgBTtkPu/49r+kA= -github.com/aws/aws-sdk-go-v2/config v1.18.14 h1:rI47jCe0EzuJlAO5ptREe3LIBAyP5c7gR3wjyYVjuOM= -github.com/aws/aws-sdk-go-v2/config v1.18.14/go.mod h1:0pI6JQBHKwd0JnwAZS3VCapLKMO++UL2BOkWwyyzTnA= +github.com/aws/aws-sdk-go-v2/config v1.18.32 h1:tqEOvkbTxwEV7hToRcJ1xZRjcATqwDVsWbAscgRKyNI= +github.com/aws/aws-sdk-go-v2/config v1.18.32/go.mod h1:U3ZF0fQRRA4gnbn9GGvOWLoT2EzzZfAWeKwnVrm1rDc= github.com/aws/aws-sdk-go-v2/credentials v1.12.21/go.mod h1:O+4XyAt4e+oBAoIwNUYkRg3CVMscaIJdmZBOcPgJ8D8= -github.com/aws/aws-sdk-go-v2/credentials v1.13.14 h1:jE34fUepssrhmYpvPpdbd+d39PHpuignDpNPNJguP60= -github.com/aws/aws-sdk-go-v2/credentials v1.13.14/go.mod h1:85ckagDuzdIOnZRwws1eLKnymJs3ZM1QwVC1XcuNGOY= +github.com/aws/aws-sdk-go-v2/credentials v1.13.31 h1:vJyON3lG7R8VOErpJJBclBADiWTwzcwdkQpTKx8D2sk= +github.com/aws/aws-sdk-go-v2/credentials v1.13.31/go.mod h1:T4sESjBtY2lNxLgkIASmeP57b5j7hTQqCbqG0tWnxC4= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17/go.mod h1:yIkQcCDYNsZfXpd5UX2Cy+sWA1jPgIhGTw9cOBzfVnQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23 h1:Kbiv9PGnQfG/imNI4L/heyUXvzKmcWSBeDvkrQz5pFc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23/go.mod h1:mOtmAg65GT1HIL/HT/PynwPbS+UG0BgCZ6vhkPqnxWo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29 h1:9/aKwwus0TQxppPXFmf010DFrE+ssSbzroLVYINA+xE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.29/go.mod h1:Dip3sIGv485+xerzVv24emnjX5Sg88utCL8fwGmCeWg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 h1:zr/gxAZkMcvP71ZhQOcvdm8ReLjFgIXnIn0fw5AM7mo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37/go.mod h1:Pdn4j43v49Kk6+82spO3Tu5gSeQXRsxo56ePPQAvFiA= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23 h1:b/Vn141DBuLVgXbhRWIrl9g+ww7G+ScV5SzniWR13jQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.23/go.mod h1:mr6c4cHC+S/MMkrjtSlG4QA36kOznDep+0fga5L/fGQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 h1:0HCMIkAkVY9KMgueD8tf4bRTUanzEYvhw7KkPXIMpO0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24/go.mod h1:jULHjqqjDlbyTa7pfM7WICATnOv+iOhjletM3N0Xbu8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30 h1:IVx9L7YFhpPq0tTnGo8u8TpluFu7nAn9X3sUDMb11c0= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30/go.mod h1:vsbq62AOBwQ1LJ/GWKFxX8beUEYeRp/Agitrxee2/qM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU= github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18 h1:uiF/RI+Up8H2xdgT2GWa20YzxiKEalHieqNjm6HC3Xk= github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18/go.mod h1:DQtDYmexqR+z+B6HBCvY7zK/tuXKv6Zy/IwOXOK3eow= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.13.17 h1:bcQy5/dcJO8VQD+p0tDoIYdgEC3ch9f1/BNRES7XMug= github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.13.17/go.mod h1:r1Vuka0kyzqN0sZm4lYTXf0Vhl+o/mTLq6vKpBBZYaQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17/go.mod h1:4nYOrY41Lrbk2170/BGkcJKBhws9Pfn8MG3aGqjjeFI= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23 h1:QoOybhwRfciWUBbZ0gp9S7XaDnCuSTeK/fySB99V1ls= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.23/go.mod h1:9uPh+Hrz2Vn6oMnQYiUi/zbh3ovbnQk19YKINkQny44= -github.com/aws/aws-sdk-go-v2/service/kms v1.20.4 h1:FOY3JSIwgItCdaeuLKjtijD8Enx6BHy5nSS/V6COOeA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4= +github.com/aws/aws-sdk-go-v2/service/kms v1.24.1 h1:zDmx9yZjSYDaeakQVN16qfsLxhBeAxgclioB0+rOCDM= github.com/aws/aws-sdk-go-v2/service/sso v1.11.23/go.mod h1:/w0eg9IhFGjGyyncHIQrXtU8wvNsTJOP0R6PPj0wf80= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.3 h1:bUeZTWfF1vBdZnoNnnq70rB/CzdZD7NR2Jg2Ax+rvjA= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.3/go.mod h1:jtLIhd+V+lft6ktxpItycqHqiVXrPIRjWIsFIlzMriw= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+MeF5WgyeRlsLnHY= +github.com/aws/aws-sdk-go-v2/service/sso v1.13.1/go.mod h1:TC9BubuFMVScIU+TLKamO6VZiYTkYoEHqlSQwAe2omw= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6/go.mod h1:csZuQY65DAdFBt1oIjO5hhBR49kQqop4+lcuCjf2arA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3 h1:G/+7NUi+q+H0LG3v32jfV4OkaQIcpI92g0owbXKk6NY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.3/go.mod h1:zVwRrfdSmbRZWkUkWjOItY7SOalnFnq/Yg2LVPqDjwc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 h1:hd0SKLMdOL/Sl6Z0np1PX9LeH2gqNtBe0MhTedA8MGI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1/go.mod h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg= github.com/aws/aws-sdk-go-v2/service/sts v1.16.19/go.mod h1:h4J3oPZQbxLhzGnk+j9dfYHi5qIOVJ5kczZd658/ydM= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.4 h1:j0USUNbl9c/8tBJ8setEbwxc7wva0WyoeAaFRiyTUT8= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.4/go.mod h1:1mKZHLLpDMHTNSYPJ7qrcnCQdHCWsNQaT0xRvq2u80s= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs= +github.com/aws/aws-sdk-go-v2/service/sts v1.21.1/go.mod h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI= github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.14.0 h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io= +github.com/aws/smithy-go v1.14.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20221004211355-a250ad2ca1e3 h1:Ted/bR1N6ltMrASdwRhX1BrGYSFg3aeGMlK8GlgkGh4= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20221004211355-a250ad2ca1e3/go.mod h1:m06KtrZgOloUaePAQMv+Ha8kRmTnKdozTHZrweepIrw= -github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bytecodealliance/wasmtime-go v1.0.0 h1:9u9gqaUiaJeN5IoD1L7egD8atOnTGyJcNp8BhkL9cUU= -github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= -github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/buildkite/agent/v3 v3.52.1 h1:s2pxVsYVt/OSMDlOM+ei5ZuE3+X6WptSwSR+OnQ7Gz8= +github.com/buildkite/agent/v3 v3.52.1/go.mod h1:MSIR+qpVb1Z663HlSqKEoIc4kkhmUFf4XazdCkxyE8E= +github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 h1:k6UDF1uPYOs0iy1HPeotNa155qXRWrzKnqAaGXHLZCE= +github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251/go.mod h1:gbPR1gPu9dB96mucYIR7T3B7p/78hRVSOuzIWLHK2Y4= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= -github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chrismellard/docker-credential-acr-env v0.0.0-20221002210726-e883f69e0206 h1:lG6Usi/kX/JBZzGz1H+nV+KwM97vThQeKunCbS6PutU= @@ -327,7 +251,6 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/mxj/v2 v2.5.6 h1:Jm4VaCI/+Ug5Q57IzEoZbwx4iQFA6wkXv72juUSeK+g= github.com/clbanning/mxj/v2 v2.5.6/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/cli/go-gh/v2 v2.0.1 h1:W4L7C5xT9CwkcqTsUzBhFhRKGpek9oRtdDLku2Hku+E= github.com/cli/go-gh/v2 v2.0.1/go.mod h1:zWab1jRnJ0Ug8qRjsZHFk/Oq51ZWuhSxRL2FDUDgQWk= github.com/cli/safeexec v1.0.0 h1:0VngyaIyqACHdcMNWfo6+KdUYnqEr2Sg+bSP1pdF+dI= @@ -336,124 +259,82 @@ github.com/cli/shurcooL-graphql v0.0.3 h1:CtpPxyGDs136/+ZeyAfUKYmcQBjDlq5aqnrDCW github.com/cli/shurcooL-graphql v0.0.3/go.mod h1:tlrLmw/n5Q/+4qSvosT+9/W5zc8ZMjnJeYBxSdb4nWA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw= +github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b h1:ACGZRIr7HsgBKHsueQ1yM4WaVaXh21ynwqsF8M8tXhA= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/apd/v2 v2.0.1 h1:y1Rh3tEU89D+7Tgbw+lp52T6p/GJLpDmNvr10UWqLTE= -github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cockroachdb/apd/v3 v3.2.0 h1:79kHCn4tO0VGu3W0WujYrMjBDk8a2H4KEUYcXf7whcg= +github.com/cockroachdb/apd/v3 v3.2.0/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw= -github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/coreos/go-oidc/v3 v3.6.0 h1:AKVxfYw1Gmkn/w96z0DbT/B/xFnzTd3MkZvWLjF4n/o= +github.com/coreos/go-oidc/v3 v3.6.0/go.mod h1:ZpHUsHBucTUj6WOkrP4E20UPynbLZzhTQ1XKCXkxyPc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/cyberphone/json-canonicalization v0.0.0-20210823021906-dc406ceaf94b h1:lMzA7yYThpwx7iYNpTeiQnRH6h5JSfSYMJdz+pxZOW8= -github.com/cyberphone/json-canonicalization v0.0.0-20210823021906-dc406ceaf94b/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/cyberphone/json-canonicalization v0.0.0-20220623050100-57a0ce2678a7 h1:vU+EP9ZuFUCYE0NYLwTSob+3LNEJATzNfP/DC7SWGWI= +github.com/cyberphone/json-canonicalization v0.0.0-20220623050100-57a0ce2678a7/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/depcheck-test/depcheck-test v0.0.0-20220607135614-199033aaa936 h1:foGzavPWwtoyBvjWyKJYDYsyzy+23iBV7NKTwdk+LRY= -github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgraph-io/badger/v3 v3.2103.2 h1:dpyM5eCJAtQCBcMCZcT4UBZchuTJgCywerHHgmxfxM8= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgraph-io/badger/v3 v3.2103.5 h1:ylPa6qzbjYRQMU6jokoj4wzcaweHylt//CH0AKt0akg= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/digitorus/pkcs7 v0.0.0-20230713084857-e76b763bdc49/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc= +github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 h1:ge14PCmCvPjpMQMIAH7uKg0lrtNSOdpYsRXlwk3QbaE= +github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc= +github.com/digitorus/timestamp v0.0.0-20230821155606-d1ad5ca9624c h1:kgG83Hfj3YXkUbrihwBxDc0COzP1ZejiDSr4/fItT0E= +github.com/digitorus/timestamp v0.0.0-20230821155606-d1ad5ca9624c/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy13Ul2Q5oM= -github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v23.0.1+incompatible h1:vjgvJZxprTTE1A37nm+CLNAdwu6xZekyoiVlUZEINcY= -github.com/docker/docker v23.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/cli v24.0.0+incompatible h1:0+1VshNwBQzQAx9lOl+OYCTCEAD8fKs/qeXMx3O0wqM= +github.com/docker/cli v24.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.0+incompatible h1:z4bf8HvONXX9Tde5lGBMQ7yCJgNahmJumdrStZAbeY4= +github.com/docker/docker v24.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emicklei/proto v1.6.15 h1:XbpwxmuOPrdES97FrSfpyy67SSCV/wBIKXqgJzh6hNw= -github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= +github.com/ebitengine/purego v0.4.0-alpha.4.0.20230519103000-ee8dcecc618f h1:v8f0ADMg0RBM0+5rb8qCFj/XlPkjo+xkyCLuUpBnj9s= +github.com/ebitengine/purego v0.4.0-alpha.4.0.20230519103000-ee8dcecc618f/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/proto v1.10.0 h1:pDGyFRVV5RvV+nkBK9iy3q67FBy9Xa7vwrOTE+g5aGw= +github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3 h1:xdCVXxEe0Y3FQith+0cj2irwZudqGYvecuLB1HtdexY= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -462,41 +343,27 @@ github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2Vvl github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01 h1:IeaD1VDVBPlx3viJT9Md8if8IxxJnO+x0JCGb054heg= github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52 h1:a4DFiKFJiDRGFD1qIcqGLX/WlUMD9dyLSLDt+9QZgt8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e/go.mod h1:HyVoz1Mz5Co8TFO8EupIdlcpwShBmY98dkT2xeHkvEI= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/foxcpp/go-mockdns v0.0.0-20210729171921-fb145fc6f897 h1:E52jfcE64UG42SwLmrW0QByONfGynWuzBvm86BoB9z8= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fullstorydev/grpcurl v1.8.0/go.mod h1:Mn2jWbdMrQGJQ8UD62uNyMumT2acsZUCkZIqFxsQf1o= -github.com/fullstorydev/grpcurl v1.8.1/go.mod h1:3BWhvHZwNO7iLXaQlojdg5NA6SxUDePli4ecpK1N7gw= -github.com/fullstorydev/grpcurl v1.8.6/go.mod h1:WhP7fRQdhxz2TkL97u+TCb505sxfH78W1usyoB3tepw= -github.com/fullstorydev/grpcurl v1.8.7 h1:xJWosq3BQovQ4QrdPO72OrPiWuGgEsxY8ldYsJbPrqI= -github.com/fullstorydev/grpcurl v1.8.7/go.mod h1:pVtM4qe3CMoLaIzYS8uvTuDj2jVYmXqMUkZeijnXp/E= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.5.3 h1:b9XQrT6QGbgI7JvZOJXFNczOQeIYbo8BfeSMzt2sAV0= github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= -github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= @@ -504,26 +371,24 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-jose/go-jose/v3 v3.0.0 h1:s6rrhirfEP/CGIoc6p+PZAeogN2SxKav6Wp7+dyMWVo= github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= @@ -532,54 +397,50 @@ github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9Qy github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc= -github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= +github.com/go-openapi/errors v0.20.4 h1:unTcVm6PispJsMECE3zWgvG4xTiKda1LIR5rCRWLG6M= +github.com/go-openapi/errors v0.20.4/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= -github.com/go-openapi/runtime v0.24.2 h1:yX9HMGQbz32M87ECaAhGpJjBmErO3QLcgdZj9BzGx7c= -github.com/go-openapi/runtime v0.24.2/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= +github.com/go-openapi/runtime v0.26.0 h1:HYOFtG00FM1UvqrcxbEJg/SwvDRvYLQKGhw2zaQjTcc= +github.com/go-openapi/runtime v0.26.0/go.mod h1:QgRGeZwrUcSHdeh4Ka9Glvo0ug1LC5WyE+EV88plZrQ= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI= -github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= +github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k= +github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= -github.com/go-openapi/validate v0.22.0 h1:b0QecH6VslW/TxtpKgzpO1SNG7GU2FsaqKdP1E2T50Y= -github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= -github.com/go-piv/piv-go v1.10.0 h1:P1Y1VjBI5DnXW0+YkKmTuh5opWnMIrKriUaIOblee9Q= -github.com/go-piv/piv-go v1.10.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.0 h1:0W+xRM511GY47Yy3bZUbJVitCNg2BOGlCyvTqsp/xIw= -github.com/go-playground/validator/v10 v10.11.0/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-rod/rod v0.112.6 h1:zMirUmhsBeshMWyf285BD0UGtGq54HfThLDGSjcP3lU= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= +github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-piv/piv-go v1.11.0 h1:5vAaCdRTFSIW4PeqMbnsDlUZ7odMYWnHBDGdmtU/Zhg= +github.com/go-piv/piv-go v1.11.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= +github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-quicktest/qt v1.100.0 h1:I7iSLgIwNp0E0UnSvKJzs7ig0jg/Iq83zsZjtQNW7jY= +github.com/go-rod/rod v0.114.2 h1:Qwt+vZHHnb117zc0q+XjhAJCkB01hchWSxH/raCyLb4= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= @@ -609,28 +470,18 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU= -github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -643,8 +494,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -661,28 +510,20 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.13.0 h1:z+8OBOcmh7IeKyqwT/6IlnMvy621fYUqnTVPEdegGlU= github.com/google/cel-go v0.13.0/go.mod h1:K2hpQgEjDp18J76a2DKFRlPBPpgRZgi6EbnpDgIhJ8s= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.2-0.20210422104406-9f33727a7a18/go.mod h1:6CKh9dscIRoqc2kC6YUFICHZMT9NrClyPrRVFrdw1QQ= -github.com/google/certificate-transparency-go v1.1.2-0.20210512142713-bed466244fa6/go.mod h1:aF2dp7Dh81mY8Y/zpzyXps4fQW5zQbDu2CxfpJB6NkI= -github.com/google/certificate-transparency-go v1.1.3 h1:WEb38wcTe0EuAvg7USzgklnOjjnlMaahYO3faaqnCn8= -github.com/google/certificate-transparency-go v1.1.3/go.mod h1:S9FT/VzOUzhOGG0iLrzDs+f5Ml/zm7IYY/w+IlHz01M= +github.com/google/certificate-transparency-go v1.1.6 h1:SW5K3sr7ptST/pIvNkSVWMiJqemRmkjJPPT0jzXdOOY= +github.com/google/certificate-transparency-go v1.1.6/go.mod h1:0OJjOsOk+wj6aYQgP7FU0ioQ0AJUmnWPFMqTjQeazPQ= github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= @@ -697,31 +538,21 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.14.0 h1:z58vMqHxuwvAsVwvKEkmVBz2TlgBgH5k6koEXBtlYkw= -github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= -github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-licenses v0.0.0-20210329231322-ce1d9163b77d/go.mod h1:+TYOmkVoJOpwnS0wfdsJCV9CoD5nJYsHoFk/0CrTK4M= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-containerregistry v0.16.1 h1:rUEt426sR6nyrL3gt+18ibRcvYpKYdpsa5ZW7MA08dQ= +github.com/google/go-containerregistry v0.16.1/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ= +github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI= +github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= -github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/licenseclassifier v0.0.0-20210325184830-bb04aff29e72/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -732,181 +563,93 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a h1:PEOGDI1kkyW37YqPWHLHc+D20D9+87Wt12TCcfTUo5Q= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= +github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/trillian v1.3.14-0.20210409160123-c5ea3abd4a41/go.mod h1:1dPv0CUjNQVFEDuAUFhZql16pw/VlPgaX8qj+g5pVzQ= -github.com/google/trillian v1.3.14-0.20210511103300-67b5f349eefa/go.mod h1:s4jO3Ai4NSvxucdvqUHON0bCqJyoya32eNw6XJwsmNc= -github.com/google/trillian v1.4.1/go.mod h1:43IVCsGXxP5mZK9yFkTQdQrMQm/wryNBV2GNEdqzVz8= -github.com/google/trillian v1.5.0 h1:I5pIN18bKlXtlj1Tk919rQ3mWBU2BzNNR6JhLISGMB4= -github.com/google/trillian v1.5.0/go.mod h1:2/gAIc+G1MUcErOPc+cSwHAQHZlGy+RYHjVGnhUQ3e8= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= -github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/goreleaser/goreleaser v0.134.0/go.mod h1:ZT6Y2rSYa6NxQzIsdfWWNWAlYGXGbreo66NmE+3X3WQ= -github.com/goreleaser/nfpm v1.2.1/go.mod h1:TtWrABZozuLOttX2uDlYyECfQX7x5XYkVxhjYcR6G9w= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.2/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0/go.mod h1:YDZoGHuwE+ov0c8smSH49WLF3F2LaWnYYuDVd+EWrc0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4= github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 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-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 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-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0= -github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/vault/api v1.9.0 h1:ab7dI6W8DuCY7yCU8blo0UCYl2oHre/dloCmzMWg9w8= +github.com/hashicorp/vault/api v1.9.2 h1:YjkZLJ7K3inKgMZ0wzCU9OHqc+UqMQyXsPXnf3Cl2as= github.com/henvic/httpretty v0.0.6 h1:JdzGzKZBajBfnvlMALXXMVQWxWMF/ofTy8C3/OSUTxs= github.com/henvic/httpretty v0.0.6/go.mod h1:X38wLjWXHkXT7r2+uK8LjCMne9rsuNaBLJ+5cU2/Pmo= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hinshun/vt10x v0.0.0-20220228203356-1ab2cad5fd82 h1:uf1FmugJNeFovjWtxD7FSPWQXdi0KuKnZfvN4CFUAtA= github.com/honeycombio/beeline-go v1.10.0 h1:cUDe555oqvw8oD76BQJ8alk7FP0JZ/M/zXpNvOEDLDc= github.com/honeycombio/libhoney-go v1.16.0 h1:kPpqoz6vbOzgp7jC6SR7SkNj7rua7rgxvznI6M3KdHc= -github.com/howeyc/gopass v0.0.0-20190910152052-7cb4b85ec19c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= +github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/in-toto/in-toto-golang v0.3.4-0.20220709202702-fa494aaa0add h1:DAh7mHiRT7wc6kKepYdCpH16ElPciMPQWJaJ7H3l/ng= -github.com/in-toto/in-toto-golang v0.3.4-0.20220709202702-fa494aaa0add/go.mod h1:DQI8vlV6h6qSY/tCOoYKtxjWrkyiNpJ3WTV/WoBllmQ= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= +github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jedisct1/go-minisign v0.0.0-20211028175153-1c139d1cc84b h1:ZGiXF8sz7PDk6RgkP+A/SFfUD0ZR/AgG6SpRNEDKZy8= github.com/jedisct1/go-minisign v0.0.0-20211028175153-1c139d1cc84b/go.mod h1:hQmNrgofl+IY/8L+n20H6E6PWBBTokdsv+q49j0QhsU= -github.com/jellydator/ttlcache/v2 v2.11.1 h1:AZGME43Eh2Vv3giG6GeqeLeFXxwxn1/qHItqWZl6U64= +github.com/jellydator/ttlcache/v3 v3.0.1 h1:cHgCSMS7TdQcoprXnWUptJZzyFsqs18Lt8VVhRuZYVU= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/jhump/protoreflect v1.10.3/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg= -github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jhump/protoreflect v1.14.0 h1:MBbQK392K3u8NTLbKOCIi3XdI+y+c6yt5oMq0X3xviw= -github.com/jhump/protoreflect v1.14.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548 h1:dYTbLf4m0a5u0KLmPfB6mgxbcV7588bOCx79hxa5Sr4= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -914,7 +657,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= @@ -922,14 +664,11 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= -github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -938,10 +677,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -950,27 +687,28 @@ github.com/ktr0731/go-ansisgr v0.1.0/go.mod h1:G9lxwgBwH0iey0Dw5YQd7n6PmQTwTuTM/ github.com/ktr0731/go-fuzzyfinder v0.7.0 h1:EqkCoqQh9Xpqet0PMAGSwgEnqLPXOSiRwIUMzhWQw2I= github.com/ktr0731/go-fuzzyfinder v0.7.0/go.mod h1:/5RXp7U9PRhvIrM86u/9TK0FjPbZQVT/NaplQO7CZmU= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lestrrat-go/blackmagic v1.0.1 h1:lS5Zts+5HIC/8og6cGHb0uCcNCa3OUt1ygh3Qz2Fe80= +github.com/lestrrat-go/blackmagic v1.0.1/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/httprc v1.0.4 h1:bAZymwoZQb+Oq8MEbyipag7iSq6YIga8Wj6GOiJGdI8= +github.com/lestrrat-go/httprc v1.0.4/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx/v2 v2.0.11 h1:ViHMnaMeaO0qV16RZWBHM7GTrAnX2aFLVKofc7FuKLQ= +github.com/lestrrat-go/jwx/v2 v2.0.11/go.mod h1:ZtPtMFlrfDrH2Y0iwfa3dRFn8VzwBrB+cyrm3IBWdDg= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf h1:ndns1qx/5dL43g16EQkPV/i8+b3l5bYQwLeoSBe7tS8= github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf/go.mod h1:aGkAgvWY/IUcVFfuly53REpfv5edu25oij+qHRFaraA= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -980,61 +718,36 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 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-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3-0.20190429190417-a667d056470f/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +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.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1042,7 +755,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= @@ -1056,274 +768,176 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy/FJl/rCYT0+EuS8+Z0z4= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nightlyone/lockfile v1.0.0/go.mod h1:rywoIealpdNse2r832aiD9jRk8ErCatROs6LzC841CI= -github.com/nishanths/predeclared v0.0.0-20200524104333-86fad755b4d3/go.mod h1:nt3d53pc1VYcphSCIaYAJtnPYnr3Zyn8fMq2wvPGPso= +github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 h1:Up6+btDp321ZG5/zdSLo48H9Iaq0UQGthrhWC6pCxzE= +github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481/go.mod h1:yKZQO8QE2bHlgozqWDiRVqTFlLQSj30K/6SAK8EeYFw= github.com/nsf/termbox-go v1.1.1 h1:nksUPLCb73Q++DwbYUBEglYBRPZyoXJdrj5L+TkjyZY= github.com/nsf/termbox-go v1.1.1/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= +github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/open-policy-agent/opa v0.45.0 h1:P5nuhVRtR+e58fk3CMMbiqr6ZFyWQPNOC3otsorGsFs= -github.com/open-policy-agent/opa v0.45.0/go.mod h1:/OnsYljNEWJ6DXeFOOnoGn8CvwZGMUS4iRqzYdJvmBI= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/open-policy-agent/opa v0.55.0 h1:s7Vm4ph6zDqqP/KzvUSw9fsKVsm9lhbTZhYGxxTK7mo= +github.com/open-policy-agent/opa v0.55.0/go.mod h1:2Vh8fj/bXCqSwGMbBiHGrw+O8yrho6T/fdaHt5ROmaQ= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.3.0 h1:XtuXmOLIXLjiU2XduuWREDT0LOKtSgos/g7i7RYyoZQ= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/outcaste-io/ristretto v0.2.1 h1:KCItuNIGJZcursqHr3ghO7fc5ddZLEHspL9UR0cQM64= +github.com/outcaste-io/ristretto v0.2.1/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/prometheus v2.5.0+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc h1:gSVONBi2HWMFXCa9jFdYvYk7IwW/mTLxWOF7rXS4LO0= -github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc/go.mod h1:KbKfKPy2I6ecOIGA9apfheFv14+P3RSmmQvshofQyMY= -github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/qur/ar v0.0.0-20130629153254-282534b91770/go.mod h1:SjlYv2m9lpV0UW6K7lDqVJwEIIvSjaHbGk7nIfY8Hxw= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/protocolbuffers/txtpbfmt v0.0.0-20230328191034-3462fbc510c0 h1:sadMIsgmHpEOGbUs6VtHBXRR1OHevnj7hLx9ZcdNGW4= +github.com/protocolbuffers/txtpbfmt v0.0.0-20230328191034-3462fbc510c0/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= +github.com/puzpuzpuz/xsync/v2 v2.4.1 h1:aGdE1C/HaR/QC6YAFdtZXi60Df8/qBIrs8PKrzkItcM= +github.com/puzpuzpuz/xsync/v2 v2.4.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/richardartoul/molecule v1.0.1-0.20221107223329-32cfee06a052 h1:Qp27Idfgi6ACvFQat5+VJvlYToylpM/hcyLBI3WaKPA= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= -github.com/sassoftware/go-rpmutils v0.1.1/go.mod h1:euhXULoBpvAxqrBHEyJS4Tsu3hHxUmQWNymxoJbzgUY= -github.com/sassoftware/relic v0.0.0-20210427151427-dfb082b79b74 h1:sUNzanSKA9z/h8xXl+ZJoxIYZL0Qx306MmxqRrvUgr0= -github.com/sassoftware/relic v0.0.0-20210427151427-dfb082b79b74/go.mod h1:YlB8wFIZmFLZ1JllNBfSURzz52fBxbliNgYALk1UDmk= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= -github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A= +github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk= +github.com/sassoftware/relic/v7 v7.5.5 h1:2ZUM6ovo3STCAp0hZnO9nQY9lOB8OyfneeYIi4YUxMU= +github.com/secure-systems-lab/go-securesystemslib v0.3.1/go.mod h1:o8hhjkbNl2gOamKUA/eNW3xUrntHT9L4W89W1nfj43U= +github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= +github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sigstore/cosign v1.13.1 h1:+5oF8jisEcDw2TuXxCADC1u5//HfdnJhGbpv9Isiwu4= -github.com/sigstore/cosign v1.13.1/go.mod h1:PlfJODkovUOKsLrGI7Su57Ie/Eb/Ks7hRHw3tn5hQS4= -github.com/sigstore/fulcio v0.6.0 h1:YNfnGm9EjYPlzHiPDcIVhslYj846jkPtHQH+FTKNncw= -github.com/sigstore/fulcio v0.6.0/go.mod h1:lwxzHDYYQ0lVVWqaj68ZQNkcP847aoF7AIa7ra9rRqA= -github.com/sigstore/rekor v0.12.1-0.20220915152154-4bb6f441c1b2 h1:LD8LcwygdD2DxaINWwbkaUEBAknr205wmn66/N05s7c= -github.com/sigstore/rekor v0.12.1-0.20220915152154-4bb6f441c1b2/go.mod h1:C/jZ3EZywl/Kew48fGMWQoh+1LxOMk0BkP3DHmtB+8M= -github.com/sigstore/sigstore v1.5.2 h1:rvZSPJDH2ysoc8kjW9v4nv1UX3XwSA8y4x6Dk7hA0D4= -github.com/sigstore/sigstore v1.5.2/go.mod h1:wxhp9KoaOpeb1VLKILruD283KJqPSqX+3TuBByVDZ6E= +github.com/sigstore/cosign/v2 v2.2.0 h1:MV/ALD1/e/JgxXXCdCNxlIRk2NB3Irb4MKPozd8SPR8= +github.com/sigstore/cosign/v2 v2.2.0/go.mod h1:Kcm7lTZbpiEpA3wPCqRygTUdLpX8CNT+36rODTCBr1M= +github.com/sigstore/fulcio v1.4.0 h1:05+k8BFvwTQzfCkVxESWzCN4b70KIRliGYz0Upmdrs8= +github.com/sigstore/fulcio v1.4.0/go.mod h1:wcjlktbhoy6+ZTxO3yXpvqUxsLV+JEH4FF3a5Jz4VPI= +github.com/sigstore/rekor v1.2.2 h1:5JK/zKZvcQpL/jBmHvmFj3YbpDMBQnJQ6ygp8xdF3bY= +github.com/sigstore/rekor v1.2.2/go.mod h1:FGnWBGWzeNceJnp0x9eDFd41mI8aQqCjj+Zp0IEs0Qg= +github.com/sigstore/sigstore v1.7.2 h1:MY0wSOhKWa8SIWSCO9SzFnUl+b7jbthgXHJpuUg31Qs= +github.com/sigstore/sigstore v1.7.2/go.mod h1:2IPD5YXrXoznfnIoVsDF7ARC1Nha8xIdLpsC4kEQh5w= +github.com/sigstore/sigstore/pkg/signature/kms/aws v1.7.2 h1:JtdEI/81xugNfHqHyK1icPtnjgrLHJmWm3fgUBhyFPw= +github.com/sigstore/sigstore/pkg/signature/kms/azure v1.7.2 h1:WtTn0OYxbSPY/xEy13iSPjJnSHXhILmzbfleg9x8CuQ= +github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.7.2 h1:/c9AZS8mfOlpjCuBA1aBesuDxPMEN2QtmZS/CQ6Cz8I= +github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.7.2 h1:GquAXZRIVJ8e10NpTzW4wNkpRGaDdJdPWz2Xlsdc2OM= +github.com/sigstore/timestamp-authority v1.1.2 h1:xgBs9Ct27sEgFb35GL1trKD2XOgYbtk0q2G0HLZHDDY= +github.com/sigstore/timestamp-authority v1.1.2/go.mod h1:7rGe/e6ZJNMqPiwFiv7w+qNXT8GID9gL7nMcRwZ007I= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262 h1:unQFBIznI+VYD1/1fApl1A+9VcBk+9dcqGfnePY87LY= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5-0.20210205191134-5ec6847320e5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/spiffe/go-spiffe/v2 v2.1.2 h1:nfNwopOP7q0qsWU6AUASqmbtYViwHA6vuHyAtqFJtNc= -github.com/spiffe/go-spiffe/v2 v2.1.2/go.mod h1:cbQmFrxsOpbm5tWURAYip9ZK0dOSFeoFG3/5Ub9Hvy0= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spiffe/go-spiffe/v2 v2.1.6 h1:4SdizuQieFyL9eNU+SPiCArH4kynzaKOOj0VvM8R7Xo= +github.com/spiffe/go-spiffe/v2 v2.1.6/go.mod h1:eVDqm9xFvyqao6C+eQensb9ZPkyNEeaUbqbBpOhBnNk= github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1334,11 +948,13 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= @@ -1349,49 +965,30 @@ github.com/tektoncd/pipeline v0.44.0 h1:gTiLCjTDDog3R9sRtQugiIZYqadmq5K6HArrtM1s github.com/tektoncd/pipeline v0.44.0/go.mod h1:z8D9m9nnG2JQGHTpRw/sie9tK37odai/iONmYaY7llA= github.com/tektoncd/triggers v0.23.0 h1:f0cPgZrwCTegaxr6cCAJxjL1ZI84C9JadsrWKvj2RGU= github.com/tektoncd/triggers v0.23.0/go.mod h1:WuV36ciqc7GQD5Qqa+C4kYad0sn8kdBDQkN7YSa3qD8= -github.com/tent/canonical-json-go v0.0.0-20130607151641-96e4ba3a7613 h1:iGnD/q9160NWqKZZ5vY4p0dMiYMRknzctfSkqA4nBDw= -github.com/tent/canonical-json-go v0.0.0-20130607151641-96e4ba3a7613/go.mod h1:g6AnIpDSYMcphz193otpSIzN+11Rs+AAIIC6rm1enug= github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= -github.com/theupdateframework/go-tuf v0.5.2 h1:habfDzTmpbzBLIFGWa2ZpVhYvFBoK0C1onC3a4zuPRA= -github.com/theupdateframework/go-tuf v0.5.2/go.mod h1:SyMV5kg5n4uEclsyxXJZI2UxPFJNDc4Y+r7wv+MlvTA= +github.com/theupdateframework/go-tuf v0.6.1 h1:6J89fGjQf7s0mLmTG7p7pO/MbKOg+bIXhaLyQdmbKuE= +github.com/theupdateframework/go-tuf v0.6.1/go.mod h1:LAFusuQsFNBnEyYoTuA5zZrF7iaQ4TEgBXm8lb6Vj18= github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e h1:BuzhfgfWQbX0dWzYzT1zsORLnHRv3bcRcsaUk0VmXA8= github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e/go.mod h1:/Tnicc6m/lsJE0irFMA0LfIwTBo4QP7A8IfyIv4zZKI= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= -github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= -github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= -github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= -github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/transparency-dev/merkle v0.0.1 h1:T9/9gYB8uZl7VOJIhdwjALeRWlxUxSfDEysjfmx+L9E= -github.com/transparency-dev/merkle v0.0.1/go.mod h1:B8FIw5LTq6DaULoHsVFRzYIUDkl8yuSwCdZnOZGKL/A= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.7 h1:aXiFAgRugfJ27UFDsGJ9DB2FvTC73hlVXFSqq5bo9eU= -github.com/urfave/cli v1.22.7/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4= +github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= +github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/go-gitlab v0.73.1 h1:UMagqUZLJdjss1SovIC+kJCH4k2AZWXl58gJd38Y/hI= -github.com/xanzy/go-gitlab v0.73.1/go.mod h1:d/a0vswScO7Agg1CZNz15Ic6SSvBG9vfw8egL99t4kA= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/go-gitlab v0.90.0 h1:j8ZUHfLfXdnC+B8njeNaW/kM44c1zw8fiuNj7D+qQN8= +github.com/xanzy/go-gitlab v0.90.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC15qOjWAw= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= @@ -1403,16 +1000,14 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2 github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= -github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +github.com/yashtewari/glob-intersection v0.2.0 h1:8iuHdN88yYuCzCdjt0gDe+6bAhUwBeEWqThExu54RFg= +github.com/yashtewari/glob-intersection v0.2.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ= github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ= +github.com/ysmood/got v0.34.1 h1:IrV2uWLs45VXNvZqhJ6g2nIhY+pgIG1CUoOcqfXFl1s= github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE= github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1421,71 +1016,15 @@ github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zalando/go-keyring v0.1.0/go.mod h1:RaxNwUITJaHVdQ0VC7pELPZ3tOWn13nr0gZMZEhpVU0= +github.com/zalando/go-keyring v0.2.2 h1:f0xmpYiSrHtSNAVgwip93Cg8tuF45HJM6rHq/A5RI/4= github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/api/v3 v3.6.0-alpha.0 h1:se+XckWlVTTfwjZSsAZJ2zGPzmIMq3j7fKBCmHoB9UA= -go.etcd.io/etcd/api/v3 v3.6.0-alpha.0/go.mod h1:z13pg39zewDLZeXIKeM0xELOeFKcqjLocfwl5M820+w= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0 h1:2UyRzFWbZZzgu/xzxoRukgixvafiJtGyxO+3IKUyJ6c= -go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0/go.mod h1:Vl/FkH40bHqmBFwhr8WVKtV47neyts36zl1voccRq8s= -go.etcd.io/etcd/client/v2 v2.305.0-alpha.0/go.mod h1:kdV+xzCJ3luEBSIeQyB/OEKkWKd8Zkux4sbDeANrosU= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v2 v2.306.0-alpha.0 h1:9VRJ698EFIMfjOQtcjKMM7CWXOIxp9R4I8JA1mk+WT4= -go.etcd.io/etcd/client/v2 v2.306.0-alpha.0/go.mod h1:eW78BCfOzS1HJgTNzDrb2E6xV1p6kqlpLpKkz7ErzCs= -go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.etcd.io/etcd/client/v3 v3.6.0-alpha.0 h1:hHaJ8CvTPJ9iv7xPz3G0gxt3csEqJW8evgty/kYICwo= -go.etcd.io/etcd/client/v3 v3.6.0-alpha.0/go.mod h1:a9JuChoQBDnw7WclHYBYCtTOIC12Wwj+Fw0LX4TI/Gs= -go.etcd.io/etcd/etcdctl/v3 v3.5.0-alpha.0/go.mod h1:YPwSaBciV5G6Gpt435AasAG3ROetZsKNUzibRa/++oo= -go.etcd.io/etcd/etcdctl/v3 v3.5.4/go.mod h1:SMZep1Aj7sUmMSBCHTjkZL/Yw36Vx5Ux61fKbopbb5U= -go.etcd.io/etcd/etcdctl/v3 v3.6.0-alpha.0 h1:3J+c4Av+pF7dBMAnxZVMrfCCMTaBz4CGJ8En3sZMNME= -go.etcd.io/etcd/etcdctl/v3 v3.6.0-alpha.0/go.mod h1:0ugckElRKx3OrV15/WAylLv2Ji67QxXKTh9lytkOh8s= -go.etcd.io/etcd/etcdutl/v3 v3.5.4/go.mod h1:eK9eZfI/BxDQCztpuaJ1E/ufYpMw2Y16dPX1azGWrBU= -go.etcd.io/etcd/etcdutl/v3 v3.6.0-alpha.0 h1:DZwDkrq/z5nHxXtovJMk9fyR6Nc+pwCJt25ptlFta24= -go.etcd.io/etcd/etcdutl/v3 v3.6.0-alpha.0/go.mod h1:0ILo94EKC+jgp/IMfxePlfJD1OVtMVfgTQ/xM8+joOA= -go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY= -go.etcd.io/etcd/pkg/v3 v3.5.4/go.mod h1:OI+TtO+Aa3nhQSppMbwE4ld3uF1/fqqwbpfndbbrEe0= -go.etcd.io/etcd/pkg/v3 v3.6.0-alpha.0 h1:cV/VsaYde/tcc2G9aHN5DQwx6CtUsWSEW4UqYzXuyyk= -go.etcd.io/etcd/pkg/v3 v3.6.0-alpha.0/go.mod h1:tXqWms0MpOJAS6L0B9nhFqZr0C/WEYzj/OtN90G8xzo= -go.etcd.io/etcd/raft/v3 v3.5.0-alpha.0/go.mod h1:FAwse6Zlm5v4tEWZaTjmNhe17Int4Oxbu7+2r0DiD3w= -go.etcd.io/etcd/raft/v3 v3.5.4/go.mod h1:SCuunjYvZFC0fBX0vxMSPjuZmpcSk+XaAcMrD6Do03w= -go.etcd.io/etcd/raft/v3 v3.6.0-alpha.0 h1:BQ6CnNP4pIpy5rusFlTBxAacDgPXhuiHFwoTsBNsVpI= -go.etcd.io/etcd/raft/v3 v3.6.0-alpha.0/go.mod h1:/kZdrBXlc5fUgYXfIEQ0B5sb7ejXPKbtF4jWzF1exiQ= -go.etcd.io/etcd/server/v3 v3.5.0-alpha.0/go.mod h1:tsKetYpt980ZTpzl/gb+UOJj9RkIyCb1u4wjzMg90BQ= -go.etcd.io/etcd/server/v3 v3.5.4/go.mod h1:S5/YTU15KxymM5l3T6b09sNOHPXqGYIZStpuuGbb65c= -go.etcd.io/etcd/server/v3 v3.6.0-alpha.0 h1:BQUVqBqNFZZyrRbfydrRLzq9hYvCcRj97SsX1YwD7CA= -go.etcd.io/etcd/server/v3 v3.6.0-alpha.0/go.mod h1:3QM2rLq3B3hSXmVEvgVt3vEEbG/AumSs0Is7EgrlKzU= -go.etcd.io/etcd/tests/v3 v3.5.0-alpha.0/go.mod h1:HnrHxjyCuZ8YDt8PYVyQQ5d1ZQfzJVEtQWllr5Vp/30= -go.etcd.io/etcd/tests/v3 v3.5.4/go.mod h1:ymig8LjkI1zqAxxMsl+nntzG21dND2hh0UQXl9BaJP8= -go.etcd.io/etcd/tests/v3 v3.6.0-alpha.0 h1:3qrZ3p/E7CxdV1kKtAU75hHOcUoXcSTwC7ELKWyzMJo= -go.etcd.io/etcd/tests/v3 v3.6.0-alpha.0/go.mod h1:hFQkP/cTsZIXXvUv+BsGHZ3TK+76XZMi5GToYA94iac= -go.etcd.io/etcd/v3 v3.5.0-alpha.0/go.mod h1:JZ79d3LV6NUfPjUxXrpiFAYcjhT+06qqw+i28snx8To= -go.etcd.io/etcd/v3 v3.5.4/go.mod h1:c6jK4IfuWwJU26FD9SeI4cAtvlfu9Iacaxu0vRses1k= -go.etcd.io/etcd/v3 v3.6.0-alpha.0 h1:c4c3xHs9tG097KtpLfBQJSD6c70xgEZbwkoj3gF6As4= -go.etcd.io/etcd/v3 v3.6.0-alpha.0/go.mod h1:9ERPHHuSr8Ho66trD/4f3+vSeqI/hk4loUSFUwj6Zcg= go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= -go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE= -go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= -go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.mongodb.org/mongo-driver v1.11.3 h1:Ql6K6qYHEzB6xvu4+AU0BoRoqf9vFPcc4o7MUIdPW8Y= +go.mongodb.org/mongo-driver v1.11.3/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1495,100 +1034,64 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib v1.6.0/go.mod h1:FlyPNX9s4U6MCsWEc5YAK4KzKNHFDsjrDUZijJiXvy8= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0 h1:MUes2rbdXa1ce9mwKYzTyBG0CtqpLT0NgKTFAz8FIDs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.39.0/go.mod h1:tETUy0CG/bwb1vHaXyNZJJP9395sjxlQQ5e69KtvZMc= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= -go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0 h1:pa05sNT/P8OsIQ8mPZKTIyiBuzS/xDGLVx+DCt0y6Vs= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.13.0/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0 h1:Any/nVxaoMq1T2w0W85d6w5COlLuCCgOYKQhJJWEMwQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0/go.mod h1:46vAP6RWfNn7EKov73l5KBFlNxz8kYlxR1woU+bJ4ZY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 h1:Wz7UQn7/eIqZVDJbuNEM6PmqeA71cWXrWcXekP5HZgU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0/go.mod h1:OhH1xvgA5jZW2M/S4PcvtDlFE1VULRRBsibBrKuJQGI= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v0.36.0 h1:t0lgGI+L68QWt3QtOIlqM9gXoxqxWLhZ3R/e5oOAY0Q= -go.opentelemetry.io/otel/metric v0.36.0/go.mod h1:wKVw57sd2HdSZAzyfOM9gTqqE8v7CbqWsYL6AyrH9qk= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5JaM= -go.opentelemetry.io/otel/sdk v1.13.0/go.mod h1:YLKPx5+6Vx/o1TCUYYs+bpymtkmazOMT6zoRrC7AQ7I= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= -go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.20.0 h1:BLOA1cZBAGSbRiNuGCCKiFrCdYB7deeHDeD1SueyOfA= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.step.sm/crypto v0.35.0 h1:0N6ks5n1sdv4+biJMUTdqHjpTBKKN9zNqqBdOJIyHe4= +go.step.sm/crypto v0.35.0/go.mod h1:sBsrpVReoxmiLexbWL+vQRxZd6Gq4YBj/IRSUH+DZe4= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= +go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE= +go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= +go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1599,9 +1102,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20221031165847-c99f073a8326 h1:QfTh0HpN6hlw6D3vu8DAwC8pBIwikq0AI1evdm+FksE= -golang.org/x/exp v0.0.0-20221031165847-c99f073a8326/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1615,7 +1117,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1627,37 +1128,27 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1665,7 +1156,6 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -1673,44 +1163,33 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220421235706-1d1ef9303861/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1718,23 +1197,9 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1744,24 +1209,18 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200930132711-30421366ff76/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1772,19 +1231,15 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1795,86 +1250,68 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1884,23 +1321,20 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1910,7 +1344,6 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1918,24 +1351,16 @@ golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191118222007-07fc4c7f2b98/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1947,20 +1372,16 @@ golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201014170642-d1624618ad65/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1970,30 +1391,24 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= @@ -2010,52 +1425,21 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.64.0/go.mod h1:931CdxA8Rm4t6zqTFGSsgwbAEZ2+GMYurbndwSimebM= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.138.0 h1:K/tVp05MxNVbHShRw9m7e9VJGdagNeTdMzqPH7AUqr0= +google.golang.org/api v0.138.0/go.mod h1:4xyob8CxC+0GChNBvEUAk8VBKNvYOTWM9T3v3UfRxuY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190620144150-6af8c5fc6601/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -2072,7 +1456,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -2089,71 +1472,17 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210325141258-5636347f2b14/go.mod h1:f2Bd7+2PlaVKmvKQ52aspJZXIDaRQBVdOOBfJ5i8OEs= -google.golang.org/genproto v0.0.0-20210331142528-b7513248f0ba/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210406143921-e86de6bf7a46/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210427215850-f767ed18ee4d/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211223182754-3ac035c7e7cb/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220422154200-b37d22cd5731/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220426171045-31bebdecfb46/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514 h1:rtNKfB++wz5mtDY2t5C8TXlU5y52ojSu7tZo0z7u8eQ= -google.golang.org/genproto v0.0.0-20230227214838-9b19f0bdc514/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44= +google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 h1:wukfNtZmZUurLN/atp2hiIeTKn7QJWIQdHzqmsOnAOk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -2163,29 +1492,15 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= +google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2196,14 +1511,13 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/DataDog/dd-trace-go.v1 v1.53.0 h1:Rc2Z3tspHI+PsspsfO4wZsSqL8l658yAUo7lFUSnPD0= +gopkg.in/DataDog/dd-trace-go.v1 v1.53.0/go.mod h1:m0tVxCbhcuHsiHhhaw749KeQcVjRZOWBPMa6wHL6LBQ= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/statsd.v2 v2.0.0 h1:FXkZSCZIH17vLCO5sO2UucTHsH9pc+17F6pl3JVCwMc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2212,34 +1526,19 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY= gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/linkedin/goavro.v1 v1.0.5/go.mod h1:Aw5GdAbizjOEl0kAMHV9iHmA8reZzW/OKuJAl4Hb9F0= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2253,13 +1552,11 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2267,43 +1564,42 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= -k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= -k8s.io/apiextensions-apiserver v0.25.3 h1:bfI4KS31w2f9WM1KLGwnwuVlW3RSRPuIsfNF/3HzR0k= -k8s.io/apiextensions-apiserver v0.25.3/go.mod h1:ZJqwpCkxIx9itilmZek7JgfUAM0dnTsA48I4krPqRmo= -k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= -k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= +inet.af/netaddr v0.0.0-20220811202034-502d2d690317/go.mod h1:OIezDfdzOgFhuw4HuWapWq2e9l0H9tK4F1j+ETRtF3k= +k8s.io/api v0.27.3 h1:yR6oQXXnUEBWEWcvPWS0jQL575KoAboQPfJAuKNrw5Y= +k8s.io/api v0.27.3/go.mod h1:C4BNvZnQOF7JA/0Xed2S+aUyJSfTGkGFxLXz9MnpIpg= +k8s.io/apiextensions-apiserver v0.26.5 h1:VJ946z9RjyCPn3qiz4Kus/UYjCRrdn1xUvEsJFvN5Yo= +k8s.io/apiextensions-apiserver v0.26.5/go.mod h1:Olsde7ZNWnyz9rsL13iXYXmL1h7kWujtKeC3yWVCDPo= +k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM= +k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= k8s.io/cli-runtime v0.26.3 h1:3ULe0oI28xmgeLMVXIstB+ZL5CTGvWSMVMLeHxitIuc= k8s.io/cli-runtime v0.26.3/go.mod h1:5YEhXLV4kLt/OSy9yQwtSSNZU2Z7aTEYta1A+Jg4VC4= -k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= -k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= -k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= -k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20221107191617-1a15be271d1d h1:0Smp/HP1OH4Rvhe+4B8nWGERtlqAGSftbSbbmm45oFs= -k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/client-go v0.27.3 h1:7dnEGHZEJld3lYwxvLl7WoehK6lAq7GvgjxpA3nv1E8= +k8s.io/client-go v0.27.3/go.mod h1:2MBEKuTo6V1lbKy3z1euEGnhPfGZLKTS9tiJ2xodM48= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +k8s.io/utils v0.0.0-20230505201702-9f6742963106 h1:EObNQ3TW2D+WptiYXlApGNLVy0zm/JIBVY9i+M4wpAU= +k8s.io/utils v0.0.0-20230505201702-9f6742963106/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= knative.dev/eventing v0.30.1-0.20220407170245-58865afba92c h1:5QvWwe3uB7BefHGMg6hC05YVi+zr1kGK7DVMFquqJMI= knative.dev/networking v0.0.0-20220404212543-dde40b019aff h1:pqzWi29qb44TY+5xtc9vty4mSyUYvojXZGCp0y/91eo= -knative.dev/pkg v0.0.0-20221123011842-b78020c16606 h1:bHozIhJtQE9/SVQkVX2vqnoJGJt6zo7J0jnkLFX3Crw= -knative.dev/pkg v0.0.0-20221123011842-b78020c16606/go.mod h1:DMTRDJ5WRxf/DrlOPzohzfhSuJggscLZ8EavOq9O/x8= +knative.dev/pkg v0.0.0-20230612155445-74c4be5e935e h1:koM+NopG2Yw738NlJhQF3ZwpyS+HHznuLm294VYlUKg= +knative.dev/pkg v0.0.0-20230612155445-74c4be5e935e/go.mod h1:dqC6IrvyBE7E+oZocs5PkVhq1G59pDTA7r8U17EAKMk= knative.dev/serving v0.30.1-0.20220402124840-21c05dc9d9a4 h1:iRFWsFKsA5ddhi+eKZVJdf8gPBomTfjIyRAKk9Uh7Ko= -pack.ag/amqp v0.11.2/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= -sigs.k8s.io/release-utils v0.7.3 h1:6pS8x6c5RmdUgR9qcg1LO6hjUzuE4Yo9TGZ3DemrZdM= -sigs.k8s.io/release-utils v0.7.3/go.mod h1:n0mVez/1PZYZaZUTJmxewxH3RJ/Lf7JUDh7TG1CASOE= +sigs.k8s.io/release-utils v0.7.4 h1:17LmJrydpUloTCtaoWj95uKlcrUp4h2A9Sa+ZL+lV9w= +sigs.k8s.io/release-utils v0.7.4/go.mod h1:JEt2QPHItd5Pg2UKLAU8PEaSlF4bUjCZimpxFDgymVU= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +software.sslmate.com/src/go-pkcs12 v0.2.0 h1:nlFkj7bTysH6VkC4fGphtjXRbezREPgrHuJG20hBGPE= diff --git a/vendor/bitbucket.org/creachadair/shell/LICENSE b/vendor/bitbucket.org/creachadair/shell/LICENSE deleted file mode 100644 index 10d72735..00000000 --- a/vendor/bitbucket.org/creachadair/shell/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2015, Michael J. Fromberger -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/bitbucket.org/creachadair/shell/README.md b/vendor/bitbucket.org/creachadair/shell/README.md deleted file mode 100644 index 73282bed..00000000 --- a/vendor/bitbucket.org/creachadair/shell/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# shell - -http://godoc.org/bitbucket.org/creachadair/shell - -The `shell` package implements basic shell command-line splitting. - - diff --git a/vendor/bitbucket.org/creachadair/shell/bitbucket-pipelines.yml b/vendor/bitbucket.org/creachadair/shell/bitbucket-pipelines.yml deleted file mode 100644 index 8acd906c..00000000 --- a/vendor/bitbucket.org/creachadair/shell/bitbucket-pipelines.yml +++ /dev/null @@ -1,23 +0,0 @@ -definitions: - steps: - - step: &Verify - script: - - PACKAGE_PATH="${GOPATH}/src/bitbucket.org/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}" - - mkdir -pv "${PACKAGE_PATH}" - - tar -cO --exclude-vcs --exclude=bitbucket-pipelines.yml . | tar -xv -C "${PACKAGE_PATH}" - - cd "${PACKAGE_PATH}" - - go version # log the version of Go we are using in this step - - export GO111MODULE=on # enable modules inside $GOPATH - - go get -v ./... - - go build -v ./... - - go test -v -race -cpu=1,4 ./... - - go vet -v ./... - -pipelines: - default: # run on each push - - step: - image: golang:1.16 - <<: *Verify - - step: - image: golang:1.17 - <<: *Verify diff --git a/vendor/bitbucket.org/creachadair/shell/shell.go b/vendor/bitbucket.org/creachadair/shell/shell.go deleted file mode 100644 index e4f8650f..00000000 --- a/vendor/bitbucket.org/creachadair/shell/shell.go +++ /dev/null @@ -1,325 +0,0 @@ -// Package shell supports splitting and joining of shell command strings. -// -// The Split function divides a string into whitespace-separated fields, -// respecting single and double quotation marks as defined by the Shell Command -// Language section of IEEE Std 1003.1 2013. The Quote function quotes -// characters that would otherwise be subject to shell evaluation, and the Join -// function concatenates quoted strings with spaces between them. -// -// The relationship between Split and Join is that given -// -// fields, ok := Split(Join(ss)) -// -// the following relationship will hold: -// -// fields == ss && ok -// -package shell - -import ( - "bufio" - "bytes" - "io" - "strings" -) - -// These characters must be quoted to escape special meaning. This list -// doesn't include the single quote. -const mustQuote = "|&;<>()$`\\\"\t\n" - -// These characters should be quoted to escape special meaning, since in some -// contexts they are special (e.g., "x=y" in command position, "*" for globs). -const shouldQuote = `*?[#~=%` - -// These are the separator characters in unquoted text. -const spaces = " \t\n" - -const allQuote = mustQuote + shouldQuote + spaces - -type state int - -const ( - stNone state = iota - stBreak - stBreakQ - stWord - stWordQ - stSingle - stDouble - stDoubleQ -) - -type class int - -const ( - clOther class = iota - clBreak - clNewline - clQuote - clSingle - clDouble -) - -type action int - -const ( - drop action = iota - push - xpush - emit -) - -// N.B. Benchmarking shows that array lookup is substantially faster than map -// lookup here, but it requires caution when changing the state machine. In -// particular: -// -// 1. The state and action values must be small integers. -// 2. The update table must completely cover the state values. -// 3. Each action slice must completely cover the action values. -// -var update = [...][]struct { - state - action -}{ - stNone: {}, - stBreak: { - clBreak: {stBreak, drop}, - clNewline: {stBreak, drop}, - clQuote: {stBreakQ, drop}, - clSingle: {stSingle, drop}, - clDouble: {stDouble, drop}, - clOther: {stWord, push}, - }, - stBreakQ: { - clBreak: {stWord, push}, - clNewline: {stBreak, drop}, - clQuote: {stWord, push}, - clSingle: {stWord, push}, - clDouble: {stWord, push}, - clOther: {stWord, push}, - }, - stWord: { - clBreak: {stBreak, emit}, - clNewline: {stBreak, emit}, - clQuote: {stWordQ, drop}, - clSingle: {stSingle, drop}, - clDouble: {stDouble, drop}, - clOther: {stWord, push}, - }, - stWordQ: { - clBreak: {stWord, push}, - clNewline: {stWord, drop}, - clQuote: {stWord, push}, - clSingle: {stWord, push}, - clDouble: {stWord, push}, - clOther: {stWord, push}, - }, - stSingle: { - clBreak: {stSingle, push}, - clNewline: {stSingle, push}, - clQuote: {stSingle, push}, - clSingle: {stWord, drop}, - clDouble: {stSingle, push}, - clOther: {stSingle, push}, - }, - stDouble: { - clBreak: {stDouble, push}, - clNewline: {stDouble, push}, - clQuote: {stDoubleQ, drop}, - clSingle: {stDouble, push}, - clDouble: {stWord, drop}, - clOther: {stDouble, push}, - }, - stDoubleQ: { - clBreak: {stDouble, xpush}, - clNewline: {stDouble, drop}, - clQuote: {stDouble, push}, - clSingle: {stDouble, xpush}, - clDouble: {stDouble, push}, - clOther: {stDouble, xpush}, - }, -} - -var classOf = [256]class{ - ' ': clBreak, - '\t': clBreak, - '\n': clNewline, - '\\': clQuote, - '\'': clSingle, - '"': clDouble, -} - -// A Scanner partitions input from a reader into tokens divided on space, tab, -// and newline characters. Single and double quotation marks are handled as -// described in http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02. -type Scanner struct { - buf *bufio.Reader - cur bytes.Buffer - st state - err error -} - -// NewScanner returns a Scanner that reads input from r. -func NewScanner(r io.Reader) *Scanner { - return &Scanner{ - buf: bufio.NewReader(r), - st: stBreak, - } -} - -// Next advances the scanner and reports whether there are any further tokens -// to be consumed. -func (s *Scanner) Next() bool { - if s.err != nil { - return false - } - s.cur.Reset() - for { - c, err := s.buf.ReadByte() - s.err = err - if err == io.EOF { - break - } else if err != nil { - return false - } - next := update[s.st][classOf[c]] - s.st = next.state - switch next.action { - case push: - s.cur.WriteByte(c) - case xpush: - s.cur.Write([]byte{'\\', c}) - case emit: - return true // s.cur has a complete token - case drop: - continue - default: - panic("unknown action") - } - } - return s.st != stBreak -} - -// Text returns the text of the current token, or "" if there is none. -func (s *Scanner) Text() string { return s.cur.String() } - -// Err returns the error, if any, that resulted from the most recent action. -func (s *Scanner) Err() error { return s.err } - -// Complete reports whether the current token is complete, meaning that it is -// unquoted or its quotes were balanced. -func (s *Scanner) Complete() bool { return s.st == stBreak || s.st == stWord } - -// Rest returns an io.Reader for the remainder of the unconsumed input in s. -// After calling this method, Next will always return false. The remainder -// does not include the text of the current token at the time Rest is called. -func (s *Scanner) Rest() io.Reader { - s.st = stNone - s.cur.Reset() - s.err = io.EOF - return s.buf -} - -// Each calls f for each token in the scanner until the input is exhausted, f -// returns false, or an error occurs. -func (s *Scanner) Each(f func(tok string) bool) error { - for s.Next() { - if !f(s.Text()) { - return nil - } - } - if err := s.Err(); err != io.EOF { - return err - } - return nil -} - -// Split returns the remaining tokens in s, not including the current token if -// there is one. Any tokens already consumed are still returned, even if there -// is an error. -func (s *Scanner) Split() []string { - var tokens []string - for s.Next() { - tokens = append(tokens, s.Text()) - } - return tokens -} - -// Split partitions s into tokens divided on space, tab, and newline characters -// using a *Scanner. Leading and trailing whitespace are ignored. -// -// The Boolean flag reports whether the final token is "valid", meaning there -// were no unclosed quotations in the string. -func Split(s string) ([]string, bool) { - sc := NewScanner(strings.NewReader(s)) - ss := sc.Split() - return ss, sc.Complete() -} - -func quotable(s string) (hasQ, hasOther bool) { - const ( - quote = 1 - other = 2 - all = quote + other - ) - var v uint - for i := 0; i < len(s) && v < all; i++ { - if s[i] == '\'' { - v |= quote - } else if strings.IndexByte(allQuote, s[i]) >= 0 { - v |= other - } - } - return v"e != 0, v&other != 0 -} - -// Quote returns a copy of s in which shell metacharacters are quoted to -// protect them from evaluation. -func Quote(s string) string { - var buf bytes.Buffer - return quote(s, &buf) -} - -// quote implements quotation, using the provided buffer as scratch space. The -// existing contents of the buffer are clobbered. -func quote(s string, buf *bytes.Buffer) string { - if s == "" { - return "''" - } - hasQ, hasOther := quotable(s) - if !hasQ && !hasOther { - return s // fast path: nothing needs quotation - } - - buf.Reset() - inq := false - for i := 0; i < len(s); i++ { - ch := s[i] - if ch == '\'' { - if inq { - buf.WriteByte('\'') - inq = false - } - buf.WriteByte('\\') - } else if !inq && hasOther { - buf.WriteByte('\'') - inq = true - } - buf.WriteByte(ch) - } - if inq { - buf.WriteByte('\'') - } - return buf.String() -} - -// Join quotes each element of ss with Quote and concatenates the resulting -// strings separated by spaces. -func Join(ss []string) string { - quoted := make([]string, len(ss)) - var buf bytes.Buffer - for i, s := range ss { - quoted[i] = quote(s, &buf) - } - return strings.Join(quoted, " ") -} diff --git a/vendor/cloud.google.com/go/compute/internal/version.go b/vendor/cloud.google.com/go/compute/internal/version.go index ddddbd21..63955370 100644 --- a/vendor/cloud.google.com/go/compute/internal/version.go +++ b/vendor/cloud.google.com/go/compute/internal/version.go @@ -15,4 +15,4 @@ package internal // Version is the current tagged release of the library. -const Version = "1.18.0" +const Version = "1.23.0" diff --git a/vendor/cuelang.org/go/cue/ast/ast.go b/vendor/cuelang.org/go/cue/ast/ast.go index 6018808a..0f1e2afa 100644 --- a/vendor/cuelang.org/go/cue/ast/ast.go +++ b/vendor/cuelang.org/go/cue/ast/ast.go @@ -132,10 +132,6 @@ type clause struct{} func (clause) clauseNode() {} -func (x *ForClause) clauseNode() {} -func (x *IfClause) clauseNode() {} -func (x *Alias) clauseNode() {} - // Comments type comments struct { @@ -312,12 +308,13 @@ func (a *Attribute) Split() (key, body string) { // A Field represents a field declaration in a struct. type Field struct { - Label Label // must have at least one element. - Optional token.Pos + Label Label // must have at least one element. + Optional token.Pos // Deprecated + Constraint token.Token // token.ILLEGAL, token.OPTION, or token.NOT // No TokenPos: Value must be an StructLit with one field. TokenPos token.Pos - Token token.Token // ':' or '::', ILLEGAL implies ':' + Token token.Token // Deprecated: always token.COLON Value Expr // the value associated with this field. @@ -346,6 +343,7 @@ type Alias struct { Expr Expr // An Ident or SelectorExpr comments + clause decl expr label @@ -396,7 +394,8 @@ type BottomLit struct { expr } -// An Ident node represents an left-hand side identifier. +// An Ident node represents an left-hand side identifier, +// including the underscore "_" identifier to represent top. type Ident struct { NamePos token.Pos // identifier position @@ -476,6 +475,18 @@ type Interpolation struct { label } +// A Func node represents a function type. +// +// This is an experimental type and the contents will change without notice. +type Func struct { + Func token.Pos // position of "func" + Args []Expr // list of elements; or nil + Ret Expr // return type, must not be nil + + comments + expr +} + // A StructLit node represents a literal struct. type StructLit struct { Lbrace token.Pos // position of "{" @@ -488,10 +499,9 @@ type StructLit struct { // NewStruct creates a struct from the given fields. // -// A field is either a *Field, an *Elipsis, *LetClause, a *CommentGroup, or a -// Label, optionally followed by a a token.OPTION to indicate the field is -// optional, optionally followed by a token.ISA to indicate the field is a -// definition followed by an expression for the field value. +// A field is either a *Field, an *Ellipsis, *LetClause, a *CommentGroup, or a +// Label, optionally followed by a token.OPTION or token.NOT to indicate the +// field is optional or required, followed by an expression for the field value. // // It will panic if a values not matching these patterns are given. Useful for // ASTs generated by code other than the CUE parser. @@ -502,10 +512,10 @@ func NewStruct(fields ...interface{}) *StructLit { } for i := 0; i < len(fields); i++ { var ( - label Label - optional = token.NoPos - tok = token.ILLEGAL - expr Expr + label Label + optional = token.NoPos + constraint = token.ILLEGAL + expr Expr ) switch x := fields[i].(type) { @@ -540,10 +550,11 @@ func NewStruct(fields ...interface{}) *StructLit { break inner case token.Token: switch x { - case token.ISA: - tok = x case token.OPTION: + constraint = x optional = token.Blank.Pos() + case token.NOT: + constraint = x case token.COLON, token.ILLEGAL: default: panic(fmt.Sprintf("invalid token %s", x)) @@ -556,10 +567,10 @@ func NewStruct(fields ...interface{}) *StructLit { panic("label not matched with expression") } s.Elts = append(s.Elts, &Field{ - Label: label, - Optional: optional, - Token: tok, - Value: expr, + Label: label, + Optional: optional, + Constraint: constraint, + Value: expr, }) } return s @@ -750,6 +761,8 @@ func (x *BasicLit) Pos() token.Pos { return x.ValuePos } func (x *BasicLit) pos() *token.Pos { return &x.ValuePos } func (x *Interpolation) Pos() token.Pos { return x.Elts[0].Pos() } func (x *Interpolation) pos() *token.Pos { return x.Elts[0].pos() } +func (x *Func) Pos() token.Pos { return x.Func } +func (x *Func) pos() *token.Pos { return &x.Func } func (x *StructLit) Pos() token.Pos { return getPos(x) } func (x *StructLit) pos() *token.Pos { if x.Lbrace == token.NoPos && len(x.Elts) > 0 { @@ -792,9 +805,10 @@ func (x *Ident) End() token.Pos { func (x *BasicLit) End() token.Pos { return x.ValuePos.Add(len(x.Value)) } func (x *Interpolation) End() token.Pos { return x.Elts[len(x.Elts)-1].Pos() } +func (x *Func) End() token.Pos { return x.Ret.End() } func (x *StructLit) End() token.Pos { if x.Rbrace == token.NoPos && len(x.Elts) > 0 { - return x.Elts[len(x.Elts)-1].Pos() + return x.Elts[len(x.Elts)-1].End() } return x.Rbrace.Add(1) } diff --git a/vendor/cuelang.org/go/cue/ast/astutil/apply.go b/vendor/cuelang.org/go/cue/ast/astutil/apply.go index 22d12c60..694ad05f 100644 --- a/vendor/cuelang.org/go/cue/ast/astutil/apply.go +++ b/vendor/cuelang.org/go/cue/ast/astutil/apply.go @@ -184,7 +184,6 @@ func (c *cursor) Delete() { panic("unsupported") } // // Children are traversed in the order in which they appear in the // respective node's struct definition. -// func Apply(node ast.Node, before, after func(Cursor) bool) ast.Node { apply(&applier{before: before, after: after}, nil, &node) return node @@ -303,7 +302,6 @@ func apply(v applyVisitor, parent Cursor, nodePtr interface{}) { // v.Visit(node) is not nil, apply is invoked recursively with visitor // w for each of the non-nil children of node, followed by a call of // w.Visit(nil). -// func applyCursor(v applyVisitor, c Cursor) { if v = v.Before(c); v == nil { return diff --git a/vendor/cuelang.org/go/cue/ast/astutil/resolve.go b/vendor/cuelang.org/go/cue/ast/astutil/resolve.go index 5043e16b..cdcdfce3 100644 --- a/vendor/cuelang.org/go/cue/ast/astutil/resolve.go +++ b/vendor/cuelang.org/go/cue/ast/astutil/resolve.go @@ -17,8 +17,8 @@ package astutil import ( - "bytes" "fmt" + "strings" "cuelang.org/go/cue/ast" "cuelang.org/go/cue/token" @@ -88,7 +88,6 @@ func ResolveExpr(e ast.Expr, errFn ErrFunc) { // A Scope maintains the set of named language entities declared // in the scope and a link to the immediately surrounding (outer) // scope. -// type scope struct { file *ast.File outer *scope @@ -204,9 +203,9 @@ func (s *scope) insert(name string, n, link ast.Node) { if _, ok := existing.node.(*ast.ImportSpec); ok { return // TODO: - s.errFn(n.Pos(), "conflicting declaration %s\n"+ - "\tprevious declaration at %s", - name, existing.node.Pos()) + // s.errFn(n.Pos(), "conflicting declaration %s\n"+ + // "\tprevious declaration at %s", + // name, existing.node.Pos()) } else { s.errFn(n.Pos(), "alias %q redeclared in same scope", name) } @@ -307,7 +306,7 @@ func (s *scope) Before(n ast.Node) (w visitor) { // references to bind to these illegally. // We need this kind of administration anyway to detect // illegal name clashes, and it allows giving better error - // messages. This puts the burdon on clients of this library + // messages. This puts the burden on clients of this library // to detect illegal usage, though. name, err := ast.ParseIdent(a.Ident) if err == nil { @@ -448,14 +447,14 @@ func scopeClauses(s *scope, clauses []ast.Clause) *scope { // Debugging support func (s *scope) String() string { - var buf bytes.Buffer - fmt.Fprintf(&buf, "scope %p {", s) + var b strings.Builder + fmt.Fprintf(&b, "scope %p {", s) if s != nil && len(s.index) > 0 { - fmt.Fprintln(&buf) + fmt.Fprintln(&b) for name := range s.index { - fmt.Fprintf(&buf, "\t%v\n", name) + fmt.Fprintf(&b, "\t%v\n", name) } } - fmt.Fprintf(&buf, "}\n") - return buf.String() + fmt.Fprintf(&b, "}\n") + return b.String() } diff --git a/vendor/cuelang.org/go/cue/ast/astutil/sanitize.go b/vendor/cuelang.org/go/cue/ast/astutil/sanitize.go index 061a46b6..8ae3248c 100644 --- a/vendor/cuelang.org/go/cue/ast/astutil/sanitize.go +++ b/vendor/cuelang.org/go/cue/ast/astutil/sanitize.go @@ -35,10 +35,9 @@ import ( // construction of an AST. // // Rewrites: -// - auto inserts imports associated with Idents -// - unshadows imports associated with idents -// - unshadows references for identifiers that were already resolved. -// +// - auto inserts imports associated with Idents +// - unshadows imports associated with idents +// - unshadows references for identifiers that were already resolved. func Sanitize(f *ast.File) error { z := &sanitizer{ file: f, @@ -324,7 +323,6 @@ func (z *sanitizer) handleIdent(s *scope, n *ast.Ident) bool { // It prefers short extensions over large ones, while ensuring the likelihood of // fast termination is high. There are at least two digits to make it visually // clearer this concerns a generated number. -// func (z *sanitizer) uniqueName(base string, hidden bool) string { if hidden && !strings.HasPrefix(base, "_") { base = "_" + base diff --git a/vendor/cuelang.org/go/cue/ast/astutil/util.go b/vendor/cuelang.org/go/cue/ast/astutil/util.go index f6f0ec0e..539d7e32 100644 --- a/vendor/cuelang.org/go/cue/ast/astutil/util.go +++ b/vendor/cuelang.org/go/cue/ast/astutil/util.go @@ -26,10 +26,10 @@ import ( // ImportPathName derives the package name from the given import path. // // Examples: -// string string -// foo.com/bar bar -// foo.com/bar:baz baz // +// string string +// foo.com/bar bar +// foo.com/bar:baz baz func ImportPathName(id string) string { name := path.Base(id) if p := strings.LastIndexByte(name, ':'); p > 0 { diff --git a/vendor/cuelang.org/go/cue/ast/astutil/walk.go b/vendor/cuelang.org/go/cue/ast/astutil/walk.go index 2de73d6e..d6bc9b24 100644 --- a/vendor/cuelang.org/go/cue/ast/astutil/walk.go +++ b/vendor/cuelang.org/go/cue/ast/astutil/walk.go @@ -49,7 +49,6 @@ func walkDeclList(v visitor, list []ast.Decl) { // v.Visit(node) is not nil, walk is invoked recursively with visitor // w for each of the non-nil children of node, followed by a call of // w.Visit(nil). -// func walk(v visitor, node ast.Node) { if v = v.Before(node); v == nil { return @@ -86,6 +85,10 @@ func walk(v visitor, node ast.Node) { walk(v, a) } + case *ast.Func: + walkExprList(v, n.Args) + walk(v, n.Ret) + case *ast.StructLit: for _, f := range n.Elts { walk(v, f) diff --git a/vendor/cuelang.org/go/cue/ast/ident.go b/vendor/cuelang.org/go/cue/ast/ident.go index 1f400b28..dfbfee05 100644 --- a/vendor/cuelang.org/go/cue/ast/ident.go +++ b/vendor/cuelang.org/go/cue/ast/ident.go @@ -34,30 +34,32 @@ func isDigit(ch rune) bool { } // IsValidIdent reports whether str is a valid identifier. +// Note that the underscore "_" string is considered valid, for top. func IsValidIdent(ident string) bool { if ident == "" { return false } - // TODO: use consumed again to allow #0. - // consumed := false + consumed := false if strings.HasPrefix(ident, "_") { ident = ident[1:] - // consumed = true + consumed = true if len(ident) == 0 { return true } } if strings.HasPrefix(ident, "#") { ident = ident[1:] - // consumed = true + // Note: _#0 is not allowed by the spec, although _0 is. + // TODO: set consumed to true here to allow #0. + consumed = false } - // if !consumed { - if r, _ := utf8.DecodeRuneInString(ident); isDigit(r) { - return false + if !consumed { + if r, _ := utf8.DecodeRuneInString(ident); isDigit(r) { + return false + } } - // } for _, r := range ident { if isLetter(r) || isDigit(r) || r == '_' || r == '$' { @@ -129,15 +131,14 @@ func parseIdent(pos token.Pos, ident string) (string, error) { // // Examples: // -// Label Result -// foo "foo" true nil -// true "true" true nil -// "foo" "foo" false nil -// "x-y" "x-y" false nil -// "foo "" false invalid string -// "\(x)" "" false errors.Is(err, ErrIsExpression) -// X=foo "foo" true nil -// +// Label Result +// foo "foo" true nil +// true "true" true nil +// "foo" "foo" false nil +// "x-y" "x-y" false nil +// "foo "" false invalid string +// "\(x)" "" false errors.Is(err, ErrIsExpression) +// X=foo "foo" true nil func LabelName(l Label) (name string, isIdent bool, err error) { if a, ok := l.(*Alias); ok { l, _ = a.Expr.(Label) diff --git a/vendor/cuelang.org/go/cue/ast/walk.go b/vendor/cuelang.org/go/cue/ast/walk.go index a23fce45..571d1939 100644 --- a/vendor/cuelang.org/go/cue/ast/walk.go +++ b/vendor/cuelang.org/go/cue/ast/walk.go @@ -24,7 +24,6 @@ import ( // node must not be nil. If before returns true, Walk invokes f recursively for // each of the non-nil children of node, followed by a call of after. Both // functions may be nil. If before is nil, it is assumed to always return true. -// func Walk(node Node, before func(Node) bool, after func(Node)) { walk(&inspector{before: before, after: after}, node) } @@ -56,7 +55,6 @@ func walkDeclList(v visitor, list []Decl) { // v.Visit(node) is not nil, walk is invoked recursively with visitor // w for each of the non-nil children of node, followed by a call of // w.Visit(nil). -// func walk(v visitor, node Node) { if v = v.Before(node); v == nil { return @@ -93,6 +91,10 @@ func walk(v visitor, node Node) { walk(v, a) } + case *Func: + walkExprList(v, n.Args) + walk(v, n.Ret) + case *StructLit: walkDeclList(v, n.Elts) @@ -238,10 +240,6 @@ func (f *inspector) Token(t token.Token) { f.current.pos++ } -func (f *inspector) setPos(i int8) { - f.current.pos = i -} - func (f *inspector) visitComments(pos int8) { c := &f.current for ; len(c.cg) > 0; c.cg = c.cg[1:] { diff --git a/vendor/cuelang.org/go/cue/attribute.go b/vendor/cuelang.org/go/cue/attribute.go index dd874d6b..c73e3d4f 100644 --- a/vendor/cuelang.org/go/cue/attribute.go +++ b/vendor/cuelang.org/go/cue/attribute.go @@ -18,7 +18,6 @@ import ( "fmt" "cuelang.org/go/cue/ast" - "cuelang.org/go/cue/token" "cuelang.org/go/internal" "cuelang.org/go/internal/core/export" ) @@ -45,7 +44,9 @@ func (v Value) Attribute(key string) Attribute { func newAttr(k internal.AttrKind, a *ast.Attribute) Attribute { key, body := a.Split() - x := internal.ParseAttrBody(token.NoPos, body) + // Note: the body is always positioned just after + // the opening ( after the key. + x := internal.ParseAttrBody(a.Pos().Add(len(key)+1), body) x.Name = key x.Kind = k return Attribute{x} @@ -109,7 +110,20 @@ const ( // TODO: Merge: merge namesake attributes. ) -// An Attribute contains meta data about a field. +// An Attribute contains metadata about a field. +// +// By convention, an attribute is split into positional arguments +// according to the rules below. However, these are not mandatory. +// To access the raw contents of an attribute, use [Attribute.Contents]. +// +// Arguments are of the form key[=value] where key and value each +// consist of an arbitrary number of CUE tokens with balanced brackets +// ((), [], and {}). These are the arguments retrieved by the +// [Attribute] methods. +// +// Leading and trailing white space will be stripped from both key and +// value. If there is no value and the key consists of exactly one +// quoted string, it will be unquoted. type Attribute struct { attr internal.Attr } @@ -140,9 +154,17 @@ func (a *Attribute) NumArgs() int { // Arg reports the contents of the ith comma-separated argument of a. // // If the argument contains an unescaped equals sign, it returns a key-value -// pair. Otherwise it returns the contents in value. +// pair. Otherwise it returns the contents in key. func (a *Attribute) Arg(i int) (key, value string) { + // TODO: Returning the contents in key for a non-key-value argument + // is counter to the original documentation for this method and + // counter-intuitive too, but it remains that way to avoid breaking + // backward compatibility. In the future it would be nice to + // change it to return ("", value) in this case. f := a.attr.Fields[i] + if f.Key() == "" { + return f.Value(), "" + } return f.Key(), f.Value() } diff --git a/vendor/cuelang.org/go/cue/build.go b/vendor/cuelang.org/go/cue/build.go index 82863ee0..8de92875 100644 --- a/vendor/cuelang.org/go/cue/build.go +++ b/vendor/cuelang.org/go/cue/build.go @@ -83,10 +83,11 @@ func (r *hiddenRuntime) CompileExpr(expr ast.Expr) (*Instance, error) { if err != nil { return nil, err } - v := (*Context)(r).BuildExpr(expr) + runtime := r.runtime() + v := (*Context)(runtime).BuildExpr(expr) err = v.Err() inst := &Instance{ - index: r.runtime(), + index: runtime, root: v.v, inst: &build.Instance{ Files: []*ast.File{f}, diff --git a/vendor/cuelang.org/go/cue/build/context.go b/vendor/cuelang.org/go/cue/build/context.go index 664326ee..dc1e347c 100644 --- a/vendor/cuelang.org/go/cue/build/context.go +++ b/vendor/cuelang.org/go/cue/build/context.go @@ -26,15 +26,11 @@ package build import ( - "context" - "cuelang.org/go/cue/ast" ) // A Context keeps track of state of building instances and caches work. type Context struct { - ctxt context.Context - loader LoadFunc parseFunc func(str string, src interface{}) (*ast.File, error) @@ -80,14 +76,13 @@ func (inst *Instance) Complete() error { func (c *Context) init() { if !c.initialized { c.initialized = true - c.ctxt = context.Background() c.imports = map[string]*Instance{} } } // Options: // - certain parse modes -// - parallellism +// - parallelism // - error handler (allows cancelling the context) // - file set. diff --git a/vendor/cuelang.org/go/cue/builtinutil.go b/vendor/cuelang.org/go/cue/builtinutil.go deleted file mode 100644 index 2bfd8adf..00000000 --- a/vendor/cuelang.org/go/cue/builtinutil.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2019 CUE Authors -// -// 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. - -package cue - -// TODO: this code could be generated, but currently isn't. - -type valueSorter struct { - a []Value - cmp Value - err error -} - -func (s *valueSorter) ret() ([]Value, error) { - if s.err != nil { - return nil, s.err - } - // The input slice is already a copy and that we can modify it safely. - return s.a, nil -} - -func (s *valueSorter) Len() int { return len(s.a) } -func (s *valueSorter) Swap(i, j int) { s.a[i], s.a[j] = s.a[j], s.a[i] } -func (s *valueSorter) Less(i, j int) bool { - v := s.cmp.Fill(s.a[i], "x") - v = v.Fill(s.a[j], "y") - - isLess, err := v.Lookup("less").Bool() - if err != nil && s.err == nil { - s.err = err - return true - } - return isLess -} diff --git a/vendor/cuelang.org/go/cue/context.go b/vendor/cuelang.org/go/cue/context.go index 3da628f5..32373551 100644 --- a/vendor/cuelang.org/go/cue/context.go +++ b/vendor/cuelang.org/go/cue/context.go @@ -36,13 +36,17 @@ import ( // // Use // -// ctx := cuecontext.New() +// ctx := cuecontext.New() // // to create a new Context. type Context runtime.Runtime func (c *Context) runtime() *runtime.Runtime { rt := (*runtime.Runtime)(c) + if !rt.IsInitialized() { + panic("cue: uninitialized Context: use cuecontext.New instead of zero value") + } + return rt } @@ -129,7 +133,7 @@ func (c *Context) BuildInstance(i *build.Instance, options ...BuildOption) Value func (c *Context) makeError(err errors.Error) Value { b := &adt.Bottom{Err: err} node := &adt.Vertex{BaseValue: b} - node.UpdateStatus(adt.Finalized) + node.ForceDone() node.AddConjunct(adt.MakeRootConjunct(nil, b)) return c.make(node) } @@ -245,7 +249,10 @@ func (c *Context) CompileBytes(b []byte, options ...BuildOption) Value { // } func (c *Context) make(v *adt.Vertex) Value { - return newValueRoot(c.runtime(), newContext(c.runtime()), v) + opCtx := newContext(c.runtime()) + x := newValueRoot(c.runtime(), opCtx, v) + adt.AddStats(opCtx) + return x } // An EncodeOption defines options for the various encoding-related methods of @@ -338,9 +345,9 @@ func NilIsAny(isAny bool) EncodeOption { // and used as CUE struct field names by applying the following rules, subject // to the UTF-8 coercion described for string values above: // -// - keys of any string type are used directly -// - encoding.TextMarshalers are marshaled -// - integer keys are converted to strings +// - keys of any string type are used directly +// - encoding.TextMarshalers are marshaled +// - integer keys are converted to strings // // Pointer values encode as the value pointed to. A nil pointer encodes as the // null CUE value. @@ -352,7 +359,6 @@ func NilIsAny(isAny bool) EncodeOption { // Channel, complex, and function values cannot be encoded in CUE. Attempting to // encode such a value results in the returned value being an error, accessible // through the Err method. -// func (c *Context) Encode(x interface{}, option ...EncodeOption) Value { switch v := x.(type) { case adt.Value: diff --git a/vendor/cuelang.org/go/cue/cue.go b/vendor/cuelang.org/go/cue/cue.go index 6f9622f6..0dbac258 100644 --- a/vendor/cuelang.org/go/cue/cue.go +++ b/vendor/cuelang.org/go/cue/cue.go @@ -21,23 +21,21 @@ // A Context defines the set of active packages, the translations of field // names to unique codes, as well as the set of builtins. Use // -// import "cuelang.org/go/cue/cuecontext" +// import "cuelang.org/go/cue/cuecontext" // -// ctx := cuecontext.New() +// ctx := cuecontext.New() // // to obtain a context. // -// // Note that the following types are DEPRECATED and their usage should be // avoided if possible: // -// FieldInfo -// Instance -// Runtime -// Struct +// FieldInfo +// Instance +// Runtime +// Struct // // Many types also have deprecated methods. Code that already uses deprecated // methods can keep using them for at least some time. We aim to provide a // go or cue fix solution to automatically rewrite code using the new API. -// package cue diff --git a/vendor/cuelang.org/go/cue/cuecontext/cuecontext.go b/vendor/cuelang.org/go/cue/cuecontext/cuecontext.go index 06080793..1d25463a 100644 --- a/vendor/cuelang.org/go/cue/cuecontext/cuecontext.go +++ b/vendor/cuelang.org/go/cue/cuecontext/cuecontext.go @@ -22,10 +22,27 @@ import ( ) // Option controls a build context. -type Option interface{ buildOption() } +type Option struct { + apply func(r *runtime.Runtime) +} // New creates a new Context. func New(options ...Option) *cue.Context { r := runtime.New() + for _, o := range options { + o.apply(r) + } return (*cue.Context)(r) } + +// An ExternInterpreter creates a compiler that can produce implementations of +// functions written in a language other than CUE. It is currently for internal +// use only. +type ExternInterpreter = runtime.Interpreter + +// Interpreter associates an interpreter for external code with this context. +func Interpreter(i ExternInterpreter) Option { + return Option{func(r *runtime.Runtime) { + r.SetInterpreter(i) + }} +} diff --git a/vendor/cuelang.org/go/cue/decode.go b/vendor/cuelang.org/go/cue/decode.go index f4adc5bd..ba50dab1 100644 --- a/vendor/cuelang.org/go/cue/decode.go +++ b/vendor/cuelang.org/go/cue/decode.go @@ -740,8 +740,9 @@ func (o tagOptions) Contains(optionName string) bool { // 4) simpleLetterEqualFold, no specials, no non-letters. // // The letters S and K are special because they map to 3 runes, not just 2: -// * S maps to s and to U+017F 'ſ' Latin small letter long s -// * k maps to K and to U+212A 'K' Kelvin sign +// - S maps to s and to U+017F 'ſ' Latin small letter long s +// - k maps to K and to U+212A 'K' Kelvin sign +// // See https://play.golang.org/p/tTxjOc0OGo // // The returned function is specialized for matching against s and @@ -818,10 +819,7 @@ func equalFoldRight(s, t []byte) bool { t = t[size:] } - if len(t) > 0 { - return false - } - return true + return len(t) == 0 } // asciiEqualFold is a specialization of bytes.EqualFold for use when diff --git a/vendor/cuelang.org/go/cue/errors/errors.go b/vendor/cuelang.org/go/cue/errors/errors.go index af5038c2..8fb87039 100644 --- a/vendor/cuelang.org/go/cue/errors/errors.go +++ b/vendor/cuelang.org/go/cue/errors/errors.go @@ -20,7 +20,6 @@ package errors // import "cuelang.org/go/cue/errors" import ( - "bytes" "errors" "fmt" "io" @@ -74,13 +73,23 @@ type Message struct { args []interface{} } -// NewMessage creates an error message for human consumption. The arguments +// NewMessagef creates an error message for human consumption. The arguments // are for later consumption, allowing the message to be localized at a later // time. The passed argument list should not be modified. -func NewMessage(format string, args []interface{}) Message { +func NewMessagef(format string, args ...interface{}) Message { + if false { + // Let go vet know that we're expecting printf-like arguments. + _ = fmt.Sprintf(format, args...) + } return Message{format: format, args: args} } +// NewMessage creates an error message for human consumption. +// Deprecated: Use NewMessagef instead. +func NewMessage(format string, args []interface{}) Message { + return NewMessagef(format, args...) +} + // Msg returns a printf-style format string and its arguments for human // consumption. func (m *Message) Msg() (format string, args []interface{}) { @@ -162,7 +171,7 @@ func Path(err error) []string { func Newf(p token.Pos, format string, args ...interface{}) Error { return &posError{ pos: p, - Message: NewMessage(format, args), + Message: NewMessagef(format, args...), } } @@ -171,7 +180,7 @@ func Newf(p token.Pos, format string, args ...interface{}) Error { func Wrapf(err error, p token.Pos, format string, args ...interface{}) Error { pErr := &posError{ pos: p, - Message: NewMessage(format, args), + Message: NewMessagef(format, args...), } return Wrap(pErr, err) } @@ -254,7 +263,7 @@ func Promote(err error, msg string) Error { case Error: return x default: - return Wrapf(err, token.NoPos, msg) + return Wrapf(err, token.NoPos, "%s", msg) } } @@ -293,13 +302,16 @@ func Append(a, b Error) Error { // its individual elements. If the given error is not an Error, it will be // promoted to one. func Errors(err error) []Error { - switch x := err.(type) { - case nil: + if err == nil { return nil - case list: - return []Error(x) - case Error: - return []Error{x} + } + var listErr list + var errorErr Error + switch { + case As(err, &listErr): + return listErr + case As(err, &errorErr): + return []Error{errorErr} default: return []Error{Promote(err, "")} } @@ -323,7 +335,7 @@ func appendToList(a list, err Error) list { // The zero value for an list is an empty list ready to use. type list []Error -func (p list) Is(err, target error) bool { +func (p list) Is(target error) bool { for _, e := range p { if errors.Is(e, target) { return true @@ -332,7 +344,7 @@ func (p list) Is(err, target error) bool { return false } -func (p list) As(err error, target interface{}) bool { +func (p list) As(target interface{}) bool { for _, e := range p { if errors.As(e, target) { return true @@ -420,20 +432,32 @@ func equalPath(a, b []string) bool { // Sanitize sorts multiple errors and removes duplicates on a best effort basis. // If err represents a single or no error, it returns the error as is. func Sanitize(err Error) Error { - if l, ok := err.(list); ok && err != nil { - a := make(list, len(l)) - copy(a, l) - a.Sort() - a.RemoveMultiples() + if err == nil { + return nil + } + if l, ok := err.(list); ok { + a := l.sanitize() + if len(a) == 1 { + return a[0] + } return a } return err } +func (p list) sanitize() list { + if p == nil { + return p + } + a := make(list, len(p)) + copy(a, p) + a.RemoveMultiples() + return a +} + // Sort sorts an List. *posError entries are sorted by position, // other errors are sorted by error message, and before any *posError // entry. -// func (p list) Sort() { sort.Sort(p) } @@ -461,6 +485,7 @@ func approximateEqual(a, b Error) bool { } return aPos.Filename() == bPos.Filename() && aPos.Line() == bPos.Line() && + aPos.Column() == bPos.Column() && equalPath(a.Path(), b.Path()) } @@ -531,15 +556,11 @@ type Config struct { // Print is a utility function that prints a list of errors to w, // one error per line, if the err parameter is an List. Otherwise // it prints the err string. -// func Print(w io.Writer, err error, cfg *Config) { if cfg == nil { cfg = &Config{} } - if e, ok := err.(Error); ok { - err = Sanitize(e) - } - for _, e := range Errors(err) { + for _, e := range list(Errors(err)).sanitize() { printError(w, e, cfg) } } @@ -547,16 +568,16 @@ func Print(w io.Writer, err error, cfg *Config) { // Details is a convenience wrapper for Print to return the error text as a // string. func Details(err error, cfg *Config) string { - w := &bytes.Buffer{} - Print(w, err, cfg) - return w.String() + var b strings.Builder + Print(&b, err, cfg) + return b.String() } // String generates a short message from a given Error. func String(err Error) string { - w := &strings.Builder{} - writeErr(w, err) - return w.String() + var b strings.Builder + writeErr(&b, err) + return b.String() } func writeErr(w io.Writer, err Error) { @@ -570,8 +591,9 @@ func writeErr(w io.Writer, err Error) { printed := false msg, args := err.Msg() - if msg != "" || u == nil { // print at least something - fmt.Fprintf(w, msg, args...) + s := fmt.Sprintf(msg, args...) + if s != "" || u == nil { // print at least something + _, _ = io.WriteString(w, s) printed = true } diff --git a/vendor/cuelang.org/go/cue/format.go b/vendor/cuelang.org/go/cue/format.go index 707a7990..0f7812d1 100644 --- a/vendor/cuelang.org/go/cue/format.go +++ b/vendor/cuelang.org/go/cue/format.go @@ -33,35 +33,35 @@ import ( // Format prints a CUE value. // -// WARNING: -// although we are narrowing down the semantics, the verbs and options -// are still subject to change. this API is experimental although it is -// likely getting close to the final design. +// WARNING: although we are narrowing down the semantics, the verbs and options +// are still subject to change. this API is experimental although it is likely +// getting close to the final design. // // It recognizes the following verbs: // -// v print CUE value +// v print CUE value // // The verbs support the following flags: -// # print as schema and include definitions. -// The result is printed as a self-contained file, instead of an the -// expression format. -// + evaluate: resolve defaults and error on incomplete errors +// +// # print as schema and include definitions. +// The result is printed as a self-contained file, instead of an the +// expression format. +// + evaluate: resolve defaults and error on incomplete errors // // Indentation can be controlled as follows: -// width indent the cue block by tab stops (e.g. %2v) -// precision convert tabs to spaces (e.g. %.2v), where -// a value of 0 means no indentation or newlines (TODO). +// +// width indent the cue block by tab stops (e.g. %2v) +// precision convert tabs to spaces (e.g. %.2v), where +// a value of 0 means no indentation or newlines (TODO). // // If the value kind corresponds to one of the following Go types, the // usual Go formatting verbs for that type can be used: // -// Int: b,d,o,O,q,x,X -// Float: f,e,E,g,G -// String/Bytes: s,q,x,X +// Int: b,d,o,O,q,x,X +// Float: f,e,E,g,G +// String/Bytes: s,q,x,X // // The %v directive will be used if the type is not supported for that verb. -// func (v Value) Format(state fmt.State, verb rune) { if v.v == nil { fmt.Fprint(state, "") diff --git a/vendor/cuelang.org/go/cue/format/format.go b/vendor/cuelang.org/go/cue/format/format.go index 5e81eb35..cd1d460f 100644 --- a/vendor/cuelang.org/go/cue/format/format.go +++ b/vendor/cuelang.org/go/cue/format/format.go @@ -87,7 +87,6 @@ func sortImportsOption() Option { // // The function may return early (before the entire result is written) and // return a formatting error, for instance due to an incorrect AST. -// func Node(node ast.Node, opt ...Option) ([]byte, error) { cfg := newConfig(opt) return cfg.fprint(node) @@ -105,7 +104,6 @@ func Node(node ast.Node, opt ...Option) ([]byte, error) { // Caution: Tools relying on consistent formatting based on the installed // version of cue (for instance, such as for presubmit checks) should execute // that cue binary instead of calling Source. -// func Source(b []byte, opt ...Option) ([]byte, error) { cfg := newConfig(opt) @@ -255,7 +253,6 @@ func (f *formatter) print(a ...interface{}) { f.current.pos++ } } - f.visitComments(f.current.pos) } func (f *formatter) formfeed() whiteSpace { diff --git a/vendor/cuelang.org/go/cue/format/node.go b/vendor/cuelang.org/go/cue/format/node.go index 6d06ae41..3407e1e7 100644 --- a/vendor/cuelang.org/go/cue/format/node.go +++ b/vendor/cuelang.org/go/cue/format/node.go @@ -20,7 +20,6 @@ import ( "cuelang.org/go/cue/ast" "cuelang.org/go/cue/literal" - "cuelang.org/go/cue/scanner" "cuelang.org/go/cue/token" "cuelang.org/go/internal" ) @@ -119,7 +118,7 @@ func (f *formatter) walkDeclList(list []ast.Decl) { if hasDocComments(x) { switch x := list[i-1].(type) { case *ast.Field: - if x.Token == token.ISA || internal.IsDefinition(x.Label) { + if internal.IsDefinition(x.Label) { f.print(newsection) } @@ -276,7 +275,8 @@ func (f *formatter) decl(decl ast.Decl) { switch n := decl.(type) { case *ast.Field: - f.label(n.Label, n.Optional != token.NoPos) + constraint, _ := internal.ConstraintToken(n) + f.label(n.Label, constraint) regular := isRegularField(n.Token) if regular { @@ -437,7 +437,7 @@ func (f *formatter) nextNeedsFormfeed(n ast.Expr) bool { func (f *formatter) importSpec(x *ast.ImportSpec) { if x.Name != nil { - f.label(x.Name, false) + f.label(x.Name, token.ILLEGAL) f.print(blank) } else { f.current.pos++ @@ -447,18 +447,7 @@ func (f *formatter) importSpec(x *ast.ImportSpec) { f.print(newline) } -func isValidIdent(ident string) bool { - var scan scanner.Scanner - scan.Init(token.NewFile("check", -1, len(ident)), []byte(ident), nil, 0) - - _, tok, lit := scan.Scan() - if tok == token.IDENT || tok.IsKeyword() { - return lit == ident - } - return false -} - -func (f *formatter) label(l ast.Label, optional bool) { +func (f *formatter) label(l ast.Label, constraint token.Token) { f.before(l) defer f.after(l) switch n := l.(type) { @@ -497,8 +486,8 @@ func (f *formatter) label(l ast.Label, optional bool) { default: panic(fmt.Sprintf("unknown label type %T", n)) } - if optional { - f.print(token.OPTION) + if constraint != token.ILLEGAL { + f.print(constraint) } } @@ -536,7 +525,7 @@ func (f *formatter) exprRaw(expr ast.Expr, prec1, depth int) { case *ast.Alias: // Aliases in expression positions are printed in short form. - f.label(x.Ident, false) + f.label(x.Ident, token.ILLEGAL) f.print(x.Equal, token.BIND) f.expr(x.Expr) @@ -681,13 +670,13 @@ func (f *formatter) clause(clause ast.Clause) { f.print(n.For, "for", blank) f.print(indent) if n.Key != nil { - f.label(n.Key, false) + f.label(n.Key, token.ILLEGAL) f.print(n.Colon, token.COMMA, blank) } else { f.current.pos++ f.visitComments(f.current.pos) } - f.label(n.Value, false) + f.label(n.Value, token.ILLEGAL) f.print(blank, n.In, "in", blank) f.expr(n.Source) f.markUnindentLine() @@ -812,6 +801,7 @@ func reduceDepth(depth int) int { // (Algorithm suggestion by Russ Cox.) // // The precedences are: +// // 7 * / % quo rem div mod // 6 + - // 5 == != < <= > >= @@ -826,23 +816,22 @@ func reduceDepth(depth int) int { // To choose the cutoff, look at the whole expression but excluding primary // expressions (function calls, parenthesized exprs), and apply these rules: // -// 1) If there is a binary operator with a right side unary operand -// that would clash without a space, the cutoff must be (in order): -// -// /* 8 -// ++ 7 // not necessary, but to avoid confusion -// -- 7 +// 1. If there is a binary operator with a right side unary operand +// that would clash without a space, the cutoff must be (in order): // -// (Comparison operators always have spaces around them.) +// /* 8 +// ++ 7 // not necessary, but to avoid confusion +// -- 7 // -// 2) If there is a mix of level 7 and level 6 operators, then the cutoff -// is 7 (use spaces to distinguish precedence) in Normal mode -// and 6 (never use spaces) in Compact mode. +// (Comparison operators always have spaces around them.) // -// 3) If there are no level 6 operators or no level 7 operators, then the -// cutoff is 8 (always use spaces) in Normal mode -// and 6 (never use spaces) in Compact mode. +// 2. If there is a mix of level 7 and level 6 operators, then the cutoff +// is 7 (use spaces to distinguish precedence) in Normal mode +// and 6 (never use spaces) in Compact mode. // +// 3. If there are no level 6 operators or no level 7 operators, then the +// cutoff is 8 (always use spaces) in Normal mode +// and 6 (never use spaces) in Compact mode. func (f *formatter) binaryExpr(x *ast.BinaryExpr, prec1, cutoff, depth int) { f.nestExpr++ defer func() { f.nestExpr-- }() diff --git a/vendor/cuelang.org/go/cue/format/printer.go b/vendor/cuelang.org/go/cue/format/printer.go index a43154fa..3e02ca63 100644 --- a/vendor/cuelang.org/go/cue/format/printer.go +++ b/vendor/cuelang.org/go/cue/format/printer.go @@ -173,6 +173,9 @@ func (p *printer) Print(v interface{}) { p.lastTok = token.IDENT case string: + // We can print a Go string as part of a CUE identifier or literal; + // for example, see the formatter.label method. + isLit = true data = x impliedComma = true p.lastTok = token.STRING @@ -194,12 +197,14 @@ func (p *printer) Print(v interface{}) { return case *ast.Attribute: + isLit = true data = x.Text impliedComma = true p.lastTok = token.ATTRIBUTE case *ast.Comment: // TODO: if implied comma, postpone comment + isLit = true data = x.Text p.lastTok = token.COMMENT @@ -339,7 +344,6 @@ func (f *formatter) matchUnindent() whiteSpace { // needed (i.e., when we don't know that s contains no tabs or line breaks) // avoids processing extra escape characters and reduces run time of the // printer benchmark by up to 10%. -// func (p *printer) writeString(s string, isLit bool) { if s != "" { p.spaceBefore = false diff --git a/vendor/cuelang.org/go/cue/instance.go b/vendor/cuelang.org/go/cue/instance.go index 0fe93c49..3eeebf0d 100644 --- a/vendor/cuelang.org/go/cue/instance.go +++ b/vendor/cuelang.org/go/cue/instance.go @@ -210,6 +210,11 @@ func (inst *hiddenInstance) Doc() []*ast.CommentGroup { func (inst *Instance) Value() Value { ctx := newContext(inst.index) inst.root.Finalize(ctx) + // TODO: consider including these statistics as well. Right now, this only + // seems to be used in cue cmd for "auxiliary" evaluations, like filetypes. + // These arguably skew the actual statistics for the cue command line, so + // it is convenient to not include these. + // adt.AddStats(ctx) return newVertexRoot(inst.index, ctx, inst.root) } @@ -237,7 +242,7 @@ func Merge(inst ...*Instance) *Instance { for _, i := range inst { w := i.Value() - v.AddConjunct(adt.MakeRootConjunct(nil, w.v.ToDataAll())) + v.AddConjunct(adt.MakeRootConjunct(nil, w.v.ToDataAll(ctx))) } v.Finalize(ctx) diff --git a/vendor/cuelang.org/go/cue/literal/num.go b/vendor/cuelang.org/go/cue/literal/num.go index bb77d5b2..64925e2f 100644 --- a/vendor/cuelang.org/go/cue/literal/num.go +++ b/vendor/cuelang.org/go/cue/literal/num.go @@ -17,14 +17,15 @@ package literal import ( "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" ) +// We avoid cuelang.org/go/internal.Context as that would be an import cycle. var baseContext apd.Context func init() { baseContext = apd.BaseContext - baseContext.Precision = 24 + baseContext.Precision = 34 } // NumInfo contains information about a parsed numbers. diff --git a/vendor/cuelang.org/go/cue/literal/string.go b/vendor/cuelang.org/go/cue/literal/string.go index 59fae0a6..5742ce4c 100644 --- a/vendor/cuelang.org/go/cue/literal/string.go +++ b/vendor/cuelang.org/go/cue/literal/string.go @@ -29,7 +29,8 @@ var ( errUnmatchedQuote = errors.New("invalid string: unmatched quote") // TODO: making this an error is optional according to RFC 4627. But we // could make it not an error if this ever results in an issue. - errSurrogate = errors.New("unmatched surrogate pair") + errSurrogate = errors.New("unmatched surrogate pair") + errEscapedLastNewline = errors.New("last newline of multiline string cannot be escaped") ) // Unquote interprets s as a single- or double-quoted, single- or multi-line @@ -135,7 +136,8 @@ func ParseQuotes(start, end string) (q QuoteInfo, nStart, nEnd int, err error) { return q, nStart, int(q.numChar) + q.numHash, nil } -// Unquote unquotes the given string. It must be terminated with a quote or an +// Unquote unquotes the given string, which should not contain +// the initial quote character(s). It must be terminated with a quote or an // interpolation start. Escape sequences are expanded and surrogates // are replaced with the corresponding non-surrogate code points. func (q QuoteInfo) Unquote(s string) (string, error) { @@ -155,23 +157,21 @@ func (q QuoteInfo) Unquote(s string) (string, error) { var runeTmp [utf8.UTFMax]byte buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. stripNL := false + wasEscapedNewline := false for len(s) > 0 { switch s[0] { case '\r': s = s[1:] + wasEscapedNewline = false continue case '\n': - switch { - case !q.multiline: - fallthrough - default: - return "", errInvalidWhitespace - case strings.HasPrefix(s[1:], q.whitespace): - s = s[1+len(q.whitespace):] - case strings.HasPrefix(s[1:], "\n"): - s = s[1:] + var err error + s, err = skipWhitespaceAfterNewline(s[1:], q) + if err != nil { + return "", err } stripNL = true + wasEscapedNewline = false buf = append(buf, '\n') continue } @@ -194,17 +194,32 @@ func (q QuoteInfo) Unquote(s string) (string, error) { s = ss if c < 0 { - if c == -2 { - stripNL = false - } - if stripNL { - // Strip the last newline, but only if it came from a closing - // quote. - buf = buf[:len(buf)-1] + switch c { + case escapedNewline: + var err error + s, err = skipWhitespaceAfterNewline(s, q) + if err != nil { + return "", err + } + wasEscapedNewline = true + continue + case terminatedByQuote: + if wasEscapedNewline { + return "", errEscapedLastNewline + } + if stripNL { + // Strip the last newline, but only if it came from a closing + // quote. + buf = buf[:len(buf)-1] + } + case terminatedByExpr: + default: + panic("unreachable") } return string(buf), nil } stripNL = false + wasEscapedNewline = false if c < utf8.RuneSelf || !multibyte { buf = append(buf, byte(c)) } else { @@ -216,6 +231,22 @@ func (q QuoteInfo) Unquote(s string) (string, error) { return "", errUnmatchedQuote } +func skipWhitespaceAfterNewline(s string, q QuoteInfo) (string, error) { + switch { + case !q.multiline: + // Can't happen because Unquote does an initial check for literal newlines + // in the non-multiline case, but be defensive. + fallthrough + default: + return "", errInvalidWhitespace + case strings.HasPrefix(s, q.whitespace): + s = s[len(q.whitespace):] + case strings.HasPrefix(s, "\n"): + case strings.HasPrefix(s, "\r\n"): + } + return s, nil +} + const ( surHigh = 0xD800 surLow = 0xDC00 @@ -247,14 +278,23 @@ func contains(s string, c byte) bool { return false } +const ( + terminatedByQuote = rune(-1) + terminatedByExpr = rune(-2) + escapedNewline = rune(-3) +) + // unquoteChar decodes the first character or byte in the escaped string. // It returns four values: // -// 1) value, the decoded Unicode code point or byte value; the special value -// of -1 indicates terminated by quotes and -2 means terminated by \(. -// 2) multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation; -// 3) tail, the remainder of the string after the character; and -// 4) an error that will be nil if the character is syntactically valid. +// 1. value, the decoded Unicode code point or byte value if non-negative, or +// one of the following special values: +// - terminatedByQuote indicates terminated by quotes +// - terminatedByExpr means terminated by \( +// - escapedNewline means that the line-termination character was quoted and should be omitted +// 2. multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation; +// 3. tail, the remainder of the string after the character; and +// 4. an error that will be nil if the character is syntactically valid. // // The second argument, kind, specifies the type of literal being parsed // and therefore which kind of escape sequences are permitted. @@ -281,7 +321,7 @@ func unquoteChar(s string, info QuoteInfo) (value rune, multibyte bool, tail str // TODO: terminating quote in middle of string return 0, false, s[ln:], errSyntax } - return -1, false, "", nil + return terminatedByQuote, false, "", nil case c >= utf8.RuneSelf: // TODO: consider handling surrogate values. These are discarded by // DecodeRuneInString. It is technically correct to disallow it, but @@ -398,7 +438,16 @@ func unquoteChar(s string, info QuoteInfo) (value rune, multibyte bool, tail str // TODO: terminating quote in middle of string return 0, false, s, errSyntax } - value = -2 + value = terminatedByExpr + case '\r': + if len(s) == 0 || s[0] != '\n' { + err = errSyntax + return + } + s = s[1:] + value = escapedNewline + case '\n': + value = escapedNewline default: err = errSyntax return diff --git a/vendor/cuelang.org/go/cue/load/config.go b/vendor/cuelang.org/go/cue/load/config.go index d63be5af..2efd0a8d 100644 --- a/vendor/cuelang.org/go/cue/load/config.go +++ b/vendor/cuelang.org/go/cue/load/config.go @@ -15,27 +15,24 @@ package load import ( + "fmt" "io" + "net/url" "os" - pathpkg "path" "path/filepath" "strings" "cuelang.org/go/cue/ast" "cuelang.org/go/cue/build" "cuelang.org/go/cue/errors" - "cuelang.org/go/cue/parser" "cuelang.org/go/cue/token" "cuelang.org/go/internal" - "cuelang.org/go/internal/core/compile" - "cuelang.org/go/internal/core/eval" - "cuelang.org/go/internal/core/runtime" ) const ( cueSuffix = ".cue" modDir = "cue.mod" - configFile = "module.cue" + moduleFile = "module.cue" pkgDir = "pkg" ) @@ -102,7 +99,7 @@ const FromArgsUsage = ` selects all packages named foo in the any subdirectory of the current working directory. - 3. An import path referring to a directory within the current module +3. An import path referring to a directory within the current module All CUE files in that directory, and all the ancestor directories up to the module root (if applicable), with a package name corresponding to the base @@ -110,7 +107,7 @@ const FromArgsUsage = ` a single instance. Examples, assume a module name of acme.org/root: - example.com/foo package in cue.mod + mod.test/foo package in cue.mod ./foo package corresponding to foo directory .:bar package in current directory with package name bar ` @@ -127,13 +124,8 @@ type Config struct { // packages at loading time. // Context specifies the context for the load operation. - // If the context is cancelled, the loader may stop early - // and return an ErrCancelled error. - // If Context is nil, the load cannot be cancelled. Context *build.Context - loader *loader - // A Module is a collection of packages and instances that are within the // directory hierarchy rooted at the module root. The module root can be // marked with a cue.mod file. @@ -143,6 +135,12 @@ type Config struct { // the module field of an existing cue.mod file. Module string + // modFile holds the contents of the module file, or nil + // if no module file was present. If non-nil, then + // after calling Config.complete, modFile.Module will be + // equal to Module. + modFile *modFile + // Package defines the name of the package to be loaded. If this is not set, // the package must be uniquely defined from its context. Special values: // _ load files without a package @@ -150,9 +148,10 @@ type Config struct { // in the _ package. Package string - // Dir is the directory in which to run the build system's query tool - // that provides information about the packages. - // If Dir is empty, the tool is run in the current directory. + // Dir is the base directory for import path resolution. + // For example, it is used to determine the main module, + // and rooted import paths starting with "./" are relative to it. + // If Dir is empty, the current directory is used. Dir string // Tags defines boolean tags or key-value pairs to select files to build @@ -250,7 +249,7 @@ type Config struct { // to CUE. DataFiles bool - // StdRoot specifies an alternative directory for standard libaries. + // StdRoot specifies an alternative directory for standard libraries. // This is mostly used for bootstrapping. StdRoot string @@ -276,9 +275,11 @@ type Config struct { // the corresponding build.File will be associated with the full buffer. Stdin io.Reader - fileSystem + // Registry holds the URL of the CUE registry. If it has no scheme, https:// is assumed + // as a prefix. THIS IS EXPERIMENTAL FOR NOW. DO NOT USE. + Registry string - loadFunc build.LoadFunc + fileSystem fileSystem } func (c *Config) stdin() io.Reader { @@ -288,74 +289,6 @@ func (c *Config) stdin() io.Reader { return c.Stdin } -func (c *Config) newInstance(pos token.Pos, p importPath) *build.Instance { - dir, name, err := c.absDirFromImportPath(pos, p) - i := c.Context.NewInstance(dir, c.loadFunc) - i.Dir = dir - i.PkgName = name - i.DisplayPath = string(p) - i.ImportPath = string(p) - i.Root = c.ModuleRoot - i.Module = c.Module - i.Err = errors.Append(i.Err, err) - - return i -} - -func (c *Config) newRelInstance(pos token.Pos, path, pkgName string) *build.Instance { - fs := c.fileSystem - - var err errors.Error - dir := path - - p := c.Context.NewInstance(path, c.loadFunc) - p.PkgName = pkgName - p.DisplayPath = filepath.ToSlash(path) - // p.ImportPath = string(dir) // compute unique ID. - p.Root = c.ModuleRoot - p.Module = c.Module - - if isLocalImport(path) { - if c.Dir == "" { - err = errors.Append(err, errors.Newf(pos, "cwd unknown")) - } - dir = filepath.Join(c.Dir, filepath.FromSlash(path)) - } - - if path == "" { - err = errors.Append(err, errors.Newf(pos, - "import %q: invalid import path", path)) - } else if path != cleanImport(path) { - err = errors.Append(err, c.loader.errPkgf(nil, - "non-canonical import path: %q should be %q", path, pathpkg.Clean(path))) - } - - if importPath, e := c.importPathFromAbsDir(fsPath(dir), path); e != nil { - // Detect later to keep error messages consistent. - } else { - p.ImportPath = string(importPath) - } - - p.Dir = dir - - if fs.isAbsPath(path) || strings.HasPrefix(path, "/") { - err = errors.Append(err, errors.Newf(pos, - "absolute import path %q not allowed", path)) - } - if err != nil { - p.Err = errors.Append(p.Err, err) - p.Incomplete = true - } - - return p -} - -func (c Config) newErrInstance(pos token.Pos, path importPath, err error) *build.Instance { - i := c.newInstance(pos, path) - i.Err = errors.Promote(err, "instance") - return i -} - func toImportPath(dir string) importPath { return importPath(filepath.ToSlash(dir)) } @@ -364,51 +297,6 @@ type importPath string type fsPath string -func (c *Config) importPathFromAbsDir(absDir fsPath, key string) (importPath, errors.Error) { - if c.ModuleRoot == "" { - return "", errors.Newf(token.NoPos, - "cannot determine import path for %q (root undefined)", key) - } - - dir := filepath.Clean(string(absDir)) - if !strings.HasPrefix(dir, c.ModuleRoot) { - return "", errors.Newf(token.NoPos, - "cannot determine import path for %q (dir outside of root)", key) - } - - pkg := filepath.ToSlash(dir[len(c.ModuleRoot):]) - switch { - case strings.HasPrefix(pkg, "/cue.mod/"): - pkg = pkg[len("/cue.mod/"):] - if pkg == "" { - return "", errors.Newf(token.NoPos, - "invalid package %q (root of %s)", key, modDir) - } - - // TODO(legacy): remove. - case strings.HasPrefix(pkg, "/pkg/"): - pkg = pkg[len("/pkg/"):] - if pkg == "" { - return "", errors.Newf(token.NoPos, - "invalid package %q (root of %s)", key, pkgDir) - } - - case c.Module == "": - return "", errors.Newf(token.NoPos, - "cannot determine import path for %q (no module)", key) - default: - pkg = c.Module + pkg - } - - name := c.Package - switch name { - case "_", "*": - name = "" - } - - return addImportQualifier(importPath(pkg), name) -} - func addImportQualifier(pkg importPath, name string) (importPath, errors.Error) { if name != "" { s := string(pkg) @@ -430,60 +318,17 @@ func addImportQualifier(pkg importPath, name string) (importPath, errors.Error) return pkg, nil } -// absDirFromImportPath converts a giving import path to an absolute directory -// and a package name. The root directory must be set. -// -// The returned directory may not exist. -func (c *Config) absDirFromImportPath(pos token.Pos, p importPath) (absDir, name string, err errors.Error) { - if c.ModuleRoot == "" { - return "", "", errors.Newf(pos, "cannot import %q (root undefined)", p) - } - - // Extract the package name. - - name = string(p) - switch i := strings.LastIndexAny(name, "/:"); { - case i < 0: - case p[i] == ':': - name = string(p[i+1:]) - p = p[:i] - - default: // p[i] == '/' - name = string(p[i+1:]) - } - - // TODO: fully test that name is a valid identifier. - if name == "" { - err = errors.Newf(pos, "empty package name in import path %q", p) - } else if strings.IndexByte(name, '.') >= 0 { - err = errors.Newf(pos, - "cannot determine package name for %q (set explicitly with ':')", p) - } - - // Determine the directory. - - sub := filepath.FromSlash(string(p)) - switch hasPrefix := strings.HasPrefix(string(p), c.Module); { - case hasPrefix && len(sub) == len(c.Module): - absDir = c.ModuleRoot - - case hasPrefix && p[len(c.Module)] == '/': - absDir = filepath.Join(c.ModuleRoot, sub[len(c.Module)+1:]) - - default: - absDir = filepath.Join(GenPath(c.ModuleRoot), sub) - } - - return absDir, name, err -} - // Complete updates the configuration information. After calling complete, // the following invariants hold: -// - c.ModuleRoot != "" -// - c.Module is set to the module import prefix if there is a cue.mod file -// with the module property. -// - c.loader != nil -// - c.cache != "" +// - c.Dir is an absolute path. +// - c.ModuleRoot is an absolute path +// - c.Module is set to the module import prefix if there is a cue.mod file +// with the module property. +// - c.loader != nil +// - c.cache != "" +// +// It does not initialize c.Context, because that requires the +// loader in order to use for build.Loader. func (c Config) complete() (cfg *Config, err error) { // Each major CUE release should add a tag here. // Old tags should not be removed. That is, the cue1.x tag is present @@ -516,69 +361,22 @@ func (c Config) complete() (cfg *Config, err error) { if root := c.findRoot(c.Dir); root != "" { c.ModuleRoot = root } + } else if !filepath.IsAbs(c.ModuleRoot) { + c.ModuleRoot = filepath.Join(c.Dir, c.ModuleRoot) } - - c.loader = &loader{ - cfg: &c, - buildTags: make(map[string]bool), - } - - // TODO: also make this work if run from outside the module? - switch { - case true: - mod := filepath.Join(c.ModuleRoot, modDir) - info, cerr := c.fileSystem.stat(mod) - if cerr != nil { - break - } - if info.IsDir() { - mod = filepath.Join(mod, configFile) - } - f, cerr := c.fileSystem.openFile(mod) - if cerr != nil { - break - } - - // TODO: move to full build again - file, err := parser.ParseFile("load", f) + if c.Registry != "" { + u, err := url.Parse(c.Registry) if err != nil { - return nil, errors.Wrapf(err, token.NoPos, "invalid cue.mod file") + return nil, fmt.Errorf("invalid registry URL %q: %v", c.Registry, err) } - - r := runtime.New() - v, err := compile.Files(nil, r, "_", file) - if err != nil { - return nil, errors.Wrapf(err, token.NoPos, "invalid cue.mod file") - } - ctx := eval.NewContext(r, v) - v.Finalize(ctx) - prefix := v.Lookup(ctx.StringLabel("module")) - if prefix != nil { - name := ctx.StringValue(prefix.Value()) - if err := ctx.Err(); err != nil { - return &c, err.Err - } - pos := token.NoPos - src := prefix.Value().Source() - if src != nil { - pos = src.Pos() - } - if c.Module != "" && c.Module != name { - return &c, errors.Newf(pos, "inconsistent modules: got %q, want %q", name, c.Module) - } - c.Module = name + if u.Scheme == "" { + u.Scheme = "https" + c.Registry = u.String() } } - - c.loadFunc = c.loader.loadFunc() - - if c.Context == nil { - c.Context = build.NewContext( - build.Loader(c.loadFunc), - build.ParseFile(c.loader.cfg.ParseFile), - ) + if err := c.loadModule(); err != nil { + return nil, err } - return &c, nil } @@ -589,14 +387,11 @@ func (c Config) isRoot(dir string) bool { return err == nil } -// findRoot returns the module root or "" if none was found. -func (c Config) findRoot(dir string) string { +// findRoot returns the module root that's ancestor +// of the given absolute directory path, or "" if none was found. +func (c Config) findRoot(absDir string) string { fs := &c.fileSystem - absDir, err := filepath.Abs(dir) - if err != nil { - return "" - } abs := absDir for { if c.isRoot(abs) { @@ -628,3 +423,11 @@ func (c Config) findRoot(dir string) string { abs = d } } + +func (c *Config) newErrInstance(err error) *build.Instance { + i := c.Context.NewInstance("", nil) + i.Root = c.ModuleRoot + i.Module = c.Module + i.Err = errors.Promote(err, "instance") + return i +} diff --git a/vendor/cuelang.org/go/cue/load/errors.go b/vendor/cuelang.org/go/cue/load/errors.go index 1f774a5b..4ac9d091 100644 --- a/vendor/cuelang.org/go/cue/load/errors.go +++ b/vendor/cuelang.org/go/cue/load/errors.go @@ -36,15 +36,6 @@ func (p *PackageError) Position() token.Pos { return p.Pos } func (p *PackageError) InputPositions() []token.Pos { return nil } func (p *PackageError) Path() []string { return p.ImportStack } -func (l *loader) errPkgf(importPos []token.Pos, format string, args ...interface{}) *PackageError { - err := &PackageError{ - ImportStack: l.stk.Copy(), - Message: errors.NewMessage(format, args), - } - err.fillPos(l.cfg.Dir, importPos) - return err -} - func (p *PackageError) fillPos(cwd string, positions []token.Pos) { if len(positions) > 0 && !p.Pos.IsValid() { p.Pos = positions[0] diff --git a/vendor/cuelang.org/go/cue/load/fs.go b/vendor/cuelang.org/go/cue/load/fs.go index b269f005..41f38836 100644 --- a/vendor/cuelang.org/go/cue/load/fs.go +++ b/vendor/cuelang.org/go/cue/load/fs.go @@ -17,7 +17,7 @@ package load import ( "bytes" "io" - "io/ioutil" + iofs "io/fs" "os" "path/filepath" "sort" @@ -165,10 +165,10 @@ func hasSubdir(root, dir string) (rel string, ok bool) { return filepath.ToSlash(dir[len(root):]), true } -func (fs *fileSystem) readDir(path string) ([]os.FileInfo, errors.Error) { +func (fs *fileSystem) readDir(path string) ([]iofs.DirEntry, errors.Error) { path = fs.makeAbs(path) m := fs.getDir(path, false) - items, err := ioutil.ReadDir(path) + items, err := os.ReadDir(path) if err != nil { if !os.IsNotExist(err) || m == nil { return nil, errors.Wrapf(err, token.NoPos, "readDir") @@ -179,12 +179,12 @@ func (fs *fileSystem) readDir(path string) ([]os.FileInfo, errors.Error) { for i, fi := range items { done[fi.Name()] = true if o := m[fi.Name()]; o != nil { - items[i] = o + items[i] = iofs.FileInfoToDirEntry(o) } } for _, o := range m { if !done[o.Name()] { - items = append(items, o) + items = append(items, iofs.FileInfoToDirEntry(o)) } } sort.Slice(items, func(i, j int) bool { @@ -229,7 +229,7 @@ func (fs *fileSystem) lstat(path string) (os.FileInfo, errors.Error) { func (fs *fileSystem) openFile(path string) (io.ReadCloser, errors.Error) { path = fs.makeAbs(path) if fi := fs.getOverlay(path); fi != nil { - return ioutil.NopCloser(bytes.NewReader(fi.contents)), nil + return io.NopCloser(bytes.NewReader(fi.contents)), nil } f, err := os.Open(path) @@ -241,16 +241,17 @@ func (fs *fileSystem) openFile(path string) (io.ReadCloser, errors.Error) { var skipDir = errors.Newf(token.NoPos, "skip directory") -type walkFunc func(path string, info os.FileInfo, err errors.Error) errors.Error +type walkFunc func(path string, entry iofs.DirEntry, err errors.Error) errors.Error func (fs *fileSystem) walk(root string, f walkFunc) error { - fi, err := fs.lstat(root) + info, err := fs.lstat(root) + entry := iofs.FileInfoToDirEntry(info) if err != nil { - err = f(root, fi, err) - } else if !fi.IsDir() { + err = f(root, entry, err) + } else if !info.IsDir() { return errors.Newf(token.NoPos, "path %q is not a directory", root) } else { - err = fs.walkRec(root, fi, f) + err = fs.walkRec(root, entry, f) } if err == skipDir { return nil @@ -259,13 +260,13 @@ func (fs *fileSystem) walk(root string, f walkFunc) error { } -func (fs *fileSystem) walkRec(path string, info os.FileInfo, f walkFunc) errors.Error { - if !info.IsDir() { - return f(path, info, nil) +func (fs *fileSystem) walkRec(path string, entry iofs.DirEntry, f walkFunc) errors.Error { + if !entry.IsDir() { + return f(path, entry, nil) } dir, err := fs.readDir(path) - err1 := f(path, info, err) + err1 := f(path, entry, err) // If err != nil, walk can't walk into this directory. // err1 != nil means walkFn want walk to skip this directory or stop walking. @@ -278,11 +279,11 @@ func (fs *fileSystem) walkRec(path string, info os.FileInfo, f walkFunc) errors. return err1 } - for _, info := range dir { - filename := fs.joinPath(path, info.Name()) - err = fs.walkRec(filename, info, f) + for _, entry := range dir { + filename := fs.joinPath(path, entry.Name()) + err = fs.walkRec(filename, entry, f) if err != nil { - if !info.IsDir() || err != skipDir { + if !entry.IsDir() || err != skipDir { return err } } diff --git a/vendor/cuelang.org/go/cue/load/import.go b/vendor/cuelang.org/go/cue/load/import.go index 1f43a3d8..4a026c1a 100644 --- a/vendor/cuelang.org/go/cue/load/import.go +++ b/vendor/cuelang.org/go/cue/load/import.go @@ -15,44 +15,21 @@ package load import ( - "bytes" + "fmt" "os" + pathpkg "path" "path/filepath" "sort" - "strconv" "strings" - "unicode" - "unicode/utf8" - "cuelang.org/go/cue/ast" "cuelang.org/go/cue/build" "cuelang.org/go/cue/errors" - "cuelang.org/go/cue/parser" "cuelang.org/go/cue/token" - "cuelang.org/go/internal" "cuelang.org/go/internal/filetypes" ) -// An importMode controls the behavior of the Import method. -type importMode uint - -const ( - // If findOnly is set, Import stops after locating the directory - // that should contain the sources for a package. It does not - // read any files in the directory. - findOnly importMode = 1 << iota - - // If importComment is set, parse import comments on package statements. - // Import returns an error if it finds a comment it cannot understand - // or finds conflicting comments in multiple source files. - // See golang.org/s/go14customimport for more information. - importComment - - allowAnonymous -) - // importPkg returns details about the CUE package named by the import path, -// interpreting local import paths relative to the srcDir directory. +// interpreting local import paths relative to l.cfg.Dir. // If the path is a local import path naming a package that can be imported // using a standard import path, the returned package will set p.ImportPath // to that path. @@ -60,19 +37,19 @@ const ( // In the directory and ancestor directories up to including one with a // cue.mod file, all .cue files are considered part of the package except for: // -// - files starting with _ or . (likely editor temporary files) -// - files with build constraints not satisfied by the context +// - files starting with _ or . (likely editor temporary files) +// - files with build constraints not satisfied by the context // // If an error occurs, importPkg sets the error in the returned instance, // which then may contain partial information. // // pkgName indicates which packages to load. It supports the following // values: -// "" the default package for the directory, if only one -// is present. -// _ anonymous files (which may be marked with _) -// * all packages // +// "" the default package for the directory, if only one +// is present. +// _ anonymous files (which may be marked with _) +// * all packages func (l *loader) importPkg(pos token.Pos, p *build.Instance) []*build.Instance { l.stk.Push(p.ImportPath) defer l.stk.Pop() @@ -92,12 +69,7 @@ func (l *loader) importPkg(pos token.Pos, p *build.Instance) []*build.Instance { return []*build.Instance{p} } - if !strings.HasPrefix(p.Dir, cfg.ModuleRoot) { - err := errors.Newf(token.NoPos, "module root not defined", p.DisplayPath) - return retErr(err) - } - - fp := newFileProcessor(cfg, p) + fp := newFileProcessor(cfg, p, l.tagger) if p.PkgName == "" { if l.cfg.Package == "*" { @@ -113,10 +85,6 @@ func (l *loader) importPkg(pos token.Pos, p *build.Instance) []*build.Instance { fp.ignoreOther = true } - if !strings.HasPrefix(p.Dir, cfg.ModuleRoot) { - panic("") - } - var dirs [][2]string genDir := GenPath(cfg.ModuleRoot) if strings.HasPrefix(p.Dir, genDir) { @@ -152,8 +120,7 @@ func (l *loader) importPkg(pos token.Pos, p *build.Instance) []*build.Instance { if !found { return retErr( &PackageError{ - Message: errors.NewMessage("cannot find package %q", - []interface{}{p.DisplayPath}), + Message: errors.NewMessagef("cannot find package %q", p.DisplayPath), }) } @@ -236,382 +203,198 @@ func (l *loader) importPkg(pos token.Pos, p *build.Instance) []*build.Instance { return all } -// loadFunc creates a LoadFunc that can be used to create new build.Instances. -func (l *loader) loadFunc() build.LoadFunc { - - return func(pos token.Pos, path string) *build.Instance { - cfg := l.cfg - - impPath := importPath(path) - if isLocalImport(path) { - return cfg.newErrInstance(pos, impPath, - errors.Newf(pos, "relative import paths not allowed (%q)", path)) - } +// _loadFunc is the method used for the value of l.loadFunc. +func (l *loader) _loadFunc(pos token.Pos, path string) *build.Instance { + impPath := importPath(path) + if isLocalImport(path) { + return l.cfg.newErrInstance(errors.Newf(pos, "relative import paths not allowed (%q)", path)) + } - // is it a builtin? - if strings.IndexByte(strings.Split(path, "/")[0], '.') == -1 { - if l.cfg.StdRoot != "" { - p := cfg.newInstance(pos, impPath) - _ = l.importPkg(pos, p) - return p - } - return nil + // is it a builtin? + if strings.IndexByte(strings.Split(path, "/")[0], '.') == -1 { + if l.cfg.StdRoot != "" { + p := l.newInstance(pos, impPath) + _ = l.importPkg(pos, p) + return p } - - p := cfg.newInstance(pos, impPath) - _ = l.importPkg(pos, p) - return p + return nil } -} - -func rewriteFiles(p *build.Instance, root string, isLocal bool) { - p.Root = root - normalizeFiles(p.BuildFiles) - normalizeFiles(p.IgnoredFiles) - normalizeFiles(p.OrphanedFiles) - normalizeFiles(p.InvalidFiles) - normalizeFiles(p.UnknownFiles) + p := l.newInstance(pos, impPath) + _ = l.importPkg(pos, p) + return p } -func normalizeFiles(a []*build.File) { - sort.Slice(a, func(i, j int) bool { - return len(filepath.Dir(a[i].Filename)) < len(filepath.Dir(a[j].Filename)) - }) -} +// newRelInstance returns a build instance from the given +// relative import path. +func (l *loader) newRelInstance(pos token.Pos, path, pkgName string) *build.Instance { + if !isLocalImport(path) { + panic(fmt.Errorf("non-relative import path %q passed to newRelInstance", path)) + } + fs := l.cfg.fileSystem -type fileProcessor struct { - firstFile string - firstCommentFile string - imported map[string][]token.Pos - allTags map[string]bool - allFiles bool - ignoreOther bool // ignore files from other packages - allPackages bool + var err errors.Error + dir := path - c *Config - pkgs map[string]*build.Instance - pkg *build.Instance + p := l.cfg.Context.NewInstance(path, l.loadFunc) + p.PkgName = pkgName + p.DisplayPath = filepath.ToSlash(path) + // p.ImportPath = string(dir) // compute unique ID. + p.Root = l.cfg.ModuleRoot + p.Module = l.cfg.Module - err errors.Error -} + dir = filepath.Join(l.cfg.Dir, filepath.FromSlash(path)) -func newFileProcessor(c *Config, p *build.Instance) *fileProcessor { - return &fileProcessor{ - imported: make(map[string][]token.Pos), - allTags: make(map[string]bool), - c: c, - pkgs: map[string]*build.Instance{"_": p}, - pkg: p, + if path != cleanImport(path) { + err = errors.Append(err, l.errPkgf(nil, + "non-canonical import path: %q should be %q", path, pathpkg.Clean(path))) } -} -func countCUEFiles(c *Config, p *build.Instance) int { - count := len(p.BuildFiles) - for _, f := range p.IgnoredFiles { - if c.Tools && strings.HasSuffix(f.Filename, "_tool.cue") { - count++ - } - if c.Tests && strings.HasSuffix(f.Filename, "_test.cue") { - count++ - } + if importPath, e := l.importPathFromAbsDir(fsPath(dir), path); e != nil { + // Detect later to keep error messages consistent. + } else { + p.ImportPath = string(importPath) } - return count -} -func (fp *fileProcessor) finalize(p *build.Instance) errors.Error { - if fp.err != nil { - return fp.err - } - if countCUEFiles(fp.c, p) == 0 && - !fp.c.DataFiles && - (p.PkgName != "_" || !fp.allPackages) { - fp.err = errors.Append(fp.err, &NoFilesError{Package: p, ignored: len(p.IgnoredFiles) > 0}) - return fp.err - } + p.Dir = dir - for tag := range fp.allTags { - p.AllTags = append(p.AllTags, tag) + if fs.isAbsPath(path) || strings.HasPrefix(path, "/") { + err = errors.Append(err, errors.Newf(pos, + "absolute import path %q not allowed", path)) + } + if err != nil { + p.Err = errors.Append(p.Err, err) + p.Incomplete = true } - sort.Strings(p.AllTags) - - p.ImportPaths, _ = cleanImports(fp.imported) - return nil + return p } -func (fp *fileProcessor) add(pos token.Pos, root string, file *build.File, mode importMode) (added bool) { - fullPath := file.Filename - if fullPath != "-" { - if !filepath.IsAbs(fullPath) { - fullPath = filepath.Join(root, fullPath) - } +func (l *loader) importPathFromAbsDir(absDir fsPath, key string) (importPath, errors.Error) { + if l.cfg.ModuleRoot == "" { + return "", errors.Newf(token.NoPos, + "cannot determine import path for %q (root undefined)", key) } - file.Filename = fullPath - - base := filepath.Base(fullPath) - // special * and _ - p := fp.pkg // default package - - // badFile := func(p *build.Instance, err errors.Error) bool { - badFile := func(err errors.Error) bool { - fp.err = errors.Append(fp.err, err) - file.ExcludeReason = fp.err - p.InvalidFiles = append(p.InvalidFiles, file) - return true + dir := filepath.Clean(string(absDir)) + if !strings.HasPrefix(dir, l.cfg.ModuleRoot) { + return "", errors.Newf(token.NoPos, + "cannot determine import path for %q (dir outside of root)", key) } - match, data, err := matchFile(fp.c, file, true, fp.allFiles, fp.allTags) + pkg := filepath.ToSlash(dir[len(l.cfg.ModuleRoot):]) switch { - case match: - - case err == nil: - // Not a CUE file. - p.OrphanedFiles = append(p.OrphanedFiles, file) - return false - - case !errors.Is(err, errExclude): - return badFile(err) - - default: - file.ExcludeReason = err - if file.Interpretation == "" { - p.IgnoredFiles = append(p.IgnoredFiles, file) - } else { - p.OrphanedFiles = append(p.OrphanedFiles, file) + case strings.HasPrefix(pkg, "/cue.mod/"): + pkg = pkg[len("/cue.mod/"):] + if pkg == "" { + return "", errors.Newf(token.NoPos, + "invalid package %q (root of %s)", key, modDir) } - return false - } - - pf, perr := parser.ParseFile(fullPath, data, parser.ImportsOnly, parser.ParseComments) - if perr != nil { - badFile(errors.Promote(perr, "add failed")) - return true - } - _, pkg, pos := internal.PackageInfo(pf) - if pkg == "" { - pkg = "_" - } - - switch { - case pkg == p.PkgName, mode&allowAnonymous != 0: - case fp.allPackages && pkg != "_": - q := fp.pkgs[pkg] - if q == nil { - q = &build.Instance{ - PkgName: pkg, - - Dir: p.Dir, - DisplayPath: p.DisplayPath, - ImportPath: p.ImportPath + ":" + pkg, - Root: p.Root, - Module: p.Module, - } - fp.pkgs[pkg] = q + // TODO(legacy): remove. + case strings.HasPrefix(pkg, "/pkg/"): + pkg = pkg[len("/pkg/"):] + if pkg == "" { + return "", errors.Newf(token.NoPos, + "invalid package %q (root of %s)", key, pkgDir) } - p = q - - case pkg != "_": + case l.cfg.Module == "": + return "", errors.Newf(token.NoPos, + "cannot determine import path for %q (no module)", key) default: - file.ExcludeReason = excludeError{errors.Newf(pos, "no package name")} - p.IgnoredFiles = append(p.IgnoredFiles, file) - return false // don't mark as added + pkg = l.cfg.Module + pkg } - if !fp.c.AllCUEFiles { - if err := shouldBuildFile(pf, fp); err != nil { - if !errors.Is(err, errExclude) { - fp.err = errors.Append(fp.err, err) - } - file.ExcludeReason = err - p.IgnoredFiles = append(p.IgnoredFiles, file) - return false - } - } - - if pkg != "" && pkg != "_" { - if p.PkgName == "" { - p.PkgName = pkg - fp.firstFile = base - } else if pkg != p.PkgName { - if fp.ignoreOther { - file.ExcludeReason = excludeError{errors.Newf(pos, - "package is %s, want %s", pkg, p.PkgName)} - p.IgnoredFiles = append(p.IgnoredFiles, file) - return false - } - return badFile(&MultiplePackageError{ - Dir: p.Dir, - Packages: []string{p.PkgName, pkg}, - Files: []string{fp.firstFile, base}, - }) - } + name := l.cfg.Package + switch name { + case "_", "*": + name = "" } - isTest := strings.HasSuffix(base, "_test"+cueSuffix) - isTool := strings.HasSuffix(base, "_tool"+cueSuffix) - - if mode&importComment != 0 { - qcom, line := findimportComment(data) - if line != 0 { - com, err := strconv.Unquote(qcom) - if err != nil { - badFile(errors.Newf(pos, "%s:%d: cannot parse import comment", fullPath, line)) - } else if p.ImportComment == "" { - p.ImportComment = com - fp.firstCommentFile = base - } else if p.ImportComment != com { - badFile(errors.Newf(pos, "found import comments %q (%s) and %q (%s) in %s", p.ImportComment, fp.firstCommentFile, com, base, p.Dir)) - } - } - } + return addImportQualifier(importPath(pkg), name) +} - for _, decl := range pf.Decls { - d, ok := decl.(*ast.ImportDecl) - if !ok { - continue - } - for _, spec := range d.Specs { - quoted := spec.Path.Value - path, err := strconv.Unquote(quoted) - if err != nil { - badFile(errors.Newf( - spec.Path.Pos(), - "%s: parser returned invalid quoted string: <%s>", fullPath, quoted, - )) - } - if !isTest || fp.c.Tests { - fp.imported[path] = append(fp.imported[path], spec.Pos()) - } - } - } - switch { - case isTest: - if fp.c.loader.cfg.Tests { - p.BuildFiles = append(p.BuildFiles, file) - } else { - file.ExcludeReason = excludeError{errors.Newf(pos, - "_test.cue files excluded in non-test mode")} - p.IgnoredFiles = append(p.IgnoredFiles, file) - } - case isTool: - if fp.c.loader.cfg.Tools { - p.BuildFiles = append(p.BuildFiles, file) - } else { - file.ExcludeReason = excludeError{errors.Newf(pos, - "_tool.cue files excluded in non-cmd mode")} - p.IgnoredFiles = append(p.IgnoredFiles, file) - } - default: - p.BuildFiles = append(p.BuildFiles, file) - } - return true +func (l *loader) newInstance(pos token.Pos, p importPath) *build.Instance { + dir, name, err := l.absDirFromImportPath(pos, p) + i := l.cfg.Context.NewInstance(dir, l.loadFunc) + i.Dir = dir + i.PkgName = name + i.DisplayPath = string(p) + i.ImportPath = string(p) + i.Root = l.cfg.ModuleRoot + i.Module = l.cfg.Module + i.Err = errors.Append(i.Err, err) + + return i } -func findimportComment(data []byte) (s string, line int) { - // expect keyword package - word, data := parseWord(data) - if string(word) != "package" { - return "", 0 +// absDirFromImportPath converts a giving import path to an absolute directory +// and a package name. The root directory must be set. +// +// The returned directory may not exist. +func (l *loader) absDirFromImportPath(pos token.Pos, p importPath) (absDir, name string, err errors.Error) { + if l.cfg.ModuleRoot == "" { + return "", "", errors.Newf(pos, "cannot import %q (root undefined)", p) } - // expect package name - _, data = parseWord(data) + // Extract the package name. - // now ready for import comment, a // comment - // beginning and ending on the current line. - for len(data) > 0 && (data[0] == ' ' || data[0] == '\t' || data[0] == '\r') { - data = data[1:] - } + name = string(p) + switch i := strings.LastIndexAny(name, "/:"); { + case i < 0: + case p[i] == ':': + name = string(p[i+1:]) + p = p[:i] - var comment []byte - switch { - case bytes.HasPrefix(data, slashSlash): - i := bytes.Index(data, newline) - if i < 0 { - i = len(data) - } - comment = data[2:i] + default: // p[i] == '/' + name = string(p[i+1:]) } - comment = bytes.TrimSpace(comment) - // split comment into `import`, `"pkg"` - word, arg := parseWord(comment) - if string(word) != "import" { - return "", 0 + // TODO: fully test that name is a valid identifier. + if name == "" { + err = errors.Newf(pos, "empty package name in import path %q", p) + } else if strings.IndexByte(name, '.') >= 0 { + err = errors.Newf(pos, + "cannot determine package name for %q (set explicitly with ':')", p) } - line = 1 + bytes.Count(data[:cap(data)-cap(arg)], newline) - return strings.TrimSpace(string(arg)), line -} + // Determine the directory. -var ( - slashSlash = []byte("//") - newline = []byte("\n") -) + sub := filepath.FromSlash(string(p)) + switch hasPrefix := strings.HasPrefix(string(p), l.cfg.Module); { + case hasPrefix && len(sub) == len(l.cfg.Module): + absDir = l.cfg.ModuleRoot -// skipSpaceOrComment returns data with any leading spaces or comments removed. -func skipSpaceOrComment(data []byte) []byte { - for len(data) > 0 { - switch data[0] { - case ' ', '\t', '\r', '\n': - data = data[1:] - continue - case '/': - if bytes.HasPrefix(data, slashSlash) { - i := bytes.Index(data, newline) - if i < 0 { - return nil - } - data = data[i+1:] - continue - } - } - break - } - return data -} + case hasPrefix && p[len(l.cfg.Module)] == '/': + absDir = filepath.Join(l.cfg.ModuleRoot, sub[len(l.cfg.Module)+1:]) -// parseWord skips any leading spaces or comments in data -// and then parses the beginning of data as an identifier or keyword, -// returning that word and what remains after the word. -func parseWord(data []byte) (word, rest []byte) { - data = skipSpaceOrComment(data) - - // Parse past leading word characters. - rest = data - for { - r, size := utf8.DecodeRune(rest) - if unicode.IsLetter(r) || '0' <= r && r <= '9' || r == '_' { - rest = rest[size:] - continue + default: + // TODO predicate registry-aware lookup on module.cue-declared CUE version? + if l.cfg.Registry != "" { + var err error + absDir, err = l.externalPackageDir(p) + if err != nil { + // TODO why can't we use %w ? + return "", name, errors.Newf(token.NoPos, "cannot get directory for external module %q: %v", p, err) + } + } else { + absDir = filepath.Join(GenPath(l.cfg.ModuleRoot), sub) } - break - } - - word = data[:len(data)-len(rest)] - if len(word) == 0 { - return nil, nil } - return word, rest + return absDir, name, err } -func cleanImports(m map[string][]token.Pos) ([]string, map[string][]token.Pos) { - all := make([]string, 0, len(m)) - for path := range m { - all = append(all, path) +func (l *loader) externalPackageDir(p importPath) (dir string, err error) { + m, subPath, ok := l.deps.lookup(p) + if !ok { + return "", fmt.Errorf("no dependency found for import path %q", p) } - sort.Strings(all) - return all, m -} -// isLocalImport reports whether the import path is -// a local import path, like ".", "..", "./foo", or "../foo". -func isLocalImport(path string) bool { - return path == "." || path == ".." || - strings.HasPrefix(path, "./") || strings.HasPrefix(path, "../") + dir, err = l.regClient.getModContents(m) + if err != nil { + return "", fmt.Errorf("cannot get contents for %v: %v", m, err) + } + return filepath.Join(dir, filepath.FromSlash(subPath)), nil } diff --git a/vendor/cuelang.org/go/cue/load/instances.go b/vendor/cuelang.org/go/cue/load/instances.go new file mode 100644 index 00000000..f4c0de91 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/instances.go @@ -0,0 +1,137 @@ +// Copyright 2018 The CUE Authors +// +// 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. + +package load + +// Files in package are to a large extent based on Go files from the following +// Go packages: +// - cmd/go/internal/load +// - go/build + +import ( + "os" + + "cuelang.org/go/cue/ast" + "cuelang.org/go/cue/build" + "cuelang.org/go/internal/filetypes" + + // Trigger the unconditional loading of all core builtin packages if load + // is used. This was deemed the simplest way to avoid having to import + // this line explicitly, and thus breaking existing code, for the majority + // of cases, while not introducing an import cycle. + _ "cuelang.org/go/pkg" +) + +// Instances returns the instances named by the command line arguments 'args'. +// If errors occur trying to load an instance it is returned with Incomplete +// set. Errors directly related to loading the instance are recorded in this +// instance, but errors that occur loading dependencies are recorded in these +// dependencies. +func Instances(args []string, c *Config) []*build.Instance { + if c == nil { + c = &Config{} + } + newC, err := c.complete() + if err != nil { + return []*build.Instance{c.newErrInstance(err)} + } + c = newC + // TODO use predictable location + var deps *dependencies + var regClient *registryClient + if c.Registry != "" { + // TODO use configured cache directory. + tmpDir, err := os.MkdirTemp("", "cue-load-") + if err != nil { + return []*build.Instance{c.newErrInstance(err)} + } + regClient = newRegistryClient(c.Registry, tmpDir) + deps1, err := resolveDependencies(c.modFile, regClient) + if err != nil { + return []*build.Instance{c.newErrInstance(err)} + } + deps = deps1 + } + tg := newTagger(c) + l := newLoader(c, tg, deps, regClient) + + if c.Context == nil { + c.Context = build.NewContext( + build.Loader(l.buildLoadFunc()), + build.ParseFile(c.ParseFile), + ) + } + + // TODO: require packages to be placed before files. At some point this + // could be relaxed. + i := 0 + for ; i < len(args) && filetypes.IsPackage(args[i]); i++ { + } + + a := []*build.Instance{} + + if len(args) == 0 || i > 0 { + for _, m := range l.importPaths(args[:i]) { + if m.Err != nil { + inst := c.newErrInstance(m.Err) + a = append(a, inst) + continue + } + a = append(a, m.Pkgs...) + } + } + + if args = args[i:]; len(args) > 0 { + files, err := filetypes.ParseArgs(args) + if err != nil { + return []*build.Instance{c.newErrInstance(err)} + } + a = append(a, l.cueFilesPackage(files)) + } + + for _, p := range a { + tags, err := findTags(p) + if err != nil { + p.ReportError(err) + } + tg.tags = append(tg.tags, tags...) + } + + // TODO(api): have API call that returns an error which is the aggregate + // of all build errors. Certain errors, like these, hold across builds. + if err := tg.injectTags(c.Tags); err != nil { + for _, p := range a { + p.ReportError(err) + } + return a + } + + if tg.replacements == nil { + return a + } + + for _, p := range a { + for _, f := range p.Files { + ast.Walk(f, nil, func(n ast.Node) { + if ident, ok := n.(*ast.Ident); ok { + if v, ok := tg.replacements[ident.Node]; ok { + ident.Node = v + } + } + }) + } + } + + return a +} diff --git a/vendor/cuelang.org/go/cue/load/internal/mvs/errors.go b/vendor/cuelang.org/go/cue/load/internal/mvs/errors.go new file mode 100644 index 00000000..bf183cea --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/mvs/errors.go @@ -0,0 +1,103 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mvs + +import ( + "fmt" + "strings" + + "golang.org/x/mod/module" +) + +// BuildListError decorates an error that occurred gathering requirements +// while constructing a build list. BuildListError prints the chain +// of requirements to the module where the error occurred. +type BuildListError struct { + Err error + stack []buildListErrorElem +} + +type buildListErrorElem struct { + m module.Version + + // nextReason is the reason this module depends on the next module in the + // stack. Typically either "requires", or "updating to". + nextReason string +} + +// NewBuildListError returns a new BuildListError wrapping an error that +// occurred at a module found along the given path of requirements and/or +// upgrades, which must be non-empty. +// +// The isVersionChange function reports whether a path step is due to an +// explicit upgrade or downgrade (as opposed to an existing requirement in a +// go.mod file). A nil isVersionChange function indicates that none of the path +// steps are due to explicit version changes. +func NewBuildListError(err error, path []module.Version, isVersionChange func(from, to module.Version) bool) *BuildListError { + stack := make([]buildListErrorElem, 0, len(path)) + for len(path) > 1 { + reason := "requires" + if isVersionChange != nil && isVersionChange(path[0], path[1]) { + reason = "updating to" + } + stack = append(stack, buildListErrorElem{ + m: path[0], + nextReason: reason, + }) + path = path[1:] + } + stack = append(stack, buildListErrorElem{m: path[0]}) + + return &BuildListError{ + Err: err, + stack: stack, + } +} + +// Module returns the module where the error occurred. If the module stack +// is empty, this returns a zero value. +func (e *BuildListError) Module() module.Version { + if len(e.stack) == 0 { + return module.Version{} + } + return e.stack[len(e.stack)-1].m +} + +func (e *BuildListError) Error() string { + b := &strings.Builder{} + stack := e.stack + + // Don't print modules at the beginning of the chain without a + // version. These always seem to be the main module or a + // synthetic module ("target@"). + for len(stack) > 0 && stack[0].m.Version == "" { + stack = stack[1:] + } + + if len(stack) == 0 { + b.WriteString(e.Err.Error()) + } else { + for _, elem := range stack[:len(stack)-1] { + fmt.Fprintf(b, "%s %s\n\t", elem.m, elem.nextReason) + } + // Ensure that the final module path and version are included as part of the + // error message. + m := stack[len(stack)-1].m + if mErr, ok := e.Err.(*module.ModuleError); ok { + actual := module.Version{Path: mErr.Path, Version: mErr.Version} + if v, ok := mErr.Err.(*module.InvalidVersionError); ok { + actual.Version = v.Version + } + if actual == m { + fmt.Fprintf(b, "%v", e.Err) + } else { + fmt.Fprintf(b, "%s (replaced by %s): %v", m, actual, mErr.Err) + } + } else { + fmt.Fprintf(b, "%v", module.VersionError(m, e.Err)) + } + } + return b.String() +} diff --git a/vendor/cuelang.org/go/cue/load/internal/mvs/graph.go b/vendor/cuelang.org/go/cue/load/internal/mvs/graph.go new file mode 100644 index 00000000..364a5b1d --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/mvs/graph.go @@ -0,0 +1,225 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mvs + +import ( + "fmt" + + "cuelang.org/go/cue/load/internal/slices" + + "golang.org/x/mod/module" +) + +// Graph implements an incremental version of the MVS algorithm, with the +// requirements pushed by the caller instead of pulled by the MVS traversal. +type Graph struct { + cmp func(v1, v2 string) int + roots []module.Version + + required map[module.Version][]module.Version + + isRoot map[module.Version]bool // contains true for roots and false for reachable non-roots + selected map[string]string // path → version +} + +// NewGraph returns an incremental MVS graph containing only a set of root +// dependencies and using the given max function for version strings. +// +// The caller must ensure that the root slice is not modified while the Graph +// may be in use. +func NewGraph(cmp func(v1, v2 string) int, roots []module.Version) *Graph { + g := &Graph{ + cmp: cmp, + roots: slices.Clip(roots), + required: make(map[module.Version][]module.Version), + isRoot: make(map[module.Version]bool), + selected: make(map[string]string), + } + + for _, m := range roots { + g.isRoot[m] = true + if g.cmp(g.Selected(m.Path), m.Version) < 0 { + g.selected[m.Path] = m.Version + } + } + + return g +} + +// Require adds the information that module m requires all modules in reqs. +// The reqs slice must not be modified after it is passed to Require. +// +// m must be reachable by some existing chain of requirements from g's target, +// and Require must not have been called for it already. +// +// If any of the modules in reqs has the same path as g's target, +// the target must have higher precedence than the version in req. +func (g *Graph) Require(m module.Version, reqs []module.Version) { + // To help catch disconnected-graph bugs, enforce that all required versions + // are actually reachable from the roots (and therefore should affect the + // selected versions of the modules they name). + if _, reachable := g.isRoot[m]; !reachable { + panic(fmt.Sprintf("%v is not reachable from any root", m)) + } + + // Truncate reqs to its capacity to avoid aliasing bugs if it is later + // returned from RequiredBy and appended to. + reqs = slices.Clip(reqs) + + if _, dup := g.required[m]; dup { + panic(fmt.Sprintf("requirements of %v have already been set", m)) + } + g.required[m] = reqs + + for _, dep := range reqs { + // Mark dep reachable, regardless of whether it is selected. + if _, ok := g.isRoot[dep]; !ok { + g.isRoot[dep] = false + } + + if g.cmp(g.Selected(dep.Path), dep.Version) < 0 { + g.selected[dep.Path] = dep.Version + } + } +} + +// RequiredBy returns the slice of requirements passed to Require for m, if any, +// with its capacity reduced to its length. +// If Require has not been called for m, RequiredBy(m) returns ok=false. +// +// The caller must not modify the returned slice, but may safely append to it +// and may rely on it not to be modified. +func (g *Graph) RequiredBy(m module.Version) (reqs []module.Version, ok bool) { + reqs, ok = g.required[m] + return reqs, ok +} + +// Selected returns the selected version of the given module path. +// +// If no version is selected, Selected returns version "none". +func (g *Graph) Selected(path string) (version string) { + v, ok := g.selected[path] + if !ok { + return "none" + } + return v +} + +// BuildList returns the selected versions of all modules present in the Graph, +// beginning with the selected versions of each module path in the roots of g. +// +// The order of the remaining elements in the list is deterministic +// but arbitrary. +func (g *Graph) BuildList() []module.Version { + seenRoot := make(map[string]bool, len(g.roots)) + + var list []module.Version + for _, r := range g.roots { + if seenRoot[r.Path] { + // Multiple copies of the same root, with the same or different versions, + // are a bit of a degenerate case: we will take the transitive + // requirements of both roots into account, but only the higher one can + // possibly be selected. However — especially given that we need the + // seenRoot map for later anyway — it is simpler to support this + // degenerate case than to forbid it. + continue + } + + if v := g.Selected(r.Path); v != "none" { + list = append(list, module.Version{Path: r.Path, Version: v}) + } + seenRoot[r.Path] = true + } + uniqueRoots := list + + for path, version := range g.selected { + if !seenRoot[path] { + list = append(list, module.Version{Path: path, Version: version}) + } + } + module.Sort(list[len(uniqueRoots):]) + + return list +} + +// WalkBreadthFirst invokes f once, in breadth-first order, for each module +// version other than "none" that appears in the graph, regardless of whether +// that version is selected. +func (g *Graph) WalkBreadthFirst(f func(m module.Version)) { + var queue []module.Version + enqueued := make(map[module.Version]bool) + for _, m := range g.roots { + if m.Version != "none" { + queue = append(queue, m) + enqueued[m] = true + } + } + + for len(queue) > 0 { + m := queue[0] + queue = queue[1:] + + f(m) + + reqs, _ := g.RequiredBy(m) + for _, r := range reqs { + if !enqueued[r] && r.Version != "none" { + queue = append(queue, r) + enqueued[r] = true + } + } + } +} + +// FindPath reports a shortest requirement path starting at one of the roots of +// the graph and ending at a module version m for which f(m) returns true, or +// nil if no such path exists. +func (g *Graph) FindPath(f func(module.Version) bool) []module.Version { + // firstRequires[a] = b means that in a breadth-first traversal of the + // requirement graph, the module version a was first required by b. + firstRequires := make(map[module.Version]module.Version) + + queue := g.roots + for _, m := range g.roots { + firstRequires[m] = module.Version{} + } + + for len(queue) > 0 { + m := queue[0] + queue = queue[1:] + + if f(m) { + // Construct the path reversed (because we're starting from the far + // endpoint), then reverse it. + path := []module.Version{m} + for { + m = firstRequires[m] + if m.Path == "" { + break + } + path = append(path, m) + } + + i, j := 0, len(path)-1 + for i < j { + path[i], path[j] = path[j], path[i] + i++ + j-- + } + + return path + } + + reqs, _ := g.RequiredBy(m) + for _, r := range reqs { + if _, seen := firstRequires[r]; !seen { + queue = append(queue, r) + firstRequires[r] = m + } + } + } + + return nil +} diff --git a/vendor/cuelang.org/go/cue/load/internal/mvs/mvs.go b/vendor/cuelang.org/go/cue/load/internal/mvs/mvs.go new file mode 100644 index 00000000..cdc04a2f --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/mvs/mvs.go @@ -0,0 +1,487 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package mvs implements Minimal Version Selection. +// See https://research.swtch.com/vgo-mvs. +package mvs + +import ( + "fmt" + "reflect" + "sort" + "sync" + + "cuelang.org/go/cue/load/internal/par" + + "golang.org/x/mod/module" +) + +// A Reqs is the requirement graph on which Minimal Version Selection (MVS) operates. +// +// The version strings are opaque except for the special version "none" +// (see the documentation for module.Version). In particular, MVS does not +// assume that the version strings are semantic versions; instead, the Max method +// gives access to the comparison operation. +// +// It must be safe to call methods on a Reqs from multiple goroutines simultaneously. +// Because a Reqs may read the underlying graph from the network on demand, +// the MVS algorithms parallelize the traversal to overlap network delays. +type Reqs interface { + // Required returns the module versions explicitly required by m itself. + // The caller must not modify the returned list. + Required(m module.Version) ([]module.Version, error) + + // Max returns the maximum of v1 and v2 (it returns either v1 or v2). + // + // For all versions v, Max(v, "none") must be v, + // and for the target passed as the first argument to MVS functions, + // Max(target, v) must be target. + // + // Note that v1 < v2 can be written Max(v1, v2) != v1 + // and similarly v1 <= v2 can be written Max(v1, v2) == v2. + Max(v1, v2 string) string +} + +// An UpgradeReqs is a Reqs that can also identify available upgrades. +type UpgradeReqs interface { + Reqs + + // Upgrade returns the upgraded version of m, + // for use during an UpgradeAll operation. + // If m should be kept as is, Upgrade returns m. + // If m is not yet used in the build, then m.Version will be "none". + // More typically, m.Version will be the version required + // by some other module in the build. + // + // If no module version is available for the given path, + // Upgrade returns a non-nil error. + // TODO(rsc): Upgrade must be able to return errors, + // but should "no latest version" just return m instead? + Upgrade(m module.Version) (module.Version, error) +} + +// A DowngradeReqs is a Reqs that can also identify available downgrades. +type DowngradeReqs interface { + Reqs + + // Previous returns the version of m.Path immediately prior to m.Version, + // or "none" if no such version is known. + Previous(m module.Version) (module.Version, error) +} + +// BuildList returns the build list for the target module. +// +// target is the root vertex of a module requirement graph. For cmd/go, this is +// typically the main module, but note that this algorithm is not intended to +// be Go-specific: module paths and versions are treated as opaque values. +// +// reqs describes the module requirement graph and provides an opaque method +// for comparing versions. +// +// BuildList traverses the graph and returns a list containing the highest +// version for each visited module. The first element of the returned list is +// target itself; reqs.Max requires target.Version to compare higher than all +// other versions, so no other version can be selected. The remaining elements +// of the list are sorted by path. +// +// See https://research.swtch.com/vgo-mvs for details. +func BuildList(targets []module.Version, reqs Reqs) ([]module.Version, error) { + return buildList(targets, reqs, nil) +} + +func buildList(targets []module.Version, reqs Reqs, upgrade func(module.Version) (module.Version, error)) ([]module.Version, error) { + cmp := func(v1, v2 string) int { + if reqs.Max(v1, v2) != v1 { + return -1 + } + if reqs.Max(v2, v1) != v2 { + return 1 + } + return 0 + } + + var ( + mu sync.Mutex + g = NewGraph(cmp, targets) + upgrades = map[module.Version]module.Version{} + errs = map[module.Version]error{} // (non-nil errors only) + ) + + // Explore work graph in parallel in case reqs.Required + // does high-latency network operations. + var work par.Work[module.Version] + for _, target := range targets { + work.Add(target) + } + work.Do(10, func(m module.Version) { + + var required []module.Version + var err error + if m.Version != "none" { + required, err = reqs.Required(m) + } + + u := m + if upgrade != nil { + upgradeTo, upErr := upgrade(m) + if upErr == nil { + u = upgradeTo + } else if err == nil { + err = upErr + } + } + + mu.Lock() + if err != nil { + errs[m] = err + } + if u != m { + upgrades[m] = u + required = append([]module.Version{u}, required...) + } + g.Require(m, required) + mu.Unlock() + + for _, r := range required { + work.Add(r) + } + }) + + // If there was an error, find the shortest path from the target to the + // node where the error occurred so we can report a useful error message. + if len(errs) > 0 { + errPath := g.FindPath(func(m module.Version) bool { + return errs[m] != nil + }) + if len(errPath) == 0 { + panic("internal error: could not reconstruct path to module with error") + } + + err := errs[errPath[len(errPath)-1]] + isUpgrade := func(from, to module.Version) bool { + if u, ok := upgrades[from]; ok { + return u == to + } + return false + } + return nil, NewBuildListError(err, errPath, isUpgrade) + } + + // The final list is the minimum version of each module found in the graph. + list := g.BuildList() + if vs := list[:len(targets)]; !reflect.DeepEqual(vs, targets) { + // target.Version will be "" for modload, the main client of MVS. + // "" denotes the main module, which has no version. However, MVS treats + // version strings as opaque, so "" is not a special value here. + // See golang.org/issue/31491, golang.org/issue/29773. + panic(fmt.Sprintf("mistake: chose versions %+v instead of targets %+v", vs, targets)) + } + return list, nil +} + +// Req returns the minimal requirement list for the target module, +// with the constraint that all module paths listed in base must +// appear in the returned list. +func Req(mainModule module.Version, base []string, reqs Reqs) ([]module.Version, error) { + list, err := BuildList([]module.Version{mainModule}, reqs) + if err != nil { + return nil, err + } + + // Note: Not running in parallel because we assume + // that list came from a previous operation that paged + // in all the requirements, so there's no I/O to overlap now. + + max := map[string]string{} + for _, m := range list { + max[m.Path] = m.Version + } + + // Compute postorder, cache requirements. + var postorder []module.Version + reqCache := map[module.Version][]module.Version{} + reqCache[mainModule] = nil + + var walk func(module.Version) error + walk = func(m module.Version) error { + _, ok := reqCache[m] + if ok { + return nil + } + required, err := reqs.Required(m) + if err != nil { + return err + } + reqCache[m] = required + for _, m1 := range required { + if err := walk(m1); err != nil { + return err + } + } + postorder = append(postorder, m) + return nil + } + for _, m := range list { + if err := walk(m); err != nil { + return nil, err + } + } + + // Walk modules in reverse post-order, only adding those not implied already. + have := map[module.Version]bool{} + walk = func(m module.Version) error { + if have[m] { + return nil + } + have[m] = true + for _, m1 := range reqCache[m] { + walk(m1) + } + return nil + } + // First walk the base modules that must be listed. + var min []module.Version + haveBase := map[string]bool{} + for _, path := range base { + if haveBase[path] { + continue + } + m := module.Version{Path: path, Version: max[path]} + min = append(min, m) + walk(m) + haveBase[path] = true + } + // Now the reverse postorder to bring in anything else. + for i := len(postorder) - 1; i >= 0; i-- { + m := postorder[i] + if max[m.Path] != m.Version { + // Older version. + continue + } + if !have[m] { + min = append(min, m) + walk(m) + } + } + sort.Slice(min, func(i, j int) bool { + return min[i].Path < min[j].Path + }) + return min, nil +} + +// UpgradeAll returns a build list for the target module +// in which every module is upgraded to its latest version. +func UpgradeAll(target module.Version, reqs UpgradeReqs) ([]module.Version, error) { + return buildList([]module.Version{target}, reqs, func(m module.Version) (module.Version, error) { + if m.Path == target.Path { + return target, nil + } + + return reqs.Upgrade(m) + }) +} + +// Upgrade returns a build list for the target module +// in which the given additional modules are upgraded. +func Upgrade(target module.Version, reqs UpgradeReqs, upgrade ...module.Version) ([]module.Version, error) { + list, err := reqs.Required(target) + if err != nil { + return nil, err + } + + pathInList := make(map[string]bool, len(list)) + for _, m := range list { + pathInList[m.Path] = true + } + list = append([]module.Version(nil), list...) + + upgradeTo := make(map[string]string, len(upgrade)) + for _, u := range upgrade { + if !pathInList[u.Path] { + list = append(list, module.Version{Path: u.Path, Version: "none"}) + } + if prev, dup := upgradeTo[u.Path]; dup { + upgradeTo[u.Path] = reqs.Max(prev, u.Version) + } else { + upgradeTo[u.Path] = u.Version + } + } + + return buildList([]module.Version{target}, &override{target, list, reqs}, func(m module.Version) (module.Version, error) { + if v, ok := upgradeTo[m.Path]; ok { + return module.Version{Path: m.Path, Version: v}, nil + } + return m, nil + }) +} + +// Downgrade returns a build list for the target module +// in which the given additional modules are downgraded, +// potentially overriding the requirements of the target. +// +// The versions to be downgraded may be unreachable from reqs.Latest and +// reqs.Previous, but the methods of reqs must otherwise handle such versions +// correctly. +func Downgrade(target module.Version, reqs DowngradeReqs, downgrade ...module.Version) ([]module.Version, error) { + // Per https://research.swtch.com/vgo-mvs#algorithm_4: + // “To avoid an unnecessary downgrade to E 1.1, we must also add a new + // requirement on E 1.2. We can apply Algorithm R to find the minimal set of + // new requirements to write to go.mod.” + // + // In order to generate those new requirements, we need to identify versions + // for every module in the build list — not just reqs.Required(target). + list, err := BuildList([]module.Version{target}, reqs) + if err != nil { + return nil, err + } + list = list[1:] // remove target + + max := make(map[string]string) + for _, r := range list { + max[r.Path] = r.Version + } + for _, d := range downgrade { + if v, ok := max[d.Path]; !ok || reqs.Max(v, d.Version) != d.Version { + max[d.Path] = d.Version + } + } + + var ( + added = make(map[module.Version]bool) + rdeps = make(map[module.Version][]module.Version) + excluded = make(map[module.Version]bool) + ) + var exclude func(module.Version) + exclude = func(m module.Version) { + if excluded[m] { + return + } + excluded[m] = true + for _, p := range rdeps[m] { + exclude(p) + } + } + var add func(module.Version) + add = func(m module.Version) { + if added[m] { + return + } + added[m] = true + if v, ok := max[m.Path]; ok && reqs.Max(m.Version, v) != v { + // m would upgrade an existing dependency — it is not a strict downgrade, + // and because it was already present as a dependency, it could affect the + // behavior of other relevant packages. + exclude(m) + return + } + list, err := reqs.Required(m) + if err != nil { + // If we can't load the requirements, we couldn't load the go.mod file. + // There are a number of reasons this can happen, but this usually + // means an older version of the module had a missing or invalid + // go.mod file. For example, if example.com/mod released v2.0.0 before + // migrating to modules (v2.0.0+incompatible), then added a valid go.mod + // in v2.0.1, downgrading from v2.0.1 would cause this error. + // + // TODO(golang.org/issue/31730, golang.org/issue/30134): if the error + // is transient (we couldn't download go.mod), return the error from + // Downgrade. Currently, we can't tell what kind of error it is. + exclude(m) + return + } + for _, r := range list { + add(r) + if excluded[r] { + exclude(m) + return + } + rdeps[r] = append(rdeps[r], m) + } + } + + downgraded := make([]module.Version, 0, len(list)+1) + downgraded = append(downgraded, target) +List: + for _, r := range list { + add(r) + for excluded[r] { + p, err := reqs.Previous(r) + if err != nil { + // This is likely a transient error reaching the repository, + // rather than a permanent error with the retrieved version. + // + // TODO(golang.org/issue/31730, golang.org/issue/30134): + // decode what to do based on the actual error. + return nil, err + } + // If the target version is a pseudo-version, it may not be + // included when iterating over prior versions using reqs.Previous. + // Insert it into the right place in the iteration. + // If v is excluded, p should be returned again by reqs.Previous on the next iteration. + if v := max[r.Path]; reqs.Max(v, r.Version) != v && reqs.Max(p.Version, v) != p.Version { + p.Version = v + } + if p.Version == "none" { + continue List + } + add(p) + r = p + } + downgraded = append(downgraded, r) + } + + // The downgrades we computed above only downgrade to versions enumerated by + // reqs.Previous. However, reqs.Previous omits some versions — such as + // pseudo-versions and retracted versions — that may be selected as transitive + // requirements of other modules. + // + // If one of those requirements pulls the version back up above the version + // identified by reqs.Previous, then the transitive dependencies of that + // initially-downgraded version should no longer matter — in particular, we + // should not add new dependencies on module paths that nothing else in the + // updated module graph even requires. + // + // In order to eliminate those spurious dependencies, we recompute the build + // list with the actual versions of the downgraded modules as selected by MVS, + // instead of our initial downgrades. + // (See the downhiddenartifact and downhiddencross test cases). + actual, err := BuildList([]module.Version{target}, &override{ + target: target, + list: downgraded, + Reqs: reqs, + }) + if err != nil { + return nil, err + } + actualVersion := make(map[string]string, len(actual)) + for _, m := range actual { + actualVersion[m.Path] = m.Version + } + + downgraded = downgraded[:0] + for _, m := range list { + if v, ok := actualVersion[m.Path]; ok { + downgraded = append(downgraded, module.Version{Path: m.Path, Version: v}) + } + } + + return BuildList([]module.Version{target}, &override{ + target: target, + list: downgraded, + Reqs: reqs, + }) +} + +type override struct { + target module.Version + list []module.Version + Reqs +} + +func (r *override) Required(m module.Version) ([]module.Version, error) { + if m == r.target { + return r.list, nil + } + return r.Reqs.Required(m) +} diff --git a/vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.18.go b/vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.18.go new file mode 100644 index 00000000..0bfc2a46 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.18.go @@ -0,0 +1,30 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.19 + +package par + +import "sync/atomic" + +// atomicBool implements the atomic.Bool type for Go versions before go +// 1.19. It's a copy of the relevant parts of the Go 1.19 atomic.Bool +// code as of commit a4d5fbc3a48b63f19fcd2a4d040a85c75a2709b5. +type atomicBool struct { + v uint32 +} + +// Load atomically loads and returns the value stored in x. +func (x *atomicBool) Load() bool { return atomic.LoadUint32(&x.v) != 0 } + +// Store atomically stores val into x. +func (x *atomicBool) Store(val bool) { atomic.StoreUint32(&x.v, b32(val)) } + +// b32 returns a uint32 0 or 1 representing b. +func b32(b bool) uint32 { + if b { + return 1 + } + return 0 +} diff --git a/vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.19.go b/vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.19.go new file mode 100644 index 00000000..48fdb8aa --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/par/atomic_go1.19.go @@ -0,0 +1,11 @@ +//go:build go1.19 + +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package par + +import "sync/atomic" + +type atomicBool = atomic.Bool diff --git a/vendor/cuelang.org/go/cue/load/internal/par/queue.go b/vendor/cuelang.org/go/cue/load/internal/par/queue.go new file mode 100644 index 00000000..180bc75e --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/par/queue.go @@ -0,0 +1,88 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package par + +import "fmt" + +// Queue manages a set of work items to be executed in parallel. The number of +// active work items is limited, and excess items are queued sequentially. +type Queue struct { + maxActive int + st chan queueState +} + +type queueState struct { + active int // number of goroutines processing work; always nonzero when len(backlog) > 0 + backlog []func() + idle chan struct{} // if non-nil, closed when active becomes 0 +} + +// NewQueue returns a Queue that executes up to maxActive items in parallel. +// +// maxActive must be positive. +func NewQueue(maxActive int) *Queue { + if maxActive < 1 { + panic(fmt.Sprintf("par.NewQueue called with nonpositive limit (%d)", maxActive)) + } + + q := &Queue{ + maxActive: maxActive, + st: make(chan queueState, 1), + } + q.st <- queueState{} + return q +} + +// Add adds f as a work item in the queue. +// +// Add returns immediately, but the queue will be marked as non-idle until after +// f (and any subsequently-added work) has completed. +func (q *Queue) Add(f func()) { + st := <-q.st + if st.active == q.maxActive { + st.backlog = append(st.backlog, f) + q.st <- st + return + } + if st.active == 0 { + // Mark q as non-idle. + st.idle = nil + } + st.active++ + q.st <- st + + go func() { + for { + f() + + st := <-q.st + if len(st.backlog) == 0 { + if st.active--; st.active == 0 && st.idle != nil { + close(st.idle) + } + q.st <- st + return + } + f, st.backlog = st.backlog[0], st.backlog[1:] + q.st <- st + } + }() +} + +// Idle returns a channel that will be closed when q has no (active or enqueued) +// work outstanding. +func (q *Queue) Idle() <-chan struct{} { + st := <-q.st + defer func() { q.st <- st }() + + if st.idle == nil { + st.idle = make(chan struct{}) + if st.active == 0 { + close(st.idle) + } + } + + return st.idle +} diff --git a/vendor/cuelang.org/go/cue/load/internal/par/work.go b/vendor/cuelang.org/go/cue/load/internal/par/work.go new file mode 100644 index 00000000..e36084c0 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/par/work.go @@ -0,0 +1,222 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package par implements parallel execution helpers. +package par + +import ( + "errors" + "math/rand" + "sync" +) + +// Work manages a set of work items to be executed in parallel, at most once each. +// The items in the set must all be valid map keys. +type Work[T comparable] struct { + f func(T) // function to run for each item + running int // total number of runners + + mu sync.Mutex + added map[T]bool // items added to set + todo []T // items yet to be run + wait sync.Cond // wait when todo is empty + waiting int // number of runners waiting for todo +} + +func (w *Work[T]) init() { + if w.added == nil { + w.added = make(map[T]bool) + } +} + +// Add adds item to the work set, if it hasn't already been added. +func (w *Work[T]) Add(item T) { + w.mu.Lock() + w.init() + if !w.added[item] { + w.added[item] = true + w.todo = append(w.todo, item) + if w.waiting > 0 { + w.wait.Signal() + } + } + w.mu.Unlock() +} + +// Do runs f in parallel on items from the work set, +// with at most n invocations of f running at a time. +// It returns when everything added to the work set has been processed. +// At least one item should have been added to the work set +// before calling Do (or else Do returns immediately), +// but it is allowed for f(item) to add new items to the set. +// Do should only be used once on a given Work. +func (w *Work[T]) Do(n int, f func(item T)) { + if n < 1 { + panic("par.Work.Do: n < 1") + } + if w.running >= 1 { + panic("par.Work.Do: already called Do") + } + + w.running = n + w.f = f + w.wait.L = &w.mu + + for i := 0; i < n-1; i++ { + go w.runner() + } + w.runner() +} + +// runner executes work in w until both nothing is left to do +// and all the runners are waiting for work. +// (Then all the runners return.) +func (w *Work[T]) runner() { + for { + // Wait for something to do. + w.mu.Lock() + for len(w.todo) == 0 { + w.waiting++ + if w.waiting == w.running { + // All done. + w.wait.Broadcast() + w.mu.Unlock() + return + } + w.wait.Wait() + w.waiting-- + } + + // Pick something to do at random, + // to eliminate pathological contention + // in case items added at about the same time + // are most likely to contend. + i := rand.Intn(len(w.todo)) + item := w.todo[i] + w.todo[i] = w.todo[len(w.todo)-1] + w.todo = w.todo[:len(w.todo)-1] + w.mu.Unlock() + + w.f(item) + } +} + +// ErrCache is like Cache except that it also stores +// an error value alongside the cached value V. +type ErrCache[K comparable, V any] struct { + Cache[K, errValue[V]] +} + +type errValue[V any] struct { + v V + err error +} + +func (c *ErrCache[K, V]) Do(key K, f func() (V, error)) (V, error) { + v := c.Cache.Do(key, func() errValue[V] { + v, err := f() + return errValue[V]{v, err} + }) + return v.v, v.err +} + +var ErrCacheEntryNotFound = errors.New("cache entry not found") + +// Get returns the cached result associated with key. +// It returns ErrCacheEntryNotFound if there is no such result. +func (c *ErrCache[K, V]) Get(key K) (V, error) { + v, ok := c.Cache.Get(key) + if !ok { + v.err = ErrCacheEntryNotFound + } + return v.v, v.err +} + +// Cache runs an action once per key and caches the result. +type Cache[K comparable, V any] struct { + m sync.Map +} + +type cacheEntry[V any] struct { + done atomicBool + mu sync.Mutex + result V +} + +// Do calls the function f if and only if Do is being called for the first time with this key. +// No call to Do with a given key returns until the one call to f returns. +// Do returns the value returned by the one call to f. +func (c *Cache[K, V]) Do(key K, f func() V) V { + entryIface, ok := c.m.Load(key) + if !ok { + entryIface, _ = c.m.LoadOrStore(key, new(cacheEntry[V])) + } + e := entryIface.(*cacheEntry[V]) + if !e.done.Load() { + e.mu.Lock() + if !e.done.Load() { + e.result = f() + e.done.Store(true) + } + e.mu.Unlock() + } + return e.result +} + +// Get returns the cached result associated with key +// and reports whether there is such a result. +// +// If the result for key is being computed, Get does not wait for the computation to finish. +func (c *Cache[K, V]) Get(key K) (V, bool) { + entryIface, ok := c.m.Load(key) + if !ok { + return *new(V), false + } + e := entryIface.(*cacheEntry[V]) + if !e.done.Load() { + return *new(V), false + } + return e.result, true +} + +// Clear removes all entries in the cache. +// +// Concurrent calls to Get may return old values. Concurrent calls to Do +// may return old values or store results in entries that have been deleted. +// +// TODO(jayconrod): Delete this after the package cache clearing functions +// in internal/load have been removed. +func (c *Cache[K, V]) Clear() { + c.m.Range(func(key, value any) bool { + c.m.Delete(key) + return true + }) +} + +// Delete removes an entry from the map. It is safe to call Delete for an +// entry that does not exist. Delete will return quickly, even if the result +// for a key is still being computed; the computation will finish, but the +// result won't be accessible through the cache. +// +// TODO(jayconrod): Delete this after the package cache clearing functions +// in internal/load have been removed. +func (c *Cache[K, V]) Delete(key K) { + c.m.Delete(key) +} + +// DeleteIf calls pred for each key in the map. If pred returns true for a key, +// DeleteIf removes the corresponding entry. If the result for a key is +// still being computed, DeleteIf will remove the entry without waiting for +// the computation to finish. The result won't be accessible through the cache. +// +// TODO(jayconrod): Delete this after the package cache clearing functions +// in internal/load have been removed. +func (c *Cache[K, V]) DeleteIf(pred func(key K) bool) { + c.m.Range(func(key, _ any) bool { + if key := key.(K); pred(key) { + c.Delete(key) + } + return true + }) +} diff --git a/vendor/cuelang.org/go/cue/load/internal/slices/slices.go b/vendor/cuelang.org/go/cue/load/internal/slices/slices.go new file mode 100644 index 00000000..a0adcf49 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/internal/slices/slices.go @@ -0,0 +1,12 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO: Replace with slices package when it lands in standard library. + +package slices + +// Clip removes unused capacity from the slice, returning s[:len(s):len(s)]. +func Clip[S ~[]E, E any](s S) S { + return s[:len(s):len(s)] +} diff --git a/vendor/cuelang.org/go/cue/load/loader.go b/vendor/cuelang.org/go/cue/load/loader.go index 236eb9e0..e2f07523 100644 --- a/vendor/cuelang.org/go/cue/load/loader.go +++ b/vendor/cuelang.org/go/cue/load/loader.go @@ -14,22 +14,18 @@ package load -// Files in package are to a large extent based on Go files from the following +// Files in this package are to a large extent based on Go files from the following // Go packages: // - cmd/go/internal/load // - go/build import ( - pathpkg "path" "path/filepath" - "strings" - "cuelang.org/go/cue/ast" "cuelang.org/go/cue/build" "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" "cuelang.org/go/internal/encoding" - "cuelang.org/go/internal/filetypes" // Trigger the unconditional loading of all core builtin packages if load // is used. This was deemed the simplest way to avoid having to import @@ -38,106 +34,28 @@ import ( _ "cuelang.org/go/pkg" ) -// Instances returns the instances named by the command line arguments 'args'. -// If errors occur trying to load an instance it is returned with Incomplete -// set. Errors directly related to loading the instance are recorded in this -// instance, but errors that occur loading dependencies are recorded in these -// dependencies. -func Instances(args []string, c *Config) []*build.Instance { - if c == nil { - c = &Config{} - } - newC, err := c.complete() - if err != nil { - return []*build.Instance{c.newErrInstance(token.NoPos, "", err)} - } - c = newC - - l := c.loader - - // TODO: require packages to be placed before files. At some point this - // could be relaxed. - i := 0 - for ; i < len(args) && filetypes.IsPackage(args[i]); i++ { - } - - a := []*build.Instance{} - - if len(args) == 0 || i > 0 { - for _, m := range l.importPaths(args[:i]) { - if m.Err != nil { - inst := c.newErrInstance(token.NoPos, "", m.Err) - a = append(a, inst) - continue - } - a = append(a, m.Pkgs...) - } - } - - if args = args[i:]; len(args) > 0 { - files, err := filetypes.ParseArgs(args) - if err != nil { - return []*build.Instance{c.newErrInstance(token.NoPos, "", err)} - } - a = append(a, l.cueFilesPackage(files)) - } - - for _, p := range a { - tags, err := findTags(p) - if err != nil { - p.ReportError(err) - } - l.tags = append(l.tags, tags...) - } - - // TODO(api): have API call that returns an error which is the aggregate - // of all build errors. Certain errors, like these, hold across builds. - if err := injectTags(c.Tags, l); err != nil { - for _, p := range a { - p.ReportError(err) - } - return a - } - - if l.replacements == nil { - return a - } +type loader struct { + cfg *Config + tagger *tagger + stk importStack + loadFunc build.LoadFunc + deps *dependencies + regClient *registryClient +} - for _, p := range a { - for _, f := range p.Files { - ast.Walk(f, nil, func(n ast.Node) { - if ident, ok := n.(*ast.Ident); ok { - if v, ok := l.replacements[ident.Node]; ok { - ident.Node = v - } - } - }) - } +func newLoader(c *Config, tg *tagger, deps *dependencies, regClient *registryClient) *loader { + l := &loader{ + cfg: c, + tagger: tg, + deps: deps, + regClient: regClient, } - - return a + l.loadFunc = l._loadFunc + return l } -// Mode flags for loadImport and download (in get.go). -const ( - // resolveImport means that loadImport should do import path expansion. - // That is, resolveImport means that the import path came from - // a source file and has not been expanded yet to account for - // vendoring or possible module adjustment. - // Every import path should be loaded initially with resolveImport, - // and then the expanded version (for example with the /vendor/ in it) - // gets recorded as the canonical import path. At that point, future loads - // of that package must not pass resolveImport, because - // disallowVendor will reject direct use of paths containing /vendor/. - resolveImport = 1 << iota -) - -type loader struct { - cfg *Config - stk importStack - tags []*tag // tags found in files - buildTags map[string]bool - replacements map[ast.Node]ast.Node +func (l *loader) buildLoadFunc() build.LoadFunc { + return l.loadFunc } func (l *loader) abs(filename string) string { @@ -147,20 +65,22 @@ func (l *loader) abs(filename string) string { return filepath.Join(l.cfg.Dir, filename) } +func (l *loader) errPkgf(importPos []token.Pos, format string, args ...interface{}) *PackageError { + err := &PackageError{ + ImportStack: l.stk.Copy(), + Message: errors.NewMessagef(format, args...), + } + err.fillPos(l.cfg.Dir, importPos) + return err +} + // cueFilesPackage creates a package for building a collection of CUE files // (typically named on the command line). func (l *loader) cueFilesPackage(files []*build.File) *build.Instance { - pos := token.NoPos cfg := l.cfg cfg.filesMode = true // ModInit() // TODO: support modules - pkg := l.cfg.Context.NewInstance(cfg.Dir, l.loadFunc()) - - _, err := filepath.Abs(cfg.Dir) - if err != nil { - return cfg.newErrInstance(pos, toImportPath(cfg.Dir), - errors.Wrapf(err, pos, "could not convert '%s' to absolute path", cfg.Dir)) - } + pkg := l.cfg.Context.NewInstance(cfg.Dir, l.loadFunc) for _, bf := range files { f := bf.Filename @@ -172,18 +92,16 @@ func (l *loader) cueFilesPackage(files []*build.File) *build.Instance { } fi, err := cfg.fileSystem.stat(f) if err != nil { - return cfg.newErrInstance(pos, toImportPath(f), - errors.Wrapf(err, pos, "could not find file")) + return cfg.newErrInstance(errors.Wrapf(err, token.NoPos, "could not find file %v", f)) } if fi.IsDir() { - return cfg.newErrInstance(token.NoPos, toImportPath(f), - errors.Newf(pos, "file is a directory %v", f)) + return cfg.newErrInstance(errors.Newf(token.NoPos, "file is a directory %v", f)) } } - fp := newFileProcessor(cfg, pkg) + fp := newFileProcessor(cfg, pkg, l.tagger) for _, file := range files { - fp.add(pos, cfg.Dir, file, allowAnonymous) + fp.add(token.NoPos, cfg.Dir, file, allowAnonymous) } // TODO: ModImportFromFiles(files) @@ -230,29 +148,3 @@ func (l *loader) addFiles(dir string, p *build.Instance) { d.Close() } } - -func cleanImport(path string) string { - orig := path - path = pathpkg.Clean(path) - if strings.HasPrefix(orig, "./") && path != ".." && !strings.HasPrefix(path, "../") { - path = "./" + path - } - return path -} - -// An importStack is a stack of import paths, possibly with the suffix " (test)" appended. -// The import path of a test package is the import path of the corresponding -// non-test package with the suffix "_test" added. -type importStack []string - -func (s *importStack) Push(p string) { - *s = append(*s, p) -} - -func (s *importStack) Pop() { - *s = (*s)[0 : len(*s)-1] -} - -func (s *importStack) Copy() []string { - return append([]string{}, *s...) -} diff --git a/vendor/cuelang.org/go/cue/load/loader_common.go b/vendor/cuelang.org/go/cue/load/loader_common.go new file mode 100644 index 00000000..40689480 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/loader_common.go @@ -0,0 +1,618 @@ +// Copyright 2018 The CUE Authors +// +// 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. + +package load + +import ( + "bytes" + "path" + pathpkg "path" + "path/filepath" + "sort" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "cuelang.org/go/cue/ast" + "cuelang.org/go/cue/build" + "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/parser" + "cuelang.org/go/cue/token" + "cuelang.org/go/internal" +) + +// An importMode controls the behavior of the Import method. +type importMode uint + +const ( + // If findOnly is set, Import stops after locating the directory + // that should contain the sources for a package. It does not + // read any files in the directory. + findOnly importMode = 1 << iota + + // If importComment is set, parse import comments on package statements. + // Import returns an error if it finds a comment it cannot understand + // or finds conflicting comments in multiple source files. + // See golang.org/s/go14customimport for more information. + importComment + + allowAnonymous +) + +func rewriteFiles(p *build.Instance, root string, isLocal bool) { + p.Root = root + + normalizeFiles(p.BuildFiles) + normalizeFiles(p.IgnoredFiles) + normalizeFiles(p.OrphanedFiles) + normalizeFiles(p.InvalidFiles) + normalizeFiles(p.UnknownFiles) +} + +// normalizeFiles sorts the files so that files contained by a parent directory +// always come before files contained in sub-directories, and that filenames in +// the same directory are sorted lexically byte-wise, like Go's `<` operator. +func normalizeFiles(a []*build.File) { + sort.Slice(a, func(i, j int) bool { + fi := a[i].Filename + fj := a[j].Filename + ci := strings.Count(fi, string(filepath.Separator)) + cj := strings.Count(fj, string(filepath.Separator)) + if ci != cj { + return ci < cj + } + return fi < fj + }) +} + +func cleanImport(path string) string { + orig := path + path = pathpkg.Clean(path) + if strings.HasPrefix(orig, "./") && path != ".." && !strings.HasPrefix(path, "../") { + path = "./" + path + } + return path +} + +// An importStack is a stack of import paths, possibly with the suffix " (test)" appended. +// The import path of a test package is the import path of the corresponding +// non-test package with the suffix "_test" added. +type importStack []string + +func (s *importStack) Push(p string) { + *s = append(*s, p) +} + +func (s *importStack) Pop() { + *s = (*s)[0 : len(*s)-1] +} + +func (s *importStack) Copy() []string { + return append([]string{}, *s...) +} + +type fileProcessor struct { + firstFile string + firstCommentFile string + imported map[string][]token.Pos + allTags map[string]bool + allFiles bool + ignoreOther bool // ignore files from other packages + allPackages bool + + c *fileProcessorConfig + tagger *tagger + pkgs map[string]*build.Instance + pkg *build.Instance + + err errors.Error +} + +type fileProcessorConfig = Config + +func newFileProcessor(c *fileProcessorConfig, p *build.Instance, tg *tagger) *fileProcessor { + return &fileProcessor{ + imported: make(map[string][]token.Pos), + allTags: make(map[string]bool), + c: c, + pkgs: map[string]*build.Instance{"_": p}, + pkg: p, + tagger: tg, + } +} + +func countCUEFiles(c *fileProcessorConfig, p *build.Instance) int { + count := len(p.BuildFiles) + for _, f := range p.IgnoredFiles { + if c.Tools && strings.HasSuffix(f.Filename, "_tool.cue") { + count++ + } + if c.Tests && strings.HasSuffix(f.Filename, "_test.cue") { + count++ + } + } + return count +} + +func (fp *fileProcessor) finalize(p *build.Instance) errors.Error { + if fp.err != nil { + return fp.err + } + if countCUEFiles(fp.c, p) == 0 && + !fp.c.DataFiles && + (p.PkgName != "_" || !fp.allPackages) { + fp.err = errors.Append(fp.err, &NoFilesError{Package: p, ignored: len(p.IgnoredFiles) > 0}) + return fp.err + } + + for tag := range fp.allTags { + p.AllTags = append(p.AllTags, tag) + } + sort.Strings(p.AllTags) + + p.ImportPaths, _ = cleanImports(fp.imported) + + return nil +} + +func (fp *fileProcessor) add(pos token.Pos, root string, file *build.File, mode importMode) (added bool) { + fullPath := file.Filename + if fullPath != "-" { + if !filepath.IsAbs(fullPath) { + fullPath = filepath.Join(root, fullPath) + } + } + file.Filename = fullPath + + base := filepath.Base(fullPath) + + // special * and _ + p := fp.pkg // default package + + // badFile := func(p *build.Instance, err errors.Error) bool { + badFile := func(err errors.Error) bool { + fp.err = errors.Append(fp.err, err) + file.ExcludeReason = fp.err + p.InvalidFiles = append(p.InvalidFiles, file) + return true + } + + match, data, err := matchFile(fp.c, file, true, fp.allFiles, fp.allTags) + switch { + case match: + + case err == nil: + // Not a CUE file. + p.OrphanedFiles = append(p.OrphanedFiles, file) + return false + + case !errors.Is(err, errExclude): + return badFile(err) + + default: + file.ExcludeReason = err + if file.Interpretation == "" { + p.IgnoredFiles = append(p.IgnoredFiles, file) + } else { + p.OrphanedFiles = append(p.OrphanedFiles, file) + } + return false + } + + pf, perr := parser.ParseFile(fullPath, data, parser.ImportsOnly, parser.ParseComments) + if perr != nil { + badFile(errors.Promote(perr, "add failed")) + return true + } + + _, pkg, pos := internal.PackageInfo(pf) + if pkg == "" { + pkg = "_" + } + + switch { + case pkg == p.PkgName, mode&allowAnonymous != 0: + case fp.allPackages && pkg != "_": + q := fp.pkgs[pkg] + if q == nil { + q = &build.Instance{ + PkgName: pkg, + + Dir: p.Dir, + DisplayPath: p.DisplayPath, + ImportPath: p.ImportPath + ":" + pkg, + Root: p.Root, + Module: p.Module, + } + fp.pkgs[pkg] = q + } + p = q + + case pkg != "_": + + default: + file.ExcludeReason = excludeError{errors.Newf(pos, "no package name")} + p.IgnoredFiles = append(p.IgnoredFiles, file) + return false // don't mark as added + } + + if !fp.c.AllCUEFiles { + if err := shouldBuildFile(pf, fp); err != nil { + if !errors.Is(err, errExclude) { + fp.err = errors.Append(fp.err, err) + } + file.ExcludeReason = err + p.IgnoredFiles = append(p.IgnoredFiles, file) + return false + } + } + + if pkg != "" && pkg != "_" { + if p.PkgName == "" { + p.PkgName = pkg + fp.firstFile = base + } else if pkg != p.PkgName { + if fp.ignoreOther { + file.ExcludeReason = excludeError{errors.Newf(pos, + "package is %s, want %s", pkg, p.PkgName)} + p.IgnoredFiles = append(p.IgnoredFiles, file) + return false + } + return badFile(&MultiplePackageError{ + Dir: p.Dir, + Packages: []string{p.PkgName, pkg}, + Files: []string{fp.firstFile, base}, + }) + } + } + + isTest := strings.HasSuffix(base, "_test"+cueSuffix) + isTool := strings.HasSuffix(base, "_tool"+cueSuffix) + + if mode&importComment != 0 { + qcom, line := findimportComment(data) + if line != 0 { + com, err := strconv.Unquote(qcom) + if err != nil { + badFile(errors.Newf(pos, "%s:%d: cannot parse import comment", fullPath, line)) + } else if p.ImportComment == "" { + p.ImportComment = com + fp.firstCommentFile = base + } else if p.ImportComment != com { + badFile(errors.Newf(pos, "found import comments %q (%s) and %q (%s) in %s", p.ImportComment, fp.firstCommentFile, com, base, p.Dir)) + } + } + } + + for _, decl := range pf.Decls { + d, ok := decl.(*ast.ImportDecl) + if !ok { + continue + } + for _, spec := range d.Specs { + quoted := spec.Path.Value + path, err := strconv.Unquote(quoted) + if err != nil { + badFile(errors.Newf( + spec.Path.Pos(), + "%s: parser returned invalid quoted string: <%s>", fullPath, quoted, + )) + } + if !isTest || fp.c.Tests { + fp.imported[path] = append(fp.imported[path], spec.Pos()) + } + } + } + switch { + case isTest: + if fp.c.Tests { + p.BuildFiles = append(p.BuildFiles, file) + } else { + file.ExcludeReason = excludeError{errors.Newf(pos, + "_test.cue files excluded in non-test mode")} + p.IgnoredFiles = append(p.IgnoredFiles, file) + } + case isTool: + if fp.c.Tools { + p.BuildFiles = append(p.BuildFiles, file) + } else { + file.ExcludeReason = excludeError{errors.Newf(pos, + "_tool.cue files excluded in non-cmd mode")} + p.IgnoredFiles = append(p.IgnoredFiles, file) + } + default: + p.BuildFiles = append(p.BuildFiles, file) + } + return true +} + +func findimportComment(data []byte) (s string, line int) { + // expect keyword package + word, data := parseWord(data) + if string(word) != "package" { + return "", 0 + } + + // expect package name + _, data = parseWord(data) + + // now ready for import comment, a // comment + // beginning and ending on the current line. + for len(data) > 0 && (data[0] == ' ' || data[0] == '\t' || data[0] == '\r') { + data = data[1:] + } + + var comment []byte + switch { + case bytes.HasPrefix(data, slashSlash): + i := bytes.Index(data, newline) + if i < 0 { + i = len(data) + } + comment = data[2:i] + } + comment = bytes.TrimSpace(comment) + + // split comment into `import`, `"pkg"` + word, arg := parseWord(comment) + if string(word) != "import" { + return "", 0 + } + + line = 1 + bytes.Count(data[:cap(data)-cap(arg)], newline) + return strings.TrimSpace(string(arg)), line +} + +var ( + slashSlash = []byte("//") + newline = []byte("\n") +) + +// skipSpaceOrComment returns data with any leading spaces or comments removed. +func skipSpaceOrComment(data []byte) []byte { + for len(data) > 0 { + switch data[0] { + case ' ', '\t', '\r', '\n': + data = data[1:] + continue + case '/': + if bytes.HasPrefix(data, slashSlash) { + i := bytes.Index(data, newline) + if i < 0 { + return nil + } + data = data[i+1:] + continue + } + } + break + } + return data +} + +// parseWord skips any leading spaces or comments in data +// and then parses the beginning of data as an identifier or keyword, +// returning that word and what remains after the word. +func parseWord(data []byte) (word, rest []byte) { + data = skipSpaceOrComment(data) + + // Parse past leading word characters. + rest = data + for { + r, size := utf8.DecodeRune(rest) + if unicode.IsLetter(r) || '0' <= r && r <= '9' || r == '_' { + rest = rest[size:] + continue + } + break + } + + word = data[:len(data)-len(rest)] + if len(word) == 0 { + return nil, nil + } + + return word, rest +} + +func cleanImports(m map[string][]token.Pos) ([]string, map[string][]token.Pos) { + all := make([]string, 0, len(m)) + for path := range m { + all = append(all, path) + } + sort.Strings(all) + return all, m +} + +// isLocalImport reports whether the import path is +// a local import path, like ".", "..", "./foo", or "../foo". +func isLocalImport(path string) bool { + return path == "." || path == ".." || + strings.HasPrefix(path, "./") || strings.HasPrefix(path, "../") +} + +// warnUnmatched warns about patterns that didn't match any packages. +func warnUnmatched(matches []*match) { + for _, m := range matches { + if len(m.Pkgs) == 0 { + m.Err = + errors.Newf(token.NoPos, "cue: %q matched no packages\n", m.Pattern) + } + } +} + +// cleanPatterns returns the patterns to use for the given +// command line. It canonicalizes the patterns but does not +// evaluate any matches. +func cleanPatterns(patterns []string) []string { + if len(patterns) == 0 { + return []string{"."} + } + var out []string + for _, a := range patterns { + // Arguments are supposed to be import paths, but + // as a courtesy to Windows developers, rewrite \ to / + // in command-line arguments. Handles .\... and so on. + if filepath.Separator == '\\' { + a = strings.Replace(a, `\`, `/`, -1) + } + + // Put argument in canonical form, but preserve leading ./. + if strings.HasPrefix(a, "./") { + a = "./" + path.Clean(a) + if a == "./." { + a = "." + } + } else { + a = path.Clean(a) + } + out = append(out, a) + } + return out +} + +// isMetaPackage checks if name is a reserved package name that expands to multiple packages. +func isMetaPackage(name string) bool { + return name == "std" || name == "cmd" || name == "all" +} + +// hasPathPrefix reports whether the path s begins with the +// elements in prefix. +func hasPathPrefix(s, prefix string) bool { + switch { + default: + return false + case len(s) == len(prefix): + return s == prefix + case len(s) > len(prefix): + if prefix != "" && prefix[len(prefix)-1] == '/' { + return strings.HasPrefix(s, prefix) + } + return s[len(prefix)] == '/' && s[:len(prefix)] == prefix + } +} + +// hasFilepathPrefix reports whether the path s begins with the +// elements in prefix. +func hasFilepathPrefix(s, prefix string) bool { + switch { + default: + return false + case len(s) == len(prefix): + return s == prefix + case len(s) > len(prefix): + if prefix != "" && prefix[len(prefix)-1] == filepath.Separator { + return strings.HasPrefix(s, prefix) + } + return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix + } +} + +// isStandardImportPath reports whether $GOROOT/src/path should be considered +// part of the standard distribution. For historical reasons we allow people to add +// their own code to $GOROOT instead of using $GOPATH, but we assume that +// code will start with a domain name (dot in the first element). +// +// Note that this function is meant to evaluate whether a directory found in GOROOT +// should be treated as part of the standard library. It should not be used to decide +// that a directory found in GOPATH should be rejected: directories in GOPATH +// need not have dots in the first element, and they just take their chances +// with future collisions in the standard library. +func isStandardImportPath(path string) bool { + i := strings.Index(path, "/") + if i < 0 { + i = len(path) + } + elem := path[:i] + return !strings.Contains(elem, ".") +} + +// isRelativePath reports whether pattern should be interpreted as a directory +// path relative to the current directory, as opposed to a pattern matching +// import paths. +func isRelativePath(pattern string) bool { + return strings.HasPrefix(pattern, "./") || strings.HasPrefix(pattern, "../") || pattern == "." || pattern == ".." +} + +// inDir checks whether path is in the file tree rooted at dir. +// If so, inDir returns an equivalent path relative to dir. +// If not, inDir returns an empty string. +// inDir makes some effort to succeed even in the presence of symbolic links. +// TODO(rsc): Replace internal/test.inDir with a call to this function for Go 1.12. +func inDir(path, dir string) string { + if rel := inDirLex(path, dir); rel != "" { + return rel + } + xpath, err := filepath.EvalSymlinks(path) + if err != nil || xpath == path { + xpath = "" + } else { + if rel := inDirLex(xpath, dir); rel != "" { + return rel + } + } + + xdir, err := filepath.EvalSymlinks(dir) + if err == nil && xdir != dir { + if rel := inDirLex(path, xdir); rel != "" { + return rel + } + if xpath != "" { + if rel := inDirLex(xpath, xdir); rel != "" { + return rel + } + } + } + return "" +} + +// inDirLex is like inDir but only checks the lexical form of the file names. +// It does not consider symbolic links. +// TODO(rsc): This is a copy of str.HasFilePathPrefix, modified to +// return the suffix. Most uses of str.HasFilePathPrefix should probably +// be calling InDir instead. +func inDirLex(path, dir string) string { + pv := strings.ToUpper(filepath.VolumeName(path)) + dv := strings.ToUpper(filepath.VolumeName(dir)) + path = path[len(pv):] + dir = dir[len(dv):] + switch { + default: + return "" + case pv != dv: + return "" + case len(path) == len(dir): + if path == dir { + return "." + } + return "" + case dir == "": + return path + case len(path) > len(dir): + if dir[len(dir)-1] == filepath.Separator { + if path[:len(dir)] == dir { + return path[len(dir):] + } + return "" + } + if path[len(dir)] == filepath.Separator && path[:len(dir)] == dir { + if len(path) == len(dir)+1 { + return "." + } + return path[len(dir)+1:] + } + return "" + } +} diff --git a/vendor/cuelang.org/go/cue/load/match.go b/vendor/cuelang.org/go/cue/load/match.go index c58e057d..487948d0 100644 --- a/vendor/cuelang.org/go/cue/load/match.go +++ b/vendor/cuelang.org/go/cue/load/match.go @@ -15,8 +15,9 @@ package load import ( - "io/ioutil" + "io" "path/filepath" + "regexp" "strings" "cuelang.org/go/cue/build" @@ -24,6 +25,14 @@ import ( "cuelang.org/go/cue/token" ) +// A match represents the result of matching a single package pattern. +type match struct { + Pattern string // the pattern itself + Literal bool // whether it is a literal (no wildcards) + Pkgs []*build.Instance + Err errors.Error +} + var errExclude = errors.New("file rejected") type cueError = errors.Error @@ -55,7 +64,7 @@ func matchFile(cfg *Config, file *build.File, returnImports, allFiles bool, allT } if file.Filename == "-" { - b, err2 := ioutil.ReadAll(cfg.stdin()) + b, err2 := io.ReadAll(cfg.stdin()) if err2 != nil { err = errors.Newf(token.NoPos, "read stdin: %v", err) return @@ -65,15 +74,13 @@ func matchFile(cfg *Config, file *build.File, returnImports, allFiles bool, allT } name := filepath.Base(file.Filename) - if !cfg.filesMode && strings.HasPrefix(name, ".") { - return false, nil, &excludeError{ - errors.Newf(token.NoPos, "filename starts with a '.'"), - } - } - - if strings.HasPrefix(name, "_") { - return false, nil, &excludeError{ - errors.Newf(token.NoPos, "filename starts with a '_"), + if !cfg.filesMode { + for _, prefix := range []string{".", "_"} { + if strings.HasPrefix(name, prefix) { + return false, nil, &excludeError{ + errors.Newf(token.NoPos, "filename starts with a '%s'", prefix), + } + } } } @@ -91,3 +98,87 @@ func matchFile(cfg *Config, file *build.File, returnImports, allFiles bool, allT return true, data, nil } + +// treeCanMatchPattern(pattern)(name) reports whether +// name or children of name can possibly match pattern. +// Pattern is the same limited glob accepted by matchPattern. +func treeCanMatchPattern(pattern string) func(name string) bool { + wildCard := false + if i := strings.Index(pattern, "..."); i >= 0 { + wildCard = true + pattern = pattern[:i] + } + return func(name string) bool { + return len(name) <= len(pattern) && hasPathPrefix(pattern, name) || + wildCard && strings.HasPrefix(name, pattern) + } +} + +// matchPattern(pattern)(name) reports whether +// name matches pattern. Pattern is a limited glob +// pattern in which '...' means 'any string' and there +// is no other special syntax. +// Unfortunately, there are two special cases. Quoting "go help packages": +// +// First, /... at the end of the pattern can match an empty string, +// so that net/... matches both net and packages in its subdirectories, like net/http. +// Second, any slash-separted pattern element containing a wildcard never +// participates in a match of the "vendor" element in the path of a vendored +// package, so that ./... does not match packages in subdirectories of +// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. +// Note, however, that a directory named vendor that itself contains code +// is not a vendored package: cmd/vendor would be a command named vendor, +// and the pattern cmd/... matches it. +func matchPattern(pattern string) func(name string) bool { + // Convert pattern to regular expression. + // The strategy for the trailing /... is to nest it in an explicit ? expression. + // The strategy for the vendor exclusion is to change the unmatchable + // vendor strings to a disallowed code point (vendorChar) and to use + // "(anything but that codepoint)*" as the implementation of the ... wildcard. + // This is a bit complicated but the obvious alternative, + // namely a hand-written search like in most shell glob matchers, + // is too easy to make accidentally exponential. + // Using package regexp guarantees linear-time matching. + + const vendorChar = "\x00" + + if strings.Contains(pattern, vendorChar) { + return func(name string) bool { return false } + } + + re := regexp.QuoteMeta(pattern) + re = replaceVendor(re, vendorChar) + switch { + case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`): + re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)` + case re == vendorChar+`/\.\.\.`: + re = `(/vendor|/` + vendorChar + `/\.\.\.)` + case strings.HasSuffix(re, `/\.\.\.`): + re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?` + } + re = strings.Replace(re, `\.\.\.`, `[^`+vendorChar+`]*`, -1) + + reg := regexp.MustCompile(`^` + re + `$`) + + return func(name string) bool { + if strings.Contains(name, vendorChar) { + return false + } + return reg.MatchString(replaceVendor(name, vendorChar)) + } +} + +// replaceVendor returns the result of replacing +// non-trailing vendor path elements in x with repl. +func replaceVendor(x, repl string) string { + if !strings.Contains(x, "vendor") { + return x + } + elem := strings.Split(x, "/") + for i := 0; i < len(elem)-1; i++ { + if elem[i] == "vendor" { + elem[i] = repl + } + } + return strings.Join(elem, "/") +} diff --git a/vendor/cuelang.org/go/cue/load/module.go b/vendor/cuelang.org/go/cue/load/module.go new file mode 100644 index 00000000..497ccf76 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/module.go @@ -0,0 +1,179 @@ +package load + +import ( + _ "embed" + "io" + "path/filepath" + "strings" + + "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/load/internal/mvs" + "cuelang.org/go/cue/token" + "golang.org/x/mod/module" + "golang.org/x/mod/semver" +) + +//go:embed moduleschema.cue +var moduleSchema []byte + +type modFile struct { + Module string `json:"module"` + Deps map[string]*modDep +} + +// versions returns all the modules that are dependended on by +// the module file. +func (mf *modFile) versions() []module.Version { + if len(mf.Deps) == 0 { + // It's important to return nil here because otherwise the + // "mistake: chose versions" panic in mvs will trigger + // on an empty version list. + return nil + } + vs := make([]module.Version, 0, len(mf.Deps)) + for m, dep := range mf.Deps { + vs = append(vs, module.Version{ + Path: m, + Version: dep.Version, + }) + } + return vs +} + +type modDep struct { + Version string `json:"v"` +} + +// loadModule loads the module file, resolves and downloads module +// dependencies. It sets c.Module if it's empty or checks it for +// consistency with the module file otherwise. +func (c *Config) loadModule() error { + // TODO: also make this work if run from outside the module? + mod := filepath.Join(c.ModuleRoot, modDir) + info, cerr := c.fileSystem.stat(mod) + if cerr != nil { + return nil + } + // TODO remove support for legacy non-directory module.cue file + // by returning an error if info.IsDir is false. + if info.IsDir() { + mod = filepath.Join(mod, moduleFile) + } + f, cerr := c.fileSystem.openFile(mod) + if cerr != nil { + return nil + } + defer f.Close() + data, err := io.ReadAll(f) + if err != nil { + return err + } + mf, err := parseModuleFile(data, mod) + if err != nil { + return err + } + c.modFile = mf + if mf.Module == "" { + // Backward compatibility: allow empty module.cue file. + // TODO maybe check that the rest of the fields are empty too? + return nil + } + if c.Module != "" && c.Module != mf.Module { + return errors.Newf(token.NoPos, "inconsistent modules: got %q, want %q", mf.Module, c.Module) + } + c.Module = mf.Module + return nil +} + +type dependencies struct { + versions []module.Version +} + +// lookup returns the module corresponding to the given import path, and the relative path +// of the package beneath that. +// +// It assumes that modules are not nested. +func (deps *dependencies) lookup(pkgPath importPath) (v module.Version, subPath string, ok bool) { + for _, dep := range deps.versions { + if subPath, ok := isParent(importPath(dep.Path), pkgPath); ok { + return dep, subPath, true + } + } + return module.Version{}, "", false +} + +// resolveDependencies resolves all the versions of all the modules in the given module file, +// using regClient to fetch dependency information. +func resolveDependencies(mainModFile *modFile, regClient *registryClient) (*dependencies, error) { + vs, err := mvs.BuildList(mainModFile.versions(), &mvsReqs{ + mainModule: mainModFile, + regClient: regClient, + }) + if err != nil { + return nil, err + } + return &dependencies{ + versions: vs, + }, nil +} + +// mvsReqs implements mvs.Reqs by fetching information using +// regClient. +type mvsReqs struct { + mainModule *modFile + regClient *registryClient +} + +// Required implements mvs.Reqs.Required. +func (reqs *mvsReqs) Required(m module.Version) (vs []module.Version, err error) { + if m.Path == reqs.mainModule.Module { + return reqs.mainModule.versions(), nil + } + mf, err := reqs.regClient.fetchModFile(m) + if err != nil { + return nil, err + } + return mf.versions(), nil +} + +// Required implements mvs.Reqs.Max. +func (reqs *mvsReqs) Max(v1, v2 string) string { + if cmpVersion(v1, v2) < 0 { + return v2 + } + return v1 +} + +// cmpVersion implements the comparison for versions in the module loader. +// +// It is consistent with semver.Compare except that as a special case, +// the version "" is considered higher than all other versions. +// The main module (also known as the target) has no version and must be chosen +// over other versions of the same module in the module dependency graph. +func cmpVersion(v1, v2 string) int { + if v2 == "" { + if v1 == "" { + return 0 + } + return -1 + } + if v1 == "" { + return 1 + } + return semver.Compare(v1, v2) +} + +// isParent reports whether the module modPath contains the package with the given +// path, and if so, returns its relative path within that module. +func isParent(modPath, pkgPath importPath) (subPath string, ok bool) { + if !strings.HasPrefix(string(pkgPath), string(modPath)) { + return "", false + } + if len(pkgPath) == len(modPath) { + return ".", true + } + if pkgPath[len(modPath)] != '/' { + return "", false + } + return string(pkgPath[len(modPath)+1:]), true +} diff --git a/vendor/cuelang.org/go/cue/load/moduleschema.cue b/vendor/cuelang.org/go/cue/load/moduleschema.cue new file mode 100644 index 00000000..0f381f19 --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/moduleschema.cue @@ -0,0 +1,23 @@ +// module indicates the module's import path. +// For legacy reasons, we allow a missing module +// directory and an empty module directive. +module?: #Module | "" + +// deps holds dependency information for modules, keyed by module path. +deps?: [#Module]: { + // TODO numexist(<=1, replace, replaceAll) + // TODO numexist(>=1, v, exclude, replace, replaceAll) + + // v indicates the required version of the module. + // It is usually a #Semver but it can also name a branch + // of the module. cue mod tidy will rewrite such branch + // names to their canonical versions. + v?: string +} + +// #Module constraints a module path. +// TODO encode the module path rules as regexp: +// WIP: (([\-_~a-zA-Z0-9][.\-_~a-zA-Z0-9]*[\-_~a-zA-Z0-9])|([\-_~a-zA-Z0-9]))(/([\-_~a-zA-Z0-9][.\-_~a-zA-Z0-9]*[\-_~a-zA-Z0-9])|([\-_~a-zA-Z0-9]))* +#Module: =~"^[^@]+$" + +// TODO add the rest of the module schema definition. diff --git a/vendor/cuelang.org/go/cue/load/read.go b/vendor/cuelang.org/go/cue/load/read.go index 12835bdf..2861f91f 100644 --- a/vendor/cuelang.org/go/cue/load/read.go +++ b/vendor/cuelang.org/go/cue/load/read.go @@ -208,7 +208,7 @@ func (r *importReader) readImport(imports *[]string) { r.readString(imports) } -// readComments is like ioutil.ReadAll, except that it only reads the leading +// readComments is like io.ReadAll, except that it only reads the leading // block of comments in the file. func readComments(f io.Reader) ([]byte, errors.Error) { r := &importReader{b: bufio.NewReader(f)} @@ -220,7 +220,7 @@ func readComments(f io.Reader) ([]byte, errors.Error) { return r.buf, r.err } -// readImports is like ioutil.ReadAll, except that it expects a CUE file as +// readImports is like io.ReadAll, except that it expects a CUE file as // input and stops reading the input once the imports have completed. func readImports(f io.Reader, reportSyntaxError bool, imports *[]string) ([]byte, errors.Error) { r := &importReader{b: bufio.NewReader(f)} diff --git a/vendor/cuelang.org/go/cue/load/registry.go b/vendor/cuelang.org/go/cue/load/registry.go new file mode 100644 index 00000000..933e5f3d --- /dev/null +++ b/vendor/cuelang.org/go/cue/load/registry.go @@ -0,0 +1,136 @@ +package load + +import ( + "fmt" + "io" + "net/http" + "os" + "path" + "path/filepath" + + "golang.org/x/mod/module" + "golang.org/x/mod/zip" + + "cuelang.org/go/cue" + "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/parser" + "cuelang.org/go/cue/token" + "cuelang.org/go/internal/core/runtime" +) + +// registryClient implements the protocol for talking to +// the registry server. +type registryClient struct { + // TODO caching + registryURL string + cacheDir string +} + +// newRegistryClient returns a registry client that talks to +// the given base URL and stores downloaded module information +// in the given cache directory. It assumes that information +// in the registry is immutable, so if it's in the cache, a module +// will not be downloaded again. +func newRegistryClient(registryURL, cacheDir string) *registryClient { + return ®istryClient{ + registryURL: registryURL, + cacheDir: cacheDir, + } +} + +// fetchModFile returns the parsed contents of the cue.mod/module.cue file +// for the given module. +func (c *registryClient) fetchModFile(m module.Version) (*modFile, error) { + data, err := c.fetchRawModFile(m) + if err != nil { + return nil, err + } + mf, err := parseModuleFile(data, path.Join(m.Path, "cue.mod/module.cue")) + if err != nil { + return nil, err + } + return mf, nil +} + +// fetchModFile returns the contents of the cue.mod/module.cue file +// for the given module without parsing it. +func (c *registryClient) fetchRawModFile(m module.Version) ([]byte, error) { + resp, err := http.Get(c.registryURL + "/" + m.Path + "/@v/" + m.Version + ".mod") + if err != nil { + return nil, err + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("cannot get HTTP response body: %v", err) + } + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("module.cue HTTP GET request failed: %s", body) + } + return body, nil +} + +// getModContents downloads the module with the given version +// and returns the directory where it's stored. +func (c *registryClient) getModContents(m module.Version) (string, error) { + modPath := filepath.Join(c.cacheDir, fmt.Sprintf("%s@%s", m.Path, m.Version)) + if _, err := os.Stat(modPath); err == nil { + return modPath, nil + } + // TODO synchronize parallel invocations + resp, err := http.Get(c.registryURL + "/" + m.Path + "/@v/" + m.Version + ".zip") + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return "", fmt.Errorf("module.cue HTTP GET request failed: %s", body) + } + zipfile := filepath.Join(c.cacheDir, m.String()+".zip") + if err := os.MkdirAll(filepath.Dir(zipfile), 0o777); err != nil { + return "", fmt.Errorf("cannot create parent directory for zip file: %v", err) + } + f, err := os.Create(zipfile) + if err != nil { + return "", fmt.Errorf("cannot create zipfile: %v", err) + } + + defer f.Close() // TODO check error on close + if _, err := io.Copy(f, resp.Body); err != nil { + return "", fmt.Errorf("cannot copy data to zip file %q: %v", zipfile, err) + } + if err := zip.Unzip(modPath, m, zipfile); err != nil { + return "", fmt.Errorf("cannot unzip %v: %v", m, err) + } + return modPath, nil +} + +// parseModuleFile parses a cue.mod/module.cue file. +// TODO move this to be closer to the modFile type definition. +func parseModuleFile(data []byte, filename string) (*modFile, error) { + file, err := parser.ParseFile(filename, data) + if err != nil { + return nil, errors.Wrapf(err, token.NoPos, "invalid module.cue file %q", data) + } + // TODO disallow non-data-mode CUE. + + ctx := (*cue.Context)(runtime.New()) + schemav := ctx.CompileBytes(moduleSchema, cue.Filename("$cueroot/cue/load/moduleschema.cue")) + if err := schemav.Validate(); err != nil { + return nil, errors.Wrapf(err, token.NoPos, "internal error: invalid CUE module.cue schema") + } + v := ctx.BuildFile(file) + if err := v.Validate(cue.Concrete(true)); err != nil { + return nil, errors.Wrapf(err, token.NoPos, "invalid module.cue file") + } + v = v.Unify(schemav) + if err := v.Validate(); err != nil { + return nil, errors.Wrapf(err, token.NoPos, "invalid module.cue file") + } + var mf modFile + if err := v.Decode(&mf); err != nil { + return nil, errors.Wrapf(err, token.NoPos, "internal error: cannot decode into modFile struct (\nfile %q\ncontents %q\nvalue %#v\n)", filename, data, v) + } + return &mf, nil +} diff --git a/vendor/cuelang.org/go/cue/load/search.go b/vendor/cuelang.org/go/cue/load/search.go index 04a98b2e..7d1e9fbf 100644 --- a/vendor/cuelang.org/go/cue/load/search.go +++ b/vendor/cuelang.org/go/cue/load/search.go @@ -17,10 +17,9 @@ package load import ( // TODO: remove this usage - "os" + "io/fs" "path" "path/filepath" - "regexp" "strings" "cuelang.org/go/cue/build" @@ -28,14 +27,6 @@ import ( "cuelang.org/go/cue/token" ) -// A match represents the result of matching a single package pattern. -type match struct { - Pattern string // the pattern itself - Literal bool // whether it is a literal (no wildcards) - Pkgs []*build.Instance - Err errors.Error -} - // TODO: should be matched from module file only. // The pattern is either "all" (all packages), "std" (standard packages), // "cmd" (standard commands), or a path including "...". @@ -162,8 +153,8 @@ func (l *loader) matchPackagesInFS(pattern, pkgName string) *match { // TODO(legacy): remove pkgDir2 := filepath.Join(root, "pkg") - _ = c.fileSystem.walk(root, func(path string, fi os.FileInfo, err errors.Error) errors.Error { - if err != nil || !fi.IsDir() { + _ = c.fileSystem.walk(root, func(path string, entry fs.DirEntry, err errors.Error) errors.Error { + if err != nil || !entry.IsDir() { return nil } if path == pkgDir || path == pkgDir2 { @@ -197,14 +188,13 @@ func (l *loader) matchPackagesInFS(pattern, pkgName string) *match { // silently skipped as not matching the pattern. // Do not take root, as we want to stay relative // to one dir only. - dir, e := filepath.Rel(c.Dir, path) + relPath, e := filepath.Rel(c.Dir, path) if e != nil { - panic(err) - } else { - dir = "./" + dir + panic(err) // Should never happen because c.Dir is absolute. } + relPath = "./" + filepath.ToSlash(relPath) // TODO: consider not doing these checks here. - inst := c.newRelInstance(token.NoPos, dir, pkgName) + inst := l.newRelInstance(token.NoPos, relPath, pkgName) pkgs := l.importPkg(token.NoPos, inst) for _, p := range pkgs { if err := p.Err; err != nil && (p == nil || len(p.InvalidFiles) == 0) { @@ -228,100 +218,6 @@ func (l *loader) matchPackagesInFS(pattern, pkgName string) *match { return m } -// treeCanMatchPattern(pattern)(name) reports whether -// name or children of name can possibly match pattern. -// Pattern is the same limited glob accepted by matchPattern. -func treeCanMatchPattern(pattern string) func(name string) bool { - wildCard := false - if i := strings.Index(pattern, "..."); i >= 0 { - wildCard = true - pattern = pattern[:i] - } - return func(name string) bool { - return len(name) <= len(pattern) && hasPathPrefix(pattern, name) || - wildCard && strings.HasPrefix(name, pattern) - } -} - -// matchPattern(pattern)(name) reports whether -// name matches pattern. Pattern is a limited glob -// pattern in which '...' means 'any string' and there -// is no other special syntax. -// Unfortunately, there are two special cases. Quoting "go help packages": -// -// First, /... at the end of the pattern can match an empty string, -// so that net/... matches both net and packages in its subdirectories, like net/http. -// Second, any slash-separted pattern element containing a wildcard never -// participates in a match of the "vendor" element in the path of a vendored -// package, so that ./... does not match packages in subdirectories of -// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. -// Note, however, that a directory named vendor that itself contains code -// is not a vendored package: cmd/vendor would be a command named vendor, -// and the pattern cmd/... matches it. -func matchPattern(pattern string) func(name string) bool { - // Convert pattern to regular expression. - // The strategy for the trailing /... is to nest it in an explicit ? expression. - // The strategy for the vendor exclusion is to change the unmatchable - // vendor strings to a disallowed code point (vendorChar) and to use - // "(anything but that codepoint)*" as the implementation of the ... wildcard. - // This is a bit complicated but the obvious alternative, - // namely a hand-written search like in most shell glob matchers, - // is too easy to make accidentally exponential. - // Using package regexp guarantees linear-time matching. - - const vendorChar = "\x00" - - if strings.Contains(pattern, vendorChar) { - return func(name string) bool { return false } - } - - re := regexp.QuoteMeta(pattern) - re = replaceVendor(re, vendorChar) - switch { - case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`): - re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)` - case re == vendorChar+`/\.\.\.`: - re = `(/vendor|/` + vendorChar + `/\.\.\.)` - case strings.HasSuffix(re, `/\.\.\.`): - re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?` - } - re = strings.Replace(re, `\.\.\.`, `[^`+vendorChar+`]*`, -1) - - reg := regexp.MustCompile(`^` + re + `$`) - - return func(name string) bool { - if strings.Contains(name, vendorChar) { - return false - } - return reg.MatchString(replaceVendor(name, vendorChar)) - } -} - -// replaceVendor returns the result of replacing -// non-trailing vendor path elements in x with repl. -func replaceVendor(x, repl string) string { - if !strings.Contains(x, "vendor") { - return x - } - elem := strings.Split(x, "/") - for i := 0; i < len(elem)-1; i++ { - if elem[i] == "vendor" { - elem[i] = repl - } - } - return strings.Join(elem, "/") -} - -// warnUnmatched warns about patterns that didn't match any packages. -func warnUnmatched(matches []*match) { - for _, m := range matches { - if len(m.Pkgs) == 0 { - m.Err = - errors.Newf(token.NoPos, "cue: %q matched no packages\n", m.Pattern) - } - } -} - // importPaths returns the matching paths to use for the given command line. // It calls ImportPathsQuiet and then WarnUnmatched. func (l *loader) importPaths(patterns []string) []*match { @@ -365,9 +261,9 @@ func (l *loader) importPathsQuiet(patterns []string) []*match { var p *build.Instance if isLocalImport(a) { - p = l.cfg.newRelInstance(token.NoPos, a, pkgName) + p = l.newRelInstance(token.NoPos, a, pkgName) } else { - p = l.cfg.newInstance(token.NoPos, importPath(orig)) + p = l.newInstance(token.NoPos, importPath(orig)) } pkgs := l.importPkg(token.NoPos, p) @@ -375,167 +271,3 @@ func (l *loader) importPathsQuiet(patterns []string) []*match { } return out } - -// cleanPatterns returns the patterns to use for the given -// command line. It canonicalizes the patterns but does not -// evaluate any matches. -func cleanPatterns(patterns []string) []string { - if len(patterns) == 0 { - return []string{"."} - } - var out []string - for _, a := range patterns { - // Arguments are supposed to be import paths, but - // as a courtesy to Windows developers, rewrite \ to / - // in command-line arguments. Handles .\... and so on. - if filepath.Separator == '\\' { - a = strings.Replace(a, `\`, `/`, -1) - } - - // Put argument in canonical form, but preserve leading ./. - if strings.HasPrefix(a, "./") { - a = "./" + path.Clean(a) - if a == "./." { - a = "." - } - } else { - a = path.Clean(a) - } - out = append(out, a) - } - return out -} - -// isMetaPackage checks if name is a reserved package name that expands to multiple packages. -func isMetaPackage(name string) bool { - return name == "std" || name == "cmd" || name == "all" -} - -// hasPathPrefix reports whether the path s begins with the -// elements in prefix. -func hasPathPrefix(s, prefix string) bool { - switch { - default: - return false - case len(s) == len(prefix): - return s == prefix - case len(s) > len(prefix): - if prefix != "" && prefix[len(prefix)-1] == '/' { - return strings.HasPrefix(s, prefix) - } - return s[len(prefix)] == '/' && s[:len(prefix)] == prefix - } -} - -// hasFilepathPrefix reports whether the path s begins with the -// elements in prefix. -func hasFilepathPrefix(s, prefix string) bool { - switch { - default: - return false - case len(s) == len(prefix): - return s == prefix - case len(s) > len(prefix): - if prefix != "" && prefix[len(prefix)-1] == filepath.Separator { - return strings.HasPrefix(s, prefix) - } - return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix - } -} - -// isStandardImportPath reports whether $GOROOT/src/path should be considered -// part of the standard distribution. For historical reasons we allow people to add -// their own code to $GOROOT instead of using $GOPATH, but we assume that -// code will start with a domain name (dot in the first element). -// -// Note that this function is meant to evaluate whether a directory found in GOROOT -// should be treated as part of the standard library. It should not be used to decide -// that a directory found in GOPATH should be rejected: directories in GOPATH -// need not have dots in the first element, and they just take their chances -// with future collisions in the standard library. -func isStandardImportPath(path string) bool { - i := strings.Index(path, "/") - if i < 0 { - i = len(path) - } - elem := path[:i] - return !strings.Contains(elem, ".") -} - -// isRelativePath reports whether pattern should be interpreted as a directory -// path relative to the current directory, as opposed to a pattern matching -// import paths. -func isRelativePath(pattern string) bool { - return strings.HasPrefix(pattern, "./") || strings.HasPrefix(pattern, "../") || pattern == "." || pattern == ".." -} - -// inDir checks whether path is in the file tree rooted at dir. -// If so, inDir returns an equivalent path relative to dir. -// If not, inDir returns an empty string. -// inDir makes some effort to succeed even in the presence of symbolic links. -// TODO(rsc): Replace internal/test.inDir with a call to this function for Go 1.12. -func inDir(path, dir string) string { - if rel := inDirLex(path, dir); rel != "" { - return rel - } - xpath, err := filepath.EvalSymlinks(path) - if err != nil || xpath == path { - xpath = "" - } else { - if rel := inDirLex(xpath, dir); rel != "" { - return rel - } - } - - xdir, err := filepath.EvalSymlinks(dir) - if err == nil && xdir != dir { - if rel := inDirLex(path, xdir); rel != "" { - return rel - } - if xpath != "" { - if rel := inDirLex(xpath, xdir); rel != "" { - return rel - } - } - } - return "" -} - -// inDirLex is like inDir but only checks the lexical form of the file names. -// It does not consider symbolic links. -// TODO(rsc): This is a copy of str.HasFilePathPrefix, modified to -// return the suffix. Most uses of str.HasFilePathPrefix should probably -// be calling InDir instead. -func inDirLex(path, dir string) string { - pv := strings.ToUpper(filepath.VolumeName(path)) - dv := strings.ToUpper(filepath.VolumeName(dir)) - path = path[len(pv):] - dir = dir[len(dv):] - switch { - default: - return "" - case pv != dv: - return "" - case len(path) == len(dir): - if path == dir { - return "." - } - return "" - case dir == "": - return path - case len(path) > len(dir): - if dir[len(dir)-1] == filepath.Separator { - if path[:len(dir)] == dir { - return path[len(dir):] - } - return "" - } - if path[len(dir)] == filepath.Separator && path[:len(dir)] == dir { - if len(path) == len(dir)+1 { - return "." - } - return path[len(dir)+1:] - } - return "" - } -} diff --git a/vendor/cuelang.org/go/cue/load/tags.go b/vendor/cuelang.org/go/cue/load/tags.go index 65ed1424..1f399ab5 100644 --- a/vendor/cuelang.org/go/cue/load/tags.go +++ b/vendor/cuelang.org/go/cue/load/tags.go @@ -33,6 +33,20 @@ import ( "cuelang.org/go/internal/cli" ) +type tagger struct { + cfg *Config + tags []*tag // tags found in files + buildTags map[string]bool + replacements map[ast.Node]ast.Node +} + +func newTagger(c *Config) *tagger { + return &tagger{ + cfg: c, + buildTags: make(map[string]bool), + } +} + // A TagVar represents an injection variable. type TagVar struct { // Func returns an ast for a tag variable. It is only called once @@ -58,6 +72,11 @@ func DefaultTagVars() map[string]TagVar { return ast.NewString(runtime.GOOS), nil }, }, + "arch": { + Func: func() (ast.Expr, error) { + return ast.NewString(runtime.GOARCH), nil + }, + }, "cwd": { Func: func() (ast.Expr, error) { return varToString(os.Getwd()) @@ -102,7 +121,8 @@ func varToString(s string, err error) (ast.Expr, error) { // A tag binds an identifier to a field to allow passing command-line values. // // A tag is of the form -// @tag(,[type=(string|int|number|bool)][,short=+]) +// +// @tag(,[type=(string|int|number|bool)][,short=+]) // // The name is mandatory and type defaults to string. Tags are set using the -t // option on the command line. -t name=value will parse value for the type @@ -167,18 +187,18 @@ func parseTag(pos token.Pos, body string) (t *tag, err errors.Error) { return t, nil } -func (t *tag) inject(value string, l *loader) errors.Error { +func (t *tag) inject(value string, tg *tagger) errors.Error { e, err := cli.ParseValue(token.NoPos, t.key, value, t.kind) - t.injectValue(e, l) + t.injectValue(e, tg) return err } -func (t *tag) injectValue(x ast.Expr, l *loader) { +func (t *tag) injectValue(x ast.Expr, tg *tagger) { injected := ast.NewBinExpr(token.AND, t.field.Value, x) - if l.replacements == nil { - l.replacements = map[ast.Node]ast.Node{} + if tg.replacements == nil { + tg.replacements = make(map[ast.Node]ast.Node) } - l.replacements[t.field.Value] = injected + tg.replacements[t.field.Value] = injected t.field.Value = injected t.hasReplacement = true } @@ -213,8 +233,9 @@ func findTags(b *build.Instance) (tags []*tag, errs errors.Error) { case *ast.Field: // TODO: allow optional fields? _, _, err := ast.LabelName(x.Label) - if err != nil || x.Optional != token.NoPos { - findInvalidTags(n, "@tag not allowed within optional fields") + _, ok := internal.ConstraintToken(x) + if err != nil || ok { + findInvalidTags(n, "@tag not allowed within field constraint") return false } @@ -238,16 +259,16 @@ func findTags(b *build.Instance) (tags []*tag, errs errors.Error) { return tags, errs } -func injectTags(tags []string, l *loader) errors.Error { +func (tg *tagger) injectTags(tags []string) errors.Error { // Parses command line args for _, s := range tags { p := strings.Index(s, "=") - found := l.buildTags[s] + found := tg.buildTags[s] if p > 0 { // key-value - for _, t := range l.tags { + for _, t := range tg.tags { if t.key == s[:p] { found = true - if err := t.inject(s[p+1:], l); err != nil { + if err := t.inject(s[p+1:], tg); err != nil { return err } } @@ -256,11 +277,11 @@ func injectTags(tags []string, l *loader) errors.Error { return errors.Newf(token.NoPos, "no tag for %q", s[:p]) } } else { // shorthand - for _, t := range l.tags { + for _, t := range tg.tags { for _, sh := range t.shorthands { if sh == s { found = true - if err := t.inject(s, l); err != nil { + if err := t.inject(s, tg); err != nil { return err } } @@ -272,17 +293,17 @@ func injectTags(tags []string, l *loader) errors.Error { } } - if l.cfg.TagVars != nil { + if tg.cfg.TagVars != nil { vars := map[string]ast.Expr{} // Inject tag variables if the tag wasn't already set. - for _, t := range l.tags { + for _, t := range tg.tags { if t.hasReplacement || t.vars == "" { continue } x, ok := vars[t.vars] if !ok { - tv, ok := l.cfg.TagVars[t.vars] + tv, ok := tg.cfg.TagVars[t.vars] if !ok { return errors.Newf(token.NoPos, "tag variable '%s' not found", t.vars) @@ -296,7 +317,7 @@ func injectTags(tags []string, l *loader) errors.Error { vars[t.vars] = tag } if x != nil { - t.injectValue(x, l) + t.injectValue(x, tg) } } } @@ -328,7 +349,7 @@ func shouldBuildFile(f *ast.File, fp *fileProcessor) errors.Error { tagMap[t] = !strings.ContainsRune(t, '=') } - c := checker{tags: tagMap, loader: fp.c.loader} + c := checker{tags: tagMap, tagger: fp.tagger} include := c.shouldInclude(expr) if c.err != nil { return c.err @@ -364,7 +385,7 @@ func getBuildAttr(f *ast.File) (*ast.Attribute, errors.Error) { } type checker struct { - loader *loader + tagger *tagger tags map[string]bool err errors.Error } @@ -372,7 +393,7 @@ type checker struct { func (c *checker) shouldInclude(expr ast.Expr) bool { switch x := expr.(type) { case *ast.Ident: - c.loader.buildTags[x.Name] = true + c.tagger.buildTags[x.Name] = true return c.tags[x.Name] case *ast.BinaryExpr: diff --git a/vendor/cuelang.org/go/cue/marshal.go b/vendor/cuelang.org/go/cue/marshal.go index 43ca6d46..dabf86d9 100644 --- a/vendor/cuelang.org/go/cue/marshal.go +++ b/vendor/cuelang.org/go/cue/marshal.go @@ -95,8 +95,8 @@ func compileInstances(r *Runtime, data []*instanceData) (instances []*Instance, return r.build(builds) } -// Unmarshal creates an Instance from bytes generated by the MarshalBinary -// method of an instance. +// Unmarshal returns a slice of instances from bytes generated by +// Runtime.Marshal. func (r *Runtime) Unmarshal(b []byte) ([]*Instance, error) { if len(b) == 0 { return nil, errors.Newf(token.NoPos, "unmarshal failed: empty buffer") diff --git a/vendor/cuelang.org/go/cue/parser/fuzz.go b/vendor/cuelang.org/go/cue/parser/fuzz.go index 21a1d087..eceb1ae8 100644 --- a/vendor/cuelang.org/go/cue/parser/fuzz.go +++ b/vendor/cuelang.org/go/cue/parser/fuzz.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build gofuzz -// +build gofuzz package parser diff --git a/vendor/cuelang.org/go/cue/parser/interface.go b/vendor/cuelang.org/go/cue/parser/interface.go index 8695a6c3..af498773 100644 --- a/vendor/cuelang.org/go/cue/parser/interface.go +++ b/vendor/cuelang.org/go/cue/parser/interface.go @@ -21,6 +21,7 @@ import ( "cuelang.org/go/cue/ast/astutil" "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/source" ) @@ -46,6 +47,15 @@ var ( p.mode |= parseCommentsMode } + // ParseFuncs causes function declarations to be parsed. + // + // This is an experimental function and the API is likely to + // change or dissapear. + ParseFuncs Option = parseFuncs + parseFuncs = func(p *parser) { + p.mode |= parseFuncsMode + } + // Trace causes parsing to print a trace of parsed productions. Trace Option = traceOpt traceOpt = func(p *parser) { @@ -83,10 +93,6 @@ func FromVersion(version int) Option { return func(p *parser) { p.version = version } } -func version0(minor, patch int) int { - return -1000 + 100*minor + patch -} - // DeprecationError is a sentinel error to indicate that an error is // related to an unsupported old CUE syntax. type DeprecationError struct { @@ -97,11 +103,19 @@ func (e *DeprecationError) Error() string { return "try running `cue fix` (possibly with an earlier version, like v0.2.2) to upgrade" } -// Latest specifies the latest version of the parser, effectively setting -// the strictest implementation. -const Latest = latest +const ( + // Latest specifies the latest version of the parser, effectively setting + // the strictest implementation. + Latest = latest + + latest = -1000 + (100 * internal.MinorCurrent) + 0 -const latest = -600 + // FullBackwardCompatibility enables all deprecated features that are + // currently still supported by the parser. + FullBackwardCompatibility = fullCompatibility + + fullCompatibility = -1000 +) // FileOffset specifies the File position info to use. func FileOffset(pos int) Option { @@ -117,6 +131,7 @@ const ( packageClauseOnlyMode mode = 1 << iota // stop parsing after package clause importsOnlyMode // stop parsing after import declarations parseCommentsMode // parse comments and add them to AST + parseFuncsMode // parse function declarations (experimental) partialMode traceMode // print a trace of parsed productions declarationErrorsMode // report declaration errors diff --git a/vendor/cuelang.org/go/cue/parser/parser.go b/vendor/cuelang.org/go/cue/parser/parser.go index e91b3014..5a3e336b 100644 --- a/vendor/cuelang.org/go/cue/parser/parser.go +++ b/vendor/cuelang.org/go/cue/parser/parser.go @@ -24,6 +24,7 @@ import ( "cuelang.org/go/cue/literal" "cuelang.org/go/cue/scanner" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/astinternal" ) @@ -328,7 +329,7 @@ func (p *parser) consumeCommentGroup(prevLine, n int) (comments *ast.CommentGrou // Advance to the next non-comment In the process, collect // any comment groups encountered, and refield the last lead and -// and line comments. +// line comments. // // A lead comment is a comment group that starts and ends in a // line without any other tokens and that is followed by a non-comment @@ -393,8 +394,12 @@ func (p *parser) next() { // assertV0 indicates the last version at which a certain feature was // supported. func (p *parser) assertV0(pos token.Pos, minor, patch int, name string) { - v := version0(minor, patch) - if p.version != 0 && p.version > v { + v := internal.Version(minor, patch) + base := p.version + if base == 0 { + base = internal.APIVersionSupported + } + if base > v { p.errors = errors.Append(p.errors, errors.Wrapf(&DeprecationError{v}, pos, "use of deprecated %s (deprecated as of v0.%d.%d)", name, minor, patch+1)) @@ -593,6 +598,13 @@ func (p *parser) parseOperand() (expr ast.Expr) { case token.LBRACK: return p.parseList() + case token.FUNC: + if p.mode&parseFuncsMode != 0 { + return p.parseFunc() + } else { + return p.parseKeyIdent() + } + case token.BOTTOM: c := p.openComments() x := &ast.BottomLit{Bottom: p.pos} @@ -855,8 +867,10 @@ func (p *parser) parseField() (decl ast.Decl) { return e } - if p.tok == token.OPTION { + switch p.tok { + case token.OPTION, token.NOT: m.Optional = p.pos + m.Constraint = p.tok p.next() } @@ -867,7 +881,7 @@ func (p *parser) parseField() (decl ast.Decl) { // allowComprehension = false switch p.tok { - case token.COLON, token.ISA: + case token.COLON: case token.COMMA: p.expectComma() // sync parser. fallthrough @@ -893,22 +907,18 @@ func (p *parser) parseField() (decl ast.Decl) { m.TokenPos = p.pos m.Token = p.tok - if p.tok == token.ISA { - p.assertV0(p.pos, 2, 0, "'::'") - } - if p.tok != token.COLON && p.tok != token.ISA { - p.errorExpected(pos, "':' or '::'") + if p.tok != token.COLON { + p.errorExpected(pos, "':'") } - p.next() // : or :: + p.next() // : for { if l, ok := m.Label.(*ast.ListLit); ok && len(l.Elts) != 1 { p.errf(l.Pos(), "square bracket must have exactly one element") } - tok := p.tok label, expr, _, ok := p.parseLabel(true) - if !ok || (p.tok != token.COLON && p.tok != token.ISA && p.tok != token.OPTION) { + if !ok || (p.tok != token.COLON && p.tok != token.OPTION && p.tok != token.NOT) { if expr == nil { expr = p.parseRHS() } @@ -919,21 +929,20 @@ func (p *parser) parseField() (decl ast.Decl) { m.Value = &ast.StructLit{Elts: []ast.Decl{field}} m = field - if tok != token.LSS && p.tok == token.OPTION { + switch p.tok { + case token.OPTION, token.NOT: m.Optional = p.pos + m.Constraint = p.tok p.next() } m.TokenPos = p.pos m.Token = p.tok - if p.tok == token.ISA { - p.assertV0(p.pos, 2, 0, "'::'") - } - if p.tok != token.COLON && p.tok != token.ISA { + if p.tok != token.COLON { if p.tok.IsLiteral() { - p.errf(p.pos, "expected ':' or '::'; found %s", p.lit) + p.errf(p.pos, "expected ':'; found %s", p.lit) } else { - p.errf(p.pos, "expected ':' or '::'; found %s", p.tok) + p.errf(p.pos, "expected ':'; found %s", p.tok) } break } @@ -989,7 +998,7 @@ func (p *parser) parseLabel(rhs bool) (label ast.Label, expr ast.Expr, decl ast. expr = ident case token.IDENT, token.STRING, token.INTERPOLATION, token.LPAREN, - token.NULL, token.TRUE, token.FALSE, token.IN: + token.NULL, token.TRUE, token.FALSE, token.IN, token.FUNC: expr = p.parseExpr() case token.LBRACK: @@ -1004,7 +1013,7 @@ func (p *parser) parseLabel(rhs bool) (label ast.Label, expr ast.Expr, decl ast. switch x := expr.(type) { case *ast.BasicLit: switch x.Kind { - case token.STRING, token.NULL, token.TRUE, token.FALSE: + case token.STRING, token.NULL, token.TRUE, token.FALSE, token.FUNC: // Keywords that represent operands. // Allowing keywords to be used as a labels should not interfere with @@ -1091,7 +1100,7 @@ func (p *parser) parseComprehensionClauses(first bool) (clauses []ast.Clause, c forPos := p.expect(token.FOR) if first { switch p.tok { - case token.COLON, token.ISA, token.BIND, token.OPTION, + case token.COLON, token.BIND, token.OPTION, token.COMMA, token.EOF: return nil, c } @@ -1121,7 +1130,7 @@ func (p *parser) parseComprehensionClauses(first bool) (clauses []ast.Clause, c ifPos := p.expect(token.IF) if first { switch p.tok { - case token.COLON, token.ISA, token.BIND, token.OPTION, + case token.COLON, token.BIND, token.OPTION, token.COMMA, token.EOF: return nil, c } @@ -1158,6 +1167,63 @@ func (p *parser) parseComprehensionClauses(first bool) (clauses []ast.Clause, c } } +func (p *parser) parseFunc() (expr ast.Expr) { + if p.trace { + defer un(trace(p, "Func")) + } + tok := p.tok + pos := p.pos + fun := p.expect(token.FUNC) + + // "func" might be used as an identifier, in which case bail out early. + switch p.tok { + case token.COLON, token.BIND, token.OPTION, + token.COMMA, token.EOF: + + return &ast.Ident{ + NamePos: pos, + Name: tok.String(), + } + } + + p.expect(token.LPAREN) + args := p.parseFuncArgs() + p.expectClosing(token.RPAREN, "argument type list") + + p.expect(token.COLON) + ret := p.parseExpr() + + return &ast.Func{ + Func: fun, + Args: args, + Ret: ret, + } +} + +func (p *parser) parseFuncArgs() (list []ast.Expr) { + if p.trace { + defer un(trace(p, "FuncArgs")) + } + p.openList() + defer p.closeList() + + for p.tok != token.RPAREN && p.tok != token.EOF { + list = append(list, p.parseFuncArg()) + if p.tok != token.RPAREN { + p.expectComma() + } + } + + return list +} + +func (p *parser) parseFuncArg() (expr ast.Expr) { + if p.trace { + defer un(trace(p, "FuncArg")) + } + return p.parseExpr() +} + func (p *parser) parseList() (expr ast.Expr) { lbrack := p.expect(token.LBRACK) @@ -1292,6 +1358,7 @@ func (p *parser) checkExpr(x ast.Expr) ast.Expr { case *ast.Ident: case *ast.BasicLit: case *ast.Interpolation: + case *ast.Func: case *ast.StructLit: case *ast.ListLit: case *ast.ParenExpr: diff --git a/vendor/cuelang.org/go/cue/path.go b/vendor/cuelang.org/go/cue/path.go index 80541078..596c9349 100644 --- a/vendor/cuelang.org/go/cue/path.go +++ b/vendor/cuelang.org/go/cue/path.go @@ -16,6 +16,7 @@ package cue import ( "fmt" + "math/bits" "strconv" "strings" @@ -26,9 +27,107 @@ import ( "cuelang.org/go/cue/token" "cuelang.org/go/internal/astinternal" "cuelang.org/go/internal/core/adt" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" ) +// SelectorType represents the kind of a selector. It indicates both the label +// type as well as whether it is a constraint or an actual value. +type SelectorType uint16 + +const ( + // StringLabel represents a regular non-definition field. + StringLabel SelectorType = 1 << iota + // IndexLabel represents a numeric index into an array. + IndexLabel + // DefinitionLabel represents a definition. + DefinitionLabel + // HiddenLabel represents a hidden non-definition field. + HiddenLabel + // HiddenDefinitionLabel represents a hidden definition. + HiddenDefinitionLabel + + // OptionalConstraint represents an optional constraint (?). + OptionalConstraint + // RequiredConstraint represents a required constraint (!). + RequiredConstraint + // PatternConstraint represents a selector of fields in a struct + // or array that match a constraint. + PatternConstraint + + InvalidSelectorType SelectorType = 0 +) + +// fromArcType reports the constraint type for t. +func fromArcType(t adt.ArcType) SelectorType { + switch t { + case adt.ArcMember: + return 0 + case adt.ArcOptional: + return OptionalConstraint + case adt.ArcRequired: + return RequiredConstraint + default: + panic("arc type not supported") + } +} + +// LabelType reports the label type of t. +func (t SelectorType) LabelType() SelectorType { + return t & 0b0001_1111 +} + +// ConstraintType reports the constraint type of t. +func (t SelectorType) ConstraintType() SelectorType { + return t & 0b1110_0000 +} + +var selectorTypeStrings = [...]string{ + "InvalidSelectorType", + "StringLabel", + "IndexLabel", + "DefinitionLabel", + "HiddenLabel", + "HiddenDefinitionLabel", + "OptionalConstraint", + "RequiredConstraint", + "PatternConstraint", +} + +func (t SelectorType) String() string { + if t.LabelType() == 0 && t.ConstraintType() == 0 { + return "NoLabels" + } + single := bits.OnesCount16(uint16(t)) == 1 + var buf strings.Builder + for i := range selectorTypeStrings[:len(selectorTypeStrings)-1] { + if t&(SelectorType(1)< 0 { + buf.WriteByte('|') + } + buf.WriteString(selectorTypeStrings[i+1]) + } + return buf.String() +} + +// IsHidden reports whether t describes a hidden field, regardless of +// whether or not this is a constraint. +func (t SelectorType) IsHidden() bool { + t = t.LabelType() + return t == HiddenLabel || t == HiddenDefinitionLabel +} + +// IsDefinition reports whether t describes a definition, regardless of +// whether or not this is a constraint. +func (t SelectorType) IsDefinition() bool { + t = t.LabelType() + return t == HiddenDefinitionLabel || t == DefinitionLabel +} + // A Selector is a component of a path. type Selector struct { sel selector @@ -39,21 +138,73 @@ func (sel Selector) String() string { return sel.sel.String() } -// IsString reports whether sel is a regular label type. +// Unquoted returns the unquoted value of a string label. +// It panics unless sel.LabelType is StringLabel and has a concrete name. +func (sel Selector) Unquoted() string { + if sel.LabelType() != StringLabel || + sel.ConstraintType() >= PatternConstraint { + panic("Selector.Unquoted invoked on non-string label") + } + switch s := sel.sel.(type) { + case stringSelector: + return string(s) + case constraintSelector: + return string(s.selector.(stringSelector)) + } + panic(fmt.Sprintf("unreachable %T", sel.sel)) +} + +// IsConstraint reports whether s is optional or a pattern constraint. +// Fields that are constraints are considered non-existing and their +// values may be erroneous for a configuration to be valid.. +func (sel Selector) IsConstraint() bool { + return sel.Type().ConstraintType() != 0 +} + +// IsString reports whether sel represents an optional, required, or regular +// member field. func (sel Selector) IsString() bool { - return sel.sel.kind() == adt.StringLabel + // TODO: consider deprecating this method. It is a bit wonkey now. + t := sel.Type() + t &^= OptionalConstraint | RequiredConstraint + return t == StringLabel } -// IsDefinition reports whether sel is a non-hidden definition label type. +// IsDefinition reports whether sel is a non-hidden definition and non-constraint label type. func (sel Selector) IsDefinition() bool { - return sel.sel.kind() == adt.DefinitionLabel + return sel.Type().IsDefinition() +} + +// Type returns the type of the selector. +func (sel Selector) Type() SelectorType { + return sel.sel.labelType() | sel.sel.constraintType() +} + +// LabelType returns the type of the label part of a selector. +func (sel Selector) LabelType() SelectorType { + return sel.sel.labelType() +} + +// ConstraintType returns the type of the constraint part of a selector. +func (sel Selector) ConstraintType() SelectorType { + return sel.sel.constraintType() } // PkgPath reports the package path associated with a hidden label or "" if // this is not a hidden label. func (sel Selector) PkgPath() string { - h, _ := sel.sel.(scopedSelector) - return h.pkg + s, _ := sel.sel.(scopedSelector) + return s.pkg +} + +// Index returns the index of the selector. It panics +// unless sel.Type is SelIndex. +func (sel Selector) Index() int { + s, ok := sel.sel.(indexSelector) + if !ok { + panic("Index called on non-index selector") + } + return adt.Feature(s).Index() } var ( @@ -63,7 +214,6 @@ var ( // In paths it is used to select constraints that apply to all elements. // AnyDefinition = anyDefinition anyDefinition = Selector{sel: anySelector(adt.AnyDefinition)} - // AnyIndex can be used to ask for any index. // // In paths it is used to select constraints that apply to all elements. @@ -77,18 +227,31 @@ var ( anyString = Selector{sel: anySelector(adt.AnyString)} ) -// Optional converts sel into an optional equivalent. -// foo -> foo? +// Optional converts sel into an optional constraint equivalent. +// It's a no-op if the selector is already optional. +// +// foo -> foo? +// foo! -> foo? func (sel Selector) Optional() Selector { - return wrapOptional(sel) + return wrapConstraint(sel, OptionalConstraint) +} + +// Required converts sel into a required constraint equivalent. +// It's a no-op if the selector is already a required constraint. +// +// foo -> foo! +// foo? -> foo! +func (sel Selector) Required() Selector { + return wrapConstraint(sel, RequiredConstraint) } type selector interface { String() string feature(ctx adt.Runtime) adt.Feature - kind() adt.FeatureType - optional() bool + labelType() SelectorType + constraintType() SelectorType + isConstraint() bool } // A Path is series of selectors to query a CUE value. @@ -128,7 +291,7 @@ func ParsePath(s string) Path { p := Path{path: toSelectors(expr)} for _, sel := range p.path { - if sel.sel.kind().IsHidden() { + if sel.Type().IsHidden() { return MakePath(Selector{pathError{errors.Newf(token.NoPos, "invalid path: hidden fields not allowed in path %s", s)}}) } @@ -149,31 +312,29 @@ func (p Path) String() string { b := &strings.Builder{} for i, sel := range p.path { - x := sel.sel - // TODO: use '.' in all cases, once supported. - _, isAny := x.(anySelector) switch { - case x.kind() == adt.IntLabel && !isAny: + case sel.Type() == IndexLabel: + // TODO: use '.' in all cases, once supported. b.WriteByte('[') - b.WriteString(x.String()) + b.WriteString(sel.sel.String()) b.WriteByte(']') continue case i > 0: b.WriteByte('.') } - b.WriteString(x.String()) + b.WriteString(sel.sel.String()) } return b.String() } // Optional returns the optional form of a Path. For instance, -// foo.bar --> foo?.bar? // +// foo.bar --> foo?.bar? func (p Path) Optional() Path { q := make([]Selector, 0, len(p.path)) for _, s := range p.path { - q = appendSelector(q, wrapOptional(s)) + q = appendSelector(q, wrapConstraint(s, OptionalConstraint)) } return Path{path: q} } @@ -327,20 +488,15 @@ type scopedSelector struct { func (s scopedSelector) String() string { return s.name } -func (scopedSelector) optional() bool { return false } +func (scopedSelector) isConstraint() bool { return false } -func (s scopedSelector) kind() adt.FeatureType { - switch { - case strings.HasPrefix(s.name, "#"): - return adt.DefinitionLabel - case strings.HasPrefix(s.name, "_#"): - return adt.HiddenDefinitionLabel - case strings.HasPrefix(s.name, "_"): - return adt.HiddenLabel - default: - return adt.StringLabel +func (s scopedSelector) labelType() SelectorType { + if strings.HasPrefix(s.name, "_#") { + return HiddenDefinitionLabel } + return HiddenLabel } +func (s scopedSelector) constraintType() SelectorType { return 0 } func (s scopedSelector) feature(r adt.Runtime) adt.Feature { return adt.MakeIdentLabel(r, s.name, s.pkg) @@ -366,12 +522,14 @@ func (d definitionSelector) String() string { return string(d) } -func (d definitionSelector) optional() bool { return false } +func (d definitionSelector) isConstraint() bool { return false } -func (d definitionSelector) kind() adt.FeatureType { - return adt.DefinitionLabel +func (d definitionSelector) labelType() SelectorType { + return DefinitionLabel } +func (s definitionSelector) constraintType() SelectorType { return 0 } + func (d definitionSelector) feature(r adt.Runtime) adt.Feature { return adt.MakeIdentLabel(r, string(d), "") } @@ -391,8 +549,9 @@ func (s stringSelector) String() string { return str } -func (s stringSelector) optional() bool { return false } -func (s stringSelector) kind() adt.FeatureType { return adt.StringLabel } +func (s stringSelector) isConstraint() bool { return false } +func (s stringSelector) labelType() SelectorType { return StringLabel } +func (s stringSelector) constraintType() SelectorType { return 0 } func (s stringSelector) feature(r adt.Runtime) adt.Feature { return adt.MakeStringLabel(r, string(s)) @@ -413,8 +572,10 @@ func (s indexSelector) String() string { return strconv.Itoa(adt.Feature(s).Index()) } -func (s indexSelector) kind() adt.FeatureType { return adt.IntLabel } -func (s indexSelector) optional() bool { return false } +func (s indexSelector) labelType() SelectorType { return IndexLabel } +func (s indexSelector) constraintType() SelectorType { return 0 } + +func (s indexSelector) isConstraint() bool { return false } func (s indexSelector) feature(r adt.Runtime) adt.Feature { return adt.Feature(s) @@ -423,9 +584,16 @@ func (s indexSelector) feature(r adt.Runtime) adt.Feature { // an anySelector represents a wildcard option of a particular type. type anySelector adt.Feature -func (s anySelector) String() string { return "[_]" } -func (s anySelector) optional() bool { return true } -func (s anySelector) kind() adt.FeatureType { return adt.Feature(s).Typ() } +func (s anySelector) String() string { return "[_]" } +func (s anySelector) isConstraint() bool { return true } +func (s anySelector) labelType() SelectorType { + // FeatureTypes are numbered sequentially. SelectorType is a bitmap. As they + // are defined in the same order, we can go from FeatureType to SelectorType + // by left shifting. As valid FeatureTypes starts at 1, we need to end with + // a final right shift. + return SelectorType((1 << adt.Feature(s).Typ()) >> 1) +} +func (s anySelector) constraintType() SelectorType { return PatternConstraint } func (s anySelector) feature(r adt.Runtime) adt.Feature { return adt.Feature(s) @@ -435,18 +603,32 @@ func (s anySelector) feature(r adt.Runtime) adt.Feature { // // // ImportPath defines a lookup at the root of an instance. It must be the first // // element of a Path. -// func ImportPath(s string) Selector { -// return importSelector(s) -// } -type optionalSelector struct { +// +// func ImportPath(s string) Selector { +// return importSelector(s) +// } +type constraintSelector struct { selector + constraint SelectorType +} + +func (s constraintSelector) labelType() SelectorType { + return s.selector.labelType() +} + +func (s constraintSelector) constraintType() SelectorType { + return s.constraint } -func wrapOptional(sel Selector) Selector { - if !sel.sel.optional() { - sel = Selector{optionalSelector{sel.sel}} +func wrapConstraint(s Selector, t SelectorType) Selector { + sel := s.sel + if c, ok := sel.(constraintSelector); ok { + if c.constraint == t { + return s + } + sel = c.selector // unwrap } - return sel + return Selector{constraintSelector{sel, t}} } // func isOptional(sel selector) bool { @@ -454,10 +636,19 @@ func wrapOptional(sel Selector) Selector { // return ok // } -func (s optionalSelector) optional() bool { return true } +func (s constraintSelector) isConstraint() bool { + return true +} -func (s optionalSelector) String() string { - return s.selector.String() + "?" +func (s constraintSelector) String() string { + var suffix string + switch s.constraint { + case OptionalConstraint: + suffix = "?" + case RequiredConstraint: + suffix = "!" + } + return s.selector.String() + suffix } // TODO: allow looking up in parent scopes? @@ -479,9 +670,10 @@ type pathError struct { errors.Error } -func (p pathError) String() string { return "" } -func (p pathError) optional() bool { return false } -func (p pathError) kind() adt.FeatureType { return 0 } +func (p pathError) String() string { return "" } +func (p pathError) isConstraint() bool { return false } +func (p pathError) labelType() SelectorType { return InvalidSelectorType } +func (p pathError) constraintType() SelectorType { return 0 } func (p pathError) feature(r adt.Runtime) adt.Feature { return adt.InvalidLabel } @@ -518,3 +710,21 @@ func featureToSel(f adt.Feature, r adt.Runtime) Selector { errors.Newf(token.NoPos, "unexpected feature type %v", f.Typ()), }} } + +func featureToSelType(f adt.Feature, at adt.ArcType) (st SelectorType) { + switch f.Typ() { + case adt.StringLabel: + st = StringLabel + case adt.IntLabel: + st = IndexLabel + case adt.DefinitionLabel: + st = DefinitionLabel + case adt.HiddenLabel: + st = HiddenLabel + case adt.HiddenDefinitionLabel: + st = HiddenDefinitionLabel + default: + panic("unsupported arc type") + } + return st | fromArcType(at) +} diff --git a/vendor/cuelang.org/go/cue/query.go b/vendor/cuelang.org/go/cue/query.go index af046ee8..80e4cfad 100644 --- a/vendor/cuelang.org/go/cue/query.go +++ b/vendor/cuelang.org/go/cue/query.go @@ -48,12 +48,15 @@ outer: f := sel.sel.feature(v.idx) for _, a := range n.Arcs { if a.Label == f { + if a.IsConstraint() && !sel.sel.isConstraint() { + break + } parent = linkParent(parent, n, a) n = a continue outer } } - if sel.sel.optional() { + if sel.sel.isConstraint() { x := &adt.Vertex{ Parent: n, Label: sel.sel.feature(ctx), diff --git a/vendor/cuelang.org/go/cue/scanner/fuzz.go b/vendor/cuelang.org/go/cue/scanner/fuzz.go index 376a57e4..a8b560e4 100644 --- a/vendor/cuelang.org/go/cue/scanner/fuzz.go +++ b/vendor/cuelang.org/go/cue/scanner/fuzz.go @@ -13,7 +13,6 @@ // limitations under the License. //go:build gofuzz -// +build gofuzz package scanner diff --git a/vendor/cuelang.org/go/cue/scanner/scanner.go b/vendor/cuelang.org/go/cue/scanner/scanner.go index 84b3643d..b1f7d9e9 100644 --- a/vendor/cuelang.org/go/cue/scanner/scanner.go +++ b/vendor/cuelang.org/go/cue/scanner/scanner.go @@ -22,7 +22,6 @@ import ( "fmt" "path/filepath" "strconv" - "strings" "unicode" "unicode/utf8" @@ -109,7 +108,7 @@ type Mode uint // These constants are options to the Init function. const ( ScanComments Mode = 1 << iota // return comments as COMMENT tokens - dontInsertCommas // do not automatically insert commas - for testing only + DontInsertCommas // do not automatically insert commas ) // Init prepares the scanner s to tokenize the text src by setting the @@ -181,7 +180,7 @@ func (s *Scanner) interpretLineComment(text []byte) { } func (s *Scanner) scanComment() string { - // initial '/' already consumed; s.ch == '/' || s.ch == '*' + // initial '/' already consumed; s.ch == '/' offs := s.offset - 1 // position of initial '/' hasCR := false @@ -213,50 +212,6 @@ exit: return string(lit) } -func (s *Scanner) findLineEnd() bool { - // initial '/' already consumed - - defer func(offs int) { - // reset scanner state to where it was upon calling findLineEnd - s.ch = '/' - s.offset = offs - s.rdOffset = offs + 1 - s.next() // consume initial '/' again - }(s.offset - 1) - - // read ahead until a newline, EOF, or non-comment token is found - for s.ch == '/' || s.ch == '*' { - if s.ch == '/' { - //-style comment always contains a newline - return true - } - /*-style comment: look for newline */ - s.next() - for s.ch >= 0 { - ch := s.ch - if ch == '\n' { - return true - } - s.next() - if ch == '*' && s.ch == '/' { - s.next() - break - } - } - s.skipWhitespace(0) // s.insertSemi is set - if s.ch < 0 || s.ch == '\n' { - return true - } - if s.ch != '/' { - // non-comment token - return false - } - s.next() // consume '/' - } - - return false -} - func isLetter(ch rune) bool { return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch >= utf8.RuneSelf && unicode.IsLetter(ch) } @@ -292,10 +247,6 @@ func (s *Scanner) scanIdentifier() string { return string(s.src[offs:s.offset]) } -func isExtendedIdent(r rune) bool { - return strings.IndexRune("-_#$%. ", r) >= 0 -} - func digitVal(ch rune) int { switch { case '0' <= ch && ch <= '9': @@ -567,14 +518,14 @@ func (s *Scanner) consumeStringClose(ch rune, quote quoteInfo) (next rune, atEnd return s.ch, true } -func (s *Scanner) checkHashCount(offs int, quote quoteInfo) { - for i := 0; i < quote.numHash; i++ { +func (s *Scanner) scanHashes(maxHash int) int { + for i := 0; i < maxHash; i++ { if s.ch != '#' { - s.errf(offs, "string literal not terminated") - return + return i } s.next() } + return maxHash } func stripCR(b []byte) []byte { @@ -693,6 +644,11 @@ func (s *Scanner) ResumeInterpolation() string { return str } +// Offset returns the current position offset. +func (s *Scanner) Offset() int { + return s.offset +} + // Scan scans the next token and returns the token position, the token, // and its literal string if applicable. The source end is indicated by // EOF. @@ -830,8 +786,18 @@ scanAgain: quote.numChar = 1 tok, lit = s.scanString(offs, quote) case 1: - s.checkHashCount(offs, quote) - tok, lit = token.STRING, string(s.src[offs:s.offset]) + // When the string is surrounded by hashes, + // a single leading quote is OK (and part of the string) + // e.g. #""hello""# + // unless it's succeeded by the correct number of terminating + // hash characters + // e.g. ##""## + if n := s.scanHashes(quote.numHash); n == quote.numHash { + // It's the empty string. + tok, lit = token.STRING, string(s.src[offs:s.offset]) + } else { + tok, lit = s.scanString(offs, quote) + } case 2: quote.numChar = 3 switch s.ch { @@ -856,12 +822,7 @@ scanAgain: insertEOL = true tok, lit = s.scanAttribute() case ':': - if s.ch == ':' { - s.next() - tok = token.ISA - } else { - tok = token.COLON - } + tok = token.COLON case ';': tok = token.SEMICOLON insertEOL = true @@ -911,7 +872,7 @@ scanAgain: case '/': if s.ch == '/' { // comment - if s.insertEOL && s.findLineEnd() { + if s.insertEOL { // reset position to the beginning of the comment s.ch = '/' s.offset = s.file.Offset(pos) @@ -981,7 +942,7 @@ scanAgain: lit = string(ch) } } - if s.mode&dontInsertCommas == 0 { + if s.mode&DontInsertCommas == 0 { s.insertEOL = insertEOL } diff --git a/vendor/cuelang.org/go/cue/stats/stats.go b/vendor/cuelang.org/go/cue/stats/stats.go new file mode 100644 index 00000000..dbe20281 --- /dev/null +++ b/vendor/cuelang.org/go/cue/stats/stats.go @@ -0,0 +1,122 @@ +// Copyright 2022 CUE Authors +// +// 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. + +// Package stats is an experimental package for getting statistics on CUE +// evaluations. +package stats + +import ( + "html/template" + "strings" +) + +// Counts holds counters for key events during a CUE evaluation. +// +// This is an experimental type and the contents may change without notice. +type Counts struct { + // Operation counters + // + // These counters account for several key operations. + + // Unifications counts the number of calls to adt.Unify + Unifications int64 + + // Disjuncts indicates the number of total disjuncts processed as part + // of a Unify operation. A unification with no | operator counts as a + // single disjunct, so Disjuncts is always greater than or equal to the + // number of Unifications. + // + // If Disjuncts is much larger than Unification, this may indicate room + // for optimization. In particular, most practical uses of disjunctions + // should allow for near-linear processing. + Disjuncts int64 + + // Conjuncts is an estimate of the number of conjunctions processed during + // the calls to Unify. This includes the conjuncts added in the compilation + // phase as well as the derivative conjuncts inserted from other nodes + // after following references. + // + // A number of Conjuncts much larger than Disjuncts may indicate non-linear + // algorithmic behavior. + Conjuncts int64 + + // Buffer counters + // + // Each unification and disjunct operation is associated with an object + // with temporary buffers. Reuse of this buffer is critical for performance. + // The following counters track this. + + Freed int64 // Number of buffers returned to the free pool. + Reused int64 // Number of times a buffer is reused instead of allocated. + Allocs int64 // Total number of allocated buffer objects. + Retained int64 // Number of times a buffer is retained upon finalization. +} + +// TODO: None of the methods below protect against overflows or underflows. +// If those start happening in practice, or if the counters get large enough, +// add checks on each of the operations. + +func (c *Counts) Add(other Counts) { + c.Unifications += other.Unifications + c.Conjuncts += other.Conjuncts + c.Disjuncts += other.Disjuncts + + c.Freed += other.Freed + c.Retained += other.Retained + c.Reused += other.Reused + c.Allocs += other.Allocs +} + +func (c Counts) Since(start Counts) Counts { + c.Unifications -= start.Unifications + c.Conjuncts -= start.Conjuncts + c.Disjuncts -= start.Disjuncts + + c.Freed -= start.Freed + c.Retained -= start.Retained + c.Reused -= start.Reused + c.Allocs -= start.Allocs + + return c +} + +// Leaks reports the number of nodeContext structs leaked. These are typically +// benign, as they will just be garbage collected, as long as the pointer from +// the original nodes has been eliminated or the original nodes are also not +// referred to. But Leaks may have notable impact on performance, and thus +// should be avoided. +func (s Counts) Leaks() int64 { + return s.Allocs + s.Reused - s.Freed +} + +var stats = template.Must(template.New("stats").Parse(`{{"" -}} + +Leaks: {{.Leaks}} +Freed: {{.Freed}} +Reused: {{.Reused}} +Allocs: {{.Allocs}} +Retain: {{.Retained}} + +Unifications: {{.Unifications}} +Conjuncts: {{.Conjuncts}} +Disjuncts: {{.Disjuncts}}`)) + +func (s Counts) String() string { + buf := &strings.Builder{} + err := stats.Execute(buf, s) + if err != nil { + panic(err) + } + return buf.String() +} diff --git a/vendor/cuelang.org/go/cue/token/position.go b/vendor/cuelang.org/go/cue/token/position.go index 93710838..577254f8 100644 --- a/vendor/cuelang.org/go/cue/token/position.go +++ b/vendor/cuelang.org/go/cue/token/position.go @@ -43,7 +43,6 @@ func (pos *Position) IsValid() bool { return pos.Line > 0 } // line:column valid position without file name // file invalid position with file name // - invalid position without file name -// func (pos Position) String() string { s := pos.Filename if pos.IsValid() { @@ -61,7 +60,6 @@ func (pos Position) String() string { // Pos is a compact encoding of a source position within a file, as well as // relative positioning information. It can be converted into a Position for a // more convenient, but much larger, representation. -// type Pos struct { file *File offset int @@ -69,7 +67,6 @@ type Pos struct { // File returns the file that contains the position p or nil if there is no // such file (for instance for p == NoPos). -// func (p Pos) File() *File { if p.index() == 0 { return nil @@ -250,7 +247,6 @@ func (f *File) LineCount() int { // AddLine adds the line offset for a new line. // The line offset must be larger than the offset for the previous line // and smaller than the file size; otherwise the line offset is ignored. -// func (f *File) AddLine(offset int) { x := index(offset) f.mutex.Lock() @@ -264,7 +260,6 @@ func (f *File) AddLine(offset int) { // the newline character at the end of the line with a space (to not change the // remaining offsets). To obtain the line number, consult e.g. Position.Line. // MergeLine will panic if given an invalid line number. -// func (f *File) MergeLine(line int) { if line <= 0 { panic("illegal line number (line numbering starts at 1)") @@ -291,7 +286,6 @@ func (f *File) MergeLine(line int) { // and smaller than the file size; otherwise SetLines fails and returns // false. // Callers must not mutate the provided slice after SetLines returns. -// func (f *File) SetLines(lines []int) bool { // verify validity of lines table size := f.size @@ -349,7 +343,6 @@ type lineInfo struct { // // AddLineInfo is typically used to register alternative position // information for //line filename:line comments in source files. -// func (f *File) AddLineInfo(offset int, filename string, line int) { x := index(offset) f.mutex.Lock() @@ -362,7 +355,6 @@ func (f *File) AddLineInfo(offset int, filename string, line int) { // Pos returns the Pos value for the given file offset; // the offset must be <= f.Size(). // f.Pos(f.Offset(p)) == p. -// func (f *File) Pos(offset int, rel RelPos) Pos { if index(offset) > f.size { panic("illegal file offset") @@ -373,7 +365,6 @@ func (f *File) Pos(offset int, rel RelPos) Pos { // Offset returns the offset for the given file position p; // p must be a valid Pos value in that file. // f.Offset(f.Pos(offset)) == offset. -// func (f *File) Offset(p Pos) int { x := p.index() if x < f.base || x > f.base+index(f.size) { @@ -384,7 +375,6 @@ func (f *File) Offset(p Pos) int { // Line returns the line number for the given file position p; // p must be a Pos value in that file or NoPos. -// func (f *File) Line(p Pos) int { return f.Position(p).Line } @@ -396,7 +386,6 @@ func searchLineInfos(a []lineInfo, x int) int { // unpack returns the filename and line and column number for a file offset. // If adjusted is set, unpack will return the filename and line information // possibly adjusted by //line comments; otherwise those comments are ignored. -// func (f *File) unpack(offset index, adjusted bool) (filename string, line, column int) { filename = f.name if i := searchInts(f.lines, offset); i >= 0 { @@ -426,7 +415,6 @@ func (f *File) position(p Pos, adjusted bool) (pos Position) { // If adjusted is set, the position may be adjusted by position-altering // //line comments; otherwise those comments are ignored. // p must be a Pos value in f or NoPos. -// func (f *File) PositionFor(p Pos, adjusted bool) (pos Position) { x := p.index() if p != NoPos { @@ -440,7 +428,6 @@ func (f *File) PositionFor(p Pos, adjusted bool) (pos Position) { // Position returns the Position value for the given file position p. // Calling f.Position(p) is equivalent to calling f.PositionFor(p, true). -// func (f *File) Position(p Pos) (pos Position) { return f.PositionFor(p, true) } diff --git a/vendor/cuelang.org/go/cue/token/token.go b/vendor/cuelang.org/go/cue/token/token.go index 5e154434..f09d2a38 100644 --- a/vendor/cuelang.org/go/cue/token/token.go +++ b/vendor/cuelang.org/go/cue/token/token.go @@ -87,7 +87,6 @@ const ( RBRACE // } SEMICOLON // ; COLON // : - ISA // :: OPTION // ? operatorEnd @@ -97,6 +96,7 @@ const ( FOR IN LET + FUNC // experimental TRUE FALSE @@ -161,7 +161,6 @@ var tokens = [...]string{ RBRACE: "}", SEMICOLON: ";", COLON: ":", - ISA: "::", OPTION: "?", BOTTOM: "_|_", @@ -170,10 +169,11 @@ var tokens = [...]string{ TRUE: "true", NULL: "null", - FOR: "for", - IF: "if", - IN: "in", - LET: "let", + FOR: "for", + IF: "if", + IN: "in", + LET: "let", + FUNC: "func", } // String returns the string corresponding to the token tok. @@ -212,7 +212,6 @@ const ( // Precedence returns the operator precedence of the binary // operator op. If op is not a binary operator, the result // is LowestPrecedence. -// func (tok Token) Precedence() int { switch tok { case OR: @@ -243,7 +242,6 @@ func init() { } // Lookup maps an identifier to its keyword token or IDENT (if not a keyword). -// func Lookup(ident string) Token { if tok, isKeyword := keywords[ident]; isKeyword { return tok diff --git a/vendor/cuelang.org/go/cue/types.go b/vendor/cuelang.org/go/cue/types.go index 11528bef..0c602b2f 100644 --- a/vendor/cuelang.org/go/cue/types.go +++ b/vendor/cuelang.org/go/cue/types.go @@ -23,10 +23,10 @@ import ( "math/big" "strings" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/cue/ast" - "cuelang.org/go/cue/ast/astutil" + "cuelang.org/go/cue/build" "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" "cuelang.org/go/internal" @@ -38,6 +38,7 @@ import ( "cuelang.org/go/internal/core/runtime" "cuelang.org/go/internal/core/subsume" "cuelang.org/go/internal/core/validate" + internaljson "cuelang.org/go/internal/encoding/json" "cuelang.org/go/internal/types" ) @@ -88,10 +89,10 @@ const ( // // TODO: remove type structValue struct { - ctx *adt.OpContext - v Value - obj *adt.Vertex - features []adt.Feature + ctx *adt.OpContext + v Value + obj *adt.Vertex + arcs []*adt.Vertex } type hiddenStructValue = structValue @@ -101,28 +102,17 @@ func (o *hiddenStructValue) Len() int { if o.obj == nil { return 0 } - return len(o.features) + return len(o.arcs) } // At reports the key and value of the ith field, i < o.Len(). func (o *hiddenStructValue) At(i int) (key string, v Value) { - f := o.features[i] - return o.v.idx.LabelStr(f), newChildValue(o, i) + arc := o.arcs[i] + return o.v.idx.LabelStr(arc.Label), newChildValue(o, i) } -func (o *hiddenStructValue) at(i int) (v *adt.Vertex, isOpt bool) { - f := o.features[i] - arc := o.obj.Lookup(f) - if arc == nil { - arc = &adt.Vertex{ - Parent: o.v.v, - Label: f, - } - o.obj.MatchAndInsert(o.ctx, arc) - arc.Finalize(o.ctx) - isOpt = true - } - return arc, isOpt +func (o *hiddenStructValue) at(i int) *adt.Vertex { + return o.arcs[i] } // Lookup reports the field for the given key. The returned Value is invalid @@ -132,7 +122,7 @@ func (o *hiddenStructValue) Lookup(key string) Value { i := 0 len := o.Len() for ; i < len; i++ { - if o.features[i] == f { + if o.arcs[i].Label == f { break } } @@ -158,13 +148,13 @@ func (o *structValue) marshalJSON() (b []byte, err errors.Error) { n := o.Len() for i := 0; i < n; i++ { k, v := o.At(i) - s, err := json.Marshal(k) + s, err := internaljson.Marshal(k) if err != nil { return nil, unwrapJSONError(err) } b = append(b, s...) b = append(b, ':') - bb, err := json.Marshal(v) + bb, err := internaljson.Marshal(v) if err != nil { return nil, unwrapJSONError(err) } @@ -220,25 +210,19 @@ func unwrapJSONError(err error) errors.Error { } // An Iterator iterates over values. -// type Iterator struct { - val Value - idx *runtime.Runtime - ctx *adt.OpContext - arcs []field - p int - cur Value - f adt.Feature - isOpt bool + val Value + idx *runtime.Runtime + ctx *adt.OpContext + arcs []*adt.Vertex + p int + cur Value + f adt.Feature + arcType adt.ArcType } type hiddenIterator = Iterator -type field struct { - arc *adt.Vertex - isOptional bool -} - // Next advances the iterator to the next value and reports whether there was // any. It must be called before the first call to Value or Key. func (i *Iterator) Next() bool { @@ -246,12 +230,12 @@ func (i *Iterator) Next() bool { i.cur = Value{} return false } - f := i.arcs[i.p] - f.arc.Finalize(i.ctx) - p := linkParent(i.val.parent_, i.val.v, f.arc) - i.cur = makeValue(i.val.idx, f.arc, p) - i.f = f.arc.Label - i.isOpt = f.isOptional + arc := i.arcs[i.p] + arc.Finalize(i.ctx) + p := linkParent(i.val.parent_, i.val.v, arc) + i.cur = makeValue(i.val.idx, arc, p) + i.f = arc.Label + i.arcType = arc.ArcType i.p++ return true } @@ -264,13 +248,12 @@ func (i *Iterator) Value() Value { // Selector reports the field label of this iteration. func (i *Iterator) Selector() Selector { - return featureToSel(i.f, i.idx) + return wrapConstraint(featureToSel(i.f, i.idx), fromArcType(i.arcType)) } // Label reports the label of the value if i iterates over struct fields and "" // otherwise. // -// // Slated to be deprecated: use i.Selector().String(). Note that this will give // more accurate string representations. func (i *hiddenIterator) Label() string { @@ -289,7 +272,12 @@ func (i *hiddenIterator) IsHidden() bool { // IsOptional reports if a field is optional. func (i *Iterator) IsOptional() bool { - return i.isOpt + return i.arcType == adt.ArcOptional +} + +// FieldType reports the type of the field. +func (i *Iterator) FieldType() SelectorType { + return featureToSelType(i.f, i.arcType) } // IsDefinition reports if a field is a definition. @@ -305,7 +293,7 @@ func marshalList(l *Iterator) (b []byte, err errors.Error) { b = append(b, '[') if l.Next() { for i := 0; ; i++ { - x, err := json.Marshal(l.Value()) + x, err := internaljson.Marshal(l.Value()) if err != nil { return nil, unwrapJSONError(err) } @@ -347,7 +335,7 @@ func (v Value) MantExp(mant *big.Int) (exp int, err error) { return 0, ErrInfinite } if mant != nil { - mant.Set(&n.X.Coeff) + mant.Set(n.X.Coeff.MathBigInt()) if n.X.Negative { mant.Neg(mant) } @@ -383,7 +371,7 @@ func (v Value) AppendFloat(buf []byte, fmt byte, prec int) ([]byte, error) { if err != nil { return nil, err } - ctx := apd.BaseContext + ctx := internal.BaseContext nd := int(apd.NumDigits(&n.X.Coeff)) + int(n.X.Exponent) if n.X.Form == apd.Infinite { if n.X.Negative { @@ -392,9 +380,9 @@ func (v Value) AppendFloat(buf []byte, fmt byte, prec int) ([]byte, error) { return append(buf, string('∞')...), nil } if fmt == 'f' && nd > 0 { - ctx.Precision = uint32(nd + prec) + ctx = ctx.WithPrecision(uint32(nd + prec)) } else { - ctx.Precision = uint32(prec) + ctx = ctx.WithPrecision(uint32(prec)) } var d apd.Decimal ctx.Round(&d, &n.X) @@ -427,7 +415,7 @@ func (v Value) Int(z *big.Int) (*big.Int, error) { if n.X.Exponent != 0 { panic("cue: exponent should always be nil for integer types") } - z.Set(&n.X.Coeff) + z.Set(n.X.Coeff.MathBigInt()) if n.X.Negative { z.Neg(z) } @@ -475,7 +463,7 @@ func (v Value) Uint64() (uint64, error) { return i, nil } -// trimZeros trims 0's for better JSON respresentations. +// trimZeros trims 0's for better JSON representations. func trimZeros(s string) string { n1 := len(s) s2 := strings.TrimRight(s, "0") @@ -506,8 +494,7 @@ func init() { // math.MaxFloat64: 2**1023 * (2**53 - 1) / 2**52 max = "1.797693134862315708145274237317043567981e+308" ) - ctx := apd.BaseContext - ctx.Precision = 40 + ctx := internal.BaseContext.WithPrecision(40) var err error smallestPosFloat64, _, err = ctx.NewFromString(smallest) @@ -539,6 +526,9 @@ func (v Value) Float64() (float64, error) { if err != nil { return 0, err } + if n.X.IsZero() { + return 0.0, nil + } if n.X.Negative { if n.X.Cmp(smallestNegFloat64) == 1 { return -0, ErrAbove @@ -612,7 +602,7 @@ func newErrValue(v Value, b *adt.Bottom) Value { node.Label = v.v.Label node.Parent = v.v.Parent } - node.UpdateStatus(adt.Finalized) + node.ForceDone() node.AddConjunct(adt.MakeRootConjunct(nil, b)) return makeChildValue(v.parent(), node) } @@ -623,7 +613,7 @@ func newVertexRoot(idx *runtime.Runtime, ctx *adt.OpContext, x *adt.Vertex) Valu // with an error value. x.Finalize(ctx) } else { - x.UpdateStatus(adt.Finalized) + x.ForceDone() } return makeValue(idx, x, nil) } @@ -638,7 +628,7 @@ func newValueRoot(idx *runtime.Runtime, ctx *adt.OpContext, x adt.Expr) Value { } func newChildValue(o *structValue, i int) Value { - arc, _ := o.at(i) + arc := o.at(i) return makeValue(o.v.idx, arc, linkParent(o.v.parent_, o.v.v, arc)) } @@ -657,7 +647,7 @@ func Dereference(v Value) Value { } ctx := v.ctx() - n, b := ctx.Resolve(c.Env, r) + n, b := ctx.Resolve(c, r) if b != nil { return newErrValue(v, b) } @@ -698,7 +688,7 @@ func linkParent(p *parent, node, arc *adt.Vertex) *parent { func remakeValue(base Value, env *adt.Environment, v adt.Expr) Value { // TODO: right now this is necessary because disjunctions do not have // populated conjuncts. - if v, ok := v.(*adt.Vertex); ok && v.Status() >= adt.Partial { + if v, ok := v.(*adt.Vertex); ok && !v.IsUnprocessed() { return Value{base.idx, v, nil} } n := &adt.Vertex{Label: base.v.Label} @@ -710,7 +700,7 @@ func remakeValue(base Value, env *adt.Environment, v adt.Expr) Value { func remakeFinal(base Value, env *adt.Environment, v adt.Value) Value { n := &adt.Vertex{Parent: base.v.Parent, Label: base.v.Label, BaseValue: v} - n.UpdateStatus(adt.Finalized) + n.ForceDone() return makeChildValue(base.parent(), n) } @@ -922,7 +912,7 @@ func (v Value) MarshalJSON() (b []byte, err error) { func (v Value) marshalJSON() (b []byte, err error) { v, _ = v.Default() if v.v == nil { - return json.Marshal(nil) + return internaljson.Marshal(nil) } ctx := newContext(v.idx) x := v.eval(ctx) @@ -937,17 +927,17 @@ func (v Value) marshalJSON() (b []byte, err error) { // TODO: implement marshalles in value. switch k := x.Kind(); k { case adt.NullKind: - return json.Marshal(nil) + return internaljson.Marshal(nil) case adt.BoolKind: - return json.Marshal(x.(*adt.Bool).B) + return internaljson.Marshal(x.(*adt.Bool).B) case adt.IntKind, adt.FloatKind, adt.NumKind: b, err := x.(*adt.Num).X.MarshalText() b = bytes.TrimLeft(b, "+") return b, err case adt.StringKind: - return json.Marshal(x.(*adt.String).Str) + return internaljson.Marshal(x.(*adt.String).Str) case adt.BytesKind: - return json.Marshal(x.(*adt.Bytes).B) + return internaljson.Marshal(x.(*adt.Bytes).B) case adt.ListKind: i, _ := v.List() return marshalList(&i) @@ -985,6 +975,7 @@ func (v Value) Syntax(opts ...Option) ast.Node { ShowAttributes: !o.omitAttrs, ShowDocs: o.docs, ShowErrors: o.showErrors, + InlineImports: o.inlineImports, } pkgID := v.instance().ID() @@ -1016,20 +1007,12 @@ You could file a bug with the above information at: var err error var f *ast.File if o.concrete || o.final || o.resolveReferences { - // inst = v.instance() - var expr ast.Expr - expr, err = p.Value(v.idx, pkgID, v.v) - if err != nil { - return bad(`"cuelang.org/go/internal/core/export".Value`, err) - } - - // This introduces gratuitous unshadowing! - f, err = astutil.ToFile(expr) + f, err = p.Vertex(v.idx, pkgID, v.v) if err != nil { - return bad(`"cuelang.org/go/ast/astutil".ToFile`, err) + return bad(`"cuelang.org/go/internal/core/export".Vertex`, err) } - // return expr } else { + p.AddPackage = true f, err = p.Def(v.idx, pkgID, v.v) if err != nil { return bad(`"cuelang.org/go/internal/core/export".Def`, err) @@ -1085,9 +1068,9 @@ func (v hiddenValue) Split() []Value { } // Source returns the original node for this value. The return value may not -// be a syntax.Expr. For instance, a struct kind may be represented by a +// be an [ast.Expr]. For instance, a struct kind may be represented by a // struct literal, a field comprehension, or a file. It returns nil for -// computed nodes. Use Split to get all source values that apply to a field. +// computed nodes. Use [Value.Expr] to get all source values that apply to a field. func (v Value) Source() ast.Node { if v.v == nil { return nil @@ -1098,6 +1081,18 @@ func (v Value) Source() ast.Node { return v.v.Value().Source() } +// If v exactly represents a package, BuildInstance returns +// the build instance corresponding to the value; otherwise it returns nil. +// +// The value returned by Value.ReferencePath will commonly represent +// a package. +func (v Value) BuildInstance() *build.Instance { + if v.idx == nil { + return nil + } + return v.idx.GetInstanceFromNode(v.v) +} + // Err returns the error represented by v or nil v is not an error. func (v Value) Err() error { if err := v.checkKind(v.ctx(), adt.BottomKind); err != nil { @@ -1139,7 +1134,7 @@ func (v Value) Pos() token.Pos { // TODO: IsFinal: this value can never be changed. // IsClosed reports whether a list of struct is closed. It reports false when -// when the value is not a list or struct. +// the value is not a list or struct. // // Deprecated: use Allows(AnyString) and Allows(AnyIndex) or Kind/IncompleteKind. func (v hiddenValue) IsClosed() bool { @@ -1287,10 +1282,10 @@ func (v Value) List() (Iterator, error) { if err := v.checkKind(ctx, adt.ListKind); err != nil { return Iterator{idx: v.idx, ctx: ctx}, v.toErr(err) } - arcs := []field{} + arcs := []*adt.Vertex{} for _, a := range v.v.Elems() { if a.Label.IsInt() { - arcs = append(arcs, field{arc: a}) + arcs = append(arcs, a) } } return Iterator{idx: v.idx, ctx: ctx, val: v, arcs: arcs}, nil @@ -1371,10 +1366,6 @@ func (v Value) structValData(ctx *adt.OpContext) (structValue, *adt.Bottom) { }) } -func (v Value) structValFull(ctx *adt.OpContext) (structValue, *adt.Bottom) { - return v.structValOpts(ctx, options{allowScalar: true}) -} - // structVal returns an structVal or an error if v is not a struct. func (v Value) structValOpts(ctx *adt.OpContext, o options) (s structValue, err *adt.Bottom) { v, _ = v.Default() @@ -1384,10 +1375,8 @@ func (v Value) structValOpts(ctx *adt.OpContext, o options) (s structValue, err switch b, ok := v.v.BaseValue.(*adt.Bottom); { case ok && b.IsIncomplete() && !o.concrete && !o.final: - // TODO: - // case o.allowScalar, !o.omitHidden, !o.omitDefinitions: - // Allow scalar values if hidden or definition fields are requested? - case o.allowScalar: + // Allow scalar values if hidden or definition fields are requested. + case !o.omitHidden, !o.omitDefinitions: default: obj, err = v.getStruct() if err != nil { @@ -1395,41 +1384,55 @@ func (v Value) structValOpts(ctx *adt.OpContext, o options) (s structValue, err } } + // features are topologically sorted. + // TODO(sort): make sort order part of the evaluator and eliminate this. features := export.VertexFeatures(ctx, obj) - k := 0 + arcs := make([]*adt.Vertex, 0, len(obj.Arcs)) + for _, f := range features { + if f.IsLet() { + continue + } if f.IsDef() && (o.omitDefinitions || o.concrete) { continue } if f.IsHidden() && o.omitHidden { continue } - if arc := obj.Lookup(f); arc == nil { + arc := obj.Lookup(f) + if arc == nil { + continue + } + switch arc.ArcType { + case adt.ArcOptional: if o.omitOptional { continue } - // ensure it really exists. - v := adt.Vertex{ - Parent: obj, - Label: f, - } - obj.MatchAndInsert(ctx, &v) - if len(v.Conjuncts) == 0 { - continue + case adt.ArcRequired: + // We report an error for required fields if the configuration is + // final or concrete. We also do so if omitOptional is true, as + // it avoids hiding errors in required fields. + if o.omitOptional || o.concrete || o.final { + arc = &adt.Vertex{ + Label: arc.Label, + Parent: arc.Parent, + Conjuncts: arc.Conjuncts, + BaseValue: adt.NewRequiredNotPresentError(ctx, arc), + } + arc.ForceDone() } } - features[k] = f - k++ + arcs = append(arcs, arc) } - features = features[:k] - return structValue{ctx, v, obj, features}, nil + return structValue{ctx, v, obj, arcs}, nil } // Struct returns the underlying struct of a value or an error if the value // is not a struct. +// +// Deprecated: use Fields. func (v hiddenValue) Struct() (*Struct, error) { - // TODO: deprecate ctx := v.ctx() obj, err := v.structValOpts(ctx, options{}) if err != nil { @@ -1456,12 +1459,16 @@ type Struct struct { type hiddenStruct = Struct // FieldInfo contains information about a struct field. +// +// Deprecated: only used by deprecated functions. type FieldInfo struct { Selector string Name string // Deprecated: use Selector Pos int Value Value + SelectorType SelectorType + IsDefinition bool IsOptional bool IsHidden bool @@ -1473,13 +1480,15 @@ func (s *hiddenStruct) Len() int { // field reports information about the ith field, i < o.Len(). func (s *hiddenStruct) Field(i int) FieldInfo { - a, opt := s.at(i) + a := s.at(i) + opt := a.ArcType == adt.ArcOptional + selType := featureToSelType(a.Label, a.ArcType) ctx := s.v.ctx() v := makeChildValue(s.v, a) name := s.v.idx.LabelStr(a.Label) str := a.Label.SelectorString(ctx) - return FieldInfo{str, name, i, v, a.Label.IsDef(), opt, a.Label.IsHidden()} + return FieldInfo{str, name, i, v, selType, a.Label.IsDef(), opt, a.Label.IsHidden()} } // FieldByName looks up a field for the given name. If isIdent is true, it will @@ -1487,8 +1496,8 @@ func (s *hiddenStruct) Field(i int) FieldInfo { // it interprets name as an arbitrary string for a regular field. func (s *hiddenStruct) FieldByName(name string, isIdent bool) (FieldInfo, error) { f := s.v.idx.Label(name, isIdent) - for i, a := range s.features { - if a == f { + for i, a := range s.arcs { + if a.Label == f { return s.Field(i), nil } } @@ -1512,12 +1521,7 @@ func (v Value) Fields(opts ...Option) (*Iterator, error) { return &Iterator{idx: v.idx, ctx: ctx}, v.toErr(err) } - arcs := []field{} - for i := range obj.features { - arc, isOpt := obj.at(i) - arcs = append(arcs, field{arc: arc, isOptional: isOpt}) - } - return &Iterator{idx: v.idx, ctx: ctx, val: v, arcs: arcs}, nil + return &Iterator{idx: v.idx, ctx: ctx, val: v, arcs: obj.arcs}, nil } // Lookup reports the value at a path starting from v. The empty path returns v @@ -1573,7 +1577,7 @@ func appendPath(a []Selector, v Value) []Selector { } var sel selector - switch f.Typ() { + switch t := f.Typ(); t { case adt.IntLabel: sel = indexSelector(f) case adt.DefinitionLabel: @@ -1587,6 +1591,9 @@ func appendPath(a []Selector, v Value) []Selector { case adt.StringLabel: sel = stringSelector(f.StringValue(v.idx)) + + default: + panic(fmt.Sprintf("unsupported label type %v", t)) } return append(a, Selector{sel}) } @@ -1680,7 +1687,6 @@ func (v hiddenValue) Fill(x interface{}, path ...string) Value { // // Any reference in v referring to the value at the given path will resolve to x // in the newly created value. The resulting value is not validated. -// func (v Value) FillPath(p Path, x interface{}) Value { if v.v == nil { // TODO: panic here? @@ -1705,8 +1711,8 @@ func (v Value) FillPath(p Path, x interface{}) Value { expr = convert.GoValueToValue(ctx, x, true) } for i := len(p.path) - 1; i >= 0; i-- { - switch sel := p.path[i].sel; { - case sel == AnyString.sel: + switch sel := p.path[i]; sel.Type() { + case StringLabel | PatternConstraint: expr = &adt.StructLit{Decls: []adt.Decl{ &adt.BulkOptionalField{ Filter: &adt.BasicType{K: adt.StringKind}, @@ -1714,17 +1720,13 @@ func (v Value) FillPath(p Path, x interface{}) Value { }, }} - case sel == anyIndex.sel: + case IndexLabel | PatternConstraint: expr = &adt.ListLit{Elems: []adt.Elem{ &adt.Ellipsis{Value: expr}, }} - case sel == anyDefinition.sel: - expr = &adt.Bottom{Err: errors.Newf(token.NoPos, - "AnyDefinition not supported")} - - case sel.kind() == adt.IntLabel: - i := sel.feature(ctx.Runtime).Index() + case IndexLabel: + i := sel.Index() list := &adt.ListLit{} any := &adt.Top{} // TODO(perf): make this a constant thing. This will be possible with the query extension. @@ -1735,19 +1737,19 @@ func (v Value) FillPath(p Path, x interface{}) Value { expr = list default: - var d adt.Decl - if sel.optional() { - d = &adt.OptionalField{ - Label: sel.feature(v.idx), - Value: expr, - } - } else { - d = &adt.Field{ - Label: sel.feature(v.idx), - Value: expr, - } + f := &adt.Field{ + Label: sel.sel.feature(v.idx), + Value: expr, + ArcType: adt.ArcMember, + } + switch sel.ConstraintType() { + case OptionalConstraint: + f.ArcType = adt.ArcOptional + case RequiredConstraint: + f.ArcType = adt.ArcRequired } - expr = &adt.StructLit{Decls: []adt.Decl{d}} + + expr = &adt.StructLit{Decls: []adt.Decl{f}} } } n := &adt.Vertex{} @@ -1815,7 +1817,7 @@ func (v Value) Subsume(w Value, opts ...Option) error { // // Subsumes reports whether w is an instance of v. // -// Without options, Subsumes checks whether v is a backwards compatbile schema +// Without options, Subsumes checks whether v is a backwards compatible schema // of w. // // By default, Subsumes tests whether two values are compatible @@ -1875,7 +1877,7 @@ func (v Value) Unify(w Value) Value { n.Label = v.v.Label n.Closed = v.v.Closed || w.v.Closed - if err := n.Err(ctx, adt.Finalized); err != nil { + if err := n.Err(ctx); err != nil { return makeValue(v.idx, n, v.parent_) } if err := allowed(ctx, v.v, n); err != nil { @@ -1888,8 +1890,11 @@ func (v Value) Unify(w Value) Value { return makeValue(v.idx, n, v.parent_) } -// UnifyAccept is as v.Unify(w), but will disregard any field that is allowed -// in the Value accept. +// UnifyAccept is as v.Unify(w), but will disregard the closedness rules for +// v and w, and will, instead, only allow fields that are present in accept. +// +// UnifyAccept is used to piecemeal unify individual conjuncts obtained from +// accept without violating closedness rules. func (v Value) UnifyAccept(w Value, accept Value) Value { if v.v == nil { return w @@ -1911,7 +1916,7 @@ func (v Value) UnifyAccept(w Value, accept Value) Value { n.Parent = v.v.Parent n.Label = v.v.Label - if err := n.Err(ctx, adt.Finalized); err != nil { + if err := n.Err(ctx); err != nil { return makeValue(v.idx, n, v.parent_) } if err := allowed(ctx, accept.v, n); err != nil { @@ -2047,13 +2052,13 @@ type options struct { omitDefinitions bool omitOptional bool omitAttrs bool + inlineImports bool resolveReferences bool showErrors bool final bool ignoreClosedness bool // used for comparing APIs docs bool disallowCycles bool // implied by concrete - allowScalar bool } // An Option defines modes of evaluation. @@ -2096,14 +2101,24 @@ func Concrete(concrete bool) Option { } } -// DisallowCycles forces validation in the precense of cycles, even if +// InlineImports causes references to values within imported packages to be +// inlined. References to builtin packages are not inlined. +func InlineImports(expand bool) Option { + return func(p *options) { p.inlineImports = expand } +} + +// DisallowCycles forces validation in the presence of cycles, even if // non-concrete values are allowed. This is implied by Concrete(true). func DisallowCycles(disallow bool) Option { return func(p *options) { p.disallowCycles = disallow } } // ResolveReferences forces the evaluation of references when outputting. -// This implies the input cannot have cycles. +// +// Deprecated: Syntax will now always attempt to resolve dangling references and +// make the output self-contained. When Final or Concrete is used, it will +// already attempt to resolve all references. +// See also InlineImports. func ResolveReferences(resolve bool) Option { return func(p *options) { p.resolveReferences = resolve @@ -2121,6 +2136,14 @@ func ResolveReferences(resolve bool) Option { } } +// ErrorsAsValues treats errors as a regular value, including them at the +// location in the tree where they occur, instead of interpreting them as a +// configuration-wide failure that is returned instead of root value. +// Used by Syntax. +func ErrorsAsValues(show bool) Option { + return func(p *options) { p.showErrors = show } +} + // Raw tells Syntax to generate the value as is without any simplifications. func Raw() Option { return func(p *options) { p.raw = true } @@ -2145,7 +2168,7 @@ func Docs(include bool) Option { // Definitions indicates whether definitions should be included. // // Definitions may still be included for certain functions if they are referred -// to by other other values. +// to by other values. func Definitions(include bool) Option { return func(p *options) { p.hasHidden = true @@ -2186,26 +2209,32 @@ func (o *options) updateOptions(opts []Option) { // Validate reports any errors, recursively. The returned error may represent // more than one error, retrievable with errors.Errors, if more than one // exists. +// +// Note that by default not all errors are reported, unless options like +// Concrete are used. The Final option can be used to check for missing +// required fields. func (v Value) Validate(opts ...Option) error { o := options{} o.updateOptions(opts) cfg := &validate.Config{ Concrete: o.concrete, + Final: o.final, DisallowCycles: o.disallowCycles, AllErrors: true, } b := validate.Validate(v.ctx(), v.v, cfg) if b != nil { - return b.Err + return v.toErr(b) } return nil } // Walk descends into all values of v, calling f. If f returns false, Walk // will not descent further. It only visits values that are part of the data -// model, so this excludes optional fields, hidden fields, and definitions. +// model, so this excludes definitions and optional, required, and hidden +// fields. func (v Value) Walk(before func(Value) bool, after func(Value)) { ctx := v.ctx() switch v.Kind() { @@ -2213,9 +2242,17 @@ func (v Value) Walk(before func(Value) bool, after func(Value)) { if before != nil && !before(v) { return } - obj, _ := v.structValData(ctx) + obj, _ := v.structValOpts(ctx, options{ + omitHidden: true, + omitDefinitions: true, + }) for i := 0; i < obj.Len(); i++ { _, v := obj.At(i) + // TODO: should we error on required fields, or visit them anyway? + // Walk is not designed to error at this moment, though. + if v.v.ArcType != adt.ArcMember { + continue + } v.Walk(before, after) } case ListKind: @@ -2357,8 +2394,8 @@ func (v Value) Expr() (Op, []Value) { b.AddConjunct(adt.MakeRootConjunct(env, disjunct.Val)) ctx := eval.NewContext(v.idx, nil) - ctx.Unify(&a, adt.Finalized) - ctx.Unify(&b, adt.Finalized) + a.Finalize(ctx) + b.Finalize(ctx) if allowed(ctx, v.v, &b) != nil { // Everything subsumed bottom continue outerExpr diff --git a/vendor/cuelang.org/go/encoding/gocode/gocodec/codec.go b/vendor/cuelang.org/go/encoding/gocode/gocodec/codec.go index c40f5255..87879cb2 100644 --- a/vendor/cuelang.org/go/encoding/gocode/gocodec/codec.go +++ b/vendor/cuelang.org/go/encoding/gocode/gocodec/codec.go @@ -44,8 +44,10 @@ type Codec struct { // It is safe to use the methods of Codec concurrently as long as the given // Runtime is not used elsewhere while using Codec. However, only the concurrent // use of Decode, Validate, and Complete is efficient. -func New(r *cue.Runtime, c *Config) *Codec { - return &Codec{runtime: value.ConvertToContext(r)} +// +// Note: calling this with a *cue.Runtime value is deprecated. +func New[Ctx *cue.Runtime | *cue.Context](ctx Ctx, c *Config) *Codec { + return &Codec{runtime: value.ConvertToContext(ctx)} } // ExtractType extracts a CUE value from a Go type. @@ -58,12 +60,11 @@ func New(r *cue.Runtime, c *Config) *Codec { // field tag. The value of the tag is a CUE expression, which may contain // references to the JSON name of other fields in a struct. // -// type Sum struct { -// A int `cue:"c-b" json:"a,omitempty"` -// B int `cue:"c-a" json:"b,omitempty"` -// C int `cue:"a+b" json:"c,omitempty"` -// } -// +// type Sum struct { +// A int `cue:"c-b" json:"a,omitempty"` +// B int `cue:"c-a" json:"b,omitempty"` +// C int `cue:"a+b" json:"c,omitempty"` +// } func (c *Codec) ExtractType(x interface{}) (cue.Value, error) { // ExtractType cannot introduce new fields on repeated calls. We could // consider optimizing the lock usage based on this property. diff --git a/vendor/cuelang.org/go/encoding/json/json.go b/vendor/cuelang.org/go/encoding/json/json.go index 0e2c7f7c..69c89865 100644 --- a/vendor/cuelang.org/go/encoding/json/json.go +++ b/vendor/cuelang.org/go/encoding/json/json.go @@ -52,7 +52,7 @@ func Validate(b []byte, v cue.Value) error { if v.Err() != nil { return v.Err() } - return nil + return v.Validate(cue.Final()) } // Extract parses JSON-encoded data to a CUE expression, using path for diff --git a/vendor/cuelang.org/go/encoding/jsonschema/constraints.go b/vendor/cuelang.org/go/encoding/jsonschema/constraints.go index 2b9e1ec2..c40cf6a5 100644 --- a/vendor/cuelang.org/go/encoding/jsonschema/constraints.go +++ b/vendor/cuelang.org/go/encoding/jsonschema/constraints.go @@ -240,7 +240,7 @@ var constraints = []*constraint{ p1("examples", func(n cue.Value, s *state) { if n.Kind() != cue.ListKind { - s.errf(n, `value of "examples" must be an array, found %v`, n.Kind) + s.errf(n, `value of "examples" must be an array, found %v`, n.Kind()) } // TODO: implement examples properly. // for _, n := range s.listItems("examples", n, true) { @@ -469,7 +469,7 @@ var constraints = []*constraint{ state.doc(f) f.Optional = token.Blank.Pos() if len(obj.Elts) > 0 && len(f.Comments()) > 0 { - // TODO: change formatter such that either a a NewSection on the + // TODO: change formatter such that either a NewSection on the // field or doc comment will cause a new section. ast.SetRelPos(f.Comments()[0], token.NewSection) } @@ -488,7 +488,7 @@ var constraints = []*constraint{ p2("required", func(n cue.Value, s *state) { if n.Kind() != cue.ListKind { - s.errf(n, `value of "required" must be list of strings, found %v`, n.Kind) + s.errf(n, `value of "required" must be list of strings, found %v`, n.Kind()) return } @@ -573,7 +573,7 @@ var constraints = []*constraint{ p2("patternProperties", func(n cue.Value, s *state) { s.usedTypes |= cue.StructKind if n.Kind() != cue.StructKind { - s.errf(n, `value of "patternProperties" must be an an object, found %v`, n.Kind) + s.errf(n, `value of "patternProperties" must be an object, found %v`, n.Kind()) } obj := s.object(n) existing := excludeFields(s.obj.Elts) diff --git a/vendor/cuelang.org/go/encoding/jsonschema/decode.go b/vendor/cuelang.org/go/encoding/jsonschema/decode.go index 54f8fd6a..0e844247 100644 --- a/vendor/cuelang.org/go/encoding/jsonschema/decode.go +++ b/vendor/cuelang.org/go/encoding/jsonschema/decode.go @@ -643,17 +643,16 @@ func (s *state) listItems(name string, n cue.Value, allowEmpty bool) (a []cue.Va // excludeFields returns a CUE expression that can be used to exclude the // fields of the given declaration in a label expression. For instance, for // -// { foo: 1, bar: int } +// { foo: 1, bar: int } // // it creates // -// "^(foo|bar)$" +// "^(foo|bar)$" // // which can be used in a label expression to define types for all fields but // those existing: // -// [!~"^(foo|bar)$"]: string -// +// [!~"^(foo|bar)$"]: string func excludeFields(decls []ast.Decl) ast.Expr { var a []string for _, d := range decls { diff --git a/vendor/cuelang.org/go/encoding/jsonschema/jsonschema.go b/vendor/cuelang.org/go/encoding/jsonschema/jsonschema.go index a0f6283f..c7e7be43 100644 --- a/vendor/cuelang.org/go/encoding/jsonschema/jsonschema.go +++ b/vendor/cuelang.org/go/encoding/jsonschema/jsonschema.go @@ -14,17 +14,18 @@ // Package jsonschema implements the JSON schema standard. // -// Mapping and Linking +// # Mapping and Linking // // JSON Schema are often defined in a single file. CUE, on the other hand // idiomatically defines schema as a definition. // // CUE: -// $schema: which schema is used for validation. -// $id: which validation does this schema provide. // -// Foo: _ @jsonschema(sc) -// @source(https://...) // What schema is used to validate. +// $schema: which schema is used for validation. +// $id: which validation does this schema provide. +// +// Foo: _ @jsonschema(sc) +// @source(https://...) // What schema is used to validate. // // NOTE: JSON Schema is a draft standard and may undergo backwards incompatible // changes. diff --git a/vendor/cuelang.org/go/encoding/jsonschema/ref.go b/vendor/cuelang.org/go/encoding/jsonschema/ref.go index 26443fe1..81e0913f 100644 --- a/vendor/cuelang.org/go/encoding/jsonschema/ref.go +++ b/vendor/cuelang.org/go/encoding/jsonschema/ref.go @@ -171,9 +171,7 @@ func (s *state) makeCUERef(n cue.Value, u *url.URL) ast.Expr { base := path.Base(p) if !ast.IsValidIdent(base) { - if strings.HasSuffix(base, ".json") { - base = base[:len(base)-len(".json")] - } + base = strings.TrimSuffix(base, ".json") if !ast.IsValidIdent(base) { // Find something more clever to do there. For now just // pick "schema" as the package name. diff --git a/vendor/cuelang.org/go/encoding/openapi/build.go b/vendor/cuelang.org/go/encoding/openapi/build.go index f22a921b..b68b906c 100644 --- a/vendor/cuelang.org/go/encoding/openapi/build.go +++ b/vendor/cuelang.org/go/encoding/openapi/build.go @@ -20,7 +20,6 @@ import ( "path" "regexp" "sort" - "strconv" "strings" "cuelang.org/go/cue" @@ -29,22 +28,22 @@ import ( "cuelang.org/go/cue/token" "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" + internalvalue "cuelang.org/go/internal/value" ) type buildContext struct { - inst *cue.Instance - instExt *cue.Instance + inst cue.Value + instExt cue.Value refPrefix string - path []string + path []cue.Selector errs errors.Error expandRefs bool structural bool exclusiveBool bool - nameFunc func(inst *cue.Instance, path []string) string + nameFunc func(inst cue.Value, path cue.Path) string descFunc func(v cue.Value) string fieldFilter *regexp.Regexp - evalDepth int // detect cycles when resolving references schemas *OrderedMap @@ -58,12 +57,17 @@ type buildContext struct { // TODO: consider an option in the CUE API where optional fields are // recursively evaluated. cycleNodes []*adt.Vertex + + // imports caches values as returned by cue.Value.ReferencePath + // for use by ReferenceFunc. It's only initialised when ReferenceFunc + // is non-nil. + imports map[cue.Value]*cue.Instance } type externalType struct { ref string - inst *cue.Instance - path []string + inst cue.Value + path cue.Path value cue.Value } @@ -71,7 +75,9 @@ type oaSchema = OrderedMap type typeFunc func(b *builder, a cue.Value) -func schemas(g *Generator, inst *cue.Instance) (schemas *ast.StructLit, err error) { +func schemas(g *Generator, inst cue.InstanceOrValue) (schemas *ast.StructLit, err error) { + val := inst.Value() + _, isInstance := inst.(*cue.Instance) var fieldFilter *regexp.Regexp if g.FieldFilter != "" { fieldFilter, err = regexp.Compile(g.FieldFilter) @@ -93,18 +99,49 @@ func schemas(g *Generator, inst *cue.Instance) (schemas *ast.StructLit, err erro g.Version = "3.0.0" } - c := buildContext{ - inst: inst, - instExt: inst, + c := &buildContext{ + inst: val, + instExt: val, refPrefix: "components/schemas", expandRefs: g.ExpandReferences, structural: g.ExpandReferences, - nameFunc: g.ReferenceFunc, + nameFunc: g.NameFunc, descFunc: g.DescriptionFunc, schemas: &OrderedMap{}, externalRefs: map[string]*externalType{}, fieldFilter: fieldFilter, } + if g.ReferenceFunc != nil { + if !isInstance { + panic("cannot use ReferenceFunc along with cue.Value") + } + if g.NameFunc != nil { + panic("cannot specify both ReferenceFunc and NameFunc") + } + + c.nameFunc = func(val cue.Value, path cue.Path) string { + sels := path.Selectors() + labels := make([]string, len(sels)) + for i, sel := range sels { + labels[i] = selectorLabel(sel) // TODO this is arguably incorrect. + } + inst, ok := c.imports[val] + if !ok { + r, n := internalvalue.ToInternal(val) + buildInst := r.GetInstanceFromNode(n) + var err error + inst, err = (*cue.Runtime)(r).Build(buildInst) + if err != nil { + panic("cannot build instance from value") + } + if c.imports == nil { + c.imports = make(map[cue.Value]*cue.Instance) + } + c.imports[val] = inst + } + return g.ReferenceFunc(inst, labels) + } + } switch g.Version { case "3.0.0": @@ -131,22 +168,19 @@ func schemas(g *Generator, inst *cue.Instance) (schemas *ast.StructLit, err erro return nil, err } for i.Next() { - if !i.IsDefinition() { + sel := i.Selector() + if !sel.IsDefinition() { continue } // message, enum, or constant. - label := i.Label() - if c.isInternal(label) { + if c.isInternal(sel) { continue } - if i.IsDefinition() && strings.HasPrefix(label, "#") { - label = label[1:] - } - ref := c.makeRef(inst, []string{label}) + ref := c.makeRef(val, cue.MakePath(sel)) if ref == "" { continue } - c.schemas.Set(ref, c.build(label, i.Value())) + c.schemas.Set(ref, c.build(sel, i.Value())) } // keep looping until a fixed point is reached. @@ -163,9 +197,10 @@ func schemas(g *Generator, inst *cue.Instance) (schemas *ast.StructLit, err erro for _, k := range external { ext := c.externalRefs[k] c.instExt = ext.inst - last := len(ext.path) - 1 - c.path = ext.path[:last] - name := ext.path[last] + sels := ext.path.Selectors() + last := len(sels) - 1 + c.path = sels[:last] + name := sels[last] c.schemas.Set(ext.ref, c.build(name, cue.Dereference(ext.value))) } } @@ -180,21 +215,22 @@ func schemas(g *Generator, inst *cue.Instance) (schemas *ast.StructLit, err erro return (*ast.StructLit)(c.schemas), c.errs } -func (c *buildContext) build(name string, v cue.Value) *ast.StructLit { +func (c *buildContext) build(name cue.Selector, v cue.Value) *ast.StructLit { return newCoreBuilder(c).schema(nil, name, v) } // isInternal reports whether or not to include this type. -func (c *buildContext) isInternal(name string) bool { +func (c *buildContext) isInternal(sel cue.Selector) bool { // TODO: allow a regexp filter in Config. If we have closed structs and // definitions, this will likely be unnecessary. - return strings.HasSuffix(name, "_value") + return sel.Type().LabelType() == cue.DefinitionLabel && + strings.HasSuffix(sel.String(), "_value") } func (b *builder) failf(v cue.Value, format string, args ...interface{}) { panic(&openapiError{ - errors.NewMessage(format, args), - b.ctx.path, + errors.NewMessagef(format, args...), + cue.MakePath(b.ctx.path...), v.Pos(), }) } @@ -212,7 +248,7 @@ func (b *builder) checkArgs(a []cue.Value, n int) { } } -func (b *builder) schema(core *builder, name string, v cue.Value) *ast.StructLit { +func (b *builder) schema(core *builder, name cue.Selector, v cue.Value) *ast.StructLit { oldPath := b.ctx.path b.ctx.path = append(b.ctx.path, name) defer func() { b.ctx.path = oldPath }() @@ -340,9 +376,10 @@ func (b *builder) value(v cue.Value, f typeFunc) (isRef bool) { for _, v := range conjuncts { // This may be a reference to an enum. So we need to check references before // dissecting them. - switch p, r := v.Reference(); { - case len(r) > 0: - ref := b.ctx.makeRef(p, r) + + switch v1, path := v.ReferencePath(); { + case len(path.Selectors()) > 0: + ref := b.ctx.makeRef(v1, path) if ref == "" { v = cue.Dereference(v) break @@ -352,7 +389,7 @@ func (b *builder) value(v cue.Value, f typeFunc) (isRef bool) { } dedup[ref] = true - b.addRef(v, p, r) + b.addRef(v, v1, path) disallowDefault = true continue } @@ -365,7 +402,7 @@ func (b *builder) value(v cue.Value, f typeFunc) (isRef bool) { if count > 0 { // TODO: implement IsAny. // TODO: perhaps find optimal representation. For now we assume the - // representation as is is already optimized for human consumption. + // representation as is already optimized for human consumption. if values.IncompleteKind()&cue.StructKind != cue.StructKind && !isRef { values = values.Eval() } @@ -469,7 +506,7 @@ outer: if op == cue.NoOp && len(args) == 1 { // TODO: this is to deal with default value removal. This may change - // whe we completely separate default values from values. + // when we completely separate default values from values. a = append(a, args...) } else if op != splitBy { a = append(a, v) @@ -481,28 +518,6 @@ outer: return a } -func countNodes(v cue.Value) (n int) { - switch op, a := v.Expr(); op { - case cue.OrOp, cue.AndOp: - for _, v := range a { - n += countNodes(v) - } - n += len(a) - 1 - default: - switch v.Kind() { - case cue.ListKind: - for i, _ := v.List(); i.Next(); { - n += countNodes(i.Value()) - } - case cue.StructKind: - for i, _ := v.Fields(); i.Next(); { - n += countNodes(i.Value()) + 1 - } - } - } - return n + 1 -} - // isConcrete reports whether v is concrete and not a struct (recursively). // structs are not supported as the result of a struct enum depends on how // conjunctions and disjunctions are distributed. We could consider still doing @@ -691,18 +706,18 @@ func (b *builder) dispatch(f typeFunc, v cue.Value) { } // object supports the following -// - maxProperties: maximum allowed fields in this struct. -// - minProperties: minimum required fields in this struct. -// - patternProperties: [regexp]: schema -// TODO: we can support this once .kv(key, value) allow -// foo [=~"pattern"]: type -// An instance field must match all schemas for which a regexp matches. -// Even though it is not supported in OpenAPI, we should still accept it -// when receiving from OpenAPI. We could possibly use disjunctions to encode -// this. -// - dependencies: what? -// - propertyNames: schema -// every property name in the enclosed schema matches that of +// - maxProperties: maximum allowed fields in this struct. +// - minProperties: minimum required fields in this struct. +// - patternProperties: [regexp]: schema +// TODO: we can support this once .kv(key, value) allow +// foo [=~"pattern"]: type +// An instance field must match all schemas for which a regexp matches. +// Even though it is not supported in OpenAPI, we should still accept it +// when receiving from OpenAPI. We could possibly use disjunctions to encode +// this. +// - dependencies: what? +// - propertyNames: schema +// every property name in the enclosed schema matches that of func (b *builder) object(v cue.Value) { // TODO: discriminator objects: we could theoretically derive discriminator // objects automatically: for every object in a oneOf/allOf/anyOf, or any @@ -754,21 +769,19 @@ func (b *builder) object(v cue.Value) { } for i, _ := v.Fields(cue.Optional(true), cue.Definitions(true)); i.Next(); { - label := i.Label() - if b.ctx.isInternal(label) { + sel := i.Selector() + if b.ctx.isInternal(sel) { continue } - if i.IsDefinition() && strings.HasPrefix(label, "#") { - label = label[1:] - } + label := selectorLabel(sel) var core *builder if b.core != nil { core = b.core.properties[label] } - schema := b.schema(core, label, i.Value()) + schema := b.schema(core, sel, i.Value()) switch { - case i.IsDefinition(): - ref := b.ctx.makeRef(b.ctx.instExt, append(b.ctx.path, label)) + case sel.IsDefinition(): + ref := b.ctx.makeRef(b.ctx.instExt, cue.MakePath(append(b.ctx.path, sel)...)) if ref == "" { continue } @@ -784,7 +797,7 @@ func (b *builder) object(v cue.Value) { if t, ok := v.Elem(); ok && (b.core == nil || b.core.items == nil) && b.checkCycle(t) { - schema := b.schema(nil, "*", t) + schema := b.schema(nil, cue.AnyString, t) if len(schema.Elts) > 0 { b.setSingle("additionalProperties", schema, true) // Not allowed in structural. } @@ -797,25 +810,25 @@ func (b *builder) object(v cue.Value) { // List constraints: // // Max and min items. -// - maxItems: int (inclusive) -// - minItems: int (inclusive) -// - items (item type) -// schema: applies to all items -// array of schemas: -// schema at pos must match if both value and items are defined. -// - additional items: -// schema: where items must be an array of schemas, intstance elements -// succeed for if they match this value for any value at a position -// greater than that covered by items. -// - uniqueItems: bool -// TODO: support with list.Unique() unique() or comprehensions. -// For the latter, we need equality for all values, which is doable, -// but not done yet. +// - maxItems: int (inclusive) +// - minItems: int (inclusive) +// - items (item type) +// schema: applies to all items +// array of schemas: +// schema at pos must match if both value and items are defined. +// - additional items: +// schema: where items must be an array of schemas, intstance elements +// succeed for if they match this value for any value at a position +// greater than that covered by items. +// - uniqueItems: bool +// TODO: support with list.Unique() unique() or comprehensions. +// For the latter, we need equality for all values, which is doable, +// but not done yet. // // NOT SUPPORTED IN OpenAPI: -// - contains: -// schema: an array instance is valid if at least one element matches -// this schema. +// - contains: +// schema: an array instance is valid if at least one element matches +// this schema. func (b *builder) array(v cue.Value) { switch op, a := v.Expr(); op { @@ -859,7 +872,7 @@ func (b *builder) array(v cue.Value) { items := []ast.Expr{} count := 0 for i, _ := v.List(); i.Next(); count++ { - items = append(items, b.schema(nil, strconv.Itoa(count), i.Value())) + items = append(items, b.schema(nil, cue.Index(count), i.Value())) } if len(items) > 0 { // TODO: per-item schema are not allowed in OpenAPI, only in JSON Schema. @@ -889,7 +902,7 @@ func (b *builder) array(v cue.Value) { if b.core != nil { core = b.core.items } - t := b.schema(core, "*", typ) + t := b.schema(core, cue.AnyString, typ) if len(items) > 0 { b.setFilter("Schema", "additionalItems", t) // Not allowed in structural. } else if !b.isNonCore() || len(t.Elts) > 0 { @@ -1003,6 +1016,7 @@ func (b *builder) number(v cue.Value) { // - begin and end anchors: ^ and $ // - simple grouping: (...) // - alteration: | +// // This is a subset of RE2 used by CUE. // // Most notably absent: @@ -1018,7 +1032,6 @@ func (b *builder) number(v cue.Value) { // flag setting will be tricky. Unicode character classes, // boundaries, etc can be compiled into simple character classes, // although the resulting regexp will look cumbersome. -// func (b *builder) string(v cue.Value) { switch op, a := v.Expr(); op { @@ -1255,11 +1268,13 @@ func (b *builder) addConjunct(f func(*builder)) { b.add((*ast.StructLit)(c.finish())) } -func (b *builder) addRef(v cue.Value, inst *cue.Instance, ref []string) { +func (b *builder) addRef(v cue.Value, inst cue.Value, ref cue.Path) { name := b.ctx.makeRef(inst, ref) b.addConjunct(func(b *builder) { b.allOf = append(b.allOf, ast.NewStruct( - "$ref", ast.NewString(path.Join("#", b.ctx.refPrefix, name)))) + "$ref", + ast.NewString(path.Join("#", b.ctx.refPrefix, name)), + )) }) if b.ctx.inst != inst { @@ -1272,20 +1287,19 @@ func (b *builder) addRef(v cue.Value, inst *cue.Instance, ref []string) { } } -func (b *buildContext) makeRef(inst *cue.Instance, ref []string) string { - ref = append([]string{}, ref...) - for i, s := range ref { - if strings.HasPrefix(s, "#") { - ref[i] = s[1:] - } - } - a := make([]string, 0, len(ref)+3) +func (b *buildContext) makeRef(inst cue.Value, ref cue.Path) string { if b.nameFunc != nil { - a = append(a, b.nameFunc(inst, ref)) - } else { - a = append(a, ref...) + return b.nameFunc(inst, ref) + } + var buf strings.Builder + for i, sel := range ref.Selectors() { + if i > 0 { + buf.WriteByte('.') + } + // TODO what should this do when it's not a valid identifier? + buf.WriteString(selectorLabel(sel)) } - return strings.Join(a, ".") + return buf.String() } func (b *builder) int64(v cue.Value) int64 { @@ -1321,3 +1335,19 @@ func (b *builder) big(v cue.Value) ast.Expr { v, _ = v.Default() return v.Syntax(cue.Final()).(ast.Expr) } + +func selectorLabel(sel cue.Selector) string { + if sel.Type().ConstraintType() == cue.PatternConstraint { + return "*" + } + switch sel.LabelType() { + case cue.StringLabel: + return sel.Unquoted() + case cue.DefinitionLabel: + return sel.String()[1:] + } + // We shouldn't get anything other than non-hidden + // fields and definitions because we've not asked the + // Fields iterator for those or created them explicitly. + panic(fmt.Sprintf("unreachable %v", sel.Type())) +} diff --git a/vendor/cuelang.org/go/encoding/openapi/crd.go b/vendor/cuelang.org/go/encoding/openapi/crd.go index dbf689f0..1c04a5b5 100644 --- a/vendor/cuelang.org/go/encoding/openapi/crd.go +++ b/vendor/cuelang.org/go/encoding/openapi/crd.go @@ -55,7 +55,7 @@ func newCoreBuilder(c *buildContext) *builder { return b } -func (b *builder) coreSchemaWithName(name string) *ast.StructLit { +func (b *builder) coreSchemaWithName(name cue.Selector) *ast.StructLit { oldPath := b.ctx.path b.ctx.path = append(b.ctx.path, name) s := b.coreSchema() @@ -69,7 +69,7 @@ func (b *builder) coreSchema() *ast.StructLit { case cue.ListKind: if b.items != nil { b.setType("array", "") - schema := b.items.coreSchemaWithName("*") + schema := b.items.coreSchemaWithName(cue.AnyString) b.setSingle("items", schema, false) } @@ -77,7 +77,7 @@ func (b *builder) coreSchema() *ast.StructLit { p := &OrderedMap{} for _, k := range b.keys { sub := b.properties[k] - p.Set(k, sub.coreSchemaWithName(k)) + p.Set(k, sub.coreSchemaWithName(cue.Str(k))) } if p.len() > 0 || b.items != nil { b.setType("object", "") @@ -87,7 +87,7 @@ func (b *builder) coreSchema() *ast.StructLit { } // TODO: in Structural schema only one of these is allowed. if b.items != nil { - schema := b.items.coreSchemaWithName("*") + schema := b.items.coreSchemaWithName(cue.AnyString) b.setSingle("additionalProperties", schema, false) } } diff --git a/vendor/cuelang.org/go/encoding/openapi/cycle.go b/vendor/cuelang.org/go/encoding/openapi/cycle.go index ef622946..a8c6933d 100644 --- a/vendor/cuelang.org/go/encoding/openapi/cycle.go +++ b/vendor/cuelang.org/go/encoding/openapi/cycle.go @@ -39,7 +39,7 @@ func (b *builder) checkCycle(v cue.Value) bool { r, n := internalvalue.ToInternal(v) ctx := eval.NewContext(r, n) - err := dep.Visit(ctx, n, func(d dep.Dependency) error { + err := dep.Visit(nil, ctx, n, func(d dep.Dependency) error { for _, m := range b.ctx.cycleNodes { if m == d.Node { var p token.Pos diff --git a/vendor/cuelang.org/go/encoding/openapi/decode.go b/vendor/cuelang.org/go/encoding/openapi/decode.go index a90efd31..e911cc11 100644 --- a/vendor/cuelang.org/go/encoding/openapi/decode.go +++ b/vendor/cuelang.org/go/encoding/openapi/decode.go @@ -29,7 +29,7 @@ import ( // // It currently only converts entries in #/components/schema and extracts some // meta data. -func Extract(data *cue.Instance, c *Config) (*ast.File, error) { +func Extract(data cue.InstanceOrValue, c *Config) (*ast.File, error) { // TODO: find a good OpenAPI validator. Both go-openapi and kin-openapi // seem outdated. The k8s one might be good, but avoid pulling in massive // amounts of dependencies. diff --git a/vendor/cuelang.org/go/encoding/openapi/errors.go b/vendor/cuelang.org/go/encoding/openapi/errors.go index 62016134..33d8358f 100644 --- a/vendor/cuelang.org/go/encoding/openapi/errors.go +++ b/vendor/cuelang.org/go/encoding/openapi/errors.go @@ -15,6 +15,7 @@ package openapi import ( + "cuelang.org/go/cue" "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" ) @@ -24,7 +25,7 @@ var _ errors.Error = &openapiError{} // implements cue/Error type openapiError struct { errors.Message - path []string + path cue.Path pos token.Pos } @@ -37,5 +38,13 @@ func (e *openapiError) InputPositions() []token.Pos { } func (e *openapiError) Path() []string { - return e.path + return pathToStrings(e.path) +} + +// pathToString is a utility function for creating debugging info. +func pathToStrings(p cue.Path) (a []string) { + for _, sel := range p.Selectors() { + a = append(a, sel.String()) + } + return a } diff --git a/vendor/cuelang.org/go/encoding/openapi/openapi.go b/vendor/cuelang.org/go/encoding/openapi/openapi.go index 6eaebb8c..a39ec92c 100644 --- a/vendor/cuelang.org/go/encoding/openapi/openapi.go +++ b/vendor/cuelang.org/go/encoding/openapi/openapi.go @@ -15,7 +15,6 @@ package openapi import ( - "encoding/json" "fmt" "strings" @@ -24,6 +23,7 @@ import ( "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" cuejson "cuelang.org/go/encoding/json" + internaljson "cuelang.org/go/internal/encoding/json" ) // A Config defines options for converting CUE to and from OpenAPI. @@ -39,8 +39,23 @@ type Config struct { // ReferenceFunc allows users to specify an alternative representation // for references. An empty string tells the generator to expand the type // in place and, if applicable, not generate a schema for that entity. + // + // If this field is non-nil and a cue.Value is passed as the InstanceOrValue, + // there will be a panic. + // + // Deprecated: use NameFunc instead. ReferenceFunc func(inst *cue.Instance, path []string) string + // NameFunc allows users to specify an alternative representation + // for references. It is called with the value passed to the top level + // method or function and the path to the entity being generated. + // If it returns an empty string the generator will expand the type + // in place and, if applicable, not generate a schema for that entity. + // + // Note: this only returns the final element of the /-separated + // reference. + NameFunc func(val cue.Value, path cue.Path) string + // DescriptionFunc allows rewriting a description associated with a certain // field. A typical implementation compiles the description from the // comments obtains from the Doc method. No description field is added if @@ -72,7 +87,7 @@ type Generator = Config // Gen generates the set OpenAPI schema for all top-level types of the // given instance. -func Gen(inst *cue.Instance, c *Config) ([]byte, error) { +func Gen(inst cue.InstanceOrValue, c *Config) ([]byte, error) { if c == nil { c = defaultConfig } @@ -80,14 +95,14 @@ func Gen(inst *cue.Instance, c *Config) ([]byte, error) { if err != nil { return nil, err } - return json.Marshal(all) + return internaljson.Marshal(all) } // Generate generates the set of OpenAPI schema for all top-level types of the // given instance. // // Note: only a limited number of top-level types are supported so far. -func Generate(inst *cue.Instance, c *Config) (*ast.File, error) { +func Generate(inst cue.InstanceOrValue, c *Config) (*ast.File, error) { all, err := schemas(c, inst) if err != nil { return nil, err @@ -103,7 +118,7 @@ func Generate(inst *cue.Instance, c *Config) (*ast.File, error) { // // Note: only a limited number of top-level types are supported so far. // Deprecated: use Generate -func (g *Generator) All(inst *cue.Instance) (*OrderedMap, error) { +func (g *Generator) All(inst cue.InstanceOrValue) (*OrderedMap, error) { all, err := schemas(g, inst) if err != nil { return nil, err @@ -113,7 +128,7 @@ func (g *Generator) All(inst *cue.Instance) (*OrderedMap, error) { } func toCUE(name string, x interface{}) (v ast.Expr, err error) { - b, err := json.Marshal(x) + b, err := internaljson.Marshal(x) if err == nil { v, err = cuejson.Extract(name, b) } @@ -125,14 +140,14 @@ func toCUE(name string, x interface{}) (v ast.Expr, err error) { } -func (c *Config) compose(inst *cue.Instance, schemas *ast.StructLit) (x *ast.StructLit, err error) { - +func (c *Config) compose(inst cue.InstanceOrValue, schemas *ast.StructLit) (x *ast.StructLit, err error) { + val := inst.Value() var errs errors.Error var title, version string var info *ast.StructLit - for i, _ := inst.Value().Fields(cue.Definitions(true)); i.Next(); { + for i, _ := val.Fields(cue.Definitions(true)); i.Next(); { if i.IsDefinition() { continue } @@ -164,17 +179,14 @@ func (c *Config) compose(inst *cue.Instance, schemas *ast.StructLit) (x *ast.Str case nil: if title == "" { title = "Generated by cue." - for _, d := range inst.Doc() { + for _, d := range val.Doc() { title = strings.TrimSpace(d.Text()) break } - if p := inst.ImportPath; title == "" && p != "" { - title = fmt.Sprintf("Generated by cue from package %q", p) - } } if version == "" { - version, _ = inst.Lookup("$version").String() + version, _ = val.Lookup("$version").String() if version == "" { version = "no version" } @@ -202,9 +214,12 @@ func (c *Config) compose(inst *cue.Instance, schemas *ast.StructLit) (x *ast.Str if err != nil { return nil, err } - info, _ = x.(*ast.StructLit) - errs = errors.Append(errs, errors.Newf(token.NoPos, - "Info field supplied must be an *ast.StructLit")) + var ok bool + info, ok = x.(*ast.StructLit) + if !ok { + errs = errors.Append(errs, errors.Newf(token.NoPos, + "Info field supplied must marshal to a struct but got %s", fmt.Sprintf("%T", x))) + } } return ast.NewStruct( @@ -216,7 +231,7 @@ func (c *Config) compose(inst *cue.Instance, schemas *ast.StructLit) (x *ast.Str } // Schemas extracts component/schemas from the CUE top-level types. -func (g *Generator) Schemas(inst *cue.Instance) (*OrderedMap, error) { +func (g *Generator) Schemas(inst cue.InstanceOrValue) (*OrderedMap, error) { comps, err := schemas(g, inst) if err != nil { return nil, err diff --git a/vendor/cuelang.org/go/encoding/openapi/orderedmap.go b/vendor/cuelang.org/go/encoding/openapi/orderedmap.go index 9f8bdd08..22966841 100644 --- a/vendor/cuelang.org/go/encoding/openapi/orderedmap.go +++ b/vendor/cuelang.org/go/encoding/openapi/orderedmap.go @@ -20,7 +20,7 @@ import ( "cuelang.org/go/cue/ast" "cuelang.org/go/cue/literal" "cuelang.org/go/cue/token" - "cuelang.org/go/internal/encoding/json" + internaljson "cuelang.org/go/internal/encoding/json" ) // An OrderedMap is a set of key-value pairs that preserves the order in which @@ -177,5 +177,5 @@ func (m *OrderedMap) getMap(key string) *OrderedMap { func (m *OrderedMap) MarshalJSON() (b []byte, err error) { // This is a pointer receiever to enforce that we only store pointers to // OrderedMap in the output. - return json.Encode((*ast.StructLit)(m)) + return internaljson.Encode((*ast.StructLit)(m)) } diff --git a/vendor/cuelang.org/go/encoding/openapi/types.go b/vendor/cuelang.org/go/encoding/openapi/types.go index 84a5251c..6554c968 100644 --- a/vendor/cuelang.org/go/encoding/openapi/types.go +++ b/vendor/cuelang.org/go/encoding/openapi/types.go @@ -17,7 +17,7 @@ package openapi import ( "fmt" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/cue" "cuelang.org/go/cue/ast" diff --git a/vendor/cuelang.org/go/encoding/protobuf/jsonpb/decoder.go b/vendor/cuelang.org/go/encoding/protobuf/jsonpb/decoder.go index 8f236276..ad4ecc39 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/jsonpb/decoder.go +++ b/vendor/cuelang.org/go/encoding/protobuf/jsonpb/decoder.go @@ -25,7 +25,7 @@ import ( "cuelang.org/go/cue/literal" "cuelang.org/go/cue/token" "cuelang.org/go/encoding/protobuf/pbinternal" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" ) // Option is an option. @@ -40,30 +40,30 @@ type Option func() // attributes. // // Mappings per CUE type: -// for any CUE type: -// null is omitted if null is not specifically allowed. -// bytes: if the expression is a string, it is reinterpreted using a -// base64 encoding. Either standard or URL-safe base64 encoding -// with/without paddings are accepted. -// int: string values are interpreted as integers -// float: string values are interpreted as numbers, and the values "NaN", -// "Infinity", and "-Infinity" are allowed and converted to -// to corresponding error values. -// enums: if a field is of type int and does not have a standard integer -// type for its @protobuf attribute, this is assumed to represent -// a protobuf enum value. Enum names are converted to integers -// by interpreting the definitions of the disjunction constants -// as the symbol names. -// If CUE uses the string representation for enums, then an -// #enumValue integer associated with the string value is used -// for the conversion. -// {}: JSON objects representing any values will be left as is. -// If the CUE type corresponding to the URL can be determined within -// the module context it will be unified. -// time.Time / time.Duration: -// left as is -// _: left as is. // +// for any CUE type: +// null is omitted if null is not specifically allowed. +// bytes: if the expression is a string, it is reinterpreted using a +// base64 encoding. Either standard or URL-safe base64 encoding +// with/without paddings are accepted. +// int: string values are interpreted as integers +// float: string values are interpreted as numbers, and the values "NaN", +// "Infinity", and "-Infinity" are allowed and converted +// to corresponding error values. +// enums: if a field is of type int and does not have a standard integer +// type for its @protobuf attribute, this is assumed to represent +// a protobuf enum value. Enum names are converted to integers +// by interpreting the definitions of the disjunction constants +// as the symbol names. +// If CUE uses the string representation for enums, then an +// #enumValue integer associated with the string value is used +// for the conversion. +// {}: JSON objects representing any values will be left as is. +// If the CUE type corresponding to the URL can be determined within +// the module context it will be unified. +// time.Time / time.Duration: +// left as is +// _: left as is. type Decoder struct { schema cue.Value } diff --git a/vendor/cuelang.org/go/encoding/protobuf/jsonpb/encoder.go b/vendor/cuelang.org/go/encoding/protobuf/jsonpb/encoder.go index 462e9bbd..85ef5e52 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/jsonpb/encoder.go +++ b/vendor/cuelang.org/go/encoding/protobuf/jsonpb/encoder.go @@ -37,14 +37,14 @@ import ( // attributes. // // Mappings per CUE type: -// for any CUE type: -// int: if the expression value is an integer and the schema value is -// an int64, it is converted to a string. -// {}: JSON objects representing any values will be left as is. -// If the CUE type corresponding to the URL can be determined within -// the module context it will be unified. -// _: Adds a `@type` URL (TODO). // +// for any CUE type: +// int: if the expression value is an integer and the schema value is +// an int64, it is converted to a string. +// {}: JSON objects representing any values will be left as is. +// If the CUE type corresponding to the URL can be determined within +// the module context it will be unified. +// _: Adds a `@type` URL (TODO). type Encoder struct { schema cue.Value } @@ -80,16 +80,6 @@ type encoder struct { errs errors.Error } -func (e *encoder) addErr(err errors.Error) { - e.errs = errors.Append(e.errs, err) -} - -func (e *encoder) addErrf(p token.Pos, schema cue.Value, format string, args ...interface{}) { - format = "%s: " + format - args = append([]interface{}{schema.Path()}, args...) - e.addErr(errors.Newf(p, format, args...)) -} - func (e *encoder) rewriteDecls(schema cue.Value, decls []ast.Decl) { for _, f := range decls { field, ok := f.(*ast.Field) diff --git a/vendor/cuelang.org/go/encoding/protobuf/parse.go b/vendor/cuelang.org/go/encoding/protobuf/parse.go index 2e8db8b3..25aed29e 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/parse.go +++ b/vendor/cuelang.org/go/encoding/protobuf/parse.go @@ -561,17 +561,17 @@ func (p *protoConverter) messageField(s *ast.StructLit, i int, v proto.Visitee) // // An enum will generate two top-level definitions: // -// Enum: -// "Value1" | -// "Value2" | -// "Value3" +// Enum: +// "Value1" | +// "Value2" | +// "Value3" // // and // -// Enum_value: { -// "Value1": 0 -// "Value2": 1 -// } +// Enum_value: { +// "Value1": 0 +// "Value2": 1 +// } // // Enums are always defined at the top level. The name of a nested enum // will be prefixed with the name of its parent and an underscore. diff --git a/vendor/cuelang.org/go/encoding/protobuf/protobuf.go b/vendor/cuelang.org/go/encoding/protobuf/protobuf.go index 48f86676..2d4a35ef 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/protobuf.go +++ b/vendor/cuelang.org/go/encoding/protobuf/protobuf.go @@ -19,8 +19,7 @@ // discussed in https://developers.google.com/protocol-buffers/docs/proto3, and // carries some of the mapping further when possible with CUE. // -// -// Package Paths +// # Package Paths // // If a .proto file contains a go_package directive, it will be used as the // destination package fo the generated .cue files. A common use case is to @@ -33,48 +32,48 @@ // It is safe to mix package with and without a go_package within the same // project. // -// Type Mappings +// # Type Mappings // // The following type mappings of definitions apply: // -// Proto type CUE type/def Comments -// message struct Message fields become CUE fields, whereby -// names are mapped to lowerCamelCase. -// enum e1 | e2 | ... Where ex are strings. A separate mapping is -// generated to obtain the numeric values. -// map { <>: V } All keys are converted to strings. -// repeated V [...V] null is accepted as the empty list []. -// bool bool -// string string -// bytes bytes A base64-encoded string when converted to JSON. -// int32, fixed32 int32 An integer with bounds as defined by int32. -// uint32 uint32 An integer with bounds as defined by uint32. -// int64, fixed64 int64 An integer with bounds as defined by int64. -// uint64 uint64 An integer with bounds as defined by uint64. -// float float32 A number with bounds as defined by float32. -// double float64 A number with bounds as defined by float64. -// Struct struct See struct.proto. -// Value _ See struct.proto. -// ListValue [...] See struct.proto. -// NullValue null See struct.proto. -// BoolValue bool See struct.proto. -// StringValue string See struct.proto. -// NumberValue number See struct.proto. -// StringValue string See struct.proto. -// Empty close({}) -// Timestamp time.Time See struct.proto. -// Duration time.Duration See struct.proto. +// Proto type CUE type/def Comments +// message struct Message fields become CUE fields, whereby +// names are mapped to lowerCamelCase. +// enum e1 | e2 | ... Where ex are strings. A separate mapping is +// generated to obtain the numeric values. +// map { <>: V } All keys are converted to strings. +// repeated V [...V] null is accepted as the empty list []. +// bool bool +// string string +// bytes bytes A base64-encoded string when converted to JSON. +// int32, fixed32 int32 An integer with bounds as defined by int32. +// uint32 uint32 An integer with bounds as defined by uint32. +// int64, fixed64 int64 An integer with bounds as defined by int64. +// uint64 uint64 An integer with bounds as defined by uint64. +// float float32 A number with bounds as defined by float32. +// double float64 A number with bounds as defined by float64. +// Struct struct See struct.proto. +// Value _ See struct.proto. +// ListValue [...] See struct.proto. +// NullValue null See struct.proto. +// BoolValue bool See struct.proto. +// StringValue string See struct.proto. +// NumberValue number See struct.proto. +// StringValue string See struct.proto. +// Empty close({}) +// Timestamp time.Time See struct.proto. +// Duration time.Duration See struct.proto. // // Protobuf definitions can be annotated with CUE constraints that are included // in the generated CUE: -// (cue.val) string CUE expression defining a constraint for this -// field. The string may refer to other fields -// in a message definition using their JSON name. // -// (cue.opt) FieldOptions -// required bool Defines the field is required. Use with -// caution. +// (cue.val) string CUE expression defining a constraint for this +// field. The string may refer to other fields +// in a message definition using their JSON name. // +// (cue.opt) FieldOptions +// required bool Defines the field is required. Use with +// caution. package protobuf // TODO mappings: @@ -158,7 +157,6 @@ type Config struct { // specified Root (or current working directory if none is specified). // All other imported files are assigned to the CUE pkg dir ($Root/pkg) // according to their Go package import path. -// type Extractor struct { root string cwd string @@ -219,7 +217,6 @@ func (b *Extractor) addErr(err error) { // AddFile assumes that the proto file compiles with protoc and may not report // an error if it does not. Imports are resolved using the paths defined in // Config. -// func (b *Extractor) AddFile(filename string, src interface{}) error { if b.done { err := errors.Newf(token.NoPos, @@ -248,9 +245,7 @@ func (b *Extractor) Files() (files []*ast.File, err error) { } for _, p := range instances { - for _, f := range p.Files { - files = append(files, f) - } + files = append(files, p.Files...) } return files, nil } @@ -397,7 +392,6 @@ func (b *Extractor) getInst(p *protoConverter) *build.Instance { // // Extract assumes the proto file compiles with protoc and may not report an error // if it does not. Imports are resolved using the paths defined in Config. -// func Extract(filename string, src interface{}, c *Config) (f *ast.File, err error) { if c == nil { c = &Config{} diff --git a/vendor/cuelang.org/go/encoding/protobuf/textproto/decoder.go b/vendor/cuelang.org/go/encoding/protobuf/textproto/decoder.go index 18681f79..d5f95472 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/textproto/decoder.go +++ b/vendor/cuelang.org/go/encoding/protobuf/textproto/decoder.go @@ -62,11 +62,11 @@ type decoder struct { // Parse parses the given textproto bytes and converts them to a CUE expression, // using schema as the guideline for conversion using the following rules: // -// - the @protobuf attribute is optional, but is necessary for: -// - interpreting protobuf maps -// - using a name different from the CUE name -// - fields in the textproto that have no corresponding field in -// schema are ignored +// - the @protobuf attribute is optional, but is necessary for: +// - interpreting protobuf maps +// - using a name different from the CUE name +// - fields in the textproto that have no corresponding field in +// schema are ignored // // NOTE: the filename is used for associating position information. However, // currently no position information is associated with the text proto because @@ -129,7 +129,6 @@ func (d *decoder) protoPos(p pbast.Position) token.Pos { // parseSchema walks over a CUE "type", converts it to an internal data // structure that is used for parsing text proto, and writes it to -// func (d *decoder) parseSchema(schema cue.Value) *mapping { _, v := value.ToInternal(schema) if v == nil { diff --git a/vendor/cuelang.org/go/encoding/protobuf/textproto/encoder.go b/vendor/cuelang.org/go/encoding/protobuf/textproto/encoder.go index dcb9ed3e..11c511d6 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/textproto/encoder.go +++ b/vendor/cuelang.org/go/encoding/protobuf/textproto/encoder.go @@ -22,13 +22,11 @@ import ( "cuelang.org/go/cue/errors" "cuelang.org/go/encoding/protobuf/pbinternal" - "github.com/protocolbuffers/txtpbfmt/ast" pbast "github.com/protocolbuffers/txtpbfmt/ast" "github.com/protocolbuffers/txtpbfmt/parser" ) // Encoder marshals CUE into text proto. -// type Encoder struct { // Schema } @@ -47,7 +45,6 @@ func NewEncoder(options ...Option) *Encoder { // - it is explicitly required that only fields with an attribute are exported // - a struct represents a Protobuf map // - custom naming -// func (e *Encoder) Encode(v cue.Value, options ...Option) ([]byte, error) { n := &pbast.Node{} enc := &encoder{} @@ -125,7 +122,7 @@ func (e *encoder) encodeMsg(parent *pbast.Node, v cue.Value) { default: key = &pbast.Node{ Name: "key", - Values: []*ast.Value{{Value: i.Label()}}, + Values: []*pbast.Value{{Value: i.Label()}}, } } n.Children = append(n.Children, key) diff --git a/vendor/cuelang.org/go/encoding/protobuf/util.go b/vendor/cuelang.org/go/encoding/protobuf/util.go index 1fc17f61..def05fb1 100644 --- a/vendor/cuelang.org/go/encoding/protobuf/util.go +++ b/vendor/cuelang.org/go/encoding/protobuf/util.go @@ -41,7 +41,6 @@ type protoError struct { } var ( - newline = token.Newline.Pos() newSection = token.NewSection.Pos() ) diff --git a/vendor/cuelang.org/go/internal/astinternal/debugstr.go b/vendor/cuelang.org/go/internal/astinternal/debugstr.go index 0121b458..81cba966 100644 --- a/vendor/cuelang.org/go/internal/astinternal/debugstr.go +++ b/vendor/cuelang.org/go/internal/astinternal/debugstr.go @@ -21,6 +21,7 @@ import ( "cuelang.org/go/cue/ast" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" ) func DebugStr(x interface{}) (out string) { @@ -126,8 +127,8 @@ func DebugStr(x interface{}) (out string) { case *ast.Field: out := DebugStr(v.Label) - if v.Optional != token.NoPos { - out += "?" + if t, ok := internal.ConstraintToken(v); ok { + out += t.String() } if v.Value != nil { switch v.Token { @@ -226,6 +227,9 @@ func DebugStr(x interface{}) (out string) { out += DebugStr(v.Path) return out + case *ast.Func: + return fmt.Sprintf("func(%v): %v", DebugStr(v.Args), DebugStr(v.Ret)) + case []ast.Decl: if len(v) == 0 { return "" diff --git a/vendor/cuelang.org/go/internal/attrs.go b/vendor/cuelang.org/go/internal/attrs.go index 05894801..44707bb1 100644 --- a/vendor/cuelang.org/go/internal/attrs.go +++ b/vendor/cuelang.org/go/internal/attrs.go @@ -18,10 +18,10 @@ import ( "fmt" "strconv" "strings" - "unicode" "cuelang.org/go/cue/errors" "cuelang.org/go/cue/literal" + "cuelang.org/go/cue/scanner" "cuelang.org/go/cue/token" ) @@ -51,7 +51,7 @@ type Attr struct { Body string Kind AttrKind Fields []KeyValue - Err error + Err errors.Error } // NewNonExisting creates a non-existing attribute. @@ -61,24 +61,21 @@ func NewNonExisting(key string) Attr { } type KeyValue struct { - data string - equal int // index of equal sign or 0 if non-existing + key string + value string + text string +} + +func (kv *KeyValue) Text() string { + return kv.text } -func (kv *KeyValue) Text() string { return kv.data } func (kv *KeyValue) Key() string { - if kv.equal == 0 { - return kv.data - } - s := kv.data[:kv.equal] - s = strings.TrimSpace(s) - return s + return kv.key } + func (kv *KeyValue) Value() string { - if kv.equal == 0 { - return "" - } - return strings.TrimSpace(kv.data[kv.equal+1:]) + return kv.value } func (a *Attr) hasPos(p int) error { @@ -97,7 +94,12 @@ func (a *Attr) String(pos int) (string, error) { if err := a.hasPos(pos); err != nil { return "", err } - return a.Fields[pos].Text(), nil + f := a.Fields[pos] + if f.key != "" { + // When there's a key, we return the entire value. + return f.Text(), nil + } + return a.Fields[pos].Value(), nil } // Int reports the integer at the given position or an error if the attribute is @@ -120,7 +122,7 @@ func (a *Attr) Flag(pos int, key string) (bool, error) { return false, err } for _, kv := range a.Fields[pos:] { - if kv.Text() == key { + if kv.Key() == "" && kv.Value() == key { return true, nil } } @@ -143,110 +145,133 @@ func (a *Attr) Lookup(pos int, key string) (val string, found bool, err error) { } func ParseAttrBody(pos token.Pos, s string) (a Attr) { + // Create temporary token.File so that scanner has something + // to work with. + // TODO it's probably possible to do this without allocations. + tmpFile := token.NewFile("", 0, len(s)) + if len(s) > 0 { + tmpFile.AddLine(len(s) - 1) + } a.Body = s - i := 0 + var scan scanner.Scanner + scan.Init(tmpFile, []byte(s), nil, scanner.DontInsertCommas) for { - i += skipSpace(s[i:]) - // always scan at least one, possibly empty element. - n, err := scanAttributeElem(pos, s[i:], &a) + start := scan.Offset() + tok, err := scanAttributeTokens(&scan, pos, 1<= len(s) { - break + switch tok { + case token.EOF: + // Empty field. + a.appendField("", s[start:], s[start:]) + return a + case token.COMMA: + val := s[start : scan.Offset()-1] + a.appendField("", val, val) // All but final comma. + continue + } + valStart := scan.Offset() + key := s[start : valStart-1] // All but =. + tok, err = scanAttributeTokens(&scan, pos, 1< 0 { + // Shouldn't happen because the text should have been scanned previously by + // the regular CUE parser. + return 0, errors.Newf(startPos.Add(pos.Offset()), "error scanning attribute text") + } + if tok < 64 && (close&(1< 0 { + buf.WriteByte('|') + } + buf.WriteString(t.String()) + } } - return index, s, nil + return buf.String() } diff --git a/vendor/cuelang.org/go/internal/core/adt/adt.go b/vendor/cuelang.org/go/internal/core/adt/adt.go index 1a286e75..5d114b83 100644 --- a/vendor/cuelang.org/go/internal/core/adt/adt.go +++ b/vendor/cuelang.org/go/internal/core/adt/adt.go @@ -33,13 +33,13 @@ func Resolve(ctx *OpContext, c Conjunct) *Vertex { var v Value - expr := c.Elem() + expr := c.Elem() // TODO: why is this not Expr? switch x := expr.(type) { case Value: v = x case Resolver: - r, err := ctx.Resolve(env, x) + r, err := ctx.resolveState(c, x, finalized) if err != nil { v = err break @@ -108,14 +108,14 @@ type Evaluator interface { // evaluate evaluates the underlying expression. If the expression // is incomplete, it may record the error in ctx and return nil. - evaluate(ctx *OpContext) Value + evaluate(ctx *OpContext, state vertexStatus) Value } // A Resolver represents a reference somewhere else within a tree that resolves // a value. type Resolver interface { Node - resolve(ctx *OpContext, state VertexStatus) *Vertex + resolve(ctx *OpContext, state vertexStatus) *Vertex } type YieldFunc func(env *Environment) @@ -123,7 +123,7 @@ type YieldFunc func(env *Environment) // A Yielder represents 0 or more labeled values of structs or lists. type Yielder interface { Node - yield(ctx *OpContext, fn YieldFunc) + yield(s *compState) } // A Validator validates a Value. All Validators are Values. @@ -234,8 +234,8 @@ func (*CallExpr) expr() {} func (*Field) declNode() {} func (x *Field) expr() Expr { return x.Value } -func (*OptionalField) declNode() {} -func (x *OptionalField) expr() Expr { return x.Value } +func (*LetField) declNode() {} +func (x *LetField) expr() Expr { return x.Value } func (*BulkOptionalField) declNode() {} func (x *BulkOptionalField) expr() Expr { return x.Value } func (*DynamicField) declNode() {} @@ -369,7 +369,7 @@ func (*BinaryExpr) node() {} func (*CallExpr) node() {} func (*DisjunctionExpr) node() {} func (*Field) node() {} -func (*OptionalField) node() {} +func (*LetField) node() {} func (*BulkOptionalField) node() {} func (*DynamicField) node() {} func (*Ellipsis) node() {} @@ -377,4 +377,3 @@ func (*Comprehension) node() {} func (*ForClause) node() {} func (*IfClause) node() {} func (*LetClause) node() {} -func (*ValueClause) node() {} diff --git a/vendor/cuelang.org/go/internal/core/adt/binop.go b/vendor/cuelang.org/go/internal/core/adt/binop.go index e2410a1e..1837e7c9 100644 --- a/vendor/cuelang.org/go/internal/core/adt/binop.go +++ b/vendor/cuelang.org/go/internal/core/adt/binop.go @@ -75,8 +75,8 @@ func BinOp(c *OpContext, op Op, left, right Value) Value { return c.newBool(false) } for i, e := range x { - a, _ := c.Concrete(nil, e, op) - b, _ := c.Concrete(nil, y[i], op) + a, _ := c.concrete(nil, e, op) + b, _ := c.concrete(nil, y[i], op) if !test(c, EqualOp, a, b) { return c.newBool(false) } @@ -110,11 +110,11 @@ func BinOp(c *OpContext, op Op, left, right Value) Value { x := c.Elems(left) y := c.Elems(right) if len(x) != len(y) { - return c.newBool(false) + return c.newBool(true) } for i, e := range x { - a, _ := c.Concrete(nil, e, op) - b, _ := c.Concrete(nil, y[i], op) + a, _ := c.concrete(nil, e, op) + b, _ := c.concrete(nil, y[i], op) if !test(c, EqualOp, a, b) { return c.newBool(true) } @@ -182,15 +182,17 @@ func BinOp(c *OpContext, op Op, left, right Value) Value { x := MakeIdentLabel(c, "x", "") + // for x in expr { x } forClause := func(src Expr) *Comprehension { s := &StructLit{Decls: []Decl{ &FieldReference{UpCount: 1, Label: x}, }} return &Comprehension{ - Clauses: &ForClause{ - Value: x, - Src: src, - Dst: &ValueClause{s}, + Clauses: []Yielder{ + &ForClause{ + Value: x, + Src: src, + }, }, Value: s, } @@ -203,9 +205,8 @@ func BinOp(c *OpContext, op Op, left, right Value) Value { }, } - n := &Vertex{} - n.AddConjunct(MakeRootConjunct(c.Env(0), list)) - n.Finalize(c) + n := c.newInlineVertex(nil, nil, MakeConjunct(c.Env(0), list, c.ci)) + n.CompleteArcs(c) return n } @@ -251,10 +252,11 @@ func BinOp(c *OpContext, op Op, left, right Value) Value { }} list.Elems = append(list.Elems, &Comprehension{ - Clauses: &ForClause{ - Value: x, - Src: right, - Dst: &ValueClause{st}, + Clauses: []Yielder{ + &ForClause{ + Value: x, + Src: right, + }, }, Value: st, }, @@ -264,9 +266,8 @@ func BinOp(c *OpContext, op Op, left, right Value) Value { return err } - n := &Vertex{} - n.AddConjunct(MakeRootConjunct(c.Env(0), list)) - n.Finalize(c) + n := c.newInlineVertex(nil, nil, MakeConjunct(c.Env(0), list, c.ci)) + n.CompleteArcs(c) return n } diff --git a/vendor/cuelang.org/go/internal/core/adt/closed.go b/vendor/cuelang.org/go/internal/core/adt/closed.go index 34a3e45e..1c439e5c 100644 --- a/vendor/cuelang.org/go/internal/core/adt/closed.go +++ b/vendor/cuelang.org/go/internal/core/adt/closed.go @@ -70,9 +70,11 @@ package adt // TODO(errors): return a dedicated ConflictError that can track original // positions on demand. -func (v *Vertex) IsInOneOf(t SpanType) bool { +// IsInOneOf reports whether any of the Structs associated with v is contained +// within any of the span types in the given mask. +func (v *Vertex) IsInOneOf(mask SpanType) bool { for _, s := range v.Structs { - if s.CloseInfo.IsInOneOf(t) { + if s.CloseInfo.IsInOneOf(mask) { return true } } @@ -108,8 +110,15 @@ const ( type CloseInfo struct { *closeInfo - IsClosed bool + // IsClosed is true if this conjunct represents a single level of closing + // as indicated by the closed builtin. + IsClosed bool + + // FieldTypes indicates which kinds of fields (optional, dynamic, patterns, + // etc.) are contained in this conjunct. FieldTypes OptionalType + + CycleInfo } func (c CloseInfo) Location() Node { @@ -119,11 +128,11 @@ func (c CloseInfo) Location() Node { return c.closeInfo.location } -func (c CloseInfo) SpanMask() SpanType { +func (c CloseInfo) span() SpanType { if c.closeInfo == nil { return 0 } - return c.span + return c.closeInfo.span } func (c CloseInfo) RootSpanType() SpanType { @@ -133,11 +142,10 @@ func (c CloseInfo) RootSpanType() SpanType { return c.root } +// IsInOneOf reports whether c is contained within any of the span types in the +// given mask. func (c CloseInfo) IsInOneOf(t SpanType) bool { - if c.closeInfo == nil { - return false - } - return c.span&t != 0 + return c.span()&t != 0 } // TODO(perf): remove: error positions should always be computed on demand @@ -152,18 +160,13 @@ func (c *CloseInfo) AddPositions(ctx *OpContext) { // TODO(perf): use on StructInfo. Then if parent and expression are the same // it is possible to use cached value. -func (c CloseInfo) SpawnEmbed(x Expr) CloseInfo { - var span SpanType - if c.closeInfo != nil { - span = c.span - } - +func (c CloseInfo) SpawnEmbed(x Node) CloseInfo { c.closeInfo = &closeInfo{ parent: c.closeInfo, location: x, mode: closeEmbed, root: EmbeddingSpan, - span: span | EmbeddingSpan, + span: c.span() | EmbeddingSpan, } return c } @@ -171,17 +174,12 @@ func (c CloseInfo) SpawnEmbed(x Expr) CloseInfo { // SpawnGroup is used for structs that contain embeddings that may end up // closing the struct. This is to force that `b` is not allowed in // -// a: {#foo} & {b: int} -// +// a: {#foo} & {b: int} func (c CloseInfo) SpawnGroup(x Expr) CloseInfo { - var span SpanType - if c.closeInfo != nil { - span = c.span - } c.closeInfo = &closeInfo{ parent: c.closeInfo, location: x, - span: span, + span: c.span(), } return c } @@ -190,28 +188,34 @@ func (c CloseInfo) SpawnGroup(x Expr) CloseInfo { // or constraint. Definition and embedding spans are introduced with SpawnRef // and SpawnEmbed, respectively. func (c CloseInfo) SpawnSpan(x Node, t SpanType) CloseInfo { - var span SpanType - if c.closeInfo != nil { - span = c.span - } c.closeInfo = &closeInfo{ parent: c.closeInfo, location: x, root: t, - span: span | t, + span: c.span() | t, } return c } func (c CloseInfo) SpawnRef(arc *Vertex, isDef bool, x Expr) CloseInfo { - var span SpanType - if c.closeInfo != nil { - span = c.span + span := c.span() + found := false + if !isDef { + xnode := Node(x) // Optimization so we're comparing identical interface types. + // TODO: make this work for non-definitions too. + for p := c.closeInfo; p != nil; p = p.parent { + if p.span == span && p.location == xnode { + found = true + break + } + } } - c.closeInfo = &closeInfo{ - parent: c.closeInfo, - location: x, - span: span, + if !found { + c.closeInfo = &closeInfo{ + parent: c.closeInfo, + location: x, + span: span, + } } if isDef { c.mode = closeDef @@ -221,7 +225,7 @@ func (c CloseInfo) SpawnRef(arc *Vertex, isDef bool, x Expr) CloseInfo { return c } -// isDef reports whether an expressions is a reference that references a +// IsDef reports whether an expressions is a reference that references a // definition anywhere in its selection path. // // TODO(performance): this should be merged with resolve(). But for now keeping @@ -299,23 +303,27 @@ type closeStats struct { accepted bool required bool - next *closeStats + + inTodoList bool // true if added to todo list. + next *closeStats } func (c *closeInfo) isClosed() bool { return c.mode == closeDef } +// isClosed reports whether v is closed at this level (so not recursively). func isClosed(v *Vertex) bool { + // We could have used IsRecursivelyClosed here, but (effectively) + // implementing it again here allows us to only have to iterate over + // Structs once. + if v.Closed { + return true + } for _, s := range v.Structs { - if s.IsClosed { + if s.IsClosed || s.IsInOneOf(DefinitionSpan) { return true } - for c := s.closeInfo; c != nil; c = c.parent { - if c.isClosed() { - return true - } - } } return false } @@ -330,7 +338,7 @@ func Accept(ctx *OpContext, n *Vertex, f Feature) (found, required bool) { // TODO(perf): more aggressively determine whether a struct is open or // closed: open structs do not have to be checked, yet they can particularly - // be the ones with performance isssues, for instanced as a result of + // be the ones with performance issues, for instanced as a result of // embedded for comprehensions. for _, s := range n.Structs { if !s.useForAccept() { @@ -398,9 +406,10 @@ func markRequired(ctx *OpContext, info *closeInfo) { return } - if s.span&EmbeddingSpan == 0 { + if s.span&EmbeddingSpan == 0 && !x.inTodoList { x.next = ctx.todo ctx.todo = x + x.inTodoList = true } x.required = true @@ -471,7 +480,7 @@ func verifyArc(ctx *OpContext, s *StructInfo, f Feature, label Value) bool { o := s.StructLit env := s.Env - if isRegular && (len(o.Additional) > 0 || o.IsOpen) { + if len(o.Additional) > 0 || o.IsOpen { return true } @@ -492,6 +501,7 @@ func verifyArc(ctx *OpContext, s *StructInfo, f Feature, label Value) bool { if len(o.Dynamic) > 0 && f.IsString() && label != nil { for _, b := range o.Dynamic { v := env.evalCached(ctx, b.Key) + v, _ = ctx.getDefault(v) s, ok := Unwrap(v).(*String) if !ok { continue diff --git a/vendor/cuelang.org/go/internal/core/adt/closed2.go b/vendor/cuelang.org/go/internal/core/adt/closed2.go index ada0342d..c2c1b611 100644 --- a/vendor/cuelang.org/go/internal/core/adt/closed2.go +++ b/vendor/cuelang.org/go/internal/core/adt/closed2.go @@ -63,6 +63,5 @@ func verifyArc2(ctx *OpContext, f Feature, v *Vertex, isClosed bool) (found bool s.AddPositions(ctx) } - label := f.SelectorString(ctx) - return false, ctx.NewErrf("field not allowed: %s", label) + return false, ctx.NewErrf("field not allowed") } diff --git a/vendor/cuelang.org/go/internal/core/adt/composite.go b/vendor/cuelang.org/go/internal/core/adt/composite.go index 603abf23..cac4206d 100644 --- a/vendor/cuelang.org/go/internal/core/adt/composite.go +++ b/vendor/cuelang.org/go/internal/core/adt/composite.go @@ -91,59 +91,47 @@ type Environment struct { // TODO(perf): make the following public fields a shareable struct as it // mostly is going to be the same for child nodes. - // Cyclic indicates a structural cycle was detected for this conjunct or one - // of its ancestors. - Cyclic bool + // TODO: This can probably move into the nodeContext, making it a map from + // conjunct to Value. + cache map[cacheKey]Value +} - // Deref keeps track of nodes that should dereference to Vertex. It is used - // for detecting structural cycle. - // - // The detection algorithm is based on Tomabechi's quasi-destructive graph - // unification. This detection requires dependencies to be resolved into - // fully dereferenced vertices. This is not the case in our algorithm: - // the result of evaluating conjuncts is placed into dereferenced vertices - // _after_ they are evaluated, but the Environment still points to the - // non-dereferenced context. - // - // In order to be able to detect structural cycles, we need to ensure that - // at least one node that is part of a cycle in the context in which - // conjunctions are evaluated dereferences correctly. - // - // The only field necessary to detect a structural cycle, however, is - // the Status field of the Vertex. So rather than dereferencing a node - // proper, it is sufficient to copy the Status of the dereferenced nodes - // to these nodes (will always be EvaluatingArcs). - Deref []*Vertex - - // Cycles contains vertices for which cycles are detected. It is used - // for tracking self-references within structural cycles. - // - // Unlike Deref, Cycles is not incremented with child nodes. - // TODO: Cycles is always a tail end of Deref, so this can be optimized. - Cycles []*Vertex +type cacheKey struct { + Expr Expr + Arc *Vertex +} - cache map[Expr]Value +func (e *Environment) up(ctx *OpContext, count int32) *Environment { + for ; count > 0; count-- { + e = e.Up + ctx.Assertf(ctx.Pos(), e.Vertex != nil, "Environment.up encountered a nil vertex") + } + return e } type ID int32 -// evalCached is used to look up let expressions. Caching let expressions -// prevents a possible combinatorial explosion. +// evalCached is used to look up dynamic field pattern constraint expressions. func (e *Environment) evalCached(c *OpContext, x Expr) Value { if v, ok := x.(Value); ok { return v } - v, ok := e.cache[x] + key := cacheKey{x, nil} + v, ok := e.cache[key] if !ok { if e.cache == nil { - e.cache = map[Expr]Value{} + e.cache = map[cacheKey]Value{} } env, src := c.e, c.src c.e, c.src = e, x.Source() - v = c.evalState(x, Partial) // TODO: should this be Finalized? + // Save and restore errors to ensure that only relevant errors are + // associated with the cash. + err := c.errs + v = c.evalState(x, partial) // TODO: should this be finalized? c.e, c.src = env, src + c.errs = err if b, ok := v.(*Bottom); !ok || !b.IsIncomplete() { - e.cache[x] = v + e.cache[key] = v } } return v @@ -163,9 +151,6 @@ type Vertex struct { // tree. Parent *Vertex - // Label is the feature leading to this vertex. - Label Feature - // State: // eval: nil, BaseValue: nil -- unevaluated // eval: *, BaseValue: nil -- evaluating @@ -174,24 +159,55 @@ type Vertex struct { state *nodeContext // TODO: move the following status fields to nodeContext. + // Label is the feature leading to this vertex. + Label Feature + + // TODO: move the following status fields to nodeContext. + // status indicates the evaluation progress of this vertex. - status VertexStatus + status vertexStatus + + // hasAllConjuncts indicates that the set of conjuncts is complete. + // This is the case if the conjuncts of all its ancestors have been + // processed. + hasAllConjuncts bool - // isData indicates that this Vertex is to be interepreted as data: pattern + // isData indicates that this Vertex is to be interpreted as data: pattern // and additional constraints, as well as optional fields, should be // ignored. - isData bool - Closed bool - nonMonotonicReject bool - nonMonotonicInsertGen int32 - nonMonotonicLookupGen int32 + isData bool + + // Closed indicates whether this Vertex is recursively closed. This is the + // case, for instance, if it is a node in a definition or if one of the + // conjuncts, or ancestor conjuncts, is a definition. + Closed bool + + // MultiLet indicates whether multiple let fields were added from + // different sources. If true, a LetReference must be resolved using + // the per-Environment value cache. + MultiLet bool + + // After this is set, no more arcs may be added during evaluation. This is + // set, for instance, after a Vertex is used as a source for comprehensions, + // or any other operation that relies on the set of arcs being constant. + LockArcs bool + + // IsDynamic signifies whether this struct is computed as part of an + // expression and not part of the static evaluation tree. + // Used for cycle detection. + IsDynamic bool + + nonRooted bool // indicates that there is no path from the root of the tree. - // EvalCount keeps track of temporary dereferencing during evaluation. - // If EvalCount > 0, status should be considered to be EvaluatingArcs. - EvalCount int32 + // hasPendingArc is set if this Vertex has a void arc (e.g. for comprehensions) + hasPendingArc bool - // SelfCount is used for tracking self-references. - SelfCount int32 + // ArcType indicates the level of optionality of this arc. + ArcType ArcType + + // cyclicReferences is a linked list of internal references pointing to this + // Vertex. This is used to shorten the path of some structural cycles. + cyclicReferences *RefNode // BaseValue is the value associated with this vertex. For lists and structs // this is a sentinel value indicating its kind. @@ -217,6 +233,134 @@ type Vertex struct { Structs []*StructInfo } +// newInlineVertex creates a Vertex that is needed for computation, but for +// which there is no CUE path defined from the root Vertex. +func (ctx *OpContext) newInlineVertex(parent *Vertex, v BaseValue, a ...Conjunct) *Vertex { + return &Vertex{ + Parent: parent, + BaseValue: v, + IsDynamic: true, + ArcType: ArcMember, + Conjuncts: a, + } +} + +// updateArcType updates v.ArcType if t is more restrictive. +func (v *Vertex) updateArcType(t ArcType) { + if t < v.ArcType { + v.ArcType = t + } +} + +// isDefined indicates whether this arc is a "value" field, and not a constraint +// or void arc. +func (v *Vertex) isDefined() bool { + return v.ArcType == ArcMember +} + +// IsConstraint reports whether the Vertex is an optional or required field. +func (v *Vertex) IsConstraint() bool { + return v.ArcType == ArcOptional || v.ArcType == ArcRequired +} + +// IsDefined indicates whether this arc is defined meaning it is not a +// required or optional constraint and not a "void" arc. +// It will evaluate the arc, and thus evaluate any comprehension, to make this +// determination. +func (v *Vertex) IsDefined(c *OpContext) bool { + if v.isDefined() { + return true + } + v.Finalize(c) + return v.isDefined() +} + +// Rooted reports whether there is a path from the root of the tree to this +// Vertex. +func (v *Vertex) Rooted() bool { + return !v.nonRooted && !v.Label.IsLet() && !v.IsDynamic +} + +type ArcType uint8 + +const ( + // ArcMember means that this arc is a normal non-optional field + // (including regular, hidden, and definition fields). + ArcMember ArcType = iota + + // ArcRequired is like optional, but requires that a field be specified. + // Fields are of the form foo!. + ArcRequired + + // ArcOptional represents fields of the form foo? and defines constraints + // for foo in case it is defined. + ArcOptional + + // ArcPending means that it is not known yet whether an arc exists and that + // its conjuncts need to be processed to find out. This happens when an arc + // is provisionally added as part of a comprehension, but when this + // comprehension has not yet yielded any results. + ArcPending + + // ArcNotPresent indicates that this arc is not present and, unlike + // ArcPending, needs no further processing. + ArcNotPresent + + // TODO: define a type for optional arcs. This will be needed for pulling + // in optional fields into the Vertex, which, in turn, is needed for + // structure sharing, among other things. + // We could also define types for required fields and potentially lets. +) + +// definitelyExists reports whether an arc is a constraint or member arc. +// TODO: we should check that users of this call ensure there are no +// ArcPendings. +func (v *Vertex) definitelyExists() bool { + return v.ArcType < ArcPending +} + +// ConstraintFromToken converts a given AST constraint token to the +// corresponding ArcType. +func ConstraintFromToken(t token.Token) ArcType { + switch t { + case token.OPTION: + return ArcOptional + case token.NOT: + return ArcRequired + } + return ArcMember +} + +// Token reports the token corresponding to the constraint represented by a, +// or token.ILLEGAL otherwise. +func (a ArcType) Token() (t token.Token) { + switch a { + case ArcOptional: + t = token.OPTION + case ArcRequired: + t = token.NOT + } + return t +} + +// Suffix reports the field suffix for the given ArcType if it is a +// constraint or the empty string otherwise. +func (a ArcType) Suffix() string { + switch a { + case ArcOptional: + return "?" + case ArcRequired: + return "!" + + // For debugging internal state. This is not CUE syntax. + case ArcPending: + return "*" + case ArcNotPresent: + return "-" + } + return "" +} + func (v *Vertex) Clone() *Vertex { c := *v c.state = nil @@ -248,74 +392,103 @@ func (s *StructInfo) useForAccept() bool { return true } -// VertexStatus indicates the evaluation progress of a Vertex. -type VertexStatus int8 +// vertexStatus indicates the evaluation progress of a Vertex. +type vertexStatus int8 const ( - // Unprocessed indicates a Vertex has not been processed before. + // unprocessed indicates a Vertex has not been processed before. // Value must be nil. - Unprocessed VertexStatus = iota + unprocessed vertexStatus = iota - // Evaluating means that the current Vertex is being evaluated. If this is + // evaluating means that the current Vertex is being evaluated. If this is // encountered it indicates a reference cycle. Value must be nil. - Evaluating + evaluating - // Partial indicates that the result was only partially evaluated. It will + // partial indicates that the result was only partially evaluated. It will // need to be fully evaluated to get a complete results. // // TODO: this currently requires a renewed computation. Cache the // nodeContext to allow reusing the computations done so far. - Partial + partial - // AllArcs is request only. It must be past Partial, but - // before recursively resolving arcs. - AllArcs + // conjuncts is the state reached when all conjuncts have been evaluated, + // but without recursively processing arcs. + conjuncts - // EvaluatingArcs indicates that the arcs of the Vertex are currently being + // evaluatingArcs indicates that the arcs of the Vertex are currently being // evaluated. If this is encountered it indicates a structural cycle. // Value does not have to be nil - EvaluatingArcs + evaluatingArcs - // Finalized means that this node is fully evaluated and that the results + // finalized means that this node is fully evaluated and that the results // are save to use without further consideration. - Finalized + finalized ) -func (s VertexStatus) String() string { +func (s vertexStatus) String() string { switch s { - case Unprocessed: + case unprocessed: return "unprocessed" - case Evaluating: + case evaluating: return "evaluating" - case Partial: + case partial: return "partial" - case AllArcs: - return "allarcs" - case EvaluatingArcs: + case conjuncts: + return "conjuncts" + case evaluatingArcs: return "evaluatingArcs" - case Finalized: + case finalized: return "finalized" default: return "unknown" } } -func (v *Vertex) Status() VertexStatus { - if v.EvalCount > 0 { - return EvaluatingArcs - } +func (v *Vertex) Status() vertexStatus { return v.status } -func (v *Vertex) UpdateStatus(s VertexStatus) { +// ForceDone prevents v from being evaluated. +func (v *Vertex) ForceDone() { + v.updateStatus(finalized) +} + +// IsUnprocessed reports whether v is unprocessed. +func (v *Vertex) IsUnprocessed() bool { + return v.status == unprocessed +} + +func (v *Vertex) updateStatus(s vertexStatus) { Assertf(v.status <= s+1, "attempt to regress status from %d to %d", v.Status(), s) - if s == Finalized && v.BaseValue == nil { + if s == finalized && v.BaseValue == nil { + // TODO: for debugging. // panic("not finalized") } v.status = s } +// setParentDone signals v that the conjuncts of all ancestors have been +// processed. +// If all conjuncts of this node have been set, all arcs will be notified +// of this parent being done. +// +// Note: once a vertex has started evaluation (state != nil), insertField will +// cause all conjuncts to be immediately processed. This means that if all +// ancestors of this node processed their conjuncts, and if this node has +// processed all its conjuncts as well, all nodes that it embedded will have +// received all their conjuncts as well, after which this node will have been +// notified of these conjuncts. +func (v *Vertex) setParentDone() { + v.hasAllConjuncts = true + // Could set "Conjuncts" flag of arc at this point. + if n := v.state; n != nil && len(n.conjuncts) == n.conjunctsPos { + for _, a := range v.Arcs { + a.setParentDone() + } + } +} + // Value returns the Value of v without definitions if it is a scalar // or itself otherwise. func (v *Vertex) Value() Value { @@ -334,6 +507,9 @@ func (v *Vertex) Value() Value { // isUndefined reports whether a vertex does not have a useable BaseValue yet. func (v *Vertex) isUndefined() bool { + if !v.isDefined() { + return true + } switch v.BaseValue { case nil, cycle: return true @@ -359,24 +535,27 @@ func (v *Vertex) ToDataSingle() *Vertex { w := *v w.isData = true w.state = nil - w.status = Finalized + w.status = finalized return &w } // ToDataAll returns a new v where v and all its descendents contain only // the regular fields. -func (v *Vertex) ToDataAll() *Vertex { +func (v *Vertex) ToDataAll(ctx *OpContext) *Vertex { arcs := make([]*Vertex, 0, len(v.Arcs)) for _, a := range v.Arcs { + if !a.IsDefined(ctx) { + continue + } if a.Label.IsRegular() { - arcs = append(arcs, a.ToDataAll()) + arcs = append(arcs, a.ToDataAll(ctx)) } } w := *v w.state = nil - w.status = Finalized + w.status = finalized - w.BaseValue = toDataAll(w.BaseValue) + w.BaseValue = toDataAll(ctx, w.BaseValue) w.Arcs = arcs w.isData = true w.Conjuncts = make([]Conjunct, len(v.Conjuncts)) @@ -388,27 +567,32 @@ func (v *Vertex) ToDataAll() *Vertex { copy(w.Conjuncts, v.Conjuncts) for i, c := range w.Conjuncts { if v, _ := c.x.(Value); v != nil { - w.Conjuncts[i].x = toDataAll(v).(Value) + w.Conjuncts[i].x = toDataAll(ctx, v).(Value) } } return &w } -func toDataAll(v BaseValue) BaseValue { +func toDataAll(ctx *OpContext, v BaseValue) BaseValue { switch x := v.(type) { default: return x case *Vertex: - return x.ToDataAll() + return x.ToDataAll(ctx) // The following cases are always erroneous, but we handle them anyway // to avoid issues with the closedness algorithm down the line. case *Disjunction: d := *x - d.Values = make([]*Vertex, len(x.Values)) + d.Values = make([]Value, len(x.Values)) for i, v := range x.Values { - d.Values[i] = v.ToDataAll() + switch x := v.(type) { + case *Vertex: + d.Values[i] = x.ToDataAll(ctx) + default: + d.Values[i] = x + } } return &d @@ -417,7 +601,7 @@ func toDataAll(v BaseValue) BaseValue { c.Values = make([]Value, len(x.Values)) for i, v := range x.Values { // This case is okay because the source is of type Value. - c.Values[i] = toDataAll(v).(Value) + c.Values[i] = toDataAll(ctx, v).(Value) } return &c } @@ -436,8 +620,8 @@ func (v *Vertex) IsErr() bool { return false } -func (v *Vertex) Err(c *OpContext, state VertexStatus) *Bottom { - c.Unify(v, state) +func (v *Vertex) Err(c *OpContext) *Bottom { + v.Finalize(c) if b, ok := v.BaseValue.(*Bottom); ok { return b } @@ -451,17 +635,27 @@ func (v *Vertex) Finalize(c *OpContext) { // case the caller did not handle existing errors in the context. err := c.errs c.errs = nil - c.Unify(v, Finalized) + c.unify(v, finalized) c.errs = err } +// CompleteArcs ensures the set of arcs has been computed. +func (v *Vertex) CompleteArcs(c *OpContext) { + c.unify(v, conjuncts) +} + func (v *Vertex) AddErr(ctx *OpContext, b *Bottom) { - v.SetValue(ctx, Finalized, CombineErrors(nil, v.Value(), b)) + v.SetValue(ctx, CombineErrors(nil, v.Value(), b)) } -func (v *Vertex) SetValue(ctx *OpContext, state VertexStatus, value BaseValue) *Bottom { +// SetValue sets the value of a node. +func (v *Vertex) SetValue(ctx *OpContext, value BaseValue) *Bottom { + return v.setValue(ctx, finalized, value) +} + +func (v *Vertex) setValue(ctx *OpContext, state vertexStatus, value BaseValue) *Bottom { v.BaseValue = value - v.UpdateStatus(state) + v.updateStatus(state) return nil } @@ -472,7 +666,7 @@ func ToVertex(v Value) *Vertex { return x default: n := &Vertex{ - status: Finalized, + status: finalized, BaseValue: x, } n.AddConjunct(MakeRootConjunct(nil, v)) @@ -480,8 +674,8 @@ func ToVertex(v Value) *Vertex { } } -// Unwrap returns the possibly non-concrete scalar value of v or nil if v is -// a list, struct or of undefined type. +// Unwrap returns the possibly non-concrete scalar value of v, v itself for +// lists and structs, or nil if v is an undefined type. func Unwrap(v Value) Value { x, ok := v.(*Vertex) if !ok { @@ -529,6 +723,8 @@ func (v *Vertex) Kind() Kind { // This is possible when evaluating comprehensions. It is potentially // not known at this time what the type is. switch { + // TODO: using this line would be more stable. + // case v.status != finalized && v.state != nil: case v.state != nil: return v.state.kind case v.BaseValue == nil: @@ -549,9 +745,9 @@ func (v *Vertex) OptionalTypes() OptionalType { // IsOptional reports whether a field is explicitly defined as optional, // as opposed to whether it is allowed by a pattern constraint. func (v *Vertex) IsOptional(label Feature) bool { - for _, s := range v.Structs { - if s.IsOptional(label) { - return true + for _, a := range v.Arcs { + if a.Label == label { + return a.IsConstraint() } } return false @@ -573,7 +769,7 @@ func (v *Vertex) IsClosedStruct() bool { case *Disjunction: } - return v.Closed || isClosed(v) + return isClosed(v) } func (v *Vertex) IsClosedList() bool { @@ -585,9 +781,13 @@ func (v *Vertex) IsClosedList() bool { // TODO: return error instead of boolean? (or at least have version that does.) func (v *Vertex) Accept(ctx *OpContext, f Feature) bool { + if f.IsHidden() || f.IsLet() { + return true + } + if x, ok := v.BaseValue.(*Disjunction); ok { for _, v := range x.Values { - if v.Accept(ctx, f) { + if x, ok := v.(*Vertex); ok && x.Accept(ctx, f) { return true } } @@ -616,7 +816,7 @@ func (v *Vertex) Accept(ctx *OpContext, f Feature) bool { } } - if f.IsHidden() || !v.IsClosedStruct() || v.Lookup(f) != nil { + if !v.IsClosedStruct() || v.Lookup(f) != nil { return true } @@ -674,33 +874,35 @@ func (v *Vertex) Elems() []*Vertex { // GetArc returns a Vertex for the outgoing arc with label f. It creates and // ads one if it doesn't yet exist. -func (v *Vertex) GetArc(c *OpContext, f Feature) (arc *Vertex, isNew bool) { +func (v *Vertex) GetArc(c *OpContext, f Feature, t ArcType) (arc *Vertex, isNew bool) { arc = v.Lookup(f) - if arc == nil { - for _, a := range v.state.usedArcs { - if a.Label == f { - arc = a - v.Arcs = append(v.Arcs, arc) - isNew = true - if c.nonMonotonicInsertNest > 0 { - a.nonMonotonicInsertGen = c.nonMonotonicGeneration - } - break - } - } + if arc != nil { + arc.updateArcType(t) + return arc, false } - if arc == nil { - arc = &Vertex{Parent: v, Label: f} - v.Arcs = append(v.Arcs, arc) - isNew = true - if c.nonMonotonicInsertNest > 0 { - arc.nonMonotonicInsertGen = c.nonMonotonicGeneration + + if v.LockArcs { + // TODO(errors): add positions. + if f.IsInt() { + c.addErrf(EvalError, token.NoPos, + "element at index %v not allowed by earlier comprehension or reference cycle", f) + } else { + c.addErrf(EvalError, token.NoPos, + "field %v not allowed by earlier comprehension or reference cycle", f) } } - if c.nonMonotonicInsertNest == 0 { - arc.nonMonotonicInsertGen = 0 + // TODO: consider setting Dynamic here from parent. + arc = &Vertex{ + Parent: v, + Label: f, + ArcType: t, + nonRooted: v.IsDynamic || v.Label.IsLet() || v.nonRooted, + } + v.Arcs = append(v.Arcs, arc) + if t == ArcPending { + v.hasPendingArc = true } - return arc, isNew + return arc, true } func (v *Vertex) Source() ast.Node { @@ -721,17 +923,83 @@ func (v *Vertex) AddConjunct(c Conjunct) *Bottom { // This is likely a bug in the evaluator and should not happen. return &Bottom{Err: errors.Newf(token.NoPos, "cannot add conjunct")} } - v.addConjunct(c) + if !v.hasConjunct(c) { + v.addConjunctUnchecked(c) + } return nil } -func (v *Vertex) addConjunct(c Conjunct) { +func (v *Vertex) hasConjunct(c Conjunct) (added bool) { + switch f := c.x.(type) { + case *BulkOptionalField, *Ellipsis: + case *Field: + v.updateArcType(f.ArcType) + case *DynamicField: + v.updateArcType(f.ArcType) + default: + v.ArcType = ArcMember + } for _, x := range v.Conjuncts { - if x == c { - return + // TODO: disregard certain fields from comparison (e.g. Refs)? + if x.CloseInfo.closeInfo == c.CloseInfo.closeInfo && + x.x == c.x && + x.Env.Up == c.Env.Up && x.Env.Vertex == c.Env.Vertex { + return true } } + return false +} + +func (n *nodeContext) addConjunction(c Conjunct, index int) { + // NOTE: This does not split binary expressions for comprehensions. + // TODO: split for comprehensions and rewrap? + if x, ok := c.Elem().(*BinaryExpr); ok && x.Op == AndOp { + c.x = x.X + n.conjuncts = append(n.conjuncts, conjunct{C: c, index: index}) + c.x = x.Y + n.conjuncts = append(n.conjuncts, conjunct{C: c, index: index}) + } else { + n.conjuncts = append(n.conjuncts, conjunct{C: c, index: index}) + } +} + +func (v *Vertex) addConjunctUnchecked(c Conjunct) { + index := len(v.Conjuncts) v.Conjuncts = append(v.Conjuncts, c) + if n := v.state; n != nil { + n.addConjunction(c, index) + + // TODO: can we remove notifyConjunct here? This method is only + // used if either Unprocessed is 0, in which case there will be no + // notification recipients, or for "pushed down" comprehensions, + // which should also have been added at an earlier point. + n.notifyConjunct(c) + } +} + +// addConjunctDynamic adds a conjunct to a vertex and immediately evaluates +// it, whilst doing the same for any vertices on the notify list, recursively. +func (n *nodeContext) addConjunctDynamic(c Conjunct) { + n.node.Conjuncts = append(n.node.Conjuncts, c) + n.addExprConjunct(c, partial) + n.notifyConjunct(c) + +} + +func (n *nodeContext) notifyConjunct(c Conjunct) { + for _, arc := range n.notify { + if !arc.hasConjunct(c) { + if arc.state == nil { + // TODO: continuing here is likely to result in a faulty + // (incomplete) configuration. But this may be okay. The + // CUE_DEBUG=0 flag disables this assertion. + n.ctx.Assertf(n.ctx.pos(), Debug, "unexpected nil state") + n.ctx.addErrf(0, n.ctx.pos(), "cannot add to field %v", arc.Label) + continue + } + arc.state.addConjunctDynamic(c) + } + } } func (v *Vertex) AddStruct(s *StructLit, env *Environment, ci CloseInfo) *StructInfo { @@ -741,7 +1009,7 @@ func (v *Vertex) AddStruct(s *StructLit, env *Environment, ci CloseInfo) *Struct CloseInfo: ci, } for _, t := range v.Structs { - if *t == info { + if *t == info { // TODO: check for different identity. return t } } @@ -807,7 +1075,12 @@ func (c *Conjunct) Source() ast.Node { } func (c *Conjunct) Field() Node { - return c.x + switch x := c.x.(type) { + case *Comprehension: + return x.Value + default: + return c.x + } } // Elem retrieves the Elem form of the contained conjunct. @@ -826,12 +1099,20 @@ func (c *Conjunct) Elem() Elem { // Expr retrieves the expression form of the contained conjunct. // If it is a field or comprehension, it will return its associated value. func (c *Conjunct) Expr() Expr { - switch x := c.x.(type) { + return ToExpr(c.x) +} + +// ToExpr extracts the underlying expression for a Node. If something is already +// an Expr, it will return it as is, if it is a field, it will return its value, +// and for comprehensions it returns the yielded struct. +func ToExpr(n Node) Expr { + switch x := n.(type) { case Expr: return x - // TODO: comprehension. case interface{ expr() Expr }: return x.expr() + case *Comprehension: + return ToExpr(x.Value) default: panic("unreachable") } diff --git a/vendor/cuelang.org/go/internal/core/adt/comprehension.go b/vendor/cuelang.org/go/internal/core/adt/comprehension.go index 804dc395..bb7b2ca5 100644 --- a/vendor/cuelang.org/go/internal/core/adt/comprehension.go +++ b/vendor/cuelang.org/go/internal/core/adt/comprehension.go @@ -14,57 +14,437 @@ package adt -type envYield struct { +// Comprehension algorithm +// +// Comprehensions are expanded for, if, and let clauses that yield 0 or more +// structs to be embedded in the enclosing list or struct. +// +// CUE allows cascading of insertions, as in: +// +// a?: int +// b?: int +// if a != _|_ { +// b: 2 +// } +// if b != _|_ { +// c: 3 +// d: 4 +// } +// +// even though CUE does not allow the result of a comprehension to depend +// on another comprehension within a single struct. The way this works is that +// for fields with a fixed prefix path in a comprehension value, the +// comprehension is assigned to these respective fields. +// +// More concretely, the above example is rewritten to: +// +// a?: int +// b: if a != _|_ { 2 } +// c: if b != _|_ { 3 } +// d: if b != _|_ { 4 } +// +// where the fields with if clause are only inserted if their condition +// resolves to true. (Note that this is not valid CUE; it may be in the future.) +// +// With this rewrite, any dependencies in comprehension expressions will follow +// the same rules, more or less, as with normal evaluation. +// +// Note that a single comprehension may be distributed across multiple fields. +// The evaluator will ensure, however, that a comprehension is only evaluated +// once. +// +// +// Closedness +// +// The comprehension algorithm uses the usual closedness mechanism for marking +// fields that belong to a struct: it adds the StructLit associated with the +// comprehension value to the respective arc. +// +// One noteworthy point is that the fields of a struct are only legitimate for +// actual results. For instance, if an if clause evaluates to false, the +// value is not embedded. +// +// To account for this, the comprehension algorithm relies on the fact that +// the closedness information is computed as a separate step. So even if +// the StructLit is added early, its fields will only count once it is +// initialized, which is only done when at least one result is added. +// + +// envComprehension caches the result of a single comprehension. +type envComprehension struct { comp *Comprehension - env *Environment - id CloseInfo - err *Bottom + node *Vertex // The Vertex from which the comprehension originates. + + // runtime-related fields + + err *Bottom + + // envs holds all the environments that define a single "yield" result in + // combination with the comprehension struct. + envs []*Environment // nil: unprocessed, non-nil: done. + done bool // true once the comprehension has been evaluated + + // StructLits to Init (activate for closedness check) + // when at least one value is yielded. + structs []*StructLit } -func (n *nodeContext) insertComprehension(env *Environment, x *Comprehension, ci CloseInfo) { - n.comprehensions = append(n.comprehensions, envYield{x, env, ci, nil}) +// envYield defines a comprehension for a specific field within a comprehension +// value. Multiple envYields can be associated with a single envComprehension. +// An envComprehension only needs to be evaluated once for multiple envYields. +type envYield struct { + *envComprehension // The original comprehension. + leaf *Comprehension // The leaf Comprehension + + // Values specific to the field corresponding to this envYield + + // This envYield was added to selfComprehensions + self bool + // This envYield was successfully executed and the resulting conjuncts were + // added. + inserted bool + + env *Environment // The adjusted Environment. + id CloseInfo // CloseInfo for the field. + expr Node // The adjusted expression. } -// injectComprehensions evaluates and inserts comprehensions. -func (n *nodeContext) injectComprehensions(all *[]envYield) (progress bool) { - ctx := n.ctx +// ValueClause represents a wrapper Environment in a chained clause list +// to account for the unwrapped struct. It is never created by the compiler +// and serves as a dynamic element only. +type ValueClause struct { + Node - k := 0 - for i := 0; i < len(*all); i++ { - d := (*all)[i] + // The node in which to resolve lookups in the comprehension's value struct. + arc *Vertex +} - sa := []*Environment{} - f := func(env *Environment) { - sa = append(sa, env) +func (v *ValueClause) yield(s *compState) { + s.yield(s.ctx.spawn(v.arc)) +} + +// insertComprehension registers a comprehension with a node, possibly pushing +// down its evaluation to the node's children. It will only evaluate one level +// of fields at a time. +func (n *nodeContext) insertComprehension( + env *Environment, + c *Comprehension, + ci CloseInfo, +) { + // TODO(perf): this implementation causes the parent's clauses + // to be evaluated for each nested comprehension. It would be + // possible to simply store the envComprehension of the parent's + // result and have each subcomprehension reuse those. This would + // also avoid the below allocation and would probably allow us + // to get rid of the ValueClause type. + + ec := c.comp + if ec == nil { + ec = &envComprehension{ + comp: c, + node: n.node, + + err: nil, // shut up linter + envs: nil, // shut up linter + done: false, // shut up linter } + } - if err := ctx.Yield(d.env, d.comp, f); err != nil { - if err.IsIncomplete() { - d.err = err - (*all)[k] = d - k++ - } else { - // continue to collect other errors. - n.addBottom(err) + if ec.done && len(ec.envs) == 0 { + return + } + + x := c.Value + + ci = ci.SpawnEmbed(c) + ci.closeInfo.span |= ComprehensionSpan + + var decls []Decl + switch v := ToExpr(x).(type) { + case *StructLit: + numFixed := 0 + var fields []Decl + for _, d := range v.Decls { + switch f := d.(type) { + case *Field: + numFixed++ + + // Create partial comprehension + c := &Comprehension{ + Syntax: c.Syntax, + Clauses: c.Clauses, + Value: f, + arcType: f.ArcType, + + comp: ec, + parent: c, + arc: n.node, + } + + conjunct := MakeConjunct(env, c, ci) + n.node.state.insertFieldUnchecked(f.Label, ArcPending, conjunct) + fields = append(fields, f) + // TODO: adjust ci to embed? + + case *LetField: + // TODO: consider merging this case with the LetField case. + + numFixed++ + + // Create partial comprehension + c := &Comprehension{ + Syntax: c.Syntax, + Clauses: c.Clauses, + Value: f, + + comp: ec, + parent: c, + arc: n.node, + } + + conjunct := MakeConjunct(env, c, ci) + arc := n.node.state.insertFieldUnchecked(f.Label, ArcMember, conjunct) + arc.MultiLet = f.IsMulti + + fields = append(fields, f) + + default: + decls = append(decls, d) + } + } + + if len(fields) > 0 { + // Create a stripped struct that only includes fixed fields. + // TODO(perf): this StructLit may be inserted more than once in + // the same vertex: once taking the StructLit of the referred node + // and once for inserting the Conjunct of the original node. + // Is this necessary (given closedness rules), and is this posing + // a performance problem? + st := v + if len(fields) < len(v.Decls) { + st = &StructLit{ + Src: v.Src, + Decls: fields, + } + } + n.node.AddStruct(st, env, ci) + switch { + case !ec.done: + ec.structs = append(ec.structs, st) + case len(ec.envs) > 0: + st.Init() } + } + + switch numFixed { + case 0: + // Add comprehension as is. + + case len(v.Decls): + // No comprehension to add at this level. + return + + default: + // Create a new StructLit with only the fields that need to be + // added at this level. + x = &StructLit{Decls: decls} + } + } + + n.comprehensions = append(n.comprehensions, envYield{ + envComprehension: ec, + leaf: c, + env: env, + id: ci, + expr: x, + }) +} + +type compState struct { + ctx *OpContext + comp *Comprehension + i int + f YieldFunc + state vertexStatus +} + +// yield evaluates a Comprehension within the given Environment and calls +// f for each result. +func (c *OpContext) yield( + node *Vertex, // errors are associated with this node + env *Environment, // env for field for which this yield is called + comp *Comprehension, + state vertexStatus, + f YieldFunc, // called for every result +) *Bottom { + s := &compState{ + ctx: c, + comp: comp, + f: f, + state: state, + } + y := comp.Clauses[0] + + saved := c.PushState(env, y.Source()) + if node != nil { + defer c.PopArc(c.PushArc(node)) + } + + s.i++ + y.yield(s) + s.i-- + + return c.PopState(saved) +} + +func (s *compState) yield(env *Environment) (ok bool) { + c := s.ctx + if s.i >= len(s.comp.Clauses) { + s.f(env) + return true + } + dst := s.comp.Clauses[s.i] + saved := c.PushState(env, dst.Source()) + + s.i++ + dst.yield(s) + s.i-- + + if b := c.PopState(saved); b != nil { + c.AddBottom(b) + return false + } + return !c.HasErr() +} + +// injectComprehension evaluates and inserts embeddings. It first evaluates all +// embeddings before inserting the results to ensure that the order of +// evaluation does not matter. +func (n *nodeContext) injectComprehensions(state vertexStatus) (progress bool) { + workRemaining := false + + // We use variables, instead of range, as the list may grow dynamically. + for i := 0; i < len(n.comprehensions); i++ { + d := &n.comprehensions[i] + if d.self || d.inserted { continue } + if err := n.processComprehension(d, state); err != nil { + // TODO: Detect that the nodes are actually equal + if err.ForCycle && err.Value == n.node { + n.selfComprehensions = append(n.selfComprehensions, *d) + progress = true + d.self = true + return + } + + d.err = err + workRemaining = true - if len(sa) == 0 { continue + + // TODO: add this when it can be done without breaking other + // things. + // + // // Add comprehension to ensure incomplete error is inserted. + // // This ensures that the error is reported in the Vertex + // // where the comprehension was defined, and not just in the + // // node below. This, in turn, is necessary to support + // // certain logic, like export, that expects to be able to + // // detect an "incomplete" error at the first level where it + // // is necessary. + // n := d.node.getNodeContext(ctx) + // n.addBottom(err) + + } + progress = true + } + + if !workRemaining { + n.comprehensions = n.comprehensions[:0] // Signal that all work is done. + } + + return progress +} + +// injectSelfComprehensions processes comprehensions that were earlier marked +// as iterating over the node in which they are defined. Such comprehensions +// are legal as long as they do not modify the arc set of the node. +func (n *nodeContext) injectSelfComprehensions(state vertexStatus) { + // We use variables, instead of range, as the list may grow dynamically. + for i := 0; i < len(n.selfComprehensions); i++ { + n.processComprehension(&n.selfComprehensions[i], state) + } + n.selfComprehensions = n.selfComprehensions[:0] // Signal that all work is done. +} + +// processComprehension processes a single Comprehension conjunct. +// It returns an incomplete error if there was one. Fatal errors are +// processed as a "successfully" completed computation. +func (n *nodeContext) processComprehension(d *envYield, state vertexStatus) *Bottom { + ctx := n.ctx + + // Compute environments, if needed. + if !d.done { + var envs []*Environment + f := func(env *Environment) { + envs = append(envs, env) + } + + if err := ctx.yield(d.node, d.env, d.comp, state, f); err != nil { + if err.IsIncomplete() { + return err + } + + // continue to collect other errors. + d.node.state.addBottom(err) + d.done = true + d.inserted = true + if d.node != nil { + ctx.PopArc(d.node) + } + return nil } - id := d.id.SpawnSpan(d.comp.Clauses, ComprehensionSpan) - n.ctx.nonMonotonicInsertNest++ - for _, env := range sa { - n.addExprConjunct(Conjunct{env, d.comp.Value, id}) + d.envs = envs + + if len(d.envs) > 0 { + for _, s := range d.structs { + s.Init() + } } - n.ctx.nonMonotonicInsertNest-- + d.structs = nil + d.done = true } - progress = k < len(*all) + d.inserted = true - *all = (*all)[:k] + if len(d.envs) == 0 { + return nil + } - return progress + v := n.node + for c := d.leaf; c.parent != nil; c = c.parent { + v.updateArcType(c.arcType) + v = c.arc + } + + id := d.id + + for _, env := range d.envs { + env = linkChildren(env, d.leaf) + n.addExprConjunct(Conjunct{env, d.expr, id}, state) + } + + return nil +} + +// linkChildren adds environments for the chain of vertices to a result +// environment. +func linkChildren(env *Environment, c *Comprehension) *Environment { + if c.parent != nil { + env = linkChildren(env, c.parent) + env = spawn(env, c.arc) + } + return env } diff --git a/vendor/cuelang.org/go/internal/core/adt/context.go b/vendor/cuelang.org/go/internal/core/adt/context.go index e7a6412b..d7100c3b 100644 --- a/vendor/cuelang.org/go/internal/core/adt/context.go +++ b/vendor/cuelang.org/go/internal/core/adt/context.go @@ -23,11 +23,12 @@ import ( "sort" "strings" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "golang.org/x/text/encoding/unicode" "cuelang.org/go/cue/ast" "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/stats" "cuelang.org/go/cue/token" ) @@ -37,15 +38,17 @@ import ( var Debug bool = os.Getenv("CUE_DEBUG") != "0" // Verbosity sets the log level. There are currently only two levels: -// 0: no logging -// 1: logging +// +// 0: no logging +// 1: logging var Verbosity int // DebugSort specifies that arcs be sorted consistently between implementations. -// 0: default -// 1: sort by Feature: this should be consistent between implementations where -// there is no change in the compiler and indexing code. -// 2: alphabetical +// +// 0: default +// 1: sort by Feature: this should be consistent between implementations where +// there is no change in the compiler and indexing code. +// 2: alphabetical var DebugSort int func DebugSortArcs(c *OpContext, n *Vertex) { @@ -82,7 +85,7 @@ func DebugSortFields(c *OpContext, a []Feature) { // Assert panics if the condition is false. Assert can be used to check for // conditions that are considers to break an internal variant or unexpected // condition, but that nonetheless probably will be handled correctly down the -// line. For instance, a faulty condition could lead to to error being caught +// line. For instance, a faulty condition could lead to error being caught // down the road, but resulting in an inaccurate error message. In production // code it is better to deal with the bad error message than to panic. // @@ -108,14 +111,6 @@ func init() { log.SetFlags(log.Lshortfile) } -func Logf(format string, args ...interface{}) { - if Verbosity == 0 { - return - } - s := fmt.Sprintf(format, args...) - _ = log.Output(2, s) -} - var pMap = map[*Vertex]int{} func (c *OpContext) Logf(v *Vertex, format string, args ...interface{}) { @@ -150,6 +145,18 @@ func (c *OpContext) Logf(v *Vertex, format string, args ...interface{}) { _ = log.Output(2, s) } +// PathToString creates a pretty-printed path of the given list of features. +func (c *OpContext) PathToString(r Runtime, path []Feature) string { + var b strings.Builder + for i, f := range path { + if i > 0 { + b.WriteByte('.') + } + b.WriteString(f.SelectorString(c)) + } + return b.String() +} + // Runtime defines an interface for low-level representation conversion and // lookup. type Runtime interface { @@ -190,21 +197,21 @@ func New(v *Vertex, cfg *Config) *OpContext { return ctx } -// An OpContext implements CUE's unification operation. It's operations only -// operation on values that are created with the Runtime with which an OpContext -// is associated. An OpContext is not goroutine save and only one goroutine may +// An OpContext implements CUE's unification operation. It only +// operates on values that are created with the Runtime with which an OpContext +// is associated. An OpContext is not goroutine safe and only one goroutine may // use an OpContext at a time. -// type OpContext struct { Runtime Format func(Node) string nest int - stats Stats + stats stats.Counts freeListNode *nodeContext e *Environment + ci CloseInfo src ast.Node errs *Bottom positions []Node // keep track of error positions @@ -214,11 +221,6 @@ type OpContext struct { // structural cycle errors. vertex *Vertex - nonMonotonicLookupNest int32 - nonMonotonicRejectNest int32 - nonMonotonicInsertNest int32 - nonMonotonicGeneration int32 - // These fields are used associate scratch fields for computing closedness // of a Vertex. These fields could have been included in StructInfo (like // Tomabechi's unification algorithm), but we opted for an indirection to @@ -233,7 +235,7 @@ type OpContext struct { // inDisjunct indicates that non-monotonic checks should be skipped. // This is used if we want to do some extra work to eliminate disjunctions - // early. The result of unificantion should be thrown away if this check is + // early. The result of unification should be thrown away if this check is // used. // // TODO: replace this with a mechanism to determine the correct set (per @@ -243,8 +245,21 @@ type OpContext struct { // inConstaint overrides inDisjunct as field matching should always be // enabled. inConstraint int + + // inValidator defines whether full evaluation need to be enforced, for + // instance when comparing against bottom. + inValidator int + + // The current call is a validator. A builtin may return a boolean false + // along with an error message describing a validation error. If the latter + // is wrapped in an internal.ValidationError, it will only be interpreted + // as an error if this is true. + // TODO: strictly separate validators and functions. + IsValidator bool } +func (c *OpContext) CloseInfo() CloseInfo { return c.ci } + func (n *nodeContext) skipNonMonotonicChecks() bool { if n.ctx.inConstraint > 0 { return false @@ -281,41 +296,29 @@ func (c *OpContext) pos() token.Pos { } func (c *OpContext) spawn(node *Vertex) *Environment { - node.Parent = c.e.Vertex // TODO: Is this necessary? + return spawn(c.e, node) +} + +func spawn(env *Environment, node *Vertex) *Environment { return &Environment{ - Up: c.e, + Up: env, Vertex: node, - - // Copy cycle data. - Cyclic: c.e.Cyclic, - Deref: c.e.Deref, - Cycles: c.e.Cycles, } } func (c *OpContext) Env(upCount int32) *Environment { - e := c.e - for ; upCount > 0; upCount-- { - e = e.Up - } - return e + return c.e.up(c, upCount) } func (c *OpContext) relNode(upCount int32) *Vertex { - e := c.e - for ; upCount > 0; upCount-- { - e = e.Up - } - c.Unify(e.Vertex, Partial) + e := c.e.up(c, upCount) + c.unify(e.Vertex, partial) return e.Vertex } func (c *OpContext) relLabel(upCount int32) Feature { // locate current label. - e := c.e - for ; upCount > 0; upCount-- { - e = e.Up - } + e := c.e.up(c, upCount) return e.DynamicLabel } @@ -393,12 +396,14 @@ type frame struct { env *Environment err *Bottom src ast.Node + ci CloseInfo } func (c *OpContext) PushState(env *Environment, src ast.Node) (saved frame) { saved.env = c.e saved.err = c.errs saved.src = c.src + saved.ci = c.ci c.errs = nil if src != nil { @@ -409,11 +414,30 @@ func (c *OpContext) PushState(env *Environment, src ast.Node) (saved frame) { return saved } +func (c *OpContext) PushConjunct(x Conjunct) (saved frame) { + src := x.Expr().Source() + + saved.env = c.e + saved.err = c.errs + saved.src = c.src + saved.ci = c.ci + + c.errs = nil + if src != nil { + c.src = src + } + c.e = x.Env + c.ci = x.CloseInfo + + return saved +} + func (c *OpContext) PopState(s frame) *Bottom { err := c.errs c.e = s.env c.errs = s.err c.src = s.src + c.ci = s.ci return err } @@ -434,10 +458,14 @@ func (c *OpContext) PopArc(saved *Vertex) { // // Should only be used to insert Conjuncts. TODO: perhaps only return Conjuncts // and error. -func (c *OpContext) Resolve(env *Environment, r Resolver) (*Vertex, *Bottom) { - s := c.PushState(env, r.Source()) +func (c *OpContext) Resolve(x Conjunct, r Resolver) (*Vertex, *Bottom) { + return c.resolveState(x, r, finalized) +} + +func (c *OpContext) resolveState(x Conjunct, r Resolver, state vertexStatus) (*Vertex, *Bottom) { + s := c.PushConjunct(x) - arc := r.resolve(c, Partial) + arc := r.resolve(c, state) err := c.PopState(s) if err != nil { @@ -453,6 +481,21 @@ func (c *OpContext) Resolve(env *Environment, r Resolver) (*Vertex, *Bottom) { return arc, err } +// Lookup looks up r in env without further resolving the value. +func (c *OpContext) Lookup(env *Environment, r Resolver) (*Vertex, *Bottom) { + s := c.PushState(env, r.Source()) + + arc := r.resolve(c, partial) + + err := c.PopState(s) + + if arc != nil { + arc = arc.Indirect() + } + + return arc, err +} + // Validate calls validates value for the given validator. // // TODO(errors): return boolean instead: only the caller has enough information @@ -469,21 +512,9 @@ func (c *OpContext) Validate(check Validator, value Value) *Bottom { return err } -// Yield evaluates a Yielder and calls f for each result. -func (c *OpContext) Yield(env *Environment, comp *Comprehension, f YieldFunc) *Bottom { - y := comp.Clauses - - s := c.PushState(env, y.Source()) - - y.yield(c, f) - - return c.PopState(s) - -} - -// Concrete returns the concrete value of x after evaluating it. +// concrete returns the concrete value of x after evaluating it. // msg is used to mention the context in which an error occurred, if any. -func (c *OpContext) Concrete(env *Environment, x Expr, msg interface{}) (result Value, complete bool) { +func (c *OpContext) concrete(env *Environment, x Expr, msg interface{}) (result Value, complete bool) { w, complete := c.Evaluate(env, x) @@ -536,7 +567,7 @@ func (c *OpContext) getDefault(v Value) (result Value, ok bool) { if d.NumDefaults != 1 { c.addErrf(IncompleteError, c.pos(), - "unresolved disjunction %s (type %s)", d, d.Kind()) + "unresolved disjunction %v (type %s)", d, d.Kind()) return nil, false } return c.getDefault(d.Values[0]) @@ -547,7 +578,7 @@ func (c *OpContext) getDefault(v Value) (result Value, ok bool) { func (c *OpContext) Evaluate(env *Environment, x Expr) (result Value, complete bool) { s := c.PushState(env, x.Source()) - val := c.evalState(x, Partial) + val := c.evalState(x, partial) complete = true @@ -573,8 +604,9 @@ func (c *OpContext) Evaluate(env *Environment, x Expr) (result Value, complete b return val, true } -func (c *OpContext) evaluateRec(env *Environment, x Expr, state VertexStatus) Value { - s := c.PushState(env, x.Source()) +func (c *OpContext) evaluateRec(v Conjunct, state vertexStatus) Value { + x := v.Expr() + s := c.PushConjunct(v) val := c.evalState(x, state) if val == nil { @@ -593,15 +625,15 @@ func (c *OpContext) evaluateRec(env *Environment, x Expr, state VertexStatus) Va // value evaluates expression v within the current environment. The result may // be nil if the result is incomplete. value leaves errors untouched to that // they can be collected by the caller. -func (c *OpContext) value(x Expr) (result Value) { - v := c.evalState(x, Partial) +func (c *OpContext) value(x Expr, state vertexStatus) (result Value) { + v := c.evalState(x, state) v, _ = c.getDefault(v) v = Unwrap(v) return v } -func (c *OpContext) evalState(v Expr, state VertexStatus) (result Value) { +func (c *OpContext) evalState(v Expr, state vertexStatus) (result Value) { savedSrc := c.src c.src = v.Source() err := c.errs @@ -615,7 +647,7 @@ func (c *OpContext) evalState(v Expr, state VertexStatus) (result Value) { switch b.Code { case IncompleteError: case CycleError: - if state == Partial { + if state == partial { break } fallthrough @@ -627,13 +659,7 @@ func (c *OpContext) evalState(v Expr, state VertexStatus) (result Value) { // TODO: remove this when we handle errors more principally. if b, ok := result.(*Bottom); ok { - if c.src != nil && - b.Code == CycleError && - len(errors.Positions(b.Err)) == 0 { - bb := *b - bb.Err = errors.Wrapf(b.Err, c.src.Pos(), "") - result = &bb - } + result = c.wrapCycleError(c.src, b) if c.errs != result { c.errs = CombineErrors(c.src, c.errs, result) } @@ -649,7 +675,7 @@ func (c *OpContext) evalState(v Expr, state VertexStatus) (result Value) { return x case Evaluator: - v := x.evaluate(c) + v := x.evaluate(c, state) return v case Resolver: @@ -661,7 +687,15 @@ func (c *OpContext) evalState(v Expr, state VertexStatus) (result Value) { return nil } - v := c.evaluate(arc, state) + // Save the old CloseInfo and restore after evaluate to avoid detecting + // spurious cycles. + saved := c.ci + if n := arc.state; n != nil { + c.ci, _ = n.markCycle(arc, nil, x, c.ci) + } + c.ci.Inline = true + v := c.evaluate(arc, x, state) + c.ci = saved return v default: @@ -670,11 +704,23 @@ func (c *OpContext) evalState(v Expr, state VertexStatus) (result Value) { } } +// wrapCycleError converts the sentinel cycleError in a concrete one with +// position information. +func (c *OpContext) wrapCycleError(src ast.Node, b *Bottom) *Bottom { + if src != nil && + b.Code == CycleError && + len(errors.Positions(b.Err)) == 0 { + bb := *b + bb.Err = errors.Wrapf(b.Err, src.Pos(), "") + b = &bb + } + return b +} + // unifyNode returns a possibly partially evaluated node value. // // TODO: maybe return *Vertex, *Bottom -// -func (c *OpContext) unifyNode(v Expr, state VertexStatus) (result Value) { +func (c *OpContext) unifyNode(v Expr, state vertexStatus) (result Value) { savedSrc := c.src c.src = v.Source() err := c.errs @@ -684,17 +730,8 @@ func (c *OpContext) unifyNode(v Expr, state VertexStatus) (result Value) { c.errs = CombineErrors(c.src, c.errs, err) if v, ok := result.(*Vertex); ok { - if b, _ := v.BaseValue.(*Bottom); b != nil { - switch b.Code { - case IncompleteError: - case CycleError: - if state == Partial { - break - } - fallthrough - default: - result = b - } + if b, _ := v.BaseValue.(*Bottom); b != nil && !b.IsIncomplete() { + result = b } } @@ -721,7 +758,7 @@ func (c *OpContext) unifyNode(v Expr, state VertexStatus) (result Value) { return x case Evaluator: - v := x.evaluate(c) + v := x.evaluate(c, state) return v case Resolver: @@ -734,15 +771,7 @@ func (c *OpContext) unifyNode(v Expr, state VertexStatus) (result Value) { } if v.isUndefined() || state > v.status { - // Keep a minimum state of AllArcs. - // TODO: AllArcs may still not be achieved if a node is currently - // evaluating. - state := state - if state < AllArcs { - state = AllArcs - } - // Use node itself to allow for cycle detection. - c.Unify(v, state) + c.unify(v, state) } return v @@ -753,7 +782,7 @@ func (c *OpContext) unifyNode(v Expr, state VertexStatus) (result Value) { } } -func (c *OpContext) lookup(x *Vertex, pos token.Pos, l Feature, state VertexStatus) *Vertex { +func (c *OpContext) lookup(x *Vertex, pos token.Pos, l Feature, state vertexStatus) *Vertex { if l == InvalidLabel || x == nil { // TODO: is it possible to have an invalid label here? Maybe through the // API? @@ -768,7 +797,7 @@ func (c *OpContext) lookup(x *Vertex, pos token.Pos, l Feature, state VertexStat switch x.BaseValue.(type) { case *StructMarker: if l.Typ() == IntLabel { - c.addErrf(0, pos, "invalid struct selector %s (type int)", l) + c.addErrf(0, pos, "invalid struct selector %v (type int)", l) return nil } @@ -777,17 +806,17 @@ func (c *OpContext) lookup(x *Vertex, pos token.Pos, l Feature, state VertexStat case l.Typ() == IntLabel: switch { case l.Index() < 0: - c.addErrf(0, pos, "invalid list index %s (index must be non-negative)", l) + c.addErrf(0, pos, "invalid list index %v (index must be non-negative)", l) return nil case l.Index() > len(x.Arcs): - c.addErrf(0, pos, "invalid list index %s (out of bounds)", l) + c.addErrf(0, pos, "invalid list index %v (out of bounds)", l) return nil } - case l.IsDef(), l.IsHidden(): + case l.IsDef(), l.IsHidden(), l.IsLet(): default: - c.addErrf(0, pos, "invalid list index %s (type string)", l) + c.addErrf(0, pos, "invalid list index %v (type string)", l) return nil } @@ -804,54 +833,43 @@ func (c *OpContext) lookup(x *Vertex, pos token.Pos, l Feature, state VertexStat // "cannot look up %s in incomplete type %s (type %s)", // l, x.Source(), kind) // return nil - } else if !l.IsDef() && !l.IsHidden() { + } else if !l.IsDef() && !l.IsHidden() && !l.IsLet() { c.addErrf(0, pos, - "invalid selector %s for value of type %s", l, kind) + "invalid selector %v for value of type %s", l, kind) return nil } } a := x.Lookup(l) - if a != nil { - a = a.Indirect() - } var hasCycle bool -outer: - switch { - case c.nonMonotonicLookupNest == 0 && c.nonMonotonicRejectNest == 0: - case a != nil: - if state == Partial { - a.nonMonotonicLookupGen = c.nonMonotonicGeneration - } - case x.state != nil && state == Partial: - for _, e := range x.state.exprs { - if isCyclePlaceholder(e.err) { - hasCycle = true - } + if a != nil { + // Ensure that a's status is at least of the required level. Otherwise, + // ensure that any remaining unprocessed conjuncts are processed by + // calling c.Unify(a, Partial). The ensures that need to rely on + // hasAllConjuncts, but that are finalized too early, get conjuncts + // processed beforehand. + if state > a.status { + c.unify(a, state) + } else if a.state != nil { + c.unify(a, partial) } - for _, a := range x.state.usedArcs { - if a.Label == l { - a.nonMonotonicLookupGen = c.nonMonotonicGeneration - if c.nonMonotonicRejectNest > 0 { - a.nonMonotonicReject = true - } - break outer + + if a.IsConstraint() { + code := IncompleteError + if hasCycle { + code = CycleError } + label := l.SelectorString(c.Runtime) + c.AddBottom(&Bottom{ + Code: code, + Permanent: x.status >= conjuncts, + Err: c.NewPosf(pos, + "cannot reference optional field: %s", label), + }) } - a := &Vertex{Label: l, nonMonotonicLookupGen: c.nonMonotonicGeneration} - if c.nonMonotonicRejectNest > 0 { - a.nonMonotonicReject = true - } - x.state.usedArcs = append(x.state.usedArcs, a) - } - - if a != nil && state > a.status { - c.Unify(a, state) - } - - if a == nil { + } else { if x.state != nil { for _, e := range x.state.exprs { if isCyclePlaceholder(e.err) { @@ -860,7 +878,14 @@ outer: } } code := IncompleteError - if !x.Accept(c, l) { + // As long as we have incomplete information, we cannot mark the + // inability to look up a field as "final", as it may resolve down the + // line. + permanent := x.status > conjuncts + if m, _ := x.BaseValue.(*ListMarker); m != nil && !m.IsOpen { + permanent = true + } + if (state > partial || permanent) && !x.Accept(c, l) { code = 0 } else if hasCycle { code = CycleError @@ -871,23 +896,33 @@ outer: // TODO(errors): add path reference and make message // "undefined field %s in %s" - if l.IsInt() { - c.addErrf(code, pos, "index out of range [%d] with length %d", + var err *ValueError + switch { + case isCyclePlaceholder(x.BaseValue): + err = c.NewPosf(pos, "cycle error referencing %s", label) + permanent = false + case l.IsInt(): + err = c.NewPosf(pos, "index out of range [%d] with length %d", l.Index(), len(x.Elems())) - } else { - if code != 0 && x.IsOptional(l) { - c.addErrf(code, pos, - "cannot reference optional field: %s", label) - } else { - c.addErrf(code, pos, "undefined field: %s", label) - } + default: + err = c.NewPosf(pos, "undefined field: %s", label) } + c.AddBottom(&Bottom{ + Code: code, + Permanent: permanent, + Err: err, + }) } return a } +func (c *OpContext) undefinedFieldError(v *Vertex, code ErrorCode) { + label := v.Label.SelectorString(c) + c.addErrf(code, c.pos(), "undefined field: %s", label) +} + func (c *OpContext) Label(src Expr, x Value) Feature { - return labelFromValue(c, src, x) + return LabelFromValue(c, src, x) } func (c *OpContext) typeError(v Value, k Kind) { @@ -926,7 +961,7 @@ func pos(x Node) token.Pos { return x.Source().Pos() } -func (c *OpContext) node(orig Node, x Expr, scalar bool, state VertexStatus) *Vertex { +func (c *OpContext) node(orig Node, x Expr, scalar bool, state vertexStatus) *Vertex { // TODO: always get the vertex. This allows a whole bunch of trickery // down the line. v := c.unifyNode(x, state) @@ -1000,8 +1035,15 @@ func (c *OpContext) node(orig Node, x Expr, scalar bool, state VertexStatus) *Ve return node } -// Elems returns the elements of a list. +// Elems returns the evaluated elements of a list. func (c *OpContext) Elems(v Value) []*Vertex { + list := c.list(v) + list.Finalize(c) + return list.Elems() +} + +// RawElems returns the elements of the list without evaluating them. +func (c *OpContext) RawElems(v Value) []*Vertex { list := c.list(v) return list.Elems() } @@ -1075,7 +1117,7 @@ func (c *OpContext) uint64(v Value, as string) uint64 { } if !x.X.Coeff.IsUint64() { // TODO: improve message - c.AddErrf("cannot convert number %s to uint64", x.X) + c.AddErrf("cannot convert number %s to uint64", &x.X) return 0 } return x.X.Coeff.Uint64() @@ -1256,7 +1298,7 @@ func (c *OpContext) newBool(b bool) Value { } func (c *OpContext) newList(src ast.Node, parent *Vertex) *Vertex { - return &Vertex{Parent: parent, BaseValue: &ListMarker{}} + return c.newInlineVertex(parent, &ListMarker{}) } // Str reports a debug string of x. @@ -1271,13 +1313,11 @@ func (c *OpContext) Str(x Node) string { func (c *OpContext) NewList(values ...Value) *Vertex { // TODO: consider making this a literal list instead. list := &ListLit{} - v := &Vertex{ - Conjuncts: []Conjunct{{Env: nil, x: list}}, - } + v := c.newInlineVertex(nil, nil, Conjunct{Env: nil, x: list}) for _, x := range values { list.Elems = append(list.Elems, x) } - c.Unify(v, Finalized) + v.Finalize(c) return v } diff --git a/vendor/cuelang.org/go/internal/core/adt/cycle.go b/vendor/cuelang.org/go/internal/core/adt/cycle.go new file mode 100644 index 00000000..bfa7dae9 --- /dev/null +++ b/vendor/cuelang.org/go/internal/core/adt/cycle.go @@ -0,0 +1,525 @@ +// Copyright 2022 CUE Authors +// +// 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. + +package adt + +// Cycle detection: +// +// - Current algorithm does not allow for early non-cyclic conjunct detection. +// - Record possibly cyclic references. +// - Mark as cyclic if no evidence is found. +// - Note that this also activates the same reference in other (parent) conjuncts. + +// TODO: +// - get rid of nodeContext.{hasCycle|hasNonCycle}. +// - compiler support for detecting cross-pattern references. +// - handle propagation of cyclic references to root across disjunctions. + +// CYCLE DETECTION ALGORITHM +// +// BACKGROUND +// +// The cycle detection is inspired by the cycle detection used by Tomabechi's +// [Tomabechi COLING 1992] and Van Lohuizen's [Van Lohuizen ACL 2000] graph +// unification algorithms. +// +// Unlike with traditional graph unification, however, CUE uses references, +// which, unlike node equivalence, are unidirectional. This means that the +// technique to track equivalence through dereference, as common in graph +// unification algorithms like Tomabechi's, does not work unaltered. +// +// The unidirectional nature of references imply that each reference equates a +// facsimile of the value it points to. This renders the original approach of +// node-pointer equivalence useless. +// +// +// PRINCIPLE OF ALGORITHM +// +// The solution for CUE is based on two observations: +// +// - the CUE algorithm tracks all conjuncts that define a node separately, - +// accumulating used references on a per-conjunct basis causes duplicate +// references to uniquely identify cycles. +// +// A structural cycle, as defined by the spec, can then be detected if all +// conjuncts are marked as a cycle. +// +// References are accumulated as follows: +// +// 1. If a conjunct is a reference the reference is associated with that +// conjunct as well as the conjunct corresponding to the value it refers to. +// 2. If a conjunct is a struct (including lists), its references are associated +// with all embedded values and fields. +// +// To narrow down the specifics of the reference-based cycle detection, let us +// explore structural cycles in a bit more detail. +// +// +// STRUCTURAL CYCLES +// +// See the language specification for a higher-level and more complete overview. +// +// We have to define when a cycle is detected. CUE implementations MUST report +// an error upon a structural cycle, and SHOULD report cycles at the shortest +// possible paths at which they occur, but MAY report these at deeper paths. For +// instance, the following CUE has a structural cycle +// +// f: g: f +// +// The shortest path at which the cycle can be reported is f.g, but as all +// failed configurations are logically equal, it is fine for implementations to +// report them at f.g.g, for instance. +// +// It is not, however, correct to assume that a reference to a parent is always +// a cycle. Consider this case: +// +// a: [string]: b: a +// +// Even though reference `a` refers to a parent node, the cycle needs to be fed +// by a concrete field in struct `a` to persist, meaning it cannot result in a +// cycle as defined in the spec as it is defined here. Note however, that a +// specialization of this configuration _can_ result in a cycle. Consider +// +// a: [string]: b: a +// a: c: _ +// +// Here reference `a` is guaranteed to result in a structural cycle, as field +// `c` will match the pattern constraint unconditionally. +// +// In other words, it is not possible to exclude tracking references across +// pattern constraints from cycle checking. +// +// It is tempting to try to find a complete set of these edge cases with the aim +// to statically determine cases in which this occurs. But as [Carpenter 1992] +// demonstrates, it is possible for cycles to be created as a result of unifying +// two graphs that are themselves acyclic. The following example is a +// translation of Carpenters example to CUE: +// +// y: { +// f: h: g +// g: _ +// } +// x: { +// f: _ +// g: f +// } +// +// Even though the above contains no cycles, the result of `x & y` is cyclic: +// +// f: h: g +// g: f +// +// This means that, in practice, cycle detection has at least partially a +// dynamic component to it. +// +// +// ABSTRACT ALGORITHM +// +// The algorithm is described declaratively by defining what it means for a +// field to have a structural cycle. In the below, a _reference_ is uniquely +// identified by the pointer identity of a Go Resolver instance. +// +// Cycles are tracked on a per-conjunct basis and are not aggregated per Vertex: +// administrative information is only passed on from parent to child conjunct. +// +// A conjunct is a _parent_ of another conjunct if is a conjunct of one of the +// non-optional fields of the conjunct. For instance, conjunct `x` with value +// `{b: y & z}`, is a parent of conjunct `y` as well as `z`. Within field `b`, +// the conjuncts `y` and `z` would be tracked individually, though. +// +// A conjunct is _associated with a reference_ if its value was obtained by +// evaluating a reference. Note that a conjunct may be associated with many +// references if its evaluation requires evaluating a chain of references. For +// instance, consider +// +// a: {x: d} +// b: a +// c: b & e +// d: y: 1 +// +// the first conjunct of field `c` (reference `b`) has the value `{x: y: 1}` and +// is associated with references `b` and `a`. +// +// The _tracked references_ of a conjunct are all references that are associated +// with it or any of its ancestors (parents of parents). For instance, the +// tracked references of conjunct `b.x` of field `c.x` are `a`, `b`, and `d`. +// +// A conjunct is a violating cycle if it is a reference that: +// - occurs in the tracked references of the conjunct, or +// - directly refers to a parent node of the conjunct. +// +// A conjunct is cyclic if it is a violating cycle or if any of its ancestors +// are a violating cycle. +// +// A field has a structural cycle if it is composed of at least one conjunct +// that is a violating cycle and no conjunct that is not cyclic. +// +// Note that a field can be composed of only cyclic conjuncts while still not be +// structural cycle: as long as there are no conjuncts that are a violating +// cycle, it is not a structural cycle. This is important for the following +// case: +// +// a: [string]: b: a +// x: a +// x: c: b: c: {} +// +// Here, reference `a` is never a cycle as the recursive references crosses a +// pattern constraint that only instantiates if it is unified with something +// else. +// +// +// DISCUSSION +// +// The goal of conjunct cycle marking algorithm is twofold: - mark conjuncts +// that are proven to propagate indefinitely - mark them as early as possible +// (shortest CUE path). +// +// TODO: Prove all cyclic conjuncts will eventually be marked as cyclic. +// +// TODO: +// - reference marks whether it crosses a pattern, improving the case +// a: [string]: b: c: b +// This requires a compile-time detection mechanism. +// +// +// REFERENCES +// [Tomabechi COLING 1992]: https://aclanthology.org/C92-2068 +// Hideto Tomabechi. 1992. Quasi-Destructive Graph Unification with +// Structure-Sharing. In COLING 1992 Volume 2: The 14th International +// Conference on Computational Linguistics. +// +// [Van Lohuizen ACL 2000]: https://aclanthology.org/P00-1045/ +// Marcel P. van Lohuizen. 2000. "Memory-Efficient and Thread-Safe +// Quasi-Destructive Graph Unification". In Proceedings of the 38th Annual +// Meeting of the Association for Computational Linguistics, pages 352–359, +// Hong Kong. Association for Computational Linguistics. +// +// [Carpenter 1992]: +// Bob Carpenter, "The logic of typed feature structures." +// Cambridge University Press, ISBN:0-521-41932-8 + +type CycleInfo struct { + // IsCyclic indicates whether this conjunct, or any of its ancestors, + // had a violating cycle. + IsCyclic bool + + // Inline is used to detect expressions referencing themselves, for instance: + // {x: out, out: x}.out + Inline bool + + // TODO(perf): pack this in with CloseInfo. Make an uint32 pointing into + // a buffer maintained in OpContext, using a mark-release mechanism. + Refs *RefNode +} + +// A RefNode is a linked list of associated references. +type RefNode struct { + Ref Resolver + Arc *Vertex // Ref points to this Vertex + + // Node is the Vertex of which Ref is evaluated as a conjunct. + // If there is a cyclic reference (not structural cycle), then + // the reference will have the same node. This allows detecting reference + // cycles for nodes referring to nodes with an evaluation cycle + // (mode tracked to Evaluating status). Examples: + // + // a: x + // Y: x + // x: {Y} + // + // and + // + // Y: x.b + // a: x + // x: b: {Y} | null + // + // In both cases there are not structural cycles and thus need to be + // distinguished from regular structural cycles. + Node *Vertex + + Next *RefNode + Depth int32 +} + +// cyclicConjunct is used in nodeContext to postpone the computation of +// cyclic conjuncts until a non-cyclic conjunct permits it to be processed. +type cyclicConjunct struct { + c Conjunct + arc *Vertex // cached Vertex +} + +// markCycle checks whether the reference x is cyclic. There are two cases: +// 1. it was previously used in this conjunct, and +// 2. it directly references a parent node. +// +// Other inputs: +// +// arc the reference to which x points +// env, ci the components of the Conjunct from which x originates +// +// A cyclic node is added to a queue for later processing if no evidence of a +// non-cyclic node has so far been found. updateCyclicStatus processes delayed +// nodes down the line once such evidence is found. +// +// If a cycle is the result of "inline" processing (an expression referencing +// itself), an error is reported immediately. +// +// It returns the CloseInfo with tracked cyclic conjuncts updated, and +// whether or not its processing should be skipped, which is the case either if +// the conjunct seems to be fully cyclic so far or if there is a valid reference +// cycle. +func (n *nodeContext) markCycle(arc *Vertex, env *Environment, x Resolver, ci CloseInfo) (_ CloseInfo, skip bool) { + // TODO(perf): this optimization can work if we also check for any + // references pointing to arc within arc. This can be done with compiler + // support. With this optimization, almost all references could avoid cycle + // checking altogether! + // if arc.status == Finalized && arc.cyclicReferences == nil { + // return v, false + // } + + // Check whether the reference already occurred in the list, signaling + // a potential cycle. + found := false + depth := int32(0) + for r := ci.Refs; r != nil; r = r.Next { + if r.Ref != x { + continue + } + + // A reference that is within a graph that is being evaluated + // may repeat with a different arc and will point to a + // non-finalized arc. A repeating reference that points outside the + // graph will always be the same address. Hence, if this is a + // finalized arc with a different address, it resembles a reference that + // is included through a different path and is not a cycle. + if r.Arc != arc && arc.status == finalized { + continue + } + + // For dynamically created structs we mark this as an error. Otherwise + // there is only an error if we have visited the arc before. + if ci.Inline && (arc.IsDynamic || r.Arc == arc) { + n.reportCycleError() + return ci, true + } + + // We have a reference cycle, as distinguished from a structural + // cycle. Reference cycles represent equality, and thus are equal + // to top. We can stop processing here. + if r.Node == n.node { + return ci, true + } + + depth = r.Depth + found = true + + // Mark all conjuncts of this Vertex that refer to the same node as + // cyclic. This is an extra safety measure to ensure that two conjuncts + // cannot work in tandom to circumvent a cycle. It also tightens + // structural cycle detection in some cases. Late detection of cycles + // can result in a lot of redundant work. + // + // TODO: this loop is not on a critical path, but it may be evaluated + // if it is worthy keeping at some point. + for i, c := range n.node.Conjuncts { + if c.CloseInfo.IsCyclic { + continue + } + for rr := c.CloseInfo.Refs; rr != nil; rr = rr.Next { + // TODO: Is it necessary to find another way to find + // "parent" conjuncts? This mechanism seems not entirely + // accurate. Maybe a pointer up to find the root and then + // "spread" downwards? + if r.Ref == x && r.Arc == rr.Arc { + n.node.Conjuncts[i].CloseInfo.IsCyclic = true + break + } + } + } + + break + } + + // The code in this switch statement registers structural cycles caught + // through EvaluatingArcs to the root of the cycle. This way, any node + // referencing this value can track these nodes early. This is mostly an + // optimization to shorten the path for which structural cycles are + // detected, which may be critical for performance. +outer: + switch arc.status { + case evaluatingArcs: // also Evaluating? + // The reference may already be there if we had no-cyclic structure + // invalidating the cycle. + for r := arc.cyclicReferences; r != nil; r = r.Next { + if r.Ref == x { + break outer + } + } + + arc.cyclicReferences = &RefNode{ + Arc: arc, + Ref: x, + Next: arc.cyclicReferences, + } + + case finalized: + // Insert cyclic references from found arc, if any. + for r := arc.cyclicReferences; r != nil; r = r.Next { + if r.Ref == x { + // We have detected a cycle, with the only exception if arc is + // a disjunction, as evaluation always stops at unresolved + // disjunctions. + if _, ok := arc.BaseValue.(*Disjunction); !ok { + found = true + } + } + ci.Refs = &RefNode{ + Arc: r.Arc, + Node: n.node, + + Ref: x, + Next: ci.Refs, + Depth: n.depth, + } + } + } + + // NOTE: we need to add a tracked reference even if arc is not cyclic: it + // may still cause a cycle that does not refer to a parent node. For + // instance: + // + // y: [string]: b: y + // x: y + // x: c: x + // -> + // x: [string]: b: y + // x: c: b: y + // x: c: [string]: b: y + // x: c: b: b: y + // x: c: b: [string]: b: y + // x: c: b: b: b: y + // .... // structural cycle 1 + // x: c: c: x // structural cycle 2 + // + // Note that in this example there is a structural cycle at x.c.c, but we + // would need go guarantee that cycle is detected before the algorithm + // descends into x.c.b. + if !found || depth != n.depth { + // Adding this in case there is a definite cycle is unnecessary, but + // gives somewhat better error messages. + // We also need to add the reference again if the depth differs, as + // the depth is used for tracking "new structure". + ci.Refs = &RefNode{ + Arc: arc, + Ref: x, + Node: n.node, + Next: ci.Refs, + Depth: n.depth, + } + } + + if !found && arc.status != evaluatingArcs { + // No cycle. + return ci, false + } + + alreadyCycle := ci.IsCyclic + ci.IsCyclic = true + + // TODO: depth might legitimately be 0 if it is a root vertex. + // In the worst case, this may lead to a spurious cycle. + // Fix this by ensuring the root vertex starts with a depth of 1, for + // instance. + if depth > 0 { + // Look for evidence of "new structure" to invalidate the cycle. + // This is done by checking for non-cyclic conjuncts between the + // current vertex up to the ancestor to which the reference points. + // Note that the cyclic conjunct may not be marked as such, so we + // look for at least one other non-cyclic conjunct if this is the case. + upCount := n.depth - depth + for p := n.node.Parent; p != nil; p = p.Parent { + if upCount--; upCount <= 0 { + break + } + a := p.Conjuncts + count := 0 + for _, c := range a { + if !c.CloseInfo.IsCyclic { + count++ + } + } + if !alreadyCycle { + count-- + } + if count > 0 { + return ci, false + } + } + } + + n.hasCycle = true + if !n.hasNonCycle && env != nil { + v := Conjunct{env, x, ci} + n.cyclicConjuncts = append(n.cyclicConjuncts, cyclicConjunct{v, arc}) + return ci, true + } + + return ci, false +} + +// updateCyclicStatus looks for proof of non-cyclic conjuncts to override +// a structural cycle. +func (n *nodeContext) updateCyclicStatus(c CloseInfo) { + if !c.IsCyclic { + n.hasNonCycle = true + for _, c := range n.cyclicConjuncts { + n.addVertexConjuncts(c.c, c.arc, false) + } + n.cyclicConjuncts = n.cyclicConjuncts[:0] + } +} + +func assertStructuralCycle(n *nodeContext) bool { + if n.hasCycle && !n.hasNonCycle { + n.reportCycleError() + return true + } + return false +} + +func (n *nodeContext) reportCycleError() { + n.node.BaseValue = CombineErrors(nil, + n.node.Value(), + &Bottom{ + Code: StructuralCycleError, + Err: n.ctx.Newf("structural cycle"), + Value: n.node.Value(), + // TODO: probably, this should have the referenced arc. + }) + n.node.Arcs = nil +} + +// makeAnonymousConjunct creates a conjunct that tracks self-references when +// evaluating an expression. +// +// Example: +// TODO: +func makeAnonymousConjunct(env *Environment, x Expr, refs *RefNode) Conjunct { + return Conjunct{ + env, x, CloseInfo{CycleInfo: CycleInfo{ + Inline: true, + Refs: refs, + }}, + } +} diff --git a/vendor/cuelang.org/go/internal/core/adt/decimal.go b/vendor/cuelang.org/go/internal/core/adt/decimal.go index e7eba385..4b10e280 100644 --- a/vendor/cuelang.org/go/internal/core/adt/decimal.go +++ b/vendor/cuelang.org/go/internal/core/adt/decimal.go @@ -15,18 +15,10 @@ package adt import ( - "math/big" - - "github.com/cockroachdb/apd/v2" + "cuelang.org/go/internal" + "github.com/cockroachdb/apd/v3" ) -var apdCtx apd.Context - -func init() { - apdCtx = apd.BaseContext - apdCtx.Precision = 24 -} - func (n *Num) Impl() *apd.Decimal { return &n.X } @@ -40,19 +32,19 @@ func (a *Num) Cmp(b *Num) int { } func (c *OpContext) Add(a, b *Num) Value { - return numOp(c, apdCtx.Add, a, b) + return numOp(c, internal.BaseContext.Add, a, b) } func (c *OpContext) Sub(a, b *Num) Value { - return numOp(c, apdCtx.Sub, a, b) + return numOp(c, internal.BaseContext.Sub, a, b) } func (c *OpContext) Mul(a, b *Num) Value { - return numOp(c, apdCtx.Mul, a, b) + return numOp(c, internal.BaseContext.Mul, a, b) } func (c *OpContext) Quo(a, b *Num) Value { - v := numOp(c, apdCtx.Quo, a, b) + v := numOp(c, internal.BaseContext.Quo, a, b) if n, ok := v.(*Num); ok { n.K = FloatKind } @@ -60,7 +52,7 @@ func (c *OpContext) Quo(a, b *Num) Value { } func (c *OpContext) Pow(a, b *Num) Value { - return numOp(c, apdCtx.Pow, a, b) + return numOp(c, internal.BaseContext.Pow, a, b) } type numFunc func(z, x, y *apd.Decimal) (apd.Condition, error) @@ -86,22 +78,22 @@ func numOp(c *OpContext, fn numFunc, x, y *Num) Value { } func (c *OpContext) IntDiv(a, b *Num) Value { - return intDivOp(c, (*big.Int).Div, a, b) + return intDivOp(c, (*apd.BigInt).Div, a, b) } func (c *OpContext) IntMod(a, b *Num) Value { - return intDivOp(c, (*big.Int).Mod, a, b) + return intDivOp(c, (*apd.BigInt).Mod, a, b) } func (c *OpContext) IntQuo(a, b *Num) Value { - return intDivOp(c, (*big.Int).Quo, a, b) + return intDivOp(c, (*apd.BigInt).Quo, a, b) } func (c *OpContext) IntRem(a, b *Num) Value { - return intDivOp(c, (*big.Int).Rem, a, b) + return intDivOp(c, (*apd.BigInt).Rem, a, b) } -type intFunc func(z, x, y *big.Int) *big.Int +type intFunc func(z, x, y *apd.BigInt) *apd.BigInt func intDivOp(c *OpContext, fn intFunc, a, b *Num) Value { if b.X.IsZero() { @@ -109,11 +101,11 @@ func intDivOp(c *OpContext, fn intFunc, a, b *Num) Value { } var x, y apd.Decimal - _, _ = apdCtx.RoundToIntegralValue(&x, &a.X) + _, _ = internal.BaseContext.RoundToIntegralValue(&x, &a.X) if x.Negative { x.Coeff.Neg(&x.Coeff) } - _, _ = apdCtx.RoundToIntegralValue(&y, &b.X) + _, _ = internal.BaseContext.RoundToIntegralValue(&y, &b.X) if y.Negative { y.Coeff.Neg(&y.Coeff) } diff --git a/vendor/cuelang.org/go/internal/core/adt/default.go b/vendor/cuelang.org/go/internal/core/adt/default.go index 6e6f1b19..885e9618 100644 --- a/vendor/cuelang.org/go/internal/core/adt/default.go +++ b/vendor/cuelang.org/go/internal/core/adt/default.go @@ -56,7 +56,7 @@ func (v *Vertex) Default() *Vertex { case 0: return v case 1: - w = d.Values[0].Default() + w = ToVertex(Default(d.Values[0])) default: x := *v x.state = nil diff --git a/vendor/cuelang.org/go/internal/core/adt/disjunct.go b/vendor/cuelang.org/go/internal/core/adt/disjunct.go index 8f2074a4..45abffcb 100644 --- a/vendor/cuelang.org/go/internal/core/adt/disjunct.go +++ b/vendor/cuelang.org/go/internal/core/adt/disjunct.go @@ -119,19 +119,26 @@ func (n *nodeContext) addDisjunctionValue(env *Environment, x *Disjunction, clon } func (n *nodeContext) expandDisjuncts( - state VertexStatus, + state vertexStatus, parent *nodeContext, parentMode defaultMode, // default mode of this disjunct recursive, last bool) { - n.ctx.stats.DisjunctCount++ + n.ctx.stats.Disjuncts++ + + // refNode is used to collect cyclicReferences for all disjuncts to be + // passed up to the parent node. Note that because the node in the parent + // context is overwritten in the course of expanding disjunction to retain + // pointer identity, it is not possible to simply record the refNodes in the + // parent directly. + var refNode *RefNode node := n.node defer func() { n.node = node }() - for n.expandOne() { + for n.expandOne(partial) { } // save node to snapShot in nodeContex @@ -167,9 +174,6 @@ func (n *nodeContext) expandDisjuncts( // Perhaps introduce an Err() method. err = x.ChildErrors } - if err.IsIncomplete() { - break - } if err != nil { parent.disjunctErrs = append(parent.disjunctErrs, err) } @@ -186,7 +190,7 @@ func (n *nodeContext) expandDisjuncts( n.disjuncts = append(n.disjuncts, n) } if n.node.BaseValue == nil { - n.node.BaseValue = n.getValidators() + n.node.BaseValue = n.getValidators(state) } n.usedDefault = append(n.usedDefault, defaultInfo{ @@ -198,7 +202,7 @@ func (n *nodeContext) expandDisjuncts( case len(n.disjunctions) > 0: // Process full disjuncts to ensure that erroneous disjuncts are // eliminated as early as possible. - state = Finalized + state = finalized n.disjuncts = append(n.disjuncts, n) @@ -225,11 +229,22 @@ func (n *nodeContext) expandDisjuncts( cn.node.state = cn c := MakeConjunct(d.env, v.Val, d.cloneID) - cn.addExprConjunct(c) + cn.addExprConjunct(c, state) newMode := mode(d.hasDefaults, v.Default) cn.expandDisjuncts(state, n, newMode, true, last) + + // Record the cyclicReferences of the conjunct in the + // parent list. + // TODO: avoid the copy. It should be okay to "steal" + // this list and avoid the copy. But this change is best + // done in a separate CL. + for r := n.node.cyclicReferences; r != nil; r = r.Next { + s := *r + s.Next = refNode + refNode = &s + } } case d.value != nil: @@ -243,6 +258,13 @@ func (n *nodeContext) expandDisjuncts( newMode := mode(d.hasDefaults, i < d.value.NumDefaults) cn.expandDisjuncts(state, n, newMode, true, last) + + // See comment above. + for r := n.node.cyclicReferences; r != nil; r = r.Next { + s := *r + s.Next = refNode + refNode = &s + } } } } @@ -351,7 +373,7 @@ func (n *nodeContext) expandDisjuncts( // the value was scalar before, we drop this information when there is // only one disjunct, while not discarding hard defaults. TODO: a more // principled approach would be to recognize that there is only one - // default at a point where this does not break commutativity. if + // default at a point where this does not break commutativity. // if len(n.disjuncts) == 1 && n.disjuncts[0].defaultMode != isDefault { // n.disjuncts[0].defaultMode = maybeDefault // } @@ -366,6 +388,15 @@ func (n *nodeContext) expandDisjuncts( outer: for _, d := range n.disjuncts { for k, v := range p.disjuncts { + // As long as a vertex isn't finalized, it may be that potential + // errors are not yet detected. This may lead two structs that + // are identical except for closedness information, + // for instance, to appear identical. + if v.result.status < finalized || d.result.status < finalized { + break + } + // Even if a node is finalized, it may still have an + // "incomplete" component that may change down the line. if !d.done() || !v.done() { break } @@ -393,6 +424,14 @@ func (n *nodeContext) expandDisjuncts( n.disjuncts = n.disjuncts[:0] } + + // Record the refNodes in the parent. + for r := refNode; r != nil; { + next := r.Next + r.Next = parent.node.cyclicReferences + parent.node.cyclicReferences = r + r = next + } } func (n *nodeContext) makeError() { @@ -411,7 +450,7 @@ func (n *nodeContext) makeError() { Code: code, Err: n.disjunctError(), } - n.node.SetValue(n.ctx, Finalized, b) + n.node.SetValue(n.ctx, b) } func mode(hasDefault, marked bool) defaultMode { @@ -442,7 +481,7 @@ func clone(v Vertex) Vertex { v.Arcs = make([]*Vertex, len(a)) for i, arc := range a { switch arc.status { - case Finalized: + case finalized: v.Arcs[i] = arc case 0: @@ -528,12 +567,14 @@ func (n *nodeContext) disjunctError() (errs errors.Error) { } else { disjuncts = errors.Sanitize(disjuncts) k := len(errors.Errors(disjuncts)) + if k == 1 { + return disjuncts + } // prefix '-' to sort to top errs = ctx.Newf("%d errors in empty disjunction:", k) + errs = errors.Append(errs, disjuncts) } - errs = errors.Append(errs, disjuncts) - return errs } diff --git a/vendor/cuelang.org/go/internal/core/adt/doc.go b/vendor/cuelang.org/go/internal/core/adt/doc.go index 26c978e2..189b014f 100644 --- a/vendor/cuelang.org/go/internal/core/adt/doc.go +++ b/vendor/cuelang.org/go/internal/core/adt/doc.go @@ -18,45 +18,43 @@ // values that may be used in a certain situation. Concrete types may belong to // multiple categories. // -// -// Abstract Types +// # Abstract Types // // The following types describe the a place where a value may be used: // -// Decl a value than can be used as a StructLit element. -// Elem a value than can be used as a ListLit element. -// Expr represents an Expr in the CUE grammar. -// Value a fully evaluated value that has no references (except for -// children in composite values). -// Node any of the above values. +// Decl a value than can be used as a StructLit element. +// Elem a value than can be used as a ListLit element. +// Expr represents an Expr in the CUE grammar. +// Value a fully evaluated value that has no references (except for +// children in composite values). +// Node any of the above values. // // The following types categorize nodes by function: // -// Resolver a reference to position in the result tree. -// Evaluator evaluates to 1 value. -// Yielder evaluates to 0 or more values. -// Validator validates another value. -// +// Resolver a reference to position in the result tree. +// Evaluator evaluates to 1 value. +// Yielder evaluates to 0 or more values. +// Validator validates another value. // -// Reference resolution algorithm +// # Reference resolution algorithm // // A Resolver is resolved within the context of an Environment. In CUE, a // reference is evaluated by substituting it with a copy of the value to which // it refers. If the copied value itself contains references we can distinguish // two different cases. References that refer to values within the copied // reference (not regarding selectors) will henceforth point to the copied node. -// References that point to outside the referened value will keep referring to +// References that point to outside the referenced value will keep referring to // their original value. // -// a: b: { -// c: int -// d: c -// e: f -// } -// f: 4 -// g: a.b { // d.c points to inside the referred value, e.f, not. -// c: 3 -// } +// a: b: { +// c: int +// d: c +// e: f +// } +// f: 4 +// g: a.b { // d.c points to inside the referred value, e.f, not. +// c: 3 +// } // // The implementation doesn't actually copy referred values, but rather resolves // references with the aid of an Environment. During compile time, each @@ -67,12 +65,10 @@ // is the identical for all references within a fields conjunct. Often, an // Environment can even be shared among conjuncts. // -// -// Values +// # Values // // Values are fully evaluated expressions. As this means that all references // will have been eliminated, Values are fully defined without the need for an // Environment. Additionally, Values represent a fully evaluated form, stripped // of any comprehensions, optional fields or embeddings. -// package adt diff --git a/vendor/cuelang.org/go/internal/core/adt/equality.go b/vendor/cuelang.org/go/internal/core/adt/equality.go index cb1d3381..dcb8600a 100644 --- a/vendor/cuelang.org/go/internal/core/adt/equality.go +++ b/vendor/cuelang.org/go/internal/core/adt/equality.go @@ -45,6 +45,9 @@ func equalVertex(ctx *OpContext, x *Vertex, v Value, flags Flag) bool { if x == y { return true } + if x.ArcType != y.ArcType { + return false + } xk := x.Kind() yk := y.Kind() @@ -52,8 +55,11 @@ func equalVertex(ctx *OpContext, x *Vertex, v Value, flags Flag) bool { return false } - if len(x.Arcs) != len(y.Arcs) { - return false + maxArcType := ArcMember + if flags&CheckStructural != 0 { + // Do not ignore optional fields + // TODO(required): consider making this unconditional + maxArcType = ArcOptional } // TODO: this really should be subsumption. @@ -68,9 +74,12 @@ func equalVertex(ctx *OpContext, x *Vertex, v Value, flags Flag) bool { loop1: for _, a := range x.Arcs { + if a.ArcType > maxArcType { + continue + } for _, b := range y.Arcs { if a.Label == b.Label { - if !Equal(ctx, a, b, flags) { + if a.ArcType != b.ArcType || !Equal(ctx, a, b, flags) { return false } continue loop1 @@ -79,16 +88,24 @@ loop1: return false } - // We do not need to do the following check, because of the pigeon-hole principle. - // loop2: - // for _, b := range y.Arcs { - // for _, a := range x.Arcs { - // if a.Label == b.Label { - // continue loop2 - // } - // } - // return false - // } +loop2: + for _, b := range y.Arcs { + if b.ArcType > maxArcType { + continue + } + for _, a := range x.Arcs { + if a.Label == b.Label { + if a.ArcType > maxArcType { + // No need to continue: arc with label not found. + break + } + // Label found. Equality was already tested in loop 1. + continue loop2 + } + } + // Arc with same label not found. + return false + } v, ok1 := x.BaseValue.(Value) w, ok2 := y.BaseValue.(Value) @@ -101,10 +118,10 @@ loop1: // equalClosed tests if x and y have the same set of close information. // TODO: the following refinements are possible: -// - unify optional fields and equate the optional fields -// - do the same for pattern constraints, where the pattern constraints -// are collated by pattern equality. -// - a further refinement would collate patterns by ranges. +// - unify optional fields and equate the optional fields +// - do the same for pattern constraints, where the pattern constraints +// are collated by pattern equality. +// - a further refinement would collate patterns by ranges. // // For all these refinements it would be necessary to have well-working // structure sharing so as to not repeatedly recompute optional arcs. @@ -118,7 +135,7 @@ outer: if (flags&IgnoreOptional != 0) && !s.StructLit.HasOptional() { continue } - if s.closeInfo == nil || s.closeInfo.span&DefinitionSpan == 0 { + if s.span()&DefinitionSpan == 0 { if !s.StructLit.HasOptional() { continue } @@ -139,6 +156,11 @@ func equalTerminal(ctx *OpContext, v, w Value, flags Flag) bool { } switch x := v.(type) { + case *Bottom: + // All errors are logically the same. + _, ok := w.(*Bottom) + return ok + case *Num, *String, *Bool, *Bytes, *Null: if b, ok := BinOp(ctx, EqualOp, v, w).(*Bool); ok { return b.B diff --git a/vendor/cuelang.org/go/internal/core/adt/errors.go b/vendor/cuelang.org/go/internal/core/adt/errors.go index d5f6cfc1..4de2a91c 100644 --- a/vendor/cuelang.org/go/internal/core/adt/errors.go +++ b/vendor/cuelang.org/go/internal/core/adt/errors.go @@ -40,7 +40,7 @@ import ( // ErrorCode indicates the type of error. The type of error may influence // control flow. No other aspects of an error may influence control flow. -type ErrorCode int +type ErrorCode int8 const ( // An EvalError is a fatal evaluation error. @@ -89,10 +89,15 @@ type Bottom struct { Src ast.Node Err errors.Error - Code ErrorCode + Code ErrorCode + // Permanent indicates whether an incomplete error can be + // resolved later without making the configuration more specific. + // This may happen when an arc isn't fully resolved yet. + Permanent bool HasRecursive bool ChildError bool // Err is the error of the child NotExists bool // This error originated from a failed lookup. + ForCycle bool // this is a for cycle // Value holds the computed value so far in case Value Value } @@ -140,7 +145,6 @@ func isIncomplete(v *Vertex) bool { // // If x is not already an error, the value is recorded in the error for // reference. -// func (v *Vertex) AddChildError(recursive *Bottom) { v.ChildErrors = CombineErrors(nil, v.ChildErrors, recursive) if recursive.IsIncomplete() { @@ -202,6 +206,40 @@ func CombineErrors(src ast.Node, x, y Value) *Bottom { } } +func NewRequiredNotPresentError(ctx *OpContext, v *Vertex) *Bottom { + saved := ctx.PushArc(v) + err := ctx.Newf("field is required but not present") + for _, c := range v.Conjuncts { + if f, ok := c.x.(*Field); ok && f.ArcType == ArcRequired { + err.AddPosition(c.x) + } + if c.CloseInfo.closeInfo != nil { + err.AddPosition(c.CloseInfo.location) + } + } + + b := &Bottom{ + Code: IncompleteError, + Err: err, + } + ctx.PopArc(saved) + return b +} + +func newRequiredFieldInComprehensionError(ctx *OpContext, x *ForClause, v *Vertex) *Bottom { + err := ctx.Newf("missing required field in for comprehension: %v", v.Label) + err.AddPosition(x.Src) + for _, c := range v.Conjuncts { + if f, ok := c.x.(*Field); ok && f.ArcType == ArcRequired { + err.AddPosition(c.x) + } + } + return &Bottom{ + Code: IncompleteError, + Err: err, + } +} + // A ValueError is returned as a result of evaluating a value. type ValueError struct { r Runtime @@ -297,7 +335,7 @@ func (c *OpContext) NewPosf(p token.Pos, format string, args ...interface{}) *Va v: c.errNode(), pos: p, auxpos: a, - Message: errors.NewMessage(format, args), + Message: errors.NewMessagef(format, args...), } } diff --git a/vendor/cuelang.org/go/internal/core/adt/eval.go b/vendor/cuelang.org/go/internal/core/adt/eval.go index 37e8cd93..fdd0f09f 100644 --- a/vendor/cuelang.org/go/internal/core/adt/eval.go +++ b/vendor/cuelang.org/go/internal/core/adt/eval.go @@ -26,11 +26,10 @@ package adt import ( "fmt" - "html/template" - "strings" "cuelang.org/go/cue/ast" "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/stats" "cuelang.org/go/cue/token" ) @@ -43,43 +42,7 @@ import ( // - Test closedness far more thoroughly. // -type Stats struct { - DisjunctCount int - UnifyCount int - - Freed int - Retained int - Reused int - Allocs int -} - -// Leaks reports the number of nodeContext structs leaked. These are typically -// benign, as they will just be garbage collected, as long as the pointer from -// the original nodes has been eliminated or the original nodes are also not -// referred to. But Leaks may have notable impact on performance, and thus -// should be avoided. -func (s *Stats) Leaks() int { - return s.Allocs + s.Reused - s.Freed -} - -var stats = template.Must(template.New("stats").Parse(`{{"" -}} - -Leaks: {{.Leaks}} -Freed: {{.Freed}} -Reused: {{.Reused}} -Allocs: {{.Allocs}} -Retain: {{.Retained}} - -Unifications: {{.UnifyCount}} -Disjuncts: {{.DisjunctCount}}`)) - -func (s *Stats) String() string { - buf := &strings.Builder{} - _ = stats.Execute(buf, s) - return buf.String() -} - -func (c *OpContext) Stats() *Stats { +func (c *OpContext) Stats() *stats.Counts { return &c.stats } @@ -110,10 +73,29 @@ var incompleteSentinel = &Bottom{ // error. // // TODO: return *Vertex -func (c *OpContext) evaluate(v *Vertex, state VertexStatus) Value { +func (c *OpContext) evaluate(v *Vertex, r Resolver, state vertexStatus) Value { if v.isUndefined() { // Use node itself to allow for cycle detection. - c.Unify(v, state) + c.unify(v, state) + + if v.ArcType == ArcPending { + if v.status == evaluating { + for ; v.Parent != nil && v.ArcType == ArcPending; v = v.Parent { + } + err := c.Newf("cycle with field %v", r) + b := &Bottom{Code: CycleError, Err: err} + v.setValue(c, v.status, b) + return b + // TODO: use this instead, as is usual for incomplete errors, + // and also move this block one scope up to also apply to + // defined arcs. In both cases, though, doing so results in + // some errors to be misclassified as evaluation error. + // c.AddBottom(b) + // return nil + } + c.undefinedFieldError(v, IncompleteError) + return nil + } } if n := v.state; n != nil { @@ -135,7 +117,7 @@ func (c *OpContext) evaluate(v *Vertex, state VertexStatus) Value { case nil: if v.state != nil { - switch x := v.state.getValidators().(type) { + switch x := v.state.getValidators(finalized).(type) { case Value: return x default: @@ -144,10 +126,12 @@ func (c *OpContext) evaluate(v *Vertex, state VertexStatus) Value { return &w } } - Assertf(false, "no BaseValue: state: %v; requested: %v", v.status, state) + // This may happen if the evaluator is invoked outside of regular + // evaluation, such as in dependency analysis. + return nil } - if v.status < Finalized && v.state != nil { + if v.status < finalized && v.state != nil { // TODO: errors are slightly better if we always add addNotify, but // in this case it is less likely to cause a performance penalty. // See https://cuelang.org/issue/661. It may be possible to @@ -161,10 +145,12 @@ func (c *OpContext) evaluate(v *Vertex, state VertexStatus) Value { return v } -// Unify fully unifies all values of a Vertex to completion and stores -// the result in the Vertex. If unify was called on v before it returns -// the cached results. -func (c *OpContext) Unify(v *Vertex, state VertexStatus) { +// unify unifies values of a Vertex to and stores the result in the Vertex. If +// unify was called on v before it returns the cached results. +// state can be used to indicate to which extent processing should continue. +// state == finalized means it is evaluated to completion. See vertexStatus +// for more details. +func (c *OpContext) unify(v *Vertex, state vertexStatus) { // defer c.PopVertex(c.PushVertex(v)) if Debug { c.nest++ @@ -177,21 +163,27 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { // Ensure a node will always have a nodeContext after calling Unify if it is // not yet Finalized. - n := v.getNodeContext(c) + n := v.getNodeContext(c, 1) defer v.freeNode(n) - if state <= v.Status() { - if v.Status() != Partial && state != Partial { - return - } + // TODO(cycle): verify this happens in all cases when we need it. + if n != nil && v.Parent != nil && v.Parent.state != nil { + n.depth = v.Parent.state.depth + 1 + } + + if state <= v.Status() && + state == partial && + v.isDefined() && + n != nil && n.scalar != nil { + return } switch v.Status() { - case Evaluating: - n.insertConjuncts() + case evaluating: + n.insertConjuncts(state) return - case EvaluatingArcs: + case evaluatingArcs: Assertf(v.status > 0, "unexpected status %d", v.status) return @@ -206,6 +198,10 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { } } + defer c.PopArc(c.PushArc(v)) + + v.updateStatus(evaluating) + if p := v.Parent; p != nil && p.state != nil && v.Label.IsString() { for _, s := range p.state.node.Structs { if s.Disable { @@ -215,18 +211,7 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { } } - if !n.checkClosed(state) { - return - } - - defer c.PopArc(c.PushArc(v)) - - c.stats.UnifyCount++ - - // Clear any remaining error. - if err := c.Err(); err != nil { - panic("uncaught error") - } + c.stats.Unifications++ // Set the cache to a cycle error to ensure a cyclic reference will result // in an error if applicable. A cyclic error may be ignored for @@ -238,62 +223,71 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { // special cycle handling unnecessary. v.BaseValue = cycle - v.UpdateStatus(Evaluating) + if c.HasErr() { + n.addBottom(c.errs) + } - n.conjuncts = v.Conjuncts - n.insertConjuncts() + // NOTE: safeguard against accidentally entering the 'unprocessed' state + // twice. + n.conjuncts = n.conjuncts[:0] + + for i, c := range v.Conjuncts { + n.addConjunction(c, i) + } + if n.insertConjuncts(state) { + n.maybeSetCache() + v.updateStatus(partial) + return + } fallthrough - case Partial: + case partial, conjuncts: + // TODO: remove this optimization or make it correct. + // No need to do further processing when we have errors and all values + // have been considered. + // TODO: is checkClosed really still necessary here? + if v.status == conjuncts && (n.hasErr() || !n.checkClosed(state)) { + if err := n.getErr(); err != nil { + b, _ := v.BaseValue.(*Bottom) + v.BaseValue = CombineErrors(nil, b, err) + } + break + } + defer c.PopArc(c.PushArc(v)) - v.status = Evaluating + n.insertConjuncts(state) + + v.status = evaluating // Use maybeSetCache for cycle breaking - for n.maybeSetCache(); n.expandOne(); n.maybeSetCache() { + for n.maybeSetCache(); n.expandOne(partial); n.maybeSetCache() { } n.doNotify() if !n.done() { switch { - case len(n.disjunctions) > 0 && isCyclePlaceholder(v.BaseValue): - // We disallow entering computations of disjunctions with - // incomplete data. - if state == Finalized { - b := c.NewErrf("incomplete cause disjunction") - b.Code = IncompleteError - n.errs = CombineErrors(nil, n.errs, b) - v.SetValue(n.ctx, Finalized, b) - } else { - n.node.UpdateStatus(Partial) - } + case state < conjuncts: + n.node.updateStatus(partial) return - case state <= AllArcs: - n.node.UpdateStatus(Partial) + case state == conjuncts: + if err := n.incompleteErrors(true); err != nil && err.Code < CycleError { + n.node.AddErr(c, err) + } else { + n.node.updateStatus(partial) + } return } } - if s := v.Status(); state <= s { - // We have found a partial result. There may still be errors - // down the line which may result from further evaluating this - // field, but that will be caught when evaluating this field - // for real. - - // This also covers the case where a recursive evaluation triggered - // this field to become finalized in the mean time. In that case - // we can avoid running another expandDisjuncts. - return - } - // Disjunctions should always be finalized. If there are nested // disjunctions the last one should be finalized. disState := state - if len(n.disjunctions) > 0 && disState != Finalized { - disState = Finalized + if len(n.disjunctions) > 0 && disState != finalized { + disState = finalized } n.expandDisjuncts(disState, n, maybeDefault, false, true) @@ -304,6 +298,7 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { case 1: x := n.disjuncts[0].result x.state = nil + x.cyclicReferences = n.node.cyclicReferences *v = x default: @@ -312,13 +307,17 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { // The conjuncts will have too much information. Better have no // information than incorrect information. for _, d := range d.Values { + d, ok := d.(*Vertex) + if !ok { + continue + } // We clear the conjuncts for now. As these disjuncts are for API // use only, we will fill them out when necessary (using Defaults). d.Conjuncts = nil // TODO: use a more principled form of dereferencing. For instance, // disjuncts could already be assumed to be the given Vertex, and - // the the main vertex could be dereferenced during evaluation. + // the main vertex could be dereferenced during evaluation. for _, a := range d.Arcs { for _, x := range a.Conjuncts { // All the environments for embedded structs need to be @@ -330,6 +329,7 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { } } v.Arcs = nil + v.ChildErrors = nil // v.Structs = nil // TODO: should we keep or discard the Structs? // TODO: how to represent closedness information? Do we need it? } @@ -342,7 +342,7 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { // We don't do this in postDisjuncts, as it should only be done after // completing all disjunctions. if !n.done() { - if err := n.incompleteErrors(); err != nil { + if err := n.incompleteErrors(true); err != nil { b, _ := n.node.BaseValue.(*Bottom) if b != err { err = CombineErrors(n.ctx.src, b, err) @@ -351,44 +351,63 @@ func (c *OpContext) Unify(v *Vertex, state VertexStatus) { } } - if state != Finalized { + assertStructuralCycle(n) + + if state != finalized { return } if v.BaseValue == nil { - v.BaseValue = n.getValidators() + v.BaseValue = n.getValidators(finalized) } // Free memory here? - v.UpdateStatus(Finalized) - - case AllArcs: - if !n.checkClosed(state) { - break - } - - defer c.PopArc(c.PushArc(v)) + v.updateStatus(finalized) - n.completeArcs(state) - - case Finalized: + case finalized: } } -// insertConjuncts inserts conjuncts previously uninserted. -func (n *nodeContext) insertConjuncts() { - for len(n.conjuncts) > 0 { +// insertConjuncts inserts conjuncts previously not inserted. +func (n *nodeContext) insertConjuncts(state vertexStatus) bool { + // Exit early if we have a concrete value and only need partial results. + if state == partial { + for n.conjunctsPartialPos < len(n.conjuncts) { + c := &n.conjuncts[n.conjunctsPartialPos] + n.conjunctsPartialPos++ + if c.done { + continue + } + if v, ok := c.C.Elem().(Value); ok && IsConcrete(v) { + c.done = true + n.addValueConjunct(c.C.Env, v, c.C.CloseInfo) + } + } + if n.scalar != nil && n.node.isDefined() { + return true + } + } + for n.conjunctsPos < len(n.conjuncts) { nInfos := len(n.node.Structs) - p := &n.conjuncts[0] - n.conjuncts = n.conjuncts[1:] - n.addExprConjunct(*p) + p := &n.conjuncts[n.conjunctsPos] + n.conjunctsPos++ + if p.done { + continue + } + + // Initially request a Partial state to allow cyclic references to + // resolve more naturally first. This results in better error messages + // and less operations. + n.addExprConjunct(p.C, partial) + p.done = true // Record the OptionalTypes for all structs that were inferred by this // Conjunct. This information can be used by algorithms such as trim. for i := nInfos; i < len(n.node.Structs); i++ { - p.CloseInfo.FieldTypes |= n.node.Structs[i].types + n.node.Conjuncts[p.index].CloseInfo.FieldTypes |= n.node.Structs[i].types } } + return false } // finalizeDisjuncts: incomplete errors are kept around and not removed early. @@ -409,7 +428,7 @@ func (n *nodeContext) finalizeDisjuncts() { a[k], a[i] = d, a[k] k++ default: - if err := d.incompleteErrors(); err != nil { + if err := d.incompleteErrors(true); err != nil { n.disjunctErrs = append(n.disjunctErrs, err) } } @@ -439,17 +458,15 @@ func (n *nodeContext) doNotify() { n.notify = n.notify[:0] } -func (n *nodeContext) postDisjunct(state VertexStatus) { +func (n *nodeContext) postDisjunct(state vertexStatus) { ctx := n.ctx for { // Use maybeSetCache for cycle breaking - for n.maybeSetCache(); n.expandOne(); n.maybeSetCache() { + for n.maybeSetCache(); n.expandOne(state); n.maybeSetCache() { } - if aList, id := n.addLists(); aList != nil { - n.updateNodeType(ListKind, aList, id) - } else { + if !n.addLists(state) { break } } @@ -458,15 +475,50 @@ func (n *nodeContext) postDisjunct(state VertexStatus) { n.updateNodeType(StructKind, n.aStruct, n.aStructID) } + if len(n.selfComprehensions) > 0 { + // Up to here all comprehensions with sources other than this node will + // have had a chance to run. We can now run self-referencing + // comprehensions with the restriction that they cannot add new arcs. + // + // Note: we should only set this in case of self-referential + // comprehensions. A comprehension in a parent node may still add + // arcs to this node, even if it has reached AllConjunctsDone status, + // as long as any evaluation did not rely on its specific set of arcs. + // Example: + // + // a: { + // b: _env: c: 1 + // + // // Using dynamic field ("b") prevents the evaluation of the + // // comprehension to be pushed down to env: and instead evaluates + // // it before b is completed. Even though b needs to reach state + // // AllConjunctsDone before evaluating b._env, it is still okay + // // to add arcs to b after this evaluation: only the set of arcs + // // in b._env needs to be frozen after that. + // for k2, v2 in b._env { + // ("b"): env: (k2): v2 + // } + // } + n.node.LockArcs = true + + n.injectSelfComprehensions(state) + } + + for n.expandOne(state) { + } + switch err := n.getErr(); { case err != nil: + if err.Code < IncompleteError && n.node.ArcType == ArcPending { + n.node.ArcType = ArcMember + } n.node.BaseValue = err n.errs = nil default: if isCyclePlaceholder(n.node.BaseValue) { if !n.done() { - n.node.BaseValue = n.incompleteErrors() + n.node.BaseValue = n.incompleteErrors(true) } else { n.node.BaseValue = nil } @@ -483,66 +535,22 @@ func (n *nodeContext) postDisjunct(state VertexStatus) { // } // We are no longer evaluating. - // n.node.UpdateStatus(Partial) - n.node.UpdateStatus(Evaluating) - - // Either set to Conjunction or error. - // TODO: verify and simplify the below code to determine whether - // something is a struct. - markStruct := false - if n.aStruct != nil { - markStruct = true - } else if len(n.node.Structs) > 0 { - markStruct = n.kind&StructKind != 0 && !n.hasTop - } + + n.validateValue(state) + v := n.node.Value() - if n.node.BaseValue == nil && markStruct { - n.node.BaseValue = &StructMarker{} - v = n.node - } - if v != nil && IsConcrete(v) { - // Also check when we already have errors as we may find more - // serious errors and would like to know about all errors anyway. - - if n.lowerBound != nil { - if b := ctx.Validate(n.lowerBound, v); b != nil { - // TODO(errors): make Validate return boolean and generate - // optimized conflict message. Also track and inject IDs - // to determine origin location.s - if e, _ := b.Err.(*ValueError); e != nil { - e.AddPosition(n.lowerBound) - e.AddPosition(v) - } - n.addBottom(b) - } - } - if n.upperBound != nil { - if b := ctx.Validate(n.upperBound, v); b != nil { - // TODO(errors): make Validate return boolean and generate - // optimized conflict message. Also track and inject IDs - // to determine origin location.s - if e, _ := b.Err.(*ValueError); e != nil { - e.AddPosition(n.upperBound) - e.AddPosition(v) - } + + // TODO(perf): only delay processing of actual non-monotonic checks. + skip := n.skipNonMonotonicChecks() + if v != nil && IsConcrete(v) && !skip { + for _, v := range n.checks { + // TODO(errors): make Validate return bottom and generate + // optimized conflict message. Also track and inject IDs + // to determine origin location.s + if b := ctx.Validate(v, n.node); b != nil { n.addBottom(b) } } - // MOVE BELOW - // TODO(perf): only delay processing of actual non-monotonic checks. - skip := n.skipNonMonotonicChecks() - if v := n.node.Value(); v != nil && IsConcrete(v) && !skip { - for _, v := range n.checks { - // TODO(errors): make Validate return bottom and generate - // optimized conflict message. Also track and inject IDs - // to determine origin location.s - if b := ctx.Validate(v, n.node); b != nil { - n.addBottom(b) - } - } - } - } else if state == Finalized { - n.node.BaseValue = n.getValidators() } if v == nil { @@ -552,7 +560,7 @@ func (n *nodeContext) postDisjunct(state VertexStatus) { switch { case v.Kind() == ListKind: for _, a := range n.node.Arcs { - if a.Label.Typ() == StringLabel { + if a.Label.Typ() == StringLabel && a.IsDefined(ctx) { n.addErr(ctx.Newf("list may not have regular fields")) // TODO(errors): add positions for list and arc definitions. @@ -570,26 +578,131 @@ func (n *nodeContext) postDisjunct(state VertexStatus) { } } - if err := n.getErr(); err != nil { - if b, _ := n.node.BaseValue.(*Bottom); b != nil { - err = CombineErrors(nil, b, err) + n.completeArcs(state) +} + +// validateValue checks collected bound validators and checks them against +// the current value. If there is no value, it sets the current value +// to these validators itself. +// +// Before it does this, it also checks whether n is of another incompatible +// type, like struct. This prevents validators from being inadvertently set. +// TODO: optimize this function for new implementation. +func (n *nodeContext) validateValue(state vertexStatus) { + ctx := n.ctx + + // Either set to Conjunction or error. + // TODO: verify and simplify the below code to determine whether + // something is a struct. + markStruct := false + if n.aStruct != nil { + markStruct = true + } else if len(n.node.Structs) > 0 { + markStruct = n.kind&StructKind != 0 && !n.hasTop + } + v := n.node.Value() + if n.node.BaseValue == nil && markStruct { + n.node.BaseValue = &StructMarker{} + v = n.node + } + if v != nil && IsConcrete(v) { + // Also check when we already have errors as we may find more + // serious errors and would like to know about all errors anyway. + + if n.lowerBound != nil { + if b := ctx.Validate(n.lowerBound, v); b != nil { + // TODO(errors): make Validate return boolean and generate + // optimized conflict message. Also track and inject IDs + // to determine origin location.s + if e, _ := b.Err.(*ValueError); e != nil { + e.AddPosition(n.lowerBound) + e.AddPosition(v) + } + n.addBottom(b) + } + } + if n.upperBound != nil { + if b := ctx.Validate(n.upperBound, v); b != nil { + // TODO(errors): make Validate return boolean and generate + // optimized conflict message. Also track and inject IDs + // to determine origin location.s + if e, _ := b.Err.(*ValueError); e != nil { + e.AddPosition(n.upperBound) + e.AddPosition(v) + } + n.addBottom(b) + } } - n.node.BaseValue = err - // TODO: add return: if evaluation of arcs is important it can be done - // later. Logically we're done. - } - n.completeArcs(state) + } else if state == finalized { + n.node.BaseValue = n.getValidators(finalized) + } } -func (n *nodeContext) incompleteErrors() *Bottom { +// incompleteErrors reports all errors from uncompleted conjuncts. +// If final is true, errors are permanent and reported to parents. +func (n *nodeContext) incompleteErrors(final bool) *Bottom { // collect incomplete errors. var err *Bottom // n.incomplete for _, d := range n.dynamicFields { err = CombineErrors(nil, err, d.err) } for _, c := range n.comprehensions { + if c.err == nil { + continue + } err = CombineErrors(nil, err, c.err) + + // TODO: use this code once possible. + // + // Add comprehension to ensure incomplete error is inserted. This + // ensures that the error is reported in the Vertex where the + // comprehension was defined, and not just in the node below. This, in + // turn, is necessary to support certain logic, like export, that + // expects to be able to detect an "incomplete" error at the first level + // where it is necessary. + // if c.node.status != Finalized { + // n := c.node.getNodeContext(n.ctx) + // n.comprehensions = append(n.comprehensions, c) + // } else { + // n.node.AddErr(n.ctx, err) + // } + // n := d.node.getNodeContext(ctx) + // n.addBottom(err) + if final && c.node != nil && c.node.status != finalized { + n := c.node.getNodeContext(n.ctx, 0) + n.addBottom(err) + c.node = nil + } + } + for _, c := range n.selfComprehensions { + if c.err == nil { + continue + } + + err = CombineErrors(nil, err, c.err) + + // TODO: use this code once possible. + // + // Add comprehension to ensure incomplete error is inserted. This + // ensures that the error is reported in the Vertex where the + // comprehension was defined, and not just in the node below. This, in + // turn, is necessary to support certain logic, like export, that + // expects to be able to detect an "incomplete" error at the first level + // where it is necessary. + // if c.node.status != Finalized { + // n := c.node.getNodeContext(n.ctx) + // n.comprehensions = append(n.comprehensions, c) + // } else { + // n.node.AddErr(n.ctx, err) + // } + // n := d.node.getNodeContext(ctx) + // n.addBottom(err) + if c.node != nil && c.node.status != finalized { + n := c.node.getNodeContext(n.ctx, 0) + n.addBottom(err) + c.node = nil + } } for _, x := range n.exprs { err = CombineErrors(nil, err, x.err) @@ -598,6 +711,9 @@ func (n *nodeContext) incompleteErrors() *Bottom { // safeguard. err = incompleteSentinel } + if err.Code < IncompleteError { + n.node.ArcType = ArcMember + } return err } @@ -610,7 +726,7 @@ func (n *nodeContext) incompleteErrors() *Bottom { // // In practice this should not be a problem: when disjuncts originate // from the same disjunct, they will have the same StructInfos, and thus -// Equal is able to equate them even in the precense of optional field. +// Equal is able to equate them even in the presence of optional field. // In general, combining any limited set of disjuncts will soon reach // a fixed point where duplicate elements can be eliminated this way. // @@ -619,11 +735,11 @@ func (n *nodeContext) incompleteErrors() *Bottom { // have a discriminator field (e.g. Kubernetes). We should take care, // though, that any potential performance issues are eliminated for // Protobuf-like oneOf fields. -func (n *nodeContext) checkClosed(state VertexStatus) bool { - ignore := state != Finalized || n.skipNonMonotonicChecks() +func (n *nodeContext) checkClosed(state vertexStatus) bool { + ignore := state != finalized || n.skipNonMonotonicChecks() v := n.node - if !v.Label.IsInt() && v.Parent != nil && !ignore { + if !v.Label.IsInt() && v.Parent != nil && !ignore && v.ArcType <= ArcRequired { ctx := n.ctx // Visit arcs recursively to validate and compute error. if _, err := verifyArc2(ctx, v.Label, v, v.Closed); err != nil { @@ -631,76 +747,152 @@ func (n *nodeContext) checkClosed(state VertexStatus) bool { // conflicts at the appropriate place, to allow valid fields to // be represented normally and, most importantly, to avoid // recursive processing of a disallowed field. - v.SetValue(ctx, Finalized, err) + v.SetValue(ctx, err) return false } } return true } -func (n *nodeContext) completeArcs(state VertexStatus) { +func (n *nodeContext) completeArcs(state vertexStatus) { if DebugSort > 0 { DebugSortArcs(n.ctx, n.node) } - if state <= AllArcs { - n.node.UpdateStatus(AllArcs) + if n.node.hasAllConjuncts || n.node.Parent == nil { + n.node.setParentDone() + } + + // At this point, if this arc is of type arcVoid, it means that the value + // may still be modified by child arcs. So in this case we must now process + // all arcs to be sure we get the correct result. + // For other cases we terminate early as this results in considerably + // better error messages. + if state <= conjuncts && + // Is allowed to go one step back. See Vertex.UpdateStatus. + n.node.status <= state+1 && + (!n.node.hasPendingArc || n.node.ArcType == ArcMember) { + + n.node.updateStatus(conjuncts) return } - n.node.UpdateStatus(EvaluatingArcs) + n.node.updateStatus(evaluatingArcs) ctx := n.ctx if !assertStructuralCycle(n) { + k := 0 // Visit arcs recursively to validate and compute error. for _, a := range n.node.Arcs { - if a.nonMonotonicInsertGen >= a.nonMonotonicLookupGen && a.nonMonotonicLookupGen > 0 { - err := ctx.Newf( - "cycle: field inserted by if clause that was previously evaluated by another if clause: %s", a.Label) - err.AddPosition(n.node) - n.node.BaseValue = &Bottom{Err: err} - } else if a.nonMonotonicReject { - err := ctx.Newf( - "cycle: field was added after an if clause evaluated it: %s", - a.Label) - err.AddPosition(n.node) - n.node.BaseValue = &Bottom{Err: err} - } - // Call UpdateStatus here to be absolutely sure the status is set // correctly and that we are not regressing. - n.node.UpdateStatus(EvaluatingArcs) - ctx.Unify(a, state) - // Don't set the state to Finalized if the child arcs are not done. - if state == Finalized && a.status < Finalized { - state = AllArcs + n.node.updateStatus(evaluatingArcs) + + wasVoid := a.ArcType == ArcPending + + ctx.unify(a, finalized) + + if a.ArcType == ArcPending { + continue + } + + // Errors are allowed in let fields. Handle errors and failure to + // complete accordingly. + if !a.Label.IsLet() && a.ArcType <= ArcRequired { + // Don't set the state to Finalized if the child arcs are not done. + if state == finalized && a.status < finalized { + state = conjuncts + } + + if err, _ := a.BaseValue.(*Bottom); err != nil { + n.node.AddChildError(err) + } } - if err, _ := a.BaseValue.(*Bottom); err != nil { - n.node.AddChildError(err) + + n.node.Arcs[k] = a + k++ + + switch { + case a.ArcType > ArcRequired, !a.Label.IsString(): + case n.kind&StructKind == 0: + if !n.node.IsErr() { + n.reportFieldMismatch(pos(a.Value()), nil, a.Label, n.node.Value()) + } + case !wasVoid: + case n.kind == TopKind: + // Theoretically it may be possible that a "void" arc references + // this top value where it really should have been a struct. One + // way to solve this is to have two passes over the arcs, where + // the first pass additionally analyzes whether comprehensions + // will yield values and "un-voids" an arc ahead of the rest. + // + // At this moment, though, I fail to see a possibility to create + // faulty CUE using this mechanism, though. At most error + // messages are a bit unintuitive. This may change once we have + // functionality to reflect on types. + if _, ok := n.node.BaseValue.(*Bottom); !ok { + n.node.BaseValue = &StructMarker{} + n.kind = StructKind + } } } + n.node.Arcs = n.node.Arcs[:k] + + for _, c := range n.postChecks { + f := ctx.PushState(c.env, c.expr.Source()) + + // TODO(errors): make Validate return bottom and generate + // optimized conflict message. Also track and inject IDs + // to determine origin location.s + v := ctx.evalState(c.expr, finalized) + v, _ = ctx.getDefault(v) + v = Unwrap(v) + + switch _, isError := v.(*Bottom); { + case isError == c.expectError: + default: + n.node.AddErr(ctx, &Bottom{ + Src: c.expr.Source(), + Code: CycleError, + Err: ctx.NewPosf(pos(c.expr), + "circular dependency in evaluation of conditionals: %v changed after evaluation", + ctx.Str(c.expr)), + }) + } + + ctx.PopState(f) + } } - n.node.UpdateStatus(state) -} + if err := n.getErr(); err != nil { + n.errs = nil + if b, _ := n.node.BaseValue.(*Bottom); b != nil { + err = CombineErrors(nil, b, err) + } + n.node.BaseValue = err + } -func assertStructuralCycle(n *nodeContext) bool { - if cyclic := n.hasCycle && !n.hasNonCycle; cyclic { - n.node.BaseValue = CombineErrors(nil, - n.node.Value(), - &Bottom{ - Code: StructuralCycleError, - Err: n.ctx.Newf("structural cycle"), - Value: n.node.Value(), - // TODO: probably, this should have the referenced arc. - }) - // Don't process Arcs. This is mostly to ensure that no Arcs with - // an Unprocessed status remain in the output. - n.node.Arcs = nil - return true + b, hasErr := n.node.BaseValue.(*Bottom) + if !hasErr && b != cycle { + n.checkClosed(state) } - return false + + // Strip struct literals that were not initialized and are not part + // of the output. + // + // TODO(perf): we could keep track if any such structs exist and only + // do this removal if there is a change of shrinking the list. + k := 0 + for _, s := range n.node.Structs { + if s.initialized { + n.node.Structs[k] = s + k++ + } + } + n.node.Structs = n.node.Structs[:k] + + n.node.updateStatus(finalized) } // TODO: this is now a sentinel. Use a user-facing error that traces where @@ -715,7 +907,7 @@ func isCyclePlaceholder(v BaseValue) bool { } func (n *nodeContext) createDisjunct() *Disjunction { - a := make([]*Vertex, len(n.disjuncts)) + a := make([]Value, len(n.disjuncts)) p := 0 hasDefaults := false for i, x := range n.disjuncts { @@ -755,69 +947,46 @@ type arcKey struct { // A nodeContext is used to collate all conjuncts of a value to facilitate // unification. Conceptually order of unification does not matter. However, -// order has relevance when performing checks of non-monotic properities. Such +// order has relevance when performing checks of non-monotic properties. Such // checks should only be performed once the full value is known. type nodeContext struct { nextFree *nodeContext refCount int + // Keep these two out of the nodeContextState to make them more accessible + // for source-level debuggers. ctx *OpContext node *Vertex - // usedArcs is a list of arcs that were looked up during non-monotonic operations, but do not exist yet. - usedArcs []*Vertex - - // TODO: (this is CL is first step) - // filter *Vertex a subset of composite with concrete fields for - // bloom-like filtering of disjuncts. We should first verify, however, - // whether some breath-first search gives sufficient performance, as this - // should already ensure a quick-fail for struct disjunctions with - // discriminators. - - arcMap []arcKey - - // snapshot holds the last value of the vertex before calling postDisjunct. - snapshot Vertex - - // Result holds the last evaluated value of the vertex after calling - // postDisjunct. - result Vertex - - // Current value (may be under construction) - scalar Value // TODO: use Value in node. - scalarID CloseInfo + nodeContextState - // Concrete conjuncts - kind Kind - kindExpr Expr // expr that adjust last value (for error reporting) - kindID CloseInfo // for error tracing - lowerBound *BoundValue // > or >= - upperBound *BoundValue // < or <= - checks []Validator // BuiltinValidator, other bound values. - errs *Bottom + // Below are slices that need to be managed when cloning and reclaiming + // nodeContexts for reuse. We want to ensure that, instead of setting + // slices to nil, we truncate the existing buffers so that they do not + // need to be reallocated upon reuse of the nodeContext. - // Conjuncts holds a reference to the Vertex Arcs that still need - // processing. It does NOT need to be copied. - conjuncts []Conjunct + arcMap []arcKey // not copied for cloning // notify is used to communicate errors in cyclic dependencies. // TODO: also use this to communicate increasingly more concrete values. notify []*Vertex - // Struct information - dynamicFields []envDynamic - comprehensions []envYield - aStruct Expr - aStructID CloseInfo + // Conjuncts holds a reference to the Vertex Arcs that still need + // processing. It does NOT need to be copied. + conjuncts []conjunct + cyclicConjuncts []cyclicConjunct + + dynamicFields []envDynamic + comprehensions []envYield + selfComprehensions []envYield // comprehensions iterating over own struct. // Expression conjuncts lists []envList vLists []*Vertex exprs []envExpr - hasTop bool - hasCycle bool // has conjunct with structural cycle - hasNonCycle bool // has conjunct without structural cycle + checks []Validator // BuiltinValidator, other bound values. + postChecks []envCheck // Check non-monotonic constraints, among other things. // Disjunction handling disjunctions []envDisjunct @@ -828,10 +997,71 @@ type nodeContext struct { // be treated as a marked disjunction. usedDefault []defaultInfo - defaultMode defaultMode disjuncts []*nodeContext buffer []*nodeContext disjunctErrs []*Bottom + + // snapshot holds the last value of the vertex before calling postDisjunct. + snapshot Vertex + + // Result holds the last evaluated value of the vertex after calling + // postDisjunct. + result Vertex +} + +type conjunct struct { + C Conjunct + + // done marks that this conjunct has been inserted. This prevents a + // conjunct from being processed more than once, for instance, when + // insertConjuncts is called more than once for the same node. + done bool + index int // index of the original conjunct in Vertex.Conjuncts +} + +type nodeContextState struct { + // State info + + hasTop bool + hasCycle bool // has conjunct with structural cycle + hasNonCycle bool // has conjunct without structural cycle + + depth int32 + defaultMode defaultMode + + // Value info + + kind Kind + kindExpr Expr // expr that adjust last value (for error reporting) + kindID CloseInfo // for error tracing + + // Current value (may be under construction) + scalar Value // TODO: use Value in node. + scalarID CloseInfo + + aStruct Expr + aStructID CloseInfo + + lowerBound *BoundValue // > or >= + upperBound *BoundValue // < or <= + errs *Bottom + + // Slice positions + + // conjunctsPos is an index into conjuncts indicating the next conjunct + // to process. This is used to avoids processing a conjunct twice in some + // cases where there is an evaluation cycle. + conjunctsPos int + // conjunctsPartialPos is like conjunctsPos, but for the 'partial' phase + // of processing where conjuncts are only processed as concrete scalars. + conjunctsPartialPos int +} + +// Logf substitutes args in format. Arguments of type Feature, Value, and Expr +// are printed in human-friendly formats. The printed string is prefixed and +// indented with the path associated with the current nodeContext. +func (n *nodeContext) Logf(format string, args ...interface{}) { + n.ctx.Logf(n.node, format, args...) } type defaultInfo struct { @@ -846,7 +1076,7 @@ type defaultInfo struct { } func (n *nodeContext) addNotify(v *Vertex) { - if v != nil { + if v != nil && !n.node.hasAllConjuncts { n.notify = append(n.notify, v) } } @@ -859,34 +1089,26 @@ func (n *nodeContext) clone() *nodeContext { d.ctx = n.ctx d.node = n.node - d.scalar = n.scalar - d.scalarID = n.scalarID - d.kind = n.kind - d.kindExpr = n.kindExpr - d.kindID = n.kindID - d.aStruct = n.aStruct - d.aStructID = n.aStructID - d.hasTop = n.hasTop - - d.lowerBound = n.lowerBound - d.upperBound = n.upperBound - d.errs = n.errs - d.hasTop = n.hasTop - d.hasCycle = n.hasCycle - d.hasNonCycle = n.hasNonCycle - - // d.arcMap = append(d.arcMap, n.arcMap...) // XXX add? - // d.usedArcs = append(d.usedArcs, n.usedArcs...) // XXX: add? + d.nodeContextState = n.nodeContextState + + d.arcMap = append(d.arcMap, n.arcMap...) d.notify = append(d.notify, n.notify...) - d.checks = append(d.checks, n.checks...) + + d.conjuncts = append(d.conjuncts, n.conjuncts...) + d.cyclicConjuncts = append(d.cyclicConjuncts, n.cyclicConjuncts...) d.dynamicFields = append(d.dynamicFields, n.dynamicFields...) d.comprehensions = append(d.comprehensions, n.comprehensions...) + d.selfComprehensions = append(d.selfComprehensions, n.selfComprehensions...) d.lists = append(d.lists, n.lists...) d.vLists = append(d.vLists, n.vLists...) d.exprs = append(d.exprs, n.exprs...) + d.checks = append(d.checks, n.checks...) + d.postChecks = append(d.postChecks, n.postChecks...) + d.usedDefault = append(d.usedDefault, n.usedDefault...) - // No need to clone d.disjunctions + // Do not clone other disjunction-related slices, like disjuncts and buffer: + // disjunction slices are managed by disjunction processing directly. return d } @@ -897,23 +1119,28 @@ func (c *OpContext) newNodeContext(node *Vertex) *nodeContext { c.freeListNode = n.nextFree *n = nodeContext{ - ctx: c, - node: node, - kind: TopKind, - usedArcs: n.usedArcs[:0], - arcMap: n.arcMap[:0], - notify: n.notify[:0], - checks: n.checks[:0], - dynamicFields: n.dynamicFields[:0], - comprehensions: n.comprehensions[:0], - lists: n.lists[:0], - vLists: n.vLists[:0], - exprs: n.exprs[:0], - disjunctions: n.disjunctions[:0], - usedDefault: n.usedDefault[:0], - disjunctErrs: n.disjunctErrs[:0], - disjuncts: n.disjuncts[:0], - buffer: n.buffer[:0], + ctx: c, + node: node, + nodeContextState: nodeContextState{ + kind: TopKind, + }, + arcMap: n.arcMap[:0], + conjuncts: n.conjuncts[:0], + cyclicConjuncts: n.cyclicConjuncts[:0], + notify: n.notify[:0], + checks: n.checks[:0], + postChecks: n.postChecks[:0], + dynamicFields: n.dynamicFields[:0], + comprehensions: n.comprehensions[:0], + selfComprehensions: n.selfComprehensions[:0], + lists: n.lists[:0], + vLists: n.vLists[:0], + exprs: n.exprs[:0], + disjunctions: n.disjunctions[:0], + usedDefault: n.usedDefault[:0], + disjunctErrs: n.disjunctErrs[:0], + disjuncts: n.disjuncts[:0], + buffer: n.buffer[:0], } return n @@ -923,20 +1150,21 @@ func (c *OpContext) newNodeContext(node *Vertex) *nodeContext { return &nodeContext{ ctx: c, node: node, - kind: TopKind, + + nodeContextState: nodeContextState{kind: TopKind}, } } -func (v *Vertex) getNodeContext(c *OpContext) *nodeContext { +func (v *Vertex) getNodeContext(c *OpContext, ref int) *nodeContext { if v.state == nil { - if v.status == Finalized { + if v.status == finalized { return nil } v.state = c.newNodeContext(v) } else if v.state.node != v { panic("getNodeContext: nodeContext out of sync") } - v.state.refCount++ + v.state.refCount += ref return v.state } @@ -951,7 +1179,7 @@ func (v *Vertex) freeNode(n *nodeContext) { panic("freeNode: nodeContext out of sync") } if n.refCount--; n.refCount == 0 { - if v.status == Finalized { + if v.status == finalized { v.freeNodeState() } else { n.ctx.stats.Retained++ @@ -1096,7 +1324,9 @@ func (n *nodeContext) finalDone() bool { return false } } - return len(n.dynamicFields) == 0 && len(n.comprehensions) == 0 + return len(n.dynamicFields) == 0 && + len(n.comprehensions) == 0 && + len(n.selfComprehensions) == 0 } // hasErr is used to determine if an evaluation path, for instance a single @@ -1105,7 +1335,7 @@ func (n *nodeContext) hasErr() bool { if n.node.ChildErrors != nil { return true } - if n.node.Status() > Evaluating && n.node.IsErr() { + if n.node.status > evaluating && n.node.IsErr() { return true } return n.ctx.HasErr() || n.errs != nil @@ -1117,7 +1347,7 @@ func (n *nodeContext) getErr() *Bottom { } // getValidators sets the vertex' Value in case there was no concrete value. -func (n *nodeContext) getValidators() BaseValue { +func (n *nodeContext) getValidators(state vertexStatus) BaseValue { ctx := n.ctx a := []Value{} @@ -1160,10 +1390,12 @@ func (n *nodeContext) getValidators() BaseValue { switch len(a) { case 0: // Src is the combined input. - v = &BasicType{K: n.kind} + if state >= conjuncts || n.kind&^CompositKind == 0 { + v = &BasicType{K: n.kind} + } case 1: - v = a[0].(Value) // remove cast + v = a[0] default: v = &Conjunction{Values: a} @@ -1174,10 +1406,10 @@ func (n *nodeContext) getValidators() BaseValue { // TODO: this function can probably go as this is now handled in the nodeContext. func (n *nodeContext) maybeSetCache() { - if n.node.Status() > Partial { // n.node.BaseValue != nil - return - } - if n.scalar != nil { + // Set BaseValue to scalar, but only if it was not set before. Most notably, + // errors should not be discarded. + _, isErr := n.node.BaseValue.(*Bottom) + if n.scalar != nil && (!isErr || isCyclePlaceholder(n.node.BaseValue)) { n.node.BaseValue = n.scalar } // NOTE: this is now handled by associating the nodeContext @@ -1204,6 +1436,15 @@ type envList struct { n int64 // recorded length after evaluator elipsis *Ellipsis id CloseInfo + ignore bool // has a self-referencing comprehension and is postponed + self bool // was added as a postponed self-referencing comprehension + index int +} + +type envCheck struct { + env *Environment + expr Expr + expectError bool } func (n *nodeContext) addBottom(b *Bottom) { @@ -1222,7 +1463,7 @@ func (n *nodeContext) addErr(err errors.Error) { // addExprConjuncts will attempt to evaluate an Expr and insert the value // into the nodeContext if successful or queue it for later evaluation if it is // incomplete or is not value. -func (n *nodeContext) addExprConjunct(v Conjunct) { +func (n *nodeContext) addExprConjunct(v Conjunct, state vertexStatus) { env := v.Env id := v.CloseInfo @@ -1239,10 +1480,11 @@ func (n *nodeContext) addExprConjunct(v Conjunct) { case *BinaryExpr: if x.Op == AndOp { - n.addExprConjunct(MakeConjunct(env, x.X, id)) - n.addExprConjunct(MakeConjunct(env, x.Y, id)) + n.addExprConjunct(MakeConjunct(env, x.X, id), state) + n.addExprConjunct(MakeConjunct(env, x.Y, id), state) + return } else { - n.evalExpr(v) + n.evalExpr(v, state) } case *StructLit: @@ -1253,49 +1495,42 @@ func (n *nodeContext) addExprConjunct(v Conjunct) { Up: env, Vertex: n.node, } - if env != nil { - childEnv.Cyclic = env.Cyclic - childEnv.Deref = env.Deref - } n.lists = append(n.lists, envList{env: childEnv, list: x, id: id}) case *DisjunctionExpr: n.addDisjunction(env, x, id) + case *Comprehension: + // always a partial comprehension. + n.insertComprehension(env, x, id) + return + default: // Must be Resolver or Evaluator. - n.evalExpr(v) + n.evalExpr(v, state) } + n.ctx.stats.Conjuncts++ } // evalExpr is only called by addExprConjunct. If an error occurs, it records // the error in n and returns nil. -func (n *nodeContext) evalExpr(v Conjunct) { +func (n *nodeContext) evalExpr(v Conjunct, state vertexStatus) { // Require an Environment. ctx := n.ctx closeID := v.CloseInfo - // TODO: see if we can do without these counters. - for _, d := range v.Env.Deref { - d.EvalCount++ - } - for _, d := range v.Env.Cycles { - d.SelfCount++ - } - defer func() { - for _, d := range v.Env.Deref { - d.EvalCount-- - } - for _, d := range v.Env.Cycles { - d.SelfCount++ - } - }() - switch x := v.Expr().(type) { case Resolver: - arc, err := ctx.Resolve(v.Env, x) - if err != nil && !err.IsIncomplete() { + // We elevate a field evaluated to the Conjuncts state to Finalized + // later. For now we allow partial evaluation so that we can break + // cycles and postpone incomplete evaluations until more information is + // available down the line. + if state == finalized { + state = conjuncts + } + arc, err := ctx.resolveState(v, x, state) + if err != nil && (!err.IsIncomplete() || err.Permanent) { n.addBottom(err) break } @@ -1304,13 +1539,36 @@ func (n *nodeContext) evalExpr(v Conjunct) { break } + // We complete the evaluation. Some optimizations will only work when an + // arc is already finalized. So this ensures that such optimizations get + // triggered more often. + // + // NOTE(let finalization): aside from being an optimization, this also + // ensures that let arcs that are not contained as fields of arcs, but + // rather are held in the cash, are finalized. This, in turn, is + // necessary to trigger the notification mechanism, where appropriate. + // + // A node should not Finalize itself as it may erase the state object + // which is still assumed to be present down the line + // (see https://cuelang.org/issues/2171). + if arc.status == conjuncts && arc != n.node && arc.hasAllConjuncts { + arc.Finalize(ctx) + } + + ci, skip := n.markCycle(arc, v.Env, x, v.CloseInfo) + if skip { + return + } + v.CloseInfo = ci + n.addVertexConjuncts(v, arc, false) case Evaluator: // Interpolation, UnaryExpr, BinaryExpr, CallExpr // Could be unify? - val := ctx.evaluateRec(v.Env, v.Expr(), Partial) - if b, ok := val.(*Bottom); ok && b.IsIncomplete() { + val := ctx.evaluateRec(v, partial) + if b, ok := val.(*Bottom); ok && + b.IsIncomplete() { n.exprs = append(n.exprs, envExpr{v, b}) break } @@ -1322,7 +1580,7 @@ func (n *nodeContext) evalExpr(v Conjunct) { if ok && b.IsIncomplete() && len(v.Conjuncts) > 0 { for _, c := range v.Conjuncts { c.CloseInfo = closeID - n.addExprConjunct(c) + n.addExprConjunct(c, state) } break } @@ -1368,7 +1626,11 @@ func (n *nodeContext) addVertexConjuncts(c Conjunct, arc *Vertex, inline bool) { // (pointer can probably be shared). Aside from being more performant, // this is probably the best way to guarantee that conjunctions are // linear in this case. - key := arcKey{arc, closeInfo} + + ckey := closeInfo + ckey.Refs = nil + ckey.Inline = false + key := arcKey{arc, ckey} for _, k := range n.arcMap { if key == k { return @@ -1376,18 +1638,10 @@ func (n *nodeContext) addVertexConjuncts(c Conjunct, arc *Vertex, inline bool) { } n.arcMap = append(n.arcMap, key) - env := c.Env - // Pass detection of structural cycles from parent to children. - cyclic := false - if env != nil { - // If a reference is in a tainted set, so is the value it refers to. - cyclic = env.Cyclic - } - - status := arc.Status() + status := arc.status switch status { - case Evaluating: + case evaluating: // Reference cycle detected. We have reached a fixed point and // adding conjuncts at this point will not change the value. Also, // continuing to pursue this value will result in an infinite loop. @@ -1402,32 +1656,9 @@ func (n *nodeContext) addVertexConjuncts(c Conjunct, arc *Vertex, inline bool) { return } - case EvaluatingArcs: - // Structural cycle detected. Continue evaluation as usual, but - // keep track of whether any other conjuncts without structural - // cycles are added. If not, evaluation of child arcs will end - // with this node. - - // For the purpose of determining whether at least one non-cyclic - // conjuncts exists, we consider all conjuncts of a cyclic conjuncts - // also cyclic. - - cyclic = true - n.hasCycle = true - - // As the EvaluatingArcs mechanism bypasses the self-reference - // mechanism, we need to separately keep track of it here. - // If this (originally) is a self-reference node, adding them - // will result in recursively adding the same reference. For this - // we also mark the node as evaluating. - if arc.SelfCount > 0 { - return - } - - // This count is added for values that are directly added below. - // The count is handled separately for delayed values. - arc.SelfCount++ - defer func() { arc.SelfCount-- }() + case evaluatingArcs: + // There is a structural cycle, but values may be processed nonetheless + // if there is a non-cyclic conjunct. See cycle.go. } // Performance: the following if check filters cases that are not strictly @@ -1448,91 +1679,29 @@ func (n *nodeContext) addVertexConjuncts(c Conjunct, arc *Vertex, inline bool) { // is necessary to prevent lookups in unevaluated structs. // TODO(cycles): this can probably most easily be fixed with a // having a more recursive implementation. - n.ctx.Unify(arc, Partial) + n.ctx.unify(arc, partial) } - for _, c := range arc.Conjuncts { - var a []*Vertex - if env != nil { - a = env.Deref - } - if inline { - c = updateCyclic(c, cyclic, nil, nil) - } else { - c = updateCyclic(c, cyclic, arc, a) - } + // Don't add conjuncts if a node is referring to itself. + if n.node == arc { + return + } + if arc.state != nil { + arc.state.addNotify(n.node) + } + + for _, c := range arc.Conjuncts { // Note that we are resetting the tree here. We hereby assume that // closedness conflicts resulting from unifying the referenced arc were // already caught there and that we can ignore further errors here. c.CloseInfo = closeInfo - n.addExprConjunct(c) + n.addExprConjunct(c, partial) } } -// isDef reports whether an expressions is a reference that references a -// definition anywhere in its selection path. -// -// TODO(performance): this should be merged with resolve(). But for now keeping -// this code isolated makes it easier to see what it is for. -func isDef(x Expr) bool { - switch r := x.(type) { - case *FieldReference: - return r.Label.IsDef() - - case *SelectorExpr: - if r.Sel.IsDef() { - return true - } - return isDef(r.X) - - case *IndexExpr: - return isDef(r.X) - } - return false -} - -// updateCyclicStatus looks for proof of non-cyclic conjuncts to override -// a structural cycle. -func (n *nodeContext) updateCyclicStatus(env *Environment) { - if env == nil || !env.Cyclic { - n.hasNonCycle = true - } -} - -func updateCyclic(c Conjunct, cyclic bool, deref *Vertex, a []*Vertex) Conjunct { - env := c.Env - switch { - case env == nil: - if !cyclic && deref == nil { - return c - } - env = &Environment{Cyclic: cyclic} - case deref == nil && env.Cyclic == cyclic && len(a) == 0: - return c - default: - // The conjunct may still be in use in other fields, so we should - // make a new copy to mark Cyclic only for this case. - e := *env - e.Cyclic = e.Cyclic || cyclic - env = &e - } - if deref != nil || len(a) > 0 { - cp := make([]*Vertex, 0, len(a)+1) - cp = append(cp, a...) - if deref != nil { - cp = append(cp, deref) - } - env.Deref = cp - } - if deref != nil { - env.Cycles = append(env.Cycles, deref) - } - return MakeConjunct(env, c.Elem(), c.CloseInfo) -} - func (n *nodeContext) addValueConjunct(env *Environment, v Value, id CloseInfo) { - n.updateCyclicStatus(env) + n.updateCyclicStatus(id) ctx := n.ctx @@ -1541,13 +1710,10 @@ func (n *nodeContext) addValueConjunct(env *Environment, v Value, id CloseInfo) n.aStruct = x n.aStructID = id if m.NeedClose { - id = id.SpawnRef(x, IsDef(x), x) id.IsClosed = true } } - cyclic := env != nil && env.Cyclic - if !x.IsData() { // TODO: this really shouldn't happen anymore. if isComplexStruct(ctx, x) { @@ -1557,9 +1723,8 @@ func (n *nodeContext) addValueConjunct(env *Environment, v Value, id CloseInfo) } for _, c := range x.Conjuncts { - c = updateCyclic(c, cyclic, nil, nil) c.CloseInfo = id - n.addExprConjunct(c) // TODO: Pass from eval + n.addExprConjunct(c, partial) // TODO: Pass from eval } return } @@ -1590,10 +1755,12 @@ func (n *nodeContext) addValueConjunct(env *Environment, v Value, id CloseInfo) n.node.Structs = append(n.node.Structs, x.Structs...) for _, a := range x.Arcs { + if !a.definitelyExists() { + continue + } // TODO(errors): report error when this is a regular field. c := MakeConjunct(nil, a, id) - c = updateCyclic(c, cyclic, nil, nil) - n.insertField(a.Label, c) + n.insertField(a.Label, a.ArcType, c) s.MarkField(a.Label) } return @@ -1708,6 +1875,9 @@ func (n *nodeContext) addValueConjunct(env *Environment, v Value, id CloseInfo) } n.scalar = x n.scalarID = id + if n.node.status >= conjuncts { + n.node.BaseValue = x + } default: panic(fmt.Sprintf("unknown value type %T", x)) @@ -1745,37 +1915,25 @@ func valueError(v Value) *ValueError { // addStruct collates the declarations of a struct. // // addStruct fulfills two additional pivotal functions: -// 1) Implement vertex unification (this happens through De Bruijn indices -// combined with proper set up of Environments). -// 2) Implied closedness for definitions. -// +// 1. Implement vertex unification (this happens through De Bruijn indices +// combined with proper set up of Environments). +// 2. Implied closedness for definitions. func (n *nodeContext) addStruct( env *Environment, s *StructLit, closeInfo CloseInfo) { - n.updateCyclicStatus(env) // to handle empty structs. + n.updateCyclicStatus(closeInfo) // NOTE: This is a crucial point in the code: - // Unification derferencing happens here. The child nodes are set to + // Unification dereferencing happens here. The child nodes are set to // an Environment linked to the current node. Together with the De Bruijn // indices, this determines to which Vertex a reference resolves. - // TODO(perf): consider using environment cache: - // var childEnv *Environment - // for _, s := range n.nodeCache.sub { - // if s.Up == env { - // childEnv = s - // } - // } childEnv := &Environment{ Up: env, Vertex: n.node, } - if env != nil { - childEnv.Cyclic = env.Cyclic - childEnv.Deref = env.Deref - } s.Init() @@ -1785,12 +1943,23 @@ func (n *nodeContext) addStruct( parent := n.node.AddStruct(s, childEnv, closeInfo) closeInfo.IsClosed = false + parent.Disable = true // disable until processing is done. for _, d := range s.Decls { switch x := d.(type) { case *Field: - // handle in next iteration. + if x.Label.IsString() && x.ArcType == ArcMember { + n.aStruct = s + n.aStructID = closeInfo + } + n.insertField(x.Label, x.ArcType, MakeConjunct(childEnv, x, closeInfo)) + + case *LetField: + arc := n.insertField(x.Label, ArcMember, MakeConjunct(childEnv, x, closeInfo)) + if x.IsMulti { + arc.MultiLet = x.IsMulti + } case *DynamicField: n.aStruct = s @@ -1807,11 +1976,11 @@ func (n *nodeContext) addStruct( // a fieldSet. Otherwise the entry will just be removed next. id := closeInfo.SpawnEmbed(x) - // push and opo embedding type. - n.addExprConjunct(MakeConjunct(childEnv, x, id)) + c := MakeConjunct(childEnv, x, id) + n.addExprConjunct(c, partial) - case *OptionalField, *BulkOptionalField, *Ellipsis: - // Nothing to do here. Note that the precense of these fields do not + case *BulkOptionalField, *Ellipsis: + // Nothing to do here. Note that the presence of these fields do not // excluded embedded scalars: only when they match actual fields // does it exclude those. @@ -1827,16 +1996,6 @@ func (n *nodeContext) addStruct( parent.Disable = false - for _, d := range s.Decls { - switch x := d.(type) { - case *Field: - if x.Label.IsString() { - n.aStruct = s - n.aStructID = closeInfo - } - n.insertField(x.Label, MakeConjunct(childEnv, x, closeInfo)) - } - } } // TODO(perf): if an arc is the only arc with that label added to a Vertex, and @@ -1850,34 +2009,24 @@ func (n *nodeContext) addStruct( // route) is to not recursively evaluate those arcs, even for Finalize. This is // possible as it is not necessary to evaluate optional arcs to evaluate // disjunctions. -func (n *nodeContext) insertField(f Feature, x Conjunct) *Vertex { +func (n *nodeContext) insertField(f Feature, mode ArcType, x Conjunct) *Vertex { ctx := n.ctx - arc, _ := n.node.GetArc(ctx, f) - - arc.addConjunct(x) + arc, isNew := n.node.GetArc(ctx, f, mode) + if f.IsLet() && !isNew { + arc.MultiLet = true + return arc + } + if arc.hasConjunct(x) { + return arc + } switch { case arc.state != nil: - s := arc.state - switch { - case arc.Status() <= AllArcs: - // This may happen when a struct has multiple comprehensions, where - // the insertion of one of which depends on the outcome of another. - - // TODO: to something more principled by allowing values to - // monotonically increase. - arc.status = Partial - arc.BaseValue = nil - s.disjuncts = s.disjuncts[:0] - s.disjunctErrs = s.disjunctErrs[:0] - - fallthrough + arc.state.addConjunctDynamic(x) - default: - arc.state.addExprConjunct(x) - } + case arc.IsUnprocessed() || arc.status != finalized: + arc.addConjunctUnchecked(x) - case arc.Status() == 0: default: n.addBottom(&Bottom{ Code: IncompleteError, @@ -1889,6 +2038,17 @@ func (n *nodeContext) insertField(f Feature, x Conjunct) *Vertex { return arc } +func (n *nodeContext) insertFieldUnchecked(f Feature, mode ArcType, x Conjunct) *Vertex { + ctx := n.ctx + arc, isNew := n.node.GetArc(ctx, f, mode) + if f.IsLet() && !isNew { + arc.MultiLet = true + return arc + } + arc.addConjunctUnchecked(x) + return arc +} + // expandOne adds dynamic fields to a node until a fixed point is reached. // On each iteration, dynamic fields that cannot resolve due to incomplete // values are skipped. They will be retried on the next iteration until no @@ -1902,7 +2062,7 @@ func (n *nodeContext) insertField(f Feature, x Conjunct) *Vertex { // This seems to be too complicated and lead to iffy edge cases. // TODO(errors): detect when a field is added to a struct that is already used // in a for clause. -func (n *nodeContext) expandOne() (done bool) { +func (n *nodeContext) expandOne(state vertexStatus) (done bool) { // Don't expand incomplete expressions if we detected a cycle. if n.done() || (n.hasCycle && !n.hasNonCycle) { return false @@ -1914,7 +2074,7 @@ func (n *nodeContext) expandOne() (done bool) { return true } - if progress = n.injectComprehensions(&(n.comprehensions)); progress { + if progress = n.injectComprehensions(state); progress { return true } @@ -1925,16 +2085,16 @@ func (n *nodeContext) expandOne() (done bool) { exprs := n.exprs n.exprs = n.exprs[:0] for _, x := range exprs { - n.addExprConjunct(x.c) + n.addExprConjunct(x.c, state) - // collect and and or + // collect and or } if len(n.exprs) < len(exprs) { return true } // No progress, report error later if needed: unification with - // disjuncts may resolve this later later on. + // disjuncts may resolve this later on. return false } @@ -1946,8 +2106,13 @@ func (n *nodeContext) injectDynamic() (progress bool) { a := n.dynamicFields for _, d := range n.dynamicFields { var f Feature - v, complete := ctx.Evaluate(d.env, d.field.Key) - if !complete { + x := d.field.Key + // Push state to capture and remove errors. + s := ctx.PushState(d.env, x.Source()) + v := ctx.evalState(x, finalized) + b := ctx.PopState(s) + + if b != nil && b.IsIncomplete() { d.err, _ = v.(*Bottom) a[k] = d k++ @@ -1961,7 +2126,7 @@ func (n *nodeContext) injectDynamic() (progress bool) { if f.IsInt() { n.addErr(ctx.NewPosf(pos(d.field.Key), "integer fields not supported")) } - n.insertField(f, MakeConjunct(d.env, d.field, d.id)) + n.insertField(f, d.field.ArcType, MakeConjunct(d.env, d.field, d.id)) } progress = k < len(n.dynamicFields) @@ -1971,7 +2136,8 @@ func (n *nodeContext) injectDynamic() (progress bool) { return progress } -// addLists +// addLists evaluates the queued list conjuncts and inserts its arcs into the +// Vertex. // // TODO: association arrays: // If an association array marker was present in a struct, create a struct node @@ -1979,16 +2145,19 @@ func (n *nodeContext) injectDynamic() (progress bool) { // or struct fields and not both. // // addLists should be run after the fixpoint expansion: -// - it enforces that comprehensions may not refer to the list itself -// - there may be no other fields within the list. +// - it enforces that comprehensions may not refer to the list itself +// - there may be no other fields within the list. // // TODO(embeddedScalars): for embedded scalars, there should be another pass // of evaluation expressions after expanding lists. -func (n *nodeContext) addLists() (oneOfTheLists Expr, anID CloseInfo) { +func (n *nodeContext) addLists(state vertexStatus) (progress bool) { if len(n.lists) == 0 && len(n.vLists) == 0 { - return nil, CloseInfo{} + return false } + var oneOfTheLists Expr + var anID CloseInfo + isOpen := true max := 0 var maxNode Expr @@ -2001,6 +2170,8 @@ func (n *nodeContext) addLists() (oneOfTheLists Expr, anID CloseInfo) { c := n.ctx for _, l := range n.vLists { + // XXX: set hasNonCycle if appropriate. + oneOfTheLists = l elems := l.Elems() @@ -2029,35 +2200,50 @@ func (n *nodeContext) addLists() (oneOfTheLists Expr, anID CloseInfo) { for _, a := range elems { if a.Conjuncts == nil { - x := a.BaseValue.(Value) - n.insertField(a.Label, MakeConjunct(nil, x, CloseInfo{})) + n.insertField(a.Label, ArcMember, MakeRootConjunct(nil, a)) continue } for _, c := range a.Conjuncts { - n.insertField(a.Label, c) + n.insertField(a.Label, ArcMember, c) } } } outer: - for i, l := range n.lists { - n.updateCyclicStatus(l.env.Up) + // updateCyclicStatus may grow the list of values, so we cannot use range. + for i := 0; i < len(n.lists); i++ { + l := n.lists[i] + + n.updateCyclicStatus(l.id) + + if l.self { + n.node.LockArcs = true + } index := int64(0) hasComprehension := false for j, elem := range l.list.Elems { switch x := elem.(type) { case *Comprehension: - err := c.Yield(l.env, x, func(e *Environment) { + err := c.yield(nil, l.env, x, state, func(e *Environment) { label, err := MakeLabel(x.Source(), index, IntLabel) n.addErr(err) index++ c := MakeConjunct(e, x.Value, l.id) - n.insertField(label, c) + n.insertField(label, ArcMember, c) }) hasComprehension = true if err != nil { - n.addBottom(err) + if err.ForCycle && !l.self { + // The list has a comprehension that refers to the list + // itself. This means we should postpone evalauting this + // list until all other lists have been evaluated. + n.lists[i].ignore = true + l.self = true + n.lists = append(n.lists, l) + } else { + n.addBottom(err) + } continue outer } @@ -2072,7 +2258,7 @@ outer: label, err := MakeLabel(x.Source(), index, IntLabel) n.addErr(err) index++ // TODO: don't use insertField. - n.insertField(label, MakeConjunct(l.env, x, l.id)) + n.insertField(label, ArcMember, MakeConjunct(l.env, x, l.id)) } // Terminate early in case of runaway comprehension. @@ -2121,7 +2307,7 @@ outer: } for _, l := range n.lists { - if l.elipsis == nil { + if l.elipsis == nil || l.ignore { continue } @@ -2141,7 +2327,7 @@ outer: sources := []ast.Expr{} // Add conjuncts for additional items. for _, l := range n.lists { - if l.elipsis == nil { + if l.elipsis == nil || l.ignore { continue } if src, _ := l.elipsis.Source().(ast.Expr); src != nil { @@ -2150,7 +2336,7 @@ outer: } if m, ok := n.node.BaseValue.(*ListMarker); !ok { - n.node.SetValue(c, Partial, &ListMarker{ + n.node.setValue(c, partial, &ListMarker{ Src: ast.NewBinExpr(token.AND, sources...), IsOpen: isOpen, }) @@ -2165,7 +2351,9 @@ outer: n.lists = n.lists[:0] n.vLists = n.vLists[:0] - return oneOfTheLists, anID + n.updateNodeType(ListKind, oneOfTheLists, anID) + + return true } func (n *nodeContext) invalidListLength(na, nb int, a, b Expr) { diff --git a/vendor/cuelang.org/go/internal/core/adt/expr.go b/vendor/cuelang.org/go/internal/core/adt/expr.go index 31aeda23..6463c032 100644 --- a/vendor/cuelang.org/go/internal/core/adt/expr.go +++ b/vendor/cuelang.org/go/internal/core/adt/expr.go @@ -20,7 +20,7 @@ import ( "io" "regexp" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/cue/ast" "cuelang.org/go/cue/errors" @@ -62,27 +62,23 @@ func (o *StructLit) IsFile() bool { } type FieldInfo struct { - Label Feature - Optional []Node + Label Feature } func (x *StructLit) HasOptional() bool { - return x.types&(HasField|HasPattern|HasAdditional) != 0 + return x.types&(HasPattern|HasAdditional) != 0 } func (x *StructLit) Source() ast.Node { return x.Src } -func (x *StructLit) evaluate(c *OpContext) Value { +func (x *StructLit) evaluate(c *OpContext, state vertexStatus) Value { e := c.Env(0) - v := &Vertex{ - Parent: e.Vertex, - Conjuncts: []Conjunct{{e, x, CloseInfo{}}}, - } + v := c.newInlineVertex(e.Vertex, nil, Conjunct{e, x, c.ci}) // evaluate may not finalize a field, as the resulting value may be // used in a context where more conjuncts are added. It may also lead // to disjuncts being in a partially expanded state, leading to // misaligned nodeContexts. - c.Unify(v, AllArcs) + v.CompleteArcs(c) return v } @@ -102,15 +98,15 @@ func (o *StructLit) Init() { if o.fieldIndex(x.Label) < 0 { o.Fields = append(o.Fields, FieldInfo{Label: x.Label}) } + if x.ArcType > ArcMember { + o.types |= HasField + } - case *OptionalField: - p := o.fieldIndex(x.Label) - if p < 0 { - p = len(o.Fields) - o.Fields = append(o.Fields, FieldInfo{Label: x.Label}) + case *LetField: + if o.fieldIndex(x.Label) >= 0 { + panic("duplicate let identifier") } - o.Fields[p].Optional = append(o.Fields[p].Optional, x) - o.types |= HasField + o.Fields = append(o.Fields, FieldInfo{Label: x.Label}) case *DynamicField: o.Dynamic = append(o.Dynamic, x) @@ -165,36 +161,27 @@ func (o *StructLit) OptionalTypes() OptionalType { return o.types } -func (o *StructLit) IsOptional(label Feature) bool { - for _, f := range o.Fields { - if f.Label == label && len(f.Optional) > 0 { - return true - } - } - return false -} - // FIELDS // // Fields can also be used as expressions whereby the value field is the // expression this allows retaining more context. -// Field represents a field with a fixed label. It can be a regular field, -// definition or hidden field. +// Field represents a regular field or field constraint with a fixed label. +// The label can be a regular field, definition or hidden field. // -// foo: bar -// #foo: bar -// _foo: bar +// foo: bar +// #foo: bar +// _foo: bar // // Legacy: // -// Foo :: bar -// +// Foo :: bar type Field struct { Src *ast.Field - Label Feature - Value Expr + ArcType ArcType + Label Feature + Value Expr } func (x *Field) Source() ast.Node { @@ -204,17 +191,20 @@ func (x *Field) Source() ast.Node { return x.Src } -// An OptionalField represents an optional regular field. -// -// foo?: expr +// A LetField represents a field that is only visible in the local scope. // -type OptionalField struct { - Src *ast.Field +// let X = expr +type LetField struct { + Src *ast.LetClause Label Feature - Value Expr + // IsMulti is true when this let field should be replicated for each + // incarnation. This is the case when its expression refers to the + // variables of a for comprehension embedded within a struct. + IsMulti bool + Value Expr } -func (x *OptionalField) Source() ast.Node { +func (x *LetField) Source() ast.Node { if x.Src == nil { return nil } @@ -223,10 +213,9 @@ func (x *OptionalField) Source() ast.Node { // A BulkOptionalField represents a set of optional field. // -// [expr]: expr -// +// [expr]: expr type BulkOptionalField struct { - Src *ast.Field // Elipsis or Field + Src *ast.Field // Ellipsis or Field Filter Expr Value Expr Label Feature // for reference and formatting @@ -241,8 +230,7 @@ func (x *BulkOptionalField) Source() ast.Node { // A Ellipsis represents a set of optional fields of a given type. // -// ...T -// +// ...T type Ellipsis struct { Src *ast.Ellipsis Value Expr @@ -257,17 +245,14 @@ func (x *Ellipsis) Source() ast.Node { // A DynamicField represents a regular field for which the key is computed. // -// "\(expr)": expr -// (expr): expr -// +// "\(expr)": expr +// (expr): expr type DynamicField struct { - Src *ast.Field - Key Expr - Value Expr -} + Src *ast.Field -func (x *DynamicField) IsOptional() bool { - return x.Src.Optional != token.NoPos + ArcType ArcType + Key Expr + Value Expr } func (x *DynamicField) Source() ast.Node { @@ -279,8 +264,7 @@ func (x *DynamicField) Source() ast.Node { // A ListLit represents an unevaluated list literal. // -// [a, for x in src { ... }, b, ...T] -// +// [a, for x in src { ... }, b, ...T] type ListLit struct { Src *ast.ListLit @@ -297,14 +281,10 @@ func (x *ListLit) Source() ast.Node { return x.Src } -func (x *ListLit) evaluate(c *OpContext) Value { +func (x *ListLit) evaluate(c *OpContext, state vertexStatus) Value { e := c.Env(0) - v := &Vertex{ - Parent: e.Vertex, - Conjuncts: []Conjunct{{e, x, CloseInfo{}}}, - } - // TODO: should be AllArcs and then use Finalize for builtins? - c.Unify(v, Finalized) // TODO: also partial okay? + v := c.newInlineVertex(e.Vertex, nil, Conjunct{e, x, c.ci}) + v.CompleteArcs(c) return v } @@ -419,11 +399,10 @@ func (x *Top) Kind() Kind { return TopKind } // BasicType represents all values of a certain Kind. It can be used as a Value // and Expr. // -// string -// int -// num -// bool -// +// string +// int +// num +// bool type BasicType struct { Src ast.Node K Kind @@ -452,9 +431,8 @@ func (x *BasicType) Kind() Kind { return x.K } // BoundExpr represents an unresolved unary comparator. // -// uint64(len(v.Arcs)) { return c.NewErrf("index %d out of range", hi) } @@ -1015,7 +1080,7 @@ func (x *SliceExpr) evaluate(c *OpContext) Value { arc.Label = label n.Arcs = append(n.Arcs, &arc) } - n.status = Finalized + n.status = finalized return n case *Bytes: @@ -1024,10 +1089,10 @@ func (x *SliceExpr) evaluate(c *OpContext) Value { hi = uint64(len(v.B)) ) if x.Lo != nil { - lo = c.uint64(c.value(x.Lo), as) + lo = c.uint64(c.value(x.Lo, partial), as) } if x.Hi != nil { - hi = c.uint64(c.value(x.Hi), as) + hi = c.uint64(c.value(x.Hi, partial), as) if hi > uint64(len(v.B)) { return c.NewErrf("index %d out of range", hi) } @@ -1046,8 +1111,7 @@ func (x *SliceExpr) evaluate(c *OpContext) Value { // An Interpolation is a string interpolation. // -// "a \(b) c" -// +// "a \(b) c" type Interpolation struct { Src *ast.Interpolation K Kind // string or bytes @@ -1061,10 +1125,10 @@ func (x *Interpolation) Source() ast.Node { return x.Src } -func (x *Interpolation) evaluate(c *OpContext) Value { +func (x *Interpolation) evaluate(c *OpContext, state vertexStatus) Value { buf := bytes.Buffer{} for _, e := range x.Parts { - v := c.value(e) + v := c.value(e, partial) if x.K == BytesKind { buf.Write(c.ToBytes(v)) } else { @@ -1088,9 +1152,8 @@ func (x *Interpolation) evaluate(c *OpContext) Value { // UnaryExpr is a unary expression. // -// Op X -// -X !X +X -// +// Op X +// -X !X +X type UnaryExpr struct { Src *ast.UnaryExpr Op Op @@ -1104,11 +1167,11 @@ func (x *UnaryExpr) Source() ast.Node { return x.Src } -func (x *UnaryExpr) evaluate(c *OpContext) Value { +func (x *UnaryExpr) evaluate(c *OpContext, state vertexStatus) Value { if !c.concreteIsPossible(x.Op, x.X) { return nil } - v := c.value(x.X) + v := c.value(x.X, partial) if isError(v) { return v } @@ -1144,14 +1207,13 @@ func (x *UnaryExpr) evaluate(c *OpContext) Value { "operand %s of '%s' not concrete (was %s)", x.X, op, k) return nil } - return c.NewErrf("invalid operation %s (%s %s)", x, op, k) + return c.NewErrf("invalid operation %v (%s %s)", x, op, k) } // BinaryExpr is a binary expression. // -// X + Y -// X & Y -// +// X + Y +// X & Y type BinaryExpr struct { Src *ast.BinaryExpr Op Op @@ -1166,12 +1228,24 @@ func (x *BinaryExpr) Source() ast.Node { return x.Src } -func (x *BinaryExpr) evaluate(c *OpContext) Value { +func (x *BinaryExpr) evaluate(c *OpContext, state vertexStatus) Value { env := c.Env(0) if x.Op == AndOp { - // Anonymous Arc - v := &Vertex{Conjuncts: []Conjunct{{env, x, CloseInfo{}}}} - c.Unify(v, Finalized) + v := c.newInlineVertex(nil, nil, makeAnonymousConjunct(env, x, c.ci.Refs)) + + // Do not fully evaluate the Vertex: if it is embedded within a + // struct with arcs that are referenced from within this expression, + // it will end up adding "locked" fields, resulting in an error. + // It will be the responsibility of the "caller" to get the result + // to the required state. If the struct is already dynamic, we will + // evaluate the struct regardless to ensure that cycle reporting + // keeps working. + if env.Vertex.IsDynamic || c.inValidator > 0 { + v.Finalize(c) + } else { + v.CompleteArcs(c) + } + return v } @@ -1185,15 +1259,15 @@ func (x *BinaryExpr) evaluate(c *OpContext) Value { // Bottom here and require that one of the values be a Bottom literal. if x.Op == EqualOp || x.Op == NotEqualOp { if isLiteralBottom(x.X) { - return c.validate(env, x.Src, x.Y, x.Op) + return c.validate(env, x.Src, x.Y, x.Op, state) } if isLiteralBottom(x.Y) { - return c.validate(env, x.Src, x.X, x.Op) + return c.validate(env, x.Src, x.X, x.Op, state) } } - left, _ := c.Concrete(env, x.X, x.Op) - right, _ := c.Concrete(env, x.Y, x.Op) + left, _ := c.concrete(env, x.X, x.Op) + right, _ := c.concrete(env, x.Y, x.Op) if err := CombineErrors(x.Src, left, right); err != nil { return err @@ -1206,32 +1280,48 @@ func (x *BinaryExpr) evaluate(c *OpContext) Value { return BinOp(c, x.Op, left, right) } -func (c *OpContext) validate(env *Environment, src ast.Node, x Expr, op Op) (r Value) { +func (c *OpContext) validate(env *Environment, src ast.Node, x Expr, op Op, state vertexStatus) (r Value) { s := c.PushState(env, src) - if c.nonMonotonicLookupNest == 0 { - c.nonMonotonicGeneration++ + + match := op != EqualOp // non-error case + + // Like value(), but retain the original, unwrapped result. + c.inValidator++ + v := c.evalState(x, state) + c.inValidator-- + u, _ := c.getDefault(v) + u = Unwrap(u) + + // If our final (unwrapped) value is potentially a recursive structure, we + // still need to recursively check for errors. We do so by treating it + // as the original value, which if it is a Vertex will be evaluated + // recursively below. + if u != nil && u.Kind().IsAnyOf(StructKind|ListKind) { + u = v } - var match bool - // NOTE: using Unwrap is maybe note entirely accurate, as it may discard - // a future error. However, if it does so, the error will at least be - // reported elsewhere. - switch b := c.value(x).(type) { + switch v := u.(type) { case nil: case *Bottom: - if b.Code == CycleError { + switch v.Code { + case CycleError: c.PopState(s) - c.AddBottom(b) + c.AddBottom(v) + // TODO: add this. This erases some + // c.verifyNonMonotonicResult(env, x, true) return nil + + case IncompleteError: + c.evalState(x, finalized) + + // We have a nonmonotonic use of a failure. Referenced fields should + // not be added anymore. + c.verifyNonMonotonicResult(env, x, true) } + match = op == EqualOp - // We have a nonmonotonic use of a failure. Referenced fields should - // not be added anymore. - c.nonMonotonicRejectNest++ - c.evalState(x, Partial) - c.nonMonotonicRejectNest-- - default: + case *Vertex: // TODO(cycle): if EqualOp: // - ensure to pass special status to if clause or keep a track of "hot" // paths. @@ -1239,30 +1329,88 @@ func (c *OpContext) validate(env *Environment, src ast.Node, x Expr, op Op) (r V // - walk over all fields and verify that fields are not contradicting // previously marked fields. // + v.Finalize(c) + + if v.status == evaluatingArcs { + // We have a cycle, which may be an error. Cycle errors may occur + // in chains that are themselves not a cycle. It suffices to check + // for non-monotonic results at the end for this particular path. + // TODO(perf): finding the right path through such comprehensions + // may be expensive. Finding a path in a directed graph is O(n), + // though, so we should ensure that the implementation conforms to + // this. + c.verifyNonMonotonicResult(env, x, true) + match = op == EqualOp + break + } + switch { - case b.Concreteness() > Concrete: + case !v.IsDefined(c): + c.verifyNonMonotonicResult(env, x, true) // TODO: remove? + // TODO: mimic comparison to bottom semantics. If it is a valid // value, check for concreteness that this level only. This // should ultimately be replaced with an exists and valid // builtin. match = op == EqualOp - default: - match = op != EqualOp + + case isFinalError(v): + // Need to recursively check for errors, so we need to evaluate the + // Vertex in case it hadn't been evaluated yet. + match = op == EqualOp } - c.nonMonotonicLookupNest++ - c.evalState(x, Partial) - c.nonMonotonicLookupNest-- + + default: + if v.Kind().IsAnyOf(CompositKind) && v.Concreteness() > Concrete && state < conjuncts { + c.PopState(s) + c.AddBottom(cycle) + return nil + } + + c.verifyNonMonotonicResult(env, x, false) + + if v.Concreteness() > Concrete { + // TODO: mimic comparison to bottom semantics. If it is a valid + // value, check for concreteness that this level only. This + // should ultimately be replaced with an exists and valid + // builtin. + match = op == EqualOp + } + + c.evalState(x, partial) } c.PopState(s) return &Bool{src, match} } +func isFinalError(n *Vertex) bool { + n = n.Indirect() + if b, ok := Unwrap(n).(*Bottom); ok && b.Code < IncompleteError { + return true + } + return false +} + +// verifyNonMonotonicResult re-evaluates the given expression at a later point +// to ensure that the result has not changed. This is relevant when a function +// uses reflection, as in `if a != _|_`, where the result of an evaluation may +// change after the fact. +// expectError indicates whether the value should evaluate to an error or not. +func (c *OpContext) verifyNonMonotonicResult(env *Environment, x Expr, expectError bool) { + if n := env.Vertex.getNodeContext(c, 0); n != nil { + n.postChecks = append(n.postChecks, envCheck{ + env: env, + expr: x, + expectError: expectError, + }) + } +} + // A CallExpr represents a call to a builtin. // -// len(x) -// strings.ToLower(x) -// +// len(x) +// strings.ToLower(x) type CallExpr struct { Src *ast.CallExpr Fun Expr @@ -1276,8 +1424,8 @@ func (x *CallExpr) Source() ast.Node { return x.Src } -func (x *CallExpr) evaluate(c *OpContext) Value { - fun := c.value(x.Fun) +func (x *CallExpr) evaluate(c *OpContext, state vertexStatus) Value { + fun := c.value(x.Fun, partial) var b *Builtin switch f := fun.(type) { case *Builtin: @@ -1305,23 +1453,27 @@ func (x *CallExpr) evaluate(c *OpContext) Value { } args := []Value{} for i, a := range x.Args { - expr := c.value(a) + saved := c.errs + c.errs = nil + expr := c.value(a, state) + switch v := expr.(type) { case nil: - // There SHOULD be an error in the context. If not, we generate - // one. - c.Assertf(pos(x.Fun), c.HasErr(), - "argument %d to function %s is incomplete", i, x.Fun) + if c.errs == nil { + // There SHOULD be an error in the context. If not, we generate + // one. + c.Assertf(pos(x.Fun), c.HasErr(), + "argument %d to function %s is incomplete", i, x.Fun) + } case *Bottom: // TODO(errors): consider adding an argument index for this errors. - // On the other hand, this error is really not related to the - // argument itself, so maybe it is good as it is. - c.AddBottom(v) + c.errs = CombineErrors(a.Source(), c.errs, v) default: args = append(args, expr) } + c.errs = CombineErrors(a.Source(), saved, c.errs) } if c.HasErr() { return nil @@ -1329,11 +1481,11 @@ func (x *CallExpr) evaluate(c *OpContext) Value { if b.IsValidator(len(args)) { return &BuiltinValidator{x, b, args} } - result := b.call(c, pos(x), args) + result := b.call(c, pos(x), false, args) if result == nil { return nil } - return c.evalState(result, Partial) + return c.evalState(result, partial) } // A Builtin is a value representing a native function call. @@ -1399,11 +1551,11 @@ func bottom(v Value) *Bottom { return b } -func (x *Builtin) call(c *OpContext, p token.Pos, args []Value) Expr { +func (x *Builtin) call(c *OpContext, p token.Pos, validate bool, args []Value) Expr { fun := x // right now always x. if len(args) > len(x.Params) { c.addErrf(0, p, - "too many arguments in call to %s (have %d, want %d)", + "too many arguments in call to %v (have %d, want %d)", fun, len(args), len(x.Params)) return nil } @@ -1411,7 +1563,7 @@ func (x *Builtin) call(c *OpContext, p token.Pos, args []Value) Expr { v := x.Params[i].Default() if v == nil { c.addErrf(0, p, - "not enough arguments in call to %s (have %d, want %d)", + "not enough arguments in call to %v (have %d, want %d)", fun, len(args), len(x.Params)) return nil } @@ -1431,7 +1583,7 @@ func (x *Builtin) call(c *OpContext, p token.Pos, args []Value) Expr { code = b.Code } c.addErrf(code, pos(a), - "cannot use %s (type %s) as %s in argument %d to %s", + "cannot use %s (type %s) as %s in argument %d to %v", a, k, x.Params[i].Kind(), i+1, fun) return nil } @@ -1439,18 +1591,23 @@ func (x *Builtin) call(c *OpContext, p token.Pos, args []Value) Expr { if _, ok := v.(*BasicType); !ok { env := c.Env(0) x := &BinaryExpr{Op: AndOp, X: v, Y: a} - n := &Vertex{Conjuncts: []Conjunct{{env, x, CloseInfo{}}}} - c.Unify(n, Finalized) + n := c.newInlineVertex(nil, nil, Conjunct{env, x, c.ci}) + n.Finalize(c) if _, ok := n.BaseValue.(*Bottom); ok { c.addErrf(0, pos(a), - "cannot use %s as %s in argument %d to %s", + "cannot use %s as %s in argument %d to %v", a, v, i+1, fun) return nil } args[i] = n } } - return x.Func(c, args) + saved := c.IsValidator + c.IsValidator = validate + ret := x.Func(c, args) + c.IsValidator = saved + + return ret } func (x *Builtin) Source() ast.Node { return nil } @@ -1458,8 +1615,7 @@ func (x *Builtin) Source() ast.Node { return nil } // A BuiltinValidator is a Value that results from evaluation a partial call // to a builtin (using CallExpr). // -// strings.MinRunes(4) -// +// strings.MinRunes(4) type BuiltinValidator struct { Src *CallExpr Builtin *Builtin @@ -1496,7 +1652,7 @@ func validateWithBuiltin(c *OpContext, src token.Pos, b *Builtin, args []Value) var severeness ErrorCode var err errors.Error - res := b.call(c, src, args) + res := b.call(c, src, true, args) switch v := res.(type) { case nil: return nil @@ -1531,6 +1687,12 @@ func validateWithBuiltin(c *OpContext, src token.Pos, b *Builtin, args []Value) buf.WriteString(")") } + // If the validator returns an error and we already had an error, just + // return the original error. + if b, ok := Unwrap(args[0]).(*Bottom); ok { + return b + } + vErr := c.NewPosf(src, "invalid value %s (does not satisfy %s)", args[0], buf.String()) for _, v := range args { @@ -1562,10 +1724,10 @@ func (x *DisjunctionExpr) Source() ast.Node { return x.Src } -func (x *DisjunctionExpr) evaluate(c *OpContext) Value { +func (x *DisjunctionExpr) evaluate(c *OpContext, state vertexStatus) Value { e := c.Env(0) - v := &Vertex{Conjuncts: []Conjunct{{e, x, CloseInfo{}}}} - c.Unify(v, Finalized) // TODO: also partial okay? + v := c.newInlineVertex(nil, nil, Conjunct{e, x, c.ci}) + v.Finalize(c) // TODO: also partial okay? // TODO: if the disjunction result originated from a literal value, we may // consider the result closed to create more permanent errors. return v @@ -1593,8 +1755,8 @@ type Disjunction struct { Src ast.Expr // Values are the non-error disjuncts of this expression. The first - // NumDefault values are default values. - Values []*Vertex + // NumDefaults values are default values. + Values []Value Errors *Bottom // []bottom @@ -1613,28 +1775,68 @@ func (x *Disjunction) Kind() Kind { } type Comprehension struct { - Clauses Yielder - Value Expr + Syntax ast.Node + + // Clauses is the list of for, if, and other clauses of a comprehension, + // not including the yielded value (in curly braces). + Clauses []Yielder + + // Value can be either a StructLit if this is a compiled expression or + // a Field if this is a computed Comprehension. Value holds a Field, + // rather than an Expr, in the latter case to preserve as much position + // information as possible. + Value Node + + // The type of field as which the comprehension is added. + arcType ArcType + + // Only used for partial comprehensions. + comp *envComprehension + parent *Comprehension // comprehension from which this one was derived, if any + arc *Vertex // arc to which this comprehension was added. +} + +// Nest returns the nesting level of void arcs of this comprehension. +func (c *Comprehension) Nest() int { + count := 0 + for ; c.parent != nil; c = c.parent { + count++ + } + return count +} + +// Envs returns all Environments yielded from an evaluated comprehension. +// Together with the Comprehension value, each Environment represents a +// result value of the comprehension. +func (c *Comprehension) Envs() []*Environment { + if c.comp == nil { + return nil + } + return c.comp.envs +} + +// DidResolve reports whether a comprehension was processed and resulted in at +// least one yielded value. +func (x *Comprehension) DidResolve() bool { + return x.comp.done && len(x.comp.envs) > 0 } func (x *Comprehension) Source() ast.Node { - if x.Clauses == nil { + if x.Syntax == nil { return nil } - return x.Clauses.Source() + return x.Syntax } // A ForClause represents a for clause of a comprehension. It can be used // as a struct or list element. // -// for k, v in src {} -// +// for k, v in src {} type ForClause struct { Syntax *ast.ForClause Key Feature Value Feature Src Expr - Dst Yielder } func (x *ForClause) Source() ast.Node { @@ -1644,41 +1846,76 @@ func (x *ForClause) Source() ast.Node { return x.Syntax } -func (x *ForClause) yield(c *OpContext, f YieldFunc) { - n := c.node(x, x.Src, true, Finalized) +func (x *ForClause) yield(s *compState) { + c := s.ctx + n := c.node(x, x.Src, true, conjuncts) + if n.status == evaluating && !n.LockArcs { + c.AddBottom(&Bottom{ + Code: CycleError, + ForCycle: true, + Value: n, + Err: errors.Newf(pos(x.Src), "comprehension source references itself"), + }) + return + } + if c.HasErr() { + return + } + n.LockArcs = true for _, a := range n.Arcs { if !a.Label.IsRegular() { continue } + if !a.isDefined() { + a.Finalize(c) + switch a.ArcType { + case ArcMember: + case ArcRequired: + c.AddBottom(newRequiredFieldInComprehensionError(c, x, a)) + continue + default: + continue + } + } + + if !a.definitelyExists() { + continue + } - c.Unify(a, Partial) + n := &Vertex{ + Parent: c.Env(0).Vertex, - n := &Vertex{status: Finalized} + // Using Finalized here ensures that no nodeContext is allocated, + // preventing a leak, as this "helper" struct bypasses normal + // processing, eluding the deallocation step. + status: finalized, + IsDynamic: true, + ArcType: ArcMember, + } if x.Value != InvalidLabel { b := &Vertex{ Label: x.Value, BaseValue: a, + IsDynamic: true, + ArcType: ArcPending, } n.Arcs = append(n.Arcs, b) } if x.Key != InvalidLabel { - v := &Vertex{Label: x.Key} + v := &Vertex{ + Label: x.Key, + IsDynamic: true, + } key := a.Label.ToValue(c) v.AddConjunct(MakeRootConjunct(c.Env(0), key)) - v.SetValue(c, Finalized, key) + v.SetValue(c, key) n.Arcs = append(n.Arcs, v) } sub := c.spawn(n) - saved := c.PushState(sub, x.Dst.Source()) - x.Dst.yield(c, f) - if b := c.PopState(saved); b != nil { - c.AddBottom(b) - break - } - if c.HasErr() { + if !s.yield(sub) { break } } @@ -1687,12 +1924,10 @@ func (x *ForClause) yield(c *OpContext, f YieldFunc) { // An IfClause represents an if clause of a comprehension. It can be used // as a struct or list element. // -// if cond {} -// +// if cond {} type IfClause struct { Src *ast.IfClause Condition Expr - Dst Yielder } func (x *IfClause) Source() ast.Node { @@ -1702,21 +1937,20 @@ func (x *IfClause) Source() ast.Node { return x.Src } -func (x *IfClause) yield(ctx *OpContext, f YieldFunc) { - if ctx.BoolValue(ctx.value(x.Condition)) { - x.Dst.yield(ctx, f) +func (x *IfClause) yield(s *compState) { + ctx := s.ctx + if ctx.BoolValue(ctx.value(x.Condition, s.state)) { + s.yield(ctx.e) } } -// An LetClause represents a let clause in a comprehension. -// -// let x = y +// A LetClause represents a let clause in a comprehension. // +// let x = y type LetClause struct { Src *ast.LetClause Label Feature Expr Expr - Dst Yielder } func (x *LetClause) Source() ast.Node { @@ -1726,34 +1960,15 @@ func (x *LetClause) Source() ast.Node { return x.Src } -func (x *LetClause) yield(c *OpContext, f YieldFunc) { +func (x *LetClause) yield(s *compState) { + c := s.ctx n := &Vertex{Arcs: []*Vertex{ - {Label: x.Label, Conjuncts: []Conjunct{{c.Env(0), x.Expr, CloseInfo{}}}}, + { + Label: x.Label, + IsDynamic: true, + Conjuncts: []Conjunct{{c.Env(0), x.Expr, c.ci}}, + }, }} - sub := c.spawn(n) - saved := c.PushState(sub, x.Dst.Source()) - x.Dst.yield(c, f) - if b := c.PopState(saved); b != nil { - c.AddBottom(b) - } -} - -// A ValueClause represents the value part of a comprehension. -type ValueClause struct { - *StructLit -} - -func (x *ValueClause) Source() ast.Node { - if x.StructLit == nil { - return nil - } - if x.Src == nil { - return nil - } - return x.Src -} - -func (x *ValueClause) yield(op *OpContext, f YieldFunc) { - f(op.Env(0)) + s.yield(c.spawn(n)) } diff --git a/vendor/cuelang.org/go/internal/core/adt/feature.go b/vendor/cuelang.org/go/internal/core/adt/feature.go index 26d6c930..dcfa99bc 100644 --- a/vendor/cuelang.org/go/internal/core/adt/feature.go +++ b/vendor/cuelang.org/go/internal/core/adt/feature.go @@ -37,7 +37,7 @@ const ( InvalidLabel Feature = 0 // MaxIndex indicates the maximum number of unique strings that are used for - // labeles within this CUE implementation. + // labels within this CUE implementation. MaxIndex = 1<<(32-indexShift) - 1 ) @@ -60,6 +60,9 @@ type StringIndexer interface { // ToString returns a string s for index such that ToIndex(s) == index. IndexToString(index int64) string + + // NextUniqueID returns a new unique identifier. + NextUniqueID() uint64 } // SelectorString reports the shortest string representation of f when used as a @@ -68,12 +71,18 @@ func (f Feature) SelectorString(index StringIndexer) string { x := f.safeIndex() switch f.Typ() { case IntLabel: + if f == AnyIndex { + return "_" + } return strconv.Itoa(int(x)) case StringLabel: s := index.IndexToString(x) if ast.IsValidIdent(s) && !internal.IsDefOrHidden(s) { return s } + if f == AnyString { + return "_" + } return literal.String.Quote(s) default: return f.IdentString(index) @@ -84,7 +93,7 @@ func (f Feature) SelectorString(index StringIndexer) string { // is not an identifier label. func (f Feature) IdentString(index StringIndexer) string { s := index.IndexToString(f.safeIndex()) - if f.IsHidden() { + if f.IsHidden() || f.IsLet() { if p := strings.IndexByte(s, '\x00'); p >= 0 { s = s[:p] } @@ -115,6 +124,12 @@ func (f Feature) StringValue(index StringIndexer) string { return index.IndexToString(x) } +// RawString reports the underlying string value of f without interpretation. +func (f Feature) RawString(index StringIndexer) string { + x := f.safeIndex() + return index.IndexToString(x) +} + // ToValue converts a label to a value, which will be a Num for integer labels // and a String for string labels. It panics when f is not a regular label. func (f Feature) ToValue(ctx *OpContext) Value { @@ -132,7 +147,7 @@ func (f Feature) ToValue(ctx *OpContext) Value { // StringLabel converts s to a string label. func (c *OpContext) StringLabel(s string) Feature { - return labelFromValue(c, nil, &String{Str: s}) + return LabelFromValue(c, nil, &String{Str: s}) } // MakeStringLabel creates a label for the given string. @@ -153,11 +168,11 @@ func MakeIdentLabel(r StringIndexer, s, pkgpath string) Feature { switch { case strings.HasPrefix(s, "_#"): t = HiddenDefinitionLabel - s = fmt.Sprintf("%s\x00%s", s, pkgpath) + s = HiddenKey(s, pkgpath) case strings.HasPrefix(s, "#"): t = DefinitionLabel case strings.HasPrefix(s, "_"): - s = fmt.Sprintf("%s\x00%s", s, pkgpath) + s = HiddenKey(s, pkgpath) t = HiddenLabel } i := r.StringToIndex(s) @@ -168,9 +183,54 @@ func MakeIdentLabel(r StringIndexer, s, pkgpath string) Feature { return f } +// HiddenKey constructs the uniquely identifying string for a hidden fields and +// its package. +func HiddenKey(s, pkgPath string) string { + // TODO: Consider just using space instead of \x00. + return fmt.Sprintf("%s\x00%s", s, pkgPath) +} + +// MakeNamedLabel creates a feature for the given name and feature type. +func MakeNamedLabel(r StringIndexer, t FeatureType, s string) Feature { + i := r.StringToIndex(s) + f, err := MakeLabel(nil, i, t) + if err != nil { + panic("out of free string slots") + } + return f +} + +// MakeLetLabel creates a label for the given let identifier s. +// +// A let declaration is always logically unique within its scope and will never +// unify with a let field of another struct. This is enforced by ensuring that +// the let identifier is unique across an entire configuration. This, in turn, +// is done by adding a unique number to each let identifier. +func MakeLetLabel(r StringIndexer, s string) Feature { + id := r.NextUniqueID() + s = fmt.Sprintf("%s\x00%X", s, id) + i := r.StringToIndex(s) + f, err := MakeLabel(nil, i, LetLabel) + if err != nil { + panic("out of free string slots") + } + return f +} + +// MakeIntLabel creates an integer label. +func MakeIntLabel(t FeatureType, i int64) Feature { + f, err := MakeLabel(nil, i, t) + if err != nil { + panic("index out of range") + } + return f +} + const msgGround = "invalid non-ground value %s (must be concrete %s)" -func labelFromValue(c *OpContext, src Expr, v Value) Feature { +func LabelFromValue(c *OpContext, src Expr, v Value) Feature { + v, _ = c.getDefault(v) + var i int64 var t FeatureType if isError(v) { @@ -198,10 +258,10 @@ func labelFromValue(c *OpContext, src Expr, v Value) Feature { case nil, *Num, *UnaryExpr: // If the value is a constant, we know it is always an error. // UnaryExpr is an approximation for a constant value here. - c.AddErrf("invalid index %s (index must be non-negative)", x) + c.AddErrf("invalid index %v (index must be non-negative)", x) default: // Use a different message is it is the result of evaluation. - c.AddErrf("index %s out of range [%s]", src, x) + c.AddErrf("index %v out of range [%v]", src, x) } return InvalidLabel } @@ -260,6 +320,7 @@ const ( DefinitionLabel HiddenLabel HiddenDefinitionLabel + LetLabel ) const ( @@ -276,6 +337,10 @@ func (f FeatureType) IsHidden() bool { return f == HiddenLabel || f == HiddenDefinitionLabel } +func (f FeatureType) IsLet() bool { + return f == LetLabel +} + // IsValid reports whether f is a valid label. func (f Feature) IsValid() bool { return f != InvalidLabel } @@ -292,7 +357,7 @@ func (f Feature) IsRegular() bool { func (f Feature) IsString() bool { return f.Typ() == StringLabel } // IsDef reports whether the label is a definition (an identifier starting with -// # or #_. +// # or _#. func (f Feature) IsDef() bool { return f.Typ().IsDef() } @@ -306,6 +371,11 @@ func (f Feature) IsHidden() bool { return f.Typ().IsHidden() } +// IsLet reports whether this label is a let field (like `let X = value`). +func (f Feature) IsLet() bool { + return f.Typ().IsLet() +} + // Index reports the abstract index associated with f. func (f Feature) Index() int { return int(f >> indexShift) diff --git a/vendor/cuelang.org/go/internal/core/adt/kind.go b/vendor/cuelang.org/go/internal/core/adt/kind.go index 1c3bd7e7..17c12804 100644 --- a/vendor/cuelang.org/go/internal/core/adt/kind.go +++ b/vendor/cuelang.org/go/internal/core/adt/kind.go @@ -79,6 +79,8 @@ const ( TopKind Kind = (allKinds - 1) // all kinds, but not references ScalarKinds = NullKind | BoolKind | IntKind | FloatKind | StringKind | BytesKind + + CompositKind = StructKind | ListKind ) func kind(v Value) Kind { diff --git a/vendor/cuelang.org/go/internal/core/adt/optional.go b/vendor/cuelang.org/go/internal/core/adt/optional.go index d4eed631..3606a6da 100644 --- a/vendor/cuelang.org/go/internal/core/adt/optional.go +++ b/vendor/cuelang.org/go/internal/core/adt/optional.go @@ -25,14 +25,12 @@ func (o *StructInfo) MatchAndInsert(c *OpContext, arc *Vertex) { // Match normal fields matched := false -outer: + // TODO: this could be lookup up more efficiently in the outer Vertex now. + // Keep this logic for now, though. for _, f := range o.Fields { if f.Label == arc.Label { - for _, e := range f.Optional { - arc.AddConjunct(MakeConjunct(env, e, closeInfo)) - } matched = true - break outer + break } } @@ -51,15 +49,24 @@ outer: if len(o.Bulk) > 0 { bulkEnv := *env bulkEnv.DynamicLabel = f - bulkEnv.Deref = nil - bulkEnv.Cycles = nil // match bulk optional fields / pattern properties for _, b := range o.Bulk { // if matched && f.additional { // continue // } - if matchBulk(c, env, b, f, label) { + + // Mark the current arc as cyclic while evaluating pattern + // expressions, but not while adding conjuncts. + // TODO: make MatchAndInsert return a list of conjuncts instead? + // TODO: it could be that we can set the cycle before calling + // MatchAndInsert after the renewed implementation of disjunctions. + saved := arc.BaseValue + arc.BaseValue = cycle + match := matchBulk(c, env, b, f, label) + arc.BaseValue = saved + + if match { matched = true info := closeInfo.SpawnSpan(b.Value, ConstraintSpan) arc.AddConjunct(MakeConjunct(&bulkEnv, b, info)) @@ -71,10 +78,6 @@ outer: return } - addEnv := *env - addEnv.Deref = nil - addEnv.Cycles = nil - // match others for _, x := range o.Additional { info := closeInfo @@ -82,19 +85,28 @@ outer: info = info.SpawnSpan(x, ConstraintSpan) } // TODO: consider moving in above block (2 lines up). - arc.AddConjunct(MakeConjunct(&addEnv, x, info)) + arc.AddConjunct(MakeConjunct(env, x, info)) } } // matchBulk reports whether feature f matches the filter of x. It evaluation of // the filter is erroneous, it returns false and the error will be set in c. -func matchBulk(c *OpContext, env *Environment, x *BulkOptionalField, f Feature, label Value) bool { - v := env.evalCached(c, x.Filter) +func matchBulk(c *OpContext, env *Environment, p *BulkOptionalField, f Feature, label Value) bool { + v := env.evalCached(c, p.Filter) v = Unwrap(v) // Fast-track certain cases. switch x := v.(type) { case *Bottom: + if x == cycle { + err := c.NewPosf(pos(p.Filter), "cyclic pattern constraint") + for _, c := range c.vertex.Conjuncts { + err.AddPosition(c.Elem()) + } + c.AddBottom(&Bottom{ + Err: err, + }) + } if c.errs == nil { c.AddBottom(x) } @@ -123,10 +135,12 @@ func matchBulk(c *OpContext, env *Environment, x *BulkOptionalField, f Feature, return false } - n := Vertex{} - m := MakeRootConjunct(env, v) + n := Vertex{ + IsDynamic: true, + } + m := MakeConjunct(env, v, c.ci) n.AddConjunct(m) - n.AddConjunct(MakeRootConjunct(m.Env, label)) + n.AddConjunct(MakeConjunct(m.Env, label, c.ci)) c.inConstraint++ n.Finalize(c) diff --git a/vendor/cuelang.org/go/internal/core/adt/prof.go b/vendor/cuelang.org/go/internal/core/adt/prof.go new file mode 100644 index 00000000..3036b273 --- /dev/null +++ b/vendor/cuelang.org/go/internal/core/adt/prof.go @@ -0,0 +1,47 @@ +// Copyright 2023 CUE Authors +// +// 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. + +package adt + +import ( + "sync" + + "cuelang.org/go/cue/stats" +) + +// This file contains stats and profiling functionality. + +var ( + // counts is a temporary and internal solution for collecting global stats. It is protected with a mutex. + counts stats.Counts + countsMu sync.Mutex +) + +// AddStats adds the stats of the given OpContext to the global +// counters. +func AddStats(ctx *OpContext) { + countsMu.Lock() + counts.Add(ctx.stats) + countsMu.Unlock() +} + +// TotalStats returns the aggregate counts of all operations +// calling AddStats. +func TotalStats() stats.Counts { + countsMu.Lock() + // Shallow copy suffices as it only contains counter fields. + s := counts + countsMu.Unlock() + return s +} diff --git a/vendor/cuelang.org/go/internal/core/adt/simplify.go b/vendor/cuelang.org/go/internal/core/adt/simplify.go index 571800db..e1b38333 100644 --- a/vendor/cuelang.org/go/internal/core/adt/simplify.go +++ b/vendor/cuelang.org/go/internal/core/adt/simplify.go @@ -15,7 +15,9 @@ package adt import ( - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" + + "cuelang.org/go/internal" ) // SimplifyBounds collapses bounds if possible. The bound values must be @@ -82,21 +84,21 @@ func SimplifyBounds(ctx *OpContext, k Kind, x, y *BoundValue) Value { // Readjust bounds for integers. if x.Op == GreaterEqualOp { // >=3.4 ==> >=4 - _, _ = apdCtx.Ceil(&lo, &a.X) + _, _ = internal.BaseContext.Ceil(&lo, &a.X) } else { // >3.4 ==> >3 - _, _ = apdCtx.Floor(&lo, &a.X) + _, _ = internal.BaseContext.Floor(&lo, &a.X) } if y.Op == LessEqualOp { // <=2.3 ==> <= 2 - _, _ = apdCtx.Floor(&hi, &b.X) + _, _ = internal.BaseContext.Floor(&hi, &b.X) } else { // <2.3 ==> < 3 - _, _ = apdCtx.Ceil(&hi, &b.X) + _, _ = internal.BaseContext.Ceil(&hi, &b.X) } } - cond, err := apd.BaseContext.Sub(&d, &hi, &lo) + cond, err := internal.BaseContext.Sub(&d, &hi, &lo) if cond.Inexact() || err != nil { break } @@ -140,7 +142,7 @@ func SimplifyBounds(ctx *OpContext, k Kind, x, y *BoundValue) Value { case diff == 2: if k&FloatKind == 0 && x.Op == GreaterThanOp && y.Op == LessThanOp { - _, _ = apd.BaseContext.Add(&d, d.SetInt64(1), &lo) + _, _ = internal.BaseContext.Add(&d, d.SetInt64(1), &lo) return ctx.newNum(&d, k&NumKind, x, y) } diff --git a/vendor/cuelang.org/go/internal/core/compile/builtin.go b/vendor/cuelang.org/go/internal/core/compile/builtin.go index 1b8d71e1..85cb5e95 100644 --- a/vendor/cuelang.org/go/internal/core/compile/builtin.go +++ b/vendor/cuelang.org/go/internal/core/compile/builtin.go @@ -37,6 +37,7 @@ var lenBuiltin = &adt.Builtin{ Func: func(c *adt.OpContext, args []adt.Value) adt.Expr { v := args[0] if x, ok := v.(*adt.Vertex); ok { + x.LockArcs = true switch x.BaseValue.(type) { case nil: // This should not happen, but be defensive. @@ -48,7 +49,7 @@ var lenBuiltin = &adt.Builtin{ n := 0 v, _ := v.(*adt.Vertex) for _, a := range v.Arcs { - if a.Label.IsRegular() { + if a.Label.IsRegular() && a.IsDefined(c) { n++ } } @@ -85,7 +86,7 @@ var closeBuiltin = &adt.Builtin{ if !ok { return c.NewErrf("struct argument must be concrete") } - if s.IsClosedStruct() { + if m, ok := s.BaseValue.(*adt.StructMarker); ok && m.NeedClose || s.Closed { return s } v := s.Clone() @@ -101,7 +102,7 @@ var andBuiltin = &adt.Builtin{ Params: []adt.Param{listParam}, Result: adt.IntKind, Func: func(c *adt.OpContext, args []adt.Value) adt.Expr { - list := c.Elems(args[0]) + list := c.RawElems(args[0]) if len(list) == 0 { return &adt.Top{} } @@ -119,7 +120,7 @@ var orBuiltin = &adt.Builtin{ Result: adt.IntKind, Func: func(c *adt.OpContext, args []adt.Value) adt.Expr { d := []adt.Disjunct{} - for _, c := range c.Elems(args[0]) { + for _, c := range c.RawElems(args[0]) { d = append(d, adt.Disjunct{Val: c, Default: false}) } if len(d) == 0 { @@ -137,10 +138,12 @@ var orBuiltin = &adt.Builtin{ } v := &adt.Vertex{} // TODO: make a Disjunction. - v.AddConjunct(adt.MakeRootConjunct(nil, + closeInfo := c.CloseInfo() + v.AddConjunct(adt.MakeConjunct(nil, &adt.DisjunctionExpr{Values: d, HasDefaults: false}, + closeInfo, )) - c.Unify(v, adt.Finalized) + v.CompleteArcs(c) return v }, } diff --git a/vendor/cuelang.org/go/internal/core/compile/compile.go b/vendor/cuelang.org/go/internal/core/compile/compile.go index 18fa53be..f870b3ec 100644 --- a/vendor/cuelang.org/go/internal/core/compile/compile.go +++ b/vendor/cuelang.org/go/internal/core/compile/compile.go @@ -105,6 +105,17 @@ type compiler struct { stack []frame inSelector int + // refersToForVariable tracks whether an expression refers to a key or + // value produced by a for comprehension embedded within a struct. + // An Environment associated with such a comprehension value is collapsed + // onto the destination. + // Tracking this is necessary for let fields, which should not be unified + // into the destination when referring to such values. + // See https://cuelang.org/issue/2218. + // TODO(perf): use this to compute when a field can be structure shared + // across different iterations of the same field. + refersToForVariable bool + fileScope map[adt.Feature]bool num literal.NumInfo @@ -122,7 +133,7 @@ func (c *compiler) errf(n ast.Node, format string, args ...interface{}) *adt.Bot err := &compilerError{ n: n, path: c.path(), - Message: errors.NewMessage(format, args), + Message: errors.NewMessagef(format, args...), } c.errs = errors.Append(c.errs, err) return &adt.Bottom{Err: err} @@ -141,10 +152,14 @@ func (c *compiler) path() []string { type frame struct { label labeler // path name leading to this frame. scope ast.Node // *ast.File or *ast.Struct - field *ast.Field + field ast.Decl // scope map[ast.Node]bool upCount int32 // 1 for field, 0 for embedding. + // isComprehensionVar indicates that this scope refers to a for clause + // that is part of a comprehension embedded in a struct. + isComprehensionVar bool + aliases map[string]aliasEntry } @@ -153,6 +168,7 @@ type aliasEntry struct { srcExpr ast.Expr expr adt.Expr source ast.Node + feature adt.Feature // For let declarations used bool } @@ -173,6 +189,9 @@ func (c *compiler) insertAlias(id *ast.Ident, a aliasEntry) *adt.Bottom { "alias %q already declared; previous declaration at %s", id.Name, e.source.Pos()) } + if id.Name == "_" { + return c.errf(id, "cannot use _ as alias or let clause") + } m[id.Name] = a return nil @@ -202,6 +221,8 @@ func (c *compiler) lookupAlias(k int, id *ast.Ident) aliasEntry { switch { case entry.label != nil: + // TODO: allow cyclic references in let expressions once these can be + // encoded as a ValueReference. if entry.srcExpr == nil { entry.expr = c.errf(id, "cyclic references in let clause or alias") break @@ -250,6 +271,7 @@ func (c *compiler) compileFiles(a []*ast.File) *adt.Vertex { // Or value? // Excluded from cross-file resolution are: // - import specs // - aliases + // - let declarations // - anything in an anonymous file // for _, f := range a { @@ -343,7 +365,10 @@ func (c *compiler) resolve(n *ast.Ident) adt.Expr { upCount += c.upCountOffset for p := c.Scope; p != nil; p = p.Parent() { for _, a := range p.Vertex().Arcs { - if a.Label == label { + switch { + case a.Label.IsLet() && a.Label.IdentString(c.index) == n.Name: + label = a.Label + case a.Label == label: return &adt.FieldReference{ Src: n, UpCount: upCount, @@ -393,6 +418,11 @@ func (c *compiler) resolve(n *ast.Ident) adt.Expr { switch f := n.Node.(type) { case *ast.Field: _ = c.lookupAlias(k, f.Label.(*ast.Alias).Ident) // mark as used + // The expression of field Label is always done in the same + // Environment as pointed to by the UpCount of the DynamicReference + // and the evaluation of a DynamicReference assumes this. + // We therefore set the UpCount of the LabelReference to 0. + label.UpCount = 0 return &adt.DynamicReference{ Src: n, UpCount: upCount, @@ -414,7 +444,10 @@ func (c *compiler) resolve(n *ast.Ident) adt.Expr { k := len(c.stack) - 1 for ; k >= 0; k-- { - if c.stack[k].scope == n.Scope { + if f := c.stack[k]; f.scope == n.Scope { + if f.isComprehensionVar { + c.refersToForVariable = true + } break } upCount += c.stack[k].upCount @@ -438,13 +471,17 @@ func (c *compiler) resolve(n *ast.Ident) adt.Expr { // Local expressions case *ast.LetClause: entry := c.lookupAlias(k, n) + if entry.expr == nil { + panic("unreachable") + } + label = entry.feature // let x = y return &adt.LetReference{ Src: n, UpCount: upCount, Label: label, - X: entry.expr, + X: entry.expr, // TODO: remove usage } // TODO: handle new-style aliases @@ -525,6 +562,7 @@ func (c *compiler) markAlias(d ast.Decl) { label: (*letScope)(x), srcExpr: x.Expr, source: x, + feature: adt.MakeLetLabel(c.index, x.Ident.Name), } c.insertAlias(x.Ident, a) @@ -544,14 +582,6 @@ func (c *compiler) decl(d ast.Decl) adt.Decl { if lab, ok = a.Expr.(ast.Label); !ok { return c.errf(a, "alias expression is not a valid label") } - - switch lab.(type) { - case *ast.Ident, *ast.BasicLit, *ast.ListLit: - // Even though we won't need the alias, we still register it - // for duplicate and failed reference detection. - default: - c.updateAlias(a.Ident, c.expr(a.Expr)) - } } v := x.Value @@ -573,27 +603,13 @@ func (c *compiler) decl(d ast.Decl) adt.Decl { return c.errf(x, "cannot use _ as label") } - // TODO(legacy): remove: old-school definitions - if x.Token == token.ISA && !label.IsDef() { - name, isIdent, err := ast.LabelName(lab) - if err == nil && isIdent { - idx := c.index.StringToIndex(name) - label, _ = adt.MakeLabel(x, idx, adt.DefinitionLabel) - } - } + t, _ := internal.ConstraintToken(x) - if x.Optional == token.NoPos { - return &adt.Field{ - Src: x, - Label: label, - Value: value, - } - } else { - return &adt.OptionalField{ - Src: x, - Label: label, - Value: value, - } + return &adt.Field{ + Src: x, + Label: label, + ArcType: adt.ConstraintFromToken(t), + Value: value, } case *ast.ListLit: @@ -618,28 +634,51 @@ func (c *compiler) decl(d ast.Decl) adt.Decl { } case *ast.ParenExpr: - if x.Token == token.ISA { - c.errf(x, "definitions not supported for dynamic fields") - } + t, _ := internal.ConstraintToken(x) + return &adt.DynamicField{ - Src: x, - Key: c.expr(l), - Value: value, + Src: x, + Key: c.expr(l), + ArcType: adt.ConstraintFromToken(t), + Value: value, } case *ast.Interpolation: - if x.Token == token.ISA { - c.errf(x, "definitions not supported for interpolations") - } + t, _ := internal.ConstraintToken(x) + return &adt.DynamicField{ - Src: x, - Key: c.expr(l), - Value: value, + Src: x, + Key: c.expr(l), + ArcType: adt.ConstraintFromToken(t), + Value: value, } } - // Handled in addLetDecl. case *ast.LetClause: + m := c.stack[len(c.stack)-1].aliases + entry := m[x.Ident.Name] + + // A reference to the let should, in principle, be interpreted as a + // value reference, not field reference: + // - this is syntactically consistent for the use of = + // - this is semantically the only valid interpretation + // In practice this amounts to the same thing, as let expressions cannot + // be addressed from outside their scope. But it will matter once + // expressions may refer to a let from within the let. + + savedUses := c.refersToForVariable + c.refersToForVariable = false + value := c.labeledExpr(x, (*letScope)(x), x.Expr) + refsCompVar := c.refersToForVariable + c.refersToForVariable = savedUses || refsCompVar + + return &adt.LetField{ + Src: x, + Label: entry.feature, + IsMulti: refsCompVar, + Value: value, + } + // case: *ast.Alias: // TODO(value alias) case *ast.CommentGroup: @@ -655,7 +694,7 @@ func (c *compiler) decl(d ast.Decl) adt.Decl { } case *ast.Comprehension: - return c.comprehension(x) + return c.comprehension(x, false) case *ast.EmbedDecl: // Deprecated return c.expr(x.Expr) @@ -668,15 +707,22 @@ func (c *compiler) decl(d ast.Decl) adt.Decl { func (c *compiler) addLetDecl(d ast.Decl) { switch x := d.(type) { - // An alias reference will have an expression that is looked up in the - // environment cash. - case *ast.LetClause: - // Cache the parsed expression. Creating a unique expression for each - // reference allows the computation to be shared given that we don't - // have fields for expressions. This, in turn, prevents exponential - // blowup in x2: x1+x1, x3: x2+x2, ... patterns. - expr := c.labeledExpr(nil, (*letScope)(x), x.Expr) - c.updateAlias(x.Ident, expr) + case *ast.Field: + lab := x.Label + if a, ok := lab.(*ast.Alias); ok { + if lab, ok = a.Expr.(ast.Label); !ok { + // error reported elsewhere + return + } + + switch lab.(type) { + case *ast.Ident, *ast.BasicLit, *ast.ListLit: + // Even though we won't need the alias, we still register it + // for duplicate and failed reference detection. + default: + c.updateAlias(a.Ident, c.expr(a.Expr)) + } + } case *ast.Alias: c.errf(x, "old-style alias no longer supported: use let clause; use cue fix to update.") @@ -692,7 +738,7 @@ func (c *compiler) elem(n ast.Expr) adt.Elem { } case *ast.Comprehension: - return c.comprehension(x) + return c.comprehension(x, true) case ast.Expr: return c.expr(x) @@ -700,10 +746,8 @@ func (c *compiler) elem(n ast.Expr) adt.Elem { return nil } -func (c *compiler) comprehension(x *ast.Comprehension) adt.Elem { - var cur adt.Yielder - var first adt.Yielder - var prev, next *adt.Yielder +func (c *compiler) comprehension(x *ast.Comprehension, inList bool) adt.Elem { + var a []adt.Yielder for _, v := range x.Clauses { switch x := v.(type) { case *ast.ForClause: @@ -717,41 +761,42 @@ func (c *compiler) comprehension(x *ast.Comprehension) adt.Elem { Value: c.label(x.Value), Src: c.expr(x.Source), } - cur = y - c.pushScope((*forScope)(x), 1, v) + f := c.pushScope((*forScope)(x), 1, v) defer c.popScope() - next = &y.Dst + f.isComprehensionVar = !inList + a = append(a, y) case *ast.IfClause: y := &adt.IfClause{ Src: x, Condition: c.expr(x.Condition), } - cur = y - next = &y.Dst + a = append(a, y) case *ast.LetClause: + // Check if any references in the expression refer to a for + // comprehension. + savedUses := c.refersToForVariable + c.refersToForVariable = false + expr := c.expr(x.Expr) + refsCompVar := c.refersToForVariable + c.refersToForVariable = savedUses || refsCompVar + y := &adt.LetClause{ Src: x, Label: c.label(x.Ident), - Expr: c.expr(x.Expr), + Expr: expr, } - cur = y - c.pushScope((*letScope)(x), 1, v) + f := c.pushScope((*letScope)(x), 1, v) defer c.popScope() - next = &y.Dst + f.isComprehensionVar = !inList && refsCompVar + a = append(a, y) } - if prev != nil { - *prev = cur - } else { - first = cur - if _, ok := cur.(*adt.LetClause); ok { - return c.errf(x, - "first comprehension clause must be 'if' or 'for'") - } + if _, ok := a[0].(*adt.LetClause); ok { + return c.errf(x, + "first comprehension clause must be 'if' or 'for'") } - prev = next } // TODO: make x.Value an *ast.StructLit and this is redundant. @@ -768,27 +813,23 @@ func (c *compiler) comprehension(x *ast.Comprehension) adt.Elem { return y } - if prev != nil { - *prev = &adt.ValueClause{StructLit: st} - } else { + if len(a) == 0 { return c.errf(x, "comprehension value without clauses") } return &adt.Comprehension{ - Clauses: first, + Syntax: x, + Clauses: a, Value: st, } } -func (c *compiler) labeledExpr(f *ast.Field, lab labeler, expr ast.Expr) adt.Expr { +func (c *compiler) labeledExpr(f ast.Decl, lab labeler, expr ast.Expr) adt.Expr { k := len(c.stack) - 1 return c.labeledExprAt(k, f, lab, expr) } -func (c *compiler) labeledExprAt(k int, f *ast.Field, lab labeler, expr ast.Expr) adt.Expr { - if c.stack[k].field != nil { - panic("expected nil field") - } +func (c *compiler) labeledExprAt(k int, f ast.Decl, lab labeler, expr ast.Expr) adt.Expr { saved := c.stack[k] c.stack[k].label = lab @@ -807,6 +848,16 @@ func (c *compiler) expr(expr ast.Expr) adt.Expr { case *ast.Ident: return c.resolve(n) + case *ast.Func: + // We don't yet support function types natively in + // CUE. ast.Func exists only to support external + // interpreters. Function values (really, adt.Builtin) + // are only created by the runtime, or injected by + // external interpreters. + // + // TODO: revise this when we add function types. + return c.resolve(ast.NewIdent("_")) + case *ast.StructLit: c.pushScope(nil, 1, n) v := &adt.StructLit{Src: n} diff --git a/vendor/cuelang.org/go/internal/core/compile/label.go b/vendor/cuelang.org/go/internal/core/compile/label.go index cd4d5a70..24bed7d4 100644 --- a/vendor/cuelang.org/go/internal/core/compile/label.go +++ b/vendor/cuelang.org/go/internal/core/compile/label.go @@ -15,7 +15,7 @@ package compile import ( - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "golang.org/x/text/unicode/norm" "cuelang.org/go/cue/ast" diff --git a/vendor/cuelang.org/go/internal/core/convert/go.go b/vendor/cuelang.org/go/internal/core/convert/go.go index b6cc20db..2562207b 100644 --- a/vendor/cuelang.org/go/internal/core/convert/go.go +++ b/vendor/cuelang.org/go/internal/core/convert/go.go @@ -25,7 +25,7 @@ import ( "strconv" "strings" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "golang.org/x/text/encoding/unicode" "cuelang.org/go/cue/ast" @@ -33,8 +33,10 @@ import ( "cuelang.org/go/cue/errors" "cuelang.org/go/cue/parser" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" "cuelang.org/go/internal/core/compile" + internaljson "cuelang.org/go/internal/encoding/json" "cuelang.org/go/internal/types" ) @@ -76,9 +78,7 @@ func compileExpr(ctx *adt.OpContext, expr ast.Expr) adt.Value { // parseTag parses a CUE expression from a cue tag. func parseTag(ctx *adt.OpContext, obj *ast.StructLit, field, tag string) ast.Expr { - if p := strings.Index(tag, ","); p >= 0 { - tag = tag[:p] - } + tag, _ = splitTag(tag) if tag == "" { return topSentinel } @@ -92,6 +92,15 @@ func parseTag(ctx *adt.OpContext, obj *ast.StructLit, field, tag string) ast.Exp return expr } +// splitTag splits a cue tag into cue and options. +func splitTag(tag string) (cue string, options string) { + q := strings.LastIndexByte(tag, '"') + if c := strings.IndexByte(tag[q+1:], ','); c >= 0 { + return tag[:q+1+c], tag[q+1+c+1:] + } + return tag, "" +} + // TODO: should we allow mapping names in cue tags? This only seems like a good // idea if we ever want to allow mapping CUE to a different name than JSON. var tagsWithNames = []string{"json", "yaml", "protobuf"} @@ -103,7 +112,7 @@ func getName(f *reflect.StructField) string { } for _, s := range tagsWithNames { if tag, ok := f.Tag.Lookup(s); ok { - if p := strings.Index(tag, ","); p >= 0 { + if p := strings.IndexByte(tag, ','); p >= 0 { tag = tag[:p] } if tag != "" { @@ -127,8 +136,9 @@ func isOptional(f *reflect.StructField) bool { } if tag, ok := f.Tag.Lookup("cue"); ok { // TODO: only if first field is not empty. + _, opt := splitTag(tag) isOptional = false - for _, f := range strings.Split(tag, ",")[1:] { + for _, f := range strings.Split(opt, ",") { switch f { case "opt": isOptional = true @@ -182,30 +192,6 @@ func parseJSON(ctx *adt.OpContext, b []byte) adt.Value { return compileExpr(ctx, expr) } -func isZero(v reflect.Value) bool { - x := v.Interface() - if x == nil { - return true - } - switch k := v.Kind(); k { - case reflect.Struct, reflect.Array: - // we never allow optional values for these types. - return false - - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, - reflect.Slice: - // Note that for maps we preserve the distinction between a nil map and - // an empty map. - return v.IsNil() - - case reflect.String: - return v.Len() == 0 - - default: - return x == reflect.Zero(v.Type()).Interface() - } -} - func GoValueToExpr(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Expr { e := convertRec(ctx, nilIsTop, x) if e == nil { @@ -251,12 +237,16 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { return compileExpr(ctx, v) case *big.Int: - return &adt.Num{Src: src, K: adt.IntKind, X: *apd.NewWithBigInt(v, 0)} + v2 := new(apd.BigInt).SetMathBigInt(v) + return &adt.Num{Src: src, K: adt.IntKind, X: *apd.NewWithBigInt(v2, 0)} case *big.Rat: // should we represent this as a binary operation? n := &adt.Num{Src: src, K: adt.IntKind} - _, err := apd.BaseContext.Quo(&n.X, apd.NewWithBigInt(v.Num(), 0), apd.NewWithBigInt(v.Denom(), 0)) + _, err := internal.BaseContext.Quo(&n.X, + apd.NewWithBigInt(new(apd.BigInt).SetMathBigInt(v.Num()), 0), + apd.NewWithBigInt(new(apd.BigInt).SetMathBigInt(v.Denom()), 0), + ) if err != nil { return ctx.AddErrf("could not convert *big.Rat: %v", err) } @@ -282,7 +272,7 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { // with this: kind := adt.FloatKind var d apd.Decimal - res, _ := apd.BaseContext.RoundToIntegralExact(&d, v) + res, _ := internal.BaseContext.RoundToIntegralExact(&d, v) if !res.Inexact() { kind = adt.IntKind } @@ -303,7 +293,7 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { if err != nil { return ctx.AddErr(errors.Promote(err, "encoding.TextMarshaler")) } - b, err = json.Marshal(string(b)) + b, err = internaljson.Marshal(string(b)) if err != nil { return ctx.AddErr(errors.Promote(err, "json")) } @@ -410,8 +400,10 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { if env == nil { env = &adt.Environment{} } + // There is no closedness or cycle info for Go structs, so we + // pass an empty CloseInfo. v.AddStruct(obj, env, adt.CloseInfo{}) - v.SetValue(ctx, adt.Finalized, &adt.StructMarker{}) + v.SetValue(ctx, &adt.StructMarker{}) t := value.Type() for i := 0; i < value.NumField(); i++ { @@ -426,7 +418,7 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { if tag, _ := sf.Tag.Lookup("json"); tag == "-" { continue } - if isOmitEmpty(&sf) && isZero(val) { + if isOmitEmpty(&sf) && val.IsZero() { continue } sub := convertRec(ctx, nilIsTop, val.Interface()) @@ -461,7 +453,7 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { arc.Label = f } else { arc = &adt.Vertex{Label: f, BaseValue: sub} - arc.UpdateStatus(adt.Finalized) + arc.ForceDone() arc.AddConjunct(adt.MakeRootConjunct(nil, sub)) } v.Arcs = append(v.Arcs, arc) @@ -471,7 +463,7 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { case reflect.Map: v := &adt.Vertex{BaseValue: &adt.StructMarker{}} - v.SetValue(ctx, adt.Finalized, &adt.StructMarker{}) + v.SetValue(ctx, &adt.StructMarker{}) t := value.Type() switch key := t.Key(); key.Kind() { @@ -515,7 +507,7 @@ func convertRec(ctx *adt.OpContext, nilIsTop bool, x interface{}) adt.Value { arc.Label = f } else { arc = &adt.Vertex{Label: f, BaseValue: sub} - arc.UpdateStatus(adt.Finalized) + arc.ForceDone() arc.AddConjunct(adt.MakeRootConjunct(nil, sub)) } v.Arcs = append(v.Arcs, arc) @@ -692,7 +684,7 @@ func goTypeToValueRec(ctx *adt.OpContext, allowNullDefault bool, t reflect.Type) // The GO JSON decoder always allows a value to be undefined. d := &ast.Field{Label: ast.NewIdent(name), Value: elem} if isOptional(&f) { - d.Optional = token.Blank.Pos() + internal.SetConstraint(d, token.OPTION) } obj.Elts = append(obj.Elts, d) } diff --git a/vendor/cuelang.org/go/internal/core/debug/compact.go b/vendor/cuelang.org/go/internal/core/debug/compact.go index c0069f8b..20c695e8 100644 --- a/vendor/cuelang.org/go/internal/core/debug/compact.go +++ b/vendor/cuelang.org/go/internal/core/debug/compact.go @@ -17,7 +17,6 @@ // Note that the result is not valid CUE, but instead prints the internals // of an ADT node in human-readable form. It uses a simple indentation algorithm // for improved readability and diffing. -// package debug import ( @@ -51,9 +50,24 @@ func (w *compactPrinter) node(n adt.Node) { if i > 0 { w.string(",") } - w.label(a.Label) - w.string(":") - w.node(a) + if a.Label.IsLet() { + w.string("let ") + w.label(a.Label) + if a.MultiLet { + w.string("m") + } + w.string("=") + if c := a.Conjuncts[0]; a.MultiLet { + w.node(c.Expr()) + continue + } + w.node(a) + } else { + w.label(a.Label) + w.string(a.ArcType.Suffix()) + w.string(":") + w.node(a) + } } w.string("}") @@ -100,13 +114,18 @@ func (w *compactPrinter) node(n adt.Node) { case *adt.Field: s := w.labelString(x.Label) w.string(s) + w.string(x.ArcType.Suffix()) w.string(":") w.node(x.Value) - case *adt.OptionalField: + case *adt.LetField: + w.string("let ") s := w.labelString(x.Label) w.string(s) - w.string("?:") + if x.IsMulti { + w.string("m") + } + w.string("=") w.node(x.Value) case *adt.BulkOptionalField: @@ -117,9 +136,7 @@ func (w *compactPrinter) node(n adt.Node) { case *adt.DynamicField: w.node(x.Key) - if x.IsOptional() { - w.string("?") - } + w.string(x.ArcType.Suffix()) w.string(":") w.node(x.Value) @@ -302,8 +319,10 @@ func (w *compactPrinter) node(n adt.Node) { } case *adt.Comprehension: - w.node(x.Clauses) - w.node(x.Value) + for _, c := range x.Clauses { + w.node(c) + } + w.node(adt.ToExpr(x.Value)) case *adt.ForClause: w.string("for ") @@ -313,13 +332,11 @@ func (w *compactPrinter) node(n adt.Node) { w.string(" in ") w.node(x.Src) w.string(" ") - w.node(x.Dst) case *adt.IfClause: w.string("if ") w.node(x.Condition) w.string(" ") - w.node(x.Dst) case *adt.LetClause: w.string("let ") @@ -327,7 +344,6 @@ func (w *compactPrinter) node(n adt.Node) { w.string(" = ") w.node(x.Expr) w.string(" ") - w.node(x.Dst) case *adt.ValueClause: diff --git a/vendor/cuelang.org/go/internal/core/debug/debug.go b/vendor/cuelang.org/go/internal/core/debug/debug.go index 8394f83e..717c3a38 100644 --- a/vendor/cuelang.org/go/internal/core/debug/debug.go +++ b/vendor/cuelang.org/go/internal/core/debug/debug.go @@ -17,7 +17,6 @@ // Note that the result is not valid CUE, but instead prints the internals // of an ADT node in human-readable form. It uses a simple indentation algorithm // for improved readability and diffing. -// package debug import ( @@ -28,7 +27,6 @@ import ( "cuelang.org/go/cue/errors" "cuelang.org/go/cue/literal" - "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" ) @@ -43,6 +41,7 @@ type Config struct { Raw bool } +// WriteNode writes a string representation of the node to w. func WriteNode(w io.Writer, i adt.StringIndexer, n adt.Node, config *Config) { if config == nil { config = &Config{} @@ -56,6 +55,10 @@ func WriteNode(w io.Writer, i adt.StringIndexer, n adt.Node, config *Config) { } } +// NodeString returns a string representation of the given node. +// The StringIndexer value i is used to translate elements of n to strings. +// Commonly available implementations of StringIndexer include *adt.OpContext +// and *runtime.Runtime. func NodeString(i adt.StringIndexer, n adt.Node, config *Config) string { b := &strings.Builder{} WriteNode(b, i, n, config) @@ -90,14 +93,22 @@ func (w *printer) ident(f adt.Feature) { // TODO: fold into label once :: is no longer supported. func (w *printer) labelString(f adt.Feature) string { - if f.IsHidden() { + switch { + case f.IsHidden(): ident := f.IdentString(w.index) if pkgName := f.PkgID(w.index); pkgName != "_" { ident = fmt.Sprintf("%s(%s)", ident, pkgName) } return ident + + case f.IsLet(): + ident := f.RawString(w.index) + ident = strings.Replace(ident, "\x00", "#", 1) + return ident + + default: + return f.SelectorString(w.index) } - return f.SelectorString(w.index) } func (w *printer) shortError(errs errors.Error) { @@ -209,10 +220,29 @@ func (w *printer) node(n adt.Node) { } for _, a := range x.Arcs { - w.string("\n") - w.label(a.Label) - w.string(": ") - w.node(a) + if a.ArcType == adt.ArcNotPresent { + continue + } + if a.Label.IsLet() { + w.string("\n") + w.string("let ") + w.label(a.Label) + if a.MultiLet { + w.string("multi") + } + w.string(" = ") + if c := a.Conjuncts[0]; a.MultiLet { + w.node(c.Expr()) + continue + } + w.node(a) + } else { + w.string("\n") + w.label(a.Label) + w.string(a.ArcType.Suffix()) + w.string(": ") + w.node(a) + } } if x.BaseValue == nil { @@ -268,21 +298,19 @@ func (w *printer) node(n adt.Node) { case *adt.Field: s := w.labelString(x.Label) w.string(s) + w.string(x.ArcType.Suffix()) w.string(":") - if x.Label.IsDef() && !internal.IsDef(s) { - w.string(":") - } w.string(" ") w.node(x.Value) - case *adt.OptionalField: + case *adt.LetField: + w.string("let ") s := w.labelString(x.Label) w.string(s) - w.string("?:") - if x.Label.IsDef() && !internal.IsDef(s) { - w.string(":") + if x.IsMulti { + w.string("multi") } - w.string(" ") + w.string(" = ") w.node(x.Value) case *adt.BulkOptionalField: @@ -293,9 +321,7 @@ func (w *printer) node(n adt.Node) { case *adt.DynamicField: w.node(x.Key) - if x.IsOptional() { - w.string("?") - } + w.string(x.ArcType.Suffix()) w.string(": ") w.node(x.Value) @@ -387,7 +413,7 @@ func (w *printer) node(n adt.Node) { w.string(openTuple) w.string(strconv.Itoa(int(x.UpCount))) w.string(";let ") - w.ident(x.Label) + w.label(x.Label) w.string(closeTuple) case *adt.SelectorExpr: @@ -498,8 +524,10 @@ func (w *printer) node(n adt.Node) { w.string(")") case *adt.Comprehension: - w.node(x.Clauses) - w.node(x.Value) + for _, c := range x.Clauses { + w.node(c) + } + w.node(adt.ToExpr(x.Value)) case *adt.ForClause: w.string("for ") @@ -509,13 +537,11 @@ func (w *printer) node(n adt.Node) { w.string(" in ") w.node(x.Src) w.string(" ") - w.node(x.Dst) case *adt.IfClause: w.string("if ") w.node(x.Condition) w.string(" ") - w.node(x.Dst) case *adt.LetClause: w.string("let ") @@ -523,7 +549,6 @@ func (w *printer) node(n adt.Node) { w.string(" = ") w.node(x.Expr) w.string(" ") - w.node(x.Dst) case *adt.ValueClause: diff --git a/vendor/cuelang.org/go/internal/core/dep/dep.go b/vendor/cuelang.org/go/internal/core/dep/dep.go index 9f5bd703..f9de8e21 100644 --- a/vendor/cuelang.org/go/internal/core/dep/dep.go +++ b/vendor/cuelang.org/go/internal/core/dep/dep.go @@ -16,11 +16,99 @@ package dep import ( - "errors" - + "cuelang.org/go/cue/errors" "cuelang.org/go/internal/core/adt" ) +// Dependencies +// +// A dependency is a reference relation from one Vertex to another. A Vertex +// has multiple Conjuncts, each of which is associated with an expression. +// Each expression, in turn, may have multiple references, each representing +// a single dependency. +// +// A reference that occurs in a node will point to another node. A reference +// `x.y` may point to a node `x.y` as well as `x`. By default, only the most +// precise node is reported, which is `x.y` if it exists, or `x` otherwise. +// In the latter case, a path is associated with the reference to indicate +// the specific non-existing path that is needed for that dependency. (TODO) +// +// A single reference may point to multiple nodes. For instance, +// (a & b).z may point to both `a.z` and `b.z`. This has to be taken into +// account if dep is used for substitutions. +// +// +// field: Conjunct +// | +// Expr Conjunct Expression +// |- Reference A reference to led to a target +// |- \- Target Node Pointed to by Reference +// |- \- UsedPath The sole path used within Node + +// TODO: verify that these concepts are correctly reflected in the API: +// Source: +// The CUE value for which dependencies are analyzed. +// This may differ per dependency for dynamic and transitive analysis. +// Target: +// The field to which the found reference resolves. +// Reference: +// The reference that resolved to the dependency. +// Replacing this reference in the conjuncts of the source vertex with a +// link to the target vertex yields the same result if there only a single +// dependency matching this reference. +// Conjunct: +// The conjunct in which the Reference was found. +// Used Path: +// The target vertex may be a parent of the actual, more precise, +// dependency, if the latter does not yet exist. The target path is the path +// from the target vertex to the actual dependency. +// Trace: +// A sequence of dependencies leading to the result in case of transitive +// dependencies. + +// TODO: for a public API, a better approach seems to be to have a single +// Visit method, with a configuration to set a bunch of orthogonal options. +// Here are some examples of the options: +// - Dynamic: evaluate and descend into computed fields. +// - Recurse: evaluate dependencies of subfields as well. +// - Inner: report dependencies within the root being visited. +// - RootLess: report dependencies that do not have a path to the root. +// - Transitive: get all dependencies, not just the direct ones. +// - Substitute: do not get precise dependencies, but rather keep them +// such that each expression needs to be replaced with at most +// one dependency. Could be a method on Dependency. +// - ContinueOnError: continue visiting even if there are errors. +// [add more as they come up] +// + +type Config struct { + // Dynamic enables evaluting dependencies Vertex Arcs, recursively + Dynamic bool + + // Descend enables recursively descending into fields. This option is + // implied by Dynamic. + Descend bool + + // Cycles allows a Node to reported more than once. This includes the node + // passed to Visit, which is otherwise never reported. This option can be + // used to disable cycle checking. TODO: this is not yet implemented. + AllowCycles bool + + // Rootless enables reporting nodes that do not have a path from the root. + // This includes variables of comprehensions and fields of composite literal + // values that are part of expressions, such as {out: v}.out. + Rootless bool + + // TODO: + // ContinueOnError indicates whether to continue finding dependencies + // even when there are errors. + // ContinueOnError bool + + // pkg indicates the main package for which the analyzer is configured, + // which is used for reporting purposes. + Pkg *adt.ImportReference +} + // A Dependency is a reference and the node that reference resolves to. type Dependency struct { // Node is the referenced node. @@ -29,14 +117,31 @@ type Dependency struct { // Reference is the expression that referenced the node. Reference adt.Resolver + pkg *adt.ImportReference + top bool + + visitor *visitor +} + +// Recurse visits the dependencies of d.Node, using the same visit function as +// the original. +func (d *Dependency) Recurse() { + savedAll := d.visitor.all + savedTop := d.visitor.top + d.visitor.all = d.visitor.recurse + d.visitor.top = true + + d.visitor.visitReusingVisitor(d.Node, false) + + d.visitor.all = savedAll + d.visitor.top = savedTop } // Import returns the import reference or nil if the reference was within // the same package as the visited Vertex. func (d *Dependency) Import() *adt.ImportReference { - x, _ := d.Reference.(adt.Expr) - return importRef(x) + return d.pkg } // IsRoot reports whether the dependency is referenced by the root of the @@ -46,10 +151,6 @@ func (d *Dependency) IsRoot() bool { return d.top } -func (d *Dependency) Path() []adt.Feature { - return nil -} - func importRef(r adt.Expr) *adt.ImportReference { switch x := r.(type) { case *adt.ImportReference: @@ -65,54 +166,63 @@ func importRef(r adt.Expr) *adt.ImportReference { // VisitFunc is used for reporting dependencies. type VisitFunc func(Dependency) error -// Visit calls f for all vertices referenced by the conjuncts of n without -// descending into the elements of list or fields of structs. Only references -// that do not refer to the conjuncts of n itself are reported. -func Visit(c *adt.OpContext, n *adt.Vertex, f VisitFunc) error { - return visit(c, n, f, false, true) -} - -// VisitAll calls f for all vertices referenced by the conjuncts of n including -// those of descendant fields and elements. Only references that do not refer to -// the conjuncts of n itself are reported. -func VisitAll(c *adt.OpContext, n *adt.Vertex, f VisitFunc) error { - return visit(c, n, f, true, true) -} - -// VisitFields calls f for n and all its descendent arcs that have a conjunct -// that originates from a conjunct in n. Only the conjuncts of n that ended up -// as a conjunct in an actual field are visited and they are visited for each -// field in which the occurs. -func VisitFields(c *adt.OpContext, n *adt.Vertex, f VisitFunc) error { - m := marked{} - - m.markExpr(n) - - dynamic(c, n, f, m, true) - return nil -} - var empty *adt.Vertex func init() { // TODO: Consider setting a non-nil BaseValue. empty = &adt.Vertex{} - empty.UpdateStatus(adt.Finalized) + empty.ForceDone() } -func visit(c *adt.OpContext, n *adt.Vertex, f VisitFunc, all, top bool) (err error) { +var zeroConfig = &Config{} + +// Visit calls f for the dependencies of n as determined by the given +// configuration. +func Visit(cfg *Config, c *adt.OpContext, n *adt.Vertex, f VisitFunc) error { + if cfg == nil { + cfg = zeroConfig + } if c == nil { panic("nil context") } v := visitor{ - ctxt: c, - visit: f, - node: n, - all: all, - top: top, + ctxt: c, + fn: f, + pkg: cfg.Pkg, + recurse: cfg.Descend, + all: cfg.Descend, + top: true, + cfgDynamic: cfg.Dynamic, } + return v.visitReusingVisitor(n, true) +} + +// visitReusingVisitor is factored out of Visit so that we may reuse visitor. +func (v *visitor) visitReusingVisitor(n *adt.Vertex, top bool) error { + if v.cfgDynamic { + if v.marked == nil { + v.marked = marked{} + } + v.marked.markExpr(n) + + v.dynamic(n, top) + } else { + v.visit(n, top) + } + return v.err +} + +func (v *visitor) visit(n *adt.Vertex, top bool) (err error) { + savedNode := v.node + savedTop := v.top + + v.node = n + v.top = top defer func() { + v.node = savedNode + v.top = savedTop + switch x := recover(); x { case nil: case aborted: @@ -132,12 +242,33 @@ func visit(c *adt.OpContext, n *adt.Vertex, f VisitFunc, all, top bool) (err err var aborted = errors.New("aborted") type visitor struct { - ctxt *adt.OpContext - visit VisitFunc - node *adt.Vertex - err error - all bool - top bool + ctxt *adt.OpContext + fn VisitFunc + node *adt.Vertex + err error + pkg *adt.ImportReference + + // recurse indicates whether, during static analysis, to process references + // that will be unified into different fields. + recurse bool + // all indicates wether to process references that would be unified into + // different fields. This similar to recurse, but sometimes gets temporarily + // overridden to deal with special cases. + all bool + top bool + topRef adt.Resolver + pathStack []refEntry + numRefs int // count of reported dependencies + + // cfgDynamic is kept from the original config. + cfgDynamic bool + + marked marked +} + +type refEntry struct { + env *adt.Environment + ref adt.Resolver } // TODO: factor out the below logic as either a low-level dependency analyzer or @@ -145,11 +276,17 @@ type visitor struct { // markExpr visits all nodes in an expression to mark dependencies. func (c *visitor) markExpr(env *adt.Environment, expr adt.Elem) { + if expr, ok := expr.(adt.Resolver); ok { + c.markResolver(env, expr) + return + } + + saved := c.topRef + c.topRef = nil + defer func() { c.topRef = saved }() + switch x := expr.(type) { case nil: - case adt.Resolver: - c.markResolver(env, x) - case *adt.BinaryExpr: c.markExpr(env, x.X) c.markExpr(env, x.Y) @@ -207,41 +344,33 @@ func (c *visitor) markExpr(env *adt.Environment, expr adt.Elem) { for _, e := range x.Decls { c.markDecl(env, e) } + + case *adt.Comprehension: + c.markComprehension(env, x) } } // markResolve resolves dependencies. func (c *visitor) markResolver(env *adt.Environment, r adt.Resolver) { - switch x := r.(type) { - case nil: - case *adt.LetReference: - saved := c.ctxt.PushState(env, nil) - env := c.ctxt.Env(x.UpCount) - c.markExpr(env, x.X) - c.ctxt.PopState(saved) - return - } - - if ref, _ := c.ctxt.Resolve(env, r); ref != nil { - if ref != c.node && ref != empty { - d := Dependency{ - Node: ref, - Reference: r, - top: c.top, - } - if err := c.visit(d); err != nil { - c.err = err - panic(aborted) - } - } - + // Note: it is okay to pass an empty CloseInfo{} here as we assume that + // all nodes are finalized already and we need neither closedness nor cycle + // checks. + ref, _ := c.ctxt.Resolve(adt.MakeConjunct(env, r, adt.CloseInfo{}), r) + + // TODO: consider the case where an inlined composite literal does not + // resolve, but has references. For instance, {a: k, ref}.b would result + // in a failure during evaluation if b is not defined within ref. However, + // ref might still specialize to allow b. + + if ref != nil { + c.reportDependency(env, r, ref) return } // It is possible that a reference cannot be resolved because it is // incomplete. In this case, we should check whether subexpressions of the // reference can be resolved to mark those dependencies. For instance, - // prefix paths of selectors and the value or index of an index experssion + // prefix paths of selectors and the value or index of an index expression // may independently resolve to a valid dependency. switch x := r.(type) { @@ -257,6 +386,179 @@ func (c *visitor) markResolver(env *adt.Environment, r adt.Resolver) { } } +// reportDependency reports a dependency from r to v. +// v must be the value that is obtained after resolving r. +func (c *visitor) reportDependency(env *adt.Environment, ref adt.Resolver, v *adt.Vertex) { + if v == c.node || v == empty { + return + } + + reference := ref + if c.topRef == nil && len(c.pathStack) == 0 { + saved := c.topRef + c.topRef = ref + defer func() { c.topRef = saved }() + } + + // TODO: in "All" mode we still report the latest reference used, instead + // of the reference at the start of the traversal, as the self-contained + // algorithm (its only user) depends on it. + // However, if the stack is non-nil, the reference will not correctly + // reflect the substituted value, so we use the top reference instead. + if !c.recurse && len(c.pathStack) == 0 && c.topRef != nil { + reference = c.topRef + } + + if !v.Rooted() { + before := c.numRefs + c.markInternalResolvers(env, ref, v) + // TODO: this logic could probably be simplified if we let clients + // explicitly mark whether to visit rootless nodes. Visiting these + // may be necessary when substituting values. + switch _, ok := ref.(*adt.FieldReference); { + case !ok: + // Do not report rootless nodes for selectors. + return + case c.numRefs > before: + // For FieldReferences that resolve to something we do not need + // to report anything intermediate. + return + } + } + if hasLetParent(v) { + return + } + + // Expand path. + altRef := reference + for i := len(c.pathStack) - 1; i >= 0; i-- { + x := c.pathStack[i] + var w *adt.Vertex + // TODO: instead of setting the reference, the proper thing to do is + // to record a path that still needs to be selected into the recorded + // dependency. See the Target Path definition at the top of the file. + if f := c.feature(x.env, x.ref); f != 0 { + w = v.Lookup(f) + } + if w == nil { + break + } + altRef = x.ref + if i == 0 && c.topRef != nil { + altRef = c.topRef + } + v = w + } + + // All resolvers are expressions. + if p := importRef(ref.(adt.Expr)); p != nil { + savedPkg := c.pkg + c.pkg = p + defer func() { c.pkg = savedPkg }() + } + + c.numRefs++ + + d := Dependency{ + Node: v, + Reference: altRef, + pkg: c.pkg, + top: c.top, + visitor: c, + } + if err := c.fn(d); err != nil { + c.err = err + panic(aborted) + } +} + +// TODO(perf): make this available as a property of vertices to avoid doing +// work repeatedly. +func hasLetParent(v *adt.Vertex) bool { + for ; v != nil; v = v.Parent { + if v.Label.IsLet() { + return true + } + } + return false +} + +// markConjuncts transitively marks all reference of the current node. +func (c *visitor) markConjuncts(v *adt.Vertex) { + for _, x := range v.Conjuncts { + // Use Elem instead of Expr to preserve the Comprehension to, in turn, + // ensure an Environment is inserted for the Value clause. + c.markExpr(x.Env, x.Elem()) + } +} + +// markInternalResolvers marks dependencies for rootless nodes. As these +// nodes may not be visited during normal traversal, we need to be more +// proactive. For selectors and indices this means we need to evaluate their +// objects to see exactly what the selector or index refers to. +func (c *visitor) markInternalResolvers(env *adt.Environment, r adt.Resolver, v *adt.Vertex) { + if v.Rooted() { + panic("node must not be rooted") + } + + saved := c.all // recursive traversal already done by this function. + + // As lets have no path and we otherwise will not process them, we set + // processing all to true. + if c.marked != nil && hasLetParent(v) { + for _, x := range v.Conjuncts { + c.marked.markExpr(x.Expr()) + } + } + + c.markConjuncts(v) + + // evaluateInner will already process all values recursively, so disable + // while processing in this case. + c.all = false + + switch r := r.(type) { + case *adt.SelectorExpr: + c.evaluateInner(env, r.X, r) + case *adt.IndexExpr: + c.evaluateInner(env, r.X, r) + } + + c.all = saved +} + +// evaluateInner evaluates the LHS of the given selector or index expression, +// and marks all its conjuncts. The reference is pushed on a stack to mark +// the field or index that needs to be selected for any dependencies that are +// subsequently encountered. This is handled by reportDependency. +func (c *visitor) evaluateInner(env *adt.Environment, x adt.Expr, r adt.Resolver) { + value, _ := c.ctxt.Evaluate(env, x) + v, _ := value.(*adt.Vertex) + if v == nil { + return + } + // TODO(perf): one level of evaluation would suffice. + v.Finalize(c.ctxt) + + saved := len(c.pathStack) + c.pathStack = append(c.pathStack, refEntry{env, r}) + c.markConjuncts(v) + c.pathStack = c.pathStack[:saved] +} + +func (c *visitor) feature(env *adt.Environment, r adt.Resolver) adt.Feature { + switch r := r.(type) { + case *adt.SelectorExpr: + return r.Sel + case *adt.IndexExpr: + v, _ := c.ctxt.Evaluate(env, r.Index) + v = adt.Unwrap(v) + return adt.LabelFromValue(c.ctxt, r.Index, v) + default: + return adt.InvalidLabel + } +} + func (c *visitor) markSubExpr(env *adt.Environment, x adt.Expr) { if c.all { saved := c.top @@ -271,11 +573,6 @@ func (c *visitor) markDecl(env *adt.Environment, d adt.Decl) { case *adt.Field: c.markSubExpr(env, x.Value) - case *adt.OptionalField: - // when dynamic, only continue if there is evidence of - // the field in the parallel actual evaluation. - c.markSubExpr(env, x.Value) - case *adt.BulkOptionalField: c.markExpr(env, x.Filter) // when dynamic, only continue if there is evidence of @@ -302,28 +599,51 @@ func (c *visitor) markDecl(env *adt.Environment, d adt.Decl) { } func (c *visitor) markComprehension(env *adt.Environment, y *adt.Comprehension) { - env = c.markYielder(env, y.Clauses) - c.markExpr(env, y.Value) -} - -func (c *visitor) markYielder(env *adt.Environment, y adt.Yielder) *adt.Environment { - switch x := y.(type) { - case *adt.ForClause: - c.markExpr(env, x.Src) - env = &adt.Environment{Up: env, Vertex: empty} - env = c.markYielder(env, x.Dst) - // In dynamic mode, iterate over all actual value and - // evaluate. - - case *adt.LetClause: - c.markExpr(env, x.Expr) + env = c.markClauses(env, y.Clauses) + + // Use "live" environments if we have them. This is important if + // dependencies are computed on a partially evaluated value where a pushed + // down comprehension is defined outside the root of the dependency + // analysis. For instance, when analyzing dependencies at path a.b in: + // + // a: { + // for value in { test: 1 } { + // b: bar: value + // } + // } + // + if envs := y.Envs(); len(envs) > 0 { + // We use the Environment to get access to the parent chain. It + // suffices to take any Environment (in this case the first), as all + // will have the same parent chain. + env = envs[0] + } + for i := y.Nest(); i > 0; i-- { env = &adt.Environment{Up: env, Vertex: empty} - env = c.markYielder(env, x.Dst) + } + c.markExpr(env, adt.ToExpr(y.Value)) +} - case *adt.IfClause: - c.markExpr(env, x.Condition) - // In dynamic mode, only continue if condition is true. - env = c.markYielder(env, x.Dst) +func (c *visitor) markClauses(env *adt.Environment, a []adt.Yielder) *adt.Environment { + for _, y := range a { + switch x := y.(type) { + case *adt.ForClause: + c.markExpr(env, x.Src) + env = &adt.Environment{Up: env, Vertex: empty} + // In dynamic mode, iterate over all actual value and + // evaluate. + + case *adt.LetClause: + c.markExpr(env, x.Expr) + env = &adt.Environment{Up: env, Vertex: empty} + + case *adt.IfClause: + c.markExpr(env, x.Condition) + // In dynamic mode, only continue if condition is true. + + case *adt.ValueClause: + env = &adt.Environment{Up: env, Vertex: empty} + } } return env } diff --git a/vendor/cuelang.org/go/internal/core/dep/mixed.go b/vendor/cuelang.org/go/internal/core/dep/mixed.go index 073c6749..05c25912 100644 --- a/vendor/cuelang.org/go/internal/core/dep/mixed.go +++ b/vendor/cuelang.org/go/internal/core/dep/mixed.go @@ -27,10 +27,10 @@ import ( // evaluated Vertex. A more correct and more performant algorithm would be to // descend into the conjuncts and evaluate the necessary values, like fields // and comprehension sources. -func dynamic(c *adt.OpContext, n *adt.Vertex, f VisitFunc, m marked, top bool) { +func (v *visitor) dynamic(n *adt.Vertex, top bool) { found := false for _, c := range n.Conjuncts { - if m[c.Expr()] { + if v.marked[c.Expr()] { found = true break } @@ -40,12 +40,15 @@ func dynamic(c *adt.OpContext, n *adt.Vertex, f VisitFunc, m marked, top bool) { return } - if visit(c, n, f, false, top) != nil { + if v.visit(n, top) != nil { return } for _, a := range n.Arcs { - dynamic(c, a, f, m, false) + if !a.IsDefined(v.ctxt) || a.Label.IsLet() { + continue + } + v.dynamic(a, false) } } @@ -79,10 +82,10 @@ func (m marked) markExpr(x adt.Expr) { case *adt.Field: m.markExpr(x.Value) - case *adt.OptionalField: + case *adt.BulkOptionalField: m.markExpr(x.Value) - case *adt.BulkOptionalField: + case *adt.LetField: m.markExpr(x.Value) case *adt.DynamicField: @@ -127,19 +130,5 @@ func (m marked) markExpr(x adt.Expr) { } func (m marked) markComprehension(y *adt.Comprehension) { - m.markYielder(y.Clauses) - m.markExpr(y.Value) -} - -func (m marked) markYielder(y adt.Yielder) { - switch x := y.(type) { - case *adt.ForClause: - m.markYielder(x.Dst) - - case *adt.IfClause: - m.markYielder(x.Dst) - - case *adt.LetClause: - m.markYielder(x.Dst) - } + m.markExpr(adt.ToExpr(y.Value)) } diff --git a/vendor/cuelang.org/go/internal/core/eval/eval.go b/vendor/cuelang.org/go/internal/core/eval/eval.go index 07bc3ac4..8266bdf0 100644 --- a/vendor/cuelang.org/go/internal/core/eval/eval.go +++ b/vendor/cuelang.org/go/internal/core/eval/eval.go @@ -15,6 +15,7 @@ package eval import ( + "cuelang.org/go/cue/stats" "cuelang.org/go/internal/core/adt" "cuelang.org/go/internal/core/debug" ) @@ -27,7 +28,7 @@ func Evaluate(r adt.Runtime, v *adt.Vertex) { Runtime: r, Format: format, }) - c.Unify(v, adt.Finalized) + v.Finalize(c) } func New(r adt.Runtime) *Unifier { @@ -39,11 +40,7 @@ type Unifier struct { e *adt.OpContext } -func (e *Unifier) Unify(ctx *adt.OpContext, v *adt.Vertex, state adt.VertexStatus) { - e.e.Unify(v, state) -} - -func (e *Unifier) Stats() *adt.Stats { +func (e *Unifier) Stats() *stats.Counts { return e.e.Stats() } diff --git a/vendor/cuelang.org/go/internal/core/export/adt.go b/vendor/cuelang.org/go/internal/core/export/adt.go index 8e860d60..e65bc3cb 100644 --- a/vendor/cuelang.org/go/internal/core/export/adt.go +++ b/vendor/cuelang.org/go/internal/core/export/adt.go @@ -23,6 +23,7 @@ import ( "cuelang.org/go/cue/ast/astutil" "cuelang.org/go/cue/literal" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" ) @@ -34,15 +35,16 @@ func (e *exporter) ident(x adt.Feature) *ast.Ident { return ast.NewIdent(s) } -func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { +func (e *exporter) adt(env *adt.Environment, expr adt.Elem) ast.Expr { switch x := expr.(type) { case adt.Value: - return e.expr(x) + return e.expr(env, x) case *adt.ListLit: + env := &adt.Environment{Up: env, Vertex: e.node()} a := []ast.Expr{} for _, x := range x.Elems { - a = append(a, e.elem(x)) + a = append(a, e.elem(env, x)) } return ast.NewList(a...) @@ -53,6 +55,10 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { // s := e.frame(0).scope s := &ast.StructLit{} + // TODO: ensure e.node() is set in more cases. Right now it is not + // always set in mergeValues, even in cases where it could be. Better + // to be conservative for now, though. + env := &adt.Environment{Up: env, Vertex: e.node()} for _, d := range x.Decls { var a *ast.Alias @@ -65,7 +71,19 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { e.valueAlias[alias] = a } } - decl := e.decl(d) + decl := e.decl(env, d) + + // decl may be nil if it represents a let. Lets are added later, and + // only when they are still used. + if decl == nil { + continue + } + + if e.cfg.ShowDocs { + ast.SetComments(decl, filterDocs(ast.Comments(d.Source()))) + } + // TODO: use e.copyMeta for positions, but only when the original + // source is available. if a != nil { if f, ok := decl.(*ast.Field); ok { @@ -79,46 +97,14 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { return s - case *adt.FieldReference: - f := e.frame(x.UpCount) - entry := f.fields[x.Label] - - name := x.Label.IdentString(e.ctx) - switch { - case entry.alias != "": - name = entry.alias - - case !ast.IsValidIdent(name): - name = "X" - if x.Src != nil { - name = x.Src.Name - } - name = e.uniqueAlias(name) - entry.alias = name - } - - ident := ast.NewIdent(name) - entry.references = append(entry.references, ident) - - if f.fields != nil { - f.fields[x.Label] = entry - } - - return ident - - case *adt.ValueReference: - name := x.Label.IdentString(e.ctx) - if a, ok := x.Src.Node.(*ast.Alias); ok { // Should always pass - if b, ok := e.valueAlias[a]; ok { - name = b.Ident.Name - } - } - ident := ast.NewIdent(name) - return ident - + // TODO: why does LabelReference not implement resolve? case *adt.LabelReference: // get potential label from Source. Otherwise use X. + v, ok := e.ctx.Evaluate(env, x) f := e.frame(x.UpCount) + if ok && (adt.IsConcrete(v) || f.field == nil) { + return e.value(v) + } if f.field == nil { // This can happen when the LabelReference is evaluated outside of // normal evaluation, that is, if a pattern constraint or @@ -147,65 +133,22 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { ident.Node = f.labelExpr return ident - case *adt.DynamicReference: - // get potential label from Source. Otherwise use X. - name := "X" - f := e.frame(x.UpCount) - if d := f.field; d != nil { - if x.Src != nil { - name = x.Src.Name - } - name = e.getFieldAlias(d, name) - } - ident := ast.NewIdent(name) - ident.Scope = f.field - ident.Node = f.field - return ident - - case *adt.ImportReference: - importPath := x.ImportPath.StringValue(e.index) - spec := ast.NewImport(nil, importPath) - - info, _ := astutil.ParseImportSpec(spec) - name := info.PkgName - if x.Label != 0 { - name = x.Label.StringValue(e.index) - if name != info.PkgName { - spec.Name = ast.NewIdent(name) - } - } - ident := ast.NewIdent(name) - ident.Node = spec - return ident - - case *adt.LetReference: - return e.resolveLet(x) - - case *adt.SelectorExpr: - return &ast.SelectorExpr{ - X: e.expr(x.X), - Sel: e.stringLabel(x.Sel), - } - - case *adt.IndexExpr: - return &ast.IndexExpr{ - X: e.expr(x.X), - Index: e.expr(x.Index), - } + case adt.Resolver: + return e.resolve(env, x) case *adt.SliceExpr: var lo, hi ast.Expr if x.Lo != nil { - lo = e.expr(x.Lo) + lo = e.innerExpr(env, x.Lo) } if x.Hi != nil { - hi = e.expr(x.Hi) + hi = e.innerExpr(env, x.Hi) } // TODO: Stride not yet? implemented. // if x.Stride != nil { - // stride = e.expr(x.Stride) + // stride = e.innerExpr(env, x.Stride) // } - return &ast.SliceExpr{X: e.expr(x.X), Low: lo, High: hi} + return &ast.SliceExpr{X: e.innerExpr(env, x.X), Low: lo, High: hi} case *adt.Interpolation: var ( @@ -247,7 +190,7 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { suffix := `\(` for i, elem := range x.Parts { if i%2 == 1 { - t.Elts = append(t.Elts, e.expr(elem)) + t.Elts = append(t.Elts, e.innerExpr(env, elem)) } else { // b := strings.Builder{} buf := []byte(prefix) @@ -277,39 +220,39 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { case *adt.BoundExpr: return &ast.UnaryExpr{ Op: x.Op.Token(), - X: e.expr(x.Expr), + X: e.innerExpr(env, x.Expr), } case *adt.UnaryExpr: return &ast.UnaryExpr{ Op: x.Op.Token(), - X: e.expr(x.X), + X: e.innerExpr(env, x.X), } case *adt.BinaryExpr: return &ast.BinaryExpr{ Op: x.Op.Token(), - X: e.expr(x.X), - Y: e.expr(x.Y), + X: e.innerExpr(env, x.X), + Y: e.innerExpr(env, x.Y), } case *adt.CallExpr: a := []ast.Expr{} for _, arg := range x.Args { - v := e.expr(arg) + v := e.innerExpr(env, arg) if v == nil { - e.expr(arg) + e.innerExpr(env, arg) panic("") } a = append(a, v) } - fun := e.expr(x.Fun) + fun := e.innerExpr(env, x.Fun) return &ast.CallExpr{Fun: fun, Args: a} case *adt.DisjunctionExpr: a := []ast.Expr{} for _, d := range x.Values { - v := e.expr(d.Val) + v := e.expr(env, d.Val) if d.Default { v = &ast.UnaryExpr{Op: token.MUL, X: v} } @@ -317,57 +260,244 @@ func (e *exporter) adt(expr adt.Elem, conjuncts []adt.Conjunct) ast.Expr { } return ast.NewBinExpr(token.OR, a...) + case *adt.Comprehension: + if !x.DidResolve() { + return dummyTop + } + for _, c := range x.Clauses { + switch c.(type) { + case *adt.ForClause: + env = &adt.Environment{Up: env, Vertex: empty} + case *adt.IfClause: + case *adt.LetClause: + env = &adt.Environment{Up: env, Vertex: empty} + case *adt.ValueClause: + // Can occur in nested comprehenions. + env = &adt.Environment{Up: env, Vertex: empty} + default: + panic("unreachable") + } + } + + // If this is an "unwrapped" comprehension, we need to also + // account for the curly braces of the original comprehension. + if x.Nest() > 0 { + env = &adt.Environment{Up: env, Vertex: empty} + } + + return e.adt(env, adt.ToExpr(x.Value)) + default: panic(fmt.Sprintf("unknown field %T", x)) } } -func (e *exporter) decl(d adt.Decl) ast.Decl { +var dummyTop = &ast.Ident{Name: "_"} + +func (e *exporter) resolve(env *adt.Environment, r adt.Resolver) ast.Expr { + if c := e.pivotter; c != nil { + if alt := c.refExpr(r); alt != nil { + return alt + } + } + + switch x := r.(type) { + case *adt.FieldReference: + // Special case when the original CUE already had an alias. + if x.Src != nil { + if f, ok := x.Src.Node.(*ast.Field); ok { + if entry, ok := e.fieldAlias[f]; ok { + ident := ast.NewIdent(aliasFromLabel(f)) + ident.Node = entry.field + ident.Scope = entry.scope + return ident + } + } + } + + ident, _ := e.newIdentForField(x.Src, x.Label, x.UpCount) + + // Use low-level lookup to bypass structural cycle detection. This is + // fine as we do not recurse on the result and it is necessary to detect + // shadowing even when a configuration has a structural cycle. + for i := 0; i < int(x.UpCount); i++ { + env = env.Up + } + + // Exclude comprehensions and other temporary/ inlined Vertices, which + // cannot be properly resolved, throwing off the sanitize. Also, + // comprehensions originate from a single source and do not need to be + // handled. + if v := env.Vertex; !v.IsDynamic { + if v = v.Lookup(x.Label); v != nil { + e.linkIdentifier(v, ident) + } + } + + return ident + + case *adt.ValueReference: + name := x.Label.IdentString(e.ctx) + if a, ok := x.Src.Node.(*ast.Alias); ok { // Should always pass + if b, ok := e.valueAlias[a]; ok { + name = b.Ident.Name + } + } + ident := ast.NewIdent(name) + return ident + + case *adt.DynamicReference: + // TODO(unshadow): ensure we correctly unshadow newly visible fields. + // before uncommenting this. + // if v := x.EvaluateLabel(e.ctx, env); v != 0 { + // str := v.StringValue(e.ctx) + // if ast.IsValidIdent(str) { + // label := e.ctx.StringLabel(str) + // ident, ok := e.newIdentForField(x.Src, label, x.UpCount) + // if ok { + // return ident + // } + // } + // } + + name := "X" + if x.Src != nil { + name = x.Src.Name + } + var f *ast.Field + for i := len(e.stack) - 1; i >= 0; i-- { + for _, entry := range e.stack[i].dynamicFields { + if entry.alias == name { + f = entry.field + } + } + } + + if f != nil { + name = e.getFieldAlias(f, name) + } + + ident := ast.NewIdent(name) + ident.Scope = f + ident.Node = f + return ident + + case *adt.ImportReference: + importPath := x.ImportPath.StringValue(e.index) + spec := ast.NewImport(nil, importPath) + + info, _ := astutil.ParseImportSpec(spec) + name := info.PkgName + if x.Label != 0 { + name = x.Label.StringValue(e.index) + if name != info.PkgName { + spec.Name = ast.NewIdent(name) + } + } + ident := ast.NewIdent(name) + ident.Node = spec + return ident + + case *adt.LetReference: + return e.resolveLet(env, x) + + case *adt.SelectorExpr: + return &ast.SelectorExpr{ + X: e.innerExpr(env, x.X), + Sel: e.stringLabel(x.Sel), + } + + case *adt.IndexExpr: + return &ast.IndexExpr{ + X: e.innerExpr(env, x.X), + Index: e.innerExpr(env, x.Index), + } + } + panic("unreachable") +} + +func (e *exporter) newIdentForField( + orig *ast.Ident, + label adt.Feature, + upCount int32) (ident *ast.Ident, ok bool) { + f := e.frame(upCount) + entry := f.fields[label] + + name := e.identString(label) + switch { + case entry.alias != "": + name = entry.alias + + case !ast.IsValidIdent(name): + name = "X" + if orig != nil { + name = orig.Name + } + name = e.uniqueAlias(name) + entry.alias = name + } + + ident = ast.NewIdent(name) + entry.references = append(entry.references, ident) + + if f.fields != nil { + f.fields[label] = entry + ok = true + } + + return ident, ok +} + +func (e *exporter) decl(env *adt.Environment, d adt.Decl) ast.Decl { switch x := d.(type) { case adt.Elem: - return e.elem(x) + return e.elem(env, x) case *adt.Field: e.setDocs(x) - f := &ast.Field{ - Label: e.stringLabel(x.Label), - } + f := e.getFixedField(x) - frame := e.frame(0) - entry := frame.fields[x.Label] - entry.field = f - entry.node = f.Value - frame.fields[x.Label] = entry + internal.SetConstraint(f, x.ArcType.Token()) + e.setField(x.Label, f) - f.Value = e.expr(x.Value) + f.Attrs = extractFieldAttrs(nil, x) - // extractDocs(nil) - return f + st, ok := x.Value.(*adt.StructLit) + if !ok { + f.Value = e.expr(env, x.Value) + return f - case *adt.OptionalField: - e.setDocs(x) - f := &ast.Field{ - Label: e.stringLabel(x.Label), - Optional: token.NoSpace.Pos(), } - frame := e.frame(0) - entry := frame.fields[x.Label] - entry.field = f - entry.node = f.Value - frame.fields[x.Label] = entry + top := e.frame(0) + var src *adt.Vertex + if top.node != nil { + src = top.node.Lookup(x.Label) + } - f.Value = e.expr(x.Value) + // Instead of calling e.expr directly, we inline the case for + // *adt.StructLit, so that we can pass src. + c := adt.MakeRootConjunct(env, st) + f.Value = e.mergeValues(adt.InvalidLabel, src, []conjunct{{c: c, up: 0}}, c) + + if top.node != nil { + if v := top.node.Lookup(x.Label); v != nil { + e.linkField(v, f) + } + } - // extractDocs(nil) return f + case *adt.LetField: + // Handled elsewhere + return nil + case *adt.BulkOptionalField: e.setDocs(x) // set bulk in frame. frame := e.frame(0) - expr := e.expr(x.Filter) + expr := e.innerExpr(env, x.Filter) frame.labelExpr = expr // see astutil.Resolve. if x.Label != 0 { @@ -379,26 +509,59 @@ func (e *exporter) decl(d adt.Decl) ast.Decl { frame.field = f - f.Value = e.expr(x.Value) + if alias := aliasFromLabel(x.Src); alias != "" { + frame.dynamicFields = append(frame.dynamicFields, &entry{ + alias: alias, + field: f, + }) + } + + f.Value = e.expr(env, x.Value) + f.Attrs = extractFieldAttrs(nil, x) return f case *adt.DynamicField: e.setDocs(x) - key := e.expr(x.Key) - if _, ok := key.(*ast.Interpolation); !ok { - key = &ast.ParenExpr{X: key} - } - f := &ast.Field{ - Label: key.(ast.Label), + srcKey := x.Key + + f := &ast.Field{} + internal.SetConstraint(f, x.ArcType.Token()) + + v, _ := e.ctx.Evaluate(env, x.Key) + + switch s, ok := v.(*adt.String); { + // TODO(unshadow): allow once unshadowing algorithm is fixed. + // case ok && ast.IsValidIdent(s.Str): + // label := e.ctx.StringLabel(s.Str) + // f.Label = ast.NewIdent(s.Str) + // e.setField(label, f) + + case ok: + srcKey = s + + fallthrough + + default: + key := e.innerExpr(env, srcKey) + switch key.(type) { + case *ast.Interpolation, *ast.BasicLit: + default: + key = &ast.ParenExpr{X: key} + } + f.Label = key.(ast.Label) } + alias := aliasFromLabel(x.Src) + frame := e.frame(0) - frame.field = f - frame.labelExpr = key - // extractDocs(nil) + frame.dynamicFields = append(frame.dynamicFields, &entry{ + alias: alias, + field: f, + }) - f.Value = e.expr(x.Value) + f.Value = e.expr(env, x.Value) + f.Attrs = extractFieldAttrs(nil, x) return f @@ -407,44 +570,82 @@ func (e *exporter) decl(d adt.Decl) ast.Decl { } } -func (e *exporter) elem(d adt.Elem) ast.Expr { +func (e *exporter) copyMeta(dst, src ast.Node) { + if e.cfg.ShowDocs { + ast.SetComments(dst, filterDocs(ast.Comments(src))) + } + astutil.CopyPosition(dst, src) +} + +func filterDocs(a []*ast.CommentGroup) (out []*ast.CommentGroup) { + out = append(out, a...) + k := 0 + for _, c := range a { + if !c.Doc { + continue + } + out[k] = c + k++ + } + out = out[:k] + return out +} + +func (e *exporter) setField(label adt.Feature, f *ast.Field) { + frame := e.frame(0) + entry := frame.fields[label] + entry.field = f + entry.node = f.Value + // This can happen when evaluation is "pivoted". + if frame.fields != nil { + frame.fields[label] = entry + } +} + +func aliasFromLabel(src *ast.Field) string { + if src != nil { + if a, ok := src.Label.(*ast.Alias); ok { + return a.Ident.Name + } + } + return "" +} + +func (e *exporter) elem(env *adt.Environment, d adt.Elem) ast.Expr { switch x := d.(type) { case adt.Expr: - return e.expr(x) + return e.expr(env, x) case *adt.Ellipsis: t := &ast.Ellipsis{} if x.Value != nil { - t.Type = e.expr(x.Value) + t.Type = e.expr(env, x.Value) } return t case *adt.Comprehension: - return e.comprehension(x) + return e.comprehension(env, x) default: panic(fmt.Sprintf("unknown field %T", x)) } } -func (e *exporter) comprehension(comp *adt.Comprehension) *ast.Comprehension { +func (e *exporter) comprehension(env *adt.Environment, comp *adt.Comprehension) *ast.Comprehension { c := &ast.Comprehension{} - y := comp.Clauses - -loop: - for { + for _, y := range comp.Clauses { switch x := y.(type) { case *adt.ForClause: + env = &adt.Environment{Up: env, Vertex: empty} value := e.ident(x.Value) - clause := &ast.ForClause{ - Value: value, - Source: e.expr(x.Src), - } + src := e.innerExpr(env, x.Src) + clause := &ast.ForClause{Value: value, Source: src} + e.copyMeta(clause, x.Syntax) c.Clauses = append(c.Clauses, clause) - _, saved := e.pushFrame(nil) + _, saved := e.pushFrame(empty, nil) defer e.popFrame(saved) if x.Key != adt.InvalidLabel || @@ -455,36 +656,44 @@ loop: } e.addField(x.Value, nil, clause) - y = x.Dst - case *adt.IfClause: - clause := &ast.IfClause{Condition: e.expr(x.Condition)} + cond := e.innerExpr(env, x.Condition) + clause := &ast.IfClause{Condition: cond} + e.copyMeta(clause, x.Src) c.Clauses = append(c.Clauses, clause) - y = x.Dst case *adt.LetClause: + env = &adt.Environment{Up: env, Vertex: empty} + expr := e.innerExpr(env, x.Expr) clause := &ast.LetClause{ Ident: e.ident(x.Label), - Expr: e.expr(x.Expr), + Expr: expr, } + e.copyMeta(clause, x.Src) c.Clauses = append(c.Clauses, clause) - _, saved := e.pushFrame(nil) + _, saved := e.pushFrame(empty, nil) defer e.popFrame(saved) e.addField(x.Label, nil, clause) - y = x.Dst - case *adt.ValueClause: - break loop + // Can occur in nested comprehenions. + env = &adt.Environment{Up: env, Vertex: empty} default: panic(fmt.Sprintf("unknown field %T", x)) } } + e.copyMeta(c, comp.Syntax) + + // If this is an "unwrapped" comprehension, we need to also + // account for the curly braces of the original comprehension. + if comp.Nest() > 0 { + env = &adt.Environment{Up: env, Vertex: empty} + } - v := e.expr(comp.Value) + v := e.expr(env, adt.ToExpr(comp.Value)) if _, ok := v.(*ast.StructLit); !ok { v = ast.NewStruct(ast.Embed(v)) } diff --git a/vendor/cuelang.org/go/internal/core/export/bounds.go b/vendor/cuelang.org/go/internal/core/export/bounds.go index 71788a9d..90140e26 100644 --- a/vendor/cuelang.org/go/internal/core/export/bounds.go +++ b/vendor/cuelang.org/go/internal/core/export/bounds.go @@ -17,7 +17,7 @@ package export import ( "cuelang.org/go/cue/ast" "cuelang.org/go/internal/core/adt" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" ) // boundSimplifier simplifies bound values into predeclared identifiers, if @@ -131,10 +131,10 @@ func (s *boundSimplifier) expr(ctx *adt.OpContext) (e ast.Expr) { } if s.min != nil { - e = wrapBin(e, s.e.expr(s.min), adt.AndOp) + e = wrapBin(e, s.e.expr(nil, s.min), adt.AndOp) } if s.max != nil { - e = wrapBin(e, s.e.expr(s.max), adt.AndOp) + e = wrapBin(e, s.e.expr(nil, s.max), adt.AndOp) } return e } diff --git a/vendor/cuelang.org/go/internal/core/export/export.go b/vendor/cuelang.org/go/internal/core/export/export.go index cfac7206..0d132650 100644 --- a/vendor/cuelang.org/go/internal/core/export/export.go +++ b/vendor/cuelang.org/go/internal/core/export/export.go @@ -57,9 +57,14 @@ type Profile struct { // Use unevaluated conjuncts for these error types // IgnoreRecursive - // TODO: recurse over entire tree to determine transitive closure - // of what needs to be printed. - // IncludeDependencies bool + // SelfContained exports a schema such that it does not rely on any imports. + SelfContained bool + + // AddPackage causes a package clause to be added. + AddPackage bool + + // InlineImports expands references to non-builtin packages. + InlineImports bool } var Simplified = &Profile{ @@ -78,6 +83,7 @@ var Raw = &Profile{ ShowDefinitions: true, ShowHidden: true, ShowDocs: true, + AddPackage: true, } var All = &Profile{ @@ -87,29 +93,48 @@ var All = &Profile{ ShowHidden: true, ShowDocs: true, ShowAttributes: true, + AddPackage: true, } // Concrete // Def exports v as a definition. +// It resolves references that point outside any of the vertices in v. func Def(r adt.Runtime, pkgID string, v *adt.Vertex) (*ast.File, errors.Error) { return All.Def(r, pkgID, v) } // Def exports v as a definition. -func (p *Profile) Def(r adt.Runtime, pkgID string, v *adt.Vertex) (*ast.File, errors.Error) { +// It resolves references that point outside any of the vertices in v. +func (p *Profile) Def(r adt.Runtime, pkgID string, v *adt.Vertex) (f *ast.File, err errors.Error) { e := newExporter(p, r, pkgID, v) - e.markUsedFeatures(v) + e.initPivot(v) isDef := v.IsRecursivelyClosed() if isDef { e.inDefinition++ } - expr := e.expr(v) + expr := e.expr(nil, v) - if isDef { + switch isDef { + case true: e.inDefinition-- + + // This eliminates the need to wrap in _#def in the most common cases, + // while ensuring only one level of _#def wrapping is ever used. + if st, ok := expr.(*ast.StructLit); ok { + for _, elem := range st.Elts { + if d, ok := elem.(*ast.EmbedDecl); ok { + if isDefinitionReference(d.Expr) { + return e.finalize(v, expr) + } + } + } + } + + // TODO: embed an empty definition instead once we verify that this + // preserves semantics. if v.Kind() == adt.StructKind { expr = ast.NewStruct( ast.Embed(ast.NewIdent("_#def")), @@ -117,45 +142,68 @@ func (p *Profile) Def(r adt.Runtime, pkgID string, v *adt.Vertex) (*ast.File, er ) } } - return e.toFile(v, expr) + + return e.finalize(v, expr) +} + +func isDefinitionReference(x ast.Expr) bool { + switch x := x.(type) { + case *ast.Ident: + if internal.IsDef(x.Name) { + return true + } + case *ast.SelectorExpr: + if internal.IsDefinition(x.Sel) { + return true + } + return isDefinitionReference(x.X) + case *ast.IndexExpr: + return isDefinitionReference(x.X) + } + return false } +// Expr exports the given unevaluated expression (schema mode). +// It does not resolve references that point outside the given expression. func Expr(r adt.Runtime, pkgID string, n adt.Expr) (ast.Expr, errors.Error) { return Simplified.Expr(r, pkgID, n) } +// Expr exports the given unevaluated expression (schema mode). +// It does not resolve references that point outside the given expression. func (p *Profile) Expr(r adt.Runtime, pkgID string, n adt.Expr) (ast.Expr, errors.Error) { e := newExporter(p, r, pkgID, nil) - e.markUsedFeatures(n) - return e.expr(n), nil + return e.expr(nil, n), nil } -func (e *exporter) toFile(v *adt.Vertex, x ast.Expr) (*ast.File, errors.Error) { +func (e *exporter) toFile(v *adt.Vertex, x ast.Expr) *ast.File { f := &ast.File{} - pkgName := "" - pkg := &ast.Package{} - for _, c := range v.Conjuncts { - f, _ := c.Source().(*ast.File) - if f == nil { - continue - } + if e.cfg.AddPackage { + pkgName := "" + pkg := &ast.Package{} + for _, c := range v.Conjuncts { + f, _ := c.Source().(*ast.File) + if f == nil { + continue + } - if _, name, _ := internal.PackageInfo(f); name != "" { - pkgName = name - } + if _, name, _ := internal.PackageInfo(f); name != "" { + pkgName = name + } - if e.cfg.ShowDocs { - if doc := internal.FileComment(f); doc != nil { - ast.AddComment(pkg, doc) + if e.cfg.ShowDocs { + if doc := internal.FileComment(f); doc != nil { + ast.AddComment(pkg, doc) + } } } - } - if pkgName != "" { - pkg.Name = ast.NewIdent(pkgName) - f.Decls = append(f.Decls, pkg) + if pkgName != "" { + pkg.Name = ast.NewIdent(pkgName) + f.Decls = append(f.Decls, pkg) + } } switch st := x.(type) { @@ -168,46 +216,39 @@ func (e *exporter) toFile(v *adt.Vertex, x ast.Expr) (*ast.File, errors.Error) { default: f.Decls = append(f.Decls, &ast.EmbedDecl{Expr: x}) } - if err := astutil.Sanitize(f); err != nil { - err := errors.Promote(err, "export") - return f, errors.Append(e.errs, err) - } - return f, nil + return f } -// File - +// Vertex exports evaluated values (data mode). +// It resolves incomplete references that point outside the current context. func Vertex(r adt.Runtime, pkgID string, n *adt.Vertex) (*ast.File, errors.Error) { return Simplified.Vertex(r, pkgID, n) } -func (p *Profile) Vertex(r adt.Runtime, pkgID string, n *adt.Vertex) (*ast.File, errors.Error) { - e := exporter{ - ctx: eval.NewContext(r, nil), - cfg: p, - index: r, - pkgID: pkgID, - } - e.markUsedFeatures(n) - v := e.value(n, n.Conjuncts...) +// Vertex exports evaluated values (data mode). +// It resolves incomplete references that point outside the current context. +func (p *Profile) Vertex(r adt.Runtime, pkgID string, n *adt.Vertex) (f *ast.File, err errors.Error) { + e := newExporter(p, r, pkgID, n) + e.initPivot(n) - return e.toFile(n, v) + v := e.value(n, n.Conjuncts...) + return e.finalize(n, v) } +// Value exports evaluated values (data mode). +// It does not resolve references that point outside the given Value. func Value(r adt.Runtime, pkgID string, n adt.Value) (ast.Expr, errors.Error) { return Simplified.Value(r, pkgID, n) } -// Should take context. +// Value exports evaluated values (data mode). +// +// It does not resolve references that point outside the given Value. +// +// TODO: Should take context. func (p *Profile) Value(r adt.Runtime, pkgID string, n adt.Value) (ast.Expr, errors.Error) { - e := exporter{ - ctx: eval.NewContext(r, nil), - cfg: p, - index: r, - pkgID: pkgID, - } - e.markUsedFeatures(n) + e := newExporter(p, r, pkgID, n) v := e.value(n) return v, e.errs } @@ -225,28 +266,121 @@ type exporter struct { stack []frame inDefinition int // for close() wrapping. + inExpression int // for inlining decisions. // hidden label handling - pkgID string - hidden map[string]adt.Feature // adt.InvalidFeatures means more than one. + pkgID string + // pkgHash is used when mangling hidden identifiers of packages that are + // inlined. + pkgHash map[string]string // If a used feature maps to an expression, it means it is assigned to a // unique let expression. usedFeature map[adt.Feature]adt.Expr labelAlias map[adt.Expr]adt.Feature valueAlias map[*ast.Alias]*ast.Alias - letAlias map[*ast.LetClause]*ast.LetClause + // fieldAlias is used to track original alias names of regular fields. + fieldAlias map[*ast.Field]fieldAndScope + letAlias map[*ast.LetClause]*ast.LetClause + references map[*adt.Vertex]*referenceInfo usedHidden map[string]bool + + pivotter *pivotter +} + +type fieldAndScope struct { + field *ast.Field + scope ast.Node // StructLit or File } -func newExporter(p *Profile, r adt.Runtime, pkgID string, v *adt.Vertex) *exporter { - return &exporter{ +// referenceInfo is used to track which Field.Value fields should be linked +// to Ident.Node fields. The Node field is used by astutil.Resolve to mark +// the value in the AST to which the respective identifier points. +// astutil.Sanitize, in turn, uses this information to determine whether +// a reference is shadowed and apply fixes accordingly. +type referenceInfo struct { + field *ast.Field + references []*ast.Ident +} + +// linkField reports the Field that represents certain Vertex in the generated +// output. The Node fields for any references (*ast.Ident) that were already +// recorded as pointed to this vertex are updated accordingly. +func (e *exporter) linkField(v *adt.Vertex, f *ast.Field) { + if v == nil { + return + } + refs := e.references[v] + if refs == nil { + // TODO(perf): do a first sweep to only mark referenced arcs or keep + // track of that information elsewhere. + e.references[v] = &referenceInfo{field: f} + return + } + for _, r := range refs.references { + r.Node = f.Value + } + refs.references = refs.references[:0] +} + +// linkIdentifier reports the Vertex to which indent points. Once the ast.Field +// for a corresponding Vertex is known, it is linked to ident. +func (e *exporter) linkIdentifier(v *adt.Vertex, ident *ast.Ident) { + refs := e.references[v] + if refs == nil { + refs = &referenceInfo{} + e.references[v] = refs + } + if refs.field == nil { + refs.references = append(refs.references, ident) + return + } + ident.Node = refs.field.Value +} + +// newExporter creates and initializes an exporter. +func newExporter(p *Profile, r adt.Runtime, pkgID string, v adt.Value) *exporter { + n, _ := v.(*adt.Vertex) + e := &exporter{ cfg: p, - ctx: eval.NewContext(r, v), + ctx: eval.NewContext(r, n), index: r, pkgID: pkgID, + + references: map[*adt.Vertex]*referenceInfo{}, } + + e.markUsedFeatures(v) + + return e +} + +// initPivot initializes the pivotter to allow aligning a configuration around +// a new root, if needed. +func (e *exporter) initPivot(n *adt.Vertex) { + if !e.cfg.InlineImports && + !e.cfg.SelfContained && + n.Parent == nil { + return + } + + e.initPivotter(n) +} + +// finalize finalizes the result of an export. It is only needed for use cases +// that require conversion to a File, Sanitization, and self containment. +func (e *exporter) finalize(n *adt.Vertex, v ast.Expr) (f *ast.File, err errors.Error) { + f = e.toFile(n, v) + + e.completePivot(f) + + if err := astutil.Sanitize(f); err != nil { + err := errors.Promote(err, "export") + return f, errors.Append(e.errs, err) + } + + return f, nil } func (e *exporter) markUsedFeatures(x adt.Expr) { @@ -305,23 +439,28 @@ func (e *exporter) getFieldAlias(f *ast.Field, name string) string { func setFieldAlias(f *ast.Field, name string) { if _, ok := f.Label.(*ast.Alias); !ok { + x := f.Label.(ast.Expr) f.Label = &ast.Alias{ Ident: ast.NewIdent(name), - Expr: f.Label.(ast.Expr), + Expr: x, } + ast.SetComments(f.Label, ast.Comments(x)) + ast.SetComments(x, nil) + // TODO: move position information. } } -func (e *exporter) markLets(n ast.Node) { +func (e *exporter) markLets(n ast.Node, scope *ast.StructLit) { if n == nil { return } ast.Walk(n, func(n ast.Node) bool { switch v := n.(type) { case *ast.StructLit: - e.markLetDecls(v.Elts) + e.markLetDecls(v.Elts, scope) case *ast.File: - e.markLetDecls(v.Decls) + e.markLetDecls(v.Decls, scope) + // TODO: return true here and false for everything else? case *ast.Field, *ast.LetClause, @@ -334,12 +473,55 @@ func (e *exporter) markLets(n ast.Node) { }, nil) } -func (e *exporter) markLetDecls(decls []ast.Decl) { +func (e *exporter) markLetDecls(decls []ast.Decl, scope *ast.StructLit) { for _, d := range decls { - if let, ok := d.(*ast.LetClause); ok { - e.markLetAlias(let) + switch x := d.(type) { + case *ast.Field: + e.prepareAliasedField(x, scope) + case *ast.LetClause: + e.markLetAlias(x) + } + } +} + +// prepareAliasField creates an aliased ast.Field. It is done so before +// recursively processing any of the fields so that a processed field that +// occurs earlier in a struct can already refer to it. +// +// It is assumed that the same alias names can be used. We rely on Sanitize +// to do any renaming of aliases in case of shadowing. +func (e *exporter) prepareAliasedField(f *ast.Field, scope ast.Node) { + if _, ok := e.fieldAlias[f]; ok { + return + } + + alias, ok := f.Label.(*ast.Alias) + if !ok { + return // not aliased + } + field := &ast.Field{ + Label: &ast.Alias{ + Ident: ast.NewIdent(alias.Ident.Name), + Expr: alias.Expr, + }, + } + + if e.fieldAlias == nil { + e.fieldAlias = make(map[*ast.Field]fieldAndScope) + } + + e.fieldAlias[f] = fieldAndScope{field: field, scope: scope} +} + +func (e *exporter) getFixedField(f *adt.Field) *ast.Field { + if f.Src != nil { + if entry, ok := e.fieldAlias[f.Src]; ok { + return entry.field } } + return &ast.Field{ + Label: e.stringLabel(f.Label), + } } // markLetAlias inserts an uninitialized let clause into the current scope. @@ -373,19 +555,31 @@ func filterUnusedLets(s *ast.StructLit) { // resolveLet actually parses the let expression. // If there was no recorded let expression, it expands the expression in place. -func (e *exporter) resolveLet(x *adt.LetReference) ast.Expr { +func (e *exporter) resolveLet(env *adt.Environment, x *adt.LetReference) ast.Expr { letClause, _ := x.Src.Node.(*ast.LetClause) let := e.letAlias[letClause] switch { case let == nil: - return e.expr(x.X) + ref, _ := e.ctx.Lookup(env, x) + if ref == nil { + // This can happen if x.X does not resolve to a valid value. At this + // point we will not get a valid configuration. + + // TODO: get rid of the use of x.X. + // str := x.Label.IdentString(e.ctx) + // ident := ast.NewIdent(str) + // return ident + + return e.expr(env, x.X) + } + return e.expr(env, ref.Conjuncts[0].Expr()) case let.Expr == nil: label := e.uniqueLetIdent(x.Label, x.X) let.Ident = e.ident(label) - let.Expr = e.expr(x.X) + let.Expr = e.expr(env, x.X) } ident := ast.NewIdent(let.Ident.Name) @@ -416,6 +610,29 @@ func (e *exporter) uniqueAlias(name string) string { return name } +// A featureSet implements a set of Features. It only supports testing +// whether a given string is available as a Feature. +type featureSet interface { + // intn returns a pseudo-random integer in [0..n). + intn(n int) int + + // makeFeature converts s to f if it is available. + makeFeature(s string) (f adt.Feature, ok bool) +} + +func (e *exporter) intn(n int) int { + return e.rand.Intn(n) +} + +func (e *exporter) makeFeature(s string) (f adt.Feature, ok bool) { + f = adt.MakeIdentLabel(e.ctx, s, "") + _, exists := e.usedFeature[f] + if !exists { + e.usedFeature[f] = nil + } + return f, !exists +} + // uniqueFeature returns a name for an identifier that uniquely identifies // the given expression. If the preferred name is already taken, a new globally // unique name of the form base_X ... base_XXXXXXXXXXXXXX is generated. @@ -423,18 +640,22 @@ func (e *exporter) uniqueAlias(name string) string { // It prefers short extensions over large ones, while ensuring the likelihood of // fast termination is high. There are at least two digits to make it visually // clearer this concerns a generated number. -// func (e *exporter) uniqueFeature(base string) (f adt.Feature, name string) { if e.rand == nil { e.rand = rand.New(rand.NewSource(808)) } + return findUnique(e, base) +} + +func findUnique(set featureSet, base string) (f adt.Feature, name string) { + if f, ok := set.makeFeature(base); ok { + return f, base + } // Try the first few numbers in sequence. for i := 1; i < 5; i++ { name := fmt.Sprintf("%s_%01X", base, i) - f := adt.MakeIdentLabel(e.ctx, name, "") - if _, ok := e.usedFeature[f]; !ok { - e.usedFeature[f] = nil + if f, ok := set.makeFeature(name); ok { return f, name } } @@ -443,11 +664,9 @@ func (e *exporter) uniqueFeature(base string) (f adt.Feature, name string) { const shift = 4 // rate of growth digits := 1 for n := int64(0x10); ; n = int64(mask&((n<= 0; i-- { f := &(e.stack[i]) diff --git a/vendor/cuelang.org/go/internal/core/export/expr.go b/vendor/cuelang.org/go/internal/core/export/expr.go index c8d7a129..a66088a2 100644 --- a/vendor/cuelang.org/go/internal/core/export/expr.go +++ b/vendor/cuelang.org/go/internal/core/export/expr.go @@ -20,6 +20,7 @@ import ( "cuelang.org/go/cue/ast" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" ) @@ -47,7 +48,26 @@ import ( // a common root and prefixing that to the reference. This is now possible // with the Environment construct and could be done later. -func (e *exporter) expr(v adt.Elem) (result ast.Expr) { +var empty *adt.Vertex + +func init() { + // TODO: Consider setting a non-nil BaseValue. + empty = &adt.Vertex{} + empty.ForceDone() +} + +// innerExpr is like expr, but prohibits inlining in certain cases. +func (e *exporter) innerExpr(env *adt.Environment, v adt.Elem) (result ast.Expr) { + e.inExpression++ + r := e.expr(env, v) + e.inExpression-- + return r +} + +// expr converts an ADT expression to an AST expression. +// The env is used for resolution and does not need to be given if v is known +// to not contain any references. +func (e *exporter) expr(env *adt.Environment, v adt.Elem) (result ast.Expr) { switch x := v.(type) { case nil: return nil @@ -60,20 +80,23 @@ func (e *exporter) expr(v adt.Elem) (result ast.Expr) { a := []conjunct{} for _, c := range x.Conjuncts { + if c, ok := c.Elem().(*adt.Comprehension); ok && !c.DidResolve() { + continue + } a = append(a, conjunct{c, 0}) } return e.mergeValues(adt.InvalidLabel, x, a, x.Conjuncts...) case *adt.StructLit: - c := adt.MakeRootConjunct(nil, x) + c := adt.MakeRootConjunct(env, x) return e.mergeValues(adt.InvalidLabel, nil, []conjunct{{c: c, up: 0}}, c) case adt.Value: return e.value(x) // Use conjuncts. default: - return e.adt(v, nil) + return e.adt(env, v) } } @@ -91,7 +114,7 @@ func (x *exporter) mergeValues(label adt.Feature, src *adt.Vertex, a []conjunct, attrs: []*ast.Attribute{}, } - s, saved := e.pushFrame(orig) + s, saved := e.pushFrame(src, orig) defer e.popFrame(saved) // Handle value aliases and lets @@ -110,7 +133,7 @@ func (x *exporter) mergeValues(label adt.Feature, src *adt.Vertex, a []conjunct, e.valueAlias[a] = valueAlias } } - x.markLets(c.c.Expr().Source()) + x.markLets(c.c.Expr().Source(), s) } defer filterUnusedLets(s) @@ -134,6 +157,7 @@ func (x *exporter) mergeValues(label adt.Feature, src *adt.Vertex, a []conjunct, for _, a := range src.Arcs { if x, ok := e.fields[a.Label]; ok { x.arc = a + x.arcType = a.ArcType e.fields[a.Label] = x } } @@ -207,7 +231,10 @@ func (x *exporter) mergeValues(label adt.Feature, src *adt.Vertex, a []conjunct, } for _, f := range fields { - field := e.fields[f] + if f.IsLet() { + continue + } + field := e.getField(f) c := field.conjuncts label := e.stringLabel(f) @@ -232,20 +259,20 @@ func (x *exporter) mergeValues(label adt.Feature, src *adt.Vertex, a []conjunct, d.Value = e.mergeValues(f, field.arc, c, a...) + e.linkField(field.arc, d) + if f.IsDef() { x.inDefinition-- } - if isOptional(a) { - d.Optional = token.Blank.Pos() - } + internal.SetConstraint(d, field.arcType.Token()) if x.cfg.ShowDocs { docs := extractDocs(src, a) ast.SetComments(d, docs) } if x.cfg.ShowAttributes { for _, c := range a { - d.Attrs = extractFieldAttrs(d.Attrs, c) + d.Attrs = extractFieldAttrs(d.Attrs, c.Field()) } } s.Elts = append(s.Elts, d) @@ -292,6 +319,14 @@ type conjuncts struct { isData bool } +func (c *conjuncts) getField(label adt.Feature) field { + f, ok := c.fields[label] + if !ok { + f.arcType = adt.ArcNotPresent + } + return f +} + func (c *conjuncts) addValueConjunct(src *adt.Vertex, env *adt.Environment, x adt.Elem) { switch b, ok := x.(adt.BaseValue); { case ok && src != nil && isTop(b) && !isTop(src.BaseValue): @@ -301,8 +336,12 @@ func (c *conjuncts) addValueConjunct(src *adt.Vertex, env *adt.Environment, x ad } } -func (c *conjuncts) addConjunct(f adt.Feature, env *adt.Environment, n adt.Node) { - x := c.fields[f] +func (c *conjuncts) addConjunct(f adt.Feature, t adt.ArcType, env *adt.Environment, n adt.Node) { + x := c.getField(f) + if t < x.arcType { + x.arcType = t + } + v := adt.MakeRootConjunct(env, n) x.conjuncts = append(x.conjuncts, conjunct{ c: v, @@ -313,6 +352,7 @@ func (c *conjuncts) addConjunct(f adt.Feature, env *adt.Environment, n adt.Node) } type field struct { + arcType adt.ArcType docs []*ast.CommentGroup arc *adt.Vertex conjuncts []conjunct @@ -332,10 +372,10 @@ func (e *conjuncts) addExpr(env *adt.Environment, src *adt.Vertex, x adt.Elem, i e.attrs = extractDeclAttrs(e.attrs, x.Src) } - // Only add if it only has no bulk fields or elipsis. + // Only add if it only has no bulk fields or ellipsis. if isComplexStruct(x) { - _, saved := e.pushFrame(nil) - e.embed = append(e.embed, e.adt(x, nil)) + _, saved := e.pushFrame(src, nil) + e.embed = append(e.embed, e.adt(env, x)) e.top().upCount-- // not necessary, but for proper form e.popFrame(saved) return @@ -343,14 +383,18 @@ func (e *conjuncts) addExpr(env *adt.Environment, src *adt.Vertex, x adt.Elem, i // Used for sorting. e.structs = append(e.structs, &adt.StructInfo{StructLit: x, Env: env}) + env = &adt.Environment{Up: env, Vertex: e.node()} + for _, d := range x.Decls { var label adt.Feature + t := adt.ArcNotPresent switch f := d.(type) { case *adt.Field: label = f.Label - case *adt.OptionalField: - // TODO: mark optional here. - label = f.Label + t = f.ArcType + // TODO: mark optional here, if needed. + case *adt.LetField: + continue case *adt.Ellipsis: e.hasEllipsis = true continue @@ -362,7 +406,7 @@ func (e *conjuncts) addExpr(env *adt.Environment, src *adt.Vertex, x adt.Elem, i default: panic(fmt.Sprintf("Unexpected type %T", d)) } - e.addConjunct(label, env, d) + e.addConjunct(label, t, env, d) } e.top().upCount-- @@ -397,7 +441,11 @@ func (e *conjuncts) addExpr(env *adt.Environment, src *adt.Vertex, x adt.Elem, i for _, a := range v.Arcs { a.Finalize(e.ctx) // TODO: should we do this? - e.addConjunct(a.Label, env, a) + if !a.IsDefined(e.ctx) { + continue + } + + e.addConjunct(a.Label, a.ArcType, env, a) } } } @@ -411,9 +459,9 @@ func (e *conjuncts) addExpr(env *adt.Environment, src *adt.Vertex, x adt.Elem, i e.addValueConjunct(src, env, x) default: if isEmbed { - e.embed = append(e.embed, e.expr(x)) + e.embed = append(e.embed, e.expr(env, x)) } else { - e.conjuncts = append(e.conjuncts, e.expr(x)) + e.conjuncts = append(e.conjuncts, e.expr(env, x)) } } @@ -422,9 +470,11 @@ func (e *conjuncts) addExpr(env *adt.Environment, src *adt.Vertex, x adt.Elem, i case isSelfContained(x): e.addValueConjunct(src, env, x) case isEmbed: - e.embed = append(e.embed, e.expr(x)) + e.embed = append(e.embed, e.expr(env, x)) default: - e.conjuncts = append(e.conjuncts, e.expr(x)) + if x := e.expr(env, x); x != dummyTop { + e.conjuncts = append(e.conjuncts, x) + } } } } @@ -440,28 +490,6 @@ func isTop(x adt.BaseValue) bool { } } -// TODO: find a better way to annotate optionality. Maybe a special conjunct -// or store it in the field information? -func isOptional(a []adt.Conjunct) bool { - if len(a) == 0 { - return false - } - for _, c := range a { - if v, ok := c.Elem().(*adt.Vertex); ok && !v.IsData() && len(v.Conjuncts) > 0 { - return isOptional(v.Conjuncts) - } - switch f := c.Source().(type) { - case nil: - return false - case *ast.Field: - if f.Optional == token.NoPos { - return false - } - } - } - return true -} - func isComplexStruct(s *adt.StructLit) bool { for _, d := range s.Decls { switch x := d.(type) { @@ -474,12 +502,7 @@ func isComplexStruct(s *adt.StructLit) bool { } } - case *adt.OptionalField: - if x.Src != nil { - if _, ok := x.Src.Label.(*ast.Alias); ok { - return ok - } - } + case *adt.LetField: case adt.Expr: diff --git a/vendor/cuelang.org/go/internal/core/export/extract.go b/vendor/cuelang.org/go/internal/core/export/extract.go index 0a0d7d94..087da045 100644 --- a/vendor/cuelang.org/go/internal/core/export/extract.go +++ b/vendor/cuelang.org/go/internal/core/export/extract.go @@ -26,9 +26,8 @@ import ( // Comments are attached to a field with a field shorthand belong to the // child node. So in the following the comment is attached to field bar. // -// // comment -// foo: bar: 2 -// +// // comment +// foo: bar: 2 func ExtractDoc(v *adt.Vertex) (docs []*ast.CommentGroup) { return extractDocs(v, v.Conjuncts) } @@ -38,12 +37,13 @@ func extractDocs(v *adt.Vertex, a []adt.Conjunct) (docs []*ast.CommentGroup) { // Collect docs directly related to this Vertex. for _, x := range a { + // TODO: Is this still being used? if v, ok := x.Elem().(*adt.Vertex); ok { docs = append(docs, extractDocs(v, v.Conjuncts)...) continue } - switch f := x.Source().(type) { + switch f := x.Field().Source().(type) { case *ast.Field: if hasShorthandValue(f) { continue @@ -98,8 +98,7 @@ func extractDocs(v *adt.Vertex, a []adt.Conjunct) (docs []*ast.CommentGroup) { // hasShorthandValue reports whether this field has a struct value that will // be rendered as a shorthand, for instance: // -// f: g: 2 -// +// f: g: 2 func hasShorthandValue(f *ast.Field) bool { if f = nestedField(f); f == nil { return false @@ -146,13 +145,18 @@ func containsDoc(a []*ast.CommentGroup, cg *ast.CommentGroup) bool { func ExtractFieldAttrs(v *adt.Vertex) (attrs []*ast.Attribute) { for _, x := range v.Conjuncts { - attrs = extractFieldAttrs(attrs, x) + attrs = extractFieldAttrs(attrs, x.Field()) } return attrs } -func extractFieldAttrs(attrs []*ast.Attribute, c adt.Conjunct) []*ast.Attribute { - if f, ok := c.Source().(*ast.Field); ok { +// extractFieldAttrs extracts the fields from n and appends unique entries to +// attrs. +// +// The value of n should be obtained from the Conjunct.Field method if the +// source for n is a Conjunct so that Comprehensions are properly unwrapped. +func extractFieldAttrs(attrs []*ast.Attribute, n adt.Node) []*ast.Attribute { + if f, ok := n.Source().(*ast.Field); ok { for _, a := range f.Attrs { if !containsAttr(attrs, a) { attrs = append(attrs, a) diff --git a/vendor/cuelang.org/go/internal/core/export/label.go b/vendor/cuelang.org/go/internal/core/export/label.go index 4e62d9e6..204912b5 100644 --- a/vendor/cuelang.org/go/internal/core/export/label.go +++ b/vendor/cuelang.org/go/internal/core/export/label.go @@ -15,6 +15,9 @@ package export import ( + "crypto/md5" + "fmt" + "io" "strconv" "strings" @@ -31,7 +34,7 @@ func (e *exporter) stringLabel(f adt.Feature) ast.Label { return ast.NewLit(token.INT, strconv.Itoa(int(x))) case adt.DefinitionLabel, adt.HiddenLabel, adt.HiddenDefinitionLabel: - s := f.IdentString(e.ctx) + s := e.identString(f) return ast.NewIdent(s) case adt.StringLabel: @@ -46,3 +49,58 @@ func (e *exporter) stringLabel(f adt.Feature) ast.Label { return ast.NewIdent(e.ctx.IndexToString(int64(x))) } } + +// identString converts the given Feature f to an identifier string. +// +// Hidden field mangling: +// +// If f is a hidden field that comes from an expanded package, it will mangle +// the name by expending it with the MD5 hash of the package name. This is to +// avoid collisions of the hidden identifiers when namespaces are merged. +// It uses the MD5 hash to allow hidden fields from the same package to +// still match across inlining and unifications. +// +// TODO: Alternatives approaches to consider: +// 1. Rewrite to unique hidden field names. This means, though, that hidden +// fields may not match across unifications. That may be okay. +// 2. Force inline hidden fields from such packages, or translate them to let +// expressions when necessary. This should generally preserve semantics +// quite well. +// 3. Allow addressing hidden fields across packages, for instance by allowing +// `_(hiddenField, pkg: "import/path")`. This kind of defeats the purpose +// of hidden fields, though. +// +// Option 2 seems the best long-term solution. It should be possible to +// piggyback on the self containment algorithm for this: basically, whenever +// we see a hidden reference of an inlined package, we treat it as an +// external reference itself. +// +// For now, as this only can occur when the InlineImports feature is used, +// we use this simpler approach. +func (e *exporter) identString(f adt.Feature) string { + s := f.IdentString(e.ctx) + + if !f.IsHidden() || !e.cfg.InlineImports { + return s + } + + pkg := f.PkgID(e.ctx) + if pkg == "" || pkg == "_" || pkg == e.pkgID { + return s + } + + if e.pkgHash == nil { + e.pkgHash = map[string]string{} + } + id, ok := e.pkgHash[pkg] + if !ok { + h := md5.New() + io.WriteString(h, pkg) + b := h.Sum(nil) + id = fmt.Sprintf("_%8X", b[:4]) + e.pkgHash[pkg] = id + } + s += id + + return s +} diff --git a/vendor/cuelang.org/go/internal/core/export/self.go b/vendor/cuelang.org/go/internal/core/export/self.go new file mode 100644 index 00000000..b55f51f6 --- /dev/null +++ b/vendor/cuelang.org/go/internal/core/export/self.go @@ -0,0 +1,471 @@ +// Copyright 2022 CUE Authors +// +// 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. + +package export + +import ( + "fmt" + "strconv" + "strings" + + "cuelang.org/go/cue/ast" + "cuelang.org/go/cue/token" + "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/core/dep" +) + +// This file contains the algorithm to contain a self-contained CUE file. + +// TODO: +// - Handle below edge cases where a reference directly references the root +// of the exported main tree. +// - Inline smallish structs that themselves do not have outside +// references. +// - Overall better inlining. +// - Consider a shorthand for the `let X = { #x: foo }` annotation. Possibly +// allow `#{}`, or allow "let definitions", like `let #X = {}`. +// - Make doc comment of root the file comment. + +// initPivotter initializes a selfContainedCloser if either a subtree +// is exported or imports need to be removed. It will not initialize one if +// neither is the case. +func (e *exporter) initPivotter(v *adt.Vertex) { + s := &pivotter{} + e.pivotter = s + s.x = e + + s.depsMap = map[*adt.Vertex]*depData{} + s.refMap = map[adt.Resolver]*refData{} + + s.linkDependencies(v) +} + +func (e *exporter) completePivot(f *ast.File) { + s := e.pivotter + if s == nil || f == nil { + return + } + for _, d := range s.deps { + if !d.isExternalRoot() { + continue + } + s.addExternal(d) + } + f.Decls = append(f.Decls, s.decls...) +} + +// A pivotter pivots a graph around a new root. +// +// Given a Vertex that itself is not the root of a configuration, the pivotter +// recomputes the configuration to have that node as a root instead. +// +// TODO: although this is currently part of Package export, it could be its own +// package down the line, if there is a proven need for it. +type pivotter struct { + x *exporter + + deps []*depData + depsMap map[*adt.Vertex]*depData + + refs []*refData + refMap map[adt.Resolver]*refData + + decls []ast.Decl +} + +type depData struct { + parent *depData + + dstNode *adt.Vertex + dstImport *adt.ImportReference + + ident adt.Feature + path []adt.Feature + useCount int // Other reference using this vertex + included bool + needTopLevel bool +} + +// isExternalRoot reports whether d is an external node (a node referenced +// outside main exported tree) that has no further parent nodes that are +// referenced. +func (d *depData) isExternalRoot() bool { + return d.ident != 0 +} + +func (d *depData) usageCount() int { + return getParent(d).useCount +} + +type refData struct { + dst *depData + ref ast.Expr +} + +func (v *depData) node() *adt.Vertex { + return v.dstNode +} + +func (p *pivotter) linkDependencies(v *adt.Vertex) { + p.markDeps(v, nil) + + // Explicitly add the root of the configuration. + p.markIncluded(v) + + // Link one parent up + for _, d := range p.depsMap { + p.markParentsPass1(d) + } + + // Get transitive closure of parents. + for _, d := range p.depsMap { + if d.parent != nil { + d.parent = getParent(d) + d.parent.useCount++ + } + } + + // Compute the paths for the parent nodes. + for _, d := range p.deps { + if d.parent == nil { + p.makeParentPath(d) + } + } +} + +func getParent(d *depData) *depData { + for ; d.parent != nil; d = d.parent { + } + return d +} + +func (p *pivotter) markDeps(v *adt.Vertex, pkg *adt.ImportReference) { + // TODO: sweep all child nodes and mark as no need for recursive checks. + + cfg := &dep.Config{ + Descend: true, + Pkg: pkg, + } + dep.Visit(cfg, p.x.ctx, v, func(d dep.Dependency) error { + node := d.Node + + switch { + case p.refMap[d.Reference] != nil: + // Already done. + return nil + + case d.Import() != nil: + // Only record nodes within import if we want to expand imports. + if !p.x.cfg.InlineImports { + return nil + } + + // Never resolve core packages. Reasons: + // - most of them are builtins + // - they are available anyway + // - some of the types have special meaning, which would be lost + // by rewriting to their underlying type. + // TODO: support marking non-CUE packages as "special". This could + // be done, for instance, by marking them as "core" in the runtime + // and using a Runtime method to determine whether something is + // a core package, rather than relying on the presence of a dot. + path := d.Import().ImportPath.StringValue(p.x.ctx) + if !strings.ContainsRune(path, '.') { + return nil + } + + case node.IsUnprocessed(): + // This may happen for DynamicReferences. + return nil + } + + data, ok := p.depsMap[node] + if !ok { + data = &depData{ + dstNode: node, + dstImport: d.Import(), + } + p.depsMap[node] = data + p.deps = append(p.deps, data) + } + data.useCount++ + + ref := &refData{dst: data} + p.refs = append(p.refs, ref) + p.refMap[d.Reference] = ref + + if !ok { + d.Recurse() + } + + return nil + }) +} + +// markIncluded marks all referred nodes that are within the normal tree to be +// exported. +func (p *pivotter) markIncluded(v *adt.Vertex) { + d, ok := p.depsMap[v] + if !ok { + d = &depData{dstNode: v} + p.depsMap[v] = d + } + d.included = true + + for _, a := range v.Arcs { + p.markIncluded(a) + } +} + +// markParentPass1 marks the furthest ancestor node for which there is a +// dependency as its parent. Only dependencies that do not have a parent +// will be assigned to hidden reference. +func (p *pivotter) markParentsPass1(d *depData) { + for n := d.node().Parent; n != nil; n = n.Parent { + if v, ok := p.depsMap[n]; ok { + d.parent = v + } + } +} + +func (p *pivotter) makeParentPath(d *depData) { + if d.parent != nil { + panic("not a parent") + } + + if d.included || d.isExternalRoot() { + return + } + + var f adt.Feature + + if path := d.dstNode.Path(); len(path) > 0 { + f = path[len(path)-1] + } else if imp := d.dstImport; imp != nil { + f = imp.Label + } else { + // This may legitimately happen for internal vertices, such as + // comprehension scopes. + return + } + + var str string + if f.IsInt() { + str = fmt.Sprintf("Index%d", f.Index()) + } else { + str = f.IdentString(p.x.ctx) + str = strings.TrimLeft(str, "_#") + str = strings.ToUpper(str) + } + uf, _ := p.x.uniqueFeature(str) + + d.path = []adt.Feature{uf} + d.ident = uf + + // Make it a definition if we need it. + if d.dstNode.IsRecursivelyClosed() { + d.path = append(d.path, adt.MakeIdentLabel(p.x.ctx, "#x", "")) + } +} + +// makeAlternativeReference computes the alternative path for the reference. +func (p *pivotter) makeAlternativeReference(ref *refData, r adt.Resolver) ast.Expr { + d := ref.dst + + // Determine if the reference can be inline. + + var path []adt.Feature + if d.parent == nil { + // Get canonical vertexData. + path = d.path + } else { + pathLen, pkgRef := relPathLength(r) + path = d.node().Path() + count := d.stepsToParent() + + switch { + case ref.dst.included: + // Inside main tree. + if count > pathLen { + // Cannot refer to root, so cannot use >= + return nil + } + + case pkgRef: + + default: + // Inside hoisted value. + if count >= pathLen { + return nil + } + } + + path = path[len(path)-count:] + path = append(d.parent.path, path...) + } + + if len(path) == 0 { + path = append(path, p.x.ctx.StringLabel("ROOT")) + } + + var x ast.Expr = p.x.ident(path[0]) + + for _, f := range path[1:] { + if f.IsInt() { + x = &ast.IndexExpr{ + X: x, + Index: ast.NewLit(token.INT, strconv.Itoa(f.Index())), + } + } else { + x = &ast.SelectorExpr{ + X: x, + Sel: p.x.stringLabel(f), + } + } + } + + return x +} + +func (d *depData) stepsToParent() int { + parent := d.parent.node() + count := 0 + for p := d.node(); p != parent; p = p.Parent { + if p == nil { + break + } + count++ + } + return count +} + +func relPathLength(r adt.Resolver) (length int, newRoot bool) { + for { + var expr adt.Expr + switch x := r.(type) { + case *adt.FieldReference, + *adt.DynamicReference, + *adt.LetReference, + *adt.ValueReference: + length++ + case *adt.ImportReference: + // This reference indicates a different vertex as root, but doesn't + // increase the path length. + return length, true + case *adt.SelectorExpr: + length++ + expr = x.X + case *adt.IndexExpr: + length++ + expr = x.X + } + + switch x := expr.(type) { + case nil: + return length, false + case adt.Resolver: + r = x + default: + panic("unreachable") + } + } +} + +// refExpr returns a substituted expression for a given reference, or nil if +// there are no changes. This function implements most of the policy to decide +// when an expression can be inlined. +func (p *pivotter) refExpr(r adt.Resolver) ast.Expr { + ref, ok := p.refMap[r] + if !ok { + return nil + } + + dst := ref.dst + n := dst.node() + + // Inline value, but only when this may not lead to an exponential + // expansion. We allow inlining when a value is only used once, or when + // it is a simple concrete scalar value. + switch { + case dst.included: + // Keep references that point inside the hoisted vertex. + // TODO: force hoisting. This would be akin to taking the interpretation + // that references that initially point outside the included vertex + // are external inputs too, even if they eventually point inside. + case p.x.inDefinition == 0 && n.IsRecursivelyClosed(): + // We need to wrap the value in a definition. + case dst.usageCount() == 0: + // The root value itself. + case n.IsErr(): + // Don't simplify for errors to make the position of the error clearer. + case !n.IsConcrete() && p.x.inExpression > 0: + // Don't simplify an expression that is known will fail. + case dst.usageCount() == 1 && p.x.inExpression == 0: + // Used only once. + fallthrough + case n.IsConcrete() && len(n.Arcs) == 0: + // Simple scalar value. + return p.x.expr(nil, n) + } + + if r := p.makeAlternativeReference(ref, r); r != nil { + dst.needTopLevel = true + return r + } + + return nil +} + +// addExternal converts a vertex for an external reference. +func (p *pivotter) addExternal(d *depData) { + if !d.needTopLevel { + return + } + + expr := p.x.expr(nil, d.node()) + + if len(d.path) > 1 { + expr = ast.NewStruct(&ast.Field{ + Label: p.x.stringLabel(d.path[1]), + Value: expr, + }) + } + let := &ast.LetClause{ + Ident: p.x.ident(d.path[0]), + Expr: expr, + } + + ast.SetRelPos(let, token.NewSection) + + path := p.x.ctx.PathToString(p.x.ctx, d.node().Path()) + var msg string + if d.dstImport == nil { + msg = fmt.Sprintf("//cue:path: %s", path) + } else { + pkg := d.dstImport.ImportPath.SelectorString(p.x.ctx) + if path == "" { + msg = fmt.Sprintf("//cue:path: %s", pkg) + } else { + msg = fmt.Sprintf("//cue:path: %s.%s", pkg, path) + } + } + cg := &ast.CommentGroup{ + Doc: true, + List: []*ast.Comment{{Text: msg}}, + } + ast.SetRelPos(cg, token.NewSection) + ast.AddComment(let, cg) + + p.decls = append(p.decls, let) +} diff --git a/vendor/cuelang.org/go/internal/core/export/toposort.go b/vendor/cuelang.org/go/internal/core/export/toposort.go index 7f68df97..b7c52bb0 100644 --- a/vendor/cuelang.org/go/internal/core/export/toposort.go +++ b/vendor/cuelang.org/go/internal/core/export/toposort.go @@ -25,7 +25,7 @@ import ( // VertexFeatures returns the feature list of v. The list may include more // features than for which there are arcs and also includes features for -// optional fields. It assumes the Structs fields is properly initialized. +// optional fields. It assumes the Structs fields are initialized and evaluated. func VertexFeatures(c *adt.OpContext, v *adt.Vertex) []adt.Feature { sets := extractFeatures(v.Structs) m := sortArcs(sets) // TODO: use for convenience. @@ -51,40 +51,6 @@ func VertexFeatures(c *adt.OpContext, v *adt.Vertex) []adt.Feature { return a } -// func structFeatures(a []*adt.StructLit) []adt.Feature { -// sets := extractFeatures(a) -// return sortedArcs(sets) -// } - -func (e *exporter) sortedArcs(v *adt.Vertex) (sorted []*adt.Vertex) { - if adt.DebugSort > 0 { - return v.Arcs - } - - a := extractFeatures(v.Structs) - if len(a) == 0 { - return v.Arcs - } - - sorted = make([]*adt.Vertex, len(v.Arcs)) - copy(sorted, v.Arcs) - - m := sortArcs(a) - sort.SliceStable(sorted, func(i, j int) bool { - if m[sorted[i].Label] == 0 { - return m[sorted[j].Label] != 0 - } - return m[sorted[i].Label] > m[sorted[j].Label] - }) - - return sorted -} - -// TODO: remove -func (e *exporter) extractFeatures(in []*adt.StructInfo) (a [][]adt.Feature) { - return extractFeatures(in) -} - func extractFeatures(in []*adt.StructInfo) (a [][]adt.Feature) { for _, s := range in { sorted := []adt.Feature{} @@ -92,9 +58,6 @@ func extractFeatures(in []*adt.StructInfo) (a [][]adt.Feature) { switch x := e.(type) { case *adt.Field: sorted = append(sorted, x.Label) - - case *adt.OptionalField: - sorted = append(sorted, x.Label) } } diff --git a/vendor/cuelang.org/go/internal/core/export/value.go b/vendor/cuelang.org/go/internal/core/export/value.go index 53065e9e..e54aefcb 100644 --- a/vendor/cuelang.org/go/internal/core/export/value.go +++ b/vendor/cuelang.org/go/internal/core/export/value.go @@ -22,6 +22,7 @@ import ( "cuelang.org/go/cue/ast/astutil" "cuelang.org/go/cue/literal" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" ) @@ -47,7 +48,7 @@ func (e *exporter) vertex(n *adt.Vertex) (result ast.Expr) { attrs = ExtractDeclAttrs(n) } - s, saved := e.pushFrame(n.Conjuncts) + s, saved := e.pushFrame(n, n.Conjuncts) e.top().upCount++ defer func() { e.top().upCount-- @@ -55,7 +56,7 @@ func (e *exporter) vertex(n *adt.Vertex) (result ast.Expr) { }() for _, c := range n.Conjuncts { - e.markLets(c.Expr().Source()) + e.markLets(c.Expr().Source(), s) } switch x := n.BaseValue.(type) { @@ -73,6 +74,9 @@ func (e *exporter) vertex(n *adt.Vertex) (result ast.Expr) { case *adt.Bottom: switch { + case n.ArcType == adt.ArcOptional: + // Optional fields may always be the original value. + case e.cfg.ShowErrors && x.ChildError: // TODO(perf): use precompiled arc statistics if len(n.Arcs) > 0 && n.Arcs[0].Label.IsInt() && !e.showArcs(n) && attrs == nil { @@ -99,7 +103,9 @@ func (e *exporter) vertex(n *adt.Vertex) (result ast.Expr) { // fall back to expression mode a := []ast.Expr{} for _, c := range n.Conjuncts { - a = append(a, e.expr(c.Elem())) + if x := e.expr(c.Env, c.Elem()); x != dummyTop { + a = append(a, x) + } } result = ast.NewBinExpr(token.AND, a...) } @@ -110,28 +116,12 @@ func (e *exporter) vertex(n *adt.Vertex) (result ast.Expr) { if result != s && len(s.Elts) > 0 { // There are used let expressions within a non-struct. // For now we just fall back to the original expressions. - result = e.adt(n, n.Conjuncts) + result = e.adt(nil, n) } return result } -// TODO: do something more principled. Best would be to have a similar -// mechanism in ast.Ident as others do. -func stripRefs(x ast.Expr) ast.Expr { - ast.Walk(x, nil, func(n ast.Node) { - switch x := n.(type) { - case *ast.Ident: - switch x.Node.(type) { - case *ast.ImportSpec: - default: - x.Node = nil - } - } - }) - return x -} - func (e *exporter) value(n adt.Value, a ...adt.Conjunct) (result ast.Expr) { if e.cfg.TakeDefaults { n = adt.Default(n) @@ -185,7 +175,7 @@ func (e *exporter) value(n adt.Value, a ...adt.Conjunct) (result ast.Expr) { return ast.NewIdent("_") case 1: if e.cfg.Simplify { - return e.expr(x.Values[0]) + return e.expr(nil, x.Values[0]) } return e.bareValue(x.Values[0]) } @@ -214,7 +204,7 @@ func (e *exporter) value(n adt.Value, a ...adt.Conjunct) (result ast.Expr) { if e.cfg.Simplify { expr = e.bareValue(v) } else { - expr = e.expr(v) + expr = e.expr(nil, v) } if i < x.NumDefaults { expr = &ast.UnaryExpr{Op: token.MUL, X: expr} @@ -339,8 +329,10 @@ func (e *exporter) listComposite(v *adt.Vertex) ast.Expr { } elem := e.vertex(a) - docs := ExtractDoc(a) - ast.SetComments(elem, docs) + if e.cfg.ShowDocs { + docs := ExtractDoc(a) + ast.SetComments(elem, docs) + } l.Elts = append(l.Elts, elem) } @@ -440,28 +432,20 @@ func (e *exporter) structComposite(v *adt.Vertex, attrs []*ast.Attribute) ast.Ex } arc := v.Lookup(label) - switch { - case arc == nil: - if !p.ShowOptional { - continue - } - f.Optional = token.NoSpace.Pos() - - arc = &adt.Vertex{Label: label} - v.MatchAndInsert(e.ctx, arc) - if len(arc.Conjuncts) == 0 { - continue - } + if arc == nil { + continue + } - // fall back to expression mode. - f.Value = stripRefs(e.expr(arc)) + if arc.ArcType == adt.ArcOptional && !p.ShowOptional { + continue + } + // TODO: report an error for required fields in Final mode? + // This package typically does not create errors that did not result + // from evaluation already. - // TODO: remove use of stripRefs. - // f.Value = e.expr(arc) + internal.SetConstraint(f, arc.ArcType.Token()) - default: - f.Value = e.vertex(arc) - } + f.Value = e.vertex(arc) if label.IsDef() { e.inDefinition-- diff --git a/vendor/cuelang.org/go/internal/core/runtime/build.go b/vendor/cuelang.org/go/internal/core/runtime/build.go index d3ecac7d..7d35a432 100644 --- a/vendor/cuelang.org/go/internal/core/runtime/build.go +++ b/vendor/cuelang.org/go/internal/core/runtime/build.go @@ -21,6 +21,7 @@ import ( "cuelang.org/go/cue/ast/astutil" "cuelang.org/go/cue/build" "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/stats" "cuelang.org/go/cue/token" "cuelang.org/go/internal" "cuelang.org/go/internal/core/adt" @@ -32,6 +33,8 @@ type Config struct { Filename string ImportPath string + Counts *stats.Counts + compile.Config } @@ -77,6 +80,8 @@ func (x *Runtime) Build(cfg *Config, b *build.Instance) (v *adt.Vertex, errs err v, err = compile.Files(cc, x, b.ID(), b.Files...) errs = errors.Append(errs, err) + errs = errors.Append(errs, x.injectImplementations(b, v)) + if errs != nil { v = adt.ToVertex(&adt.Bottom{Err: errs}) b.Err = errs diff --git a/vendor/cuelang.org/go/internal/core/runtime/errors.go b/vendor/cuelang.org/go/internal/core/runtime/errors.go index e98cddac..b953a984 100644 --- a/vendor/cuelang.org/go/internal/core/runtime/errors.go +++ b/vendor/cuelang.org/go/internal/core/runtime/errors.go @@ -37,7 +37,7 @@ func (n *nodeError) Error() string { func nodeErrorf(n ast.Node, format string, args ...interface{}) *nodeError { return &nodeError{ n: n, - Message: errors.NewMessage(format, args), + Message: errors.NewMessagef(format, args...), } } diff --git a/vendor/cuelang.org/go/internal/core/runtime/extern.go b/vendor/cuelang.org/go/internal/core/runtime/extern.go new file mode 100644 index 00000000..d286d4ee --- /dev/null +++ b/vendor/cuelang.org/go/internal/core/runtime/extern.go @@ -0,0 +1,341 @@ +// Copyright 2023 CUE Authors +// +// 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. + +package runtime + +import ( + "cuelang.org/go/cue/ast" + "cuelang.org/go/cue/build" + "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/format" + "cuelang.org/go/cue/token" + "cuelang.org/go/internal" + "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/core/walk" +) + +// SetInterpreter sets the interpreter for interpretation of files marked with +// @extern(kind). +func (r *Runtime) SetInterpreter(i Interpreter) { + if r.interpreters == nil { + r.interpreters = map[string]Interpreter{} + } + r.interpreters[i.Kind()] = i +} + +// TODO: consider also passing the top-level attribute to NewCompiler to allow +// passing default values. + +// Interpreter defines an entrypoint for creating per-package interpreters. +type Interpreter interface { + // NewCompiler creates a compiler for b and reports any errors. + NewCompiler(b *build.Instance) (Compiler, errors.Error) + + // Kind returns the string to be used in the file-level @extern attribute. + Kind() string +} + +// A Compiler composes an adt.Builtin for an external function implementation. +type Compiler interface { + // Compile creates a builtin for the given function name and attribute. + // funcName is the name of the function to compile, taken from altName in + // @extern(name=altName), or from the field name if that's not defined. + // Other than "name", the fields in a are implementation specific. + Compile(funcName string, a *internal.Attr) (*adt.Builtin, errors.Error) +} + +// injectImplementations modifies v to include implementations of functions +// for fields associated with the @extern attributes. +func (r *Runtime) injectImplementations(b *build.Instance, v *adt.Vertex) (errs errors.Error) { + if r.interpreters == nil { + return nil + } + + d := &externDecorator{ + runtime: r, + pkg: b, + } + + for _, f := range b.Files { + d.errs = errors.Append(d.errs, d.addFile(f)) + } + + for _, c := range v.Conjuncts { + d.decorateConjunct(c.Elem()) + } + + return d.errs +} + +// externDecorator locates extern attributes and calls the relevant interpreters +// to inject builtins. +// +// This is a two-pass algorithm: in the first pass, all ast.Files are processed +// to build an index from *ast.Fields to attributes. In the second phase, the +// corresponding adt.Fields are located in the ADT and decorated with the +// builtins. +type externDecorator struct { + runtime *Runtime + pkg *build.Instance + + compilers map[string]Compiler + fields map[*ast.Field]fieldInfo + + errs errors.Error +} + +type fieldInfo struct { + file *ast.File + extern string + funcName string + attrBody string + attr *ast.Attribute +} + +// addFile finds injection points in the given ast.File for external +// implementations of Builtins. +func (d *externDecorator) addFile(f *ast.File) (errs errors.Error) { + kind, pos, decls, err := findExternFileAttr(f) + if len(decls) == 0 { + return err + } + + ok, err := d.initCompiler(kind, pos) + if !ok { + return err + } + + return d.markExternFieldAttr(kind, decls) +} + +// findExternFileAttr reports the extern kind of a file-level @extern(kind) +// attribute in f, the position of the corresponding attribute, and f's +// declarations from the package directive onwards. It's an error if more than +// one @extern attribute is found. decls == nil signals that this file should be +// skipped. +func findExternFileAttr(f *ast.File) (kind string, pos token.Pos, decls []ast.Decl, err errors.Error) { + var ( + hasPkg bool + p int + fileAttr *ast.Attribute + ) + +loop: + for ; p < len(f.Decls); p++ { + switch a := f.Decls[p].(type) { + case *ast.Package: + hasPkg = true + break loop + + case *ast.Attribute: + pos = a.Pos() + key, body := a.Split() + if key != "extern" { + continue + } + fileAttr = a + + attr := internal.ParseAttrBody(a.Pos(), body) + if attr.Err != nil { + return "", pos, nil, attr.Err + } + k, err := attr.String(0) + if err != nil { + // Unreachable. + return "", pos, nil, errors.Newf(a.Pos(), "%s", err) + } + + if k == "" { + return "", pos, nil, errors.Newf(a.Pos(), + "interpreter name must be non-empty") + } + + if kind != "" { + return "", pos, nil, errors.Newf(a.Pos(), + "only one file-level extern attribute allowed per file") + + } + kind = k + } + } + + switch { + case fileAttr == nil && !hasPkg: + // Nothing to see here. + return "", pos, nil, nil + + case fileAttr != nil && !hasPkg: + return "", pos, nil, errors.Newf(fileAttr.Pos(), + "extern attribute without package clause") + + case fileAttr == nil && hasPkg: + // Check that there are no top-level extern attributes. + for p++; p < len(f.Decls); p++ { + x, ok := f.Decls[p].(*ast.Attribute) + if !ok { + continue + } + if key, _ := x.Split(); key == "extern" { + err = errors.Append(err, errors.Newf(x.Pos(), + "extern attribute must appear before package clause")) + } + } + return "", pos, nil, err + } + + return kind, pos, f.Decls[p:], nil +} + +// initCompiler initializes the runtime for kind, if applicable. The pos +// argument represents the position of the file-level @extern attribute. +func (d *externDecorator) initCompiler(kind string, pos token.Pos) (ok bool, err errors.Error) { + if c, ok := d.compilers[kind]; ok { + return c != nil, nil + } + + // initialize the compiler. + if d.compilers == nil { + d.compilers = map[string]Compiler{} + d.fields = map[*ast.Field]fieldInfo{} + } + + x := d.runtime.interpreters[kind] + if x == nil { + return false, errors.Newf(pos, "no interpreter defined for %q", kind) + } + + c, err := x.NewCompiler(d.pkg) + if err != nil { + return false, err + } + + d.compilers[kind] = c + + return c != nil, nil +} + +// markExternFieldAttr collects all *ast.Fields with extern attributes into +// d.fields. Both of the following forms are allowed: +// +// a: _ @extern(...) +// a: { _, @extern(...) } +// +// consistent with attribute implementation recommendations. +func (d *externDecorator) markExternFieldAttr(kind string, decls []ast.Decl) (errs errors.Error) { + var fieldStack []*ast.Field + + ast.Walk(&ast.File{Decls: decls}, func(n ast.Node) bool { + switch x := n.(type) { + case *ast.Field: + fieldStack = append(fieldStack, x) + + case *ast.Attribute: + key, body := x.Split() + if key != "extern" { + break + } + + lastField := len(fieldStack) - 1 + if lastField < 0 { + errs = errors.Append(errs, errors.Newf(x.Pos(), + "extern attribute not associated with field")) + return true + } + + f := fieldStack[lastField] + + if _, ok := d.fields[f]; ok { + errs = errors.Append(errs, errors.Newf(x.Pos(), + "duplicate extern attributes")) + return true + } + + name, isIdent, err := ast.LabelName(f.Label) + if err != nil || !isIdent { + b, _ := format.Node(f.Label) + errs = errors.Append(errs, errors.Newf(x.Pos(), + "can only define functions for fields with identifier names, found %v", string(b))) + return true + } + + d.fields[f] = fieldInfo{ + extern: kind, + funcName: name, + attrBody: body, + attr: x, + } + } + + return true + + }, func(n ast.Node) { + switch n.(type) { + case *ast.Field: + fieldStack = fieldStack[:len(fieldStack)-1] + } + }) + + return errs +} + +func (d *externDecorator) decorateConjunct(e adt.Elem) { + w := walk.Visitor{Before: d.processADTNode} + w.Elem(e) +} + +// processADTNode injects a builtin conjunct into n if n is an adt.Field and +// has a marked ast.Field associated with it. +func (d *externDecorator) processADTNode(n adt.Node) bool { + f, ok := n.(*adt.Field) + if !ok { + return true + } + + info, ok := d.fields[f.Src] + if !ok { + return true + } + + c, ok := d.compilers[info.extern] + if !ok { + // An error for a missing runtime was already reported earlier, + // if applicable. + return true + } + + attr := internal.ParseAttrBody(info.attr.Pos(), info.attrBody) + if attr.Err != nil { + d.errs = errors.Append(d.errs, attr.Err) + return true + } + name := info.funcName + if str, ok, _ := attr.Lookup(1, "name"); ok { + name = str + } + + b, err := c.Compile(name, &attr) + if err != nil { + err = errors.Newf(info.attr.Pos(), "can't load from external module: %v", err) + d.errs = errors.Append(d.errs, err) + return true + } + + f.Value = &adt.BinaryExpr{ + Op: adt.AndOp, + X: f.Value, + Y: b, + } + + return true +} diff --git a/vendor/cuelang.org/go/internal/core/runtime/imports.go b/vendor/cuelang.org/go/internal/core/runtime/imports.go index 7903a363..4ac292c1 100644 --- a/vendor/cuelang.org/go/internal/core/runtime/imports.go +++ b/vendor/cuelang.org/go/internal/core/runtime/imports.go @@ -65,6 +65,8 @@ type index struct { importsByPath map[string]*adt.Vertex importsByBuild map[*build.Instance]*adt.Vertex + nextUniqueID uint64 + // These are initialized during Go package initialization time and do not // need to be guarded. builtinPaths map[string]PackageFunc // Full path @@ -73,6 +75,15 @@ type index struct { typeCache sync.Map // map[reflect.Type]evaluated } +func (i *index) getNextUniqueID() uint64 { + // TODO: use atomic increment instead. + i.lock.Lock() + i.nextUniqueID++ + x := i.nextUniqueID + i.lock.Unlock() + return x +} + func newIndex() *index { i := &index{ imports: map[*adt.Vertex]*build.Instance{}, diff --git a/vendor/cuelang.org/go/internal/core/runtime/index.go b/vendor/cuelang.org/go/internal/core/runtime/index.go index a50e3780..edfdec01 100644 --- a/vendor/cuelang.org/go/internal/core/runtime/index.go +++ b/vendor/cuelang.org/go/internal/core/runtime/index.go @@ -29,6 +29,10 @@ func (r *Runtime) StringToIndex(s string) int64 { return getKey(s) } +func (r *Runtime) NextUniqueID() uint64 { + return r.index.getNextUniqueID() +} + func (r *Runtime) LabelStr(l adt.Feature) string { return l.IdentString(r) } diff --git a/vendor/cuelang.org/go/internal/core/runtime/runtime.go b/vendor/cuelang.org/go/internal/core/runtime/runtime.go index f4569807..0ab92e85 100644 --- a/vendor/cuelang.org/go/internal/core/runtime/runtime.go +++ b/vendor/cuelang.org/go/internal/core/runtime/runtime.go @@ -18,11 +18,15 @@ import ( "cuelang.org/go/cue/build" ) -// A Runtime maintains data structures for indexing and resuse for evaluation. +// A Runtime maintains data structures for indexing and reuse for evaluation. type Runtime struct { index *index loaded map[*build.Instance]interface{} + + // interpreters implement extern functionality. The map key corresponds to + // the kind in a file-level @extern(kind) attribute. + interpreters map[string]Interpreter } func (r *Runtime) SetBuildData(b *build.Instance, x interface{}) { @@ -42,6 +46,11 @@ func New() *Runtime { return r } +// IsInitialized reports whether the runtime has been initialized. +func (r *Runtime) IsInitialized() bool { + return r.index != nil +} + func (r *Runtime) Init() { if r.index != nil { return diff --git a/vendor/cuelang.org/go/internal/core/subsume/structural.go b/vendor/cuelang.org/go/internal/core/subsume/structural.go index 450a03e1..0cc73c12 100644 --- a/vendor/cuelang.org/go/internal/core/subsume/structural.go +++ b/vendor/cuelang.org/go/internal/core/subsume/structural.go @@ -58,9 +58,6 @@ func (s *subsumer) node(env *adt.Environment, up int32) *adt.Vertex { } func (s *subsumer) structural(a, b adt.Conjunct) bool { - if y, ok := b.Expr().(*adt.LetReference); ok { - return s.conjunct(a, s.c(b.Env, y.X)) - } if isBottomConjunct(b) { return true } @@ -99,7 +96,11 @@ func (s *subsumer) structural(a, b adt.Conjunct) bool { } case *adt.LetReference: - return s.conjunct(s.c(a.Env, x.X), b) + if y, ok := b.Elem().(*adt.LetReference); ok && x.Label == y.Label { + if s.node(a.Env, x.UpCount) == s.node(b.Env, y.UpCount) { + return true + } + } case *adt.SelectorExpr: if y, ok := a.Elem().(*adt.SelectorExpr); ok && @@ -249,12 +250,9 @@ func (c *collatedDecls) collate(env *adt.Environment, s *adt.StructLit) { e.required = true e.conjuncts = append(e.conjuncts, adt.MakeRootConjunct(env, x)) c.fields[x.Label] = e - - case *adt.OptionalField: - e := c.fields[x.Label] - e.conjuncts = append(e.conjuncts, adt.MakeRootConjunct(env, x)) - c.fields[x.Label] = e - c.hasOptional = true + if x.ArcType != adt.ArcMember { + c.hasOptional = true + } case *adt.BulkOptionalField: c.pattern = append(c.pattern, x) @@ -269,12 +267,10 @@ func (c *collatedDecls) collate(env *adt.Environment, s *adt.StructLit) { c.additional = append(c.additional, x) case *adt.Comprehension: - c.yielders = append(c.yielders, x.Clauses) + c.yielders = append(c.yielders, x.Clauses...) case *adt.LetClause: c.yielders = append(c.yielders, x) - - case *adt.ValueClause: } } } diff --git a/vendor/cuelang.org/go/internal/core/subsume/vertex.go b/vendor/cuelang.org/go/internal/core/subsume/vertex.go index 55f83dcf..49d94536 100644 --- a/vendor/cuelang.org/go/internal/core/subsume/vertex.go +++ b/vendor/cuelang.org/go/internal/core/subsume/vertex.go @@ -22,15 +22,18 @@ import ( ) // Notes: -// - Can optional fields of y can always be ignored here? Maybe not in the -// schema case. -// - Definitions of y can be ignored in data mode. +// - Can optional fields of y can always be ignored here? Maybe not in the +// schema case. +// - Definitions of y can be ignored in data mode. // // TODO(perf): use merge sort where possible. func (s *subsumer) vertices(x, y *adt.Vertex) bool { if x == y { return true } + if x.ArcType < y.ArcType { + return false + } if s.Defaults { y = y.Default() @@ -52,7 +55,7 @@ func (s *subsumer) vertices(x, y *adt.Vertex) bool { case *adt.ListMarker: if !y.IsList() { - s.errf("list does not subsume %s (type %s)", y, y.Kind()) + s.errf("list does not subsume %v (type %s)", y, y.Kind()) return false } if !s.listVertices(x, y) { @@ -124,6 +127,17 @@ func (s *subsumer) vertices(x, y *adt.Vertex) bool { continue } + aOpt = true + } else if a.IsConstraint() { + if s.IgnoreOptional { + continue + } + // If field a is optional and has value top, neither the + // omission of the field nor the field defined with any value + // may cause unification to fail. + if a.Kind() == adt.TopKind { + continue + } aOpt = true } @@ -131,7 +145,7 @@ func (s *subsumer) vertices(x, y *adt.Vertex) bool { if b == nil { // y.f is optional if !aOpt { - s.errf("required field is optional in subsumed value: %s", f) + s.errf("required field is optional in subsumed value: %v", f) return false } @@ -156,7 +170,7 @@ func (s *subsumer) vertices(x, y *adt.Vertex) bool { s.gt = a s.lt = y - s.errf("field %s not present in %s", f, y) + s.errf("field %v not present in %v", f, y) return false } @@ -187,13 +201,17 @@ outer: b = &adt.Vertex{Label: f} y.MatchAndInsert(ctx, b) + } else if b.IsConstraint() { + if s.IgnoreOptional || s.Final { + continue + } } if !x.Accept(ctx, f) { if s.Profile.IgnoreClosedness { continue } - s.errf("field not allowed in closed struct: %s", f) + s.errf("field not allowed in closed struct: %v", f) return false } diff --git a/vendor/cuelang.org/go/internal/core/validate/validate.go b/vendor/cuelang.org/go/internal/core/validate/validate.go index 132c216d..66ac7d53 100644 --- a/vendor/cuelang.org/go/internal/core/validate/validate.go +++ b/vendor/cuelang.org/go/internal/core/validate/validate.go @@ -23,6 +23,9 @@ type Config struct { // Concrete, if true, requires that all values be concrete. Concrete bool + // Final, if true, checks that there are no required fields left. + Final bool + // DisallowCycles indicates that there may not be cycles. DisallowCycles bool @@ -98,6 +101,14 @@ func (v *validator) validate(x *adt.Vertex) { } for _, a := range x.Arcs { + if a.ArcType == adt.ArcRequired && v.Final && v.inDefinition == 0 { + v.add(adt.NewRequiredNotPresentError(v.ctx, a)) + continue + } + + if a.Label.IsLet() || !a.IsDefined(v.ctx) { + continue + } if !v.AllErrors && v.err != nil { break } diff --git a/vendor/cuelang.org/go/internal/core/walk/walk.go b/vendor/cuelang.org/go/internal/core/walk/walk.go index 3a12139f..20002fdb 100644 --- a/vendor/cuelang.org/go/internal/core/walk/walk.go +++ b/vendor/cuelang.org/go/internal/core/walk/walk.go @@ -30,22 +30,18 @@ func Features(x adt.Expr, f func(label adt.Feature, src adt.Node)) { w.Elem(x) } +// A Visitor walks over all elements in an ADT, recursively. type Visitor struct { - // TODO: lets really should be special fields - letDone map[adt.Expr]bool - + // Feature is invoked for all field names. Feature func(f adt.Feature, src adt.Node) - Before func(adt.Node) bool -} -func (w *Visitor) init() { - if w.letDone == nil { - w.letDone = map[adt.Expr]bool{} - } + // Before is invoked for all invoked for all nodes in pre-order traversal. + // Return false prevents the visitor from visiting the nodes descendant + // elements. + Before func(adt.Node) bool } func (w *Visitor) Elem(x adt.Elem) { - w.init() w.node(x) } @@ -92,13 +88,6 @@ func (w *Visitor) node(n adt.Node) { case *adt.LetReference: w.feature(x.Label, x) - if w.letDone == nil { - w.letDone = map[adt.Expr]bool{} - } - if !w.letDone[x.X] { - w.letDone[x.X] = true - w.node(x.X) - } case *adt.SelectorExpr: w.node(x.X) @@ -151,7 +140,7 @@ func (w *Visitor) node(n adt.Node) { w.feature(x.Label, x) w.node(x.Value) - case *adt.OptionalField: + case *adt.LetField: w.feature(x.Label, x) w.node(x.Value) @@ -166,22 +155,21 @@ func (w *Visitor) node(n adt.Node) { // Yielders case *adt.Comprehension: - w.node(x.Clauses) - w.node(x.Value) + for _, c := range x.Clauses { + w.node(c) + } + w.node(adt.ToExpr(x.Value)) case *adt.ForClause: w.feature(x.Key, x) w.feature(x.Value, x) - w.node(x.Dst) case *adt.IfClause: w.node(x.Condition) - w.node(x.Dst) case *adt.LetClause: w.feature(x.Label, x) w.node(x.Expr) - w.node(x.Dst) case *adt.ValueClause: diff --git a/vendor/cuelang.org/go/internal/encoding/encoder.go b/vendor/cuelang.org/go/internal/encoding/encoder.go index 4d9b0ba5..378bb241 100644 --- a/vendor/cuelang.org/go/internal/encoding/encoder.go +++ b/vendor/cuelang.org/go/internal/encoding/encoder.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "path/filepath" @@ -53,7 +52,7 @@ type Encoder struct { // IsConcrete reports whether the output is required to be concrete. // // INTERNAL ONLY: this is just to work around a problem related to issue #553 -// of catching errors ony after syntax generation, dropping line number +// of catching errors only after syntax generation, dropping line number // information. func (e *Encoder) IsConcrete() bool { return e.concrete @@ -126,6 +125,7 @@ func NewEncoder(f *build.File, cfg *Config) (*Encoder, error) { cue.Definitions(fi.Definitions), cue.ResolveReferences(!fi.References), cue.DisallowCycles(!fi.Cycles), + cue.InlineImports(cfg.InlineImports), ) opts := []format.Option{} @@ -253,6 +253,9 @@ func (e *Encoder) EncodeInstance(v *cue.Instance) error { func (e *Encoder) Encode(v cue.Value) error { e.autoSimplify = true + if err := v.Validate(cue.Concrete(e.concrete)); err != nil { + return err + } if e.interpret != nil { f, err := e.interpret(v) if err != nil { @@ -260,9 +263,6 @@ func (e *Encoder) Encode(v cue.Value) error { } return e.encodeFile(f, nil) } - if err := v.Validate(cue.Concrete(e.concrete)); err != nil { - return err - } if e.encValue != nil { return e.encValue(v) } @@ -310,7 +310,7 @@ func writer(f *build.File, cfg *Config) (_ io.Writer, close func() error, err er // prevent clobbering the file in case of a crash. b := &bytes.Buffer{} fn := func() error { - return ioutil.WriteFile(path, b.Bytes(), 0644) + return os.WriteFile(path, b.Bytes(), 0644) } return b, fn, nil } diff --git a/vendor/cuelang.org/go/internal/encoding/encoding.go b/vendor/cuelang.org/go/internal/encoding/encoding.go index 522f023c..53020fac 100644 --- a/vendor/cuelang.org/go/internal/encoding/encoding.go +++ b/vendor/cuelang.org/go/internal/encoding/encoding.go @@ -21,7 +21,6 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "net/url" "os" "strings" @@ -151,17 +150,18 @@ type Config struct { PkgName string // package name for files to generate - Force bool // overwrite existing files. + Force bool // overwrite existing files Strict bool - Stream bool // will potentially write more than one document per file + Stream bool // potentially write more than one document per file AllErrors bool Schema cue.Value // used for schema-based decoding - EscapeHTML bool - ProtoPath []string - Format []format.Option - ParseFile func(name string, src interface{}) (*ast.File, error) + EscapeHTML bool + InlineImports bool // expand references to non-core imports + ProtoPath []string + Format []format.Option + ParseFile func(name string, src interface{}) (*ast.File, error) } // NewDecoder returns a stream of non-rooted data expressions. The encoding @@ -181,7 +181,7 @@ func NewDecoder(f *build.File, cfg *Config) *Decoder { if file, ok := f.Source.(*ast.File); ok { i.file = file - i.closer = ioutil.NopCloser(strings.NewReader("")) + i.closer = io.NopCloser(strings.NewReader("")) i.validate(file, f) return i } @@ -249,11 +249,11 @@ func NewDecoder(f *build.File, cfg *Config) *Decoder { i.next = d.Decode i.Next() case build.Text: - b, err := ioutil.ReadAll(r) + b, err := io.ReadAll(r) i.err = err i.expr = ast.NewString(string(b)) case build.Binary: - b, err := ioutil.ReadAll(r) + b, err := io.ReadAll(r) i.err = err s := literal.Bytes.WithTabIndent(1).Quote(string(b)) i.expr = ast.NewLit(token.STRING, s) @@ -264,7 +264,7 @@ func NewDecoder(f *build.File, cfg *Config) *Decoder { } i.file, i.err = protobuf.Extract(path, r, paths) case build.TextProto: - b, err := ioutil.ReadAll(r) + b, err := io.ReadAll(r) i.err = err if err == nil { d := textproto.NewDecoder() @@ -329,20 +329,20 @@ func reader(f *build.File, stdin io.Reader) (io.ReadCloser, error) { case nil: // Use the file name. case string: - return ioutil.NopCloser(strings.NewReader(s)), nil + return io.NopCloser(strings.NewReader(s)), nil case []byte: - return ioutil.NopCloser(bytes.NewReader(s)), nil + return io.NopCloser(bytes.NewReader(s)), nil case *bytes.Buffer: // is io.Reader, but it needs to be readable repeatedly if s != nil { - return ioutil.NopCloser(bytes.NewReader(s.Bytes())), nil + return io.NopCloser(bytes.NewReader(s.Bytes())), nil } default: return nil, fmt.Errorf("invalid source type %T", f.Source) } // TODO: should we allow this? if f.Filename == "-" { - return ioutil.NopCloser(stdin), nil + return io.NopCloser(stdin), nil } return os.Open(f.Filename) } @@ -421,8 +421,7 @@ func (v *validator) validate(n ast.Node) bool { check(n, i.Imports, "imports", true) case *ast.Field: - check(n, i.Definitions, "definitions", - x.Token == token.ISA || internal.IsDefinition(x.Label)) + check(n, i.Definitions, "definitions", internal.IsDefinition(x.Label)) check(n, i.Data, "regular fields", internal.IsRegularField(x)) check(n, constraints, "optional fields", x.Optional != token.NoPos) @@ -464,21 +463,3 @@ func (v *validator) validate(n ast.Node) bool { } return ok } - -// simplify reformats a File. To be used as a wrapper for Extract functions. -// -// It currently does so by formatting the file using fmt.Format and then -// reparsing it. This is not ideal, but the package format does not provide a -// way to do so differently. -func simplify(f *ast.File, err error) (*ast.File, error) { - if err != nil { - return nil, err - } - // This needs to be a function that modifies f in order to maintain line - // number information. - b, err := format.Node(f, format.Simplify()) - if err != nil { - return nil, err - } - return parser.ParseFile(f.Filename, b, parser.ParseComments) -} diff --git a/vendor/cuelang.org/go/internal/encoding/json/encode.go b/vendor/cuelang.org/go/internal/encoding/json/encode.go index 8f900350..40c2efdb 100644 --- a/vendor/cuelang.org/go/internal/encoding/json/encode.go +++ b/vendor/cuelang.org/go/internal/encoding/json/encode.go @@ -24,19 +24,35 @@ import ( "cuelang.org/go/cue/errors" "cuelang.org/go/cue/literal" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/astinternal" ) -// Encode converts a CUE AST to JSON. +// Marshal is a replacement for [json.Marshal] without HTML escaping. +func Marshal(v any) ([]byte, error) { + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + if err := enc.Encode(v); err != nil { + return nil, err + } + p := buf.Bytes() + // Unlike json.Marshal, json.Encoder.Encode adds a trailing newline. + p = bytes.TrimSuffix(p, []byte("\n")) + return p, nil +} + +// Encode converts a CUE AST to unescaped JSON. // // The given file must only contain values that can be directly supported by // JSON: -// Type Restrictions -// BasicLit -// File no imports, aliases, or definitions -// StructLit no embeddings, aliases, or definitions -// List -// Field must be regular; label must be a BasicLit or Ident +// +// Type Restrictions +// BasicLit +// File no imports, aliases, or definitions +// StructLit no embeddings, aliases, or definitions +// List +// Field must be regular; label must be a BasicLit or Ident // // Comments and attributes are ignored. func Encode(n ast.Node) (b []byte, err error) { @@ -185,7 +201,7 @@ func (e *encoder) encodeScalar(l *ast.BasicLit, allowMinus bool) error { if err != nil { return err } - b, err := json.Marshal(str) + b, err := Marshal(str) if err != nil { return err } @@ -229,8 +245,8 @@ func (e *encoder) encodeDecls(decls []ast.Decl, endPos token.Pos) error { continue case *ast.Field: - if x.Token == token.ISA { - return errors.Newf(x.TokenPos, "json: definition not allowed") + if !internal.IsRegularField(x) { + return errors.Newf(x.TokenPos, "json: definition or hidden field not allowed") } if x.Optional != token.NoPos { return errors.Newf(x.Optional, "json: optional fields not allowed") @@ -275,7 +291,7 @@ func (e *encoder) encodeDecls(decls []ast.Decl, endPos token.Pos) error { if err != nil { return errors.Newf(x.Label.Pos(), "json: only literal labels allowed") } - b, err := json.Marshal(name) + b, err := Marshal(name) if err != nil { return err } diff --git a/vendor/cuelang.org/go/internal/encoding/yaml/encode.go b/vendor/cuelang.org/go/internal/encoding/yaml/encode.go index 7eaf55c8..55871dab 100644 --- a/vendor/cuelang.org/go/internal/encoding/yaml/encode.go +++ b/vendor/cuelang.org/go/internal/encoding/yaml/encode.go @@ -28,6 +28,7 @@ import ( "cuelang.org/go/cue/errors" "cuelang.org/go/cue/literal" "cuelang.org/go/cue/token" + "cuelang.org/go/internal" "cuelang.org/go/internal/astinternal" ) @@ -35,15 +36,16 @@ import ( // // The given file must only contain values that can be directly supported by // YAML: -// Type Restrictions -// BasicLit -// File no imports, aliases, or definitions -// StructLit no embeddings, aliases, or definitions -// List -// Field must be regular; label must be a BasicLit or Ident -// CommentGroup // -// TODO: support anchors through Ident. +// Type Restrictions +// BasicLit +// File no imports, aliases, or definitions +// StructLit no embeddings, aliases, or definitions +// List +// Field must be regular; label must be a BasicLit or Ident +// CommentGroup +// +// TODO: support anchors through Ident. func Encode(n ast.Node) (b []byte, err error) { y, err := encode(n) if err != nil { @@ -259,8 +261,8 @@ func encodeDecls(decls []ast.Decl) (n *yaml.Node, err error) { continue case *ast.Field: - if x.Token == token.ISA { - return nil, errors.Newf(x.TokenPos, "yaml: definition not allowed") + if !internal.IsRegularField(x) { + return nil, errors.Newf(x.TokenPos, "yaml: definition or hidden fields not allowed") } if x.Optional != token.NoPos { return nil, errors.Newf(x.Optional, "yaml: optional fields not allowed") @@ -364,9 +366,7 @@ func addDocs(n ast.Node, h, f *yaml.Node) { // that comments with empty lines get properly converted. func docToYAML(c *ast.CommentGroup) string { s := c.Text() - if strings.HasSuffix(s, "\n") { // always true - s = s[:len(s)-1] - } + s = strings.TrimSuffix(s, "\n") // always trims lines := strings.Split(s, "\n") for i, l := range lines { if l == "" { diff --git a/vendor/cuelang.org/go/internal/filetypes/filetypes.go b/vendor/cuelang.org/go/internal/filetypes/filetypes.go index cc72f622..27e90b59 100644 --- a/vendor/cuelang.org/go/internal/filetypes/filetypes.go +++ b/vendor/cuelang.org/go/internal/filetypes/filetypes.go @@ -96,13 +96,12 @@ func FromFile(b *build.File, mode Mode) (*FileInfo, error) { }, nil } - i := cuegenInstance.Value() - i, errs := update(nil, i, i, "modes", mode.String()) + i, errs := update(nil, cuegenValue, cuegenValue, "modes", mode.String()) v := i.LookupDef("FileInfo") v = v.Fill(b) if b.Encoding == "" { - ext := i.Lookup("extensions", filepath.Ext(b.Filename)) + ext := i.Lookup("extensions", fileExt(b.Filename)) if ext.Exists() { v = v.Unify(ext) } @@ -145,18 +144,18 @@ func update(errs errors.Error, v, i cue.Value, field, value string) (cue.Value, // // The arguments are of the form // -// file* (spec: file+)* +// file* (spec: file+)* // // where file is a filename and spec is itself of the form // -// tag[=value]('+'tag[=value])* +// tag[=value]('+'tag[=value])* // // A file type spec applies to all its following files and until a next spec // is found. // // Examples: -// json: foo.data bar.data json+schema: bar.schema // +// json: foo.data bar.data json+schema: bar.schema func ParseArgs(args []string) (files []*build.File, err error) { var inst, v cue.Value @@ -221,8 +220,8 @@ func ParseArgs(args []string) (files []*build.File, err error) { // passed to a command line argument. // // Example: -// cue eval -o yaml:foo.data // +// cue eval -o yaml:foo.data func ParseFile(s string, mode Mode) (*build.File, error) { scope := "" file := s @@ -260,7 +259,7 @@ func toFile(i, v cue.Value, filename string) (*build.File, error) { if !hasDefault { v = v.Unify(i.LookupDef("Default")) } - } else if ext := filepath.Ext(filename); ext != "" { + } else if ext := fileExt(filename); ext != "" { if x := i.Lookup("extensions", ext); x.Exists() || !hasDefault { v = v.Unify(x) if err := v.Err(); err != nil { @@ -283,7 +282,7 @@ func toFile(i, v cue.Value, filename string) (*build.File, error) { } func parseType(s string, mode Mode) (inst, val cue.Value, err error) { - i := cuegenInstance.Value() + i := cuegenValue i = i.Unify(i.Lookup("modes", mode.String())) v := i.LookupDef("File") @@ -304,3 +303,13 @@ func parseType(s string, mode Mode) (inst, val cue.Value, err error) { return i, v, nil } + +// fileExt is like filepath.Ext except we don't treat file names starting with "." as having an extension +// unless there's also another . in the name. +func fileExt(f string) string { + e := filepath.Ext(f) + if e == "" || e == filepath.Base(f) { + return "" + } + return e +} diff --git a/vendor/cuelang.org/go/internal/filetypes/types.go b/vendor/cuelang.org/go/internal/filetypes/types.go index b4cd55ae..3b66cb9c 100644 --- a/vendor/cuelang.org/go/internal/filetypes/types.go +++ b/vendor/cuelang.org/go/internal/filetypes/types.go @@ -10,7 +10,7 @@ import ( _ "cuelang.org/go/pkg" ) -var cuegenCodec, cuegenInstance = func() (*gocodec.Codec, *cue.Instance) { +var cuegenCodec, cuegenInstance_, cuegenValue = func() (*gocodec.Codec, *cue.Instance, cue.Value) { var r *cue.Runtime r = &cue.Runtime{} instances, err := r.Unmarshal(cuegenInstanceData) @@ -20,13 +20,16 @@ var cuegenCodec, cuegenInstance = func() (*gocodec.Codec, *cue.Instance) { if len(instances) != 1 { panic("expected encoding of exactly one instance") } - return gocodec.New(r, nil), instances[0] + return gocodec.New(r, nil), instances[0], instances[0].Value() }() +// Deprecated: cue.Instance is deprecated. Use cuegenValue instead. +var cuegenInstance = cuegenInstance_ + // cuegenMake is called in the init phase to initialize CUE values for // validation functions. func cuegenMake(name string, x interface{}) cue.Value { - f, err := cuegenInstance.Value().FieldByName(name, true) + f, err := cuegenValue.FieldByName(name, true) if err != nil { panic(fmt.Errorf("could not find type %q in instance", name)) } @@ -42,4 +45,4 @@ func cuegenMake(name string, x interface{}) cue.Value { } // Data size: 1708 bytes. -var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4X\xddo\xe4\xb6\x11\x97|W\xa0R\xd3>\xe6\xad\xc0\x9c\xae\bR\xe3*#\x1f@\x81\x05\x8cC\u047b+\xee\xa5)\x8a\xf4)\b\f\xae4\xdae#\x91*I%6\xe2}h\x9b\xa6\xfd\xab\xb3\u0150\x94(je\xfb\f\xa4\xa8_\xbc;?\xcepf8\x9f\xfb\xf3\xe3\xbf\xcf\u04b3\xe3\u007f\x92\xf4\xf8\x8f$\xf9\xed\xf1\xefO\xd2\xf4=.\xb4a\xa2\xc2W\xcc0\xa2\xa7O\u04a7\u007f\x96\u04a4gI\xfa\xf4O\xcc\xec\xd3\xf7\x92\xf4'ox\x8b:=~\x9f$\xc9/\x8f\xff:K\xd3_|\xf1e5`\xd9\xf0\xd6s~\x9f\xa4\xc7\xef\x92\xe4\xc3\xe3?\x9f\xa4\xe9O\x03\xfd\xbb$=K\x9f\xfe\x91uH\x82\x9eZb\x9e$\xc9\x0f\xef\xff\x8a4I\u04f34\xcd\xccM\x8f\xba\xac\x06L\u007fx\xffg=\xab\xbeb;\x84\xed\xc0\xdb:\xcf/.\xe0w@\xf7C%\x95B\xddKQk0\x12\x18\xfcA\xbaC%\xc1e\xfe\x9c\xfem\xe0\xdb<\xa3\xeb\x05\xebp\x03\xfeO\x1b\xc5\xc5.\xcfPT\xb2\xe6b7\x01\xcf_{J\x9eqaP\xf5\n\r3\\\x8a\x97\x1bx\xfe6\xa2\xe4Y#U\xf7rb%\xee7Ruyf\xd8N\xbf\xb4\x17g_\xb8\x9b\xbe\xdcLW\x1e\xf2\x835\xe2\x156lh\rp\rf\x8f@*\u00a0\xb1\x86F*\u0426\xe6\x02\x98\xa8\xe9\x93\x1cL\t\x9f\xef\x114\x1a\xc3\xc5NC\x8d=\x8a\x9a\xa4H\x11\xb8;Y\x93\xd5^\xf0\x06\xac\xfd\xf0A\xec\x80\xf3\xe27\x05\u070e\xda\x1cf\xfe|+\x1a\t56\\\xa0\x86\xbd\xfc\x06\x98\x13\xcb5X7am\x15\x9a\u0702\xb5w11Zk\xed\xb7<\xab\x99a\xc1+\xe7F\r\b\xb7\u0430Vc\x9e)lP\xa1\xa8PoN\xc1\xea\xa6j\x1d\xb0\xc2iU\xe3\xe4y:\xb1\x95\xb2\xcd3\xd9\xd3w\xd6:\x16G\xab\xa4\xd0F1.L8\xf7\x15b\xef\xfd\xa27\x9e\xc6E%\xbb\xbeEc\xc3\xc2\u04fa^*3j\xe0h\xda(d\u0768\x94\xa3\u0572\xd2\xc1DGc\xc6(\xbe\x1d\x8c3\xc0\u049c{\xe9]4=\x1e=\x9c\xd3\xc1>r\xcd\x1b\xeb\v\x03\xb2G\u015c%\xeet\x99_\\\x10\xeb\xe7{\xd4\b\x06\xbb\xbee\x0650\x85\xf6\x01\x04\xbd\x86\x91\xb0E\x18\x04o8\u04bb\x0036\x18\x94\x94\x06d\x03f\xcf5\t\xa9\xa4h\xf8np7\x94\xb9\xbd\xc0\xbe\x17\x17\xfd`\\\x9c\xb6h\xe0\x1a.\xed\xe7\u023a\xc5#d\x91\x99K\xf0\x90gY\x88?++d\xd8yQ\rH\xb1wE\xf4\xb2,G\x86\x10C\xd7y`\xd0^@5P\xd4R\xaa\xe9RW{\xec\x98\x17A\xbcxmPh\x17\x12\xf6tQ\xfeUKQ\xf8o\x8b\x1c&\x1d\xd8`\xe4\xa4\xc4\xc1\xb1\u0730\xae},\xcb\xe38\x0e\x94\xf7\x19^St\xcd\x1c~\xf5\u045a\u02fdS\xcfW]\xbe\x04\x1fp\xb9\xf5\xc6\xfd>\xbf\xfa\xe8\x01\xafS>\a\x9f\x1f\xf2L\x0e\xbd\x89\x02\xe7\xea\xe3\x1f\u01ce\xb9V\x1f?V+\xfc\x9a\xea@\xd0\xe9\x93\xff\xb5o\x1f\x0e\xe7\xabO\x1e0\xa2\xe1\x94\xf2s+jl\xe6F|\xfa\xff\xcf\u026bO\x1f\x99\x95c\x87{=&'t\xac\u05ee\x99\x84\x84\xa5\xf2\xe5\u02e1\x83zEe\xd0p\xaa~\x8b\xbc.\x8ay\x97\xbd\u02b3\x82\x86\x83\x89H\xfd\x96\byH\xff@'\xc2\b\xb4\x1e\x99\x80\x96\x90\xb6\x0eL1\"\xeeD|\xc9\b\u0488\x90O\x85a\x050\xd7&\x06\f^\x1b\x02v2Xg\x81\x9d$r\xaf\xa4\x91s}-\xc1J\xc2k3\xa2\x93\xa4\x18\xdd\xcet\x0eh\x9eQK\xf9\xec\xd5g\x1b C4\xfe\xed\x85%\x15\xe5\xc801m\xb9\xe8\xb7pq\x01[.\x98\xba\xe9\xb7\u04e80\x0eH\xc0E\xcd+\u05d5\xdc\x03R40c[\x9b\xc2^\xa1FA\xe3\n0z\u069db]\x99O\xe3\xd5\x06\x9e]\x16\x85\x13) \x1e\xac\xa0F\x83\xaa\x9b\xcd!\x15*\u00f8\x18\xe5\x80\xde\u02e1\xad\xa9\xfbE\xd3\xc8\xc5\x05\xbc\x91\n\xc6\x11\xf6\x05\xd8\x1a\u0471\x9b\xc5I`\u0509u\xa5\xf8\xd6\xe9\xe7\"\xf8\x05|\xb3\xe7\xd5\x1e\xb8\xd1\xd86\xb6s2A\xac\x95\x14_\xa32\xae\xe52\xf8\xfd_^{\x8e2_\u0304\u04d8g'\xc1y\xd0zzcG\xd2hd\x1cG\xaf\u0160V4R\xbahv\x83\xa6\xe3*\xdc\u0145\u007f\x0ez+\x97]\x95\xec:\x1a\xcfZ.\u0411\x8d<\xcd+\x02lF91.\x99\x9d\xf4I2\xa5\xf0N\xb1~\x1f\xa1\x96\xe2\xc0\x9a\xed\"\xa8f\xbb\x110l\x81\x18/\xd0\u058bo\xf3y\xed\xb1\xa5\u01c2d\xe5\t\xeaM\xf7p\xbb\x8a\xb7\xee\x00\xa5\xd8\tn3\xd4\xc26\xf8Op\x97A\xf6\xc0\x94!'\x87B\xaa\xd1A\x9b,\xfd\x96&b;\xa9#7{T\xe4\xe81\x17|\xba\xc0(\xe2\x05\xc8\b\u03f3~\xbb\x81\xf3\xf8\x16\xf7W\x8c\x99V\xe4\xa7#EA\xf7\xc3-\xac1>\xbb\xbc\x9f\u0552\xbd\x95\xab\x06\x16\u04c3Y=\u00a39\xb1'<\x8e|'\xd7\xee\u010d\xde@\xda!\xee2.\x9b\"3\xcbZf\xaf\u0651\xd3}W$\xd6\x1fE\uae05y\xb94\xa89\xfc\x84\xdd\xcep+\x17F3\x95\x8f\xcey6\x9d\b\n\a\xdeE\x9c\xecQ\xb0\x9e\xdf!\u02e3\xef \xc8\xd5\a\u06e0\xa7\xa5\xce7j*\u042cm\x1dX\xc2[\x03\xb5D\rB\x1a\xe0\xa2j\x87\x1a\xddN)U\ao_\x95\xb9=g\x15\xb2\x1b-\xed\xee\x97\xd3Z;\xd5/\xab=5\uaaf5\xea\x02\x93\x96\xde\x15p\v\x85\x9d~\uc9f1\xba,\x96\xad\xe5@\x16\xafl\xcbI'^\x10\x97h\xbc*~\x18\xc1\xbf\x86\x0f\x96\x94<[,\x92Ky\xf1J\xb9D\xe3Er\x81\x1e\xa8\u038bqZ\x9d\x0fQ'\xfe\xf2>:\xb9o\u076a \xff\xa4\x80\x87\ap\xbe&\xafS\xe1v\xffm\xee.\x16w\xd2\xf9\xc4\xe7\ubfbeW\x9b\x85\x1f\xd7\xfd\xb7\xee\xb7`O\xd4stim\x98\xd9\xf6\xec2\x84\xd0\xf8#\u009cy\u0797hu\xd8-\xfd\xf2\xec\u04b7\xb1X\xdbQ\xad\xe8W\x8b\u026e\xf9\xaf\x15\xab\x06\xac\xfae\xd2\xeb\x90\xc7S\xf5\xd4#\xc7$\b\x16\x84\x0e\x19\x96\x9fE\xb6\xb8$\x81\xdb\xf1\xdd\xe6\v\u00e8\xc7|O\b\xc2C\xfb\x8c\x9d\x1b\xa9Ai\xe8$\xc7\x1dyU\x9f\xe9`\xe89\xab\xe7\x82\x0e\xf3V\xf3\xc0Q#\xbb\xfb\xee\x0e\ag-}\x91c\xef4\x06D\xd2\xef\x98\tf/\xb0\xb4\x85\x1a\xfd}b\xe6={MJhy\v\xe5O\f=\xe4q\x9fxD\xad\xb6\u02d4k\x82\xf1-\u02eev\xa7\x03\xef\xed_\xef\u0335\xea\xace4\x1d\xf2$\xf9o\x00\x00\x00\xff\xff\x85i\xbeS\xb4\x16\x00\x00") +var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xc4X\xddo\xe4\xb6\x11\x97|W\xa0R\xd3>\xe6\xad\xc0\x9c\xae\bR\xe3*#\x1f@\x81\x05\x8cC\u047b+\xee\xa5)\x8a\xf4)\b\f\xae4\xdae#\x91*I%6\xe2}h\x9b\xa6\xfd\xab\xb3\u0150\x94(je\xfb\f\xa4\xa8_\xbc;?\xcepf8\x9f\xfb\xf3\xe3\xbf\xcf\u04b3\xe3\x7f\x92\xf4\xf8\x8f$\xf9\xed\xf1\xefO\xd2\xf4=.\xb4a\xa2\xc2W\xcc0\xa2\xa7O\u04a7\x7f\x96\u04a4gI\xfa\xf4O\xcc\xec\xd3\xf7\x92\xf4'ox\x8b:=~\x9f$\xc9/\x8f\xff:K\xd3_|\xf1e5`\xd9\xf0\xd6s~\x9f\xa4\xc7\xef\x92\xe4\xc3\xe3?\x9f\xa4\xe9O\x03\xfd\xbb$=K\x9f\xfe\x91uH\x82\x9eZb\x9e$\xc9\x0f\xef\xff\x8a4I\u04f34\xcd\xccM\x8f\xba\xac\x06L\x7fx\xffg=\xab\xbeb;\x84\xed\xc0\xdb:\xcf/.\xe0w@\xf7C%\x95B\xddKQk0\x12\x18\xfcA\xbaC%\xc1e\xfe\x9c\xfem\xe0\xdb<\xa3\xeb\x05\xebp\x03\xfeO\x1b\xc5\xc5.\xcfPT\xb2\xe6b7\x01\xcf_{J\x9eqaP\xf5\n\r3\\\x8a\x97\x1bx\xfe6\xa2\xe4Y#U\xf7rb%\xee7Ruyf\xd8N\xbf\xb4\x17g_\xb8\x9b\xbe\xdcLW\x1e\xf2\x835\xe2\x156lh\rp\rf\x8f@*\u00a0\xb1\x86F*\u0426\xe6\x02\x98\xa8\xe9\x93\x1cL\t\x9f\xef\x114\x1a\xc3\xc5NC\x8d=\x8a\x9a\xa4H\x11\xb8;Y\x93\xd5^\xf0\x06\xac\xfd\xf0A\xec\x80\xf3\xe27\x05\u070e\xda\x1cf\xfe|+\x1a\t56\\\xa0\x86\xbd\xfc\x06\x98\x13\xcb5X7am\x15\x9a\u0702\xb5w11Zk\xed\xb7<\xab\x99a\xc1+\xe7F\r\b\xb7\u0430Vc\x9e)lP\xa1\xa8PoN\xc1\xea\xa6j\x1d\xb0\xc2iU\xe3\xe4y:\xb1\x95\xb2\xcd3\xd9\xd3w\xd6:\x16G\xab\xa4\xd0F1.L8\xf7\x15b\xef\xfd\xa27\x9e\xc6E%\xbb\xbeEc\xc3\xc2\u04fa^*3j\xe0h\xda(d\u0768\x94\xa3\u0572\xd2\xc1DGc\xc6(\xbe\x1d\x8c3\xc0\u049c{\xe9]4=\x1e=\x9c\xd3\xc1>r\xcd\x1b\xeb\v\x03\xb2G\u015c%\xeet\x99_\\\x10\xeb\xe7{\xd4\b\x06\xbb\xbee\x0650\x85\xf6\x01\x04\xbd\x86\x91\xb0E\x18\x04o8\u04bb\x0036\x18\x94\x94\x06d\x03f\xcf5\t\xa9\xa4h\xf8np7\x94\xb9\xbd\xc0\xbe\x17\x17\xfd`\\\x9c\xb6h\xe0\x1a.\xed\xe7\u023a\xc5#d\x91\x99K\xf0\x90gY\x88?++d\xd8yQ\rH\xb1wE\xf4\xb2,G\x86\x10C\xd7y`\xd0^@5P\xd4R\xaa\xe9RW{\xec\x98\x17A\xbcxmPh\x17\x12\xf6tQ\xfeUKQ\xf8o\x8b\x1c&\x1d\xd8`\xe4\xa4\xc4\xc1\xb1\u0730\xae},\xcb\xe38\x0e\x94\xf7\x19^St\xcd\x1c~\xf5\u045a\u02fdS\xcfW]\xbe\x04\x1fp\xb9\xf5\xc6\xfd>\xbf\xfa\xe8\x01\xafS>\a\x9f\x1f\xf2L\x0e\xbd\x89\x02\xe7\xea\xe3\x1f\u01ce\xb9V\x1f?V+\xfc\x9a\xea@\xd0\xe9\x93\xff\xb5o\x1f\x0e\xe7\xabO\x1e0\xa2\xe1\x94\xf2s+jl\xe6F|\xfa\xff\xcf\u026bO\x1f\x99\x95c\x87{=&'t\xac\u05ee\x99\x84\x84\xa5\xf2\xe5\u02e1\x83zEe\xd0p\xaa~\x8b\xbc.\x8ay\x97\xbd\u02b3\x82\x86\x83\x89H\xfd\x96\byH\xff@'\xc2\b\xb4\x1e\x99\x80\x96\x90\xb6\x0eL1\"\xeeD|\xc9\b\u0488\x90O\x85a\x050\xd7&\x06\f^\x1b\x02v2Xg\x81\x9d$r\xaf\xa4\x91s}-\xc1J\xc2k3\xa2\x93\xa4\x18\xdd\xcet\x0eh\x9eQK\xf9\xec\xd5g\x1b C4\xfe\xed\x85%\x15\xe5\xc801m\xb9\xe8\xb7pq\x01[.\x98\xba\xe9\xb7\u04e80\x0eH\xc0E\xcd+\u05d5\xdc\x03R40c[\x9b\xc2^\xa1FA\xe3\n0z\u069db]\x99O\xe3\xd5\x06\x9e]\x16\x85\x13) \x1e\xac\xa0F\x83\xaa\x9b\xcd!\x15*\u00f8\x18\xe5\x80\xde\u02e1\xad\xa9\xfbE\xd3\xc8\xc5\x05\xbc\x91\n\xc6\x11\xf6\x05\xd8\x1a\u0471\x9b\xc5I`\u0509u\xa5\xf8\xd6\xe9\xe7\"\xf8\x05|\xb3\xe7\xd5\x1e\xb8\xd1\xd86\xb6s2A\xac\x95\x14_\xa32\xae\xe52\xf8\xfd_^{\x8e2_\u0304\u04d8g'\xc1y\xd0zzcG\xd2hd\x1cG\xaf\u0160V4R\xbahv\x83\xa6\xe3*\xdc\u0145\x7f\x0ez+\x97]\x95\xec:\x1a\xcfZ.\u0411\x8d<\xcd+\x02lF91.\x99\x9d\xf4I2\xa5\xf0N\xb1~\x1f\xa1\x96\xe2\xc0\x9a\xed\"\xa8f\xbb\x110l\x81\x18/\xd0\u058bo\xf3y\xed\xb1\xa5\u01c2d\xe5\t\xeaM\xf7p\xbb\x8a\xb7\xee\x00\xa5\xd8\tn3\xd4\xc26\xf8Op\x97A\xf6\xc0\x94!'\x87B\xaa\xd1A\x9b,\xfd\x96&b;\xa9#7{T\xe4\xe81\x17|\xba\xc0(\xe2\x05\xc8\b\u03f3~\xbb\x81\xf3\xf8\x16\xf7W\x8c\x99V\xe4\xa7#EA\xf7\xc3-\xac1>\xbb\xbc\x9f\u0552\xbd\x95\xab\x06\x16\u04c3Y=\u00a39\xb1'<\x8e|'\xd7\xee\u010d\xde@\xda!\xee2.\x9b\"3\xcbZf\xaf\u0651\xd3}W$\xd6\x1fE\uae05y\xb94\xa89\xfc\x84\xdd\xcep+\x17F3\x95\x8f\xcey6\x9d\b\n\a\xdeE\x9c\xecQ\xb0\x9e\xdf!\u02e3\xef \xc8\xd5\a\u06e0\xa7\xa5\xce7j*\u042cm\x1dX\xc2[\x03\xb5D\rB\x1a\xe0\xa2j\x87\x1a\xddN)U\ao_\x95\xb9=g\x15\xb2\x1b-\xed\xee\x97\xd3Z;\xd5/\xab=5\uaaf5\xea\x02\x93\x96\xde\x15p\v\x85\x9d~\uc9f1\xba,\x96\xad\xe5@\x16\xafl\xcbI'^\x10\x97h\xbc*~\x18\xc1\xbf\x86\x0f\x96\x94<[,\x92Ky\xf1J\xb9D\xe3Er\x81\x1e\xa8\u038bqZ\x9d\x0fQ'\xfe\xf2>:\xb9o\u076a \xff\xa4\x80\x87\ap\xbe&\xafS\xe1v\xffm\xee.\x16w\xd2\xf9\xc4\xe7\ubfbeW\x9b\x85\x1f\xd7\xfd\xb7\xee\xb7`O\xd4stim\x98\xd9\xf6\xec2\x84\xd0\xf8#\u009cy\u0797hu\xd8-\xfd\xf2\xec\u04b7\xb1X\xdbQ\xad\xe8W\x8b\u026e\xf9\xaf\x15\xab\x06\xac\xfae\xd2\xeb\x90\xc7S\xf5\xd4#\xc7$\b\x16\x84\x0e\x19\x96\x9fE\xb6\xb8$\x81\xdb\xf1\xdd\xe6\v\u00e8\xc7|O\b\xc2C\xfb\x8c\x9d\x1b\xa9Ai\xe8$\xc7\x1dyU\x9f\xe9`\xe89\xab\xe7\x82\x0e\xf3V\xf3\xc0Q#\xbb\xfb\xee\x0e\ag-}\x91c\xef4\x06D\xd2\xef\x98\tf/\xb0\xb4\x85\x1a\xfd}b\xe6={MJhy\v\xe5O\f=\xe4q\x9fxD\xad\xb6\u02d4k\x82\xf1-\u02eev\xa7\x03\xef\xed_\xef\u0335\xea\xace4\x1d\xf2$\xf9o\x00\x00\x00\xff\xff\x85i\xbeS\xb4\x16\x00\x00") diff --git a/vendor/cuelang.org/go/internal/filetypes/util.go b/vendor/cuelang.org/go/internal/filetypes/util.go index 01d2760f..bfca2dbe 100644 --- a/vendor/cuelang.org/go/internal/filetypes/util.go +++ b/vendor/cuelang.org/go/internal/filetypes/util.go @@ -15,7 +15,6 @@ package filetypes import ( - "path/filepath" "strings" "cuelang.org/go/cue/ast" @@ -48,8 +47,8 @@ func IsPackage(s string) bool { // Assuming we terminate search for packages once a scoped qualifier is // found, we know that any file without an extension (except maybe '-') // is invalid. We can therefore assume it is a package. - // The section may still contain a dot, for instance ./foo/. or ./foo/... - return strings.TrimLeft(filepath.Ext(s), ".") == "" + // The section may still contain a dot, for instance ./foo/., ./.foo/, or ./foo/... + return strings.TrimLeft(fileExt(s), ".") == "" // NOTE/TODO: we have not needed to check whether it is an absolute package // or whether the package starts with a dot. Potentially we could thus relax diff --git a/vendor/cuelang.org/go/internal/internal.go b/vendor/cuelang.org/go/internal/internal.go index 1dfc178f..c944f883 100644 --- a/vendor/cuelang.org/go/internal/internal.go +++ b/vendor/cuelang.org/go/internal/internal.go @@ -26,7 +26,7 @@ import ( "path/filepath" "strings" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/cue/ast" "cuelang.org/go/cue/ast/astutil" @@ -39,6 +39,54 @@ import ( // Right now Decimal is aliased to apd.Decimal. This may change in the future. type Decimal = apd.Decimal +// Context wraps apd.Context for CUE's custom logic. +// +// Note that it avoids pointers to make it easier to make copies. +type Context struct { + apd.Context +} + +// WithPrecision mirrors upstream, but returning our type without a pointer. +func (c Context) WithPrecision(p uint32) Context { + c.Context = *c.Context.WithPrecision(p) + return c +} + +// apd/v2 used to call Reduce on the result of Quo and Rem, +// so that the operations always trimmed all but one trailing zeros. +// apd/v3 does not do that at all. +// For now, get the old behavior back by calling Reduce ourselves. +// Note that v3's Reduce also removes all trailing zeros, +// whereas v2's Reduce would leave ".0" behind. +// Get that detail back as well, to consistently show floats with decimal points. +// +// TODO: Rather than reducing all trailing zeros, +// we should keep a number of zeros that makes sense given the operation. + +func reduceKeepingFloats(d *apd.Decimal) { + oldExponent := d.Exponent + d.Reduce(d) + // If the decimal had decimal places, like "3.000" and "5.000E+5", + // Reduce gives us "3" and "5E+5", but we want "3.0" and "5.0E+5". + if oldExponent < 0 && d.Exponent >= 0 { + d.Exponent-- + // TODO: we can likely make the NewBigInt(10) a static global to reduce allocs + d.Coeff.Mul(&d.Coeff, apd.NewBigInt(10)) + } +} + +func (c Context) Quo(d, x, y *apd.Decimal) (apd.Condition, error) { + res, err := c.Context.Quo(d, x, y) + reduceKeepingFloats(d) + return res, err +} + +func (c Context) Sqrt(d, x *apd.Decimal) (apd.Condition, error) { + res, err := c.Context.Sqrt(d, x) + reduceKeepingFloats(d) + return res, err +} + // ErrIncomplete can be used by builtins to signal the evaluation was // incomplete. var ErrIncomplete = errors.New("incomplete value") @@ -46,8 +94,22 @@ var ErrIncomplete = errors.New("incomplete value") // MakeInstance makes a new instance from a value. var MakeInstance func(value interface{}) (instance interface{}) -// BaseContext is used as CUEs default context for arbitrary-precision decimals -var BaseContext = apd.BaseContext.WithPrecision(24) +// BaseContext is used as CUE's default context for arbitrary-precision decimals. +var BaseContext = Context{*apd.BaseContext.WithPrecision(34)} + +// APIVersionSupported is the back version until which deprecated features +// are still supported. +var APIVersionSupported = Version(MinorSupported, PatchSupported) + +const ( + MinorCurrent = 5 + MinorSupported = 4 + PatchSupported = 0 +) + +func Version(minor, patch int) int { + return -1000 + 100*minor + patch +} // ListEllipsis reports the list type and remaining elements of a list. If we // ever relax the usage of ellipsis, this function will likely change. Using @@ -263,33 +325,6 @@ func ToFile(n ast.Node) *ast.File { } } -// ToStruct gets the non-preamble declarations of a file and puts them in a -// struct. -func ToStruct(f *ast.File) *ast.StructLit { - start := 0 - for i, d := range f.Decls { - switch d.(type) { - case *ast.Package, *ast.ImportDecl: - start = i + 1 - case *ast.Attribute, *ast.CommentGroup: - default: - break - } - } - s := ast.NewStruct() - s.Elts = f.Decls[start:] - return s -} - -func IsBulkField(d ast.Decl) bool { - if f, ok := d.(*ast.Field); ok { - if _, ok := f.Label.(*ast.ListLit); ok { - return true - } - } - return false -} - func IsDef(s string) bool { return strings.HasPrefix(s, "#") || strings.HasPrefix(s, "_#") } @@ -315,9 +350,6 @@ func IsDefinition(label ast.Label) bool { } func IsRegularField(f *ast.Field) bool { - if f.Token == token.ISA { - return false - } var ident *ast.Ident switch x := f.Label.(type) { case *ast.Alias: @@ -334,6 +366,30 @@ func IsRegularField(f *ast.Field) bool { return true } +// ConstraintToken reports which constraint token (? or !) is associated +// with a field (if any), taking into account compatibility of deprecated +// fields. +func ConstraintToken(f *ast.Field) (t token.Token, ok bool) { + if f.Constraint != token.ILLEGAL { + return f.Constraint, true + } + if f.Optional != token.NoPos { + return token.OPTION, true + } + return f.Constraint, false +} + +// SetConstraints sets both the main and deprecated fields of f according to the +// given constraint token. +func SetConstraint(f *ast.Field, t token.Token) { + f.Constraint = t + if t == token.ILLEGAL { + f.Optional = token.NoPos + } else { + f.Optional = token.Blank.Pos() + } +} + func EmbedStruct(s *ast.StructLit) *ast.EmbedDecl { e := &ast.EmbedDecl{Expr: s} if len(s.Elts) == 1 { diff --git a/vendor/cuelang.org/go/pkg/internal/builtin.go b/vendor/cuelang.org/go/internal/pkg/builtin.go similarity index 88% rename from vendor/cuelang.org/go/pkg/internal/builtin.go rename to vendor/cuelang.org/go/internal/pkg/builtin.go index 8de08053..c4227e66 100644 --- a/vendor/cuelang.org/go/pkg/internal/builtin.go +++ b/vendor/cuelang.org/go/internal/pkg/builtin.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package internal +package pkg import ( "encoding/json" @@ -30,20 +30,19 @@ import ( // // A function may return and a constant may be any of the following types: // -// error (translates to bottom) -// nil (translates to null) -// bool -// int* -// uint* -// float64 -// string -// *big.Float -// *big.Int -// -// For any of the above, including interface{} and these types recursively: -// []T -// map[string]T +// error (translates to bottom) +// nil (translates to null) +// bool +// int* +// uint* +// float64 +// string +// *big.Float +// *big.Int // +// For any of the above, including interface{} and these types recursively: +// []T +// map[string]T type Builtin struct { Name string Pkg adt.Feature @@ -75,9 +74,11 @@ func (p *Package) MustCompile(ctx *adt.OpContext, importPath string) *adt.Vertex f := ctx.StringLabel(b.Name) // never starts with _ // n := &node{baseValue: newBase(imp.Path)} - var v adt.Expr = toBuiltin(ctx, b) + var v adt.Expr if b.Const != "" { v = mustParseConstBuiltin(ctx, b.Name, b.Const) + } else { + v = ToBuiltin(b) } st.Decls = append(st.Decls, &adt.Field{ Label: f, @@ -100,14 +101,15 @@ func (p *Package) MustCompile(ctx *adt.OpContext, importPath string) *adt.Vertex // We could compile lazily, but this is easier for debugging. obj.Finalize(ctx) - if err := obj.Err(ctx, adt.Finalized); err != nil { + if err := obj.Err(ctx); err != nil { panic(err.Err) } return obj } -func toBuiltin(ctx *adt.OpContext, b *Builtin) *adt.Builtin { +// ToBuiltin converts a Builtin into an adt.Builtin. +func ToBuiltin(b *Builtin) *adt.Builtin { params := make([]adt.Param, len(b.Params)) for i, p := range b.Params { params[i].Value = p.Value @@ -149,7 +151,7 @@ func toBuiltin(ctx *adt.OpContext, b *Builtin) *adt.Builtin { return nil case adt.Value: return v - case bottomer: + case Bottomer: // deal with API limitation: catch nil interface issue. if b := v.Bottom(); b != nil { return b @@ -157,7 +159,9 @@ func toBuiltin(ctx *adt.OpContext, b *Builtin) *adt.Builtin { return nil } if c.Err != nil { - return nil + if _, ok := c.Err.(ValidationError); !ok || c.ctx.IsValidator { + return nil + } } return convert.GoValueToValue(ctx, c.Ret, true) } @@ -186,25 +190,25 @@ func (x *Builtin) name(ctx *adt.OpContext) string { return fmt.Sprintf("%s.%s", x.Pkg.StringValue(ctx), x.Name) } -func (x *Builtin) isValidator() bool { - return len(x.Params) == 1 && x.Result == adt.BoolKind -} - func processErr(call *CallCtxt, errVal interface{}, ret adt.Expr) adt.Expr { ctx := call.ctx switch err := errVal.(type) { case nil: + case ValidationError: + if call.ctx.IsValidator { + ret = err.B + } case *adt.Bottom: ret = err case *callError: ret = err.b case *json.MarshalerError: - if err, ok := err.Err.(bottomer); ok { + if err, ok := err.Err.(Bottomer); ok { if b := err.Bottom(); b != nil { ret = b } } - case bottomer: + case Bottomer: ret = wrapCallErr(call, err.Bottom()) case errors.Error: diff --git a/vendor/cuelang.org/go/internal/pkg/context.go b/vendor/cuelang.org/go/internal/pkg/context.go new file mode 100644 index 00000000..033420de --- /dev/null +++ b/vendor/cuelang.org/go/internal/pkg/context.go @@ -0,0 +1,351 @@ +// Copyright 2020 CUE Authors +// +// 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. + +package pkg + +import ( + "io" + "math/big" + + "cuelang.org/go/cue" + "cuelang.org/go/cue/token" + "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/value" + "github.com/cockroachdb/apd/v3" +) + +// CallCtxt is passed to builtin implementations that need to use a cue.Value. This is an internal type. Its interface may change. +type CallCtxt struct { + ctx *adt.OpContext + builtin *Builtin + Err interface{} + Ret interface{} + + args []adt.Value +} + +func (c *CallCtxt) Pos() token.Pos { + return c.ctx.Pos() +} + +func (c *CallCtxt) Name() string { + return c.builtin.name(c.ctx) +} + +// Do returns whether the call should be done. +func (c *CallCtxt) Do() bool { + return c.Err == nil +} + +func (c *CallCtxt) Value(i int) cue.Value { + v := value.Make(c.ctx, c.args[i]) + // TODO: remove default + // v, _ = v.Default() + if !v.IsConcrete() { + c.errcf(adt.IncompleteError, "non-concrete argument %d", i) + } + return v +} + +func (c *CallCtxt) Struct(i int) Struct { + x := c.args[i] + switch v, ok := x.(*adt.Vertex); { + case ok && !v.IsList(): + v.CompleteArcs(c.ctx) + return Struct{c.ctx, v} + + case v != nil: + x = v.Value() + } + if x.Kind()&adt.StructKind == 0 { + var err error + if b, ok := x.(*adt.Bottom); ok { + err = &callError{b} + } + c.invalidArgType(c.args[i], i, "struct", err) + } else { + err := c.ctx.NewErrf("non-concrete struct for argument %d", i) + err.Code = adt.IncompleteError + c.Err = &callError{err} + } + return Struct{} +} + +func (c *CallCtxt) Int(i int) int { return int(c.intValue(i, 64, "int64")) } +func (c *CallCtxt) Int8(i int) int8 { return int8(c.intValue(i, 8, "int8")) } +func (c *CallCtxt) Int16(i int) int16 { return int16(c.intValue(i, 16, "int16")) } +func (c *CallCtxt) Int32(i int) int32 { return int32(c.intValue(i, 32, "int32")) } +func (c *CallCtxt) Rune(i int) rune { return rune(c.intValue(i, 32, "rune")) } +func (c *CallCtxt) Int64(i int) int64 { return int64(c.intValue(i, 64, "int64")) } + +func (c *CallCtxt) intValue(i, bits int, typ string) int64 { + arg := c.args[i] + x := value.Make(c.ctx, arg) + n, err := x.Int(nil) + if err != nil { + c.invalidArgType(arg, i, typ, err) + return 0 + } + if n.BitLen() > bits { + c.errf(err, "int %s overflows %s in argument %d in call to %s", + n, typ, i, c.Name()) + } + res, _ := x.Int64() + return res +} + +func (c *CallCtxt) Uint(i int) uint { return uint(c.uintValue(i, 64, "uint64")) } +func (c *CallCtxt) Uint8(i int) uint8 { return uint8(c.uintValue(i, 8, "uint8")) } +func (c *CallCtxt) Byte(i int) uint8 { return byte(c.uintValue(i, 8, "byte")) } +func (c *CallCtxt) Uint16(i int) uint16 { return uint16(c.uintValue(i, 16, "uint16")) } +func (c *CallCtxt) Uint32(i int) uint32 { return uint32(c.uintValue(i, 32, "uint32")) } +func (c *CallCtxt) Uint64(i int) uint64 { return uint64(c.uintValue(i, 64, "uint64")) } + +func (c *CallCtxt) uintValue(i, bits int, typ string) uint64 { + x := value.Make(c.ctx, c.args[i]) + n, err := x.Int(nil) + if err != nil || n.Sign() < 0 { + c.invalidArgType(c.args[i], i, typ, err) + return 0 + } + if n.BitLen() > bits { + c.errf(err, "int %s overflows %s in argument %d in call to %s", + n, typ, i, c.Name()) + } + res, _ := x.Uint64() + return res +} + +func (c *CallCtxt) Decimal(i int) *apd.Decimal { + x := value.Make(c.ctx, c.args[i]) + if _, err := x.MantExp(nil); err != nil { + c.invalidArgType(c.args[i], i, "Decimal", err) + return nil + } + return &c.args[i].(*adt.Num).X +} + +func (c *CallCtxt) Float64(i int) float64 { + x := value.Make(c.ctx, c.args[i]) + res, err := x.Float64() + if err != nil { + c.invalidArgType(c.args[i], i, "float64", err) + return 0 + } + return res +} + +func (c *CallCtxt) BigInt(i int) *big.Int { + x := value.Make(c.ctx, c.args[i]) + n, err := x.Int(nil) + if err != nil { + c.invalidArgType(c.args[i], i, "int", err) + return nil + } + return n +} + +var ten = big.NewInt(10) + +func (c *CallCtxt) BigFloat(i int) *big.Float { + x := value.Make(c.ctx, c.args[i]) + var mant big.Int + exp, err := x.MantExp(&mant) + if err != nil { + c.invalidArgType(c.args[i], i, "float", err) + return nil + } + f := &big.Float{} + f.SetInt(&mant) + if exp != 0 { + var g big.Float + e := big.NewInt(int64(exp)) + f.Mul(f, g.SetInt(e.Exp(ten, e, nil))) + } + return f +} + +func (c *CallCtxt) String(i int) string { + // TODO: use Evaluate instead. + x := value.Make(c.ctx, c.args[i]) + v, err := x.String() + if err != nil { + c.invalidArgType(c.args[i], i, "string", err) + return "" + } + return v +} + +func (c *CallCtxt) Bytes(i int) []byte { + x := value.Make(c.ctx, c.args[i]) + v, err := x.Bytes() + if err != nil { + c.invalidArgType(c.args[i], i, "bytes", err) + return nil + } + return v +} + +func (c *CallCtxt) Reader(i int) io.Reader { + x := value.Make(c.ctx, c.args[i]) + // TODO: optimize for string and bytes cases + r, err := x.Reader() + if err != nil { + c.invalidArgType(c.args[i], i, "bytes|string", err) + return nil + } + return r +} + +func (c *CallCtxt) Bool(i int) bool { + x := value.Make(c.ctx, c.args[i]) + b, err := x.Bool() + if err != nil { + c.invalidArgType(c.args[i], i, "bool", err) + return false + } + return b +} + +func (c *CallCtxt) List(i int) (a []cue.Value) { + arg := c.args[i] + x := value.Make(c.ctx, arg) + v, err := x.List() + if err != nil { + c.invalidArgType(c.args[i], i, "list", err) + return a + } + for v.Next() { + a = append(a, v.Value()) + } + return a +} + +func (c *CallCtxt) CueList(i int) List { + v := c.getList(i) + if v == nil { + return List{} + } + return List{c.ctx, v, v.BaseValue.(*adt.ListMarker).IsOpen} +} + +func (c *CallCtxt) Iter(i int) (a cue.Iterator) { + arg := c.args[i] + x := value.Make(c.ctx, arg) + v, err := x.List() + if err != nil { + c.invalidArgType(c.args[i], i, "list", err) + } + return v +} + +func (c *CallCtxt) getList(i int) *adt.Vertex { + x := c.args[i] + switch v, ok := x.(*adt.Vertex); { + case ok && v.IsList(): + v.Finalize(c.ctx) + return v + + case v != nil: + x = v.Value() + } + if x.Kind()&adt.ListKind == 0 { + var err error + if b, ok := x.(*adt.Bottom); ok { + err = &callError{b} + } + c.invalidArgType(c.args[i], i, "list", err) + } else { + err := c.ctx.NewErrf("non-concrete list for argument %d", i) + err.Code = adt.IncompleteError + c.Err = &callError{err} + } + return nil +} + +func (c *CallCtxt) DecimalList(i int) (a []*apd.Decimal) { + v := c.getList(i) + if v == nil { + return nil + } + + for j, w := range v.Elems() { + w.Finalize(c.ctx) // defensive + switch x := adt.Unwrap(adt.Default(w.Value())).(type) { + case *adt.Num: + a = append(a, &x.X) + + case *adt.Bottom: + if x.IsIncomplete() { + c.Err = x + return nil + } + + default: + if k := w.Kind(); k&adt.NumKind == 0 { + err := c.ctx.NewErrf( + "invalid list element %d in argument %d to call: cannot use value %v (%s) as number", + j, i, w, k) + c.Err = &callError{err} + return a + } + + err := c.ctx.NewErrf( + "non-concrete value %v for element %d of number list argument %d", + w, j, i) + err.Code = adt.IncompleteError + c.Err = &callError{err} + return nil + } + } + return a +} + +func (c *CallCtxt) StringList(i int) (a []string) { + v := c.getList(i) + if v == nil { + return nil + } + + for j, w := range v.Elems() { + w.Finalize(c.ctx) // defensive + switch x := adt.Unwrap(adt.Default(w.Value())).(type) { + case *adt.String: + a = append(a, x.Str) + + case *adt.Bottom: + if x.IsIncomplete() { + c.Err = x + return nil + } + + default: + if k := w.Kind(); k&adt.StringKind == 0 { + err := c.ctx.NewErrf( + "invalid list element %d in argument %d to call: cannot use value %v (%s) as string", + j, i, w, k) + c.Err = &callError{err} + return a + } + + err := c.ctx.NewErrf( + "non-concrete value %v for element %d of string list argument %d", + w, j, i) + err.Code = adt.IncompleteError + c.Err = &callError{err} + return nil + } + } + return a +} diff --git a/vendor/cuelang.org/go/internal/pkg/errors.go b/vendor/cuelang.org/go/internal/pkg/errors.go new file mode 100644 index 00000000..d374fb9f --- /dev/null +++ b/vendor/cuelang.org/go/internal/pkg/errors.go @@ -0,0 +1,90 @@ +// Copyright 2020 CUE Authors +// +// 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. + +package pkg + +import ( + "fmt" + + "cuelang.org/go/cue/errors" + "cuelang.org/go/internal/core/adt" +) + +type Bottomer interface { + error + Bottom() *adt.Bottom +} + +type callError struct { + b *adt.Bottom +} + +func (e *callError) Error() string { + return fmt.Sprint(e.b) +} + +func (c *CallCtxt) errf(underlying error, format string, args ...interface{}) { + var errs errors.Error + var code adt.ErrorCode + switch x := underlying.(type) { + case nil: + case Bottomer: + b := x.Bottom() + errs = b.Err + code = b.Code + case errors.Error: + errs = x + case error: + errs = errors.Promote(x, "") + } + vErr := c.ctx.NewPosf(c.Pos(), format, args...) + c.Err = &callError{&adt.Bottom{Code: code, Err: errors.Wrap(vErr, errs)}} +} + +func (c *CallCtxt) errcf(code adt.ErrorCode, format string, args ...interface{}) { + err := c.ctx.NewErrf(format, args...) + err.Code = code + c.Err = &callError{err} +} + +func wrapCallErr(c *CallCtxt, b *adt.Bottom) *adt.Bottom { + var err errors.Error + for _, e := range errors.Errors(b.Err) { + ne := c.ctx.Newf("error in call to %s", c.builtin.name(c.ctx)) + err = errors.Append(err, errors.Wrap(ne, e)) + } + return &adt.Bottom{Code: b.Code, Err: err} +} + +func (c *CallCtxt) invalidArgType(arg adt.Value, i int, typ string, err error) { + if ve, ok := err.(Bottomer); ok && ve.Bottom().IsIncomplete() { + c.Err = ve + return + } + if b, ok := adt.Unwrap(arg).(*adt.Bottom); ok { + c.Err = b + return + } + // TODO: make these permanent errors if the value did not originate from + // a reference. + if err != nil { + c.errf(err, + "cannot use %s (type %s) as %s in argument %d to %s", + arg, arg.Kind(), typ, i, c.Name()) + } else { + c.errf(err, + "cannot use %s (type %s) as %s in argument %d to %s", + arg, arg.Kind(), typ, i, c.Name()) + } +} diff --git a/vendor/cuelang.org/go/internal/pkg/register.go b/vendor/cuelang.org/go/internal/pkg/register.go new file mode 100644 index 00000000..847ecb75 --- /dev/null +++ b/vendor/cuelang.org/go/internal/pkg/register.go @@ -0,0 +1,31 @@ +// Copyright 2020 CUE Authors +// +// 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. + +package pkg + +import ( + "cuelang.org/go/cue/errors" + "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/core/eval" + "cuelang.org/go/internal/core/runtime" +) + +func Register(importPath string, p *Package) { + f := func(r adt.Runtime) (*adt.Vertex, errors.Error) { + ctx := eval.NewContext(r, nil) + + return p.MustCompile(ctx, importPath), nil + } + runtime.RegisterBuiltin(importPath, f) +} diff --git a/vendor/cuelang.org/go/internal/pkg/types.go b/vendor/cuelang.org/go/internal/pkg/types.go new file mode 100644 index 00000000..06871a25 --- /dev/null +++ b/vendor/cuelang.org/go/internal/pkg/types.go @@ -0,0 +1,78 @@ +// Copyright 2022 CUE Authors +// +// 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. + +package pkg + +import ( + "cuelang.org/go/internal/core/adt" +) + +// List represents a CUE list, which can be open or closed. +type List struct { + runtime adt.Runtime + node *adt.Vertex + isOpen bool +} + +// Elems returns the elements of a list. +func (l *List) Elems() []*adt.Vertex { + return l.node.Elems() +} + +// IsOpen reports whether a list is open ended. +func (l *List) IsOpen() bool { + return l.isOpen +} + +// Struct represents a CUE struct, which can be open or closed. +type Struct struct { + runtime adt.Runtime + node *adt.Vertex +} + +// Arcs returns all arcs of s. +func (s *Struct) Arcs() []*adt.Vertex { + return s.node.Arcs +} + +// Len reports the number of regular string fields of s. +func (s *Struct) Len() int { + count := 0 + for _, a := range s.Arcs() { + if a.Label.IsString() { + count++ + } + } + return count +} + +// IsOpen reports whether s allows more fields than are currently defined. +func (s *Struct) IsOpen() bool { + if !s.node.IsClosedStruct() { + return true + } + ot := s.node.OptionalTypes() + if ot&^adt.HasDynamic != 0 { + return true + } + return false +} + +// A ValidationError indicates an error that is only valid if a builtin is used +// as a validator. +type ValidationError struct { + B *adt.Bottom +} + +func (v ValidationError) Error() string { return v.B.Err.Error() } diff --git a/vendor/cuelang.org/go/internal/source/source.go b/vendor/cuelang.org/go/internal/source/source.go index 38448444..38ae7b6e 100644 --- a/vendor/cuelang.org/go/internal/source/source.go +++ b/vendor/cuelang.org/go/internal/source/source.go @@ -20,14 +20,13 @@ import ( "bytes" "fmt" "io" - "io/ioutil" + "os" ) // Read loads the source bytes for the given arguments. If src != nil, // Read converts src to a []byte if possible; otherwise it returns an // error. If src == nil, readSource returns the result of reading the file // specified by filename. -// func Read(filename string, src interface{}) ([]byte, error) { if src != nil { switch s := src.(type) { @@ -49,5 +48,5 @@ func Read(filename string, src interface{}) ([]byte, error) { } return nil, fmt.Errorf("invalid source type %T", src) } - return ioutil.ReadFile(filename) + return os.ReadFile(filename) } diff --git a/vendor/cuelang.org/go/internal/task/task.go b/vendor/cuelang.org/go/internal/task/task.go index 3fb6b508..1c2475fb 100644 --- a/vendor/cuelang.org/go/internal/task/task.go +++ b/vendor/cuelang.org/go/internal/task/task.go @@ -29,11 +29,12 @@ import ( // A Context provides context for running a task. type Context struct { Context context.Context - Stdin io.Reader - Stdout io.Writer - Stderr io.Writer - Obj cue.Value - Err errors.Error + + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer + Obj cue.Value + Err errors.Error } func (c *Context) Lookup(field string) cue.Value { @@ -83,7 +84,7 @@ func (c *Context) addErr(v cue.Value, wrap error, format string, args ...interfa err := &taskError{ task: c.Obj, v: v, - Message: errors.NewMessage(format, args), + Message: errors.NewMessagef(format, args...), } c.Err = errors.Append(c.Err, errors.Wrap(err, wrap)) } diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/apic.go b/vendor/cuelang.org/go/internal/third_party/yaml/apic.go index 9cf9005f..d515bdb5 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/apic.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/apic.go @@ -139,7 +139,7 @@ func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { emitter.canonical = canonical } -//// Set the indentation increment. +// // Set the indentation increment. func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { if indent < 2 || indent > 9 { indent = 2 diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/decode.go b/vendor/cuelang.org/go/internal/third_party/yaml/decode.go index d3ec965e..f345424c 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/decode.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/decode.go @@ -6,8 +6,8 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math" + "os" "reflect" "strconv" "strings" @@ -73,7 +73,7 @@ func readSource(filename string, src interface{}) ([]byte, error) { } return nil, errors.New("invalid source") } - return ioutil.ReadFile(filename) + return os.ReadFile(filename) } func newParser(filename string, src interface{}) (*parser, error) { @@ -262,7 +262,6 @@ type decoder struct { p *parser doc *node aliases map[*node]bool - mapType reflect.Type terrors []string prev token.Pos lastNode ast.Node @@ -270,7 +269,6 @@ type decoder struct { } var ( - mapItemType = reflect.TypeOf(MapItem{}) durationType = reflect.TypeOf(time.Duration(0)) defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) timeType = reflect.TypeOf(time.Time{}) @@ -278,7 +276,7 @@ var ( ) func newDecoder(p *parser) *decoder { - d := &decoder{p: p, mapType: defaultMapType} + d := &decoder{p: p} d.aliases = make(map[*node]bool) return d } @@ -523,19 +521,8 @@ func (d *decoder) scalar(n *node) ast.Expr { Value: "null", } } - err := &ast.BottomLit{ - Bottom: d.pos(n.startPos), - } - comment := &ast.Comment{ - Slash: d.start(n), - Text: "// " + d.terror(n, tag), - } - err.AddComment(&ast.CommentGroup{ - Line: true, - Position: 1, - List: []*ast.Comment{comment}, - }) - return err + d.terror(n, tag) + return &ast.BottomLit{} } func (d *decoder) label(n *node) ast.Label { diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/parserc.go b/vendor/cuelang.org/go/internal/third_party/yaml/parserc.go index aaf7f26d..6fcb5ec6 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/parserc.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/parserc.go @@ -177,7 +177,8 @@ func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool // Parse the production: // stream ::= STREAM-START implicit_document? explicit_document* STREAM-END -// ************ +// +// ************ func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -199,9 +200,12 @@ func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) // Parse the productions: // implicit_document ::= block_node DOCUMENT-END* -// * +// +// * +// // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// ************************* +// +// ************************* func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { token := peek_token(parser) @@ -284,8 +288,8 @@ func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t // Parse the productions: // explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* -// *********** // +// *********** func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -306,9 +310,10 @@ func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event // Parse the productions: // implicit_document ::= block_node DOCUMENT-END* -// ************* -// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* // +// ************* +// +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -339,30 +344,41 @@ func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) // Parse the productions: // block_node_or_indentless_sequence ::= -// ALIAS -// ***** -// | properties (block_content | indentless_block_sequence)? -// ********** * -// | block_content | indentless_block_sequence -// * +// +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// // block_node ::= ALIAS -// ***** -// | properties block_content? -// ********** * -// | block_content -// * +// +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// // flow_node ::= ALIAS -// ***** -// | properties flow_content? -// ********** * -// | flow_content -// * +// +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// // properties ::= TAG ANCHOR? | ANCHOR TAG? -// ************************* +// +// ************************* +// // block_content ::= block_collection | flow_collection | SCALAR -// ****** +// +// ****** +// // flow_content ::= flow_collection | SCALAR -// ****** +// +// ****** func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() @@ -581,8 +597,8 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i // Parse the productions: // block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END -// ******************** *********** * ********* // +// ******************** *********** * ********* func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -634,7 +650,8 @@ func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_e // Parse the productions: // indentless_sequence ::= (BLOCK-ENTRY block_node?)+ -// *********** * +// +// *********** * func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -671,14 +688,14 @@ func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *y // Parse the productions: // block_mapping ::= BLOCK-MAPPING_START -// ******************* -// ((KEY block_node_or_indentless_sequence?)? -// *** * -// (VALUE block_node_or_indentless_sequence?)?)* // -// BLOCK-END -// ********* +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* // +// BLOCK-END +// ********* func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -730,13 +747,11 @@ func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_even // Parse the productions: // block_mapping ::= BLOCK-MAPPING_START // -// ((KEY block_node_or_indentless_sequence?)? -// -// (VALUE block_node_or_indentless_sequence?)?)* -// ***** * -// BLOCK-END -// +// ((KEY block_node_or_indentless_sequence?)? // +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -764,16 +779,18 @@ func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_ev // Parse the productions: // flow_sequence ::= FLOW-SEQUENCE-START -// ******************* -// (flow_sequence_entry FLOW-ENTRY)* -// * ********** -// flow_sequence_entry? -// * -// FLOW-SEQUENCE-END -// ***************** +// +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * // +// * func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -832,11 +849,10 @@ func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_ev return true } -// // Parse the productions: // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// *** * // +// *** * func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -856,8 +872,8 @@ func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, ev // Parse the productions: // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// ***** * // +// ***** * func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -880,8 +896,8 @@ func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, // Parse the productions: // flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * // +// * func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { token := peek_token(parser) if token == nil { @@ -898,16 +914,17 @@ func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, ev // Parse the productions: // flow_mapping ::= FLOW-MAPPING-START -// ****************** -// (flow_mapping_entry FLOW-ENTRY)* -// * ********** -// flow_mapping_entry? -// ****************** -// FLOW-MAPPING-END -// **************** -// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * *** * // +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// - *** * func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { if first { token := peek_token(parser) @@ -972,8 +989,7 @@ func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event // Parse the productions: // flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? -// * ***** * -// +// - ***** * func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { token := peek_token(parser) if token == nil { diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/resolve.go b/vendor/cuelang.org/go/internal/third_party/yaml/resolve.go index 9699ada1..f7ca87d7 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/resolve.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/resolve.go @@ -77,7 +77,7 @@ func resolvableTag(tag string) bool { return false } -var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`) +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) func (d *decoder) resolve(n *node) (rtag string, out interface{}) { tag := n.tag diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/scannerc.go b/vendor/cuelang.org/go/internal/third_party/yaml/scannerc.go index 94ace4bd..831a5c64 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/scannerc.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/scannerc.go @@ -1496,11 +1496,11 @@ func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { // Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. // // Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { // Eat '%'. start_mark := parser.mark @@ -1603,11 +1603,11 @@ func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool // Scan the directive name. // // Scope: -// %YAML 1.1 # a comment \n -// ^^^^ -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^ // +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { // Consume the directive name. if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -1642,8 +1642,9 @@ func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark // Scan the value of VERSION-DIRECTIVE. // // Scope: -// %YAML 1.1 # a comment \n -// ^^^^^^ +// +// %YAML 1.1 # a comment \n +// ^^^^^^ func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { // Eat whitespaces. if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -1681,10 +1682,11 @@ const max_number_length = 2 // Scan the version number of VERSION-DIRECTIVE. // // Scope: -// %YAML 1.1 # a comment \n -// ^ -// %YAML 1.1 # a comment \n -// ^ +// +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { // Repeat while the next character is digit. @@ -1718,9 +1720,9 @@ func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark // Scan the value of a TAG-DIRECTIVE token. // // Scope: -// %TAG !yaml! tag:yaml.org,2002: \n -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { var handle_value, prefix_value []byte diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/yaml.go b/vendor/cuelang.org/go/internal/third_party/yaml/yaml.go index 51776145..771a4af0 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/yaml.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/yaml.go @@ -2,8 +2,7 @@ // // Source code and other details for the project are available at GitHub: // -// https://github.com/go-yaml/yaml -// +// https://github.com/go-yaml/yaml package yaml // import "cuelang.org/go/internal/third_party/yaml" import ( @@ -18,73 +17,13 @@ import ( "cuelang.org/go/cue/ast" ) -// MapSlice encodes and decodes as a YAML map. -// The order of keys is preserved when encoding and decoding. -type MapSlice []MapItem - -// MapItem is an item in a MapSlice. -type MapItem struct { - Key, Value interface{} -} - -// The Unmarshaler interface may be implemented by types to customize their -// behavior when being unmarshaled from a YAML document. The UnmarshalYAML -// method receives a function that may be called to unmarshal the original -// YAML value into a field or variable. It is safe to call the unmarshal -// function parameter more than once if necessary. -type Unmarshaler interface { - UnmarshalYAML(unmarshal func(interface{}) error) error -} - -// The Marshaler interface may be implemented by types to customize their -// behavior when being marshaled into a YAML document. The returned value -// is marshaled in place of the original value implementing Marshaler. -// -// If an error is returned by MarshalYAML, the marshaling procedure stops -// and returns with the provided error. -type Marshaler interface { - MarshalYAML() (interface{}, error) -} - // Unmarshal decodes the first document found within the in byte slice -// and assigns decoded values into the out value. -// -// Maps and pointers (to a struct, string, int, etc) are accepted as out -// values. If an internal pointer within a struct is not initialized, -// the yaml package will initialize it if necessary for unmarshalling -// the provided data. The out parameter must not be nil. -// -// The type of the decoded values should be compatible with the respective -// values in out. If one or more values cannot be decoded due to a type -// mismatches, decoding continues partially until the end of the YAML -// content, and a *yaml.TypeError is returned with details for all -// missed values. -// -// Struct fields are only unmarshalled if they are exported (have an -// upper case first letter), and are unmarshalled using the field name -// lowercased as the default key. Custom keys may be defined via the -// "yaml" name in the field tag: the content preceding the first comma -// is used as the key, and the following comma-separated options are -// used to tweak the marshalling process (see Marshal). -// Conflicting names result in a runtime error. -// -// For example: -// -// type T struct { -// F int `yaml:"a,omitempty"` -// B int -// } -// var t T -// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) -// -// See the documentation of Marshal for the format of tags and a list of -// supported tag options. -// +// and returns it as a CUE syntax AST. func Unmarshal(filename string, in []byte) (expr ast.Expr, err error) { return unmarshal(filename, in) } -// A Decorder reads and decodes YAML values from an input stream. +// A Decoder reads and decodes YAML values from an input stream. type Decoder struct { strict bool firstDone bool @@ -103,12 +42,9 @@ func NewDecoder(filename string, src interface{}) (*Decoder, error) { return &Decoder{parser: d}, nil } -// Decode reads the next YAML-encoded value from its input and stores it in the -// value pointed to by v. It returns io.EOF if there are no more value in the +// Decode reads the next YAML-encoded value from its input and returns +// it as CUE syntax. It returns io.EOF if there are no more value in the // stream. -// -// See the documentation for Unmarshal for details about the conversion of YAML -// into a Go value. func (dec *Decoder) Decode() (expr ast.Expr, err error) { d := newDecoder(dec.parser) defer handleErr(&err) @@ -319,51 +255,3 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { fieldMapMutex.Unlock() return sinfo, nil } - -// IsZeroer is used to check whether an object is zero to -// determine whether it should be omitted when marshaling -// with the omitempty flag. One notable implementation -// is time.Time. -type IsZeroer interface { - IsZero() bool -} - -func isZero(v reflect.Value) bool { - kind := v.Kind() - if z, ok := v.Interface().(IsZeroer); ok { - if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { - return true - } - return z.IsZero() - } - switch kind { - case reflect.String: - return len(v.String()) == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - case reflect.Slice: - return v.Len() == 0 - case reflect.Map: - return v.Len() == 0 - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Struct: - vt := v.Type() - for i := v.NumField() - 1; i >= 0; i-- { - if vt.Field(i).PkgPath != "" { - continue // Private field - } - if !isZero(v.Field(i)) { - return false - } - } - return true - } - return false -} diff --git a/vendor/cuelang.org/go/internal/third_party/yaml/yamlh.go b/vendor/cuelang.org/go/internal/third_party/yaml/yamlh.go index 46ce4624..3d4367bb 100644 --- a/vendor/cuelang.org/go/internal/third_party/yaml/yamlh.go +++ b/vendor/cuelang.org/go/internal/third_party/yaml/yamlh.go @@ -408,7 +408,9 @@ type yaml_document_t struct { // The number of written bytes should be set to the size_read variable. // // [in,out] data A pointer to an application data specified by -// yaml_parser_set_input(). +// +// yaml_parser_set_input(). +// // [out] buffer The buffer to write the data from the source. // [in] size The size of the buffer. // [out] size_read The actual number of bytes read from the source. @@ -617,13 +619,14 @@ type yaml_parser_t struct { // @a buffer to the output. // // @param[in,out] data A pointer to an application data specified by -// yaml_emitter_set_output(). +// +// yaml_emitter_set_output(). +// // @param[in] buffer The buffer with bytes to be written. // @param[in] size The size of the buffer. // // @returns On success, the handler should return @c 1. If the handler failed, // the returned value should be @c 0. -// type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error type yaml_emitter_state_t int diff --git a/vendor/cuelang.org/go/internal/value/value.go b/vendor/cuelang.org/go/internal/value/value.go index a8897385..5d4dc042 100644 --- a/vendor/cuelang.org/go/internal/value/value.go +++ b/vendor/cuelang.org/go/internal/value/value.go @@ -20,7 +20,6 @@ import ( "strings" "cuelang.org/go/cue" - "cuelang.org/go/cue/errors" "cuelang.org/go/internal/core/adt" "cuelang.org/go/internal/core/convert" "cuelang.org/go/internal/core/eval" @@ -32,9 +31,11 @@ func ConvertToRuntime(c *cue.Context) *cue.Runtime { return (*cue.Runtime)(c) } -func ConvertToContext(r *cue.Runtime) *cue.Context { - (*runtime.Runtime)(r).Init() - return (*cue.Context)(r) +func ConvertToContext[Ctx *cue.Runtime | *cue.Context](ctx Ctx) *cue.Context { + if ctx, ok := any(ctx).(*cue.Runtime); ok { + (*runtime.Runtime)(ctx).Init() + } + return (*cue.Context)(ctx) } func ToInternal(v cue.Value) (*runtime.Runtime, *adt.Vertex) { @@ -48,14 +49,6 @@ func Make(ctx *adt.OpContext, v adt.Value) cue.Value { return (*cue.Context)(ctx.Impl().(*runtime.Runtime)).Encode(v) } -func MakeError(r *runtime.Runtime, err errors.Error) cue.Value { - b := &adt.Bottom{Err: err} - node := &adt.Vertex{BaseValue: b} - node.UpdateStatus(adt.Finalized) - node.AddConjunct(adt.MakeRootConjunct(nil, b)) - return (*cue.Context)(r).Encode(node) -} - // UnifyBuiltin returns the given Value unified with the given builtin template. func UnifyBuiltin(v cue.Value, kind string) cue.Value { p := strings.Split(kind, ".") diff --git a/vendor/cuelang.org/go/pkg/crypto/ed25519/pkg.go b/vendor/cuelang.org/go/pkg/crypto/ed25519/pkg.go index 9b10be43..1a2d9e3b 100644 --- a/vendor/cuelang.org/go/pkg/crypto/ed25519/pkg.go +++ b/vendor/cuelang.org/go/pkg/crypto/ed25519/pkg.go @@ -1,34 +1,31 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package ed25519 import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("crypto/ed25519", pkg) + pkg.Register("crypto/ed25519", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "PublicKeySize", Const: "32", }, { Name: "Valid", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { publicKey, message, signature := c.Bytes(0), c.Bytes(1), c.Bytes(2) if c.Do() { c.Ret, c.Err = Valid(publicKey, message, signature) diff --git a/vendor/cuelang.org/go/pkg/crypto/hmac/pkg.go b/vendor/cuelang.org/go/pkg/crypto/hmac/pkg.go index 98d72c98..ca9836fa 100644 --- a/vendor/cuelang.org/go/pkg/crypto/hmac/pkg.go +++ b/vendor/cuelang.org/go/pkg/crypto/hmac/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package hmac import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("crypto/hmac", pkg) + pkg.Register("crypto/hmac", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "MD5", Const: "\"MD5\"", }, { @@ -43,13 +40,13 @@ var pkg = &internal.Package{ Const: "\"SHA512_256\"", }, { Name: "Sign", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { hashName, key, data := c.String(0), c.Bytes(1), c.Bytes(2) if c.Do() { c.Ret, c.Err = Sign(hashName, key, data) diff --git a/vendor/cuelang.org/go/pkg/crypto/md5/pkg.go b/vendor/cuelang.org/go/pkg/crypto/md5/pkg.go index e4bbcda3..10866a6b 100644 --- a/vendor/cuelang.org/go/pkg/crypto/md5/pkg.go +++ b/vendor/cuelang.org/go/pkg/crypto/md5/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package md5 import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("crypto/md5", pkg) + pkg.Register("crypto/md5", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Size", Const: "16", }, { @@ -25,11 +22,11 @@ var pkg = &internal.Package{ Const: "64", }, { Name: "Sum", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum(data) diff --git a/vendor/cuelang.org/go/pkg/crypto/sha1/pkg.go b/vendor/cuelang.org/go/pkg/crypto/sha1/pkg.go index 97920249..cec5f378 100644 --- a/vendor/cuelang.org/go/pkg/crypto/sha1/pkg.go +++ b/vendor/cuelang.org/go/pkg/crypto/sha1/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package sha1 import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("crypto/sha1", pkg) + pkg.Register("crypto/sha1", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Size", Const: "20", }, { @@ -25,11 +22,11 @@ var pkg = &internal.Package{ Const: "64", }, { Name: "Sum", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum(data) diff --git a/vendor/cuelang.org/go/pkg/crypto/sha256/pkg.go b/vendor/cuelang.org/go/pkg/crypto/sha256/pkg.go index 92d851df..2e1ecb5c 100644 --- a/vendor/cuelang.org/go/pkg/crypto/sha256/pkg.go +++ b/vendor/cuelang.org/go/pkg/crypto/sha256/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package sha256 import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("crypto/sha256", pkg) + pkg.Register("crypto/sha256", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Size", Const: "32", }, { @@ -28,11 +25,11 @@ var pkg = &internal.Package{ Const: "64", }, { Name: "Sum256", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum256(data) @@ -40,11 +37,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sum224", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum224(data) diff --git a/vendor/cuelang.org/go/pkg/crypto/sha512/pkg.go b/vendor/cuelang.org/go/pkg/crypto/sha512/pkg.go index 607da475..1e3ff246 100644 --- a/vendor/cuelang.org/go/pkg/crypto/sha512/pkg.go +++ b/vendor/cuelang.org/go/pkg/crypto/sha512/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package sha512 import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("crypto/sha512", pkg) + pkg.Register("crypto/sha512", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Size", Const: "64", }, { @@ -34,11 +31,11 @@ var pkg = &internal.Package{ Const: "128", }, { Name: "Sum512", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum512(data) @@ -46,11 +43,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sum384", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum384(data) @@ -58,11 +55,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sum512_224", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum512_224(data) @@ -70,11 +67,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sum512_256", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Sum512_256(data) diff --git a/vendor/cuelang.org/go/pkg/doc.go b/vendor/cuelang.org/go/pkg/doc.go index 307e5cbf..df36e144 100644 --- a/vendor/cuelang.org/go/pkg/doc.go +++ b/vendor/cuelang.org/go/pkg/doc.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package pkg define CUE standard packages. +// Package pkg defines CUE standard packages. // // Many of the standard packages are modeled after and generated from the Go // core packages. The types, values, and functions are defined as their Go @@ -29,10 +29,12 @@ // - no querying of the file system of any kind // - no communication on the network // - no information about the type of environment -// - only reproduceable random generators +// - only reproducible random generators // // Hermetic configurations allow for fast and advanced analysis that otherwise // would not be possible or practical. The cue "cmd" command can be used to mix // in non-hermetic influences into configurations by using packages defined // in the tool subdirectory. package pkg + +//go:generate go run gen.go diff --git a/vendor/cuelang.org/go/pkg/encoding/base64/pkg.go b/vendor/cuelang.org/go/pkg/encoding/base64/pkg.go index 12f791c4..3d8450e0 100644 --- a/vendor/cuelang.org/go/pkg/encoding/base64/pkg.go +++ b/vendor/cuelang.org/go/pkg/encoding/base64/pkg.go @@ -1,30 +1,27 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package base64 import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("encoding/base64", pkg) + pkg.Register("encoding/base64", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "EncodedLen", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { encoding, n := c.Value(0), c.Int(1) if c.Do() { c.Ret, c.Err = EncodedLen(encoding, n) @@ -32,12 +29,12 @@ var pkg = &internal.Package{ }, }, { Name: "DecodedLen", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { encoding, x := c.Value(0), c.Int(1) if c.Do() { c.Ret, c.Err = DecodedLen(encoding, x) @@ -45,12 +42,12 @@ var pkg = &internal.Package{ }, }, { Name: "Encode", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { encoding, src := c.Value(0), c.Bytes(1) if c.Do() { c.Ret, c.Err = Encode(encoding, src) @@ -58,12 +55,12 @@ var pkg = &internal.Package{ }, }, { Name: "Decode", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, {Kind: adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { encoding, s := c.Value(0), c.String(1) if c.Do() { c.Ret, c.Err = Decode(encoding, s) diff --git a/vendor/cuelang.org/go/pkg/encoding/csv/manual.go b/vendor/cuelang.org/go/pkg/encoding/csv/manual.go index 99e2cf1d..ceeded71 100644 --- a/vendor/cuelang.org/go/pkg/encoding/csv/manual.go +++ b/vendor/cuelang.org/go/pkg/encoding/csv/manual.go @@ -15,17 +15,17 @@ package csv import ( - "bytes" "encoding/csv" "io" + "strings" "cuelang.org/go/cue" ) // Encode encode the given list of lists to CSV. func Encode(x cue.Value) (string, error) { - buf := &bytes.Buffer{} - w := csv.NewWriter(buf) + var b strings.Builder + w := csv.NewWriter(&b) iter, err := x.List() if err != nil { return "", err @@ -51,7 +51,7 @@ func Encode(x cue.Value) (string, error) { _ = w.Write(a) } w.Flush() - return buf.String(), nil + return b.String(), nil } // Decode reads in a csv into a list of lists. diff --git a/vendor/cuelang.org/go/pkg/encoding/csv/pkg.go b/vendor/cuelang.org/go/pkg/encoding/csv/pkg.go index f5c5482e..e78f4319 100644 --- a/vendor/cuelang.org/go/pkg/encoding/csv/pkg.go +++ b/vendor/cuelang.org/go/pkg/encoding/csv/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package csv import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("encoding/csv", pkg) + pkg.Register("encoding/csv", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Encode", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Value(0) if c.Do() { c.Ret, c.Err = Encode(x) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "Decode", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { r := c.Reader(0) if c.Do() { c.Ret, c.Err = Decode(r) diff --git a/vendor/cuelang.org/go/pkg/encoding/hex/hex.go b/vendor/cuelang.org/go/pkg/encoding/hex/hex.go index da6d820e..2e43d8b6 100644 --- a/vendor/cuelang.org/go/pkg/encoding/hex/hex.go +++ b/vendor/cuelang.org/go/pkg/encoding/hex/hex.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -stripstr -exclude=Decode$,Encode$,EncodeToString,Dumper extract encoding/hex +// Originally generated with: go run qgo.go -stripstr -exclude=Decode$,Encode$,EncodeToString,Dumper extract encoding/hex package hex diff --git a/vendor/cuelang.org/go/pkg/encoding/hex/pkg.go b/vendor/cuelang.org/go/pkg/encoding/hex/pkg.go index 5918fe0c..63aa19fd 100644 --- a/vendor/cuelang.org/go/pkg/encoding/hex/pkg.go +++ b/vendor/cuelang.org/go/pkg/encoding/hex/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package hex import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("encoding/hex", pkg) + pkg.Register("encoding/hex", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "EncodedLen", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { n := c.Int(0) if c.Do() { c.Ret = EncodedLen(n) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "DecodedLen", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Int(0) if c.Do() { c.Ret = DecodedLen(x) @@ -43,11 +40,11 @@ var pkg = &internal.Package{ }, }, { Name: "Decode", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = Decode(s) @@ -55,11 +52,11 @@ var pkg = &internal.Package{ }, }, { Name: "Dump", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Dump(data) @@ -67,11 +64,11 @@ var pkg = &internal.Package{ }, }, { Name: "Encode", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { src := c.Bytes(0) if c.Do() { c.Ret = Encode(src) diff --git a/vendor/cuelang.org/go/pkg/encoding/json/json.go b/vendor/cuelang.org/go/pkg/encoding/json/json.go index 9e3762d7..4d01c964 100644 --- a/vendor/cuelang.org/go/pkg/encoding/json/json.go +++ b/vendor/cuelang.org/go/pkg/encoding/json/json.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -exclude=Compact,Indent,arshal$ extract encoding/json +// Originally generated with: go run qgo.go -exclude=Compact,Indent,arshal$ extract encoding/json package json diff --git a/vendor/cuelang.org/go/pkg/encoding/json/manual.go b/vendor/cuelang.org/go/pkg/encoding/json/manual.go index 161c6d02..b78b3dd4 100644 --- a/vendor/cuelang.org/go/pkg/encoding/json/manual.go +++ b/vendor/cuelang.org/go/pkg/encoding/json/manual.go @@ -19,6 +19,7 @@ import ( "encoding/json" "fmt" "io" + "strings" "cuelang.org/go/cue" "cuelang.org/go/cue/ast" @@ -26,6 +27,7 @@ import ( "cuelang.org/go/cue/parser" "cuelang.org/go/cue/token" cuejson "cuelang.org/go/encoding/json" + internaljson "cuelang.org/go/internal/encoding/json" ) // Compact generates the JSON-encoded src with insignificant space characters @@ -70,7 +72,7 @@ func HTMLEscape(src []byte) string { // Marshal returns the JSON encoding of v. func Marshal(v cue.Value) (string, error) { - b, err := json.Marshal(v) + b, err := internaljson.Marshal(v) return string(b), err } @@ -81,16 +83,16 @@ func MarshalStream(v cue.Value) (string, error) { if err != nil { return "", err } - buf := &bytes.Buffer{} + var b strings.Builder for iter.Next() { - b, err := json.Marshal(iter.Value()) + p, err := internaljson.Marshal(iter.Value()) if err != nil { return "", err } - buf.Write(b) - buf.WriteByte('\n') + b.Write(p) + b.WriteByte('\n') } - return buf.String(), nil + return b.String(), nil } // UnmarshalStream parses the JSON to a CUE instance. diff --git a/vendor/cuelang.org/go/pkg/encoding/json/pkg.go b/vendor/cuelang.org/go/pkg/encoding/json/pkg.go index e0c19530..dce3ef73 100644 --- a/vendor/cuelang.org/go/pkg/encoding/json/pkg.go +++ b/vendor/cuelang.org/go/pkg/encoding/json/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package json import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("encoding/json", pkg) + pkg.Register("encoding/json", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Valid", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret = Valid(data) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "Compact", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { src := c.Bytes(0) if c.Do() { c.Ret, c.Err = Compact(src) @@ -43,13 +40,13 @@ var pkg = &internal.Package{ }, }, { Name: "Indent", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { src, prefix, indent := c.Bytes(0), c.String(1), c.String(2) if c.Do() { c.Ret, c.Err = Indent(src, prefix, indent) @@ -57,11 +54,11 @@ var pkg = &internal.Package{ }, }, { Name: "HTMLEscape", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { src := c.Bytes(0) if c.Do() { c.Ret = HTMLEscape(src) @@ -69,11 +66,11 @@ var pkg = &internal.Package{ }, }, { Name: "Marshal", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { v := c.Value(0) if c.Do() { c.Ret, c.Err = Marshal(v) @@ -81,11 +78,11 @@ var pkg = &internal.Package{ }, }, { Name: "MarshalStream", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { v := c.Value(0) if c.Do() { c.Ret, c.Err = MarshalStream(v) @@ -93,11 +90,11 @@ var pkg = &internal.Package{ }, }, { Name: "UnmarshalStream", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.TopKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret, c.Err = UnmarshalStream(data) @@ -105,11 +102,11 @@ var pkg = &internal.Package{ }, }, { Name: "Unmarshal", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.TopKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b := c.Bytes(0) if c.Do() { c.Ret, c.Err = Unmarshal(b) @@ -117,12 +114,12 @@ var pkg = &internal.Package{ }, }, { Name: "Validate", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b, v := c.Bytes(0), c.Value(1) if c.Do() { c.Ret, c.Err = Validate(b, v) diff --git a/vendor/cuelang.org/go/pkg/encoding/yaml/manual.go b/vendor/cuelang.org/go/pkg/encoding/yaml/manual.go index ee228f93..5912c48d 100644 --- a/vendor/cuelang.org/go/pkg/encoding/yaml/manual.go +++ b/vendor/cuelang.org/go/pkg/encoding/yaml/manual.go @@ -20,20 +20,16 @@ import ( "cuelang.org/go/cue" "cuelang.org/go/cue/ast" - "cuelang.org/go/internal" + "cuelang.org/go/cue/errors" cueyaml "cuelang.org/go/internal/encoding/yaml" + "cuelang.org/go/internal/pkg" "cuelang.org/go/internal/third_party/yaml" ) // Marshal returns the YAML encoding of v. func Marshal(v cue.Value) (string, error) { if err := v.Validate(cue.Concrete(true)); err != nil { - if err := v.Validate(); err != nil { - return "", err - } - // TODO: allow adt.Bottom to implement errors.Error so that code and - // messages can be passed. - return "", internal.ErrIncomplete + return "", err } n := v.Syntax(cue.Final(), cue.Concrete(true)) b, err := cueyaml.Encode(n) @@ -54,12 +50,7 @@ func MarshalStream(v cue.Value) (string, error) { } v := iter.Value() if err := v.Validate(cue.Concrete(true)); err != nil { - if err := v.Validate(); err != nil { - return "", err - } - // TODO: allow adt.Bottom to implement errors.Error so that code and - // messages can be passed. - return "", internal.ErrIncomplete + return "", err } n := v.Syntax(cue.Final(), cue.Concrete(true)) b, err := cueyaml.Encode(n) @@ -134,6 +125,11 @@ func Validate(b []byte, v cue.Value) (bool, error) { return false, err } if err := x.Validate(cue.Concrete(true)); err != nil { + // Strip error codes: incomplete errors are terminal in this case. + var b pkg.Bottomer + if errors.As(err, &b) { + err = b.Bottom().Err + } return false, err } diff --git a/vendor/cuelang.org/go/pkg/encoding/yaml/pkg.go b/vendor/cuelang.org/go/pkg/encoding/yaml/pkg.go index 4889f736..94ed4d5a 100644 --- a/vendor/cuelang.org/go/pkg/encoding/yaml/pkg.go +++ b/vendor/cuelang.org/go/pkg/encoding/yaml/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package yaml import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("encoding/yaml", pkg) + pkg.Register("encoding/yaml", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Marshal", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { v := c.Value(0) if c.Do() { c.Ret, c.Err = Marshal(v) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "MarshalStream", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { v := c.Value(0) if c.Do() { c.Ret, c.Err = MarshalStream(v) @@ -43,11 +40,11 @@ var pkg = &internal.Package{ }, }, { Name: "Unmarshal", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.TopKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret, c.Err = Unmarshal(data) @@ -55,11 +52,11 @@ var pkg = &internal.Package{ }, }, { Name: "UnmarshalStream", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.TopKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Bytes(0) if c.Do() { c.Ret, c.Err = UnmarshalStream(data) @@ -67,12 +64,12 @@ var pkg = &internal.Package{ }, }, { Name: "Validate", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b, v := c.Bytes(0), c.Value(1) if c.Do() { c.Ret, c.Err = Validate(b, v) @@ -80,12 +77,12 @@ var pkg = &internal.Package{ }, }, { Name: "ValidatePartial", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b, v := c.Bytes(0), c.Value(1) if c.Do() { c.Ret, c.Err = ValidatePartial(b, v) diff --git a/vendor/cuelang.org/go/pkg/html/html.go b/vendor/cuelang.org/go/pkg/html/html.go index f67fb010..a2a13dbd 100644 --- a/vendor/cuelang.org/go/pkg/html/html.go +++ b/vendor/cuelang.org/go/pkg/html/html.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -stripstr extract html +// Originally generated with: go run qgo.go -stripstr extract html package html diff --git a/vendor/cuelang.org/go/pkg/html/pkg.go b/vendor/cuelang.org/go/pkg/html/pkg.go index b68bed64..d60cb087 100644 --- a/vendor/cuelang.org/go/pkg/html/pkg.go +++ b/vendor/cuelang.org/go/pkg/html/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package html import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("html", pkg) + pkg.Register("html", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Escape", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = Escape(s) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "Unescape", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = Unescape(s) diff --git a/vendor/cuelang.org/go/pkg/internal/context.go b/vendor/cuelang.org/go/pkg/internal/context.go deleted file mode 100644 index 4a940e12..00000000 --- a/vendor/cuelang.org/go/pkg/internal/context.go +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright 2020 CUE Authors -// -// 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. - -package internal - -import ( - "io" - "math/big" - - "cuelang.org/go/cue" - "cuelang.org/go/cue/token" - "cuelang.org/go/internal/core/adt" - "cuelang.org/go/internal/value" - "github.com/cockroachdb/apd/v2" -) - -// CallCtxt is passed to builtin implementations that need to use a cue.Value. This is an internal type. Its interface may change. -type CallCtxt struct { - ctx *adt.OpContext - builtin *Builtin - Err interface{} - Ret interface{} - - args []adt.Value -} - -func (c *CallCtxt) Pos() token.Pos { - return c.ctx.Pos() -} - -func (c *CallCtxt) Name() string { - return c.builtin.name(c.ctx) -} - -// Do returns whether the call should be done. -func (c *CallCtxt) Do() bool { - return c.Err == nil -} - -func (c *CallCtxt) Value(i int) cue.Value { - v := value.Make(c.ctx, c.args[i]) - // TODO: remove default - // v, _ = v.Default() - if !v.IsConcrete() { - c.errcf(adt.IncompleteError, "non-concrete argument %d", i) - } - return v -} - -func (c *CallCtxt) Struct(i int) *cue.Struct { - v := value.Make(c.ctx, c.args[i]) - s, err := v.Struct() - if err != nil { - c.invalidArgType(c.args[i], i, "struct", err) - return nil - } - return s -} - -func (c *CallCtxt) Int(i int) int { return int(c.intValue(i, 64, "int64")) } -func (c *CallCtxt) Int8(i int) int8 { return int8(c.intValue(i, 8, "int8")) } -func (c *CallCtxt) Int16(i int) int16 { return int16(c.intValue(i, 16, "int16")) } -func (c *CallCtxt) Int32(i int) int32 { return int32(c.intValue(i, 32, "int32")) } -func (c *CallCtxt) Rune(i int) rune { return rune(c.intValue(i, 32, "rune")) } -func (c *CallCtxt) Int64(i int) int64 { return int64(c.intValue(i, 64, "int64")) } - -func (c *CallCtxt) intValue(i, bits int, typ string) int64 { - arg := c.args[i] - x := value.Make(c.ctx, arg) - n, err := x.Int(nil) - if err != nil { - c.invalidArgType(arg, i, typ, err) - return 0 - } - if n.BitLen() > bits { - c.errf(err, "int %s overflows %s in argument %d in call to %s", - n, typ, i, c.Name()) - } - res, _ := x.Int64() - return res -} - -func (c *CallCtxt) Uint(i int) uint { return uint(c.uintValue(i, 64, "uint64")) } -func (c *CallCtxt) Uint8(i int) uint8 { return uint8(c.uintValue(i, 8, "uint8")) } -func (c *CallCtxt) Byte(i int) uint8 { return byte(c.uintValue(i, 8, "byte")) } -func (c *CallCtxt) Uint16(i int) uint16 { return uint16(c.uintValue(i, 16, "uint16")) } -func (c *CallCtxt) Uint32(i int) uint32 { return uint32(c.uintValue(i, 32, "uint32")) } -func (c *CallCtxt) Uint64(i int) uint64 { return uint64(c.uintValue(i, 64, "uint64")) } - -func (c *CallCtxt) uintValue(i, bits int, typ string) uint64 { - x := value.Make(c.ctx, c.args[i]) - n, err := x.Int(nil) - if err != nil || n.Sign() < 0 { - c.invalidArgType(c.args[i], i, typ, err) - return 0 - } - if n.BitLen() > bits { - c.errf(err, "int %s overflows %s in argument %d in call to %s", - n, typ, i, c.Name()) - } - res, _ := x.Uint64() - return res -} - -func (c *CallCtxt) Decimal(i int) *apd.Decimal { - x := value.Make(c.ctx, c.args[i]) - if _, err := x.MantExp(nil); err != nil { - c.invalidArgType(c.args[i], i, "Decimal", err) - return nil - } - return &c.args[i].(*adt.Num).X -} - -func (c *CallCtxt) Float64(i int) float64 { - x := value.Make(c.ctx, c.args[i]) - res, err := x.Float64() - if err != nil { - c.invalidArgType(c.args[i], i, "float64", err) - return 0 - } - return res -} - -func (c *CallCtxt) BigInt(i int) *big.Int { - x := value.Make(c.ctx, c.args[i]) - n, err := x.Int(nil) - if err != nil { - c.invalidArgType(c.args[i], i, "int", err) - return nil - } - return n -} - -var ten = big.NewInt(10) - -func (c *CallCtxt) BigFloat(i int) *big.Float { - x := value.Make(c.ctx, c.args[i]) - var mant big.Int - exp, err := x.MantExp(&mant) - if err != nil { - c.invalidArgType(c.args[i], i, "float", err) - return nil - } - f := &big.Float{} - f.SetInt(&mant) - if exp != 0 { - var g big.Float - e := big.NewInt(int64(exp)) - f.Mul(f, g.SetInt(e.Exp(ten, e, nil))) - } - return f -} - -func (c *CallCtxt) String(i int) string { - // TODO: use Evaluate instead. - x := value.Make(c.ctx, c.args[i]) - v, err := x.String() - if err != nil { - c.invalidArgType(c.args[i], i, "string", err) - return "" - } - return v -} - -func (c *CallCtxt) Bytes(i int) []byte { - x := value.Make(c.ctx, c.args[i]) - v, err := x.Bytes() - if err != nil { - c.invalidArgType(c.args[i], i, "bytes", err) - return nil - } - return v -} - -func (c *CallCtxt) Reader(i int) io.Reader { - x := value.Make(c.ctx, c.args[i]) - // TODO: optimize for string and bytes cases - r, err := x.Reader() - if err != nil { - c.invalidArgType(c.args[i], i, "bytes|string", err) - return nil - } - return r -} - -func (c *CallCtxt) Bool(i int) bool { - x := value.Make(c.ctx, c.args[i]) - b, err := x.Bool() - if err != nil { - c.invalidArgType(c.args[i], i, "bool", err) - return false - } - return b -} - -func (c *CallCtxt) List(i int) (a []cue.Value) { - arg := c.args[i] - x := value.Make(c.ctx, arg) - v, err := x.List() - if err != nil { - c.invalidArgType(c.args[i], i, "list", err) - return a - } - for v.Next() { - a = append(a, v.Value()) - } - return a -} - -func (c *CallCtxt) Iter(i int) (a cue.Iterator) { - arg := c.args[i] - x := value.Make(c.ctx, arg) - v, err := x.List() - if err != nil { - c.invalidArgType(c.args[i], i, "list", err) - } - return v -} - -func (c *CallCtxt) getList(i int) *adt.Vertex { - x := c.args[i] - switch v, ok := x.(*adt.Vertex); { - case ok && v.IsList(): - v.Finalize(c.ctx) - return v - - case v != nil: - x = v.Value() - } - if x.Kind()&adt.ListKind == 0 { - var err error - if b, ok := x.(*adt.Bottom); ok { - err = &callError{b} - } - c.invalidArgType(c.args[i], i, "list", err) - } else { - err := c.ctx.NewErrf("non-concrete list for argument %d", i) - err.Code = adt.IncompleteError - c.Err = &callError{err} - } - return nil -} - -func (c *CallCtxt) DecimalList(i int) (a []*apd.Decimal) { - v := c.getList(i) - if v == nil { - return nil - } - - for j, w := range v.Elems() { - w.Finalize(c.ctx) // defensive - switch x := adt.Unwrap(adt.Default(w.Value())).(type) { - case *adt.Num: - a = append(a, &x.X) - - case *adt.Bottom: - if x.IsIncomplete() { - c.Err = x - return nil - } - - default: - if k := w.Kind(); k&adt.NumKind == 0 { - err := c.ctx.NewErrf( - "invalid list element %d in argument %d to call: cannot use value %s (%s) as number", - j, i, w, k) - c.Err = &callError{err} - return a - } - - err := c.ctx.NewErrf( - "non-concrete value %s for element %d of number list argument %d", - w, j, i) - err.Code = adt.IncompleteError - c.Err = &callError{err} - return nil - } - } - return a -} - -func (c *CallCtxt) StringList(i int) (a []string) { - v := c.getList(i) - if v == nil { - return nil - } - - for j, w := range v.Elems() { - w.Finalize(c.ctx) // defensive - switch x := adt.Unwrap(adt.Default(w.Value())).(type) { - case *adt.String: - a = append(a, x.Str) - - case *adt.Bottom: - if x.IsIncomplete() { - c.Err = x - return nil - } - - default: - if k := w.Kind(); k&adt.StringKind == 0 { - err := c.ctx.NewErrf( - "invalid list element %d in argument %d to call: cannot use value %s (%s) as string", - j, i, w, k) - c.Err = &callError{err} - return a - } - - err := c.ctx.NewErrf( - "non-concrete value %s for element %d of string list argument %d", - w, j, i) - err.Code = adt.IncompleteError - c.Err = &callError{err} - return nil - } - } - return a -} diff --git a/vendor/cuelang.org/go/pkg/internal/errors.go b/vendor/cuelang.org/go/pkg/internal/errors.go deleted file mode 100644 index 077a08dc..00000000 --- a/vendor/cuelang.org/go/pkg/internal/errors.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2020 CUE Authors -// -// 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. - -package internal - -import ( - "fmt" - - "cuelang.org/go/cue/errors" - "cuelang.org/go/internal/core/adt" -) - -type bottomer interface { - error - Bottom() *adt.Bottom -} - -type callError struct { - b *adt.Bottom -} - -func (e *callError) Error() string { - return fmt.Sprint(e.b) -} - -func (c *CallCtxt) errf(underlying error, format string, args ...interface{}) { - var errs errors.Error - var code adt.ErrorCode - switch x := underlying.(type) { - case nil: - case bottomer: - b := x.Bottom() - errs = b.Err - code = b.Code - case errors.Error: - errs = x - case error: - errs = errors.Promote(x, "") - } - vErr := c.ctx.NewPosf(c.Pos(), format, args...) - c.Err = &callError{&adt.Bottom{Code: code, Err: errors.Wrap(vErr, errs)}} -} - -func (c *CallCtxt) errcf(code adt.ErrorCode, format string, args ...interface{}) { - err := c.ctx.NewErrf(format, args...) - err.Code = code - c.Err = &callError{err} -} - -func wrapCallErr(c *CallCtxt, b *adt.Bottom) *adt.Bottom { - var err errors.Error - for _, e := range errors.Errors(b.Err) { - const msg = "error in call to %s" - err = errors.Append(err, - errors.Wrapf(e, c.Pos(), msg, c.builtin.name(c.ctx))) - } - return &adt.Bottom{Code: b.Code, Err: err} -} - -func (c *CallCtxt) invalidArgType(arg adt.Value, i int, typ string, err error) { - if ve, ok := err.(bottomer); ok && ve.Bottom().IsIncomplete() { - c.Err = ve - return - } - if b, ok := adt.Unwrap(arg).(*adt.Bottom); ok { - c.Err = b - return - } - v, ok := arg.(adt.Value) - // TODO: make these permanent errors if the value did not originate from - // a reference. - if !ok { - c.errf(nil, - "cannot use incomplete value %s as %s in argument %d to %s", - arg, typ, i, c.Name()) - } - if err != nil { - c.errf(err, - "cannot use %s (type %s) as %s in argument %d to %s", - arg, v.Kind(), typ, i, c.Name()) - } else { - c.errf(err, - "cannot use %s (type %s) as %s in argument %d to %s", - arg, v.Kind(), typ, i, c.Name()) - } -} diff --git a/vendor/cuelang.org/go/pkg/internal/register.go b/vendor/cuelang.org/go/pkg/internal/register.go deleted file mode 100644 index c4754760..00000000 --- a/vendor/cuelang.org/go/pkg/internal/register.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2020 CUE Authors -// -// 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. - -package internal - -import ( - "cuelang.org/go/cue/errors" - "cuelang.org/go/internal/core/adt" - "cuelang.org/go/internal/core/eval" - "cuelang.org/go/internal/core/runtime" -) - -func Register(importPath string, p *Package) { - f := func(r adt.Runtime) (*adt.Vertex, errors.Error) { - ctx := eval.NewContext(r, nil) - - return p.MustCompile(ctx, importPath), nil - } - runtime.RegisterBuiltin(importPath, f) -} diff --git a/vendor/cuelang.org/go/pkg/list/list.go b/vendor/cuelang.org/go/pkg/list/list.go index 3f86e1d2..9fadb66d 100644 --- a/vendor/cuelang.org/go/pkg/list/list.go +++ b/vendor/cuelang.org/go/pkg/list/list.go @@ -20,6 +20,10 @@ import ( "sort" "cuelang.org/go/cue" + "cuelang.org/go/cue/errors" + "cuelang.org/go/cue/token" + "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/pkg" ) // Drop reports the suffix of list x after the first n elements, @@ -27,12 +31,11 @@ import ( // // For instance: // -// Drop([1, 2, 3, 4], 2) +// Drop([1, 2, 3, 4], 2) // // results in // -// [3, 4] -// +// [3, 4] func Drop(x []cue.Value, n int) ([]cue.Value, error) { if n < 0 { return nil, fmt.Errorf("negative index") @@ -50,7 +53,7 @@ func Drop(x []cue.Value, n int) ([]cue.Value, error) { // extensions are introduced, which may provide flatten functionality // natively. // -// // Flatten reports a flattend sequence of the list xs by expanding any elements +// // Flatten reports a flattened sequence of the list xs by expanding any elements // // that are lists. // // // // For instance: @@ -86,17 +89,16 @@ func Drop(x []cue.Value, n int) ([]cue.Value, error) { // return flatten(xs) // } -// FlattenN reports a flattend sequence of the list xs by expanding any elements +// FlattenN reports a flattened sequence of the list xs by expanding any elements // depth levels deep. If depth is negative all elements are expanded. // // For instance: // -// FlattenN([1, [[2, 3], []], [4]], 1) +// FlattenN([1, [[2, 3], []], [4]], 1) // // results in // -// [1, [2, 3], [], 4] -// +// [1, [2, 3], [], 4] func FlattenN(xs cue.Value, depth int) ([]cue.Value, error) { var flattenN func(cue.Value, int) ([]cue.Value, error) flattenN = func(xs cue.Value, depth int) ([]cue.Value, error) { @@ -127,12 +129,11 @@ func FlattenN(xs cue.Value, depth int) ([]cue.Value, error) { // // For instance: // -// Repeat([1, 2], 2) +// Repeat([1, 2], 2) // // results in // -// [1, 2, 1, 2] -// +// [1, 2, 1, 2] func Repeat(x []cue.Value, count int) ([]cue.Value, error) { if count < 0 { return nil, fmt.Errorf("negative count") @@ -148,8 +149,7 @@ func Repeat(x []cue.Value, count int) ([]cue.Value, error) { // // Concat([a, b, c]) is equivalent to // -// [ for x in a {x}, for x in b {x}, for x in c {x} ] -// +// [ for x in a {x}, for x in b {x}, for x in c {x} ] func Concat(a []cue.Value) ([]cue.Value, error) { var res []cue.Value for _, e := range a { @@ -168,12 +168,11 @@ func Concat(a []cue.Value) ([]cue.Value, error) { // // For instance: // -// Take([1, 2, 3, 4], 2) +// Take([1, 2, 3, 4], 2) // // results in // -// [1, 2] -// +// [1, 2] func Take(x []cue.Value, n int) ([]cue.Value, error) { if n < 0 { return nil, fmt.Errorf("negative index") @@ -191,12 +190,11 @@ func Take(x []cue.Value, n int) ([]cue.Value, error) { // // For instance: // -// Slice([1, 2, 3, 4], 1, 3) +// Slice([1, 2, 3, 4], 1, 3) // // results in // -// [2, 3] -// +// [2, 3] func Slice(x []cue.Value, i, j int) ([]cue.Value, error) { if i < 0 { return nil, fmt.Errorf("negative index") @@ -218,13 +216,32 @@ func Slice(x []cue.Value, i, j int) ([]cue.Value, error) { } // MinItems reports whether a has at least n items. -func MinItems(a []cue.Value, n int) bool { - return len(a) >= n +func MinItems(list pkg.List, n int) (bool, error) { + count := len(list.Elems()) + if count >= n { + return true, nil + } + code := adt.EvalError + if list.IsOpen() { + code = adt.IncompleteError + } + return false, pkg.ValidationError{B: &adt.Bottom{ + Code: code, + Err: errors.Newf(token.NoPos, "len(list) < MinItems(%[2]d) (%[1]d < %[2]d)", count, n), + }} } // MaxItems reports whether a has at most n items. -func MaxItems(a []cue.Value, n int) bool { - return len(a) <= n +func MaxItems(list pkg.List, n int) (bool, error) { + count := len(list.Elems()) + if count > n { + return false, pkg.ValidationError{B: &adt.Bottom{ + Code: adt.EvalError, + Err: errors.Newf(token.NoPos, "len(list) > MaxItems(%[2]d) (%[1]d > %[2]d)", count, n), + }} + } + + return true, nil } // UniqueItems reports whether all elements in the list are unique. diff --git a/vendor/cuelang.org/go/pkg/list/math.go b/vendor/cuelang.org/go/pkg/list/math.go index c4f802a6..602ebd6a 100644 --- a/vendor/cuelang.org/go/pkg/list/math.go +++ b/vendor/cuelang.org/go/pkg/list/math.go @@ -17,7 +17,7 @@ package list import ( "fmt" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/internal" ) @@ -92,12 +92,11 @@ func Product(xs []*internal.Decimal) (*internal.Decimal, error) { // // For instance: // -// Range(0, 5, 2) +// Range(0, 5, 2) // // results in // -// [0, 2, 4] -// +// [0, 2, 4] func Range(start, limit, step *internal.Decimal) ([]*internal.Decimal, error) { if step.IsZero() { return nil, fmt.Errorf("step must be non zero") diff --git a/vendor/cuelang.org/go/pkg/list/pkg.go b/vendor/cuelang.org/go/pkg/list/pkg.go index f62ae693..3001cc8e 100644 --- a/vendor/cuelang.org/go/pkg/list/pkg.go +++ b/vendor/cuelang.org/go/pkg/list/pkg.go @@ -1,30 +1,27 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package list import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("list", pkg) + pkg.Register("list", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Drop", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, n := c.List(0), c.Int(1) if c.Do() { c.Ret, c.Err = Drop(x, n) @@ -32,12 +29,12 @@ var pkg = &internal.Package{ }, }, { Name: "FlattenN", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { xs, depth := c.Value(0), c.Int(1) if c.Do() { c.Ret, c.Err = FlattenN(xs, depth) @@ -45,12 +42,12 @@ var pkg = &internal.Package{ }, }, { Name: "Repeat", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, count := c.List(0), c.Int(1) if c.Do() { c.Ret, c.Err = Repeat(x, count) @@ -58,11 +55,11 @@ var pkg = &internal.Package{ }, }, { Name: "Concat", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a := c.List(0) if c.Do() { c.Ret, c.Err = Concat(a) @@ -70,12 +67,12 @@ var pkg = &internal.Package{ }, }, { Name: "Take", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, n := c.List(0), c.Int(1) if c.Do() { c.Ret, c.Err = Take(x, n) @@ -83,13 +80,13 @@ var pkg = &internal.Package{ }, }, { Name: "Slice", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, i, j := c.List(0), c.Int(1), c.Int(2) if c.Do() { c.Ret, c.Err = Slice(x, i, j) @@ -97,37 +94,37 @@ var pkg = &internal.Package{ }, }, { Name: "MinItems", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { - a, n := c.List(0), c.Int(1) + Func: func(c *pkg.CallCtxt) { + list, n := c.CueList(0), c.Int(1) if c.Do() { - c.Ret = MinItems(a, n) + c.Ret, c.Err = MinItems(list, n) } }, }, { Name: "MaxItems", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { - a, n := c.List(0), c.Int(1) + Func: func(c *pkg.CallCtxt) { + list, n := c.CueList(0), c.Int(1) if c.Do() { - c.Ret = MaxItems(a, n) + c.Ret, c.Err = MaxItems(list, n) } }, }, { Name: "UniqueItems", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a := c.List(0) if c.Do() { c.Ret = UniqueItems(a) @@ -135,12 +132,12 @@ var pkg = &internal.Package{ }, }, { Name: "Contains", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a, v := c.List(0), c.Value(1) if c.Do() { c.Ret = Contains(a, v) @@ -148,11 +145,11 @@ var pkg = &internal.Package{ }, }, { Name: "Avg", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { xs := c.DecimalList(0) if c.Do() { c.Ret, c.Err = Avg(xs) @@ -160,11 +157,11 @@ var pkg = &internal.Package{ }, }, { Name: "Max", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { xs := c.DecimalList(0) if c.Do() { c.Ret, c.Err = Max(xs) @@ -172,11 +169,11 @@ var pkg = &internal.Package{ }, }, { Name: "Min", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { xs := c.DecimalList(0) if c.Do() { c.Ret, c.Err = Min(xs) @@ -184,11 +181,11 @@ var pkg = &internal.Package{ }, }, { Name: "Product", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { xs := c.DecimalList(0) if c.Do() { c.Ret, c.Err = Product(xs) @@ -196,13 +193,13 @@ var pkg = &internal.Package{ }, }, { Name: "Range", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { start, limit, step := c.Decimal(0), c.Decimal(1), c.Decimal(2) if c.Do() { c.Ret, c.Err = Range(start, limit, step) @@ -210,11 +207,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sum", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { xs := c.DecimalList(0) if c.Do() { c.Ret, c.Err = Sum(xs) @@ -222,12 +219,12 @@ var pkg = &internal.Package{ }, }, { Name: "Sort", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.TopKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { list, cmp := c.List(0), c.Value(1) if c.Do() { c.Ret, c.Err = Sort(list, cmp) @@ -235,12 +232,12 @@ var pkg = &internal.Package{ }, }, { Name: "SortStable", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.TopKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { list, cmp := c.List(0), c.Value(1) if c.Do() { c.Ret, c.Err = SortStable(list, cmp) @@ -248,11 +245,11 @@ var pkg = &internal.Package{ }, }, { Name: "SortStrings", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a := c.StringList(0) if c.Do() { c.Ret = SortStrings(a) @@ -260,12 +257,12 @@ var pkg = &internal.Package{ }, }, { Name: "IsSorted", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { list, cmp := c.List(0), c.Value(1) if c.Do() { c.Ret = IsSorted(list, cmp) @@ -273,11 +270,11 @@ var pkg = &internal.Package{ }, }, { Name: "IsSortedStrings", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a := c.StringList(0) if c.Do() { c.Ret = IsSortedStrings(a) @@ -296,7 +293,7 @@ var pkg = &internal.Package{ T: number | string x: T y: T - less: true && x < y + less: x < y } Descending: { Comparer diff --git a/vendor/cuelang.org/go/pkg/list/sort.cue b/vendor/cuelang.org/go/pkg/list/sort.cue index edd55526..a1028619 100644 --- a/vendor/cuelang.org/go/pkg/list/sort.cue +++ b/vendor/cuelang.org/go/pkg/list/sort.cue @@ -28,11 +28,10 @@ Comparer: { // list.Sort(a, list.Ascending) Ascending: { Comparer - T: number | string - x: T - y: T - // TODO: the following will be fixed when removing old-school templating. - less: true && (x < y) + T: number | string + x: T + y: T + less: x < y } // Descending defines a Comparer to sort comparable values in decreasing order. @@ -44,5 +43,5 @@ Descending: { T: number | string x: T y: T - less: (x > y) + less: x > y } diff --git a/vendor/cuelang.org/go/pkg/list/sort.go b/vendor/cuelang.org/go/pkg/list/sort.go index 6e7125a8..0cc40400 100644 --- a/vendor/cuelang.org/go/pkg/list/sort.go +++ b/vendor/cuelang.org/go/pkg/list/sort.go @@ -22,13 +22,20 @@ import ( "sort" "cuelang.org/go/cue" + "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/types" ) // valueSorter defines a sort.Interface; implemented in cue/builtinutil.go. type valueSorter struct { + ctx *adt.OpContext a []cue.Value - cmp cue.Value err error + + cmp *adt.Vertex + less *adt.Vertex + x *adt.Vertex + y *adt.Vertex } func (s *valueSorter) ret() ([]cue.Value, error) { @@ -42,16 +49,89 @@ func (s *valueSorter) ret() ([]cue.Value, error) { func (s *valueSorter) Len() int { return len(s.a) } func (s *valueSorter) Swap(i, j int) { s.a[i], s.a[j] = s.a[j], s.a[i] } func (s *valueSorter) Less(i, j int) bool { - v := s.cmp.Fill(s.a[i], "x") - v = v.Fill(s.a[j], "y") - isLess, err := v.Lookup("less").Bool() - if err != nil && s.err == nil { - s.err = err + if s.err != nil { + return false + } + var x, y types.Value + s.a[i].Core(&x) + s.a[j].Core(&y) + + // Save the state of all relevant arcs and restore later for the + // next comparison. + saveCmp := *s.cmp + saveLess := *s.less + saveX := *s.x + saveY := *s.y + + for _, c := range x.V.Conjuncts { + s.x.AddConjunct(c) + } + for _, c := range y.V.Conjuncts { + s.y.AddConjunct(c) + } + + // TODO(perf): if we can determine that the comparator values for + // x and y are idempotent (no arcs and a basevalue being top or + // a struct or list marker), then we do not need to reevaluate the input. + // In that case, we can use the below code instead of the above two loops + // setting the conjuncts. This may improve performance significantly. + // + // s.x.BaseValue = x.V.BaseValue + // s.x.Arcs = x.V.Arcs + // s.y.BaseValue = y.V.BaseValue + // s.y.Arcs = y.V.Arcs + + s.less.Finalize(s.ctx) + isLess := s.ctx.BoolValue(s.less) + if b := s.less.Err(s.ctx); b != nil && s.err == nil { + s.err = b.Err return true } + + *s.less = saveLess + *s.cmp = saveCmp + *s.x = saveX + *s.y = saveY + return isLess } +var less = cue.ParsePath("less") + +func makeValueSorter(list []cue.Value, cmp cue.Value) (s valueSorter) { + if v := cmp.LookupPath(less); !v.Exists() { + return valueSorter{err: v.Err()} + } + + var v types.Value + cmp.Core(&v) + ctx := adt.NewContext(v.R, v.V) + + n := &adt.Vertex{ + Label: v.V.Label, + Parent: v.V.Parent, + Conjuncts: v.V.Conjuncts, + } + n.CompleteArcs(ctx) + + s = valueSorter{ + a: list, + ctx: ctx, + cmp: n, + less: getArc(ctx, n, "less"), + x: getArc(ctx, n, "x"), + y: getArc(ctx, n, "y"), + } + + // TODO(perf): see comment in the Less method. If we can determine + // the conjuncts for x and y are idempotent, we can pre finalize here and + // ignore the values in the Less method. + // s.x.UpdateStatus(adt.Finalized) + // s.y.UpdateStatus(adt.Finalized) + + return s +} + // Sort sorts data while keeping the original order of equal elements. // It does O(n*log(n)) comparisons. // @@ -60,20 +140,26 @@ func (s *valueSorter) Less(i, j int) bool { // // Example: // -// Sort([2, 3, 1], list.Ascending) -// -// Sort{{a: 2}, {a: 3}, {a: 1}, {x: {}, y: {}, less: x.a < y.a}} +// Sort([2, 3, 1], list.Ascending) // +// Sort([{a: 2}, {a: 3}, {a: 1}], {x: {}, y: {}, less: x.a < y.a}) func Sort(list []cue.Value, cmp cue.Value) (sorted []cue.Value, err error) { - s := valueSorter{list, cmp, nil} + s := makeValueSorter(list, cmp) + // The input slice is already a copy and that we can modify it safely. sort.Stable(&s) return s.ret() } +func getArc(ctx *adt.OpContext, v *adt.Vertex, s string) *adt.Vertex { + f := ctx.StringLabel(s) + arc, _ := v.GetArc(ctx, f, 0) + return arc +} + // Deprecated: use Sort, which is always stable func SortStable(list []cue.Value, cmp cue.Value) (sorted []cue.Value, err error) { - s := valueSorter{list, cmp, nil} + s := makeValueSorter(list, cmp) sort.Stable(&s) return s.ret() } @@ -88,7 +174,7 @@ func SortStrings(a []string) []string { // // See Sort for an example comparator. func IsSorted(list []cue.Value, cmp cue.Value) bool { - s := valueSorter{list, cmp, nil} + s := makeValueSorter(list, cmp) return sort.IsSorted(&s) } diff --git a/vendor/cuelang.org/go/pkg/math/big.go b/vendor/cuelang.org/go/pkg/math/big.go index 7ec1b50c..a0c29515 100644 --- a/vendor/cuelang.org/go/pkg/math/big.go +++ b/vendor/cuelang.org/go/pkg/math/big.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -exclude= extract math/big +// Originally generated with: go run qgo.go -exclude= extract math/big package math diff --git a/vendor/cuelang.org/go/pkg/math/bits/manual.go b/vendor/cuelang.org/go/pkg/math/bits/manual.go index 16350e23..87d153f4 100644 --- a/vendor/cuelang.org/go/pkg/math/bits/manual.go +++ b/vendor/cuelang.org/go/pkg/math/bits/manual.go @@ -78,7 +78,6 @@ func Xor(a, b *big.Int) *big.Int { } // Clear returns the bitwise and not of a and b (a &^ b in Go). -// func Clear(a, b *big.Int) *big.Int { var z big.Int z.AndNot(a, b) diff --git a/vendor/cuelang.org/go/pkg/math/bits/pkg.go b/vendor/cuelang.org/go/pkg/math/bits/pkg.go index d3f1e409..70a1d2a1 100644 --- a/vendor/cuelang.org/go/pkg/math/bits/pkg.go +++ b/vendor/cuelang.org/go/pkg/math/bits/pkg.go @@ -1,30 +1,27 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package bits import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("math/bits", pkg) + pkg.Register("math/bits", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Lsh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, n := c.BigInt(0), c.Uint(1) if c.Do() { c.Ret = Lsh(x, n) @@ -32,12 +29,12 @@ var pkg = &internal.Package{ }, }, { Name: "Rsh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, n := c.BigInt(0), c.Uint(1) if c.Do() { c.Ret = Rsh(x, n) @@ -45,12 +42,12 @@ var pkg = &internal.Package{ }, }, { Name: "At", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, i := c.BigInt(0), c.Uint(1) if c.Do() { c.Ret, c.Err = At(x, i) @@ -58,13 +55,13 @@ var pkg = &internal.Package{ }, }, { Name: "Set", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, i, bit := c.BigInt(0), c.Int(1), c.Uint(2) if c.Do() { c.Ret = Set(x, i, bit) @@ -72,12 +69,12 @@ var pkg = &internal.Package{ }, }, { Name: "And", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a, b := c.BigInt(0), c.BigInt(1) if c.Do() { c.Ret = And(a, b) @@ -85,12 +82,12 @@ var pkg = &internal.Package{ }, }, { Name: "Or", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a, b := c.BigInt(0), c.BigInt(1) if c.Do() { c.Ret = Or(a, b) @@ -98,12 +95,12 @@ var pkg = &internal.Package{ }, }, { Name: "Xor", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a, b := c.BigInt(0), c.BigInt(1) if c.Do() { c.Ret = Xor(a, b) @@ -111,12 +108,12 @@ var pkg = &internal.Package{ }, }, { Name: "Clear", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a, b := c.BigInt(0), c.BigInt(1) if c.Do() { c.Ret = Clear(a, b) @@ -124,11 +121,11 @@ var pkg = &internal.Package{ }, }, { Name: "OnesCount", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.BigInt(0) if c.Do() { c.Ret = OnesCount(x) @@ -136,11 +133,11 @@ var pkg = &internal.Package{ }, }, { Name: "Len", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.BigInt(0) if c.Do() { c.Ret = Len(x) diff --git a/vendor/cuelang.org/go/pkg/math/manual.go b/vendor/cuelang.org/go/pkg/math/manual.go index dd77ddda..474bc7d8 100644 --- a/vendor/cuelang.org/go/pkg/math/manual.go +++ b/vendor/cuelang.org/go/pkg/math/manual.go @@ -17,52 +17,55 @@ package math import ( "math/big" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/internal" ) -func roundContext(rounder string) *apd.Context { - c := *apdContext +func roundContext(rounder apd.Rounder) internal.Context { + c := internal.BaseContext c.Rounding = rounder - return &c + return c } // TODO: for now we convert Decimals to int. This allows the desired type to be -// conveyed. This has the disadvantage tht a number like 1E10000 will need to be -// expanded. Eventually it would be better to to unify number types and allow +// conveyed. This has the disadvantage that a number like 1E10000 will need to be +// expanded. Eventually it would be better to unify number types and allow // anything that results in an integer to pose as an integer type. +// TODO: this is likely buggy, as we discard d.Exponent entirely. func toInt(d *internal.Decimal) *big.Int { i := &d.Coeff if d.Negative { i.Neg(i) } - return i + return i.MathBigInt() } // Floor returns the greatest integer value less than or equal to x. // // Special cases are: +// // Floor(±0) = ±0 // Floor(±Inf) = ±Inf // Floor(NaN) = NaN func Floor(x *internal.Decimal) (*big.Int, error) { var d internal.Decimal - _, err := apdContext.Floor(&d, x) - _, _ = apdContext.Quantize(&d, &d, 0) + _, err := internal.BaseContext.Floor(&d, x) + _, _ = internal.BaseContext.Quantize(&d, &d, 0) return toInt(&d), err } // Ceil returns the least integer value greater than or equal to x. // // Special cases are: +// // Ceil(±0) = ±0 // Ceil(±Inf) = ±Inf // Ceil(NaN) = NaN func Ceil(x *internal.Decimal) (*big.Int, error) { var d internal.Decimal - _, err := apdContext.Ceil(&d, x) - _, _ = apdContext.Quantize(&d, &d, 0) + _, err := internal.BaseContext.Ceil(&d, x) + _, _ = internal.BaseContext.Quantize(&d, &d, 0) return toInt(&d), err } @@ -71,6 +74,7 @@ var roundTruncContext = roundContext(apd.RoundDown) // Trunc returns the integer value of x. // // Special cases are: +// // Trunc(±0) = ±0 // Trunc(±Inf) = ±Inf // Trunc(NaN) = NaN @@ -85,6 +89,7 @@ var roundUpContext = roundContext(apd.RoundHalfUp) // Round returns the nearest integer, rounding half away from zero. // // Special cases are: +// // Round(±0) = ±0 // Round(±Inf) = ±Inf // Round(NaN) = NaN @@ -99,6 +104,7 @@ var roundEvenContext = roundContext(apd.RoundHalfEven) // RoundToEven returns the nearest integer, rounding ties to even. // // Special cases are: +// // RoundToEven(±0) = ±0 // RoundToEven(±Inf) = ±Inf // RoundToEven(NaN) = NaN @@ -108,7 +114,7 @@ func RoundToEven(x *internal.Decimal) (*big.Int, error) { return toInt(&d), err } -var mulContext = apd.BaseContext.WithPrecision(1) +var mulContext = internal.BaseContext.WithPrecision(1) // MultipleOf reports whether x is a multiple of y. func MultipleOf(x, y *internal.Decimal) (bool, error) { diff --git a/vendor/cuelang.org/go/pkg/math/math.go b/vendor/cuelang.org/go/pkg/math/math.go index ec274292..b7b90623 100644 --- a/vendor/cuelang.org/go/pkg/math/math.go +++ b/vendor/cuelang.org/go/pkg/math/math.go @@ -21,25 +21,24 @@ package math import ( "math" - "github.com/cockroachdb/apd/v2" + "github.com/cockroachdb/apd/v3" "cuelang.org/go/internal" ) -var apdContext = apd.BaseContext.WithPrecision(24) - // Abs returns the absolute value of x. // // Special case: Abs(±Inf) = +Inf func Abs(x *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Abs(&d, x) + _, err := internal.BaseContext.Abs(&d, x) return &d, err } // Acosh returns the inverse hyperbolic cosine of x. // // Special cases are: +// // Acosh(+Inf) = +Inf // Acosh(x) = NaN if x < 1 // Acosh(NaN) = NaN @@ -50,6 +49,7 @@ func Acosh(x float64) float64 { // Asin returns the arcsine, in radians, of x. // // Special cases are: +// // Asin(±0) = ±0 // Asin(x) = NaN if x < -1 or x > 1 func Asin(x float64) float64 { @@ -59,6 +59,7 @@ func Asin(x float64) float64 { // Acos returns the arccosine, in radians, of x. // // Special case is: +// // Acos(x) = NaN if x < -1 or x > 1 func Acos(x float64) float64 { return math.Acos(x) @@ -67,6 +68,7 @@ func Acos(x float64) float64 { // Asinh returns the inverse hyperbolic sine of x. // // Special cases are: +// // Asinh(±0) = ±0 // Asinh(±Inf) = ±Inf // Asinh(NaN) = NaN @@ -77,8 +79,9 @@ func Asinh(x float64) float64 { // Atan returns the arctangent, in radians, of x. // // Special cases are: -// Atan(±0) = ±0 -// Atan(±Inf) = ±Pi/2 +// +// Atan(±0) = ±0 +// Atan(±Inf) = ±Pi/2 func Atan(x float64) float64 { return math.Atan(x) } @@ -88,6 +91,7 @@ func Atan(x float64) float64 { // of the return value. // // Special cases are (in order): +// // Atan2(y, NaN) = NaN // Atan2(NaN, x) = NaN // Atan2(+0, x>=0) = +0 @@ -112,6 +116,7 @@ func Atan2(y, x float64) float64 { // Atanh returns the inverse hyperbolic tangent of x. // // Special cases are: +// // Atanh(1) = +Inf // Atanh(±0) = ±0 // Atanh(-1) = -Inf @@ -124,12 +129,13 @@ func Atanh(x float64) float64 { // Cbrt returns the cube root of x. // // Special cases are: +// // Cbrt(±0) = ±0 // Cbrt(±Inf) = ±Inf // Cbrt(NaN) = NaN func Cbrt(x *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Cbrt(&d, x) + _, err := internal.BaseContext.Cbrt(&d, x) return &d, err } @@ -164,12 +170,13 @@ var zero = apd.New(0, 0) // Dim returns the maximum of x-y or 0. // // Special cases are: +// // Dim(+Inf, +Inf) = NaN // Dim(-Inf, -Inf) = NaN // Dim(x, NaN) = Dim(NaN, x) = NaN func Dim(x, y *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Sub(&d, x, y) + _, err := internal.BaseContext.Sub(&d, x, y) if err != nil { return nil, err } @@ -182,6 +189,7 @@ func Dim(x, y *internal.Decimal) (*internal.Decimal, error) { // Erf returns the error function of x. // // Special cases are: +// // Erf(+Inf) = 1 // Erf(-Inf) = -1 // Erf(NaN) = NaN @@ -192,6 +200,7 @@ func Erf(x float64) float64 { // Erfc returns the complementary error function of x. // // Special cases are: +// // Erfc(+Inf) = 0 // Erfc(-Inf) = 2 // Erfc(NaN) = NaN @@ -202,6 +211,7 @@ func Erfc(x float64) float64 { // Erfinv returns the inverse error function of x. // // Special cases are: +// // Erfinv(1) = +Inf // Erfinv(-1) = -Inf // Erfinv(x) = NaN if x < -1 or x > 1 @@ -213,6 +223,7 @@ func Erfinv(x float64) float64 { // Erfcinv returns the inverse of Erfc(x). // // Special cases are: +// // Erfcinv(0) = +Inf // Erfcinv(2) = -Inf // Erfcinv(x) = NaN if x < 0 or x > 2 @@ -224,13 +235,15 @@ func Erfcinv(x float64) float64 { // Exp returns e**x, the base-e exponential of x. // // Special cases are: +// // Exp(+Inf) = +Inf // Exp(NaN) = NaN +// // Very large values overflow to 0 or +Inf. // Very small values underflow to 1. func Exp(x *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Exp(&d, x) + _, err := internal.BaseContext.Exp(&d, x) return &d, err } @@ -241,7 +254,7 @@ var two = apd.New(2, 0) // Special cases are the same as Exp. func Exp2(x *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Pow(&d, two, x) + _, err := internal.BaseContext.Pow(&d, two, x) return &d, err } @@ -249,9 +262,11 @@ func Exp2(x *internal.Decimal) (*internal.Decimal, error) { // It is more accurate than Exp(x) - 1 when x is near zero. // // Special cases are: +// // Expm1(+Inf) = +Inf // Expm1(-Inf) = -1 // Expm1(NaN) = NaN +// // Very large values overflow to -1 or +Inf. func Expm1(x float64) float64 { return math.Expm1(x) @@ -260,6 +275,7 @@ func Expm1(x float64) float64 { // Gamma returns the Gamma function of x. // // Special cases are: +// // Gamma(+Inf) = +Inf // Gamma(+0) = +Inf // Gamma(-0) = -Inf @@ -274,6 +290,7 @@ func Gamma(x float64) float64 { // unnecessary overflow and underflow. // // Special cases are: +// // Hypot(±Inf, q) = +Inf // Hypot(p, ±Inf) = +Inf // Hypot(NaN, q) = NaN @@ -285,6 +302,7 @@ func Hypot(p, q float64) float64 { // J0 returns the order-zero Bessel function of the first kind. // // Special cases are: +// // J0(±Inf) = 0 // J0(0) = 1 // J0(NaN) = NaN @@ -295,6 +313,7 @@ func J0(x float64) float64 { // Y0 returns the order-zero Bessel function of the second kind. // // Special cases are: +// // Y0(+Inf) = 0 // Y0(0) = -Inf // Y0(x < 0) = NaN @@ -306,6 +325,7 @@ func Y0(x float64) float64 { // J1 returns the order-one Bessel function of the first kind. // // Special cases are: +// // J1(±Inf) = 0 // J1(NaN) = NaN func J1(x float64) float64 { @@ -315,6 +335,7 @@ func J1(x float64) float64 { // Y1 returns the order-one Bessel function of the second kind. // // Special cases are: +// // Y1(+Inf) = 0 // Y1(0) = -Inf // Y1(x < 0) = NaN @@ -326,6 +347,7 @@ func Y1(x float64) float64 { // Jn returns the order-n Bessel function of the first kind. // // Special cases are: +// // Jn(n, ±Inf) = 0 // Jn(n, NaN) = NaN func Jn(n int, x float64) float64 { @@ -335,6 +357,7 @@ func Jn(n int, x float64) float64 { // Yn returns the order-n Bessel function of the second kind. // // Special cases are: +// // Yn(n, +Inf) = 0 // Yn(n ≥ 0, 0) = -Inf // Yn(n < 0, 0) = +Inf if n is odd, -Inf if n is even @@ -348,6 +371,7 @@ func Yn(n int, x float64) float64 { // It returns frac × 2**exp. // // Special cases are: +// // Ldexp(±0, exp) = ±0 // Ldexp(±Inf, exp) = ±Inf // Ldexp(NaN, exp) = NaN @@ -358,13 +382,14 @@ func Ldexp(frac float64, exp int) float64 { // Log returns the natural logarithm of x. // // Special cases are: +// // Log(+Inf) = +Inf // Log(0) = -Inf // Log(x < 0) = NaN // Log(NaN) = NaN func Log(x *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Ln(&d, x) + _, err := internal.BaseContext.Ln(&d, x) return &d, err } @@ -372,7 +397,7 @@ func Log(x *internal.Decimal) (*internal.Decimal, error) { // The special cases are the same as for Log. func Log10(x *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Log10(&d, x) + _, err := internal.BaseContext.Log10(&d, x) return &d, err } @@ -380,12 +405,12 @@ func Log10(x *internal.Decimal) (*internal.Decimal, error) { // The special cases are the same as for Log. func Log2(x *internal.Decimal) (*internal.Decimal, error) { var d, ln2 internal.Decimal - _, _ = apdContext.Ln(&ln2, two) - _, err := apdContext.Ln(&d, x) + _, _ = internal.BaseContext.Ln(&ln2, two) + _, err := internal.BaseContext.Ln(&d, x) if err != nil { return &d, err } - _, err = apdContext.Quo(&d, &d, &ln2) + _, err = internal.BaseContext.Quo(&d, &d, &ln2) return &d, err } @@ -393,6 +418,7 @@ func Log2(x *internal.Decimal) (*internal.Decimal, error) { // It is more accurate than Log(1 + x) when x is near zero. // // Special cases are: +// // Log1p(+Inf) = +Inf // Log1p(±0) = ±0 // Log1p(-1) = -Inf @@ -405,6 +431,7 @@ func Log1p(x float64) float64 { // Logb returns the binary exponent of x. // // Special cases are: +// // Logb(±Inf) = +Inf // Logb(0) = -Inf // Logb(NaN) = NaN @@ -415,6 +442,7 @@ func Logb(x float64) float64 { // Ilogb returns the binary exponent of x as an integer. // // Special cases are: +// // Ilogb(±Inf) = MaxInt32 // Ilogb(0) = MinInt32 // Ilogb(NaN) = MaxInt32 @@ -427,6 +455,7 @@ func Ilogb(x float64) int { // sign agrees with that of x. // // Special cases are: +// // Mod(±Inf, y) = NaN // Mod(NaN, y) = NaN // Mod(x, 0) = NaN @@ -439,6 +468,7 @@ func Mod(x, y float64) float64 { // Pow returns x**y, the base-x exponential of y. // // Special cases are (in order): +// // Pow(x, ±0) = 1 for any x // Pow(1, y) = 1 for any y // Pow(x, 1) = x for any x @@ -461,12 +491,11 @@ func Mod(x, y float64) float64 { // Pow(x, y) = NaN for finite x < 0 and finite non-integer y func Pow(x, y *internal.Decimal) (*internal.Decimal, error) { var d internal.Decimal - _, err := apdContext.Pow(&d, x, y) + _, err := internal.BaseContext.Pow(&d, x, y) return &d, err } // Pow10 returns 10**n, the base-10 exponential of n. -// func Pow10(n int32) *internal.Decimal { return apd.New(1, n) } @@ -474,6 +503,7 @@ func Pow10(n int32) *internal.Decimal { // Remainder returns the IEEE 754 floating-point remainder of x/y. // // Special cases are: +// // Remainder(±Inf, y) = NaN // Remainder(NaN, y) = NaN // Remainder(x, 0) = NaN @@ -491,6 +521,7 @@ func Signbit(x *internal.Decimal) bool { // Cos returns the cosine of the radian argument x. // // Special cases are: +// // Cos(±Inf) = NaN // Cos(NaN) = NaN func Cos(x float64) float64 { @@ -500,6 +531,7 @@ func Cos(x float64) float64 { // Sin returns the sine of the radian argument x. // // Special cases are: +// // Sin(±0) = ±0 // Sin(±Inf) = NaN // Sin(NaN) = NaN @@ -510,6 +542,7 @@ func Sin(x float64) float64 { // Sinh returns the hyperbolic sine of x. // // Special cases are: +// // Sinh(±0) = ±0 // Sinh(±Inf) = ±Inf // Sinh(NaN) = NaN @@ -520,6 +553,7 @@ func Sinh(x float64) float64 { // Cosh returns the hyperbolic cosine of x. // // Special cases are: +// // Cosh(±0) = 1 // Cosh(±Inf) = +Inf // Cosh(NaN) = NaN @@ -530,6 +564,7 @@ func Cosh(x float64) float64 { // Sqrt returns the square root of x. // // Special cases are: +// // Sqrt(+Inf) = +Inf // Sqrt(±0) = ±0 // Sqrt(x < 0) = NaN @@ -541,6 +576,7 @@ func Sqrt(x float64) float64 { // Tan returns the tangent of the radian argument x. // // Special cases are: +// // Tan(±0) = ±0 // Tan(±Inf) = NaN // Tan(NaN) = NaN @@ -551,6 +587,7 @@ func Tan(x float64) float64 { // Tanh returns the hyperbolic tangent of x. // // Special cases are: +// // Tanh(±0) = ±0 // Tanh(±Inf) = ±1 // Tanh(NaN) = NaN diff --git a/vendor/cuelang.org/go/pkg/math/pkg.go b/vendor/cuelang.org/go/pkg/math/pkg.go index dd758ffe..da6b4520 100644 --- a/vendor/cuelang.org/go/pkg/math/pkg.go +++ b/vendor/cuelang.org/go/pkg/math/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package math import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("math", pkg) + pkg.Register("math", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "MaxExp", Const: "2147483647", }, { @@ -55,12 +52,12 @@ var pkg = &internal.Package{ Const: "1", }, { Name: "Jacobi", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.BigInt(0), c.BigInt(1) if c.Do() { c.Ret = Jacobi(x, y) @@ -71,11 +68,11 @@ var pkg = &internal.Package{ Const: "62", }, { Name: "Floor", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Floor(x) @@ -83,11 +80,11 @@ var pkg = &internal.Package{ }, }, { Name: "Ceil", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Ceil(x) @@ -95,11 +92,11 @@ var pkg = &internal.Package{ }, }, { Name: "Trunc", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Trunc(x) @@ -107,11 +104,11 @@ var pkg = &internal.Package{ }, }, { Name: "Round", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Round(x) @@ -119,11 +116,11 @@ var pkg = &internal.Package{ }, }, { Name: "RoundToEven", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = RoundToEven(x) @@ -131,12 +128,12 @@ var pkg = &internal.Package{ }, }, { Name: "MultipleOf", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.Decimal(0), c.Decimal(1) if c.Do() { c.Ret, c.Err = MultipleOf(x, y) @@ -144,11 +141,11 @@ var pkg = &internal.Package{ }, }, { Name: "Abs", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Abs(x) @@ -156,11 +153,11 @@ var pkg = &internal.Package{ }, }, { Name: "Acosh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Acosh(x) @@ -168,11 +165,11 @@ var pkg = &internal.Package{ }, }, { Name: "Asin", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Asin(x) @@ -180,11 +177,11 @@ var pkg = &internal.Package{ }, }, { Name: "Acos", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Acos(x) @@ -192,11 +189,11 @@ var pkg = &internal.Package{ }, }, { Name: "Asinh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Asinh(x) @@ -204,11 +201,11 @@ var pkg = &internal.Package{ }, }, { Name: "Atan", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Atan(x) @@ -216,12 +213,12 @@ var pkg = &internal.Package{ }, }, { Name: "Atan2", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { y, x := c.Float64(0), c.Float64(1) if c.Do() { c.Ret = Atan2(y, x) @@ -229,11 +226,11 @@ var pkg = &internal.Package{ }, }, { Name: "Atanh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Atanh(x) @@ -241,11 +238,11 @@ var pkg = &internal.Package{ }, }, { Name: "Cbrt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Cbrt(x) @@ -286,12 +283,12 @@ var pkg = &internal.Package{ Const: "0.43429448190325182765112891891660508229439700580366656611445378", }, { Name: "Copysign", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.Decimal(0), c.Decimal(1) if c.Do() { c.Ret = Copysign(x, y) @@ -299,12 +296,12 @@ var pkg = &internal.Package{ }, }, { Name: "Dim", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.Decimal(0), c.Decimal(1) if c.Do() { c.Ret, c.Err = Dim(x, y) @@ -312,11 +309,11 @@ var pkg = &internal.Package{ }, }, { Name: "Erf", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Erf(x) @@ -324,11 +321,11 @@ var pkg = &internal.Package{ }, }, { Name: "Erfc", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Erfc(x) @@ -336,11 +333,11 @@ var pkg = &internal.Package{ }, }, { Name: "Erfinv", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Erfinv(x) @@ -348,11 +345,11 @@ var pkg = &internal.Package{ }, }, { Name: "Erfcinv", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Erfcinv(x) @@ -360,11 +357,11 @@ var pkg = &internal.Package{ }, }, { Name: "Exp", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Exp(x) @@ -372,11 +369,11 @@ var pkg = &internal.Package{ }, }, { Name: "Exp2", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Exp2(x) @@ -384,11 +381,11 @@ var pkg = &internal.Package{ }, }, { Name: "Expm1", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Expm1(x) @@ -396,11 +393,11 @@ var pkg = &internal.Package{ }, }, { Name: "Gamma", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Gamma(x) @@ -408,12 +405,12 @@ var pkg = &internal.Package{ }, }, { Name: "Hypot", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { p, q := c.Float64(0), c.Float64(1) if c.Do() { c.Ret = Hypot(p, q) @@ -421,11 +418,11 @@ var pkg = &internal.Package{ }, }, { Name: "J0", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = J0(x) @@ -433,11 +430,11 @@ var pkg = &internal.Package{ }, }, { Name: "Y0", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Y0(x) @@ -445,11 +442,11 @@ var pkg = &internal.Package{ }, }, { Name: "J1", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = J1(x) @@ -457,11 +454,11 @@ var pkg = &internal.Package{ }, }, { Name: "Y1", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Y1(x) @@ -469,12 +466,12 @@ var pkg = &internal.Package{ }, }, { Name: "Jn", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { n, x := c.Int(0), c.Float64(1) if c.Do() { c.Ret = Jn(n, x) @@ -482,12 +479,12 @@ var pkg = &internal.Package{ }, }, { Name: "Yn", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { n, x := c.Int(0), c.Float64(1) if c.Do() { c.Ret = Yn(n, x) @@ -495,12 +492,12 @@ var pkg = &internal.Package{ }, }, { Name: "Ldexp", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.IntKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { frac, exp := c.Float64(0), c.Int(1) if c.Do() { c.Ret = Ldexp(frac, exp) @@ -508,11 +505,11 @@ var pkg = &internal.Package{ }, }, { Name: "Log", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Log(x) @@ -520,11 +517,11 @@ var pkg = &internal.Package{ }, }, { Name: "Log10", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Log10(x) @@ -532,11 +529,11 @@ var pkg = &internal.Package{ }, }, { Name: "Log2", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret, c.Err = Log2(x) @@ -544,11 +541,11 @@ var pkg = &internal.Package{ }, }, { Name: "Log1p", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Log1p(x) @@ -556,11 +553,11 @@ var pkg = &internal.Package{ }, }, { Name: "Logb", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Logb(x) @@ -568,11 +565,11 @@ var pkg = &internal.Package{ }, }, { Name: "Ilogb", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Ilogb(x) @@ -580,12 +577,12 @@ var pkg = &internal.Package{ }, }, { Name: "Mod", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.Float64(0), c.Float64(1) if c.Do() { c.Ret = Mod(x, y) @@ -593,12 +590,12 @@ var pkg = &internal.Package{ }, }, { Name: "Pow", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.Decimal(0), c.Decimal(1) if c.Do() { c.Ret, c.Err = Pow(x, y) @@ -606,11 +603,11 @@ var pkg = &internal.Package{ }, }, { Name: "Pow10", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { n := c.Int32(0) if c.Do() { c.Ret = Pow10(n) @@ -618,12 +615,12 @@ var pkg = &internal.Package{ }, }, { Name: "Remainder", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x, y := c.Float64(0), c.Float64(1) if c.Do() { c.Ret = Remainder(x, y) @@ -631,11 +628,11 @@ var pkg = &internal.Package{ }, }, { Name: "Signbit", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Decimal(0) if c.Do() { c.Ret = Signbit(x) @@ -643,11 +640,11 @@ var pkg = &internal.Package{ }, }, { Name: "Cos", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Cos(x) @@ -655,11 +652,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sin", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Sin(x) @@ -667,11 +664,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sinh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Sinh(x) @@ -679,11 +676,11 @@ var pkg = &internal.Package{ }, }, { Name: "Cosh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Cosh(x) @@ -691,11 +688,11 @@ var pkg = &internal.Package{ }, }, { Name: "Sqrt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Sqrt(x) @@ -703,11 +700,11 @@ var pkg = &internal.Package{ }, }, { Name: "Tan", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Tan(x) @@ -715,11 +712,11 @@ var pkg = &internal.Package{ }, }, { Name: "Tanh", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.Float64(0) if c.Do() { c.Ret = Tanh(x) diff --git a/vendor/cuelang.org/go/pkg/net/doc.go b/vendor/cuelang.org/go/pkg/net/doc.go index adea9ac2..a927e2ac 100644 --- a/vendor/cuelang.org/go/pkg/net/doc.go +++ b/vendor/cuelang.org/go/pkg/net/doc.go @@ -18,10 +18,9 @@ // byte values. To allow one format over an other these types can be further // constraint using string or [...]. For instance, // -// // multicast defines a multicast IP address in string form. -// multicast: net.MulticastIP & string -// -// // unicast defines a global unicast IP address in list form. -// unicast: net.GlobalUnicastIP & [...] +// // multicast defines a multicast IP address in string form. +// multicast: net.MulticastIP & string // +// // unicast defines a global unicast IP address in list form. +// unicast: net.GlobalUnicastIP & [...] package net diff --git a/vendor/cuelang.org/go/pkg/net/host.go b/vendor/cuelang.org/go/pkg/net/host.go index 5f2f2e37..70be5f2b 100644 --- a/vendor/cuelang.org/go/pkg/net/host.go +++ b/vendor/cuelang.org/go/pkg/net/host.go @@ -91,7 +91,7 @@ func JoinHostPort(host, port cue.Value) (string, error) { return net.JoinHostPort(hostStr, portStr), nil } -// FQDN reports whether is is a valid fully qualified domain name. +// FQDN reports whether is a valid fully qualified domain name. // // FQDN allows only ASCII characters as prescribed by RFC 1034 (A-Z, a-z, 0-9 // and the hyphen). diff --git a/vendor/cuelang.org/go/pkg/net/pkg.go b/vendor/cuelang.org/go/pkg/net/pkg.go index 3bf181cd..4cd172cb 100644 --- a/vendor/cuelang.org/go/pkg/net/pkg.go +++ b/vendor/cuelang.org/go/pkg/net/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package net import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("net", pkg) + pkg.Register("net", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "SplitHostPort", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = SplitHostPort(s) @@ -31,12 +28,12 @@ var pkg = &internal.Package{ }, }, { Name: "JoinHostPort", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { host, port := c.Value(0), c.Value(1) if c.Do() { c.Ret, c.Err = JoinHostPort(host, port) @@ -44,11 +41,11 @@ var pkg = &internal.Package{ }, }, { Name: "FQDN", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = FQDN(s) @@ -62,11 +59,11 @@ var pkg = &internal.Package{ Const: "16", }, { Name: "ParseIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = ParseIP(s) @@ -74,11 +71,11 @@ var pkg = &internal.Package{ }, }, { Name: "IPv4", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = IPv4(ip) @@ -86,11 +83,11 @@ var pkg = &internal.Package{ }, }, { Name: "IP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = IP(ip) @@ -98,11 +95,11 @@ var pkg = &internal.Package{ }, }, { Name: "IPCIDR", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret, c.Err = IPCIDR(ip) @@ -110,11 +107,11 @@ var pkg = &internal.Package{ }, }, { Name: "LoopbackIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = LoopbackIP(ip) @@ -122,11 +119,11 @@ var pkg = &internal.Package{ }, }, { Name: "MulticastIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = MulticastIP(ip) @@ -134,11 +131,11 @@ var pkg = &internal.Package{ }, }, { Name: "InterfaceLocalMulticastIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = InterfaceLocalMulticastIP(ip) @@ -146,11 +143,11 @@ var pkg = &internal.Package{ }, }, { Name: "LinkLocalMulticastIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = LinkLocalMulticastIP(ip) @@ -158,11 +155,11 @@ var pkg = &internal.Package{ }, }, { Name: "LinkLocalUnicastIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = LinkLocalUnicastIP(ip) @@ -170,11 +167,11 @@ var pkg = &internal.Package{ }, }, { Name: "GlobalUnicastIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = GlobalUnicastIP(ip) @@ -182,11 +179,11 @@ var pkg = &internal.Package{ }, }, { Name: "UnspecifiedIP", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret = UnspecifiedIP(ip) @@ -194,11 +191,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToIP4", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret, c.Err = ToIP4(ip) @@ -206,11 +203,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToIP16", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret, c.Err = ToIP16(ip) @@ -218,15 +215,63 @@ var pkg = &internal.Package{ }, }, { Name: "IPString", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { ip := c.Value(0) if c.Do() { c.Ret, c.Err = IPString(ip) } }, + }, { + Name: "PathEscape", + Params: []pkg.Param{ + {Kind: adt.StringKind}, + }, + Result: adt.StringKind, + Func: func(c *pkg.CallCtxt) { + s := c.String(0) + if c.Do() { + c.Ret = PathEscape(s) + } + }, + }, { + Name: "PathUnescape", + Params: []pkg.Param{ + {Kind: adt.StringKind}, + }, + Result: adt.StringKind, + Func: func(c *pkg.CallCtxt) { + s := c.String(0) + if c.Do() { + c.Ret, c.Err = PathUnescape(s) + } + }, + }, { + Name: "QueryEscape", + Params: []pkg.Param{ + {Kind: adt.StringKind}, + }, + Result: adt.StringKind, + Func: func(c *pkg.CallCtxt) { + s := c.String(0) + if c.Do() { + c.Ret = QueryEscape(s) + } + }, + }, { + Name: "QueryUnescape", + Params: []pkg.Param{ + {Kind: adt.StringKind}, + }, + Result: adt.StringKind, + Func: func(c *pkg.CallCtxt) { + s := c.String(0) + if c.Do() { + c.Ret, c.Err = QueryUnescape(s) + } + }, }}, } diff --git a/vendor/cuelang.org/go/pkg/net/url.go b/vendor/cuelang.org/go/pkg/net/url.go new file mode 100644 index 00000000..da701b07 --- /dev/null +++ b/vendor/cuelang.org/go/pkg/net/url.go @@ -0,0 +1,50 @@ +// Copyright 2019 CUE Authors +// +// 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. + +package net + +import ( + "net/url" +) + +// PathEscape escapes the string so it can be safely placed inside a URL path +// segment, replacing special characters (including /) with %XX sequences as +// needed. +func PathEscape(s string) string { + return url.PathEscape(s) +} + +// PathUnescape does the inverse transformation of PathEscape, converting each +// 3-byte encoded substring of the form "%AB" into the hex-decoded byte 0xAB. +// It returns an error if any % is not followed by two hexadecimal digits. +// +// PathUnescape is identical to QueryUnescape except that it does not unescape +// '+' to ' ' (space). +func PathUnescape(s string) (string, error) { + return url.PathUnescape(s) +} + +// QueryEscape escapes the string so it can be safely placed inside a URL +// query. +func QueryEscape(s string) string { + return url.QueryEscape(s) +} + +// QueryUnescape does the inverse transformation of QueryEscape, converting +// each 3-byte encoded substring of the form "%AB" into the hex-decoded byte +// 0xAB. It returns an error if any % is not followed by two hexadecimal +// digits. +func QueryUnescape(s string) (string, error) { + return url.QueryUnescape(s) +} diff --git a/vendor/cuelang.org/go/pkg/packages.txt b/vendor/cuelang.org/go/pkg/packages.txt new file mode 100644 index 00000000..e46a4404 --- /dev/null +++ b/vendor/cuelang.org/go/pkg/packages.txt @@ -0,0 +1,31 @@ +regexp +encoding/json +encoding/base64 +encoding/yaml +encoding/hex +encoding/csv +uuid +time +list +strings +path +math/bits +math +crypto/sha256 +crypto/ed25519 +crypto/sha512 +crypto/md5 +crypto/sha1 +crypto/hmac +tool +tool/os +tool/cli +tool/exec +tool/file +tool/http +struct +net +html +strconv +text/template +text/tabwriter diff --git a/vendor/cuelang.org/go/pkg/path/match.go b/vendor/cuelang.org/go/pkg/path/match.go index b18d78cd..7f371f75 100644 --- a/vendor/cuelang.org/go/pkg/path/match.go +++ b/vendor/cuelang.org/go/pkg/path/match.go @@ -51,7 +51,6 @@ var ErrBadPattern = errors.New("syntax error in pattern") // // On Windows, escaping is disabled. Instead, '\\' is treated as // path separator. -// func Match(pattern, name string, o OS) (matched bool, err error) { os := getOS(o) Pattern: diff --git a/vendor/cuelang.org/go/pkg/path/path.go b/vendor/cuelang.org/go/pkg/path/path.go index 9f29dd2f..4d1647c1 100644 --- a/vendor/cuelang.org/go/pkg/path/path.go +++ b/vendor/cuelang.org/go/pkg/path/path.go @@ -74,13 +74,13 @@ func (b *lazybuf) string() string { // It applies the following rules // iteratively until no further processing can be done: // -// 1. Replace multiple Separator elements with a single one. -// 2. Eliminate each . path name element (the current directory). -// 3. Eliminate each inner .. path name element (the parent directory) -// along with the non-.. element that precedes it. -// 4. Eliminate .. elements that begin a rooted path: -// that is, replace "/.." by "/" at the beginning of a path, -// assuming Separator is '/'. +// 1. Replace multiple Separator elements with a single one. +// 2. Eliminate each . path name element (the current directory). +// 3. Eliminate each inner .. path name element (the parent directory) +// along with the non-.. element that precedes it. +// 4. Eliminate .. elements that begin a rooted path: +// that is, replace "/.." by "/" at the beginning of a path, +// assuming Separator is '/'. // // The returned path ends in a slash only if it represents a root directory, // such as "/" on Unix or `C:\` on Windows. @@ -90,8 +90,8 @@ func (b *lazybuf) string() string { // If the result of this process is an empty string, Clean // returns the string ".". // -// See also Rob Pike, ``Lexical File Names in Plan 9 or -// Getting Dot-Dot Right,'' +// See also Rob Pike, “Lexical File Names in Plan 9 or +// Getting Dot-Dot Right,” // https://9p.io/sys/doc/lexnames.html func Clean(path string, os OS) string { return clean(path, getOS(os)) diff --git a/vendor/cuelang.org/go/pkg/path/pkg.go b/vendor/cuelang.org/go/pkg/path/pkg.go index dbe0f744..9cdd3501 100644 --- a/vendor/cuelang.org/go/pkg/path/pkg.go +++ b/vendor/cuelang.org/go/pkg/path/pkg.go @@ -16,11 +16,11 @@ package path import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("path", pkg) + pkg.Register("path", p) } var _ = adt.TopKind // in case the adt package isn't used @@ -38,20 +38,20 @@ var ( // windowsDefault is the default for VolumeName. windowsDefault = &adt.Disjunction{ NumDefaults: 1, - Values: append([]*adt.Vertex{ + Values: append([]adt.Value{ newStr("windows"), newStr("unix"), newStr("plan9")}, unixOS...), } - allOS = append([]*adt.Vertex{ + allOS = append([]adt.Value{ newStr("unix"), newStr("windows"), newStr("plan9"), }, unixOS...) // These all fall back to unix - unixOS = []*adt.Vertex{ + unixOS = []adt.Value{ newStr("aix"), newStr("android"), newStr("darwin"), @@ -70,26 +70,24 @@ var ( } ) -func newStr(s string) *adt.Vertex { - v := &adt.Vertex{} - v.SetValue(nil, adt.Finalized, &adt.String{Str: s}) - return v +func newStr(s string) adt.Value { + return &adt.String{Str: s} } -var pkg = &internal.Package{ +var p = &pkg.Package{ CUE: `{ Unix: "unix" Windows: "windows" Plan9: "plan9" }`, - Native: []*internal.Builtin{{ + Native: []*pkg.Builtin{{ Name: "Split", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = Split(path, OS(os)) @@ -97,12 +95,12 @@ var pkg = &internal.Package{ }, }, { Name: "SplitList", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: osRequired}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = SplitList(path, OS(os)) @@ -110,12 +108,12 @@ var pkg = &internal.Package{ }, }, { Name: "Join", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { list, os := c.StringList(0), c.String(1) if c.Do() { c.Ret = Join(list, OS(os)) @@ -123,12 +121,12 @@ var pkg = &internal.Package{ }, }, { Name: "Match", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, name, os := c.String(0), c.String(1), c.String(2) if c.Do() { c.Ret, c.Err = Match(pattern, name, OS(os)) @@ -136,12 +134,12 @@ var pkg = &internal.Package{ }, }, { Name: "Clean", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = Clean(path, OS(os)) @@ -149,12 +147,12 @@ var pkg = &internal.Package{ }, }, { Name: "ToSlash", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: osRequired}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = ToSlash(path, OS(os)) @@ -162,12 +160,12 @@ var pkg = &internal.Package{ }, }, { Name: "FromSlash", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: osRequired}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = FromSlash(path, OS(os)) @@ -175,12 +173,12 @@ var pkg = &internal.Package{ }, }, { Name: "Ext", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = Ext(path, OS(os)) @@ -188,13 +186,13 @@ var pkg = &internal.Package{ }, }, { Name: "Resolve", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { dir, sub, os := c.String(0), c.String(1), c.String(2) if c.Do() { c.Ret = Resolve(dir, sub, OS(os)) @@ -202,13 +200,13 @@ var pkg = &internal.Package{ }, }, { Name: "Rel", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { base, target, os := c.String(0), c.String(1), c.String(2) if c.Do() { c.Ret, c.Err = Rel(base, target, OS(os)) @@ -216,12 +214,12 @@ var pkg = &internal.Package{ }, }, { Name: "Base", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = Base(path, OS(os)) @@ -229,12 +227,12 @@ var pkg = &internal.Package{ }, }, { Name: "Dir", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = Dir(path, OS(os)) @@ -242,12 +240,12 @@ var pkg = &internal.Package{ }, }, { Name: "IsAbs", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: unixDefault}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = IsAbs(path, OS(os)) @@ -255,12 +253,12 @@ var pkg = &internal.Package{ }, }, { Name: "VolumeName", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind, Value: windowsDefault}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { path, os := c.String(0), c.String(1) if c.Do() { c.Ret = VolumeName(path, OS(os)) diff --git a/vendor/cuelang.org/go/pkg/regexp/manual.go b/vendor/cuelang.org/go/pkg/regexp/manual.go index 4faf560b..eb3c1d24 100644 --- a/vendor/cuelang.org/go/pkg/regexp/manual.go +++ b/vendor/cuelang.org/go/pkg/regexp/manual.go @@ -19,14 +19,17 @@ // More precisely, it is the syntax accepted by RE2 and described at // https://golang.org/s/re2syntax, except for \C. // For an overview of the syntax, run -// go doc regexp/syntax +// +// go doc regexp/syntax // // The regexp implementation provided by this package is // guaranteed to run in time linear in the size of the input. // (This is a property not guaranteed by most open source // implementations of regular expressions.) For more information // about this property, see +// // https://swtch.com/~rsc/regexp/regexp1.html +// // or any book about automata theory. // // All characters are UTF-8-encoded code points. @@ -140,10 +143,12 @@ func FindAllSubmatch(pattern, s string, n int) ([][]string, error) { // in capturing groups. // // Example: -// regexp.FindNamedSubmatch(#"Hello (?P\w*)!"#, "Hello World!") +// +// regexp.FindNamedSubmatch(#"Hello (?P\w*)!"#, "Hello World!") +// // Output: -// [{person: "World"}] // +// [{person: "World"}] func FindNamedSubmatch(pattern, s string) (map[string]string, error) { re, err := regexp.Compile(pattern) if err != nil { diff --git a/vendor/cuelang.org/go/pkg/regexp/pkg.go b/vendor/cuelang.org/go/pkg/regexp/pkg.go index 4d752133..4b0f9af6 100644 --- a/vendor/cuelang.org/go/pkg/regexp/pkg.go +++ b/vendor/cuelang.org/go/pkg/regexp/pkg.go @@ -1,30 +1,27 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package regexp import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("regexp", pkg) + pkg.Register("regexp", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Find", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = Find(pattern, s) @@ -32,13 +29,13 @@ var pkg = &internal.Package{ }, }, { Name: "FindAll", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s, n := c.String(0), c.String(1), c.Int(2) if c.Do() { c.Ret, c.Err = FindAll(pattern, s, n) @@ -46,13 +43,13 @@ var pkg = &internal.Package{ }, }, { Name: "FindAllNamedSubmatch", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s, n := c.String(0), c.String(1), c.Int(2) if c.Do() { c.Ret, c.Err = FindAllNamedSubmatch(pattern, s, n) @@ -60,13 +57,13 @@ var pkg = &internal.Package{ }, }, { Name: "FindAllSubmatch", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s, n := c.String(0), c.String(1), c.Int(2) if c.Do() { c.Ret, c.Err = FindAllSubmatch(pattern, s, n) @@ -74,12 +71,12 @@ var pkg = &internal.Package{ }, }, { Name: "FindNamedSubmatch", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StructKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = FindNamedSubmatch(pattern, s) @@ -87,12 +84,12 @@ var pkg = &internal.Package{ }, }, { Name: "FindSubmatch", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = FindSubmatch(pattern, s) @@ -100,13 +97,13 @@ var pkg = &internal.Package{ }, }, { Name: "ReplaceAll", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, src, repl := c.String(0), c.String(1), c.String(2) if c.Do() { c.Ret, c.Err = ReplaceAll(pattern, src, repl) @@ -114,13 +111,13 @@ var pkg = &internal.Package{ }, }, { Name: "ReplaceAllLiteral", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, src, repl := c.String(0), c.String(1), c.String(2) if c.Do() { c.Ret, c.Err = ReplaceAllLiteral(pattern, src, repl) @@ -128,11 +125,11 @@ var pkg = &internal.Package{ }, }, { Name: "Valid", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern := c.String(0) if c.Do() { c.Ret, c.Err = Valid(pattern) @@ -140,12 +137,12 @@ var pkg = &internal.Package{ }, }, { Name: "Match", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { pattern, s := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = Match(pattern, s) @@ -153,11 +150,11 @@ var pkg = &internal.Package{ }, }, { Name: "QuoteMeta", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = QuoteMeta(s) diff --git a/vendor/cuelang.org/go/pkg/regexp/regexp.go b/vendor/cuelang.org/go/pkg/regexp/regexp.go index 63772065..5ee737b9 100644 --- a/vendor/cuelang.org/go/pkg/regexp/regexp.go +++ b/vendor/cuelang.org/go/pkg/regexp/regexp.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -exclude=Compile,Append,Reader,Match$ -stripstr extract regexp +// Originally generated with: go run qgo.go -exclude=Compile,Append,Reader,Match$ -stripstr extract regexp package regexp diff --git a/vendor/cuelang.org/go/pkg/strconv/pkg.go b/vendor/cuelang.org/go/pkg/strconv/pkg.go index bc78f9ee..bdf4091f 100644 --- a/vendor/cuelang.org/go/pkg/strconv/pkg.go +++ b/vendor/cuelang.org/go/pkg/strconv/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package strconv import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("strconv", pkg) + pkg.Register("strconv", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Unquote", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = Unquote(s) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "ParseBool", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { str := c.String(0) if c.Do() { c.Ret, c.Err = ParseBool(str) @@ -43,11 +40,11 @@ var pkg = &internal.Package{ }, }, { Name: "FormatBool", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BoolKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b := c.Bool(0) if c.Do() { c.Ret = FormatBool(b) @@ -55,12 +52,12 @@ var pkg = &internal.Package{ }, }, { Name: "ParseComplex", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.TopKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, bitSize := c.String(0), c.Int(1) if c.Do() { c.Ret, c.Err = ParseComplex(s, bitSize) @@ -68,12 +65,12 @@ var pkg = &internal.Package{ }, }, { Name: "ParseFloat", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.NumKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, bitSize := c.String(0), c.Int(1) if c.Do() { c.Ret, c.Err = ParseFloat(s, bitSize) @@ -84,13 +81,13 @@ var pkg = &internal.Package{ Const: "64", }, { Name: "ParseUint", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, base, bitSize := c.String(0), c.Int(1), c.Int(2) if c.Do() { c.Ret, c.Err = ParseUint(s, base, bitSize) @@ -98,13 +95,13 @@ var pkg = &internal.Package{ }, }, { Name: "ParseInt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, base, bitSize := c.String(0), c.Int(1), c.Int(2) if c.Do() { c.Ret, c.Err = ParseInt(s, base, bitSize) @@ -112,11 +109,11 @@ var pkg = &internal.Package{ }, }, { Name: "Atoi", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = Atoi(s) @@ -124,14 +121,14 @@ var pkg = &internal.Package{ }, }, { Name: "FormatFloat", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.NumKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { f, fmt, prec, bitSize := c.Float64(0), c.Byte(1), c.Int(2), c.Int(3) if c.Do() { c.Ret = FormatFloat(f, fmt, prec, bitSize) @@ -139,37 +136,37 @@ var pkg = &internal.Package{ }, }, { Name: "FormatUint", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { - i, base := c.Uint64(0), c.Int(1) + Func: func(c *pkg.CallCtxt) { + i, base := c.BigInt(0), c.Int(1) if c.Do() { c.Ret = FormatUint(i, base) } }, }, { Name: "FormatInt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { - i, base := c.Int64(0), c.Int(1) + Func: func(c *pkg.CallCtxt) { + i, base := c.BigInt(0), c.Int(1) if c.Do() { c.Ret = FormatInt(i, base) } }, }, { Name: "Quote", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = Quote(s) @@ -177,11 +174,11 @@ var pkg = &internal.Package{ }, }, { Name: "QuoteToASCII", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = QuoteToASCII(s) @@ -189,11 +186,11 @@ var pkg = &internal.Package{ }, }, { Name: "QuoteToGraphic", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = QuoteToGraphic(s) @@ -201,11 +198,11 @@ var pkg = &internal.Package{ }, }, { Name: "QuoteRune", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { r := c.Rune(0) if c.Do() { c.Ret = QuoteRune(r) @@ -213,11 +210,11 @@ var pkg = &internal.Package{ }, }, { Name: "QuoteRuneToASCII", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { r := c.Rune(0) if c.Do() { c.Ret = QuoteRuneToASCII(r) @@ -225,11 +222,11 @@ var pkg = &internal.Package{ }, }, { Name: "QuoteRuneToGraphic", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { r := c.Rune(0) if c.Do() { c.Ret = QuoteRuneToGraphic(r) @@ -237,11 +234,11 @@ var pkg = &internal.Package{ }, }, { Name: "IsPrint", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { r := c.Rune(0) if c.Do() { c.Ret = IsPrint(r) @@ -249,11 +246,11 @@ var pkg = &internal.Package{ }, }, { Name: "IsGraphic", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { r := c.Rune(0) if c.Do() { c.Ret = IsGraphic(r) diff --git a/vendor/cuelang.org/go/pkg/strconv/strconv.go b/vendor/cuelang.org/go/pkg/strconv/strconv.go index b6dc2995..be2fe5bd 100644 --- a/vendor/cuelang.org/go/pkg/strconv/strconv.go +++ b/vendor/cuelang.org/go/pkg/strconv/strconv.go @@ -16,11 +16,14 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -exclude=Append,Unquote,Itoa,CanBackquote,FormatComplex extract strconv +// Originally generated with: go run qgo.go -exclude=Append,Unquote,Itoa,CanBackquote,FormatComplex extract strconv package strconv -import "strconv" +import ( + "math/big" + "strconv" +) // ParseBool returns the boolean value represented by the string. // It accepts 1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False. @@ -150,17 +153,19 @@ func FormatFloat(f float64, fmt byte, prec, bitSize int) string { } // FormatUint returns the string representation of i in the given base, -// for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z' -// for digit values >= 10. -func FormatUint(i uint64, base int) string { - return strconv.FormatUint(i, base) +// for 2 <= base <= 62. The result uses: +// For 10 <= digit values <= 35, the lower-case letters 'a' to 'z' +// For 36 <= digit values <= 61, the upper-case letters 'A' to 'Z' +func FormatUint(i *big.Int, base int) string { + return i.Text(base) } // FormatInt returns the string representation of i in the given base, -// for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z' -// for digit values >= 10. -func FormatInt(i int64, base int) string { - return strconv.FormatInt(i, base) +// for 2 <= base <= 62. The result uses: +// For 10 <= digit values <= 35, the lower-case letters 'a' to 'z' +// For 36 <= digit values <= 61, the upper-case letters 'A' to 'Z' +func FormatInt(i *big.Int, base int) string { + return i.Text(base) } // Quote returns a double-quoted Go string literal representing s. The diff --git a/vendor/cuelang.org/go/pkg/strings/manual.go b/vendor/cuelang.org/go/pkg/strings/manual.go index 9f538708..56b6f3d9 100644 --- a/vendor/cuelang.org/go/pkg/strings/manual.go +++ b/vendor/cuelang.org/go/pkg/strings/manual.go @@ -18,9 +18,9 @@ // Some of the functions in this package are specifically intended as field // constraints. For instance, MaxRunes as used in this CUE program // -// import "strings" +// import "strings" // -// myString: strings.MaxRunes(5) +// myString: strings.MaxRunes(5) // // specifies that the myString should be at most 5 code points. package strings @@ -54,7 +54,7 @@ func Runes(s string) []rune { } // MinRunes reports whether the number of runes (Unicode codepoints) in a string -// is at least a certain minimum. MinRunes can be used a a field constraint to +// is at least a certain minimum. MinRunes can be used a field constraint to // except all strings for which this property holds. func MinRunes(s string, min int) bool { // TODO: CUE strings cannot be invalid UTF-8. In case this changes, we need @@ -64,7 +64,7 @@ func MinRunes(s string, min int) bool { } // MaxRunes reports whether the number of runes (Unicode codepoints) in a string -// exceeds a certain maximum. MaxRunes can be used a a field constraint to +// exceeds a certain maximum. MaxRunes can be used a field constraint to // except all strings for which this property holds func MaxRunes(s string, max int) bool { // See comment in MinRunes implementation. diff --git a/vendor/cuelang.org/go/pkg/strings/pkg.go b/vendor/cuelang.org/go/pkg/strings/pkg.go index b8b9cebc..e82f424f 100644 --- a/vendor/cuelang.org/go/pkg/strings/pkg.go +++ b/vendor/cuelang.org/go/pkg/strings/pkg.go @@ -1,30 +1,27 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package strings import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("strings", pkg) + pkg.Register("strings", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "ByteAt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b, i := c.Bytes(0), c.Int(1) if c.Do() { c.Ret, c.Err = ByteAt(b, i) @@ -32,13 +29,13 @@ var pkg = &internal.Package{ }, }, { Name: "ByteSlice", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.BytesKind | adt.StringKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.BytesKind | adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { b, start, end := c.Bytes(0), c.Int(1), c.Int(2) if c.Do() { c.Ret, c.Err = ByteSlice(b, start, end) @@ -46,11 +43,11 @@ var pkg = &internal.Package{ }, }, { Name: "Runes", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = Runes(s) @@ -58,12 +55,12 @@ var pkg = &internal.Package{ }, }, { Name: "MinRunes", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, min := c.String(0), c.Int(1) if c.Do() { c.Ret = MinRunes(s, min) @@ -71,12 +68,12 @@ var pkg = &internal.Package{ }, }, { Name: "MaxRunes", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, max := c.String(0), c.Int(1) if c.Do() { c.Ret = MaxRunes(s, max) @@ -84,11 +81,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToTitle", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = ToTitle(s) @@ -96,11 +93,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToCamel", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = ToCamel(s) @@ -108,13 +105,13 @@ var pkg = &internal.Package{ }, }, { Name: "SliceRunes", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, start, end := c.String(0), c.Int(1), c.Int(2) if c.Do() { c.Ret, c.Err = SliceRunes(s, start, end) @@ -122,12 +119,12 @@ var pkg = &internal.Package{ }, }, { Name: "Compare", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { a, b := c.String(0), c.String(1) if c.Do() { c.Ret = Compare(a, b) @@ -135,12 +132,12 @@ var pkg = &internal.Package{ }, }, { Name: "Count", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, substr := c.String(0), c.String(1) if c.Do() { c.Ret = Count(s, substr) @@ -148,12 +145,12 @@ var pkg = &internal.Package{ }, }, { Name: "Contains", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, substr := c.String(0), c.String(1) if c.Do() { c.Ret = Contains(s, substr) @@ -161,12 +158,12 @@ var pkg = &internal.Package{ }, }, { Name: "ContainsAny", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, chars := c.String(0), c.String(1) if c.Do() { c.Ret = ContainsAny(s, chars) @@ -174,12 +171,12 @@ var pkg = &internal.Package{ }, }, { Name: "LastIndex", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, substr := c.String(0), c.String(1) if c.Do() { c.Ret = LastIndex(s, substr) @@ -187,12 +184,12 @@ var pkg = &internal.Package{ }, }, { Name: "IndexAny", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, chars := c.String(0), c.String(1) if c.Do() { c.Ret = IndexAny(s, chars) @@ -200,12 +197,12 @@ var pkg = &internal.Package{ }, }, { Name: "LastIndexAny", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, chars := c.String(0), c.String(1) if c.Do() { c.Ret = LastIndexAny(s, chars) @@ -213,13 +210,13 @@ var pkg = &internal.Package{ }, }, { Name: "SplitN", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, sep, n := c.String(0), c.String(1), c.Int(2) if c.Do() { c.Ret = SplitN(s, sep, n) @@ -227,13 +224,13 @@ var pkg = &internal.Package{ }, }, { Name: "SplitAfterN", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, sep, n := c.String(0), c.String(1), c.Int(2) if c.Do() { c.Ret = SplitAfterN(s, sep, n) @@ -241,12 +238,12 @@ var pkg = &internal.Package{ }, }, { Name: "Split", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, sep := c.String(0), c.String(1) if c.Do() { c.Ret = Split(s, sep) @@ -254,12 +251,12 @@ var pkg = &internal.Package{ }, }, { Name: "SplitAfter", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, sep := c.String(0), c.String(1) if c.Do() { c.Ret = SplitAfter(s, sep) @@ -267,11 +264,11 @@ var pkg = &internal.Package{ }, }, { Name: "Fields", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.ListKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = Fields(s) @@ -279,12 +276,12 @@ var pkg = &internal.Package{ }, }, { Name: "Join", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.ListKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { elems, sep := c.StringList(0), c.String(1) if c.Do() { c.Ret = Join(elems, sep) @@ -292,12 +289,12 @@ var pkg = &internal.Package{ }, }, { Name: "HasPrefix", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, prefix := c.String(0), c.String(1) if c.Do() { c.Ret = HasPrefix(s, prefix) @@ -305,12 +302,12 @@ var pkg = &internal.Package{ }, }, { Name: "HasSuffix", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, suffix := c.String(0), c.String(1) if c.Do() { c.Ret = HasSuffix(s, suffix) @@ -318,12 +315,12 @@ var pkg = &internal.Package{ }, }, { Name: "Repeat", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, count := c.String(0), c.Int(1) if c.Do() { c.Ret = Repeat(s, count) @@ -331,11 +328,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToUpper", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = ToUpper(s) @@ -343,11 +340,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToLower", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = ToLower(s) @@ -355,12 +352,12 @@ var pkg = &internal.Package{ }, }, { Name: "Trim", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, cutset := c.String(0), c.String(1) if c.Do() { c.Ret = Trim(s, cutset) @@ -368,12 +365,12 @@ var pkg = &internal.Package{ }, }, { Name: "TrimLeft", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, cutset := c.String(0), c.String(1) if c.Do() { c.Ret = TrimLeft(s, cutset) @@ -381,12 +378,12 @@ var pkg = &internal.Package{ }, }, { Name: "TrimRight", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, cutset := c.String(0), c.String(1) if c.Do() { c.Ret = TrimRight(s, cutset) @@ -394,11 +391,11 @@ var pkg = &internal.Package{ }, }, { Name: "TrimSpace", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = TrimSpace(s) @@ -406,12 +403,12 @@ var pkg = &internal.Package{ }, }, { Name: "TrimPrefix", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, prefix := c.String(0), c.String(1) if c.Do() { c.Ret = TrimPrefix(s, prefix) @@ -419,12 +416,12 @@ var pkg = &internal.Package{ }, }, { Name: "TrimSuffix", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, suffix := c.String(0), c.String(1) if c.Do() { c.Ret = TrimSuffix(s, suffix) @@ -432,14 +429,14 @@ var pkg = &internal.Package{ }, }, { Name: "Replace", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.StringKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, old, new, n := c.String(0), c.String(1), c.String(2), c.Int(3) if c.Do() { c.Ret = Replace(s, old, new, n) @@ -447,12 +444,12 @@ var pkg = &internal.Package{ }, }, { Name: "Index", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s, substr := c.String(0), c.String(1) if c.Do() { c.Ret = Index(s, substr) diff --git a/vendor/cuelang.org/go/pkg/strings/strings.go b/vendor/cuelang.org/go/pkg/strings/strings.go index 14082b90..fc10f68d 100644 --- a/vendor/cuelang.org/go/pkg/strings/strings.go +++ b/vendor/cuelang.org/go/pkg/strings/strings.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -exclude=Rune$,Func$,^Map$,Special$,EqualFold,Byte,Title$,ToValidUTF8,All$ extract strings +// Originally generated with: go run qgo.go -exclude=Rune$,Func$,^Map$,Special$,EqualFold,Byte,Title$,ToValidUTF8,All$ extract strings package strings @@ -70,9 +70,10 @@ func LastIndexAny(s, chars string) int { // the substrings between those separators. // // The count determines the number of substrings to return: -// n > 0: at most n substrings; the last substring will be the unsplit remainder. -// n == 0: the result is nil (zero substrings) -// n < 0: all substrings +// +// n > 0: at most n substrings; the last substring will be the unsplit remainder. +// n == 0: the result is nil (zero substrings) +// n < 0: all substrings // // Edge cases for s and sep (for example, empty strings) are handled // as described in the documentation for Split. @@ -84,9 +85,10 @@ func SplitN(s, sep string, n int) []string { // returns a slice of those substrings. // // The count determines the number of substrings to return: -// n > 0: at most n substrings; the last substring will be the unsplit remainder. -// n == 0: the result is nil (zero substrings) -// n < 0: all substrings +// +// n > 0: at most n substrings; the last substring will be the unsplit remainder. +// n == 0: the result is nil (zero substrings) +// n < 0: all substrings // // Edge cases for s and sep (for example, empty strings) are handled // as described in the documentation for SplitAfter. diff --git a/vendor/cuelang.org/go/pkg/struct/pkg.go b/vendor/cuelang.org/go/pkg/struct/pkg.go index f7bf56e8..19b0976e 100644 --- a/vendor/cuelang.org/go/pkg/struct/pkg.go +++ b/vendor/cuelang.org/go/pkg/struct/pkg.go @@ -1,43 +1,40 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package structs import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("struct", pkg) + pkg.Register("struct", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "MinFields", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StructKind}, {Kind: adt.IntKind}, }, - Result: adt.BottomKind, - Func: func(c *internal.CallCtxt) { + Result: adt.BoolKind, + Func: func(c *pkg.CallCtxt) { object, n := c.Struct(0), c.Int(1) if c.Do() { - c.Ret = MinFields(object, n) + c.Ret, c.Err = MinFields(object, n) } }, }, { Name: "MaxFields", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StructKind}, {Kind: adt.IntKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { object, n := c.Struct(0), c.Int(1) if c.Do() { c.Ret, c.Err = MaxFields(object, n) diff --git a/vendor/cuelang.org/go/pkg/struct/struct.go b/vendor/cuelang.org/go/pkg/struct/struct.go index 2dd37ca0..39e2cda4 100644 --- a/vendor/cuelang.org/go/pkg/struct/struct.go +++ b/vendor/cuelang.org/go/pkg/struct/struct.go @@ -16,10 +16,10 @@ package structs import ( - "cuelang.org/go/cue" "cuelang.org/go/cue/errors" "cuelang.org/go/cue/token" "cuelang.org/go/internal/core/adt" + "cuelang.org/go/internal/pkg" ) // MinFields validates the minimum number of fields that are part of a struct. @@ -27,19 +27,19 @@ import ( // // Only fields that are part of the data model count. This excludes hidden // fields, optional fields, and definitions. -func MinFields(object *cue.Struct, n int) *adt.Bottom { - iter := object.Fields(cue.Hidden(false), cue.Optional(false)) - count := 0 - for iter.Next() { - count++ +func MinFields(object pkg.Struct, n int) (bool, error) { + count := object.Len() + code := adt.EvalError + if object.IsOpen() { + code = adt.IncompleteError } if count < n { - return &adt.Bottom{ - Code: adt.IncompleteError, // could still be resolved + return false, pkg.ValidationError{B: &adt.Bottom{ + Code: code, Err: errors.Newf(token.NoPos, "len(fields) < MinFields(%[2]d) (%[1]d < %[2]d)", count, n), - } + }} } - return nil + return true, nil } // MaxFields validates the maximum number of fields that are part of a struct. @@ -47,12 +47,14 @@ func MinFields(object *cue.Struct, n int) *adt.Bottom { // // Only fields that are part of the data model count. This excludes hidden // fields, optional fields, and definitions. -func MaxFields(object *cue.Struct, n int) (bool, error) { - iter := object.Fields(cue.Hidden(false), cue.Optional(false)) - count := 0 - for iter.Next() { - count++ +func MaxFields(object pkg.Struct, n int) (bool, error) { + count := object.Len() + if count > n { + return false, pkg.ValidationError{B: &adt.Bottom{ + Code: adt.EvalError, + Err: errors.Newf(token.NoPos, "len(fields) > MaxFields(%[2]d) (%[1]d > %[2]d)", count, n), + }} } - // permanent error is okay here. - return count <= n, nil + + return true, nil } diff --git a/vendor/cuelang.org/go/pkg/text/tabwriter/manual.go b/vendor/cuelang.org/go/pkg/text/tabwriter/manual.go index 42f90aa9..553a0d21 100644 --- a/vendor/cuelang.org/go/pkg/text/tabwriter/manual.go +++ b/vendor/cuelang.org/go/pkg/text/tabwriter/manual.go @@ -15,8 +15,8 @@ package tabwriter import ( - "bytes" "fmt" + "strings" "text/tabwriter" "cuelang.org/go/cue" @@ -25,8 +25,8 @@ import ( // Write formats text in columns. See golang.org/pkg/text/tabwriter for more // info. func Write(data cue.Value) (string, error) { - buf := &bytes.Buffer{} - tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0) + var b strings.Builder + tw := tabwriter.NewWriter(&b, 0, 4, 1, ' ', 0) write := func(v cue.Value) error { b, err := v.Bytes() @@ -57,5 +57,5 @@ func Write(data cue.Value) (string, error) { } err := tw.Flush() - return buf.String(), err + return b.String(), err } diff --git a/vendor/cuelang.org/go/pkg/text/tabwriter/pkg.go b/vendor/cuelang.org/go/pkg/text/tabwriter/pkg.go index 2fd711b8..86e86e64 100644 --- a/vendor/cuelang.org/go/pkg/text/tabwriter/pkg.go +++ b/vendor/cuelang.org/go/pkg/text/tabwriter/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package tabwriter import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("text/tabwriter", pkg) + pkg.Register("text/tabwriter", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Write", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { data := c.Value(0) if c.Do() { c.Ret, c.Err = Write(data) diff --git a/vendor/cuelang.org/go/pkg/text/template/manual.go b/vendor/cuelang.org/go/pkg/text/template/manual.go index 646f5e85..6c2c9573 100644 --- a/vendor/cuelang.org/go/pkg/text/template/manual.go +++ b/vendor/cuelang.org/go/pkg/text/template/manual.go @@ -15,7 +15,7 @@ package template import ( - "bytes" + "strings" "text/template" "cuelang.org/go/cue" @@ -31,9 +31,9 @@ func Execute(templ string, data cue.Value) (string, error) { if err := data.Decode(&x); err != nil { return "", err } - buf := &bytes.Buffer{} - if err := t.Execute(buf, x); err != nil { + var b strings.Builder + if err := t.Execute(&b, x); err != nil { return "", err } - return buf.String(), nil + return b.String(), nil } diff --git a/vendor/cuelang.org/go/pkg/text/template/pkg.go b/vendor/cuelang.org/go/pkg/text/template/pkg.go index c61f0a7c..ddf627be 100644 --- a/vendor/cuelang.org/go/pkg/text/template/pkg.go +++ b/vendor/cuelang.org/go/pkg/text/template/pkg.go @@ -1,30 +1,27 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package template import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("text/template", pkg) + pkg.Register("text/template", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Execute", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.TopKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { templ, data := c.String(0), c.Value(1) if c.Do() { c.Ret, c.Err = Execute(templ, data) @@ -32,11 +29,11 @@ var pkg = &internal.Package{ }, }, { Name: "HTMLEscape", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = HTMLEscape(s) @@ -44,11 +41,11 @@ var pkg = &internal.Package{ }, }, { Name: "JSEscape", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = JSEscape(s) diff --git a/vendor/cuelang.org/go/pkg/text/template/template.go b/vendor/cuelang.org/go/pkg/text/template/template.go index 651dc779..4b11f54b 100644 --- a/vendor/cuelang.org/go/pkg/text/template/template.go +++ b/vendor/cuelang.org/go/pkg/text/template/template.go @@ -16,7 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Generated with go run cuelang.org/go/internal/cmd/qgo -exclude=Escaper$,Must,Parse -stripstr extract text/template +// Originally generated with: go run qgo.go -exclude=Escaper$,Must,Parse -stripstr extract text/template package template diff --git a/vendor/cuelang.org/go/pkg/time/duration.go b/vendor/cuelang.org/go/pkg/time/duration.go index eaea9906..3b73d9e8 100644 --- a/vendor/cuelang.org/go/pkg/time/duration.go +++ b/vendor/cuelang.org/go/pkg/time/duration.go @@ -22,13 +22,14 @@ import ( // to avoid confusion across daylight savings time zone transitions. // // To count the number of units in a Duration, divide: +// // second := time.Second // fmt.Print(int64(second/time.Millisecond)) // prints 1000 // // To convert an integer number of units to a Duration, multiply: +// // seconds := 10 // fmt.Print(time.Duration(seconds)*time.Second) // prints 10s -// const ( Nanosecond = 1 Microsecond = 1000 diff --git a/vendor/cuelang.org/go/pkg/time/pkg.go b/vendor/cuelang.org/go/pkg/time/pkg.go index dd758654..80a3a17e 100644 --- a/vendor/cuelang.org/go/pkg/time/pkg.go +++ b/vendor/cuelang.org/go/pkg/time/pkg.go @@ -1,23 +1,20 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package time import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("time", pkg) + pkg.Register("time", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Nanosecond", Const: "1", }, { @@ -37,11 +34,11 @@ var pkg = &internal.Package{ Const: "3600000000000", }, { Name: "Duration", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = Duration(s) @@ -49,11 +46,11 @@ var pkg = &internal.Package{ }, }, { Name: "FormatDuration", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { d := c.Int64(0) if c.Do() { c.Ret = FormatDuration(d) @@ -61,11 +58,11 @@ var pkg = &internal.Package{ }, }, { Name: "ParseDuration", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = ParseDuration(s) @@ -169,11 +166,11 @@ var pkg = &internal.Package{ Const: "6", }, { Name: "Time", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = Time(s) @@ -181,12 +178,12 @@ var pkg = &internal.Package{ }, }, { Name: "Format", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.BoolKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { value, layout := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = Format(value, layout) @@ -194,12 +191,12 @@ var pkg = &internal.Package{ }, }, { Name: "FormatString", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { layout, value := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = FormatString(layout, value) @@ -207,12 +204,12 @@ var pkg = &internal.Package{ }, }, { Name: "Parse", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { layout, value := c.String(0), c.String(1) if c.Do() { c.Ret, c.Err = Parse(layout, value) @@ -220,12 +217,12 @@ var pkg = &internal.Package{ }, }, { Name: "Unix", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { sec, nsec := c.Int64(0), c.Int64(1) if c.Do() { c.Ret = Unix(sec, nsec) @@ -233,11 +230,11 @@ var pkg = &internal.Package{ }, }, { Name: "Split", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.TopKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { t := c.String(0) if c.Do() { c.Ret, c.Err = Split(t) diff --git a/vendor/cuelang.org/go/pkg/time/time.go b/vendor/cuelang.org/go/pkg/time/time.go index 3cb72d6f..9cbb34f0 100644 --- a/vendor/cuelang.org/go/pkg/time/time.go +++ b/vendor/cuelang.org/go/pkg/time/time.go @@ -25,10 +25,14 @@ import ( // These are predefined layouts for use in Time.Format and time.Parse. // The reference time used in the layouts is the specific time: +// // Mon Jan 2 15:04:05 MST 2006 +// // which is Unix time 1136239445. Since MST is GMT-0700, // the reference time can be thought of as +// // 01/02 03:04:05PM '06 -0700 +// // To define your own format, write down what the reference time would look // like formatted your way; see the values of constants like ANSIC, // StampMicro or Kitchen for examples. The model is to demonstrate what the @@ -52,12 +56,15 @@ import ( // series of digits is parsed as a fractional second. // // Numeric time zone offsets format as follows: +// // -0700 ±hhmm // -07:00 ±hh:mm // -07 ±hh +// // Replacing the sign in the format with a Z triggers // the ISO 8601 behavior of printing Z instead of an // offset for the UTC zone. Thus: +// // Z0700 Z or ±hhmm // Z07:00 Z or ±hh:mm // Z07 Z or ±hh @@ -163,7 +170,9 @@ func FormatString(layout, value string) (string, error) { // Parse parses a formatted string and returns the time value it represents. // The layout defines the format by showing how the reference time, // defined to be +// // Mon Jan 2 15:04:05 -0700 MST 2006 +// // would be interpreted if it were the value; it serves as an example of // the input format. The same interpretation will then be made to the // input string. diff --git a/vendor/cuelang.org/go/pkg/tool/cli/cli.cue b/vendor/cuelang.org/go/pkg/tool/cli/cli.cue index 4d7115d9..83ce5463 100644 --- a/vendor/cuelang.org/go/pkg/tool/cli/cli.cue +++ b/vendor/cuelang.org/go/pkg/tool/cli/cli.cue @@ -27,7 +27,7 @@ Print: { // Example: // task: ask: cli.Ask({ // prompt: "Are you okay?" -// repsonse: bool +// response: bool // }) Ask: { $id: "tool/cli.Ask" diff --git a/vendor/cuelang.org/go/pkg/tool/cli/cli.go b/vendor/cuelang.org/go/pkg/tool/cli/cli.go index fbd5c4df..3efd7ab1 100644 --- a/vendor/cuelang.org/go/pkg/tool/cli/cli.go +++ b/vendor/cuelang.org/go/pkg/tool/cli/cli.go @@ -14,11 +14,10 @@ package cli -//go:generate go run gen.go -//go:generate gofmt -s -w . - import ( + "bufio" "fmt" + "io" "strings" "cuelang.org/go/cue" @@ -54,6 +53,17 @@ func newAskCmd(v cue.Value) (task.Runner, error) { return &askCmd{}, nil } +type oneByteReader struct { + r io.Reader +} + +func (r *oneByteReader) Read(p []byte) (int, error) { + if len(p) == 0 { + return 0, nil + } + return r.r.Read(p[:1]) +} + func (c *askCmd) Run(ctx *task.Context) (res interface{}, err error) { str := ctx.String("prompt") if ctx.Err != nil { @@ -63,8 +73,20 @@ func (c *askCmd) Run(ctx *task.Context) (res interface{}, err error) { fmt.Fprint(ctx.Stdout, str+" ") } + // Roger is convinced that bufio.Scanner will only issue as many reads + // as it needs, so that limiting it to one-byte reads should be enough + // to not read any bytes after a newline. + // This behavior is true today but technically not documented, + // so Roger will send a CL to properly document it. + // + // TODO(mvdan): come back to remove this notice once Roger's CL is + // approved, or to rewrite the code if it is rejected. + scanner := bufio.NewScanner(&oneByteReader{ctx.Stdin}) var response string - if _, err := fmt.Scan(&response); err != nil { + if scanner.Scan() { + response = scanner.Text() + } + if err := scanner.Err(); err != nil { return nil, err } diff --git a/vendor/cuelang.org/go/pkg/tool/cli/doc.go b/vendor/cuelang.org/go/pkg/tool/cli/doc.go deleted file mode 100644 index b2e17ee0..00000000 --- a/vendor/cuelang.org/go/pkg/tool/cli/doc.go +++ /dev/null @@ -1,33 +0,0 @@ -// Code generated by cue get go. DO NOT EDIT. - -// Package cli provides tasks dealing with a console. -// -// These are the supported tasks: -// -// // Print sends text to the stdout of the current process. -// Print: { -// $id: *"tool/cli.Print" | "print" // for backwards compatibility -// -// // text is the text to be printed. -// text: string -// } -// -// // Ask prompts the current console with a message and waits for input. -// // -// // Example: -// // task: ask: cli.Ask({ -// // prompt: "Are you okay?" -// // repsonse: bool -// // }) -// Ask: { -// $id: "tool/cli.Ask" -// -// // prompt sends this message to the output. -// prompt: string -// -// // response holds the user's response. If it is a boolean expression it -// // will interpret the answer using textual yes/ no. -// response: string | bool -// } -// -package cli diff --git a/vendor/cuelang.org/go/pkg/tool/cli/doc.txt b/vendor/cuelang.org/go/pkg/tool/cli/doc.txt new file mode 100644 index 00000000..e79722ea --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/cli/doc.txt @@ -0,0 +1,3 @@ +// Package cli provides tasks dealing with a console. +// +// These are the supported tasks: diff --git a/vendor/cuelang.org/go/pkg/tool/cli/pkg.go b/vendor/cuelang.org/go/pkg/tool/cli/pkg.go index b464a370..9ab88573 100644 --- a/vendor/cuelang.org/go/pkg/tool/cli/pkg.go +++ b/vendor/cuelang.org/go/pkg/tool/cli/pkg.go @@ -1,23 +1,49 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. +// Package cli provides tasks dealing with a console. +// +// These are the supported tasks: +// +// // Print sends text to the stdout of the current process. +// Print: { +// $id: *"tool/cli.Print" | "print" // for backwards compatibility +// +// // text is the text to be printed. +// text: string +// } +// +// // Ask prompts the current console with a message and waits for input. +// // +// // Example: +// // task: ask: cli.Ask({ +// // prompt: "Are you okay?" +// // response: bool +// // }) +// Ask: { +// $id: "tool/cli.Ask" +// +// // prompt sends this message to the output. +// prompt: string +// +// // response holds the user's response. If it is a boolean expression it +// // will interpret the answer using textual yes/ no. +// response: string | bool +// } package cli import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("tool/cli", pkg) + pkg.Register("tool/cli", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{}, +var p = &pkg.Package{ + Native: []*pkg.Builtin{}, CUE: `{ Print: { $id: *"tool/cli.Print" | "print" diff --git a/vendor/cuelang.org/go/pkg/tool/doc.go b/vendor/cuelang.org/go/pkg/tool/doc.go deleted file mode 100644 index 6475f977..00000000 --- a/vendor/cuelang.org/go/pkg/tool/doc.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by cue get go. DO NOT EDIT. - -// Package tool defines statefull operation types for cue commands. -// -// This package is only visible in cue files with a _tool.cue or _tool_test.cue -// ending. -// -// CUE configuration files are not influenced by and do not influence anything -// outside the configuration itself: they are hermetic. Tools solve -// two problems: allow outside values such as environment variables, -// file or web contents, random generators etc. to influence configuration, -// and allow configuration to be actionable from within the tooling itself. -// Separating these concerns makes it clear to user when outside influences are -// in play and the tool definition can be strict about what is allowed. -// -// Tools are defined in files ending with _tool.cue. These files have a -// top-level map, "command", which defines all the tools made available through -// the cue command. -// -// The following definitions are for defining commands in tool files: -// -// // A Command specifies a user-defined command. -// // -// // Descriptions are derived from the doc comment, if they are not provided -// // structurally, using the following format: -// // -// // // short description on one line -// // // -// // // Usage: usage (optional) -// // // -// // // long description covering the remainder of the doc comment. -// // -// Command: { -// // Tasks specifies the things to run to complete a command. Tasks are -// // typically underspecified and completed by the particular internal -// // handler that is running them. Tasks can be a single task, or a full -// // hierarchy of tasks. -// // -// // Tasks that depend on the output of other tasks are run after such tasks. -// // Use `$after` if a task needs to run after another task but does not -// // otherwise depend on its output. -// Tasks -// -// // -// // Example: -// // mycmd [-n] names -// $usage?: string -// -// // short is short description of what the command does. -// $short?: string -// -// // long is a longer description that spans multiple lines and -// // likely contain examples of usage of the command. -// $long?: string -// } -// -// // TODO: -// // - child commands? -// -// // Tasks defines a hierarchy of tasks. A command completes if all tasks have -// // run to completion. -// Tasks: Task | { -// [name=Name]: Tasks -// } -// -// // #Name defines a valid task or command name. -// Name: =~#"^\PL([-](\PL|\PN))*$"# -// -// // A Task defines a step in the execution of a command. -// Task: { -// $type: "tool.Task" // legacy field 'kind' still supported for now. -// -// // kind indicates the operation to run. It must be of the form -// // packagePath.Operation. -// $id: =~#"\."# -// -// // $after can be used to specify a task is run after another one, when -// // it does not otherwise refer to an output of that task. -// $after?: Task | [...Task] -// } -// -// // TODO: consider these options: -// // $success: bool -// // $runif: a.b.$success or $guard: a.b.$success -// // With this `$after: a.b` would just be a shorthand for `$guard: a.b.$success`. -// -package tool diff --git a/vendor/cuelang.org/go/pkg/tool/doc.txt b/vendor/cuelang.org/go/pkg/tool/doc.txt new file mode 100644 index 00000000..3e861399 --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/doc.txt @@ -0,0 +1,18 @@ +// Package tool defines stateful operation types for cue commands. +// +// This package is only visible in cue files with a _tool.cue or _tool_test.cue +// ending. +// +// CUE configuration files are not influenced by and do not influence anything +// outside the configuration itself: they are hermetic. Tools solve +// two problems: allow outside values such as environment variables, +// file or web contents, random generators etc. to influence configuration, +// and allow configuration to be actionable from within the tooling itself. +// Separating these concerns makes it clear to user when outside influences are +// in play and the tool definition can be strict about what is allowed. +// +// Tools are defined in files ending with _tool.cue. These files have a +// top-level map, "command", which defines all the tools made available through +// the cue command. +// +// The following definitions are for defining commands in tool files: diff --git a/vendor/cuelang.org/go/pkg/tool/exec/doc.go b/vendor/cuelang.org/go/pkg/tool/exec/doc.go deleted file mode 100644 index ef4e88a7..00000000 --- a/vendor/cuelang.org/go/pkg/tool/exec/doc.go +++ /dev/null @@ -1,43 +0,0 @@ -// Code generated by cue get go. DO NOT EDIT. - -// Package exec defines tasks for running commands. -// -// These are the supported tasks: -// -// // Run executes the given shell command. -// Run: { -// $id: *"tool/exec.Run" | "exec" // exec for backwards compatibility -// -// // cmd is the command to run. -// cmd: string | [string, ...string] -// -// // dir specifies the working directory of the command. -// // The default is the current working directory. -// dir?: string -// -// // env defines the environment variables to use for this system. -// // If the value is a list, the entries mus be of the form key=value, -// // where the last value takes precendence in the case of multiple -// // occurrances of the same key. -// env: [string]: string | [...=~"="] -// -// // stdout captures the output from stdout if it is of type bytes or string. -// // The default value of null indicates it is redirected to the stdout of the -// // current process. -// stdout: *null | string | bytes -// -// // stderr is like stdout, but for errors. -// stderr: *null | string | bytes -// -// // stdin specifies the input for the process. If stdin is null, the stdin -// // of the current process is redirected to this command (the default). -// // If it is of typ bytes or string, that input will be used instead. -// stdin: *null | string | bytes -// -// // success is set to true when the process terminates with with a zero exit -// // code or false otherwise. The user can explicitly specify the value -// // force a fatal error if the desired success code is not reached. -// success: bool -// } -// -package exec diff --git a/vendor/cuelang.org/go/pkg/tool/exec/doc.txt b/vendor/cuelang.org/go/pkg/tool/exec/doc.txt new file mode 100644 index 00000000..1ddb6652 --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/exec/doc.txt @@ -0,0 +1,3 @@ +// Package exec defines tasks for running commands. +// +// These are the supported tasks: diff --git a/vendor/cuelang.org/go/pkg/tool/exec/exec.cue b/vendor/cuelang.org/go/pkg/tool/exec/exec.cue index 94054bd0..11c9cceb 100644 --- a/vendor/cuelang.org/go/pkg/tool/exec/exec.cue +++ b/vendor/cuelang.org/go/pkg/tool/exec/exec.cue @@ -44,7 +44,7 @@ Run: { // If it is of typ bytes or string, that input will be used instead. stdin: *null | string | bytes - // success is set to true when the process terminates with with a zero exit + // success is set to true when the process terminates with a zero exit // code or false otherwise. The user can explicitly specify the value // force a fatal error if the desired success code is not reached. success: bool diff --git a/vendor/cuelang.org/go/pkg/tool/exec/exec.go b/vendor/cuelang.org/go/pkg/tool/exec/exec.go index 2145f14c..2559b1c3 100644 --- a/vendor/cuelang.org/go/pkg/tool/exec/exec.go +++ b/vendor/cuelang.org/go/pkg/tool/exec/exec.go @@ -14,9 +14,6 @@ package exec -//go:generate go run gen.go -//go:generate gofmt -s -w . - import ( "fmt" "os/exec" diff --git a/vendor/cuelang.org/go/pkg/tool/exec/pkg.go b/vendor/cuelang.org/go/pkg/tool/exec/pkg.go index 7150b0c2..962e77a0 100644 --- a/vendor/cuelang.org/go/pkg/tool/exec/pkg.go +++ b/vendor/cuelang.org/go/pkg/tool/exec/pkg.go @@ -1,23 +1,59 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. +// Package exec defines tasks for running commands. +// +// These are the supported tasks: +// +// // Run executes the given shell command. +// Run: { +// $id: *"tool/exec.Run" | "exec" // exec for backwards compatibility +// +// // cmd is the command to run. +// cmd: string | [string, ...string] +// +// // dir specifies the working directory of the command. +// // The default is the current working directory. +// dir?: string +// +// // env defines the environment variables to use for this system. +// // If the value is a list, the entries mus be of the form key=value, +// // where the last value takes precendence in the case of multiple +// // occurrances of the same key. +// env: [string]: string | [...=~"="] +// +// // stdout captures the output from stdout if it is of type bytes or string. +// // The default value of null indicates it is redirected to the stdout of the +// // current process. +// stdout: *null | string | bytes +// +// // stderr is like stdout, but for errors. +// stderr: *null | string | bytes +// +// // stdin specifies the input for the process. If stdin is null, the stdin +// // of the current process is redirected to this command (the default). +// // If it is of typ bytes or string, that input will be used instead. +// stdin: *null | string | bytes +// +// // success is set to true when the process terminates with a zero exit +// // code or false otherwise. The user can explicitly specify the value +// // force a fatal error if the desired success code is not reached. +// success: bool +// } package exec import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("tool/exec", pkg) + pkg.Register("tool/exec", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{}, +var p = &pkg.Package{ + Native: []*pkg.Builtin{}, CUE: `{ Run: { $id: *"tool/exec.Run" | "exec" diff --git a/vendor/cuelang.org/go/pkg/tool/file/doc.go b/vendor/cuelang.org/go/pkg/tool/file/doc.go deleted file mode 100644 index 3807aac1..00000000 --- a/vendor/cuelang.org/go/pkg/tool/file/doc.go +++ /dev/null @@ -1,128 +0,0 @@ -// Code generated by cue get go. DO NOT EDIT. - -// Package file provides file operations for cue tasks. -// -// These are the supported tasks: -// -// // Read reads the contents of a file. -// Read: { -// $id: "tool/file.Read" -// -// // filename names the file to read. -// // -// // Relative names are taken relative to the current working directory. -// // Slashes are converted to the native OS path separator. -// filename: !="" -// -// // contents is the read contents. If the contents are constraint to bytes -// // (the default), the file is read as is. If it is constraint to a string, -// // the contents are checked to be valid UTF-8. -// contents: *bytes | string -// } -// -// // Append writes contents to the given file. -// Append: { -// $id: "tool/file.Append" -// -// // filename names the file to append. -// // -// // Relative names are taken relative to the current working directory. -// // Slashes are converted to the native OS path separator. -// filename: !="" -// -// // permissions defines the permissions to use if the file does not yet exist. -// permissions: int | *0o666 -// -// // contents specifies the bytes to be written. -// contents: bytes | string -// } -// -// // Create writes contents to the given file. -// Create: { -// $id: "tool/file.Create" -// -// // filename names the file to write. -// // -// // Relative names are taken relative to the current working directory. -// // Slashes are converted to the native OS path separator. -// filename: !="" -// -// // permissions defines the permissions to use if the file does not yet exist. -// permissions: int | *0o666 -// -// // contents specifies the bytes to be written. -// contents: bytes | string -// } -// -// // Glob returns a list of files. -// Glob: { -// $id: "tool/file.Glob" -// -// // glob specifies the pattern to match files with. -// // -// // A relative pattern is taken relative to the current working directory. -// // Slashes are converted to the native OS path separator. -// glob: !="" -// files: [...string] -// } -// -// // Mkdir creates a directory at the specified path. -// Mkdir: { -// $id: "tool/file.Mkdir" -// -// // The directory path to create. -// // If path is already a directory, Mkdir does nothing. -// // If path already exists and is not a directory, Mkdir will return an error. -// path: string -// -// // When true any necessary parents are created as well. -// createParents: bool | *false -// -// // Directory mode and permission bits (before umask). -// permissions: int | *0o755 -// } -// -// // MkdirAll creates a directory at the specified path along with any necessary -// // parents. -// // If path is already a directory, MkdirAll does nothing. -// // If path already exists and is not a directory, MkdirAll will return an error. -// MkdirAll: Mkdir & { -// createParents: true -// } -// -// // MkdirTemp creates a new temporary directory in the directory dir and sets -// // the pathname of the new directory in path. -// // It is the caller's responsibility to remove the directory when it is no -// // longer needed. -// MkdirTemp: { -// $id: "tool/file.MkdirTemp" -// -// // The temporary directory is created in the directory specified by dir. -// // If dir is the empty string, MkdirTemp uses the default directory for -// // temporary files. -// dir: string | *"" -// -// // The directory name is generated by adding a random string to the end of pattern. -// // If pattern includes a "*", the random string replaces the last "*" instead. -// pattern: string | *"" -// -// // The absolute path of the created directory. -// path: string -// } -// -// // RemoveAll removes path and any children it contains. -// // It removes everything it can but returns the first error it encounters. -// RemoveAll: { -// $id: "tool/file.RemoveAll" -// -// // The path to remove. -// // If the path does not exist, RemoveAll does nothing. -// path: string -// -// // success contains the status of the removal. -// // If path was removed success is set to true. -// // If path didn't exists success is set to false. -// success: bool -// } -// -package file diff --git a/vendor/cuelang.org/go/pkg/tool/file/doc.txt b/vendor/cuelang.org/go/pkg/tool/file/doc.txt new file mode 100644 index 00000000..cc0026fb --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/file/doc.txt @@ -0,0 +1,3 @@ +// Package file provides file operations for cue tasks. +// +// These are the supported tasks: diff --git a/vendor/cuelang.org/go/pkg/tool/file/file.go b/vendor/cuelang.org/go/pkg/tool/file/file.go index 5f865f47..3dbed397 100644 --- a/vendor/cuelang.org/go/pkg/tool/file/file.go +++ b/vendor/cuelang.org/go/pkg/tool/file/file.go @@ -14,11 +14,7 @@ package file -//go:generate go run gen.go -//go:generate gofmt -s -w . - import ( - "io/ioutil" "os" "path/filepath" @@ -59,7 +55,7 @@ func (c *cmdRead) Run(ctx *task.Context) (res interface{}, err error) { return nil, ctx.Err } - b, err := ioutil.ReadFile(filename) + b, err := os.ReadFile(filename) if err != nil { return nil, err } @@ -106,7 +102,7 @@ func (c *cmdCreate) Run(ctx *task.Context) (res interface{}, err error) { return nil, ctx.Err } - return nil, ioutil.WriteFile(filename, b, os.FileMode(mode)) + return nil, os.WriteFile(filename, b, os.FileMode(mode)) } func (c *cmdGlob) Run(ctx *task.Context) (res interface{}, err error) { diff --git a/vendor/cuelang.org/go/pkg/tool/file/pkg.go b/vendor/cuelang.org/go/pkg/tool/file/pkg.go index 1f9aea78..bc1b9f83 100644 --- a/vendor/cuelang.org/go/pkg/tool/file/pkg.go +++ b/vendor/cuelang.org/go/pkg/tool/file/pkg.go @@ -1,23 +1,144 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. +// Package file provides file operations for cue tasks. +// +// These are the supported tasks: +// +// // Read reads the contents of a file. +// Read: { +// $id: "tool/file.Read" +// +// // filename names the file to read. +// // +// // Relative names are taken relative to the current working directory. +// // Slashes are converted to the native OS path separator. +// filename: !="" +// +// // contents is the read contents. If the contents are constraint to bytes +// // (the default), the file is read as is. If it is constraint to a string, +// // the contents are checked to be valid UTF-8. +// contents: *bytes | string +// } +// +// // Append writes contents to the given file. +// Append: { +// $id: "tool/file.Append" +// +// // filename names the file to append. +// // +// // Relative names are taken relative to the current working directory. +// // Slashes are converted to the native OS path separator. +// filename: !="" +// +// // permissions defines the permissions to use if the file does not yet exist. +// permissions: int | *0o666 +// +// // contents specifies the bytes to be written. +// contents: bytes | string +// } +// +// // Create writes contents to the given file. +// Create: { +// $id: "tool/file.Create" +// +// // filename names the file to write. +// // +// // Relative names are taken relative to the current working directory. +// // Slashes are converted to the native OS path separator. +// filename: !="" +// +// // permissions defines the permissions to use if the file does not yet exist. +// permissions: int | *0o666 +// +// // contents specifies the bytes to be written. +// contents: bytes | string +// } +// +// // Glob returns a list of files. +// Glob: { +// $id: "tool/file.Glob" +// +// // glob specifies the pattern to match files with. +// // +// // A relative pattern is taken relative to the current working directory. +// // Slashes are converted to the native OS path separator. +// glob: !="" +// files: [...string] +// } +// +// // Mkdir creates a directory at the specified path. +// Mkdir: { +// $id: "tool/file.Mkdir" +// +// // The directory path to create. +// // If path is already a directory, Mkdir does nothing. +// // If path already exists and is not a directory, Mkdir will return an error. +// path: string +// +// // When true any necessary parents are created as well. +// createParents: bool | *false +// +// // Directory mode and permission bits (before umask). +// permissions: int | *0o755 +// } +// +// // MkdirAll creates a directory at the specified path along with any necessary +// // parents. +// // If path is already a directory, MkdirAll does nothing. +// // If path already exists and is not a directory, MkdirAll will return an error. +// MkdirAll: Mkdir & { +// createParents: true +// } +// +// // MkdirTemp creates a new temporary directory in the directory dir and sets +// // the pathname of the new directory in path. +// // It is the caller's responsibility to remove the directory when it is no +// // longer needed. +// MkdirTemp: { +// $id: "tool/file.MkdirTemp" +// +// // The temporary directory is created in the directory specified by dir. +// // If dir is the empty string, MkdirTemp uses the default directory for +// // temporary files. +// dir: string | *"" +// +// // The directory name is generated by adding a random string to the end of pattern. +// // If pattern includes a "*", the random string replaces the last "*" instead. +// pattern: string | *"" +// +// // The absolute path of the created directory. +// path: string +// } +// +// // RemoveAll removes path and any children it contains. +// // It removes everything it can but returns the first error it encounters. +// RemoveAll: { +// $id: "tool/file.RemoveAll" +// +// // The path to remove. +// // If the path does not exist, RemoveAll does nothing. +// path: string +// +// // success contains the status of the removal. +// // If path was removed success is set to true. +// // If path didn't exists success is set to false. +// success: bool +// } package file import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("tool/file", pkg) + pkg.Register("tool/file", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{}, +var p = &pkg.Package{ + Native: []*pkg.Builtin{}, CUE: `{ Read: { $id: "tool/file.Read" diff --git a/vendor/cuelang.org/go/pkg/tool/generate.go b/vendor/cuelang.org/go/pkg/tool/generate.go deleted file mode 100644 index 0e16bb7e..00000000 --- a/vendor/cuelang.org/go/pkg/tool/generate.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2019 CUE Authors -// -// 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. - -package tool - -//go:generate go run gen.go -//go:generate go fmt diff --git a/vendor/cuelang.org/go/pkg/tool/http/doc.go b/vendor/cuelang.org/go/pkg/tool/http/doc.go deleted file mode 100644 index 0884f0fa..00000000 --- a/vendor/cuelang.org/go/pkg/tool/http/doc.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by cue get go. DO NOT EDIT. - -// Package http provides tasks related to the HTTP protocol. -// -// These are the supported tasks: -// -// Get: Do & {method: "GET"} -// Post: Do & {method: "POST"} -// Put: Do & {method: "PUT"} -// Delete: Do & {method: "DELETE"} -// -// Do: { -// $id: *"tool/http.Do" | "http" // http for backwards compatibility -// -// method: string -// url: string // TODO: make url.URL type -// -// tls: { -// // Whether the server certificate must be validated. -// verify: *true | bool -// // PEM encoded certificate(s) to validate the server certificate. -// // If not set the CA bundle of the system is used. -// caCert?: bytes | string -// } -// -// request: { -// body?: bytes | string -// header: [string]: string | [...string] -// trailer: [string]: string | [...string] -// } -// response: { -// status: string -// statusCode: int -// -// body: *bytes | string -// header: [string]: string | [...string] -// trailer: [string]: string | [...string] -// } -// } -// -// // TODO: support serving once we have the cue serve command. -// // Serve: { -// // port: int -// // -// // cert: string -// // key: string -// // -// // handle: [Pattern=string]: Message & { -// // pattern: Pattern -// // } -// // } -// -package http diff --git a/vendor/cuelang.org/go/pkg/tool/http/doc.txt b/vendor/cuelang.org/go/pkg/tool/http/doc.txt new file mode 100644 index 00000000..e5b65b6e --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/http/doc.txt @@ -0,0 +1,3 @@ +// Package http provides tasks related to the HTTP protocol. +// +// These are the supported tasks: diff --git a/vendor/cuelang.org/go/pkg/tool/http/http.go b/vendor/cuelang.org/go/pkg/tool/http/http.go index f30ec6c5..2ef3b70d 100644 --- a/vendor/cuelang.org/go/pkg/tool/http/http.go +++ b/vendor/cuelang.org/go/pkg/tool/http/http.go @@ -14,16 +14,12 @@ package http -//go:generate go run gen.go -//go:generate gofmt -s -w . - import ( "bytes" "crypto/tls" "crypto/x509" "encoding/pem" "io" - "io/ioutil" "net/http" "cuelang.org/go/cue" @@ -133,7 +129,7 @@ func (c *httpCmd) Run(ctx *task.Context) (res interface{}, err error) { return nil, err } defer resp.Body.Close() - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) // parse response body and headers return map[string]interface{}{ "response": map[string]interface{}{ diff --git a/vendor/cuelang.org/go/pkg/tool/http/pkg.go b/vendor/cuelang.org/go/pkg/tool/http/pkg.go index 3b8b4e71..49aba71b 100644 --- a/vendor/cuelang.org/go/pkg/tool/http/pkg.go +++ b/vendor/cuelang.org/go/pkg/tool/http/pkg.go @@ -1,23 +1,69 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. +// Package http provides tasks related to the HTTP protocol. +// +// These are the supported tasks: +// +// Get: Do & {method: "GET"} +// Post: Do & {method: "POST"} +// Put: Do & {method: "PUT"} +// Delete: Do & {method: "DELETE"} +// +// Do: { +// $id: *"tool/http.Do" | "http" // http for backwards compatibility +// +// method: string +// url: string // TODO: make url.URL type +// +// tls: { +// // Whether the server certificate must be validated. +// verify: *true | bool +// // PEM encoded certificate(s) to validate the server certificate. +// // If not set the CA bundle of the system is used. +// caCert?: bytes | string +// } +// +// request: { +// body?: bytes | string +// header: [string]: string | [...string] +// trailer: [string]: string | [...string] +// } +// response: { +// status: string +// statusCode: int +// +// body: *bytes | string +// header: [string]: string | [...string] +// trailer: [string]: string | [...string] +// } +// } +// +// // TODO: support serving once we have the cue serve command. +// // Serve: { +// // port: int +// // +// // cert: string +// // key: string +// // +// // handle: [Pattern=string]: Message & { +// // pattern: Pattern +// // } +// // } package http import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("tool/http", pkg) + pkg.Register("tool/http", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{}, +var p = &pkg.Package{ + Native: []*pkg.Builtin{}, CUE: `{ Get: Do & { method: "GET" diff --git a/vendor/cuelang.org/go/pkg/tool/os/doc.go b/vendor/cuelang.org/go/pkg/tool/os/doc.go deleted file mode 100644 index b4a66c18..00000000 --- a/vendor/cuelang.org/go/pkg/tool/os/doc.go +++ /dev/null @@ -1,48 +0,0 @@ -// Code generated by cue get go. DO NOT EDIT. - -// Package os defines tasks for retrieving os-related information. -// -// CUE definitions: -// -// // A Value are all possible values allowed in flags. -// // A null value unsets an environment variable. -// Value: bool | number | *string | null -// -// // Name indicates a valid flag name. -// Name: !="" & !~"^[$]" -// -// // Setenv defines a set of command line flags, the values of which will be set -// // at run time. The doc comment of the flag is presented to the user in help. -// // -// // To define a shorthand, define the shorthand as a new flag referring to -// // the flag of which it is a shorthand. -// Setenv: { -// $id: "tool/os.Setenv" -// -// {[Name]: Value} -// } -// -// // Getenv gets and parses the specific command line variables. -// Getenv: { -// $id: "tool/os.Getenv" -// -// {[Name]: Value} -// } -// -// // Environ populates a struct with all environment variables. -// Environ: { -// $id: "tool/os.Environ" -// -// // A map of all populated values. -// // Individual entries may be specified ahead of time to enable -// // validation and parsing. Values that are marked as required -// // will fail the task if they are not found. -// {[Name]: Value} -// } -// -// // Clearenv clears all environment variables. -// Clearenv: { -// $id: "tool/os.Clearenv" -// } -// -package os diff --git a/vendor/cuelang.org/go/pkg/tool/os/doc.txt b/vendor/cuelang.org/go/pkg/tool/os/doc.txt new file mode 100644 index 00000000..fa48dc82 --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/os/doc.txt @@ -0,0 +1,3 @@ +// Package os defines tasks for retrieving os-related information. +// +// CUE definitions: diff --git a/vendor/cuelang.org/go/pkg/tool/os/env.go b/vendor/cuelang.org/go/pkg/tool/os/env.go index 0d0a535f..e17af299 100644 --- a/vendor/cuelang.org/go/pkg/tool/os/env.go +++ b/vendor/cuelang.org/go/pkg/tool/os/env.go @@ -14,9 +14,6 @@ package os -//go:generate go run gen.go -//go:generate gofmt -s -w . - import ( "os" "strings" diff --git a/vendor/cuelang.org/go/pkg/tool/os/pkg.go b/vendor/cuelang.org/go/pkg/tool/os/pkg.go index f1f40435..268757ff 100644 --- a/vendor/cuelang.org/go/pkg/tool/os/pkg.go +++ b/vendor/cuelang.org/go/pkg/tool/os/pkg.go @@ -1,23 +1,64 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. +// Package os defines tasks for retrieving os-related information. +// +// CUE definitions: +// +// // A Value are all possible values allowed in flags. +// // A null value unsets an environment variable. +// Value: bool | number | *string | null +// +// // Name indicates a valid flag name. +// Name: !="" & !~"^[$]" +// +// // Setenv defines a set of command line flags, the values of which will be set +// // at run time. The doc comment of the flag is presented to the user in help. +// // +// // To define a shorthand, define the shorthand as a new flag referring to +// // the flag of which it is a shorthand. +// Setenv: { +// $id: "tool/os.Setenv" +// +// {[Name]: Value} +// } +// +// // Getenv gets and parses the specific command line variables. +// Getenv: { +// $id: "tool/os.Getenv" +// +// {[Name]: Value} +// } +// +// // Environ populates a struct with all environment variables. +// Environ: { +// $id: "tool/os.Environ" +// +// // A map of all populated values. +// // Individual entries may be specified ahead of time to enable +// // validation and parsing. Values that are marked as required +// // will fail the task if they are not found. +// {[Name]: Value} +// } +// +// // Clearenv clears all environment variables. +// Clearenv: { +// $id: "tool/os.Clearenv" +// } package os import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("tool/os", pkg) + pkg.Register("tool/os", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{}, +var p = &pkg.Package{ + Native: []*pkg.Builtin{}, CUE: `{ Value: bool | number | *string | null Name: !="" & !~"^[$]" diff --git a/vendor/cuelang.org/go/pkg/tool/pkg.go b/vendor/cuelang.org/go/pkg/tool/pkg.go new file mode 100644 index 00000000..50d6c865 --- /dev/null +++ b/vendor/cuelang.org/go/pkg/tool/pkg.go @@ -0,0 +1,87 @@ +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. + +// Package tool defines stateful operation types for cue commands. +// +// This package is only visible in cue files with a _tool.cue or _tool_test.cue +// ending. +// +// CUE configuration files are not influenced by and do not influence anything +// outside the configuration itself: they are hermetic. Tools solve +// two problems: allow outside values such as environment variables, +// file or web contents, random generators etc. to influence configuration, +// and allow configuration to be actionable from within the tooling itself. +// Separating these concerns makes it clear to user when outside influences are +// in play and the tool definition can be strict about what is allowed. +// +// Tools are defined in files ending with _tool.cue. These files have a +// top-level map, "command", which defines all the tools made available through +// the cue command. +// +// The following definitions are for defining commands in tool files: +// +// // A Command specifies a user-defined command. +// // +// // Descriptions are derived from the doc comment, if they are not provided +// // structurally, using the following format: +// // +// // // short description on one line +// // // +// // // Usage: usage (optional) +// // // +// // // long description covering the remainder of the doc comment. +// // +// Command: { +// // Tasks specifies the things to run to complete a command. Tasks are +// // typically underspecified and completed by the particular internal +// // handler that is running them. Tasks can be a single task, or a full +// // hierarchy of tasks. +// // +// // Tasks that depend on the output of other tasks are run after such tasks. +// // Use `$after` if a task needs to run after another task but does not +// // otherwise depend on its output. +// Tasks +// +// // $usage summarizes how a command takes arguments. +// // +// // Example: +// // mycmd [-n] names +// $usage?: string +// +// // $short is short description of what the command does. +// $short?: string +// +// // $long is a longer description that spans multiple lines and +// // likely contain examples of usage of the command. +// $long?: string +// } +// +// // TODO: +// // - child commands? +// +// // Tasks defines a hierarchy of tasks. A command completes if all tasks have +// // run to completion. +// Tasks: Task | { +// [name=Name]: Tasks +// } +// +// // #Name defines a valid task or command name. +// Name: =~#"^\PL([-](\PL|\PN))*$"# +// +// // A Task defines a step in the execution of a command. +// Task: { +// $type: "tool.Task" // legacy field 'kind' still supported for now. +// +// // $id indicates the operation to run. It must be of the form +// // packagePath.Operation. +// $id: =~#"\."# +// +// // $after can be used to specify a task is run after another one, when +// // it does not otherwise refer to an output of that task. +// $after?: Task | [...Task] +// } +// +// // TODO: consider these options: +// // $success: bool +// // $runif: a.b.$success or $guard: a.b.$success +// // With this `$after: a.b` would just be a shorthand for `$guard: a.b.$success`. +package tool diff --git a/vendor/cuelang.org/go/pkg/tool/tool.cue b/vendor/cuelang.org/go/pkg/tool/tool.cue index bac14b81..cbf7125a 100644 --- a/vendor/cuelang.org/go/pkg/tool/tool.cue +++ b/vendor/cuelang.org/go/pkg/tool/tool.cue @@ -36,15 +36,16 @@ Command: { // otherwise depend on its output. Tasks + // $usage summarizes how a command takes arguments. // // Example: // mycmd [-n] names $usage?: string - // short is short description of what the command does. + // $short is short description of what the command does. $short?: string - // long is a longer description that spans multiple lines and + // $long is a longer description that spans multiple lines and // likely contain examples of usage of the command. $long?: string } @@ -65,7 +66,7 @@ Name: =~#"^\PL([-](\PL|\PN))*$"# Task: { $type: "tool.Task" // legacy field 'kind' still supported for now. - // kind indicates the operation to run. It must be of the form + // $id indicates the operation to run. It must be of the form // packagePath.Operation. $id: =~#"\."# diff --git a/vendor/cuelang.org/go/pkg/uuid/pkg.go b/vendor/cuelang.org/go/pkg/uuid/pkg.go index ae2be7e7..e177ede4 100644 --- a/vendor/cuelang.org/go/pkg/uuid/pkg.go +++ b/vendor/cuelang.org/go/pkg/uuid/pkg.go @@ -1,29 +1,26 @@ -// Code generated by go generate. DO NOT EDIT. - -//go:generate rm pkg.go -//go:generate go run ../gen/gen.go +// Code generated by cuelang.org/go/pkg/gen. DO NOT EDIT. package uuid import ( "cuelang.org/go/internal/core/adt" - "cuelang.org/go/pkg/internal" + "cuelang.org/go/internal/pkg" ) func init() { - internal.Register("uuid", pkg) + pkg.Register("uuid", p) } var _ = adt.TopKind // in case the adt package isn't used -var pkg = &internal.Package{ - Native: []*internal.Builtin{{ +var p = &pkg.Package{ + Native: []*pkg.Builtin{{ Name: "Valid", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.BottomKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret = Valid(s) @@ -31,11 +28,11 @@ var pkg = &internal.Package{ }, }, { Name: "Parse", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { s := c.String(0) if c.Do() { c.Ret, c.Err = Parse(s) @@ -43,11 +40,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToString", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.String(0) if c.Do() { c.Ret = ToString(x) @@ -55,11 +52,11 @@ var pkg = &internal.Package{ }, }, { Name: "URN", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.String(0) if c.Do() { c.Ret, c.Err = URN(x) @@ -67,11 +64,11 @@ var pkg = &internal.Package{ }, }, { Name: "FromInt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.IntKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { i := c.BigInt(0) if c.Do() { c.Ret, c.Err = FromInt(i) @@ -79,11 +76,11 @@ var pkg = &internal.Package{ }, }, { Name: "ToInt", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.String(0) if c.Do() { c.Ret = ToInt(x) @@ -91,11 +88,11 @@ var pkg = &internal.Package{ }, }, { Name: "Variant", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.String(0) if c.Do() { c.Ret, c.Err = Variant(x) @@ -103,11 +100,11 @@ var pkg = &internal.Package{ }, }, { Name: "Version", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, }, Result: adt.IntKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { x := c.String(0) if c.Do() { c.Ret, c.Err = Version(x) @@ -115,12 +112,12 @@ var pkg = &internal.Package{ }, }, { Name: "SHA1", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { space, data := c.String(0), c.Bytes(1) if c.Do() { c.Ret, c.Err = SHA1(space, data) @@ -128,12 +125,12 @@ var pkg = &internal.Package{ }, }, { Name: "MD5", - Params: []internal.Param{ + Params: []pkg.Param{ {Kind: adt.StringKind}, {Kind: adt.BytesKind | adt.StringKind}, }, Result: adt.StringKind, - Func: func(c *internal.CallCtxt) { + Func: func(c *pkg.CallCtxt) { space, data := c.String(0), c.Bytes(1) if c.Do() { c.Ret, c.Err = MD5(space, data) diff --git a/vendor/cuelang.org/go/pkg/uuid/uuid.go b/vendor/cuelang.org/go/pkg/uuid/uuid.go index 9d555179..0adce9dc 100644 --- a/vendor/cuelang.org/go/pkg/uuid/uuid.go +++ b/vendor/cuelang.org/go/pkg/uuid/uuid.go @@ -62,8 +62,7 @@ func URN(x string) (string, error) { // FromInt creates a UUID from an integer. // -// DNS: uuid.FromInt(0x6ba7b810_9dad_11d1_80b4_00c04fd430c8) -// +// DNS: uuid.FromInt(0x6ba7b810_9dad_11d1_80b4_00c04fd430c8) func FromInt(i *big.Int) (string, error) { // must be uint128 var buf [16]byte diff --git a/vendor/filippo.io/edwards25519/LICENSE b/vendor/filippo.io/edwards25519/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/filippo.io/edwards25519/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/filippo.io/edwards25519/README.md b/vendor/filippo.io/edwards25519/README.md new file mode 100644 index 00000000..2606f40b --- /dev/null +++ b/vendor/filippo.io/edwards25519/README.md @@ -0,0 +1,14 @@ +# filippo.io/edwards25519 + +``` +import "filippo.io/edwards25519" +``` + +This library implements the edwards25519 elliptic curve, exposing the necessary APIs to build a wide array of higher-level primitives. +Read the docs at [pkg.go.dev/filippo.io/edwards25519](https://pkg.go.dev/filippo.io/edwards25519). + +The code is originally derived from Adam Langley's internal implementation in the Go standard library, and includes George Tankersley's [performance improvements](https://golang.org/cl/71950). It was then further developed by Henry de Valence for use in ristretto255, and was finally [merged back into the Go standard library](https://golang.org/cl/276272) as of Go 1.17. It now tracks the upstream codebase and extends it with additional functionality. + +Most users don't need this package, and should instead use `crypto/ed25519` for signatures, `golang.org/x/crypto/curve25519` for Diffie-Hellman, or `github.com/gtank/ristretto255` for prime order group logic. However, for anyone currently using a fork of `crypto/ed25519/internal/edwards25519` or `github.com/agl/edwards25519`, this package should be a safer, faster, and more powerful alternative. + +Since this package is meant to curb proliferation of edwards25519 implementations in the Go ecosystem, it welcomes requests for new APIs or reviewable performance improvements. diff --git a/vendor/filippo.io/edwards25519/doc.go b/vendor/filippo.io/edwards25519/doc.go new file mode 100644 index 00000000..d8608b06 --- /dev/null +++ b/vendor/filippo.io/edwards25519/doc.go @@ -0,0 +1,20 @@ +// Copyright (c) 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package edwards25519 implements group logic for the twisted Edwards curve +// +// -x^2 + y^2 = 1 + -(121665/121666)*x^2*y^2 +// +// This is better known as the Edwards curve equivalent to Curve25519, and is +// the curve used by the Ed25519 signature scheme. +// +// Most users don't need this package, and should instead use crypto/ed25519 for +// signatures, golang.org/x/crypto/curve25519 for Diffie-Hellman, or +// github.com/gtank/ristretto255 for prime order group logic. +// +// However, developers who do need to interact with low-level edwards25519 +// operations can use this package, which is an extended version of +// crypto/ed25519/internal/edwards25519 from the standard library repackaged as +// an importable module. +package edwards25519 diff --git a/vendor/filippo.io/edwards25519/edwards25519.go b/vendor/filippo.io/edwards25519/edwards25519.go new file mode 100644 index 00000000..e22a7c2d --- /dev/null +++ b/vendor/filippo.io/edwards25519/edwards25519.go @@ -0,0 +1,428 @@ +// Copyright (c) 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package edwards25519 + +import ( + "errors" + + "filippo.io/edwards25519/field" +) + +// Point types. + +type projP1xP1 struct { + X, Y, Z, T field.Element +} + +type projP2 struct { + X, Y, Z field.Element +} + +// Point represents a point on the edwards25519 curve. +// +// This type works similarly to math/big.Int, and all arguments and receivers +// are allowed to alias. +// +// The zero value is NOT valid, and it may be used only as a receiver. +type Point struct { + // The point is internally represented in extended coordinates (X, Y, Z, T) + // where x = X/Z, y = Y/Z, and xy = T/Z per https://eprint.iacr.org/2008/522. + x, y, z, t field.Element + + // Make the type not comparable (i.e. used with == or as a map key), as + // equivalent points can be represented by different Go values. + _ incomparable +} + +type incomparable [0]func() + +func checkInitialized(points ...*Point) { + for _, p := range points { + if p.x == (field.Element{}) && p.y == (field.Element{}) { + panic("edwards25519: use of uninitialized Point") + } + } +} + +type projCached struct { + YplusX, YminusX, Z, T2d field.Element +} + +type affineCached struct { + YplusX, YminusX, T2d field.Element +} + +// Constructors. + +func (v *projP2) Zero() *projP2 { + v.X.Zero() + v.Y.One() + v.Z.One() + return v +} + +// identity is the point at infinity. +var identity, _ = new(Point).SetBytes([]byte{ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) + +// NewIdentityPoint returns a new Point set to the identity. +func NewIdentityPoint() *Point { + return new(Point).Set(identity) +} + +// generator is the canonical curve basepoint. See TestGenerator for the +// correspondence of this encoding with the values in RFC 8032. +var generator, _ = new(Point).SetBytes([]byte{ + 0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}) + +// NewGeneratorPoint returns a new Point set to the canonical generator. +func NewGeneratorPoint() *Point { + return new(Point).Set(generator) +} + +func (v *projCached) Zero() *projCached { + v.YplusX.One() + v.YminusX.One() + v.Z.One() + v.T2d.Zero() + return v +} + +func (v *affineCached) Zero() *affineCached { + v.YplusX.One() + v.YminusX.One() + v.T2d.Zero() + return v +} + +// Assignments. + +// Set sets v = u, and returns v. +func (v *Point) Set(u *Point) *Point { + *v = *u + return v +} + +// Encoding. + +// Bytes returns the canonical 32-byte encoding of v, according to RFC 8032, +// Section 5.1.2. +func (v *Point) Bytes() []byte { + // This function is outlined to make the allocations inline in the caller + // rather than happen on the heap. + var buf [32]byte + return v.bytes(&buf) +} + +func (v *Point) bytes(buf *[32]byte) []byte { + checkInitialized(v) + + var zInv, x, y field.Element + zInv.Invert(&v.z) // zInv = 1 / Z + x.Multiply(&v.x, &zInv) // x = X / Z + y.Multiply(&v.y, &zInv) // y = Y / Z + + out := copyFieldElement(buf, &y) + out[31] |= byte(x.IsNegative() << 7) + return out +} + +var feOne = new(field.Element).One() + +// SetBytes sets v = x, where x is a 32-byte encoding of v. If x does not +// represent a valid point on the curve, SetBytes returns nil and an error and +// the receiver is unchanged. Otherwise, SetBytes returns v. +// +// Note that SetBytes accepts all non-canonical encodings of valid points. +// That is, it follows decoding rules that match most implementations in +// the ecosystem rather than RFC 8032. +func (v *Point) SetBytes(x []byte) (*Point, error) { + // Specifically, the non-canonical encodings that are accepted are + // 1) the ones where the field element is not reduced (see the + // (*field.Element).SetBytes docs) and + // 2) the ones where the x-coordinate is zero and the sign bit is set. + // + // This is consistent with crypto/ed25519/internal/edwards25519. Read more + // at https://hdevalence.ca/blog/2020-10-04-its-25519am, specifically the + // "Canonical A, R" section. + + y, err := new(field.Element).SetBytes(x) + if err != nil { + return nil, errors.New("edwards25519: invalid point encoding length") + } + + // -x² + y² = 1 + dx²y² + // x² + dx²y² = x²(dy² + 1) = y² - 1 + // x² = (y² - 1) / (dy² + 1) + + // u = y² - 1 + y2 := new(field.Element).Square(y) + u := new(field.Element).Subtract(y2, feOne) + + // v = dy² + 1 + vv := new(field.Element).Multiply(y2, d) + vv = vv.Add(vv, feOne) + + // x = +√(u/v) + xx, wasSquare := new(field.Element).SqrtRatio(u, vv) + if wasSquare == 0 { + return nil, errors.New("edwards25519: invalid point encoding") + } + + // Select the negative square root if the sign bit is set. + xxNeg := new(field.Element).Negate(xx) + xx = xx.Select(xxNeg, xx, int(x[31]>>7)) + + v.x.Set(xx) + v.y.Set(y) + v.z.One() + v.t.Multiply(xx, y) // xy = T / Z + + return v, nil +} + +func copyFieldElement(buf *[32]byte, v *field.Element) []byte { + copy(buf[:], v.Bytes()) + return buf[:] +} + +// Conversions. + +func (v *projP2) FromP1xP1(p *projP1xP1) *projP2 { + v.X.Multiply(&p.X, &p.T) + v.Y.Multiply(&p.Y, &p.Z) + v.Z.Multiply(&p.Z, &p.T) + return v +} + +func (v *projP2) FromP3(p *Point) *projP2 { + v.X.Set(&p.x) + v.Y.Set(&p.y) + v.Z.Set(&p.z) + return v +} + +func (v *Point) fromP1xP1(p *projP1xP1) *Point { + v.x.Multiply(&p.X, &p.T) + v.y.Multiply(&p.Y, &p.Z) + v.z.Multiply(&p.Z, &p.T) + v.t.Multiply(&p.X, &p.Y) + return v +} + +func (v *Point) fromP2(p *projP2) *Point { + v.x.Multiply(&p.X, &p.Z) + v.y.Multiply(&p.Y, &p.Z) + v.z.Square(&p.Z) + v.t.Multiply(&p.X, &p.Y) + return v +} + +// d is a constant in the curve equation. +var d, _ = new(field.Element).SetBytes([]byte{ + 0xa3, 0x78, 0x59, 0x13, 0xca, 0x4d, 0xeb, 0x75, + 0xab, 0xd8, 0x41, 0x41, 0x4d, 0x0a, 0x70, 0x00, + 0x98, 0xe8, 0x79, 0x77, 0x79, 0x40, 0xc7, 0x8c, + 0x73, 0xfe, 0x6f, 0x2b, 0xee, 0x6c, 0x03, 0x52}) +var d2 = new(field.Element).Add(d, d) + +func (v *projCached) FromP3(p *Point) *projCached { + v.YplusX.Add(&p.y, &p.x) + v.YminusX.Subtract(&p.y, &p.x) + v.Z.Set(&p.z) + v.T2d.Multiply(&p.t, d2) + return v +} + +func (v *affineCached) FromP3(p *Point) *affineCached { + v.YplusX.Add(&p.y, &p.x) + v.YminusX.Subtract(&p.y, &p.x) + v.T2d.Multiply(&p.t, d2) + + var invZ field.Element + invZ.Invert(&p.z) + v.YplusX.Multiply(&v.YplusX, &invZ) + v.YminusX.Multiply(&v.YminusX, &invZ) + v.T2d.Multiply(&v.T2d, &invZ) + return v +} + +// (Re)addition and subtraction. + +// Add sets v = p + q, and returns v. +func (v *Point) Add(p, q *Point) *Point { + checkInitialized(p, q) + qCached := new(projCached).FromP3(q) + result := new(projP1xP1).Add(p, qCached) + return v.fromP1xP1(result) +} + +// Subtract sets v = p - q, and returns v. +func (v *Point) Subtract(p, q *Point) *Point { + checkInitialized(p, q) + qCached := new(projCached).FromP3(q) + result := new(projP1xP1).Sub(p, qCached) + return v.fromP1xP1(result) +} + +func (v *projP1xP1) Add(p *Point, q *projCached) *projP1xP1 { + var YplusX, YminusX, PP, MM, TT2d, ZZ2 field.Element + + YplusX.Add(&p.y, &p.x) + YminusX.Subtract(&p.y, &p.x) + + PP.Multiply(&YplusX, &q.YplusX) + MM.Multiply(&YminusX, &q.YminusX) + TT2d.Multiply(&p.t, &q.T2d) + ZZ2.Multiply(&p.z, &q.Z) + + ZZ2.Add(&ZZ2, &ZZ2) + + v.X.Subtract(&PP, &MM) + v.Y.Add(&PP, &MM) + v.Z.Add(&ZZ2, &TT2d) + v.T.Subtract(&ZZ2, &TT2d) + return v +} + +func (v *projP1xP1) Sub(p *Point, q *projCached) *projP1xP1 { + var YplusX, YminusX, PP, MM, TT2d, ZZ2 field.Element + + YplusX.Add(&p.y, &p.x) + YminusX.Subtract(&p.y, &p.x) + + PP.Multiply(&YplusX, &q.YminusX) // flipped sign + MM.Multiply(&YminusX, &q.YplusX) // flipped sign + TT2d.Multiply(&p.t, &q.T2d) + ZZ2.Multiply(&p.z, &q.Z) + + ZZ2.Add(&ZZ2, &ZZ2) + + v.X.Subtract(&PP, &MM) + v.Y.Add(&PP, &MM) + v.Z.Subtract(&ZZ2, &TT2d) // flipped sign + v.T.Add(&ZZ2, &TT2d) // flipped sign + return v +} + +func (v *projP1xP1) AddAffine(p *Point, q *affineCached) *projP1xP1 { + var YplusX, YminusX, PP, MM, TT2d, Z2 field.Element + + YplusX.Add(&p.y, &p.x) + YminusX.Subtract(&p.y, &p.x) + + PP.Multiply(&YplusX, &q.YplusX) + MM.Multiply(&YminusX, &q.YminusX) + TT2d.Multiply(&p.t, &q.T2d) + + Z2.Add(&p.z, &p.z) + + v.X.Subtract(&PP, &MM) + v.Y.Add(&PP, &MM) + v.Z.Add(&Z2, &TT2d) + v.T.Subtract(&Z2, &TT2d) + return v +} + +func (v *projP1xP1) SubAffine(p *Point, q *affineCached) *projP1xP1 { + var YplusX, YminusX, PP, MM, TT2d, Z2 field.Element + + YplusX.Add(&p.y, &p.x) + YminusX.Subtract(&p.y, &p.x) + + PP.Multiply(&YplusX, &q.YminusX) // flipped sign + MM.Multiply(&YminusX, &q.YplusX) // flipped sign + TT2d.Multiply(&p.t, &q.T2d) + + Z2.Add(&p.z, &p.z) + + v.X.Subtract(&PP, &MM) + v.Y.Add(&PP, &MM) + v.Z.Subtract(&Z2, &TT2d) // flipped sign + v.T.Add(&Z2, &TT2d) // flipped sign + return v +} + +// Doubling. + +func (v *projP1xP1) Double(p *projP2) *projP1xP1 { + var XX, YY, ZZ2, XplusYsq field.Element + + XX.Square(&p.X) + YY.Square(&p.Y) + ZZ2.Square(&p.Z) + ZZ2.Add(&ZZ2, &ZZ2) + XplusYsq.Add(&p.X, &p.Y) + XplusYsq.Square(&XplusYsq) + + v.Y.Add(&YY, &XX) + v.Z.Subtract(&YY, &XX) + + v.X.Subtract(&XplusYsq, &v.Y) + v.T.Subtract(&ZZ2, &v.Z) + return v +} + +// Negation. + +// Negate sets v = -p, and returns v. +func (v *Point) Negate(p *Point) *Point { + checkInitialized(p) + v.x.Negate(&p.x) + v.y.Set(&p.y) + v.z.Set(&p.z) + v.t.Negate(&p.t) + return v +} + +// Equal returns 1 if v is equivalent to u, and 0 otherwise. +func (v *Point) Equal(u *Point) int { + checkInitialized(v, u) + + var t1, t2, t3, t4 field.Element + t1.Multiply(&v.x, &u.z) + t2.Multiply(&u.x, &v.z) + t3.Multiply(&v.y, &u.z) + t4.Multiply(&u.y, &v.z) + + return t1.Equal(&t2) & t3.Equal(&t4) +} + +// Constant-time operations + +// Select sets v to a if cond == 1 and to b if cond == 0. +func (v *projCached) Select(a, b *projCached, cond int) *projCached { + v.YplusX.Select(&a.YplusX, &b.YplusX, cond) + v.YminusX.Select(&a.YminusX, &b.YminusX, cond) + v.Z.Select(&a.Z, &b.Z, cond) + v.T2d.Select(&a.T2d, &b.T2d, cond) + return v +} + +// Select sets v to a if cond == 1 and to b if cond == 0. +func (v *affineCached) Select(a, b *affineCached, cond int) *affineCached { + v.YplusX.Select(&a.YplusX, &b.YplusX, cond) + v.YminusX.Select(&a.YminusX, &b.YminusX, cond) + v.T2d.Select(&a.T2d, &b.T2d, cond) + return v +} + +// CondNeg negates v if cond == 1 and leaves it unchanged if cond == 0. +func (v *projCached) CondNeg(cond int) *projCached { + v.YplusX.Swap(&v.YminusX, cond) + v.T2d.Select(new(field.Element).Negate(&v.T2d), &v.T2d, cond) + return v +} + +// CondNeg negates v if cond == 1 and leaves it unchanged if cond == 0. +func (v *affineCached) CondNeg(cond int) *affineCached { + v.YplusX.Swap(&v.YminusX, cond) + v.T2d.Select(new(field.Element).Negate(&v.T2d), &v.T2d, cond) + return v +} diff --git a/vendor/filippo.io/edwards25519/extra.go b/vendor/filippo.io/edwards25519/extra.go new file mode 100644 index 00000000..f5e59080 --- /dev/null +++ b/vendor/filippo.io/edwards25519/extra.go @@ -0,0 +1,343 @@ +// Copyright (c) 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package edwards25519 + +// This file contains additional functionality that is not included in the +// upstream crypto/ed25519/internal/edwards25519 package. + +import ( + "errors" + + "filippo.io/edwards25519/field" +) + +// ExtendedCoordinates returns v in extended coordinates (X:Y:Z:T) where +// x = X/Z, y = Y/Z, and xy = T/Z as in https://eprint.iacr.org/2008/522. +func (v *Point) ExtendedCoordinates() (X, Y, Z, T *field.Element) { + // This function is outlined to make the allocations inline in the caller + // rather than happen on the heap. Don't change the style without making + // sure it doesn't increase the inliner cost. + var e [4]field.Element + X, Y, Z, T = v.extendedCoordinates(&e) + return +} + +func (v *Point) extendedCoordinates(e *[4]field.Element) (X, Y, Z, T *field.Element) { + checkInitialized(v) + X = e[0].Set(&v.x) + Y = e[1].Set(&v.y) + Z = e[2].Set(&v.z) + T = e[3].Set(&v.t) + return +} + +// SetExtendedCoordinates sets v = (X:Y:Z:T) in extended coordinates where +// x = X/Z, y = Y/Z, and xy = T/Z as in https://eprint.iacr.org/2008/522. +// +// If the coordinates are invalid or don't represent a valid point on the curve, +// SetExtendedCoordinates returns nil and an error and the receiver is +// unchanged. Otherwise, SetExtendedCoordinates returns v. +func (v *Point) SetExtendedCoordinates(X, Y, Z, T *field.Element) (*Point, error) { + if !isOnCurve(X, Y, Z, T) { + return nil, errors.New("edwards25519: invalid point coordinates") + } + v.x.Set(X) + v.y.Set(Y) + v.z.Set(Z) + v.t.Set(T) + return v, nil +} + +func isOnCurve(X, Y, Z, T *field.Element) bool { + var lhs, rhs field.Element + XX := new(field.Element).Square(X) + YY := new(field.Element).Square(Y) + ZZ := new(field.Element).Square(Z) + TT := new(field.Element).Square(T) + // -x² + y² = 1 + dx²y² + // -(X/Z)² + (Y/Z)² = 1 + d(T/Z)² + // -X² + Y² = Z² + dT² + lhs.Subtract(YY, XX) + rhs.Multiply(d, TT).Add(&rhs, ZZ) + if lhs.Equal(&rhs) != 1 { + return false + } + // xy = T/Z + // XY/Z² = T/Z + // XY = TZ + lhs.Multiply(X, Y) + rhs.Multiply(T, Z) + return lhs.Equal(&rhs) == 1 +} + +// BytesMontgomery converts v to a point on the birationally-equivalent +// Curve25519 Montgomery curve, and returns its canonical 32 bytes encoding +// according to RFC 7748. +// +// Note that BytesMontgomery only encodes the u-coordinate, so v and -v encode +// to the same value. If v is the identity point, BytesMontgomery returns 32 +// zero bytes, analogously to the X25519 function. +func (v *Point) BytesMontgomery() []byte { + // This function is outlined to make the allocations inline in the caller + // rather than happen on the heap. + var buf [32]byte + return v.bytesMontgomery(&buf) +} + +func (v *Point) bytesMontgomery(buf *[32]byte) []byte { + checkInitialized(v) + + // RFC 7748, Section 4.1 provides the bilinear map to calculate the + // Montgomery u-coordinate + // + // u = (1 + y) / (1 - y) + // + // where y = Y / Z. + + var y, recip, u field.Element + + y.Multiply(&v.y, y.Invert(&v.z)) // y = Y / Z + recip.Invert(recip.Subtract(feOne, &y)) // r = 1/(1 - y) + u.Multiply(u.Add(feOne, &y), &recip) // u = (1 + y)*r + + return copyFieldElement(buf, &u) +} + +// MultByCofactor sets v = 8 * p, and returns v. +func (v *Point) MultByCofactor(p *Point) *Point { + checkInitialized(p) + result := projP1xP1{} + pp := (&projP2{}).FromP3(p) + result.Double(pp) + pp.FromP1xP1(&result) + result.Double(pp) + pp.FromP1xP1(&result) + result.Double(pp) + return v.fromP1xP1(&result) +} + +// Given k > 0, set s = s**(2*i). +func (s *Scalar) pow2k(k int) { + for i := 0; i < k; i++ { + s.Multiply(s, s) + } +} + +// Invert sets s to the inverse of a nonzero scalar v, and returns s. +// +// If t is zero, Invert returns zero. +func (s *Scalar) Invert(t *Scalar) *Scalar { + // Uses a hardcoded sliding window of width 4. + var table [8]Scalar + var tt Scalar + tt.Multiply(t, t) + table[0] = *t + for i := 0; i < 7; i++ { + table[i+1].Multiply(&table[i], &tt) + } + // Now table = [t**1, t**3, t**7, t**11, t**13, t**15] + // so t**k = t[k/2] for odd k + + // To compute the sliding window digits, use the following Sage script: + + // sage: import itertools + // sage: def sliding_window(w,k): + // ....: digits = [] + // ....: while k > 0: + // ....: if k % 2 == 1: + // ....: kmod = k % (2**w) + // ....: digits.append(kmod) + // ....: k = k - kmod + // ....: else: + // ....: digits.append(0) + // ....: k = k // 2 + // ....: return digits + + // Now we can compute s roughly as follows: + + // sage: s = 1 + // sage: for coeff in reversed(sliding_window(4,l-2)): + // ....: s = s*s + // ....: if coeff > 0 : + // ....: s = s*t**coeff + + // This works on one bit at a time, with many runs of zeros. + // The digits can be collapsed into [(count, coeff)] as follows: + + // sage: [(len(list(group)),d) for d,group in itertools.groupby(sliding_window(4,l-2))] + + // Entries of the form (k, 0) turn into pow2k(k) + // Entries of the form (1, coeff) turn into a squaring and then a table lookup. + // We can fold the squaring into the previous pow2k(k) as pow2k(k+1). + + *s = table[1/2] + s.pow2k(127 + 1) + s.Multiply(s, &table[1/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[9/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[11/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[13/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[15/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[7/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[15/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[5/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[1/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[15/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[15/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[7/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[3/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[11/2]) + s.pow2k(5 + 1) + s.Multiply(s, &table[11/2]) + s.pow2k(9 + 1) + s.Multiply(s, &table[9/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[3/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[3/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[3/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[9/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[7/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[3/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[13/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[7/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[9/2]) + s.pow2k(3 + 1) + s.Multiply(s, &table[15/2]) + s.pow2k(4 + 1) + s.Multiply(s, &table[11/2]) + + return s +} + +// MultiScalarMult sets v = sum(scalars[i] * points[i]), and returns v. +// +// Execution time depends only on the lengths of the two slices, which must match. +func (v *Point) MultiScalarMult(scalars []*Scalar, points []*Point) *Point { + if len(scalars) != len(points) { + panic("edwards25519: called MultiScalarMult with different size inputs") + } + checkInitialized(points...) + + // Proceed as in the single-base case, but share doublings + // between each point in the multiscalar equation. + + // Build lookup tables for each point + tables := make([]projLookupTable, len(points)) + for i := range tables { + tables[i].FromP3(points[i]) + } + // Compute signed radix-16 digits for each scalar + digits := make([][64]int8, len(scalars)) + for i := range digits { + digits[i] = scalars[i].signedRadix16() + } + + // Unwrap first loop iteration to save computing 16*identity + multiple := &projCached{} + tmp1 := &projP1xP1{} + tmp2 := &projP2{} + // Lookup-and-add the appropriate multiple of each input point + for j := range tables { + tables[j].SelectInto(multiple, digits[j][63]) + tmp1.Add(v, multiple) // tmp1 = v + x_(j,63)*Q in P1xP1 coords + v.fromP1xP1(tmp1) // update v + } + tmp2.FromP3(v) // set up tmp2 = v in P2 coords for next iteration + for i := 62; i >= 0; i-- { + tmp1.Double(tmp2) // tmp1 = 2*(prev) in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 2*(prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 4*(prev) in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 4*(prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 8*(prev) in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 8*(prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 16*(prev) in P1xP1 coords + v.fromP1xP1(tmp1) // v = 16*(prev) in P3 coords + // Lookup-and-add the appropriate multiple of each input point + for j := range tables { + tables[j].SelectInto(multiple, digits[j][i]) + tmp1.Add(v, multiple) // tmp1 = v + x_(j,i)*Q in P1xP1 coords + v.fromP1xP1(tmp1) // update v + } + tmp2.FromP3(v) // set up tmp2 = v in P2 coords for next iteration + } + return v +} + +// VarTimeMultiScalarMult sets v = sum(scalars[i] * points[i]), and returns v. +// +// Execution time depends on the inputs. +func (v *Point) VarTimeMultiScalarMult(scalars []*Scalar, points []*Point) *Point { + if len(scalars) != len(points) { + panic("edwards25519: called VarTimeMultiScalarMult with different size inputs") + } + checkInitialized(points...) + + // Generalize double-base NAF computation to arbitrary sizes. + // Here all the points are dynamic, so we only use the smaller + // tables. + + // Build lookup tables for each point + tables := make([]nafLookupTable5, len(points)) + for i := range tables { + tables[i].FromP3(points[i]) + } + // Compute a NAF for each scalar + nafs := make([][256]int8, len(scalars)) + for i := range nafs { + nafs[i] = scalars[i].nonAdjacentForm(5) + } + + multiple := &projCached{} + tmp1 := &projP1xP1{} + tmp2 := &projP2{} + tmp2.Zero() + + // Move from high to low bits, doubling the accumulator + // at each iteration and checking whether there is a nonzero + // coefficient to look up a multiple of. + // + // Skip trying to find the first nonzero coefficent, because + // searching might be more work than a few extra doublings. + for i := 255; i >= 0; i-- { + tmp1.Double(tmp2) + + for j := range nafs { + if nafs[j][i] > 0 { + v.fromP1xP1(tmp1) + tables[j].SelectInto(multiple, nafs[j][i]) + tmp1.Add(v, multiple) + } else if nafs[j][i] < 0 { + v.fromP1xP1(tmp1) + tables[j].SelectInto(multiple, -nafs[j][i]) + tmp1.Sub(v, multiple) + } + } + + tmp2.FromP1xP1(tmp1) + } + + v.fromP2(tmp2) + return v +} diff --git a/vendor/filippo.io/edwards25519/field/fe.go b/vendor/filippo.io/edwards25519/field/fe.go new file mode 100644 index 00000000..5518ef2b --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe.go @@ -0,0 +1,420 @@ +// Copyright (c) 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package field implements fast arithmetic modulo 2^255-19. +package field + +import ( + "crypto/subtle" + "encoding/binary" + "errors" + "math/bits" +) + +// Element represents an element of the field GF(2^255-19). Note that this +// is not a cryptographically secure group, and should only be used to interact +// with edwards25519.Point coordinates. +// +// This type works similarly to math/big.Int, and all arguments and receivers +// are allowed to alias. +// +// The zero value is a valid zero element. +type Element struct { + // An element t represents the integer + // t.l0 + t.l1*2^51 + t.l2*2^102 + t.l3*2^153 + t.l4*2^204 + // + // Between operations, all limbs are expected to be lower than 2^52. + l0 uint64 + l1 uint64 + l2 uint64 + l3 uint64 + l4 uint64 +} + +const maskLow51Bits uint64 = (1 << 51) - 1 + +var feZero = &Element{0, 0, 0, 0, 0} + +// Zero sets v = 0, and returns v. +func (v *Element) Zero() *Element { + *v = *feZero + return v +} + +var feOne = &Element{1, 0, 0, 0, 0} + +// One sets v = 1, and returns v. +func (v *Element) One() *Element { + *v = *feOne + return v +} + +// reduce reduces v modulo 2^255 - 19 and returns it. +func (v *Element) reduce() *Element { + v.carryPropagate() + + // After the light reduction we now have a field element representation + // v < 2^255 + 2^13 * 19, but need v < 2^255 - 19. + + // If v >= 2^255 - 19, then v + 19 >= 2^255, which would overflow 2^255 - 1, + // generating a carry. That is, c will be 0 if v < 2^255 - 19, and 1 otherwise. + c := (v.l0 + 19) >> 51 + c = (v.l1 + c) >> 51 + c = (v.l2 + c) >> 51 + c = (v.l3 + c) >> 51 + c = (v.l4 + c) >> 51 + + // If v < 2^255 - 19 and c = 0, this will be a no-op. Otherwise, it's + // effectively applying the reduction identity to the carry. + v.l0 += 19 * c + + v.l1 += v.l0 >> 51 + v.l0 = v.l0 & maskLow51Bits + v.l2 += v.l1 >> 51 + v.l1 = v.l1 & maskLow51Bits + v.l3 += v.l2 >> 51 + v.l2 = v.l2 & maskLow51Bits + v.l4 += v.l3 >> 51 + v.l3 = v.l3 & maskLow51Bits + // no additional carry + v.l4 = v.l4 & maskLow51Bits + + return v +} + +// Add sets v = a + b, and returns v. +func (v *Element) Add(a, b *Element) *Element { + v.l0 = a.l0 + b.l0 + v.l1 = a.l1 + b.l1 + v.l2 = a.l2 + b.l2 + v.l3 = a.l3 + b.l3 + v.l4 = a.l4 + b.l4 + // Using the generic implementation here is actually faster than the + // assembly. Probably because the body of this function is so simple that + // the compiler can figure out better optimizations by inlining the carry + // propagation. + return v.carryPropagateGeneric() +} + +// Subtract sets v = a - b, and returns v. +func (v *Element) Subtract(a, b *Element) *Element { + // We first add 2 * p, to guarantee the subtraction won't underflow, and + // then subtract b (which can be up to 2^255 + 2^13 * 19). + v.l0 = (a.l0 + 0xFFFFFFFFFFFDA) - b.l0 + v.l1 = (a.l1 + 0xFFFFFFFFFFFFE) - b.l1 + v.l2 = (a.l2 + 0xFFFFFFFFFFFFE) - b.l2 + v.l3 = (a.l3 + 0xFFFFFFFFFFFFE) - b.l3 + v.l4 = (a.l4 + 0xFFFFFFFFFFFFE) - b.l4 + return v.carryPropagate() +} + +// Negate sets v = -a, and returns v. +func (v *Element) Negate(a *Element) *Element { + return v.Subtract(feZero, a) +} + +// Invert sets v = 1/z mod p, and returns v. +// +// If z == 0, Invert returns v = 0. +func (v *Element) Invert(z *Element) *Element { + // Inversion is implemented as exponentiation with exponent p − 2. It uses the + // same sequence of 255 squarings and 11 multiplications as [Curve25519]. + var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t Element + + z2.Square(z) // 2 + t.Square(&z2) // 4 + t.Square(&t) // 8 + z9.Multiply(&t, z) // 9 + z11.Multiply(&z9, &z2) // 11 + t.Square(&z11) // 22 + z2_5_0.Multiply(&t, &z9) // 31 = 2^5 - 2^0 + + t.Square(&z2_5_0) // 2^6 - 2^1 + for i := 0; i < 4; i++ { + t.Square(&t) // 2^10 - 2^5 + } + z2_10_0.Multiply(&t, &z2_5_0) // 2^10 - 2^0 + + t.Square(&z2_10_0) // 2^11 - 2^1 + for i := 0; i < 9; i++ { + t.Square(&t) // 2^20 - 2^10 + } + z2_20_0.Multiply(&t, &z2_10_0) // 2^20 - 2^0 + + t.Square(&z2_20_0) // 2^21 - 2^1 + for i := 0; i < 19; i++ { + t.Square(&t) // 2^40 - 2^20 + } + t.Multiply(&t, &z2_20_0) // 2^40 - 2^0 + + t.Square(&t) // 2^41 - 2^1 + for i := 0; i < 9; i++ { + t.Square(&t) // 2^50 - 2^10 + } + z2_50_0.Multiply(&t, &z2_10_0) // 2^50 - 2^0 + + t.Square(&z2_50_0) // 2^51 - 2^1 + for i := 0; i < 49; i++ { + t.Square(&t) // 2^100 - 2^50 + } + z2_100_0.Multiply(&t, &z2_50_0) // 2^100 - 2^0 + + t.Square(&z2_100_0) // 2^101 - 2^1 + for i := 0; i < 99; i++ { + t.Square(&t) // 2^200 - 2^100 + } + t.Multiply(&t, &z2_100_0) // 2^200 - 2^0 + + t.Square(&t) // 2^201 - 2^1 + for i := 0; i < 49; i++ { + t.Square(&t) // 2^250 - 2^50 + } + t.Multiply(&t, &z2_50_0) // 2^250 - 2^0 + + t.Square(&t) // 2^251 - 2^1 + t.Square(&t) // 2^252 - 2^2 + t.Square(&t) // 2^253 - 2^3 + t.Square(&t) // 2^254 - 2^4 + t.Square(&t) // 2^255 - 2^5 + + return v.Multiply(&t, &z11) // 2^255 - 21 +} + +// Set sets v = a, and returns v. +func (v *Element) Set(a *Element) *Element { + *v = *a + return v +} + +// SetBytes sets v to x, where x is a 32-byte little-endian encoding. If x is +// not of the right length, SetBytes returns nil and an error, and the +// receiver is unchanged. +// +// Consistent with RFC 7748, the most significant bit (the high bit of the +// last byte) is ignored, and non-canonical values (2^255-19 through 2^255-1) +// are accepted. Note that this is laxer than specified by RFC 8032, but +// consistent with most Ed25519 implementations. +func (v *Element) SetBytes(x []byte) (*Element, error) { + if len(x) != 32 { + return nil, errors.New("edwards25519: invalid field element input size") + } + + // Bits 0:51 (bytes 0:8, bits 0:64, shift 0, mask 51). + v.l0 = binary.LittleEndian.Uint64(x[0:8]) + v.l0 &= maskLow51Bits + // Bits 51:102 (bytes 6:14, bits 48:112, shift 3, mask 51). + v.l1 = binary.LittleEndian.Uint64(x[6:14]) >> 3 + v.l1 &= maskLow51Bits + // Bits 102:153 (bytes 12:20, bits 96:160, shift 6, mask 51). + v.l2 = binary.LittleEndian.Uint64(x[12:20]) >> 6 + v.l2 &= maskLow51Bits + // Bits 153:204 (bytes 19:27, bits 152:216, shift 1, mask 51). + v.l3 = binary.LittleEndian.Uint64(x[19:27]) >> 1 + v.l3 &= maskLow51Bits + // Bits 204:255 (bytes 24:32, bits 192:256, shift 12, mask 51). + // Note: not bytes 25:33, shift 4, to avoid overread. + v.l4 = binary.LittleEndian.Uint64(x[24:32]) >> 12 + v.l4 &= maskLow51Bits + + return v, nil +} + +// Bytes returns the canonical 32-byte little-endian encoding of v. +func (v *Element) Bytes() []byte { + // This function is outlined to make the allocations inline in the caller + // rather than happen on the heap. + var out [32]byte + return v.bytes(&out) +} + +func (v *Element) bytes(out *[32]byte) []byte { + t := *v + t.reduce() + + var buf [8]byte + for i, l := range [5]uint64{t.l0, t.l1, t.l2, t.l3, t.l4} { + bitsOffset := i * 51 + binary.LittleEndian.PutUint64(buf[:], l<= len(out) { + break + } + out[off] |= bb + } + } + + return out[:] +} + +// Equal returns 1 if v and u are equal, and 0 otherwise. +func (v *Element) Equal(u *Element) int { + sa, sv := u.Bytes(), v.Bytes() + return subtle.ConstantTimeCompare(sa, sv) +} + +// mask64Bits returns 0xffffffff if cond is 1, and 0 otherwise. +func mask64Bits(cond int) uint64 { return ^(uint64(cond) - 1) } + +// Select sets v to a if cond == 1, and to b if cond == 0. +func (v *Element) Select(a, b *Element, cond int) *Element { + m := mask64Bits(cond) + v.l0 = (m & a.l0) | (^m & b.l0) + v.l1 = (m & a.l1) | (^m & b.l1) + v.l2 = (m & a.l2) | (^m & b.l2) + v.l3 = (m & a.l3) | (^m & b.l3) + v.l4 = (m & a.l4) | (^m & b.l4) + return v +} + +// Swap swaps v and u if cond == 1 or leaves them unchanged if cond == 0, and returns v. +func (v *Element) Swap(u *Element, cond int) { + m := mask64Bits(cond) + t := m & (v.l0 ^ u.l0) + v.l0 ^= t + u.l0 ^= t + t = m & (v.l1 ^ u.l1) + v.l1 ^= t + u.l1 ^= t + t = m & (v.l2 ^ u.l2) + v.l2 ^= t + u.l2 ^= t + t = m & (v.l3 ^ u.l3) + v.l3 ^= t + u.l3 ^= t + t = m & (v.l4 ^ u.l4) + v.l4 ^= t + u.l4 ^= t +} + +// IsNegative returns 1 if v is negative, and 0 otherwise. +func (v *Element) IsNegative() int { + return int(v.Bytes()[0] & 1) +} + +// Absolute sets v to |u|, and returns v. +func (v *Element) Absolute(u *Element) *Element { + return v.Select(new(Element).Negate(u), u, u.IsNegative()) +} + +// Multiply sets v = x * y, and returns v. +func (v *Element) Multiply(x, y *Element) *Element { + feMul(v, x, y) + return v +} + +// Square sets v = x * x, and returns v. +func (v *Element) Square(x *Element) *Element { + feSquare(v, x) + return v +} + +// Mult32 sets v = x * y, and returns v. +func (v *Element) Mult32(x *Element, y uint32) *Element { + x0lo, x0hi := mul51(x.l0, y) + x1lo, x1hi := mul51(x.l1, y) + x2lo, x2hi := mul51(x.l2, y) + x3lo, x3hi := mul51(x.l3, y) + x4lo, x4hi := mul51(x.l4, y) + v.l0 = x0lo + 19*x4hi // carried over per the reduction identity + v.l1 = x1lo + x0hi + v.l2 = x2lo + x1hi + v.l3 = x3lo + x2hi + v.l4 = x4lo + x3hi + // The hi portions are going to be only 32 bits, plus any previous excess, + // so we can skip the carry propagation. + return v +} + +// mul51 returns lo + hi * 2⁵¹ = a * b. +func mul51(a uint64, b uint32) (lo uint64, hi uint64) { + mh, ml := bits.Mul64(a, uint64(b)) + lo = ml & maskLow51Bits + hi = (mh << 13) | (ml >> 51) + return +} + +// Pow22523 set v = x^((p-5)/8), and returns v. (p-5)/8 is 2^252-3. +func (v *Element) Pow22523(x *Element) *Element { + var t0, t1, t2 Element + + t0.Square(x) // x^2 + t1.Square(&t0) // x^4 + t1.Square(&t1) // x^8 + t1.Multiply(x, &t1) // x^9 + t0.Multiply(&t0, &t1) // x^11 + t0.Square(&t0) // x^22 + t0.Multiply(&t1, &t0) // x^31 + t1.Square(&t0) // x^62 + for i := 1; i < 5; i++ { // x^992 + t1.Square(&t1) + } + t0.Multiply(&t1, &t0) // x^1023 -> 1023 = 2^10 - 1 + t1.Square(&t0) // 2^11 - 2 + for i := 1; i < 10; i++ { // 2^20 - 2^10 + t1.Square(&t1) + } + t1.Multiply(&t1, &t0) // 2^20 - 1 + t2.Square(&t1) // 2^21 - 2 + for i := 1; i < 20; i++ { // 2^40 - 2^20 + t2.Square(&t2) + } + t1.Multiply(&t2, &t1) // 2^40 - 1 + t1.Square(&t1) // 2^41 - 2 + for i := 1; i < 10; i++ { // 2^50 - 2^10 + t1.Square(&t1) + } + t0.Multiply(&t1, &t0) // 2^50 - 1 + t1.Square(&t0) // 2^51 - 2 + for i := 1; i < 50; i++ { // 2^100 - 2^50 + t1.Square(&t1) + } + t1.Multiply(&t1, &t0) // 2^100 - 1 + t2.Square(&t1) // 2^101 - 2 + for i := 1; i < 100; i++ { // 2^200 - 2^100 + t2.Square(&t2) + } + t1.Multiply(&t2, &t1) // 2^200 - 1 + t1.Square(&t1) // 2^201 - 2 + for i := 1; i < 50; i++ { // 2^250 - 2^50 + t1.Square(&t1) + } + t0.Multiply(&t1, &t0) // 2^250 - 1 + t0.Square(&t0) // 2^251 - 2 + t0.Square(&t0) // 2^252 - 4 + return v.Multiply(&t0, x) // 2^252 - 3 -> x^(2^252-3) +} + +// sqrtM1 is 2^((p-1)/4), which squared is equal to -1 by Euler's Criterion. +var sqrtM1 = &Element{1718705420411056, 234908883556509, + 2233514472574048, 2117202627021982, 765476049583133} + +// SqrtRatio sets r to the non-negative square root of the ratio of u and v. +// +// If u/v is square, SqrtRatio returns r and 1. If u/v is not square, SqrtRatio +// sets r according to Section 4.3 of draft-irtf-cfrg-ristretto255-decaf448-00, +// and returns r and 0. +func (r *Element) SqrtRatio(u, v *Element) (R *Element, wasSquare int) { + t0 := new(Element) + + // r = (u * v3) * (u * v7)^((p-5)/8) + v2 := new(Element).Square(v) + uv3 := new(Element).Multiply(u, t0.Multiply(v2, v)) + uv7 := new(Element).Multiply(uv3, t0.Square(v2)) + rr := new(Element).Multiply(uv3, t0.Pow22523(uv7)) + + check := new(Element).Multiply(v, t0.Square(rr)) // check = v * r^2 + + uNeg := new(Element).Negate(u) + correctSignSqrt := check.Equal(u) + flippedSignSqrt := check.Equal(uNeg) + flippedSignSqrtI := check.Equal(t0.Multiply(uNeg, sqrtM1)) + + rPrime := new(Element).Multiply(rr, sqrtM1) // r_prime = SQRT_M1 * r + // r = CT_SELECT(r_prime IF flipped_sign_sqrt | flipped_sign_sqrt_i ELSE r) + rr.Select(rPrime, rr, flippedSignSqrt|flippedSignSqrtI) + + r.Absolute(rr) // Choose the nonnegative square root. + return r, correctSignSqrt | flippedSignSqrt +} diff --git a/vendor/filippo.io/edwards25519/field/fe_amd64.go b/vendor/filippo.io/edwards25519/field/fe_amd64.go new file mode 100644 index 00000000..44dc8e8c --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_amd64.go @@ -0,0 +1,13 @@ +// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT. + +// +build amd64,gc,!purego + +package field + +// feMul sets out = a * b. It works like feMulGeneric. +//go:noescape +func feMul(out *Element, a *Element, b *Element) + +// feSquare sets out = a * a. It works like feSquareGeneric. +//go:noescape +func feSquare(out *Element, a *Element) diff --git a/vendor/filippo.io/edwards25519/field/fe_amd64.s b/vendor/filippo.io/edwards25519/field/fe_amd64.s new file mode 100644 index 00000000..0aa1e86d --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_amd64.s @@ -0,0 +1,378 @@ +// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT. + +// +build amd64,gc,!purego + +#include "textflag.h" + +// func feMul(out *Element, a *Element, b *Element) +TEXT ·feMul(SB), NOSPLIT, $0-24 + MOVQ a+8(FP), CX + MOVQ b+16(FP), BX + + // r0 = a0×b0 + MOVQ (CX), AX + MULQ (BX) + MOVQ AX, DI + MOVQ DX, SI + + // r0 += 19×a1×b4 + MOVQ 8(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r0 += 19×a2×b3 + MOVQ 16(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r0 += 19×a3×b2 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 16(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r0 += 19×a4×b1 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 8(BX) + ADDQ AX, DI + ADCQ DX, SI + + // r1 = a0×b1 + MOVQ (CX), AX + MULQ 8(BX) + MOVQ AX, R9 + MOVQ DX, R8 + + // r1 += a1×b0 + MOVQ 8(CX), AX + MULQ (BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r1 += 19×a2×b4 + MOVQ 16(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r1 += 19×a3×b3 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r1 += 19×a4×b2 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 16(BX) + ADDQ AX, R9 + ADCQ DX, R8 + + // r2 = a0×b2 + MOVQ (CX), AX + MULQ 16(BX) + MOVQ AX, R11 + MOVQ DX, R10 + + // r2 += a1×b1 + MOVQ 8(CX), AX + MULQ 8(BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r2 += a2×b0 + MOVQ 16(CX), AX + MULQ (BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r2 += 19×a3×b4 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r2 += 19×a4×b3 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(BX) + ADDQ AX, R11 + ADCQ DX, R10 + + // r3 = a0×b3 + MOVQ (CX), AX + MULQ 24(BX) + MOVQ AX, R13 + MOVQ DX, R12 + + // r3 += a1×b2 + MOVQ 8(CX), AX + MULQ 16(BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r3 += a2×b1 + MOVQ 16(CX), AX + MULQ 8(BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r3 += a3×b0 + MOVQ 24(CX), AX + MULQ (BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r3 += 19×a4×b4 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(BX) + ADDQ AX, R13 + ADCQ DX, R12 + + // r4 = a0×b4 + MOVQ (CX), AX + MULQ 32(BX) + MOVQ AX, R15 + MOVQ DX, R14 + + // r4 += a1×b3 + MOVQ 8(CX), AX + MULQ 24(BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // r4 += a2×b2 + MOVQ 16(CX), AX + MULQ 16(BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // r4 += a3×b1 + MOVQ 24(CX), AX + MULQ 8(BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // r4 += a4×b0 + MOVQ 32(CX), AX + MULQ (BX) + ADDQ AX, R15 + ADCQ DX, R14 + + // First reduction chain + MOVQ $0x0007ffffffffffff, AX + SHLQ $0x0d, DI, SI + SHLQ $0x0d, R9, R8 + SHLQ $0x0d, R11, R10 + SHLQ $0x0d, R13, R12 + SHLQ $0x0d, R15, R14 + ANDQ AX, DI + IMUL3Q $0x13, R14, R14 + ADDQ R14, DI + ANDQ AX, R9 + ADDQ SI, R9 + ANDQ AX, R11 + ADDQ R8, R11 + ANDQ AX, R13 + ADDQ R10, R13 + ANDQ AX, R15 + ADDQ R12, R15 + + // Second reduction chain (carryPropagate) + MOVQ DI, SI + SHRQ $0x33, SI + MOVQ R9, R8 + SHRQ $0x33, R8 + MOVQ R11, R10 + SHRQ $0x33, R10 + MOVQ R13, R12 + SHRQ $0x33, R12 + MOVQ R15, R14 + SHRQ $0x33, R14 + ANDQ AX, DI + IMUL3Q $0x13, R14, R14 + ADDQ R14, DI + ANDQ AX, R9 + ADDQ SI, R9 + ANDQ AX, R11 + ADDQ R8, R11 + ANDQ AX, R13 + ADDQ R10, R13 + ANDQ AX, R15 + ADDQ R12, R15 + + // Store output + MOVQ out+0(FP), AX + MOVQ DI, (AX) + MOVQ R9, 8(AX) + MOVQ R11, 16(AX) + MOVQ R13, 24(AX) + MOVQ R15, 32(AX) + RET + +// func feSquare(out *Element, a *Element) +TEXT ·feSquare(SB), NOSPLIT, $0-16 + MOVQ a+8(FP), CX + + // r0 = l0×l0 + MOVQ (CX), AX + MULQ (CX) + MOVQ AX, SI + MOVQ DX, BX + + // r0 += 38×l1×l4 + MOVQ 8(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 32(CX) + ADDQ AX, SI + ADCQ DX, BX + + // r0 += 38×l2×l3 + MOVQ 16(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 24(CX) + ADDQ AX, SI + ADCQ DX, BX + + // r1 = 2×l0×l1 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 8(CX) + MOVQ AX, R8 + MOVQ DX, DI + + // r1 += 38×l2×l4 + MOVQ 16(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 32(CX) + ADDQ AX, R8 + ADCQ DX, DI + + // r1 += 19×l3×l3 + MOVQ 24(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 24(CX) + ADDQ AX, R8 + ADCQ DX, DI + + // r2 = 2×l0×l2 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 16(CX) + MOVQ AX, R10 + MOVQ DX, R9 + + // r2 += l1×l1 + MOVQ 8(CX), AX + MULQ 8(CX) + ADDQ AX, R10 + ADCQ DX, R9 + + // r2 += 38×l3×l4 + MOVQ 24(CX), AX + IMUL3Q $0x26, AX, AX + MULQ 32(CX) + ADDQ AX, R10 + ADCQ DX, R9 + + // r3 = 2×l0×l3 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 24(CX) + MOVQ AX, R12 + MOVQ DX, R11 + + // r3 += 2×l1×l2 + MOVQ 8(CX), AX + IMUL3Q $0x02, AX, AX + MULQ 16(CX) + ADDQ AX, R12 + ADCQ DX, R11 + + // r3 += 19×l4×l4 + MOVQ 32(CX), AX + IMUL3Q $0x13, AX, AX + MULQ 32(CX) + ADDQ AX, R12 + ADCQ DX, R11 + + // r4 = 2×l0×l4 + MOVQ (CX), AX + SHLQ $0x01, AX + MULQ 32(CX) + MOVQ AX, R14 + MOVQ DX, R13 + + // r4 += 2×l1×l3 + MOVQ 8(CX), AX + IMUL3Q $0x02, AX, AX + MULQ 24(CX) + ADDQ AX, R14 + ADCQ DX, R13 + + // r4 += l2×l2 + MOVQ 16(CX), AX + MULQ 16(CX) + ADDQ AX, R14 + ADCQ DX, R13 + + // First reduction chain + MOVQ $0x0007ffffffffffff, AX + SHLQ $0x0d, SI, BX + SHLQ $0x0d, R8, DI + SHLQ $0x0d, R10, R9 + SHLQ $0x0d, R12, R11 + SHLQ $0x0d, R14, R13 + ANDQ AX, SI + IMUL3Q $0x13, R13, R13 + ADDQ R13, SI + ANDQ AX, R8 + ADDQ BX, R8 + ANDQ AX, R10 + ADDQ DI, R10 + ANDQ AX, R12 + ADDQ R9, R12 + ANDQ AX, R14 + ADDQ R11, R14 + + // Second reduction chain (carryPropagate) + MOVQ SI, BX + SHRQ $0x33, BX + MOVQ R8, DI + SHRQ $0x33, DI + MOVQ R10, R9 + SHRQ $0x33, R9 + MOVQ R12, R11 + SHRQ $0x33, R11 + MOVQ R14, R13 + SHRQ $0x33, R13 + ANDQ AX, SI + IMUL3Q $0x13, R13, R13 + ADDQ R13, SI + ANDQ AX, R8 + ADDQ BX, R8 + ANDQ AX, R10 + ADDQ DI, R10 + ANDQ AX, R12 + ADDQ R9, R12 + ANDQ AX, R14 + ADDQ R11, R14 + + // Store output + MOVQ out+0(FP), AX + MOVQ SI, (AX) + MOVQ R8, 8(AX) + MOVQ R10, 16(AX) + MOVQ R12, 24(AX) + MOVQ R14, 32(AX) + RET diff --git a/vendor/filippo.io/edwards25519/field/fe_amd64_noasm.go b/vendor/filippo.io/edwards25519/field/fe_amd64_noasm.go new file mode 100644 index 00000000..ddb6c9b8 --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_amd64_noasm.go @@ -0,0 +1,12 @@ +// Copyright (c) 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !amd64 || !gc || purego +// +build !amd64 !gc purego + +package field + +func feMul(v, x, y *Element) { feMulGeneric(v, x, y) } + +func feSquare(v, x *Element) { feSquareGeneric(v, x) } diff --git a/vendor/filippo.io/edwards25519/field/fe_arm64.go b/vendor/filippo.io/edwards25519/field/fe_arm64.go new file mode 100644 index 00000000..af459ef5 --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_arm64.go @@ -0,0 +1,16 @@ +// Copyright (c) 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build arm64 && gc && !purego +// +build arm64,gc,!purego + +package field + +//go:noescape +func carryPropagate(v *Element) + +func (v *Element) carryPropagate() *Element { + carryPropagate(v) + return v +} diff --git a/vendor/filippo.io/edwards25519/field/fe_arm64.s b/vendor/filippo.io/edwards25519/field/fe_arm64.s new file mode 100644 index 00000000..751ab2ad --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_arm64.s @@ -0,0 +1,42 @@ +// Copyright (c) 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,gc,!purego + +#include "textflag.h" + +// carryPropagate works exactly like carryPropagateGeneric and uses the +// same AND, ADD, and LSR+MADD instructions emitted by the compiler, but +// avoids loading R0-R4 twice and uses LDP and STP. +// +// See https://golang.org/issues/43145 for the main compiler issue. +// +// func carryPropagate(v *Element) +TEXT ·carryPropagate(SB),NOFRAME|NOSPLIT,$0-8 + MOVD v+0(FP), R20 + + LDP 0(R20), (R0, R1) + LDP 16(R20), (R2, R3) + MOVD 32(R20), R4 + + AND $0x7ffffffffffff, R0, R10 + AND $0x7ffffffffffff, R1, R11 + AND $0x7ffffffffffff, R2, R12 + AND $0x7ffffffffffff, R3, R13 + AND $0x7ffffffffffff, R4, R14 + + ADD R0>>51, R11, R11 + ADD R1>>51, R12, R12 + ADD R2>>51, R13, R13 + ADD R3>>51, R14, R14 + // R4>>51 * 19 + R10 -> R10 + LSR $51, R4, R21 + MOVD $19, R22 + MADD R22, R10, R21, R10 + + STP (R10, R11), 0(R20) + STP (R12, R13), 16(R20) + MOVD R14, 32(R20) + + RET diff --git a/vendor/filippo.io/edwards25519/field/fe_arm64_noasm.go b/vendor/filippo.io/edwards25519/field/fe_arm64_noasm.go new file mode 100644 index 00000000..234a5b2e --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_arm64_noasm.go @@ -0,0 +1,12 @@ +// Copyright (c) 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !arm64 || !gc || purego +// +build !arm64 !gc purego + +package field + +func (v *Element) carryPropagate() *Element { + return v.carryPropagateGeneric() +} diff --git a/vendor/filippo.io/edwards25519/field/fe_extra.go b/vendor/filippo.io/edwards25519/field/fe_extra.go new file mode 100644 index 00000000..699238e9 --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_extra.go @@ -0,0 +1,50 @@ +// Copyright (c) 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package field + +import "errors" + +// This file contains additional functionality that is not included in the +// upstream crypto/ed25519/internal/edwards25519/field package. + +// SetWideBytes sets v to x, where x is a 64-byte little-endian encoding, which +// is reduced modulo the field order. If x is not of the right length, +// SetWideBytes returns nil and an error, and the receiver is unchanged. +// +// SetWideBytes is not necessary to select a uniformly distributed value, and is +// only provided for compatibility: SetBytes can be used instead as the chance +// of bias is less than 2⁻²⁵⁰. +func (v *Element) SetWideBytes(x []byte) (*Element, error) { + if len(x) != 64 { + return nil, errors.New("edwards25519: invalid SetWideBytes input size") + } + + // Split the 64 bytes into two elements, and extract the most significant + // bit of each, which is ignored by SetBytes. + lo, _ := new(Element).SetBytes(x[:32]) + loMSB := uint64(x[31] >> 7) + hi, _ := new(Element).SetBytes(x[32:]) + hiMSB := uint64(x[63] >> 7) + + // The output we want is + // + // v = lo + loMSB * 2²⁵⁵ + hi * 2²⁵⁶ + hiMSB * 2⁵¹¹ + // + // which applying the reduction identity comes out to + // + // v = lo + loMSB * 19 + hi * 2 * 19 + hiMSB * 2 * 19² + // + // l0 will be the sum of a 52 bits value (lo.l0), plus a 5 bits value + // (loMSB * 19), a 6 bits value (hi.l0 * 2 * 19), and a 10 bits value + // (hiMSB * 2 * 19²), so it fits in a uint64. + + v.l0 = lo.l0 + loMSB*19 + hi.l0*2*19 + hiMSB*2*19*19 + v.l1 = lo.l1 + hi.l1*2*19 + v.l2 = lo.l2 + hi.l2*2*19 + v.l3 = lo.l3 + hi.l3*2*19 + v.l4 = lo.l4 + hi.l4*2*19 + + return v.carryPropagate(), nil +} diff --git a/vendor/filippo.io/edwards25519/field/fe_generic.go b/vendor/filippo.io/edwards25519/field/fe_generic.go new file mode 100644 index 00000000..d6667b27 --- /dev/null +++ b/vendor/filippo.io/edwards25519/field/fe_generic.go @@ -0,0 +1,266 @@ +// Copyright (c) 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package field + +import "math/bits" + +// uint128 holds a 128-bit number as two 64-bit limbs, for use with the +// bits.Mul64 and bits.Add64 intrinsics. +type uint128 struct { + lo, hi uint64 +} + +// mul64 returns a * b. +func mul64(a, b uint64) uint128 { + hi, lo := bits.Mul64(a, b) + return uint128{lo, hi} +} + +// addMul64 returns v + a * b. +func addMul64(v uint128, a, b uint64) uint128 { + hi, lo := bits.Mul64(a, b) + lo, c := bits.Add64(lo, v.lo, 0) + hi, _ = bits.Add64(hi, v.hi, c) + return uint128{lo, hi} +} + +// shiftRightBy51 returns a >> 51. a is assumed to be at most 115 bits. +func shiftRightBy51(a uint128) uint64 { + return (a.hi << (64 - 51)) | (a.lo >> 51) +} + +func feMulGeneric(v, a, b *Element) { + a0 := a.l0 + a1 := a.l1 + a2 := a.l2 + a3 := a.l3 + a4 := a.l4 + + b0 := b.l0 + b1 := b.l1 + b2 := b.l2 + b3 := b.l3 + b4 := b.l4 + + // Limb multiplication works like pen-and-paper columnar multiplication, but + // with 51-bit limbs instead of digits. + // + // a4 a3 a2 a1 a0 x + // b4 b3 b2 b1 b0 = + // ------------------------ + // a4b0 a3b0 a2b0 a1b0 a0b0 + + // a4b1 a3b1 a2b1 a1b1 a0b1 + + // a4b2 a3b2 a2b2 a1b2 a0b2 + + // a4b3 a3b3 a2b3 a1b3 a0b3 + + // a4b4 a3b4 a2b4 a1b4 a0b4 = + // ---------------------------------------------- + // r8 r7 r6 r5 r4 r3 r2 r1 r0 + // + // We can then use the reduction identity (a * 2²⁵⁵ + b = a * 19 + b) to + // reduce the limbs that would overflow 255 bits. r5 * 2²⁵⁵ becomes 19 * r5, + // r6 * 2³⁰⁶ becomes 19 * r6 * 2⁵¹, etc. + // + // Reduction can be carried out simultaneously to multiplication. For + // example, we do not compute r5: whenever the result of a multiplication + // belongs to r5, like a1b4, we multiply it by 19 and add the result to r0. + // + // a4b0 a3b0 a2b0 a1b0 a0b0 + + // a3b1 a2b1 a1b1 a0b1 19×a4b1 + + // a2b2 a1b2 a0b2 19×a4b2 19×a3b2 + + // a1b3 a0b3 19×a4b3 19×a3b3 19×a2b3 + + // a0b4 19×a4b4 19×a3b4 19×a2b4 19×a1b4 = + // -------------------------------------- + // r4 r3 r2 r1 r0 + // + // Finally we add up the columns into wide, overlapping limbs. + + a1_19 := a1 * 19 + a2_19 := a2 * 19 + a3_19 := a3 * 19 + a4_19 := a4 * 19 + + // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1) + r0 := mul64(a0, b0) + r0 = addMul64(r0, a1_19, b4) + r0 = addMul64(r0, a2_19, b3) + r0 = addMul64(r0, a3_19, b2) + r0 = addMul64(r0, a4_19, b1) + + // r1 = a0×b1 + a1×b0 + 19×(a2×b4 + a3×b3 + a4×b2) + r1 := mul64(a0, b1) + r1 = addMul64(r1, a1, b0) + r1 = addMul64(r1, a2_19, b4) + r1 = addMul64(r1, a3_19, b3) + r1 = addMul64(r1, a4_19, b2) + + // r2 = a0×b2 + a1×b1 + a2×b0 + 19×(a3×b4 + a4×b3) + r2 := mul64(a0, b2) + r2 = addMul64(r2, a1, b1) + r2 = addMul64(r2, a2, b0) + r2 = addMul64(r2, a3_19, b4) + r2 = addMul64(r2, a4_19, b3) + + // r3 = a0×b3 + a1×b2 + a2×b1 + a3×b0 + 19×a4×b4 + r3 := mul64(a0, b3) + r3 = addMul64(r3, a1, b2) + r3 = addMul64(r3, a2, b1) + r3 = addMul64(r3, a3, b0) + r3 = addMul64(r3, a4_19, b4) + + // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0 + r4 := mul64(a0, b4) + r4 = addMul64(r4, a1, b3) + r4 = addMul64(r4, a2, b2) + r4 = addMul64(r4, a3, b1) + r4 = addMul64(r4, a4, b0) + + // After the multiplication, we need to reduce (carry) the five coefficients + // to obtain a result with limbs that are at most slightly larger than 2⁵¹, + // to respect the Element invariant. + // + // Overall, the reduction works the same as carryPropagate, except with + // wider inputs: we take the carry for each coefficient by shifting it right + // by 51, and add it to the limb above it. The top carry is multiplied by 19 + // according to the reduction identity and added to the lowest limb. + // + // The largest coefficient (r0) will be at most 111 bits, which guarantees + // that all carries are at most 111 - 51 = 60 bits, which fits in a uint64. + // + // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1) + // r0 < 2⁵²×2⁵² + 19×(2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵²) + // r0 < (1 + 19 × 4) × 2⁵² × 2⁵² + // r0 < 2⁷ × 2⁵² × 2⁵² + // r0 < 2¹¹¹ + // + // Moreover, the top coefficient (r4) is at most 107 bits, so c4 is at most + // 56 bits, and c4 * 19 is at most 61 bits, which again fits in a uint64 and + // allows us to easily apply the reduction identity. + // + // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0 + // r4 < 5 × 2⁵² × 2⁵² + // r4 < 2¹⁰⁷ + // + + c0 := shiftRightBy51(r0) + c1 := shiftRightBy51(r1) + c2 := shiftRightBy51(r2) + c3 := shiftRightBy51(r3) + c4 := shiftRightBy51(r4) + + rr0 := r0.lo&maskLow51Bits + c4*19 + rr1 := r1.lo&maskLow51Bits + c0 + rr2 := r2.lo&maskLow51Bits + c1 + rr3 := r3.lo&maskLow51Bits + c2 + rr4 := r4.lo&maskLow51Bits + c3 + + // Now all coefficients fit into 64-bit registers but are still too large to + // be passed around as a Element. We therefore do one last carry chain, + // where the carries will be small enough to fit in the wiggle room above 2⁵¹. + *v = Element{rr0, rr1, rr2, rr3, rr4} + v.carryPropagate() +} + +func feSquareGeneric(v, a *Element) { + l0 := a.l0 + l1 := a.l1 + l2 := a.l2 + l3 := a.l3 + l4 := a.l4 + + // Squaring works precisely like multiplication above, but thanks to its + // symmetry we get to group a few terms together. + // + // l4 l3 l2 l1 l0 x + // l4 l3 l2 l1 l0 = + // ------------------------ + // l4l0 l3l0 l2l0 l1l0 l0l0 + + // l4l1 l3l1 l2l1 l1l1 l0l1 + + // l4l2 l3l2 l2l2 l1l2 l0l2 + + // l4l3 l3l3 l2l3 l1l3 l0l3 + + // l4l4 l3l4 l2l4 l1l4 l0l4 = + // ---------------------------------------------- + // r8 r7 r6 r5 r4 r3 r2 r1 r0 + // + // l4l0 l3l0 l2l0 l1l0 l0l0 + + // l3l1 l2l1 l1l1 l0l1 19×l4l1 + + // l2l2 l1l2 l0l2 19×l4l2 19×l3l2 + + // l1l3 l0l3 19×l4l3 19×l3l3 19×l2l3 + + // l0l4 19×l4l4 19×l3l4 19×l2l4 19×l1l4 = + // -------------------------------------- + // r4 r3 r2 r1 r0 + // + // With precomputed 2×, 19×, and 2×19× terms, we can compute each limb with + // only three Mul64 and four Add64, instead of five and eight. + + l0_2 := l0 * 2 + l1_2 := l1 * 2 + + l1_38 := l1 * 38 + l2_38 := l2 * 38 + l3_38 := l3 * 38 + + l3_19 := l3 * 19 + l4_19 := l4 * 19 + + // r0 = l0×l0 + 19×(l1×l4 + l2×l3 + l3×l2 + l4×l1) = l0×l0 + 19×2×(l1×l4 + l2×l3) + r0 := mul64(l0, l0) + r0 = addMul64(r0, l1_38, l4) + r0 = addMul64(r0, l2_38, l3) + + // r1 = l0×l1 + l1×l0 + 19×(l2×l4 + l3×l3 + l4×l2) = 2×l0×l1 + 19×2×l2×l4 + 19×l3×l3 + r1 := mul64(l0_2, l1) + r1 = addMul64(r1, l2_38, l4) + r1 = addMul64(r1, l3_19, l3) + + // r2 = l0×l2 + l1×l1 + l2×l0 + 19×(l3×l4 + l4×l3) = 2×l0×l2 + l1×l1 + 19×2×l3×l4 + r2 := mul64(l0_2, l2) + r2 = addMul64(r2, l1, l1) + r2 = addMul64(r2, l3_38, l4) + + // r3 = l0×l3 + l1×l2 + l2×l1 + l3×l0 + 19×l4×l4 = 2×l0×l3 + 2×l1×l2 + 19×l4×l4 + r3 := mul64(l0_2, l3) + r3 = addMul64(r3, l1_2, l2) + r3 = addMul64(r3, l4_19, l4) + + // r4 = l0×l4 + l1×l3 + l2×l2 + l3×l1 + l4×l0 = 2×l0×l4 + 2×l1×l3 + l2×l2 + r4 := mul64(l0_2, l4) + r4 = addMul64(r4, l1_2, l3) + r4 = addMul64(r4, l2, l2) + + c0 := shiftRightBy51(r0) + c1 := shiftRightBy51(r1) + c2 := shiftRightBy51(r2) + c3 := shiftRightBy51(r3) + c4 := shiftRightBy51(r4) + + rr0 := r0.lo&maskLow51Bits + c4*19 + rr1 := r1.lo&maskLow51Bits + c0 + rr2 := r2.lo&maskLow51Bits + c1 + rr3 := r3.lo&maskLow51Bits + c2 + rr4 := r4.lo&maskLow51Bits + c3 + + *v = Element{rr0, rr1, rr2, rr3, rr4} + v.carryPropagate() +} + +// carryPropagate brings the limbs below 52 bits by applying the reduction +// identity (a * 2²⁵⁵ + b = a * 19 + b) to the l4 carry. +func (v *Element) carryPropagateGeneric() *Element { + c0 := v.l0 >> 51 + c1 := v.l1 >> 51 + c2 := v.l2 >> 51 + c3 := v.l3 >> 51 + c4 := v.l4 >> 51 + + // c4 is at most 64 - 51 = 13 bits, so c4*19 is at most 18 bits, and + // the final l0 will be at most 52 bits. Similarly for the rest. + v.l0 = v.l0&maskLow51Bits + c4*19 + v.l1 = v.l1&maskLow51Bits + c0 + v.l2 = v.l2&maskLow51Bits + c1 + v.l3 = v.l3&maskLow51Bits + c2 + v.l4 = v.l4&maskLow51Bits + c3 + + return v +} diff --git a/vendor/filippo.io/edwards25519/scalar.go b/vendor/filippo.io/edwards25519/scalar.go new file mode 100644 index 00000000..3df2fb93 --- /dev/null +++ b/vendor/filippo.io/edwards25519/scalar.go @@ -0,0 +1,1030 @@ +// Copyright (c) 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package edwards25519 + +import ( + "crypto/subtle" + "encoding/binary" + "errors" +) + +// A Scalar is an integer modulo +// +// l = 2^252 + 27742317777372353535851937790883648493 +// +// which is the prime order of the edwards25519 group. +// +// This type works similarly to math/big.Int, and all arguments and +// receivers are allowed to alias. +// +// The zero value is a valid zero element. +type Scalar struct { + // s is the Scalar value in little-endian. The value is always reduced + // modulo l between operations. + s [32]byte +} + +var ( + scZero = Scalar{[32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} + + scOne = Scalar{[32]byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} + + scMinusOne = Scalar{[32]byte{236, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16}} +) + +// NewScalar returns a new zero Scalar. +func NewScalar() *Scalar { + return &Scalar{} +} + +// MultiplyAdd sets s = x * y + z mod l, and returns s. +func (s *Scalar) MultiplyAdd(x, y, z *Scalar) *Scalar { + scMulAdd(&s.s, &x.s, &y.s, &z.s) + return s +} + +// Add sets s = x + y mod l, and returns s. +func (s *Scalar) Add(x, y *Scalar) *Scalar { + // s = 1 * x + y mod l + scMulAdd(&s.s, &scOne.s, &x.s, &y.s) + return s +} + +// Subtract sets s = x - y mod l, and returns s. +func (s *Scalar) Subtract(x, y *Scalar) *Scalar { + // s = -1 * y + x mod l + scMulAdd(&s.s, &scMinusOne.s, &y.s, &x.s) + return s +} + +// Negate sets s = -x mod l, and returns s. +func (s *Scalar) Negate(x *Scalar) *Scalar { + // s = -1 * x + 0 mod l + scMulAdd(&s.s, &scMinusOne.s, &x.s, &scZero.s) + return s +} + +// Multiply sets s = x * y mod l, and returns s. +func (s *Scalar) Multiply(x, y *Scalar) *Scalar { + // s = x * y + 0 mod l + scMulAdd(&s.s, &x.s, &y.s, &scZero.s) + return s +} + +// Set sets s = x, and returns s. +func (s *Scalar) Set(x *Scalar) *Scalar { + *s = *x + return s +} + +// SetUniformBytes sets s = x mod l, where x is a 64-byte little-endian integer. +// If x is not of the right length, SetUniformBytes returns nil and an error, +// and the receiver is unchanged. +// +// SetUniformBytes can be used to set s to an uniformly distributed value given +// 64 uniformly distributed random bytes. +func (s *Scalar) SetUniformBytes(x []byte) (*Scalar, error) { + if len(x) != 64 { + return nil, errors.New("edwards25519: invalid SetUniformBytes input length") + } + var wideBytes [64]byte + copy(wideBytes[:], x[:]) + scReduce(&s.s, &wideBytes) + return s, nil +} + +// SetCanonicalBytes sets s = x, where x is a 32-byte little-endian encoding of +// s, and returns s. If x is not a canonical encoding of s, SetCanonicalBytes +// returns nil and an error, and the receiver is unchanged. +func (s *Scalar) SetCanonicalBytes(x []byte) (*Scalar, error) { + if len(x) != 32 { + return nil, errors.New("invalid scalar length") + } + ss := &Scalar{} + copy(ss.s[:], x) + if !isReduced(ss) { + return nil, errors.New("invalid scalar encoding") + } + s.s = ss.s + return s, nil +} + +// isReduced returns whether the given scalar is reduced modulo l. +func isReduced(s *Scalar) bool { + for i := len(s.s) - 1; i >= 0; i-- { + switch { + case s.s[i] > scMinusOne.s[i]: + return false + case s.s[i] < scMinusOne.s[i]: + return true + } + } + return true +} + +// SetBytesWithClamping applies the buffer pruning described in RFC 8032, +// Section 5.1.5 (also known as clamping) and sets s to the result. The input +// must be 32 bytes, and it is not modified. If x is not of the right length, +// SetBytesWithClamping returns nil and an error, and the receiver is unchanged. +// +// Note that since Scalar values are always reduced modulo the prime order of +// the curve, the resulting value will not preserve any of the cofactor-clearing +// properties that clamping is meant to provide. It will however work as +// expected as long as it is applied to points on the prime order subgroup, like +// in Ed25519. In fact, it is lost to history why RFC 8032 adopted the +// irrelevant RFC 7748 clamping, but it is now required for compatibility. +func (s *Scalar) SetBytesWithClamping(x []byte) (*Scalar, error) { + // The description above omits the purpose of the high bits of the clamping + // for brevity, but those are also lost to reductions, and are also + // irrelevant to edwards25519 as they protect against a specific + // implementation bug that was once observed in a generic Montgomery ladder. + if len(x) != 32 { + return nil, errors.New("edwards25519: invalid SetBytesWithClamping input length") + } + var wideBytes [64]byte + copy(wideBytes[:], x[:]) + wideBytes[0] &= 248 + wideBytes[31] &= 63 + wideBytes[31] |= 64 + scReduce(&s.s, &wideBytes) + return s, nil +} + +// Bytes returns the canonical 32-byte little-endian encoding of s. +func (s *Scalar) Bytes() []byte { + buf := make([]byte, 32) + copy(buf, s.s[:]) + return buf +} + +// Equal returns 1 if s and t are equal, and 0 otherwise. +func (s *Scalar) Equal(t *Scalar) int { + return subtle.ConstantTimeCompare(s.s[:], t.s[:]) +} + +// scMulAdd and scReduce are ported from the public domain, “ref10” +// implementation of ed25519 from SUPERCOP. + +func load3(in []byte) int64 { + r := int64(in[0]) + r |= int64(in[1]) << 8 + r |= int64(in[2]) << 16 + return r +} + +func load4(in []byte) int64 { + r := int64(in[0]) + r |= int64(in[1]) << 8 + r |= int64(in[2]) << 16 + r |= int64(in[3]) << 24 + return r +} + +// Input: +// a[0]+256*a[1]+...+256^31*a[31] = a +// b[0]+256*b[1]+...+256^31*b[31] = b +// c[0]+256*c[1]+...+256^31*c[31] = c +// +// Output: +// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l +// where l = 2^252 + 27742317777372353535851937790883648493. +func scMulAdd(s, a, b, c *[32]byte) { + a0 := 2097151 & load3(a[:]) + a1 := 2097151 & (load4(a[2:]) >> 5) + a2 := 2097151 & (load3(a[5:]) >> 2) + a3 := 2097151 & (load4(a[7:]) >> 7) + a4 := 2097151 & (load4(a[10:]) >> 4) + a5 := 2097151 & (load3(a[13:]) >> 1) + a6 := 2097151 & (load4(a[15:]) >> 6) + a7 := 2097151 & (load3(a[18:]) >> 3) + a8 := 2097151 & load3(a[21:]) + a9 := 2097151 & (load4(a[23:]) >> 5) + a10 := 2097151 & (load3(a[26:]) >> 2) + a11 := (load4(a[28:]) >> 7) + b0 := 2097151 & load3(b[:]) + b1 := 2097151 & (load4(b[2:]) >> 5) + b2 := 2097151 & (load3(b[5:]) >> 2) + b3 := 2097151 & (load4(b[7:]) >> 7) + b4 := 2097151 & (load4(b[10:]) >> 4) + b5 := 2097151 & (load3(b[13:]) >> 1) + b6 := 2097151 & (load4(b[15:]) >> 6) + b7 := 2097151 & (load3(b[18:]) >> 3) + b8 := 2097151 & load3(b[21:]) + b9 := 2097151 & (load4(b[23:]) >> 5) + b10 := 2097151 & (load3(b[26:]) >> 2) + b11 := (load4(b[28:]) >> 7) + c0 := 2097151 & load3(c[:]) + c1 := 2097151 & (load4(c[2:]) >> 5) + c2 := 2097151 & (load3(c[5:]) >> 2) + c3 := 2097151 & (load4(c[7:]) >> 7) + c4 := 2097151 & (load4(c[10:]) >> 4) + c5 := 2097151 & (load3(c[13:]) >> 1) + c6 := 2097151 & (load4(c[15:]) >> 6) + c7 := 2097151 & (load3(c[18:]) >> 3) + c8 := 2097151 & load3(c[21:]) + c9 := 2097151 & (load4(c[23:]) >> 5) + c10 := 2097151 & (load3(c[26:]) >> 2) + c11 := (load4(c[28:]) >> 7) + var carry [23]int64 + + s0 := c0 + a0*b0 + s1 := c1 + a0*b1 + a1*b0 + s2 := c2 + a0*b2 + a1*b1 + a2*b0 + s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0 + s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0 + s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0 + s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0 + s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0 + s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0 + s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0 + s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0 + s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0 + s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1 + s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2 + s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3 + s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4 + s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5 + s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6 + s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7 + s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8 + s20 := a9*b11 + a10*b10 + a11*b9 + s21 := a10*b11 + a11*b10 + s22 := a11 * b11 + s23 := int64(0) + + carry[0] = (s0 + (1 << 20)) >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[2] = (s2 + (1 << 20)) >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[4] = (s4 + (1 << 20)) >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[6] = (s6 + (1 << 20)) >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[8] = (s8 + (1 << 20)) >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[10] = (s10 + (1 << 20)) >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + carry[12] = (s12 + (1 << 20)) >> 21 + s13 += carry[12] + s12 -= carry[12] << 21 + carry[14] = (s14 + (1 << 20)) >> 21 + s15 += carry[14] + s14 -= carry[14] << 21 + carry[16] = (s16 + (1 << 20)) >> 21 + s17 += carry[16] + s16 -= carry[16] << 21 + carry[18] = (s18 + (1 << 20)) >> 21 + s19 += carry[18] + s18 -= carry[18] << 21 + carry[20] = (s20 + (1 << 20)) >> 21 + s21 += carry[20] + s20 -= carry[20] << 21 + carry[22] = (s22 + (1 << 20)) >> 21 + s23 += carry[22] + s22 -= carry[22] << 21 + + carry[1] = (s1 + (1 << 20)) >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[3] = (s3 + (1 << 20)) >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[5] = (s5 + (1 << 20)) >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[7] = (s7 + (1 << 20)) >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[9] = (s9 + (1 << 20)) >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[11] = (s11 + (1 << 20)) >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + carry[13] = (s13 + (1 << 20)) >> 21 + s14 += carry[13] + s13 -= carry[13] << 21 + carry[15] = (s15 + (1 << 20)) >> 21 + s16 += carry[15] + s15 -= carry[15] << 21 + carry[17] = (s17 + (1 << 20)) >> 21 + s18 += carry[17] + s17 -= carry[17] << 21 + carry[19] = (s19 + (1 << 20)) >> 21 + s20 += carry[19] + s19 -= carry[19] << 21 + carry[21] = (s21 + (1 << 20)) >> 21 + s22 += carry[21] + s21 -= carry[21] << 21 + + s11 += s23 * 666643 + s12 += s23 * 470296 + s13 += s23 * 654183 + s14 -= s23 * 997805 + s15 += s23 * 136657 + s16 -= s23 * 683901 + s23 = 0 + + s10 += s22 * 666643 + s11 += s22 * 470296 + s12 += s22 * 654183 + s13 -= s22 * 997805 + s14 += s22 * 136657 + s15 -= s22 * 683901 + s22 = 0 + + s9 += s21 * 666643 + s10 += s21 * 470296 + s11 += s21 * 654183 + s12 -= s21 * 997805 + s13 += s21 * 136657 + s14 -= s21 * 683901 + s21 = 0 + + s8 += s20 * 666643 + s9 += s20 * 470296 + s10 += s20 * 654183 + s11 -= s20 * 997805 + s12 += s20 * 136657 + s13 -= s20 * 683901 + s20 = 0 + + s7 += s19 * 666643 + s8 += s19 * 470296 + s9 += s19 * 654183 + s10 -= s19 * 997805 + s11 += s19 * 136657 + s12 -= s19 * 683901 + s19 = 0 + + s6 += s18 * 666643 + s7 += s18 * 470296 + s8 += s18 * 654183 + s9 -= s18 * 997805 + s10 += s18 * 136657 + s11 -= s18 * 683901 + s18 = 0 + + carry[6] = (s6 + (1 << 20)) >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[8] = (s8 + (1 << 20)) >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[10] = (s10 + (1 << 20)) >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + carry[12] = (s12 + (1 << 20)) >> 21 + s13 += carry[12] + s12 -= carry[12] << 21 + carry[14] = (s14 + (1 << 20)) >> 21 + s15 += carry[14] + s14 -= carry[14] << 21 + carry[16] = (s16 + (1 << 20)) >> 21 + s17 += carry[16] + s16 -= carry[16] << 21 + + carry[7] = (s7 + (1 << 20)) >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[9] = (s9 + (1 << 20)) >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[11] = (s11 + (1 << 20)) >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + carry[13] = (s13 + (1 << 20)) >> 21 + s14 += carry[13] + s13 -= carry[13] << 21 + carry[15] = (s15 + (1 << 20)) >> 21 + s16 += carry[15] + s15 -= carry[15] << 21 + + s5 += s17 * 666643 + s6 += s17 * 470296 + s7 += s17 * 654183 + s8 -= s17 * 997805 + s9 += s17 * 136657 + s10 -= s17 * 683901 + s17 = 0 + + s4 += s16 * 666643 + s5 += s16 * 470296 + s6 += s16 * 654183 + s7 -= s16 * 997805 + s8 += s16 * 136657 + s9 -= s16 * 683901 + s16 = 0 + + s3 += s15 * 666643 + s4 += s15 * 470296 + s5 += s15 * 654183 + s6 -= s15 * 997805 + s7 += s15 * 136657 + s8 -= s15 * 683901 + s15 = 0 + + s2 += s14 * 666643 + s3 += s14 * 470296 + s4 += s14 * 654183 + s5 -= s14 * 997805 + s6 += s14 * 136657 + s7 -= s14 * 683901 + s14 = 0 + + s1 += s13 * 666643 + s2 += s13 * 470296 + s3 += s13 * 654183 + s4 -= s13 * 997805 + s5 += s13 * 136657 + s6 -= s13 * 683901 + s13 = 0 + + s0 += s12 * 666643 + s1 += s12 * 470296 + s2 += s12 * 654183 + s3 -= s12 * 997805 + s4 += s12 * 136657 + s5 -= s12 * 683901 + s12 = 0 + + carry[0] = (s0 + (1 << 20)) >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[2] = (s2 + (1 << 20)) >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[4] = (s4 + (1 << 20)) >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[6] = (s6 + (1 << 20)) >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[8] = (s8 + (1 << 20)) >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[10] = (s10 + (1 << 20)) >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + + carry[1] = (s1 + (1 << 20)) >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[3] = (s3 + (1 << 20)) >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[5] = (s5 + (1 << 20)) >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[7] = (s7 + (1 << 20)) >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[9] = (s9 + (1 << 20)) >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[11] = (s11 + (1 << 20)) >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + + s0 += s12 * 666643 + s1 += s12 * 470296 + s2 += s12 * 654183 + s3 -= s12 * 997805 + s4 += s12 * 136657 + s5 -= s12 * 683901 + s12 = 0 + + carry[0] = s0 >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[1] = s1 >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[2] = s2 >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[3] = s3 >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[4] = s4 >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[5] = s5 >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[6] = s6 >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[7] = s7 >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[8] = s8 >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[9] = s9 >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[10] = s10 >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + carry[11] = s11 >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + + s0 += s12 * 666643 + s1 += s12 * 470296 + s2 += s12 * 654183 + s3 -= s12 * 997805 + s4 += s12 * 136657 + s5 -= s12 * 683901 + s12 = 0 + + carry[0] = s0 >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[1] = s1 >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[2] = s2 >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[3] = s3 >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[4] = s4 >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[5] = s5 >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[6] = s6 >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[7] = s7 >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[8] = s8 >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[9] = s9 >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[10] = s10 >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + + s[0] = byte(s0 >> 0) + s[1] = byte(s0 >> 8) + s[2] = byte((s0 >> 16) | (s1 << 5)) + s[3] = byte(s1 >> 3) + s[4] = byte(s1 >> 11) + s[5] = byte((s1 >> 19) | (s2 << 2)) + s[6] = byte(s2 >> 6) + s[7] = byte((s2 >> 14) | (s3 << 7)) + s[8] = byte(s3 >> 1) + s[9] = byte(s3 >> 9) + s[10] = byte((s3 >> 17) | (s4 << 4)) + s[11] = byte(s4 >> 4) + s[12] = byte(s4 >> 12) + s[13] = byte((s4 >> 20) | (s5 << 1)) + s[14] = byte(s5 >> 7) + s[15] = byte((s5 >> 15) | (s6 << 6)) + s[16] = byte(s6 >> 2) + s[17] = byte(s6 >> 10) + s[18] = byte((s6 >> 18) | (s7 << 3)) + s[19] = byte(s7 >> 5) + s[20] = byte(s7 >> 13) + s[21] = byte(s8 >> 0) + s[22] = byte(s8 >> 8) + s[23] = byte((s8 >> 16) | (s9 << 5)) + s[24] = byte(s9 >> 3) + s[25] = byte(s9 >> 11) + s[26] = byte((s9 >> 19) | (s10 << 2)) + s[27] = byte(s10 >> 6) + s[28] = byte((s10 >> 14) | (s11 << 7)) + s[29] = byte(s11 >> 1) + s[30] = byte(s11 >> 9) + s[31] = byte(s11 >> 17) +} + +// Input: +// s[0]+256*s[1]+...+256^63*s[63] = s +// +// Output: +// s[0]+256*s[1]+...+256^31*s[31] = s mod l +// where l = 2^252 + 27742317777372353535851937790883648493. +func scReduce(out *[32]byte, s *[64]byte) { + s0 := 2097151 & load3(s[:]) + s1 := 2097151 & (load4(s[2:]) >> 5) + s2 := 2097151 & (load3(s[5:]) >> 2) + s3 := 2097151 & (load4(s[7:]) >> 7) + s4 := 2097151 & (load4(s[10:]) >> 4) + s5 := 2097151 & (load3(s[13:]) >> 1) + s6 := 2097151 & (load4(s[15:]) >> 6) + s7 := 2097151 & (load3(s[18:]) >> 3) + s8 := 2097151 & load3(s[21:]) + s9 := 2097151 & (load4(s[23:]) >> 5) + s10 := 2097151 & (load3(s[26:]) >> 2) + s11 := 2097151 & (load4(s[28:]) >> 7) + s12 := 2097151 & (load4(s[31:]) >> 4) + s13 := 2097151 & (load3(s[34:]) >> 1) + s14 := 2097151 & (load4(s[36:]) >> 6) + s15 := 2097151 & (load3(s[39:]) >> 3) + s16 := 2097151 & load3(s[42:]) + s17 := 2097151 & (load4(s[44:]) >> 5) + s18 := 2097151 & (load3(s[47:]) >> 2) + s19 := 2097151 & (load4(s[49:]) >> 7) + s20 := 2097151 & (load4(s[52:]) >> 4) + s21 := 2097151 & (load3(s[55:]) >> 1) + s22 := 2097151 & (load4(s[57:]) >> 6) + s23 := (load4(s[60:]) >> 3) + + s11 += s23 * 666643 + s12 += s23 * 470296 + s13 += s23 * 654183 + s14 -= s23 * 997805 + s15 += s23 * 136657 + s16 -= s23 * 683901 + s23 = 0 + + s10 += s22 * 666643 + s11 += s22 * 470296 + s12 += s22 * 654183 + s13 -= s22 * 997805 + s14 += s22 * 136657 + s15 -= s22 * 683901 + s22 = 0 + + s9 += s21 * 666643 + s10 += s21 * 470296 + s11 += s21 * 654183 + s12 -= s21 * 997805 + s13 += s21 * 136657 + s14 -= s21 * 683901 + s21 = 0 + + s8 += s20 * 666643 + s9 += s20 * 470296 + s10 += s20 * 654183 + s11 -= s20 * 997805 + s12 += s20 * 136657 + s13 -= s20 * 683901 + s20 = 0 + + s7 += s19 * 666643 + s8 += s19 * 470296 + s9 += s19 * 654183 + s10 -= s19 * 997805 + s11 += s19 * 136657 + s12 -= s19 * 683901 + s19 = 0 + + s6 += s18 * 666643 + s7 += s18 * 470296 + s8 += s18 * 654183 + s9 -= s18 * 997805 + s10 += s18 * 136657 + s11 -= s18 * 683901 + s18 = 0 + + var carry [17]int64 + + carry[6] = (s6 + (1 << 20)) >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[8] = (s8 + (1 << 20)) >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[10] = (s10 + (1 << 20)) >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + carry[12] = (s12 + (1 << 20)) >> 21 + s13 += carry[12] + s12 -= carry[12] << 21 + carry[14] = (s14 + (1 << 20)) >> 21 + s15 += carry[14] + s14 -= carry[14] << 21 + carry[16] = (s16 + (1 << 20)) >> 21 + s17 += carry[16] + s16 -= carry[16] << 21 + + carry[7] = (s7 + (1 << 20)) >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[9] = (s9 + (1 << 20)) >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[11] = (s11 + (1 << 20)) >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + carry[13] = (s13 + (1 << 20)) >> 21 + s14 += carry[13] + s13 -= carry[13] << 21 + carry[15] = (s15 + (1 << 20)) >> 21 + s16 += carry[15] + s15 -= carry[15] << 21 + + s5 += s17 * 666643 + s6 += s17 * 470296 + s7 += s17 * 654183 + s8 -= s17 * 997805 + s9 += s17 * 136657 + s10 -= s17 * 683901 + s17 = 0 + + s4 += s16 * 666643 + s5 += s16 * 470296 + s6 += s16 * 654183 + s7 -= s16 * 997805 + s8 += s16 * 136657 + s9 -= s16 * 683901 + s16 = 0 + + s3 += s15 * 666643 + s4 += s15 * 470296 + s5 += s15 * 654183 + s6 -= s15 * 997805 + s7 += s15 * 136657 + s8 -= s15 * 683901 + s15 = 0 + + s2 += s14 * 666643 + s3 += s14 * 470296 + s4 += s14 * 654183 + s5 -= s14 * 997805 + s6 += s14 * 136657 + s7 -= s14 * 683901 + s14 = 0 + + s1 += s13 * 666643 + s2 += s13 * 470296 + s3 += s13 * 654183 + s4 -= s13 * 997805 + s5 += s13 * 136657 + s6 -= s13 * 683901 + s13 = 0 + + s0 += s12 * 666643 + s1 += s12 * 470296 + s2 += s12 * 654183 + s3 -= s12 * 997805 + s4 += s12 * 136657 + s5 -= s12 * 683901 + s12 = 0 + + carry[0] = (s0 + (1 << 20)) >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[2] = (s2 + (1 << 20)) >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[4] = (s4 + (1 << 20)) >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[6] = (s6 + (1 << 20)) >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[8] = (s8 + (1 << 20)) >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[10] = (s10 + (1 << 20)) >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + + carry[1] = (s1 + (1 << 20)) >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[3] = (s3 + (1 << 20)) >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[5] = (s5 + (1 << 20)) >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[7] = (s7 + (1 << 20)) >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[9] = (s9 + (1 << 20)) >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[11] = (s11 + (1 << 20)) >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + + s0 += s12 * 666643 + s1 += s12 * 470296 + s2 += s12 * 654183 + s3 -= s12 * 997805 + s4 += s12 * 136657 + s5 -= s12 * 683901 + s12 = 0 + + carry[0] = s0 >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[1] = s1 >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[2] = s2 >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[3] = s3 >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[4] = s4 >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[5] = s5 >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[6] = s6 >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[7] = s7 >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[8] = s8 >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[9] = s9 >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[10] = s10 >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + carry[11] = s11 >> 21 + s12 += carry[11] + s11 -= carry[11] << 21 + + s0 += s12 * 666643 + s1 += s12 * 470296 + s2 += s12 * 654183 + s3 -= s12 * 997805 + s4 += s12 * 136657 + s5 -= s12 * 683901 + s12 = 0 + + carry[0] = s0 >> 21 + s1 += carry[0] + s0 -= carry[0] << 21 + carry[1] = s1 >> 21 + s2 += carry[1] + s1 -= carry[1] << 21 + carry[2] = s2 >> 21 + s3 += carry[2] + s2 -= carry[2] << 21 + carry[3] = s3 >> 21 + s4 += carry[3] + s3 -= carry[3] << 21 + carry[4] = s4 >> 21 + s5 += carry[4] + s4 -= carry[4] << 21 + carry[5] = s5 >> 21 + s6 += carry[5] + s5 -= carry[5] << 21 + carry[6] = s6 >> 21 + s7 += carry[6] + s6 -= carry[6] << 21 + carry[7] = s7 >> 21 + s8 += carry[7] + s7 -= carry[7] << 21 + carry[8] = s8 >> 21 + s9 += carry[8] + s8 -= carry[8] << 21 + carry[9] = s9 >> 21 + s10 += carry[9] + s9 -= carry[9] << 21 + carry[10] = s10 >> 21 + s11 += carry[10] + s10 -= carry[10] << 21 + + out[0] = byte(s0 >> 0) + out[1] = byte(s0 >> 8) + out[2] = byte((s0 >> 16) | (s1 << 5)) + out[3] = byte(s1 >> 3) + out[4] = byte(s1 >> 11) + out[5] = byte((s1 >> 19) | (s2 << 2)) + out[6] = byte(s2 >> 6) + out[7] = byte((s2 >> 14) | (s3 << 7)) + out[8] = byte(s3 >> 1) + out[9] = byte(s3 >> 9) + out[10] = byte((s3 >> 17) | (s4 << 4)) + out[11] = byte(s4 >> 4) + out[12] = byte(s4 >> 12) + out[13] = byte((s4 >> 20) | (s5 << 1)) + out[14] = byte(s5 >> 7) + out[15] = byte((s5 >> 15) | (s6 << 6)) + out[16] = byte(s6 >> 2) + out[17] = byte(s6 >> 10) + out[18] = byte((s6 >> 18) | (s7 << 3)) + out[19] = byte(s7 >> 5) + out[20] = byte(s7 >> 13) + out[21] = byte(s8 >> 0) + out[22] = byte(s8 >> 8) + out[23] = byte((s8 >> 16) | (s9 << 5)) + out[24] = byte(s9 >> 3) + out[25] = byte(s9 >> 11) + out[26] = byte((s9 >> 19) | (s10 << 2)) + out[27] = byte(s10 >> 6) + out[28] = byte((s10 >> 14) | (s11 << 7)) + out[29] = byte(s11 >> 1) + out[30] = byte(s11 >> 9) + out[31] = byte(s11 >> 17) +} + +// nonAdjacentForm computes a width-w non-adjacent form for this scalar. +// +// w must be between 2 and 8, or nonAdjacentForm will panic. +func (s *Scalar) nonAdjacentForm(w uint) [256]int8 { + // This implementation is adapted from the one + // in curve25519-dalek and is documented there: + // https://github.com/dalek-cryptography/curve25519-dalek/blob/f630041af28e9a405255f98a8a93adca18e4315b/src/scalar.rs#L800-L871 + if s.s[31] > 127 { + panic("scalar has high bit set illegally") + } + if w < 2 { + panic("w must be at least 2 by the definition of NAF") + } else if w > 8 { + panic("NAF digits must fit in int8") + } + + var naf [256]int8 + var digits [5]uint64 + + for i := 0; i < 4; i++ { + digits[i] = binary.LittleEndian.Uint64(s.s[i*8:]) + } + + width := uint64(1 << w) + windowMask := uint64(width - 1) + + pos := uint(0) + carry := uint64(0) + for pos < 256 { + indexU64 := pos / 64 + indexBit := pos % 64 + var bitBuf uint64 + if indexBit < 64-w { + // This window's bits are contained in a single u64 + bitBuf = digits[indexU64] >> indexBit + } else { + // Combine the current 64 bits with bits from the next 64 + bitBuf = (digits[indexU64] >> indexBit) | (digits[1+indexU64] << (64 - indexBit)) + } + + // Add carry into the current window + window := carry + (bitBuf & windowMask) + + if window&1 == 0 { + // If the window value is even, preserve the carry and continue. + // Why is the carry preserved? + // If carry == 0 and window & 1 == 0, + // then the next carry should be 0 + // If carry == 1 and window & 1 == 0, + // then bit_buf & 1 == 1 so the next carry should be 1 + pos += 1 + continue + } + + if window < width/2 { + carry = 0 + naf[pos] = int8(window) + } else { + carry = 1 + naf[pos] = int8(window) - int8(width) + } + + pos += w + } + return naf +} + +func (s *Scalar) signedRadix16() [64]int8 { + if s.s[31] > 127 { + panic("scalar has high bit set illegally") + } + + var digits [64]int8 + + // Compute unsigned radix-16 digits: + for i := 0; i < 32; i++ { + digits[2*i] = int8(s.s[i] & 15) + digits[2*i+1] = int8((s.s[i] >> 4) & 15) + } + + // Recenter coefficients: + for i := 0; i < 63; i++ { + carry := (digits[i] + 8) >> 4 + digits[i] -= carry << 4 + digits[i+1] += carry + } + + return digits +} diff --git a/vendor/filippo.io/edwards25519/scalarmult.go b/vendor/filippo.io/edwards25519/scalarmult.go new file mode 100644 index 00000000..f7ca3cef --- /dev/null +++ b/vendor/filippo.io/edwards25519/scalarmult.go @@ -0,0 +1,214 @@ +// Copyright (c) 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package edwards25519 + +import "sync" + +// basepointTable is a set of 32 affineLookupTables, where table i is generated +// from 256i * basepoint. It is precomputed the first time it's used. +func basepointTable() *[32]affineLookupTable { + basepointTablePrecomp.initOnce.Do(func() { + p := NewGeneratorPoint() + for i := 0; i < 32; i++ { + basepointTablePrecomp.table[i].FromP3(p) + for j := 0; j < 8; j++ { + p.Add(p, p) + } + } + }) + return &basepointTablePrecomp.table +} + +var basepointTablePrecomp struct { + table [32]affineLookupTable + initOnce sync.Once +} + +// ScalarBaseMult sets v = x * B, where B is the canonical generator, and +// returns v. +// +// The scalar multiplication is done in constant time. +func (v *Point) ScalarBaseMult(x *Scalar) *Point { + basepointTable := basepointTable() + + // Write x = sum(x_i * 16^i) so x*B = sum( B*x_i*16^i ) + // as described in the Ed25519 paper + // + // Group even and odd coefficients + // x*B = x_0*16^0*B + x_2*16^2*B + ... + x_62*16^62*B + // + x_1*16^1*B + x_3*16^3*B + ... + x_63*16^63*B + // x*B = x_0*16^0*B + x_2*16^2*B + ... + x_62*16^62*B + // + 16*( x_1*16^0*B + x_3*16^2*B + ... + x_63*16^62*B) + // + // We use a lookup table for each i to get x_i*16^(2*i)*B + // and do four doublings to multiply by 16. + digits := x.signedRadix16() + + multiple := &affineCached{} + tmp1 := &projP1xP1{} + tmp2 := &projP2{} + + // Accumulate the odd components first + v.Set(NewIdentityPoint()) + for i := 1; i < 64; i += 2 { + basepointTable[i/2].SelectInto(multiple, digits[i]) + tmp1.AddAffine(v, multiple) + v.fromP1xP1(tmp1) + } + + // Multiply by 16 + tmp2.FromP3(v) // tmp2 = v in P2 coords + tmp1.Double(tmp2) // tmp1 = 2*v in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 2*v in P2 coords + tmp1.Double(tmp2) // tmp1 = 4*v in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 4*v in P2 coords + tmp1.Double(tmp2) // tmp1 = 8*v in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 8*v in P2 coords + tmp1.Double(tmp2) // tmp1 = 16*v in P1xP1 coords + v.fromP1xP1(tmp1) // now v = 16*(odd components) + + // Accumulate the even components + for i := 0; i < 64; i += 2 { + basepointTable[i/2].SelectInto(multiple, digits[i]) + tmp1.AddAffine(v, multiple) + v.fromP1xP1(tmp1) + } + + return v +} + +// ScalarMult sets v = x * q, and returns v. +// +// The scalar multiplication is done in constant time. +func (v *Point) ScalarMult(x *Scalar, q *Point) *Point { + checkInitialized(q) + + var table projLookupTable + table.FromP3(q) + + // Write x = sum(x_i * 16^i) + // so x*Q = sum( Q*x_i*16^i ) + // = Q*x_0 + 16*(Q*x_1 + 16*( ... + Q*x_63) ... ) + // <------compute inside out--------- + // + // We use the lookup table to get the x_i*Q values + // and do four doublings to compute 16*Q + digits := x.signedRadix16() + + // Unwrap first loop iteration to save computing 16*identity + multiple := &projCached{} + tmp1 := &projP1xP1{} + tmp2 := &projP2{} + table.SelectInto(multiple, digits[63]) + + v.Set(NewIdentityPoint()) + tmp1.Add(v, multiple) // tmp1 = x_63*Q in P1xP1 coords + for i := 62; i >= 0; i-- { + tmp2.FromP1xP1(tmp1) // tmp2 = (prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 2*(prev) in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 2*(prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 4*(prev) in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 4*(prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 8*(prev) in P1xP1 coords + tmp2.FromP1xP1(tmp1) // tmp2 = 8*(prev) in P2 coords + tmp1.Double(tmp2) // tmp1 = 16*(prev) in P1xP1 coords + v.fromP1xP1(tmp1) // v = 16*(prev) in P3 coords + table.SelectInto(multiple, digits[i]) + tmp1.Add(v, multiple) // tmp1 = x_i*Q + 16*(prev) in P1xP1 coords + } + v.fromP1xP1(tmp1) + return v +} + +// basepointNafTable is the nafLookupTable8 for the basepoint. +// It is precomputed the first time it's used. +func basepointNafTable() *nafLookupTable8 { + basepointNafTablePrecomp.initOnce.Do(func() { + basepointNafTablePrecomp.table.FromP3(NewGeneratorPoint()) + }) + return &basepointNafTablePrecomp.table +} + +var basepointNafTablePrecomp struct { + table nafLookupTable8 + initOnce sync.Once +} + +// VarTimeDoubleScalarBaseMult sets v = a * A + b * B, where B is the canonical +// generator, and returns v. +// +// Execution time depends on the inputs. +func (v *Point) VarTimeDoubleScalarBaseMult(a *Scalar, A *Point, b *Scalar) *Point { + checkInitialized(A) + + // Similarly to the single variable-base approach, we compute + // digits and use them with a lookup table. However, because + // we are allowed to do variable-time operations, we don't + // need constant-time lookups or constant-time digit + // computations. + // + // So we use a non-adjacent form of some width w instead of + // radix 16. This is like a binary representation (one digit + // for each binary place) but we allow the digits to grow in + // magnitude up to 2^{w-1} so that the nonzero digits are as + // sparse as possible. Intuitively, this "condenses" the + // "mass" of the scalar onto sparse coefficients (meaning + // fewer additions). + + basepointNafTable := basepointNafTable() + var aTable nafLookupTable5 + aTable.FromP3(A) + // Because the basepoint is fixed, we can use a wider NAF + // corresponding to a bigger table. + aNaf := a.nonAdjacentForm(5) + bNaf := b.nonAdjacentForm(8) + + // Find the first nonzero coefficient. + i := 255 + for j := i; j >= 0; j-- { + if aNaf[j] != 0 || bNaf[j] != 0 { + break + } + } + + multA := &projCached{} + multB := &affineCached{} + tmp1 := &projP1xP1{} + tmp2 := &projP2{} + tmp2.Zero() + + // Move from high to low bits, doubling the accumulator + // at each iteration and checking whether there is a nonzero + // coefficient to look up a multiple of. + for ; i >= 0; i-- { + tmp1.Double(tmp2) + + // Only update v if we have a nonzero coeff to add in. + if aNaf[i] > 0 { + v.fromP1xP1(tmp1) + aTable.SelectInto(multA, aNaf[i]) + tmp1.Add(v, multA) + } else if aNaf[i] < 0 { + v.fromP1xP1(tmp1) + aTable.SelectInto(multA, -aNaf[i]) + tmp1.Sub(v, multA) + } + + if bNaf[i] > 0 { + v.fromP1xP1(tmp1) + basepointNafTable.SelectInto(multB, bNaf[i]) + tmp1.AddAffine(v, multB) + } else if bNaf[i] < 0 { + v.fromP1xP1(tmp1) + basepointNafTable.SelectInto(multB, -bNaf[i]) + tmp1.SubAffine(v, multB) + } + + tmp2.FromP1xP1(tmp1) + } + + v.fromP2(tmp2) + return v +} diff --git a/vendor/filippo.io/edwards25519/tables.go b/vendor/filippo.io/edwards25519/tables.go new file mode 100644 index 00000000..beec956b --- /dev/null +++ b/vendor/filippo.io/edwards25519/tables.go @@ -0,0 +1,129 @@ +// Copyright (c) 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package edwards25519 + +import ( + "crypto/subtle" +) + +// A dynamic lookup table for variable-base, constant-time scalar muls. +type projLookupTable struct { + points [8]projCached +} + +// A precomputed lookup table for fixed-base, constant-time scalar muls. +type affineLookupTable struct { + points [8]affineCached +} + +// A dynamic lookup table for variable-base, variable-time scalar muls. +type nafLookupTable5 struct { + points [8]projCached +} + +// A precomputed lookup table for fixed-base, variable-time scalar muls. +type nafLookupTable8 struct { + points [64]affineCached +} + +// Constructors. + +// Builds a lookup table at runtime. Fast. +func (v *projLookupTable) FromP3(q *Point) { + // Goal: v.points[i] = (i+1)*Q, i.e., Q, 2Q, ..., 8Q + // This allows lookup of -8Q, ..., -Q, 0, Q, ..., 8Q + v.points[0].FromP3(q) + tmpP3 := Point{} + tmpP1xP1 := projP1xP1{} + for i := 0; i < 7; i++ { + // Compute (i+1)*Q as Q + i*Q and convert to a ProjCached + // This is needlessly complicated because the API has explicit + // recievers instead of creating stack objects and relying on RVO + v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.Add(q, &v.points[i]))) + } +} + +// This is not optimised for speed; fixed-base tables should be precomputed. +func (v *affineLookupTable) FromP3(q *Point) { + // Goal: v.points[i] = (i+1)*Q, i.e., Q, 2Q, ..., 8Q + // This allows lookup of -8Q, ..., -Q, 0, Q, ..., 8Q + v.points[0].FromP3(q) + tmpP3 := Point{} + tmpP1xP1 := projP1xP1{} + for i := 0; i < 7; i++ { + // Compute (i+1)*Q as Q + i*Q and convert to AffineCached + v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.AddAffine(q, &v.points[i]))) + } +} + +// Builds a lookup table at runtime. Fast. +func (v *nafLookupTable5) FromP3(q *Point) { + // Goal: v.points[i] = (2*i+1)*Q, i.e., Q, 3Q, 5Q, ..., 15Q + // This allows lookup of -15Q, ..., -3Q, -Q, 0, Q, 3Q, ..., 15Q + v.points[0].FromP3(q) + q2 := Point{} + q2.Add(q, q) + tmpP3 := Point{} + tmpP1xP1 := projP1xP1{} + for i := 0; i < 7; i++ { + v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.Add(&q2, &v.points[i]))) + } +} + +// This is not optimised for speed; fixed-base tables should be precomputed. +func (v *nafLookupTable8) FromP3(q *Point) { + v.points[0].FromP3(q) + q2 := Point{} + q2.Add(q, q) + tmpP3 := Point{} + tmpP1xP1 := projP1xP1{} + for i := 0; i < 63; i++ { + v.points[i+1].FromP3(tmpP3.fromP1xP1(tmpP1xP1.AddAffine(&q2, &v.points[i]))) + } +} + +// Selectors. + +// Set dest to x*Q, where -8 <= x <= 8, in constant time. +func (v *projLookupTable) SelectInto(dest *projCached, x int8) { + // Compute xabs = |x| + xmask := x >> 7 + xabs := uint8((x + xmask) ^ xmask) + + dest.Zero() + for j := 1; j <= 8; j++ { + // Set dest = j*Q if |x| = j + cond := subtle.ConstantTimeByteEq(xabs, uint8(j)) + dest.Select(&v.points[j-1], dest, cond) + } + // Now dest = |x|*Q, conditionally negate to get x*Q + dest.CondNeg(int(xmask & 1)) +} + +// Set dest to x*Q, where -8 <= x <= 8, in constant time. +func (v *affineLookupTable) SelectInto(dest *affineCached, x int8) { + // Compute xabs = |x| + xmask := x >> 7 + xabs := uint8((x + xmask) ^ xmask) + + dest.Zero() + for j := 1; j <= 8; j++ { + // Set dest = j*Q if |x| = j + cond := subtle.ConstantTimeByteEq(xabs, uint8(j)) + dest.Select(&v.points[j-1], dest, cond) + } + // Now dest = |x|*Q, conditionally negate to get x*Q + dest.CondNeg(int(xmask & 1)) +} + +// Given odd x with 0 < x < 2^4, return x*Q (in variable time). +func (v *nafLookupTable5) SelectInto(dest *projCached, x int8) { + *dest = v.points[x/2] +} + +// Given odd x with 0 < x < 2^7, return x*Q (in variable time). +func (v *nafLookupTable8) SelectInto(dest *affineCached, x int8) { + *dest = v.points[x/2] +} diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go index 1a9c8ab5..c90209a9 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go +++ b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go @@ -177,7 +177,7 @@ func (t Token) WillExpireIn(d time.Duration) bool { return !t.Expires().After(time.Now().Add(d)) } -//OAuthToken return the current access token +// OAuthToken return the current access token func (t *Token) OAuthToken() string { return t.AccessToken } diff --git a/vendor/github.com/Azure/go-autorest/autorest/autorest.go b/vendor/github.com/Azure/go-autorest/autorest/autorest.go index aafdf021..211c98d1 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/autorest.go +++ b/vendor/github.com/Azure/go-autorest/autorest/autorest.go @@ -6,33 +6,33 @@ generated Go code. The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending, and Responding. A typical pattern is: - req, err := Prepare(&http.Request{}, - token.WithAuthorization()) + req, err := Prepare(&http.Request{}, + token.WithAuthorization()) - resp, err := Send(req, - WithLogging(logger), - DoErrorIfStatusCode(http.StatusInternalServerError), - DoCloseIfError(), - DoRetryForAttempts(5, time.Second)) + resp, err := Send(req, + WithLogging(logger), + DoErrorIfStatusCode(http.StatusInternalServerError), + DoCloseIfError(), + DoRetryForAttempts(5, time.Second)) - err = Respond(resp, - ByDiscardingBody(), - ByClosing()) + err = Respond(resp, + ByDiscardingBody(), + ByClosing()) Each phase relies on decorators to modify and / or manage processing. Decorators may first modify and then pass the data along, pass the data first and then modify the result, or wrap themselves around passing the data (such as a logger might do). Decorators run in the order provided. For example, the following: - req, err := Prepare(&http.Request{}, - WithBaseURL("https://microsoft.com/"), - WithPath("a"), - WithPath("b"), - WithPath("c")) + req, err := Prepare(&http.Request{}, + WithBaseURL("https://microsoft.com/"), + WithPath("a"), + WithPath("b"), + WithPath("c")) will set the URL to: - https://microsoft.com/a/b/c + https://microsoft.com/a/b/c Preparers and Responders may be shared and re-used (assuming the underlying decorators support sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/auth/README.md b/vendor/github.com/Azure/go-autorest/autorest/azure/auth/README.md new file mode 100644 index 00000000..05bef8a8 --- /dev/null +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/auth/README.md @@ -0,0 +1,152 @@ +# NOTE: This module will go out of support by March 31, 2023. For authenticating with Azure AD, use module [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) instead. For help migrating from `auth` to `azidentiy` please consult the [migration guide](https://aka.ms/azsdk/go/identity/migration). General information about the retirement of this and other legacy modules can be found [here](https://azure.microsoft.com/updates/support-for-azure-sdk-libraries-that-do-not-conform-to-our-current-azure-sdk-guidelines-will-be-retired-as-of-31-march-2023/). + +## Authentication + +Typical SDK operations must be authenticated and authorized. The `autorest.Authorizer` +interface allows use of any auth style in requests, such as inserting an OAuth2 +Authorization header and bearer token received from Azure AD. + +The SDK itself provides a simple way to get an authorizer which first checks +for OAuth client credentials in environment variables and then falls back to +Azure's [Managed Service Identity]() when available, e.g. when on an Azure +VM. The following snippet from [the previous section](#use) demonstrates +this helper. + +```go +import "github.com/Azure/go-autorest/autorest/azure/auth" + +// create a VirtualNetworks client +vnetClient := network.NewVirtualNetworksClient("") + +// create an authorizer from env vars or Azure Managed Service Idenity +authorizer, err := auth.NewAuthorizerFromEnvironment() +if err != nil { + handle(err) +} + +vnetClient.Authorizer = authorizer + +// call the VirtualNetworks CreateOrUpdate API +vnetClient.CreateOrUpdate(context.Background(), +// ... +``` + +The following environment variables help determine authentication configuration: + +- `AZURE_ENVIRONMENT`: Specifies the Azure Environment to use. If not set, it + defaults to `AzurePublicCloud`. Not applicable to authentication with Managed + Service Identity (MSI). +- `AZURE_AD_RESOURCE`: Specifies the AAD resource ID to use. If not set, it + defaults to `ResourceManagerEndpoint` for operations with Azure Resource + Manager. You can also choose an alternate resource programmatically with + `auth.NewAuthorizerFromEnvironmentWithResource(resource string)`. + +### More Authentication Details + +The previous is the first and most recommended of several authentication +options offered by the SDK because it allows seamless use of both service +principals and [Azure Managed Service Identity][]. Other options are listed +below. + +> Note: If you need to create a new service principal, run `az ad sp create-for-rbac -n ""` in the +> [azure-cli](https://github.com/Azure/azure-cli). See [these +> docs](https://docs.microsoft.com/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest) +> for more info. Copy the new principal's ID, secret, and tenant ID for use in +> your app, or consider the `--sdk-auth` parameter for serialized output. + +[azure managed service identity]: https://docs.microsoft.com/azure/active-directory/msi-overview + +- The `auth.NewAuthorizerFromEnvironment()` described above creates an authorizer + from the first available of the following configuration: + + 1. **Client Credentials**: Azure AD Application ID and Secret. + + - `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate. + - `AZURE_CLIENT_ID`: Specifies the app client ID to use. + - `AZURE_CLIENT_SECRET`: Specifies the app secret to use. + + 2. **Client Certificate**: Azure AD Application ID and X.509 Certificate. + + - `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate. + - `AZURE_CLIENT_ID`: Specifies the app client ID to use. + - `AZURE_CERTIFICATE_PATH`: Specifies the certificate Path to use. + - `AZURE_CERTIFICATE_PASSWORD`: Specifies the certificate password to use. + + 3. **Resource Owner Password**: Azure AD User and Password. This grant type is *not + recommended*, use device login instead if you need interactive login. + + - `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate. + - `AZURE_CLIENT_ID`: Specifies the app client ID to use. + - `AZURE_USERNAME`: Specifies the username to use. + - `AZURE_PASSWORD`: Specifies the password to use. + + 4. **Azure Managed Service Identity**: Delegate credential management to the + platform. Requires that code is running in Azure, e.g. on a VM. All + configuration is handled by Azure. See [Azure Managed Service + Identity](https://docs.microsoft.com/azure/active-directory/msi-overview) + for more details. + +- The `auth.NewAuthorizerFromFile()` method creates an authorizer using + credentials from an auth file created by the [Azure CLI][]. Follow these + steps to utilize: + + 1. Create a service principal and output an auth file using `az ad sp create-for-rbac --sdk-auth > client_credentials.json`. + 2. Set environment variable `AZURE_AUTH_LOCATION` to the path of the saved + output file. + 3. Use the authorizer returned by `auth.NewAuthorizerFromFile()` in your + client as described above. + +- The `auth.NewAuthorizerFromCLI()` method creates an authorizer which + uses [Azure CLI][] to obtain its credentials. + + The default audience being requested is `https://management.azure.com` (Azure ARM API). + To specify your own audience, export `AZURE_AD_RESOURCE` as an evironment variable. + This is read by `auth.NewAuthorizerFromCLI()` and passed to Azure CLI to acquire the access token. + + For example, to request an access token for Azure Key Vault, export + ``` + AZURE_AD_RESOURCE="https://vault.azure.net" + ``` + +- `auth.NewAuthorizerFromCLIWithResource(AUDIENCE_URL_OR_APPLICATION_ID)` - this method is self contained and does + not require exporting environment variables. For example, to request an access token for Azure Key Vault: + ``` + auth.NewAuthorizerFromCLIWithResource("https://vault.azure.net") + ``` + + To use `NewAuthorizerFromCLI()` or `NewAuthorizerFromCLIWithResource()`, follow these steps: + + 1. Install [Azure CLI v2.0.12](https://docs.microsoft.com/cli/azure/install-azure-cli) or later. Upgrade earlier versions. + 2. Use `az login` to sign in to Azure. + + If you receive an error, use `az account get-access-token` to verify access. + + If Azure CLI is not installed to the default directory, you may receive an error + reporting that `az` cannot be found. + Use the `AzureCLIPath` environment variable to define the Azure CLI installation folder. + + If you are signed in to Azure CLI using multiple accounts or your account has + access to multiple subscriptions, you need to specify the specific subscription + to be used. To do so, use: + + ``` + az account set --subscription + ``` + + To verify the current account settings, use: + + ``` + az account list + ``` + +[azure cli]: https://github.com/Azure/azure-cli + +- Finally, you can use OAuth's [Device Flow][] by calling + `auth.NewDeviceFlowConfig()` and extracting the Authorizer as follows: + + ```go + config := auth.NewDeviceFlowConfig(clientID, tenantID) + a, err := config.Authorizer() + ``` + +[device flow]: https://oauth.net/2/device-flow/ diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/auth/auth.go b/vendor/github.com/Azure/go-autorest/autorest/azure/auth/auth.go index 2f1a9981..e97589dc 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/auth/auth.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/auth/auth.go @@ -250,6 +250,17 @@ func NewAuthorizerFromFile(resourceBaseURI string) (autorest.Authorizer, error) if err != nil { return nil, err } + return settings.GetAuthorizer(resourceBaseURI) +} + +// GetAuthorizer create an Authorizer in the following order. +// 1. Client credentials +// 2. Client certificate +// resourceBaseURI - used to determine the resource type +func (settings FileSettings) GetAuthorizer(resourceBaseURI string) (autorest.Authorizer, error) { + if resourceBaseURI == "" { + resourceBaseURI = azure.PublicCloud.ServiceManagementEndpoint + } if a, err := settings.ClientCredentialsAuthorizer(resourceBaseURI); err == nil { return a, err } @@ -559,7 +570,7 @@ func NewDeviceFlowConfig(clientID string, tenantID string) DeviceFlowConfig { } } -//AuthorizerConfig provides an authorizer from the configuration provided. +// AuthorizerConfig provides an authorizer from the configuration provided. type AuthorizerConfig interface { Authorizer() (autorest.Authorizer, error) } diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go index 1328f176..868345db 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go +++ b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go @@ -214,7 +214,7 @@ func (r Resource) String() string { // See https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource?tabs=json#resourceid. func ParseResourceID(resourceID string) (Resource, error) { - const resourceIDPatternText = `(?i)subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)` + const resourceIDPatternText = `(?i)^/subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)$` resourceIDPattern := regexp.MustCompile(resourceIDPatternText) match := resourceIDPattern.FindStringSubmatch(resourceID) diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility.go b/vendor/github.com/Azure/go-autorest/autorest/utility.go index 3467b8fa..d35b3850 100644 --- a/vendor/github.com/Azure/go-autorest/autorest/utility.go +++ b/vendor/github.com/Azure/go-autorest/autorest/utility.go @@ -60,9 +60,9 @@ func NewDecoder(encodedAs EncodedAs, r io.Reader) Decoder { // is especially useful if there is a chance the data will fail to decode. // encodedAs specifies the expected encoding, r provides the io.Reader to the data, and v // is the decoding destination. -func CopyAndDecode(encodedAs EncodedAs, r io.Reader, v interface{}) (bytes.Buffer, error) { - b := bytes.Buffer{} - return b, NewDecoder(encodedAs, io.TeeReader(r, &b)).Decode(v) +func CopyAndDecode(encodedAs EncodedAs, r io.Reader, v interface{}) (b bytes.Buffer, err error) { + err = NewDecoder(encodedAs, io.TeeReader(r, &b)).Decode(v) + return } // TeeReadCloser returns a ReadCloser that writes to w what it reads from rc. diff --git a/vendor/github.com/DataDog/appsec-internal-go/LICENSE b/vendor/github.com/DataDog/appsec-internal-go/LICENSE new file mode 100644 index 00000000..9301dd7a --- /dev/null +++ b/vendor/github.com/DataDog/appsec-internal-go/LICENSE @@ -0,0 +1,200 @@ + 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 2016-present Datadog, Inc. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/DataDog/appsec-internal-go/httpsec/client_ip.go b/vendor/github.com/DataDog/appsec-internal-go/httpsec/client_ip.go new file mode 100644 index 00000000..3761a773 --- /dev/null +++ b/vendor/github.com/DataDog/appsec-internal-go/httpsec/client_ip.go @@ -0,0 +1,126 @@ +package httpsec + +import ( + "net" + "net/textproto" + "strings" + + "github.com/DataDog/appsec-internal-go/netip" +) + +const ( + // RemoteIPTag is the tag name used for the remote HTTP request IP address. + RemoteIPTag = "network.client.ip" + // ClientIPTag is the tag name used for the client IP deduced from the HTTP + // request headers with ClientIP(). + ClientIPTag = "http.client_ip" +) + +// ClientIPTags returns the resulting Datadog span tags `http.client_ip` +// containing the client IP and `network.client.ip` containing the remote IP. +// The tags are present only if a valid ip address has been returned by +// ClientIP(). +func ClientIPTags(remoteIP, clientIP netip.Addr) (tags map[string]string) { + remoteIPValid := remoteIP.IsValid() + clientIPValid := clientIP.IsValid() + if !remoteIPValid && !clientIPValid { + return nil + } + + tags = make(map[string]string, 2) + if remoteIPValid { + tags[RemoteIPTag] = remoteIP.String() + } + if clientIPValid { + tags[ClientIPTag] = clientIP.String() + } + return tags +} + +// ClientIP returns the first public IP address found in the given headers. If +// none is present, it returns the first valid IP address present, possibly +// being a local IP address. The remote address, when valid, is used as fallback +// when no IP address has been found at all. +func ClientIP(hdrs map[string][]string, hasCanonicalHeaders bool, remoteAddr string, monitoredHeaders []string) (remoteIP, clientIP netip.Addr) { + // Walk IP-related headers + var foundIP netip.Addr +headersLoop: + for _, headerName := range monitoredHeaders { + if hasCanonicalHeaders { + headerName = textproto.CanonicalMIMEHeaderKey(headerName) + } + + headerValues, exists := hdrs[headerName] + if !exists { + continue // this monitored header is not present + } + + // Assuming a list of comma-separated IP addresses, split them and build + // the list of values to try to parse as IP addresses + var ips []string + for _, ip := range headerValues { + ips = append(ips, strings.Split(ip, ",")...) + } + + // Look for the first valid or global IP address in the comma-separated list + for _, ipstr := range ips { + ip := parseIP(strings.TrimSpace(ipstr)) + if !ip.IsValid() { + continue + } + // Replace foundIP if still not valid in order to keep the oldest + if !foundIP.IsValid() { + foundIP = ip + } + if isGlobal(ip) { + foundIP = ip + break headersLoop + } + } + } + + // Decide which IP address is the client one by starting with the remote IP + if ip := parseIP(remoteAddr); ip.IsValid() { + remoteIP = ip + clientIP = ip + } + + // The IP address found in the headers supersedes a private remote IP address. + if foundIP.IsValid() && !isGlobal(remoteIP) || isGlobal(foundIP) { + clientIP = foundIP + } + + return remoteIP, clientIP +} + +func parseIP(s string) netip.Addr { + if ip, err := netip.ParseAddr(s); err == nil { + return ip + } + if h, _, err := net.SplitHostPort(s); err == nil { + if ip, err := netip.ParseAddr(h); err == nil { + return ip + } + } + return netip.Addr{} +} + +var ipv6SpecialNetworks = [...]netip.Prefix{ + netip.MustParsePrefix("fec0::/10"), // site local +} + +func isGlobal(ip netip.Addr) bool { + // IsPrivate also checks for ipv6 ULA. + // We care to check for these addresses are not considered public, hence not global. + // See https://www.rfc-editor.org/rfc/rfc4193.txt for more details. + isGlobal := ip.IsValid() && !ip.IsPrivate() && !ip.IsLoopback() && !ip.IsLinkLocalUnicast() + if !isGlobal || !ip.Is6() { + return isGlobal + } + for _, n := range ipv6SpecialNetworks { + if n.Contains(ip) { + return false + } + } + return isGlobal +} diff --git a/vendor/github.com/DataDog/appsec-internal-go/netip/ip_default.go b/vendor/github.com/DataDog/appsec-internal-go/netip/ip_default.go new file mode 100644 index 00000000..f2906a0c --- /dev/null +++ b/vendor/github.com/DataDog/appsec-internal-go/netip/ip_default.go @@ -0,0 +1,32 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +//go:build !go1.19 +// +build !go1.19 + +package netip + +import "inet.af/netaddr" + +// Addr wraps an netaddr.IP value +type Addr = netaddr.IP + +// Prefix wraps an netaddr.IPPrefix value +type Prefix = netaddr.IPPrefix + +var ( + // ParseAddr wraps the netaddr.ParseIP function + ParseAddr = netaddr.ParseIP + // ParsePrefix wraps the netaddr.ParseIPPrefix function + ParsePrefix = netaddr.ParseIPPrefix + // MustParsePrefix wraps the netaddr.MustParseIPPrefix function + MustParsePrefix = netaddr.MustParseIPPrefix + // MustParseAddr wraps the netaddr.MustParseIP function + MustParseAddr = netaddr.MustParseIP + // IPv4 wraps the netaddr.IPv4 function + IPv4 = netaddr.IPv4 + // AddrFrom16 wraps the netaddr.IPv6Raw function + AddrFrom16 = netaddr.IPv6Raw +) diff --git a/vendor/github.com/DataDog/appsec-internal-go/netip/ip_go119.go b/vendor/github.com/DataDog/appsec-internal-go/netip/ip_go119.go new file mode 100644 index 00000000..2c185de6 --- /dev/null +++ b/vendor/github.com/DataDog/appsec-internal-go/netip/ip_go119.go @@ -0,0 +1,34 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +//go:build go1.19 +// +build go1.19 + +package netip + +import "net/netip" + +// Addr wraps a netip.Addr value +type Addr = netip.Addr + +// Prefix wraps a netip.Prefix value +type Prefix = netip.Prefix + +var ( + // ParseAddr wraps the netip.ParseAddr function + ParseAddr = netip.ParseAddr + // MustParsePrefix wraps the netip.MustParsePrefix function + MustParsePrefix = netip.MustParsePrefix + // MustParseAddr wraps the netip.MustParseAddr function + MustParseAddr = netip.MustParseAddr + // AddrFrom16 wraps the netIP.AddrFrom16 function + AddrFrom16 = netip.AddrFrom16 +) + +// IPv4 wraps the netip.AddrFrom4 function +func IPv4(a, b, c, d byte) Addr { + e := [4]byte{a, b, c, d} + return netip.AddrFrom4(e) +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/LICENSE b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/LICENSE new file mode 100644 index 00000000..b370545b --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/LICENSE @@ -0,0 +1,200 @@ + 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 2016-present Datadog, Inc. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/cache.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/cache.go new file mode 100644 index 00000000..3993390d --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/cache.go @@ -0,0 +1,90 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "fmt" + "time" + + "github.com/outcaste-io/ristretto" +) + +// measuredCache is a wrapper on top of *ristretto.Cache which additionally +// sends metrics (hits and misses) every 10 seconds. +type measuredCache struct { + *ristretto.Cache + + // close allows sending shutdown notification. + close chan struct{} + statsd StatsClient +} + +// Close gracefully closes the cache when active. +func (c *measuredCache) Close() { + if c.Cache == nil { + return + } + c.close <- struct{}{} + <-c.close +} + +func (c *measuredCache) statsLoop() { + defer func() { + c.close <- struct{}{} + }() + tick := time.NewTicker(10 * time.Second) + defer tick.Stop() + mx := c.Cache.Metrics + for { + select { + case <-tick.C: + c.statsd.Gauge("datadog.trace_agent.ofuscation.sql_cache.hits", float64(mx.Hits()), nil, 1) //nolint:errcheck + c.statsd.Gauge("datadog.trace_agent.ofuscation.sql_cache.misses", float64(mx.Misses()), nil, 1) //nolint:errcheck + case <-c.close: + c.Cache.Close() + return + } + } +} + +type cacheOptions struct { + On bool + Statsd StatsClient +} + +// newMeasuredCache returns a new measuredCache. +func newMeasuredCache(opts cacheOptions) *measuredCache { + if !opts.On { + // a nil *ristretto.Cache is a no-op cache + return &measuredCache{} + } + cfg := &ristretto.Config{ + // We know that the maximum allowed resource length is 5K. This means that + // in 5MB we can store a minimum of 1000 queries. + MaxCost: 5000000, + + // An appromixated worst-case scenario when the cache is filled with small + // queries averaged as being of length 11 ("LOCK TABLES"), we would be able + // to fit 476K of them into 5MB of cost. + // + // We average it to 500K and multiply 10x as the documentation recommends. + NumCounters: 500000 * 10, + + BufferItems: 64, // default recommended value + Metrics: true, // enable hit/miss counters + } + cache, err := ristretto.NewCache(cfg) + if err != nil { + panic(fmt.Errorf("Error starting obfuscator query cache: %v", err)) + } + c := measuredCache{ + close: make(chan struct{}), + statsd: opts.Statsd, + Cache: cache, + } + go c.statsLoop() + return &c +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/credit_cards.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/credit_cards.go new file mode 100644 index 00000000..03adf154 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/credit_cards.go @@ -0,0 +1,211 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +// IsCardNumber checks if b could be a credit card number by checking the digit count and IIN prefix. +// If validateLuhn is true, the Luhn checksum is also applied to potential candidates. +func IsCardNumber(b string, validateLuhn bool) (ok bool) { + // + // Just credit card numbers for now, based on: + // • https://baymard.com/checkout-usability/credit-card-patterns + // • https://www.regular-expressions.info/creditcard.html + // + if len(b) == 0 { + return false + } + if len(b) < 12 { + // fast path: can not be a credit card + return false + } + if b[0] != ' ' && b[0] != '-' && (b[0] < '0' || b[0] > '9') { + // fast path: only valid characters are 0-9, space (" ") and dash("-") + return false + } + prefix := 0 // holds up to b[:6] digits as a numeric value (for example []byte{"523"} becomes int(523)) for checking prefixes + count := 0 // counts digits encountered + foundPrefix := false // reports whether we've detected a valid prefix + recdigit := func(_ byte) {} // callback on each found digit; no-op by default (we only need this for Luhn) + if validateLuhn { + // we need Luhn checksum validation, so we have to take additional action + // and record all digits found + buf := make([]byte, 0, len(b)) + recdigit = func(b byte) { buf = append(buf, b) } + defer func() { + if !ok { + // if isCardNumber returned false, it means that b can not be + // a credit card number + return + } + // potentially a credit card number, run the Luhn checksum + ok = luhnValid(buf) + }() + } +loop: + for i := range b { + // We traverse and search b for a valid IIN credit card prefix based + // on the digits found, ignoring spaces and dashes. + // Source: https://www.regular-expressions.info/creditcard.html + switch b[i] { + case ' ', '-': + // ignore space (' ') and dash ('-') + continue loop + } + if b[i] < '0' || b[i] > '9' { + // not a 0 to 9 digit; can not be a credit card number; abort + return false + } + count++ + recdigit(b[i]) + if !foundPrefix { + // we have not yet found a valid prefix so we convert the digits + // that we have so far into a numeric value: + prefix = prefix*10 + (int(b[i]) - '0') + maybe, yes := validCardPrefix(prefix) + if yes { + // we've found a valid prefix; continue counting + foundPrefix = true + } else if !maybe { + // this is not a valid prefix and we should not continue looking + return false + } + } + if count > 16 { + // too many digits + return false + } + } + if count < 12 { + // too few digits + return false + } + return foundPrefix +} + +// luhnValid checks that the number represented in the given string validates the Luhn Checksum algorithm. +// str is expected to contain exclusively digits at all positions. +// +// See: +// • https://en.wikipedia.org/wiki/Luhn_algorithm +// • https://dev.to/shiraazm/goluhn-a-simple-library-for-generating-calculating-and-verifying-luhn-numbers-588j +func luhnValid(str []byte) bool { + var ( + sum int + alt bool + ) + n := len(str) + for i := n - 1; i > -1; i-- { + if str[i] < '0' || str[i] > '9' { + return false // not a number! + } + mod := int(str[i] - 0x30) // convert byte to int + if alt { + mod *= 2 + if mod > 9 { + mod = (mod % 10) + 1 + } + } + alt = !alt + sum += mod + } + return sum%10 == 0 +} + +// validCardPrefix validates whether b is a valid card prefix. Maybe returns true if +// the prefix could be an IIN once more digits are revealed and yes reports whether +// b is a fully valid IIN. +// +// If yes is false and maybe is false, there is no reason to continue searching. The +// prefix is invalid. +// +// IMPORTANT: If adding new prefixes to this algorithm, make sure that you update +// the "maybe" clauses above, in the shorter prefixes than the one you are adding. +// This refers to the cases which return true, false. +// +// TODO(x): this whole code could be code generated from a prettier data structure. +// Ultimately, it could even be user-configurable. +func validCardPrefix(n int) (maybe, yes bool) { + // Validates IIN prefix possibilities + // Source: https://www.regular-expressions.info/creditcard.html + if n > 699999 { + // too long for any known prefix; stop looking + return false, false + } + if n < 10 { + switch n { + case 1, 4: + // 1 & 4 are valid IIN + return false, true + case 2, 3, 5, 6: + // 2, 3, 5, 6 could be the start of valid IIN + return true, false + default: + // invalid IIN + return false, false + } + } + if n < 100 { + if (n >= 34 && n <= 39) || + (n >= 51 && n <= 55) || + n == 62 || + n == 65 { + // 34-39, 51-55, 62, 65 are valid IIN + return false, true + } + if n == 30 || n == 63 || n == 64 || n == 50 || n == 60 || + (n >= 22 && n <= 27) || (n >= 56 && n <= 58) || (n >= 60 && n <= 69) { + // 30, 63, 64, 50, 60, 22-27, 56-58, 60-69 may end up as valid IIN + return true, false + } + } + if n < 1000 { + if (n >= 300 && n <= 305) || + (n >= 644 && n <= 649) || + n == 309 || + n == 636 { + // 300‑305, 309, 636, 644‑649 are valid IIN + return false, true + } + if (n >= 352 && n <= 358) || n == 501 || n == 601 || + (n >= 222 && n <= 272) || (n >= 500 && n <= 509) || + (n >= 560 && n <= 589) || (n >= 600 && n <= 699) { + // 352-358, 501, 601, 222-272, 500-509, 560-589, 600-699 may be a 4 or 6 digit IIN prefix + return true, false + } + } + if n < 10000 { + if (n >= 3528 && n <= 3589) || + n == 5019 || + n == 6011 { + // 3528‑3589, 5019, 6011 are valid IINs + return false, true + } + if (n >= 2221 && n <= 2720) || (n >= 5000 && n <= 5099) || + (n >= 5600 && n <= 5899) || (n >= 6000 && n <= 6999) { + // maybe a 6-digit IIN + return true, false + } + } + if n < 100000 { + if (n >= 22210 && n <= 27209) || + (n >= 50000 && n <= 50999) || + (n >= 56000 && n <= 58999) || + (n >= 60000 && n <= 69999) { + // maybe a 6-digit IIN + return true, false + } + } + if n < 1000000 { + if (n >= 222100 && n <= 272099) || + (n >= 500000 && n <= 509999) || + (n >= 560000 && n <= 589999) || + (n >= 600000 && n <= 699999) { + // 222100‑272099, 500000‑509999, 560000‑589999, 600000‑699999 are valid IIN + return false, true + } + } + // unknown IIN + return false, false +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/http.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/http.go new file mode 100644 index 00000000..d9a00084 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/http.go @@ -0,0 +1,60 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "net/url" + "strings" +) + +// obfuscateUserInfo returns a URL string that obfuscates any userinfo by setting url.User to nil. +func obfuscateUserInfo(val string) string { + u, err := url.Parse(val) + if err != nil { + return val + } + u.User = nil + return u.String() +} + +// ObfuscateURLString obfuscates the given URL. It must be a valid URL. +func (o *Obfuscator) ObfuscateURLString(val string) string { + if !o.opts.HTTP.RemoveQueryString && !o.opts.HTTP.RemovePathDigits { + // nothing to do + return obfuscateUserInfo(val) + } + u, err := url.Parse(val) + if err != nil { + // should not happen for valid URLs, but better obfuscate everything + // rather than expose sensitive information when this option is on. + return "?" + } + u.User = nil + if o.opts.HTTP.RemoveQueryString && u.RawQuery != "" { + u.ForceQuery = true // add the '?' + u.RawQuery = "" + } + if o.opts.HTTP.RemovePathDigits { + segs := strings.Split(u.Path, "/") + var changed bool + for i, seg := range segs { + for _, ch := range []byte(seg) { + if ch >= '0' && ch <= '9' { + // we can not set the question mark directly here because the url + // package will escape it into %3F, so we use this placeholder and + // replace it further down. + segs[i] = "/REDACTED/" + changed = true + break + } + } + } + if changed { + u.Path = strings.Join(segs, "/") + } + } + return strings.Replace(u.String(), "/REDACTED/", "?", -1) +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json.go new file mode 100644 index 00000000..aef236f3 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json.go @@ -0,0 +1,201 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "strconv" + "strings" +) + +// ObfuscateMongoDBString obfuscates the given MongoDB JSON query. +func (o *Obfuscator) ObfuscateMongoDBString(cmd string) string { + return obfuscateJSONString(cmd, o.mongo) +} + +// ObfuscateElasticSearchString obfuscates the given ElasticSearch JSON query. +func (o *Obfuscator) ObfuscateElasticSearchString(cmd string) string { + return obfuscateJSONString(cmd, o.es) +} + +// obfuscateJSONString obfuscates the given span's tag using the given obfuscator. If the obfuscator is +// nil it is considered disabled. +func obfuscateJSONString(cmd string, obfuscator *jsonObfuscator) string { + if obfuscator == nil || cmd == "" { + // obfuscator is disabled or string is empty + return cmd + } + out, _ := obfuscator.obfuscate([]byte(cmd)) + // we should accept whatever the obfuscator returns, even if it's an error: a parsing + // error simply means that the JSON was invalid, meaning that we've only obfuscated + // as much of it as we could. It is safe to accept the output, even if partial. + return out +} + +type jsonObfuscator struct { + keepKeys map[string]bool // the values for these keys will not be obfuscated + transformKeys map[string]bool // the values for these keys pass through the transformer + transformer func(string) string + + scan *scanner // scanner + closures []bool // closure stack, true if object (e.g. {[{ => []bool{true, false, true}) + key bool // true if scanning a key + + wiped bool // true if obfuscation string (`"?"`) was already written for current value + keeping bool // true if not obfuscating + transformingValue bool // true if collecting the next literal for transformation + keepDepth int // the depth at which we've stopped obfuscating +} + +func newJSONObfuscator(cfg *JSONConfig, o *Obfuscator) *jsonObfuscator { + keepValue := make(map[string]bool, len(cfg.KeepValues)) + for _, v := range cfg.KeepValues { + keepValue[v] = true + } + var ( + transformKeys map[string]bool + transformer func(string) string + ) + if len(cfg.ObfuscateSQLValues) > 0 { + transformer = sqlObfuscationTransformer(o) + transformKeys = make(map[string]bool, len(cfg.ObfuscateSQLValues)) + for _, v := range cfg.ObfuscateSQLValues { + transformKeys[v] = true + } + } + return &jsonObfuscator{ + closures: []bool{}, + keepKeys: keepValue, + transformKeys: transformKeys, + transformer: transformer, + scan: &scanner{}, + } +} + +func sqlObfuscationTransformer(o *Obfuscator) func(string) string { + return func(s string) string { + result, err := o.ObfuscateSQLString(s) + if err != nil { + o.log.Debugf("Failed to obfuscate SQL string '%s': %s", s, err.Error()) + // instead of returning an empty string we explicitly return an error string here within the result in order + // to surface the problem clearly to the user + return "Datadog-agent failed to obfuscate SQL string. Enable agent debug logs for more info." + } + return result.Query + } +} + +// setKey verifies if we are currently scanning a key based on the current state +// and updates the state accordingly. It must be called only after a closure or a +// value scan has ended. +func (p *jsonObfuscator) setKey() { + n := len(p.closures) + p.key = n == 0 || p.closures[n-1] // true if we are at top level or in an object + p.wiped = false +} + +func (p *jsonObfuscator) obfuscate(data []byte) (string, error) { + var out strings.Builder + + keyBuf := make([]byte, 0, 10) // recording key token + valBuf := make([]byte, 0, 10) // recording value + + p.scan.reset() + for _, c := range data { + p.scan.bytes++ + op := p.scan.step(p.scan, c) + depth := len(p.closures) + switch op { + case scanBeginObject: + // object begins: { + p.closures = append(p.closures, true) + p.setKey() + p.transformingValue = false + + case scanBeginArray: + // array begins: [ + p.closures = append(p.closures, false) + p.setKey() + p.transformingValue = false + + case scanEndArray, scanEndObject: + // array or object closing + if n := len(p.closures) - 1; n > 0 { + p.closures = p.closures[:n] + } + fallthrough + + case scanObjectValue, scanArrayValue: + // done scanning value + p.setKey() + if p.transformingValue && p.transformer != nil { + v, err := strconv.Unquote(string(valBuf)) + if err != nil { + v = string(valBuf) + } + result := p.transformer(v) + out.WriteByte('"') + out.WriteString(result) + out.WriteByte('"') + p.transformingValue = false + valBuf = valBuf[:0] + } else if p.keeping && depth < p.keepDepth { + p.keeping = false + } + + case scanBeginLiteral, scanContinue: + // starting or continuing a literal + if p.transformingValue { + valBuf = append(valBuf, c) + continue + } else if p.key { + // it's a key + keyBuf = append(keyBuf, c) + } else if !p.keeping { + // it's a value we're not keeping + if !p.wiped { + out.Write([]byte(`"?"`)) + p.wiped = true + } + continue + } + + case scanObjectKey: + // done scanning key + k := strings.Trim(string(keyBuf), `"`) + if !p.keeping && p.keepKeys[k] { + // we should not obfuscate values of this key + p.keeping = true + p.keepDepth = depth + 1 + } else if !p.transformingValue && p.transformer != nil && p.transformKeys[k] { + // the string value immediately following this key will be passed through the value transformer + // if anything other than a literal is found then sql obfuscation is stopped and json obfuscation + // proceeds as usual + p.transformingValue = true + } + + keyBuf = keyBuf[:0] + p.key = false + + case scanSkipSpace: + continue + + case scanError: + // we've encountered an error, mark that there might be more JSON + // using the ellipsis and return whatever we've managed to obfuscate + // thus far. + out.Write([]byte("...")) + return out.String(), p.scan.err + } + out.WriteByte(c) + } + if p.scan.eof() == scanError { + // if an error occurred it's fine, simply add the ellipsis to indicate + // that the input has been truncated. + out.Write([]byte("...")) + return out.String(), p.scan.err + } + return out.String(), nil +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json_scanner.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json_scanner.go new file mode 100644 index 00000000..9398632d --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/json_scanner.go @@ -0,0 +1,565 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +// The code that follows is copied from go/src/encoding/json/scanner.go +// It may contain minor edits, such as allowing multiple JSON objects within +// the same input string (see stateEndTop) +// + +package obfuscate + +import "strconv" + +// A SyntaxError is a description of a JSON syntax error. +type SyntaxError struct { + msg string // description of error + Offset int64 // error occurred after reading Offset bytes +} + +func (e *SyntaxError) Error() string { return e.msg } + +// A scanner is a JSON scanning state machine. +// Callers call scan.reset() and then pass bytes in one at a time +// by calling scan.step(&scan, c) for each byte. +// The return value, referred to as an opcode, tells the +// caller about significant parsing events like beginning +// and ending literals, objects, and arrays, so that the +// caller can follow along if it wishes. +// The return value scanEnd indicates that a single top-level +// JSON value has been completed, *before* the byte that +// just got passed in. (The indication must be delayed in order +// to recognize the end of numbers: is 123 a whole value or +// the beginning of 12345e+6?). +type scanner struct { + // The step is a func to be called to execute the next transition. + // Also tried using an integer constant and a single func + // with a switch, but using the func directly was 10% faster + // on a 64-bit Mac Mini, and it's nicer to read. + step func(*scanner, byte) int + + // Reached end of top-level value. + endTop bool + + // Stack of what we're in the middle of - array values, object keys, object values. + parseState []int + + // Error that happened, if any. + err error + + // 1-byte redo (see undo method) + redo bool + + // total bytes consumed, updated by decoder.Decode + bytes int64 +} + +// These values are returned by the state transition functions +// assigned to scanner.state and the method scanner.eof. +// They give details about the current state of the scan that +// callers might be interested to know about. +// It is okay to ignore the return value of any particular +// call to scanner.state: if one call returns scanError, +// every subsequent call will return scanError too. +const ( + // Continue. + scanContinue = iota // uninteresting byte + scanBeginLiteral // end implied by next result != scanContinue + scanBeginObject // begin object + scanObjectKey // just finished object key (string) + scanObjectValue // just finished non-last object value + scanEndObject // end object (implies scanObjectValue if possible) + scanBeginArray // begin array + scanArrayValue // just finished array value + scanEndArray // end array (implies scanArrayValue if possible) + scanSkipSpace // space byte; can skip; known to be last "continue" result + + // Stop. + scanEnd // top-level value ended *before* this byte; known to be first "stop" result + scanError // hit an error, scanner.err. +) + +// These values are stored in the parseState stack. +// They give the current state of a composite value +// being scanned. If the parser is inside a nested value +// the parseState describes the nested state, outermost at entry 0. +const ( + parseObjectKey = iota // parsing object key (before colon) + parseObjectValue // parsing object value (after colon) + parseArrayValue // parsing array value +) + +// reset prepares the scanner for use. +// It must be called before calling s.step. +func (s *scanner) reset() { + s.step = stateBeginValue + s.parseState = s.parseState[0:0] + s.err = nil + s.redo = false + s.endTop = false +} + +// eof tells the scanner that the end of input has been reached. +// It returns a scan status just as s.step does. +func (s *scanner) eof() int { + if s.err != nil { + return scanError + } + if s.endTop { + return scanEnd + } + s.step(s, ' ') + if s.endTop { + return scanEnd + } + if s.err == nil { + s.err = &SyntaxError{"unexpected end of JSON input", s.bytes} + } + return scanError +} + +// pushParseState pushes a new parse state p onto the parse stack. +func (s *scanner) pushParseState(p int) { + s.parseState = append(s.parseState, p) +} + +// popParseState pops a parse state (already obtained) off the stack +// and updates s.step accordingly. +func (s *scanner) popParseState() { + n := len(s.parseState) - 1 + s.parseState = s.parseState[0:n] + s.redo = false + if n == 0 { + s.step = stateEndTop + s.endTop = true + } else { + s.step = stateEndValue + } +} + +func isSpace(c byte) bool { + return c == ' ' || c == '\t' || c == '\r' || c == '\n' +} + +// stateBeginValueOrEmpty is the state after reading `[`. +func stateBeginValueOrEmpty(s *scanner, c byte) int { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + if c == ']' { + return stateEndValue(s, c) + } + return stateBeginValue(s, c) +} + +// stateBeginValue is the state at the beginning of the input. +func stateBeginValue(s *scanner, c byte) int { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + switch c { + case '{': + s.step = stateBeginStringOrEmpty + s.pushParseState(parseObjectKey) + return scanBeginObject + case '[': + s.step = stateBeginValueOrEmpty + s.pushParseState(parseArrayValue) + return scanBeginArray + case '"': + s.step = stateInString + return scanBeginLiteral + case '-': + s.step = stateNeg + return scanBeginLiteral + case '0': // beginning of 0.123 + s.step = state0 + return scanBeginLiteral + case 't': // beginning of true + s.step = stateT + return scanBeginLiteral + case 'f': // beginning of false + s.step = stateF + return scanBeginLiteral + case 'n': // beginning of null + s.step = stateN + return scanBeginLiteral + } + if '1' <= c && c <= '9' { // beginning of 1234.5 + s.step = state1 + return scanBeginLiteral + } + return s.error(c, "looking for beginning of value") +} + +// stateBeginStringOrEmpty is the state after reading `{`. +func stateBeginStringOrEmpty(s *scanner, c byte) int { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + if c == '}' { + n := len(s.parseState) + s.parseState[n-1] = parseObjectValue + return stateEndValue(s, c) + } + return stateBeginString(s, c) +} + +// stateBeginString is the state after reading `{"key": value,`. +func stateBeginString(s *scanner, c byte) int { + if c <= ' ' && isSpace(c) { + return scanSkipSpace + } + if c == '"' { + s.step = stateInString + return scanBeginLiteral + } + return s.error(c, "looking for beginning of object key string") +} + +// stateEndValue is the state after completing a value, +// such as after reading `{}` or `true` or `["x"`. +func stateEndValue(s *scanner, c byte) int { + n := len(s.parseState) + if n == 0 { + // Completed top-level before the current byte. + s.step = stateEndTop + s.endTop = true + return stateEndTop(s, c) + } + if c <= ' ' && isSpace(c) { + s.step = stateEndValue + return scanSkipSpace + } + ps := s.parseState[n-1] + switch ps { + case parseObjectKey: + if c == ':' { + s.parseState[n-1] = parseObjectValue + s.step = stateBeginValue + return scanObjectKey + } + return s.error(c, "after object key") + case parseObjectValue: + if c == ',' { + s.parseState[n-1] = parseObjectKey + s.step = stateBeginString + return scanObjectValue + } + if c == '}' { + s.popParseState() + return scanEndObject + } + return s.error(c, "after object key:value pair") + case parseArrayValue: + if c == ',' { + s.step = stateBeginValue + return scanArrayValue + } + if c == ']' { + s.popParseState() + return scanEndArray + } + return s.error(c, "after array element") + } + return s.error(c, "") +} + +// stateEndTop is the state after finishing the top-level value, +// such as after reading `{}` or `[1,2,3]`. +// Only space characters should be seen now. +func stateEndTop(s *scanner, c byte) int { + if c != ' ' && c != '\t' && c != '\r' && c != '\n' { + // The former behaviour has been removed. Now, if anything + // other than whitespace follows, we assume a new JSON string + // might be starting. This allows us to continue obfuscating + // further strings in cases where there are multiple JSON + // objects enumerated sequentially within the same input. + // This is a common case for ElasticSearch response bodies. + s.reset() + return s.step(s, c) + } + return scanEnd +} + +// stateInString is the state after reading `"`. +func stateInString(s *scanner, c byte) int { + if c == '"' { + s.step = stateEndValue + return scanContinue + } + if c == '\\' { + s.step = stateInStringEsc + return scanContinue + } + if c < 0x20 { + return s.error(c, "in string literal") + } + return scanContinue +} + +// stateInStringEsc is the state after reading `"\` during a quoted string. +func stateInStringEsc(s *scanner, c byte) int { + switch c { + case 'b', 'f', 'n', 'r', 't', '\\', '/', '"': + s.step = stateInString + return scanContinue + case 'u': + s.step = stateInStringEscU + return scanContinue + } + return s.error(c, "in string escape code") +} + +// stateInStringEscU is the state after reading `"\u` during a quoted string. +func stateInStringEscU(s *scanner, c byte) int { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInStringEscU1 + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateInStringEscU1 is the state after reading `"\u1` during a quoted string. +func stateInStringEscU1(s *scanner, c byte) int { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInStringEscU12 + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateInStringEscU12 is the state after reading `"\u12` during a quoted string. +func stateInStringEscU12(s *scanner, c byte) int { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInStringEscU123 + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateInStringEscU123 is the state after reading `"\u123` during a quoted string. +func stateInStringEscU123(s *scanner, c byte) int { + if '0' <= c && c <= '9' || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { + s.step = stateInString + return scanContinue + } + // numbers + return s.error(c, "in \\u hexadecimal character escape") +} + +// stateNeg is the state after reading `-` during a number. +func stateNeg(s *scanner, c byte) int { + if c == '0' { + s.step = state0 + return scanContinue + } + if '1' <= c && c <= '9' { + s.step = state1 + return scanContinue + } + return s.error(c, "in numeric literal") +} + +// state1 is the state after reading a non-zero integer during a number, +// such as after reading `1` or `100` but not `0`. +func state1(s *scanner, c byte) int { + if '0' <= c && c <= '9' { + s.step = state1 + return scanContinue + } + return state0(s, c) +} + +// state0 is the state after reading `0` during a number. +func state0(s *scanner, c byte) int { + if c == '.' { + s.step = stateDot + return scanContinue + } + if c == 'e' || c == 'E' { + s.step = stateE + return scanContinue + } + return stateEndValue(s, c) +} + +// stateDot is the state after reading the integer and decimal point in a number, +// such as after reading `1.`. +func stateDot(s *scanner, c byte) int { + if '0' <= c && c <= '9' { + s.step = stateDot0 + return scanContinue + } + return s.error(c, "after decimal point in numeric literal") +} + +// stateDot0 is the state after reading the integer, decimal point, and subsequent +// digits of a number, such as after reading `3.14`. +func stateDot0(s *scanner, c byte) int { + if '0' <= c && c <= '9' { + return scanContinue + } + if c == 'e' || c == 'E' { + s.step = stateE + return scanContinue + } + return stateEndValue(s, c) +} + +// stateE is the state after reading the mantissa and e in a number, +// such as after reading `314e` or `0.314e`. +func stateE(s *scanner, c byte) int { + if c == '+' || c == '-' { + s.step = stateESign + return scanContinue + } + return stateESign(s, c) +} + +// stateESign is the state after reading the mantissa, e, and sign in a number, +// such as after reading `314e-` or `0.314e+`. +func stateESign(s *scanner, c byte) int { + if '0' <= c && c <= '9' { + s.step = stateE0 + return scanContinue + } + return s.error(c, "in exponent of numeric literal") +} + +// stateE0 is the state after reading the mantissa, e, optional sign, +// and at least one digit of the exponent in a number, +// such as after reading `314e-2` or `0.314e+1` or `3.14e0`. +func stateE0(s *scanner, c byte) int { + if '0' <= c && c <= '9' { + return scanContinue + } + return stateEndValue(s, c) +} + +// stateT is the state after reading `t`. +func stateT(s *scanner, c byte) int { + if c == 'r' { + s.step = stateTr + return scanContinue + } + return s.error(c, "in literal true (expecting 'r')") +} + +// stateTr is the state after reading `tr`. +func stateTr(s *scanner, c byte) int { + if c == 'u' { + s.step = stateTru + return scanContinue + } + return s.error(c, "in literal true (expecting 'u')") +} + +// stateTru is the state after reading `tru`. +func stateTru(s *scanner, c byte) int { + if c == 'e' { + s.step = stateEndValue + return scanContinue + } + return s.error(c, "in literal true (expecting 'e')") +} + +// stateF is the state after reading `f`. +func stateF(s *scanner, c byte) int { + if c == 'a' { + s.step = stateFa + return scanContinue + } + return s.error(c, "in literal false (expecting 'a')") +} + +// stateFa is the state after reading `fa`. +func stateFa(s *scanner, c byte) int { + if c == 'l' { + s.step = stateFal + return scanContinue + } + return s.error(c, "in literal false (expecting 'l')") +} + +// stateFal is the state after reading `fal`. +func stateFal(s *scanner, c byte) int { + if c == 's' { + s.step = stateFals + return scanContinue + } + return s.error(c, "in literal false (expecting 's')") +} + +// stateFals is the state after reading `fals`. +func stateFals(s *scanner, c byte) int { + if c == 'e' { + s.step = stateEndValue + return scanContinue + } + return s.error(c, "in literal false (expecting 'e')") +} + +// stateN is the state after reading `n`. +func stateN(s *scanner, c byte) int { + if c == 'u' { + s.step = stateNu + return scanContinue + } + return s.error(c, "in literal null (expecting 'u')") +} + +// stateNu is the state after reading `nu`. +func stateNu(s *scanner, c byte) int { + if c == 'l' { + s.step = stateNul + return scanContinue + } + return s.error(c, "in literal null (expecting 'l')") +} + +// stateNul is the state after reading `nul`. +func stateNul(s *scanner, c byte) int { + if c == 'l' { + s.step = stateEndValue + return scanContinue + } + return s.error(c, "in literal null (expecting 'l')") +} + +// stateError is the state after reaching a syntax error, +// such as after reading `[1}` or `5.1.2`. +func stateError(s *scanner, c byte) int { + return scanError +} + +// error records an error and switches to the error state. +func (s *scanner) error(c byte, context string) int { + s.step = stateError + s.err = &SyntaxError{"invalid character " + quoteChar(c) + " " + context, s.bytes} + return scanError +} + +// quoteChar formats c as a quoted character literal +func quoteChar(c byte) string { + // special cases - different from quoted strings + if c == '\'' { + return `'\''` + } + if c == '"' { + return `'"'` + } + + // use quoted string with different quotation marks + s := strconv.Quote(string(c)) + return "'" + s[1:len(s)-1] + "'" +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/memcached.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/memcached.go new file mode 100644 index 00000000..ce5cfe3f --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/memcached.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import "strings" + +// ObfuscateMemcachedString obfuscates the Memcached command cmd. +func (*Obfuscator) ObfuscateMemcachedString(cmd string) string { + // All memcached commands end with new lines [1]. In the case of storage + // commands, key values follow after. Knowing this, all we have to do + // to obfuscate sensitive information is to remove everything that follows + // a new line. For non-storage commands, this will have no effect. + // [1]: https://github.com/memcached/memcached/blob/master/doc/protocol.txt + out := strings.SplitN(cmd, "\r\n", 2)[0] + return strings.TrimSpace(out) +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/obfuscate.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/obfuscate.go new file mode 100644 index 00000000..0de91016 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/obfuscate.go @@ -0,0 +1,254 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +// Package obfuscate implements quantizing and obfuscating of tags and resources for +// a set of spans matching a certain criteria. +// +// This module is used in the Datadog Agent, the Go tracing client (dd-trace-go) and in the +// OpenTelemetry Collector Datadog exporter./ End-user behavior is stable, but there are no +// stability guarantees on its public Go API. Nonetheless, if editing try to avoid breaking +// API changes if possible and double check the API usage on all module dependents. +package obfuscate + +import ( + "bytes" + + "github.com/DataDog/datadog-go/v5/statsd" + "go.uber.org/atomic" +) + +// Obfuscator quantizes and obfuscates spans. The obfuscator is not safe for +// concurrent use. +type Obfuscator struct { + opts *Config + es *jsonObfuscator // nil if disabled + mongo *jsonObfuscator // nil if disabled + sqlExecPlan *jsonObfuscator // nil if disabled + sqlExecPlanNormalize *jsonObfuscator // nil if disabled + // sqlLiteralEscapes reports whether we should treat escape characters literally or as escape characters. + // Different SQL engines behave in different ways and the tokenizer needs to be generic. + sqlLiteralEscapes *atomic.Bool + // queryCache keeps a cache of already obfuscated queries. + queryCache *measuredCache + log Logger +} + +// Logger is able to log certain log messages. +type Logger interface { + // Debugf logs the given message using the given format. + Debugf(format string, params ...interface{}) +} + +type noopLogger struct{} + +func (noopLogger) Debugf(_ string, _ ...interface{}) {} + +// setSQLLiteralEscapes sets whether or not escape characters should be treated literally by the SQL obfuscator. +func (o *Obfuscator) setSQLLiteralEscapes(ok bool) { + if ok { + o.sqlLiteralEscapes.Store(true) + } else { + o.sqlLiteralEscapes.Store(false) + } +} + +// useSQLLiteralEscapes reports whether escape characters will be treated literally by the SQL obfuscator. +// Some SQL engines require it and others don't. It will be detected as SQL queries are being obfuscated +// through calls to ObfuscateSQLString and automatically set for future. +func (o *Obfuscator) useSQLLiteralEscapes() bool { + return o.sqlLiteralEscapes.Load() +} + +// Config holds the configuration for obfuscating sensitive data for various span types. +type Config struct { + // SQL holds the obfuscation configuration for SQL queries. + SQL SQLConfig + + // ES holds the obfuscation configuration for ElasticSearch bodies. + ES JSONConfig + + // Mongo holds the obfuscation configuration for MongoDB queries. + Mongo JSONConfig + + // SQLExecPlan holds the obfuscation configuration for SQL Exec Plans. This is strictly for safety related obfuscation, + // not normalization. Normalization of exec plans is configured in SQLExecPlanNormalize. + SQLExecPlan JSONConfig + + // SQLExecPlanNormalize holds the normalization configuration for SQL Exec Plans. + SQLExecPlanNormalize JSONConfig + + // HTTP holds the obfuscation settings for HTTP URLs. + HTTP HTTPConfig + + // Statsd specifies the statsd client to use for reporting metrics. + Statsd StatsClient + + // Logger specifies the logger to use when outputting messages. + // If unset, no logs will be outputted. + Logger Logger +} + +// StatsClient implementations are able to emit stats. +type StatsClient interface { + // Gauge reports a gauge stat with the given name, value, tags and rate. + Gauge(name string, value float64, tags []string, rate float64) error +} + +// SQLConfig holds the config for obfuscating SQL. +type SQLConfig struct { + // DBMS identifies the type of database management system (e.g. MySQL, Postgres, and SQL Server). + // Valid values for this can be found at https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/database.md#connection-level-attributes + DBMS string `json:"dbms"` + + // TableNames specifies whether the obfuscator should also extract the table names that a query addresses, + // in addition to obfuscating. + TableNames bool `json:"table_names" yaml:"table_names"` + + // CollectCommands specifies whether the obfuscator should extract and return commands as SQL metadata when obfuscating. + CollectCommands bool `json:"collect_commands" yaml:"collect_commands"` + + // CollectComments specifies whether the obfuscator should extract and return comments as SQL metadata when obfuscating. + CollectComments bool `json:"collect_comments" yaml:"collect_comments"` + + // ReplaceDigits specifies whether digits in table names and identifiers should be obfuscated. + ReplaceDigits bool `json:"replace_digits" yaml:"replace_digits"` + + // KeepSQLAlias reports whether SQL aliases ("AS") should be truncated. + KeepSQLAlias bool `json:"keep_sql_alias"` + + // DollarQuotedFunc reports whether to treat "$func$" delimited dollar-quoted strings + // differently and not obfuscate them as a string. To read more about dollar quoted + // strings see: + // + // https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING + DollarQuotedFunc bool `json:"dollar_quoted_func"` + + // Cache reports whether the obfuscator should use a LRU look-up cache for SQL obfuscations. + Cache bool +} + +// SQLMetadata holds metadata collected throughout the obfuscation of an SQL statement. It is only +// collected when enabled via SQLConfig. +type SQLMetadata struct { + // Size holds the byte size of the metadata collected. + Size int64 + // TablesCSV is a comma-separated list of tables that the query addresses. + TablesCSV string `json:"tables_csv"` + // Commands holds commands executed in an SQL statement. + // e.g. SELECT, UPDATE, INSERT, DELETE, etc. + Commands []string `json:"commands"` + // Comments holds comments in an SQL statement. + Comments []string `json:"comments"` +} + +// HTTPConfig holds the configuration settings for HTTP obfuscation. +type HTTPConfig struct { + // RemoveQueryStrings determines query strings to be removed from HTTP URLs. + RemoveQueryString bool + + // RemovePathDigits determines digits in path segments to be obfuscated. + RemovePathDigits bool +} + +// JSONConfig holds the obfuscation configuration for sensitive +// data found in JSON objects. +type JSONConfig struct { + // Enabled will specify whether obfuscation should be enabled. + Enabled bool + + // KeepValues will specify a set of keys for which their values will + // not be obfuscated. + KeepValues []string + + // ObfuscateSQLValues will specify a set of keys for which their values + // will be passed through SQL obfuscation + ObfuscateSQLValues []string +} + +// NewObfuscator creates a new obfuscator +func NewObfuscator(cfg Config) *Obfuscator { + if cfg.Logger == nil { + cfg.Logger = noopLogger{} + } + o := Obfuscator{ + opts: &cfg, + queryCache: newMeasuredCache(cacheOptions{On: cfg.SQL.Cache, Statsd: cfg.Statsd}), + sqlLiteralEscapes: atomic.NewBool(false), + log: cfg.Logger, + } + if cfg.ES.Enabled { + o.es = newJSONObfuscator(&cfg.ES, &o) + } + if cfg.Mongo.Enabled { + o.mongo = newJSONObfuscator(&cfg.Mongo, &o) + } + if cfg.SQLExecPlan.Enabled { + o.sqlExecPlan = newJSONObfuscator(&cfg.SQLExecPlan, &o) + } + if cfg.SQLExecPlanNormalize.Enabled { + o.sqlExecPlanNormalize = newJSONObfuscator(&cfg.SQLExecPlanNormalize, &o) + } + if cfg.Statsd == nil { + cfg.Statsd = &statsd.NoOpClient{} + } + return &o +} + +// Stop cleans up after a finished Obfuscator. +func (o *Obfuscator) Stop() { + o.queryCache.Close() +} + +// compactWhitespaces compacts all whitespaces in t. +func compactWhitespaces(t string) string { + n := len(t) + r := make([]byte, n) + spaceCode := uint8(32) + isWhitespace := func(char uint8) bool { return char == spaceCode } + nr := 0 + offset := 0 + for i := 0; i < n; i++ { + if isWhitespace(t[i]) { + copy(r[nr:], t[nr+offset:i]) + r[i-offset] = spaceCode + nr = i + 1 - offset + for j := i + 1; j < n; j++ { + if !isWhitespace(t[j]) { + offset += j - i - 1 + i = j + break + } else if j == n-1 { + offset += j - i + i = j + break + } + } + } + } + copy(r[nr:], t[nr+offset:n]) + r = r[:n-offset] + return string(bytes.Trim(r, " ")) +} + +// replaceDigits replaces consecutive sequences of digits with '?', +// example: "jobs_2020_1597876964" --> "jobs_?_?" +func replaceDigits(buffer []byte) []byte { + scanningDigit := false + filtered := buffer[:0] + for _, b := range buffer { + // digits are encoded as 1 byte in utf8 + if isDigit(rune(b)) { + if scanningDigit { + continue + } + scanningDigit = true + filtered = append(filtered, byte('?')) + continue + } + scanningDigit = false + filtered = append(filtered, b) + } + return filtered +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis.go new file mode 100644 index 00000000..13591af6 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis.go @@ -0,0 +1,262 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "strings" +) + +// redisTruncationMark is used as suffix by tracing libraries to indicate that a +// command was truncated. +const redisTruncationMark = "..." + +const maxRedisNbCommands = 3 + +// Redis commands consisting in 2 words +var redisCompoundCommandSet = map[string]bool{ + "CLIENT": true, "CLUSTER": true, "COMMAND": true, "CONFIG": true, "DEBUG": true, "SCRIPT": true} + +// QuantizeRedisString returns a quantized version of a Redis query. +// +// TODO(gbbr): Refactor this method to use the tokenizer and +// remove "compactWhitespaces". This method is buggy when commands +// contain quoted strings with newlines. +func (*Obfuscator) QuantizeRedisString(query string) string { + query = compactWhitespaces(query) + + var resource strings.Builder + truncated := false + nbCmds := 0 + + for len(query) > 0 && nbCmds < maxRedisNbCommands { + var rawLine string + + // Read the next command + idx := strings.IndexByte(query, '\n') + if idx == -1 { + rawLine = query + query = "" + } else { + rawLine = query[:idx] + query = query[idx+1:] + } + + line := strings.Trim(rawLine, " ") + if len(line) == 0 { + continue + } + + // Parse arguments + args := strings.SplitN(line, " ", 3) + + if strings.HasSuffix(args[0], redisTruncationMark) { + truncated = true + continue + } + + command := strings.ToUpper(args[0]) + + if redisCompoundCommandSet[command] && len(args) > 1 { + if strings.HasSuffix(args[1], redisTruncationMark) { + truncated = true + continue + } + + command += " " + strings.ToUpper(args[1]) + } + + // Write the command representation + resource.WriteByte(' ') + resource.WriteString(command) + + nbCmds++ + truncated = false + } + + if nbCmds == maxRedisNbCommands || truncated { + resource.WriteString(" ...") + } + + return strings.Trim(resource.String(), " ") +} + +// ObfuscateRedisString obfuscates the given Redis command. +func (*Obfuscator) ObfuscateRedisString(rediscmd string) string { + t := newRedisTokenizer([]byte(rediscmd)) + var ( + str strings.Builder + cmd string + args []string + ) + for { + tok, typ, done := t.scan() + switch typ { + case redisTokenCommand: + // new command starting + if cmd != "" { + // a previous command was buffered, obfuscate it + obfuscateRedisCmd(&str, cmd, args...) + str.WriteByte('\n') + } + cmd = tok + args = args[:0] + case redisTokenArgument: + args = append(args, tok) + } + if done { + // last command + obfuscateRedisCmd(&str, cmd, args...) + break + } + } + return str.String() +} + +func obfuscateRedisCmd(out *strings.Builder, cmd string, args ...string) { + out.WriteString(cmd) + if len(args) == 0 { + return + } + out.WriteByte(' ') + + switch strings.ToUpper(cmd) { + case "AUTH": + // Obfuscate everything after command + // • AUTH password + if len(args) > 0 { + args[0] = "?" + args = args[:1] + } + + case "APPEND", "GETSET", "LPUSHX", "GEORADIUSBYMEMBER", "RPUSHX", + "SET", "SETNX", "SISMEMBER", "ZRANK", "ZREVRANK", "ZSCORE": + // Obfuscate 2nd argument: + // • APPEND key value + // • GETSET key value + // • LPUSHX key value + // • GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] + // • RPUSHX key value + // • SET key value [expiration EX seconds|PX milliseconds] [NX|XX] + // • SETNX key value + // • SISMEMBER key member + // • ZRANK key member + // • ZREVRANK key member + // • ZSCORE key member + obfuscateRedisArgN(args, 1) + + case "HSET", "HSETNX", "LREM", "LSET", "SETBIT", "SETEX", "PSETEX", + "SETRANGE", "ZINCRBY", "SMOVE", "RESTORE": + // Obfuscate 3rd argument: + // • HSET key field value + // • HSETNX key field value + // • LREM key count value + // • LSET key index value + // • SETBIT key offset value + // • SETEX key seconds value + // • PSETEX key milliseconds value + // • SETRANGE key offset value + // • ZINCRBY key increment member + // • SMOVE source destination member + // • RESTORE key ttl serialized-value [REPLACE] + obfuscateRedisArgN(args, 2) + + case "LINSERT": + // Obfuscate 4th argument: + // • LINSERT key BEFORE|AFTER pivot value + obfuscateRedisArgN(args, 3) + + case "GEOHASH", "GEOPOS", "GEODIST", "LPUSH", "RPUSH", "SREM", + "ZREM", "SADD": + // Obfuscate all arguments after the first one. + // • GEOHASH key member [member ...] + // • GEOPOS key member [member ...] + // • GEODIST key member1 member2 [unit] + // • LPUSH key value [value ...] + // • RPUSH key value [value ...] + // • SREM key member [member ...] + // • ZREM key member [member ...] + // • SADD key member [member ...] + if len(args) > 1 { + args[1] = "?" + args = args[:2] + } + + case "GEOADD": + // Obfuscating every 3rd argument starting from first + // • GEOADD key longitude latitude member [longitude latitude member ...] + obfuscateRedisArgsStep(args, 1, 3) + + case "HMSET": + // Every 2nd argument starting from first. + // • HMSET key field value [field value ...] + obfuscateRedisArgsStep(args, 1, 2) + + case "MSET", "MSETNX": + // Every 2nd argument starting from command. + // • MSET key value [key value ...] + // • MSETNX key value [key value ...] + obfuscateRedisArgsStep(args, 0, 2) + + case "CONFIG": + // Obfuscate 2nd argument to SET sub-command. + // • CONFIG SET parameter value + if strings.ToUpper(args[0]) == "SET" { + obfuscateRedisArgN(args, 2) + } + + case "BITFIELD": + // Obfuscate 3rd argument to SET sub-command: + // • BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] + var n int + for i, arg := range args { + if strings.ToUpper(arg) == "SET" { + n = i + } + if n > 0 && i-n == 3 { + args[i] = "?" + break + } + } + + case "ZADD": + // Obfuscate every 2nd argument after potential optional ones. + // • ZADD key [NX|XX] [CH] [INCR] score member [score member ...] + var i int + loop: + for i = range args { + if i == 0 { + continue // key + } + switch args[i] { + case "NX", "XX", "CH", "INCR": + // continue + default: + break loop + } + } + obfuscateRedisArgsStep(args, i, 2) + + default: + // Obfuscate nothing. + } + out.WriteString(strings.Join(args, " ")) +} + +func obfuscateRedisArgN(args []string, n int) { + if len(args) > n { + args[n] = "?" + } +} + +func obfuscateRedisArgsStep(args []string, start, step int) { + if start+step-1 >= len(args) { + // can't reach target + return + } + for i := start + step - 1; i < len(args); i += step { + args[i] = "?" + } +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis_tokenizer.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis_tokenizer.go new file mode 100644 index 00000000..d4ef2dc3 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/redis_tokenizer.go @@ -0,0 +1,187 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "bytes" + "strings" +) + +// redisTokenType specifies the token type returned by the tokenizer. +type redisTokenType int + +const ( + // redisTokenCommand is a command token. For compound tokens, it is + // only the first part up to a space. + redisTokenCommand redisTokenType = iota + + // redisTokenArgument is an argument token. + redisTokenArgument +) + +// String implements fmt.Stringer. +func (t redisTokenType) String() string { + return map[redisTokenType]string{ + redisTokenCommand: "command", + redisTokenArgument: "argument", + }[t] +} + +// redisTokenizer tokenizes a Redis command string. The string can be on +// multiple lines. The tokenizer is capable of parsing quoted strings and escape +// sequences inside them. +type redisTokenizer struct { + data []byte + ch byte + off int + done bool + state redisParseState +} + +// redisParseState specifies the current state of the tokenizer. +type redisParseState int + +const ( + // redisStateCommand specifies that we are about to parse a command. + // It is usually the state at the beginning of the scan or after a + // new line. + redisStateCommand redisParseState = iota + + // redisStateArgument specifies that we are about to parse an argument + // to a command or the rest of the tokens in a compound command. + redisStateArgument +) + +// newRedisTokenizer returns a new tokenizer for the given data. +func newRedisTokenizer(data []byte) *redisTokenizer { + return &redisTokenizer{ + data: bytes.TrimSpace(data), + off: -1, + state: redisStateCommand, + } +} + +// scan returns the next token, it's type and a bool. The boolean specifies if +// the returned token was the last one. +func (t *redisTokenizer) scan() (tok string, typ redisTokenType, done bool) { + switch t.state { + case redisStateCommand: + return t.scanCommand() + default: + return t.scanArg() + } +} + +// next advances the scanner to the next character. +func (t *redisTokenizer) next() { + t.off++ + if t.off <= len(t.data)-1 { + t.ch = t.data[t.off] + return + } + t.done = true +} + +// scanCommand scans a command from the buffer. +func (t *redisTokenizer) scanCommand() (tok string, typ redisTokenType, done bool) { + var ( + str strings.Builder + started bool + ) + for { + t.next() + if t.done { + return str.String(), typ, t.done + } + switch t.ch { + case ' ': + if !started { + // skip spaces preceding token + t.skipSpace() + break + } + // done scanning command + t.state = redisStateArgument + t.skipSpace() + return str.String(), redisTokenCommand, t.done + case '\n': + return str.String(), redisTokenCommand, t.done + default: + str.WriteByte(t.ch) + } + started = true + } +} + +// scanArg scans an argument from the buffer. +func (t *redisTokenizer) scanArg() (tok string, typ redisTokenType, done bool) { + var ( + str strings.Builder + quoted bool // in quoted string + escape bool // escape sequence + ) + for { + t.next() + if t.done { + return str.String(), redisTokenArgument, t.done + } + switch t.ch { + case '\\': + str.WriteByte('\\') + if !escape { + // next character could be escaped + escape = true + continue + } + case '\n': + if !quoted { + // last argument, new command follows + t.state = redisStateCommand + return str.String(), redisTokenArgument, t.done + } + str.WriteByte('\n') + case '"': + str.WriteByte('"') + if !escape { + // this quote wasn't escaped, toggle quoted mode + quoted = !quoted + } + case ' ': + if !quoted { + t.skipSpace() + return str.String(), redisTokenArgument, t.done + } + str.WriteByte(' ') + default: + str.WriteByte(t.ch) + } + escape = false + } +} + +// unread is the reverse of next, unreading a character. +func (t *redisTokenizer) unread() { + if t.off < 1 { + return + } + t.off-- + t.ch = t.data[t.off] +} + +// skipSpace moves the cursor forward until it meets the last space +// in a sequence of contiguous spaces. +func (t *redisTokenizer) skipSpace() { + for t.ch == ' ' || t.ch == '\t' || t.ch == '\r' && !t.done { + t.next() + } + if t.ch == '\n' { + // next token is a command + t.state = redisStateCommand + } else { + // don't steal the first non-space character + t.unread() + } +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql.go new file mode 100644 index 00000000..2a3bbdee --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql.go @@ -0,0 +1,416 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "bytes" + "errors" + "fmt" + "strings" + "unicode" + "unicode/utf8" +) + +var questionMark = []byte("?") + +// metadataFinderFilter is a filter which attempts to collect metadata from a query, such as comments and tables. +// It is meant to run before all the other filters. +type metadataFinderFilter struct { + collectTableNames bool + collectCommands bool + collectComments bool + replaceDigits bool + + // size holds the byte size of the metadata collected by the filter. + size int64 + // tablesSeen keeps track of unique table names encountered by the filter. + tablesSeen map[string]struct{} + // tablesCSV specifies a comma-separated list of tables. + tablesCSV strings.Builder + // commands keeps track of commands encountered by the filter. + commands []string + // comments keeps track of comments encountered by the filter. + comments []string +} + +func (f *metadataFinderFilter) Filter(token, lastToken TokenKind, buffer []byte) (TokenKind, []byte, error) { + if f.collectComments && token == Comment { + // A comment with line-breaks will be brought to a single line. + comment := strings.TrimSpace(strings.Replace(string(buffer), "\n", " ", -1)) + f.size += int64(len(comment)) + f.comments = append(f.comments, comment) + } + if f.collectCommands { + switch token { + case Select, Update, Insert, Delete, Join, Alter, Drop, Create, Grant, Revoke, Commit, Begin, Truncate: + command := strings.ToUpper(token.String()) + f.size += int64(len(command)) + f.commands = append(f.commands, command) + } + } + if f.collectTableNames { + switch lastToken { + case From, Join: + // SELECT ... FROM [tableName] + // DELETE FROM [tableName] + // ... JOIN [tableName] + if r, _ := utf8.DecodeRune(buffer); !unicode.IsLetter(r) { + // first character in buffer is not a letter; we might have a nested + // query like SELECT * FROM (SELECT ...) + break + } + fallthrough + case Update, Into: + // UPDATE [tableName] + // INSERT INTO [tableName] + tableName := string(buffer) + if f.replaceDigits { + tableNameCopy := make([]byte, len(buffer)) + copy(tableNameCopy, buffer) + tableName = string(replaceDigits(tableNameCopy)) + } + f.storeTableName(tableName) + return TableName, buffer, nil + } + } + return token, buffer, nil +} + +func (f *metadataFinderFilter) storeTableName(name string) { + if _, ok := f.tablesSeen[name]; ok { + return + } + if f.tablesSeen == nil { + f.tablesSeen = make(map[string]struct{}, 1) + } + f.tablesSeen[name] = struct{}{} + if f.tablesCSV.Len() > 0 { + f.size++ + f.tablesCSV.WriteByte(',') + } + f.size += int64(len(name)) + f.tablesCSV.WriteString(name) +} + +// Results returns metadata collected by the filter for an SQL statement. +func (f *metadataFinderFilter) Results() SQLMetadata { + return SQLMetadata{ + Size: f.size, + TablesCSV: f.tablesCSV.String(), + Commands: f.commands, + Comments: f.comments, + } +} + +// Reset implements tokenFilter. +func (f *metadataFinderFilter) Reset() { + for k := range f.tablesSeen { + delete(f.tablesSeen, k) + } + f.size = 0 + f.tablesCSV.Reset() + f.commands = f.commands[:0] + f.comments = f.comments[:0] +} + +// discardFilter is a token filter which discards certain elements from a query, such as +// comments and AS aliases by returning a nil buffer. +type discardFilter struct { + keepSQLAlias bool +} + +// Filter the given token so that a `nil` slice is returned if the token is in the token filtered list. +func (f *discardFilter) Filter(token, lastToken TokenKind, buffer []byte) (TokenKind, []byte, error) { + // filters based on previous token + switch lastToken { + case FilteredBracketedIdentifier: + if token != ']' { + // we haven't found the closing bracket yet, keep going + if token != ID { + // the token between the brackets *must* be an identifier, + // otherwise the query is invalid. + return LexError, nil, fmt.Errorf("expected identifier in bracketed filter, got %d", token) + } + return FilteredBracketedIdentifier, nil, nil + } + fallthrough + case As: + if token == '[' { + // the identifier followed by AS is an MSSQL bracketed identifier + // and will continue to be discarded until we find the corresponding + // closing bracket counter-part. See GitHub issue DataDog/datadog-trace-agent#475. + return FilteredBracketedIdentifier, nil, nil + } + if f.keepSQLAlias { + return token, buffer, nil + } + return Filtered, nil, nil + } + + // filters based on the current token; if the next token should be ignored, + // return the same token value (not FilteredGroupable) and nil + switch token { + case Comment: + return Filtered, nil, nil + case ';': + return markFilteredGroupable(token), nil, nil + case As: + if !f.keepSQLAlias { + return As, nil, nil + } + fallthrough + default: + return token, buffer, nil + } +} + +// Reset implements tokenFilter. +func (f *discardFilter) Reset() {} + +// replaceFilter is a token filter which obfuscates strings and numbers in queries by replacing them +// with the "?" character. +type replaceFilter struct { + replaceDigits bool +} + +// Filter the given token so that it will be replaced if in the token replacement list +func (f *replaceFilter) Filter(token, lastToken TokenKind, buffer []byte) (tokenType TokenKind, tokenBytes []byte, err error) { + switch lastToken { + case Savepoint: + return markFilteredGroupable(token), questionMark, nil + case '=': + switch token { + case DoubleQuotedString: + // double-quoted strings after assignments are eligible for obfuscation + return markFilteredGroupable(token), questionMark, nil + } + } + switch token { + case DollarQuotedString, String, Number, Null, Variable, PreparedStatement, BooleanLiteral, EscapeSequence: + return markFilteredGroupable(token), questionMark, nil + case '?': + // Cases like 'ARRAY [ ?, ? ]' should be collapsed into 'ARRAY [ ? ]' + return markFilteredGroupable(token), questionMark, nil + case TableName, ID: + if f.replaceDigits { + return token, replaceDigits(buffer), nil + } + fallthrough + default: + return token, buffer, nil + } +} + +// Reset implements tokenFilter. +func (f *replaceFilter) Reset() {} + +// groupingFilter is a token filter which groups together items replaced by the replaceFilter. It is meant +// to run immediately after it. +type groupingFilter struct { + groupFilter int // counts the number of values, e.g. 3 = ?, ?, ? + groupMulti int // counts the number of groups, e.g. 2 = (?, ?), (?, ?, ?) +} + +// Filter the given token so that it will be discarded if a grouping pattern +// has been recognized. A grouping is composed by items like: +// - '( ?, ?, ? )' +// - '( ?, ? ), ( ?, ? )' +func (f *groupingFilter) Filter(token, lastToken TokenKind, buffer []byte) (tokenType TokenKind, tokenBytes []byte, err error) { + // increasing the number of groups means that we're filtering an entire group + // because it can be represented with a single '( ? )' + if (lastToken == '(' && isFilteredGroupable(token)) || (token == '(' && f.groupMulti > 0) { + f.groupMulti++ + } + + // Potential commands that could indicate the start of a subquery. + isStartOfSubquery := token == Select || token == Delete || token == Update || token == ID + + switch { + case f.groupMulti > 0 && lastToken == FilteredGroupableParenthesis && isStartOfSubquery: + // this is the start of a new group that seems to be a nested query; + // cancel grouping. + f.Reset() + return token, append([]byte("( "), buffer...), nil + case isFilteredGroupable(token): + // the previous filter has dropped this token so we should start + // counting the group filter so that we accept only one '?' for + // the same group + f.groupFilter++ + + if f.groupFilter > 1 { + return markFilteredGroupable(token), nil, nil + } + case f.groupFilter > 0 && (token == ',' || token == '?'): + // if we are in a group drop all commas + return markFilteredGroupable(token), nil, nil + case f.groupMulti > 1: + // drop all tokens since we're in a counting group + // and they're duplicated + return markFilteredGroupable(token), nil, nil + case token != ',' && token != '(' && token != ')' && !isFilteredGroupable(token): + // when we're out of a group reset the filter state + f.Reset() + } + + return token, buffer, nil +} + +// isFilteredGroupable reports whether token is to be considered filtered groupable. +func isFilteredGroupable(token TokenKind) bool { + switch token { + case FilteredGroupable, FilteredGroupableParenthesis: + return true + default: + return false + } +} + +// markFilteredGroupable returns the appropriate TokenKind to mark this token as +// filtered groupable. +func markFilteredGroupable(token TokenKind) TokenKind { + switch token { + case '(': + return FilteredGroupableParenthesis + default: + return FilteredGroupable + } +} + +// Reset resets the groupingFilter so that it may be used again. +func (f *groupingFilter) Reset() { + f.groupFilter = 0 + f.groupMulti = 0 +} + +// ObfuscateSQLString quantizes and obfuscates the given input SQL query string. Quantization removes +// some elements such as comments and aliases and obfuscation attempts to hide sensitive information +// in strings and numbers by redacting them. +func (o *Obfuscator) ObfuscateSQLString(in string) (*ObfuscatedQuery, error) { + return o.ObfuscateSQLStringWithOptions(in, &o.opts.SQL) +} + +// ObfuscateSQLStringWithOptions accepts an optional SQLOptions to change the behavior of the obfuscator +// to quantize and obfuscate the given input SQL query string. Quantization removes some elements such as comments +// and aliases and obfuscation attempts to hide sensitive information in strings and numbers by redacting them. +func (o *Obfuscator) ObfuscateSQLStringWithOptions(in string, opts *SQLConfig) (*ObfuscatedQuery, error) { + if v, ok := o.queryCache.Get(in); ok { + return v.(*ObfuscatedQuery), nil + } + oq, err := o.obfuscateSQLString(in, opts) + if err != nil { + return oq, err + } + o.queryCache.Set(in, oq, oq.Cost()) + return oq, nil +} + +func (o *Obfuscator) obfuscateSQLString(in string, opts *SQLConfig) (*ObfuscatedQuery, error) { + lesc := o.useSQLLiteralEscapes() + tok := NewSQLTokenizer(in, lesc, opts) + out, err := attemptObfuscation(tok) + if err != nil && tok.SeenEscape() { + // If the tokenizer failed, but saw an escape character in the process, + // try again treating escapes differently + tok = NewSQLTokenizer(in, !lesc, opts) + if out, err2 := attemptObfuscation(tok); err2 == nil { + // If the second attempt succeeded, change the default behavior so that + // on the next run we get it right in the first run. + o.setSQLLiteralEscapes(!lesc) + return out, nil + } + } + return out, err +} + +// ObfuscatedQuery specifies information about an obfuscated SQL query. +type ObfuscatedQuery struct { + Query string `json:"query"` // the obfuscated SQL query + Metadata SQLMetadata `json:"metadata"` // metadata extracted from the SQL query +} + +// Cost returns the number of bytes needed to store all the fields +// of this ObfuscatedQuery. +func (oq *ObfuscatedQuery) Cost() int64 { + return int64(len(oq.Query)) + oq.Metadata.Size +} + +// attemptObfuscation attempts to obfuscate the SQL query loaded into the tokenizer, using the given set of filters. +func attemptObfuscation(tokenizer *SQLTokenizer) (*ObfuscatedQuery, error) { + var ( + out = bytes.NewBuffer(make([]byte, 0, len(tokenizer.buf))) + err error + lastToken TokenKind + metadata = metadataFinderFilter{ + collectTableNames: tokenizer.cfg.TableNames, + collectCommands: tokenizer.cfg.CollectCommands, + collectComments: tokenizer.cfg.CollectComments, + replaceDigits: tokenizer.cfg.ReplaceDigits, + } + discard = discardFilter{keepSQLAlias: tokenizer.cfg.KeepSQLAlias} + replace = replaceFilter{replaceDigits: tokenizer.cfg.ReplaceDigits} + grouping groupingFilter + ) + defer metadata.Reset() + // call Scan() function until tokens are available or if a LEX_ERROR is raised. After + // retrieving a token, send it to the tokenFilter chains so that the token is discarded + // or replaced. + for { + token, buff := tokenizer.Scan() + if token == EndChar { + break + } + if token == LexError { + return nil, fmt.Errorf("%v", tokenizer.Err()) + } + + if token, buff, err = metadata.Filter(token, lastToken, buff); err != nil { + return nil, err + } + if token, buff, err = discard.Filter(token, lastToken, buff); err != nil { + return nil, err + } + if token, buff, err = replace.Filter(token, lastToken, buff); err != nil { + return nil, err + } + if token, buff, err = grouping.Filter(token, lastToken, buff); err != nil { + return nil, err + } + if buff != nil { + if out.Len() != 0 { + switch token { + case ',': + case '=': + if lastToken == ':' { + // do not add a space before an equals if a colon was + // present before it. + break + } + fallthrough + default: + out.WriteRune(' ') + } + } + out.Write(buff) + } + lastToken = token + } + if out.Len() == 0 { + return nil, errors.New("result is empty") + } + return &ObfuscatedQuery{ + Query: out.String(), + Metadata: metadata.Results(), + }, nil +} + +// ObfuscateSQLExecPlan obfuscates query conditions in the provided JSON encoded execution plan. If normalize=True, +// then cost and row estimates are also obfuscated away. +func (o *Obfuscator) ObfuscateSQLExecPlan(jsonPlan string, normalize bool) (string, error) { + if normalize { + return o.sqlExecPlanNormalize.obfuscate([]byte(jsonPlan)) + } + return o.sqlExecPlan.obfuscate([]byte(jsonPlan)) +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql_tokenizer.go b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql_tokenizer.go new file mode 100644 index 00000000..f9c1e39b --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/obfuscate/sql_tokenizer.go @@ -0,0 +1,912 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package obfuscate + +import ( + "bytes" + "fmt" + "strings" + "unicode" + "unicode/utf8" +) + +// tokenizer.go implemenents a lexer-like iterator that tokenizes SQL and CQL +// strings, so that an external component can filter or alter each token of the +// string. This implementation can't be used as a real SQL lexer (so a parser +// cannot build the AST) because many rules are ignored to make the tokenizer +// simpler. +// This implementation was inspired by https://github.com/youtube/vitess sql parser +// TODO: add the license to the NOTICE file + +// TokenKind specifies the type of the token being scanned. It may be one of the defined +// constants below or in some cases the actual rune itself. +type TokenKind uint32 + +// EndChar is used to signal that the scanner has finished reading the query. This happens when +// there are no more characters left in the query or when invalid encoding is discovered. EndChar +// is an invalid rune value that can not be found in any valid string. +const EndChar = unicode.MaxRune + 1 + +// list of available tokens; this list has been reduced because we don't +// need a full-fledged tokenizer to implement a Lexer +const ( + LexError = TokenKind(57346) + iota + + ID + Limit + Null + String + DoubleQuotedString + DollarQuotedString // https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING + DollarQuotedFunc // a dollar-quoted string delimited by the tag "$func$"; gets special treatment when feature "dollar_quoted_func" is set + Number + BooleanLiteral + ValueArg + ListArg + Comment + Variable + Savepoint + PreparedStatement + EscapeSequence + NullSafeEqual + LE + GE + NE + Not + As + Alter + Drop + Create + Grant + Revoke + Commit + Begin + Truncate + Select + From + Update + Delete + Insert + Into + Join + TableName + ColonCast + + // PostgreSQL specific JSON operators + JSONSelect // -> + JSONSelectText // ->> + JSONSelectPath // #> + JSONSelectPathText // #>> + JSONContains // @> + JSONContainsLeft // <@ + JSONKeyExists // ? + JSONAnyKeysExist // ?| + JSONAllKeysExist // ?& + JSONDelete // #- + + // FilteredGroupable specifies that the given token has been discarded by one of the + // token filters and that it is groupable together with consecutive FilteredGroupable + // tokens. + FilteredGroupable + + // FilteredGroupableParenthesis is a parenthesis marked as filtered groupable. It is the + // beginning of either a group of values ('(') or a nested query. We track is as + // a special case for when it may start a nested query as opposed to just another + // value group to be obfuscated. + FilteredGroupableParenthesis + + // Filtered specifies that the token is a comma and was discarded by one + // of the filters. + Filtered + + // FilteredBracketedIdentifier specifies that we are currently discarding + // a bracketed identifier (MSSQL). + // See issue https://github.com/DataDog/datadog-trace-agent/issues/475. + FilteredBracketedIdentifier +) + +var tokenKindStrings = map[TokenKind]string{ + LexError: "LexError", + ID: "ID", + Limit: "Limit", + Null: "Null", + String: "String", + DoubleQuotedString: "DoubleQuotedString", + DollarQuotedString: "DollarQuotedString", + DollarQuotedFunc: "DollarQuotedFunc", + Number: "Number", + BooleanLiteral: "BooleanLiteral", + ValueArg: "ValueArg", + ListArg: "ListArg", + Comment: "Comment", + Variable: "Variable", + Savepoint: "Savepoint", + PreparedStatement: "PreparedStatement", + EscapeSequence: "EscapeSequence", + NullSafeEqual: "NullSafeEqual", + LE: "LE", + GE: "GE", + NE: "NE", + Not: "NOT", + As: "As", + Alter: "Alter", + Drop: "Drop", + Create: "Create", + Grant: "Grant", + Revoke: "Revoke", + Commit: "Commit", + Begin: "Begin", + Truncate: "Truncate", + Select: "Select", + From: "From", + Update: "Update", + Delete: "Delete", + Insert: "Insert", + Into: "Into", + Join: "Join", + TableName: "TableName", + ColonCast: "ColonCast", + FilteredGroupable: "FilteredGroupable", + FilteredGroupableParenthesis: "FilteredGroupableParenthesis", + Filtered: "Filtered", + FilteredBracketedIdentifier: "FilteredBracketedIdentifier", + JSONSelect: "JSONSelect", + JSONSelectText: "JSONSelectText", + JSONSelectPath: "JSONSelectPath", + JSONSelectPathText: "JSONSelectPathText", + JSONContains: "JSONContains", + JSONContainsLeft: "JSONContainsLeft", + JSONKeyExists: "JSONKeyExists", + JSONAnyKeysExist: "JSONAnyKeysExist", + JSONAllKeysExist: "JSONAllKeysExist", + JSONDelete: "JSONDelete", +} + +func (k TokenKind) String() string { + str, ok := tokenKindStrings[k] + if !ok { + return "" + } + return str +} + +const ( + // DBMSSQLServer is a MS SQL Server + DBMSSQLServer = "mssql" + // DBMSPostgres is a PostgreSQL Server + DBMSPostgres = "postgresql" +) + +const escapeCharacter = '\\' + +// SQLTokenizer is the struct used to generate SQL +// tokens for the parser. +type SQLTokenizer struct { + pos int // byte offset of lastChar + lastChar rune // last read rune + buf []byte // buf holds the query that we are parsing + off int // off is the index into buf where the unread portion of the query begins. + err error // any error occurred while reading + + curlys uint32 // number of active open curly braces in top-level SQL escape sequences. + + literalEscapes bool // indicates we should not treat backslashes as escape characters + seenEscape bool // indicates whether this tokenizer has seen an escape character within a string + + cfg *SQLConfig +} + +// NewSQLTokenizer creates a new SQLTokenizer for the given SQL string. The literalEscapes argument specifies +// whether escape characters should be treated literally or as such. +func NewSQLTokenizer(sql string, literalEscapes bool, cfg *SQLConfig) *SQLTokenizer { + if cfg == nil { + cfg = new(SQLConfig) + } + return &SQLTokenizer{ + buf: []byte(sql), + cfg: cfg, + literalEscapes: literalEscapes, + } +} + +// Reset the underlying buffer and positions +func (tkn *SQLTokenizer) Reset(in string) { + tkn.pos = 0 + tkn.lastChar = 0 + tkn.buf = []byte(in) + tkn.off = 0 + tkn.err = nil +} + +// keywords used to recognize string tokens +var keywords = map[string]TokenKind{ + "NULL": Null, + "TRUE": BooleanLiteral, + "FALSE": BooleanLiteral, + "SAVEPOINT": Savepoint, + "LIMIT": Limit, + "AS": As, + "ALTER": Alter, + "CREATE": Create, + "GRANT": Grant, + "REVOKE": Revoke, + "COMMIT": Commit, + "BEGIN": Begin, + "TRUNCATE": Truncate, + "DROP": Drop, + "SELECT": Select, + "FROM": From, + "UPDATE": Update, + "DELETE": Delete, + "INSERT": Insert, + "INTO": Into, + "JOIN": Join, +} + +// Err returns the last error that the tokenizer encountered, or nil. +func (tkn *SQLTokenizer) Err() error { return tkn.err } + +func (tkn *SQLTokenizer) setErr(format string, args ...interface{}) { + if tkn.err != nil { + return + } + tkn.err = fmt.Errorf("at position %d: %v", tkn.pos, fmt.Errorf(format, args...)) +} + +// SeenEscape returns whether or not this tokenizer has seen an escape character within a scanned string +func (tkn *SQLTokenizer) SeenEscape() bool { return tkn.seenEscape } + +// Scan scans the tokenizer for the next token and returns +// the token type and the token buffer. +func (tkn *SQLTokenizer) Scan() (TokenKind, []byte) { + if tkn.lastChar == 0 { + tkn.advance() + } + tkn.SkipBlank() + + switch ch := tkn.lastChar; { + case isLeadingLetter(ch) && + !(tkn.cfg.DBMS == DBMSPostgres && ch == '@'): + // The '@' symbol should not be considered part of an identifier in + // postgres, so we skip this in the case where the DBMS is postgres + // and ch is '@'. + return tkn.scanIdentifier() + case isDigit(ch): + return tkn.scanNumber(false) + default: + tkn.advance() + if tkn.lastChar == EndChar && tkn.err != nil { + // advance discovered an invalid encoding. We should return early. + return LexError, nil + } + switch ch { + case EndChar: + if tkn.err != nil { + return LexError, nil + } + return EndChar, nil + case ':': + if tkn.lastChar == ':' { + tkn.advance() + return ColonCast, []byte("::") + } + if unicode.IsSpace(tkn.lastChar) { + // example scenario: "autovacuum: VACUUM ANALYZE fake.table" + return TokenKind(ch), tkn.bytes() + } + if tkn.lastChar != '=' { + return tkn.scanBindVar() + } + fallthrough + case '~': + switch tkn.lastChar { + case '*': + tkn.advance() + return TokenKind('~'), []byte("~*") + default: + return TokenKind(ch), tkn.bytes() + } + case '?': + if tkn.cfg.DBMS == DBMSPostgres { + switch tkn.lastChar { + case '|': + tkn.advance() + return JSONAnyKeysExist, []byte("?|") + case '&': + tkn.advance() + return JSONAllKeysExist, []byte("?&") + default: + return JSONKeyExists, tkn.bytes() + } + } + fallthrough + case '=', ',', ';', '(', ')', '+', '*', '&', '|', '^', ']': + return TokenKind(ch), tkn.bytes() + case '[': + if tkn.cfg.DBMS == DBMSSQLServer { + return tkn.scanString(']', DoubleQuotedString) + } + return TokenKind(ch), tkn.bytes() + case '.': + if isDigit(tkn.lastChar) { + return tkn.scanNumber(true) + } + return TokenKind(ch), tkn.bytes() + case '/': + switch tkn.lastChar { + case '/': + tkn.advance() + return tkn.scanCommentType1("//") + case '*': + tkn.advance() + return tkn.scanCommentType2() + default: + return TokenKind(ch), tkn.bytes() + } + case '-': + switch { + case tkn.lastChar == '-': + tkn.advance() + return tkn.scanCommentType1("--") + case tkn.lastChar == '>': + if tkn.cfg.DBMS == DBMSPostgres { + tkn.advance() + switch tkn.lastChar { + case '>': + tkn.advance() + return JSONSelectText, []byte("->>") + default: + return JSONSelect, []byte("->") + } + } + fallthrough + case isDigit(tkn.lastChar): + return tkn.scanNumber(false) + case tkn.lastChar == '.': + tkn.advance() + if isDigit(tkn.lastChar) { + return tkn.scanNumber(true) + } + tkn.lastChar = '.' + tkn.pos-- + fallthrough + default: + return TokenKind(ch), tkn.bytes() + } + case '#': + switch tkn.cfg.DBMS { + case DBMSSQLServer: + return tkn.scanIdentifier() + case DBMSPostgres: + switch tkn.lastChar { + case '>': + tkn.advance() + switch tkn.lastChar { + case '>': + tkn.advance() + return JSONSelectPathText, []byte("#>>") + default: + return JSONSelectPath, []byte("#>") + } + case '-': + tkn.advance() + return JSONDelete, []byte("#-") + default: + return TokenKind(ch), tkn.bytes() + } + default: + tkn.advance() + return tkn.scanCommentType1("#") + } + case '<': + switch tkn.lastChar { + case '>': + tkn.advance() + return NE, []byte("<>") + case '=': + tkn.advance() + switch tkn.lastChar { + case '>': + tkn.advance() + return NullSafeEqual, []byte("<=>") + default: + return LE, []byte("<=") + } + case '@': + if tkn.cfg.DBMS == DBMSPostgres { + // check for JSONContainsLeft (<@) + tkn.advance() + return JSONContainsLeft, []byte("<@") + } + fallthrough + default: + return TokenKind(ch), tkn.bytes() + } + case '>': + if tkn.lastChar == '=' { + tkn.advance() + return GE, []byte(">=") + } + return TokenKind(ch), tkn.bytes() + case '!': + switch tkn.lastChar { + case '=': + tkn.advance() + return NE, []byte("!=") + case '~': + tkn.advance() + switch tkn.lastChar { + case '*': + tkn.advance() + return NE, []byte("!~*") + default: + return NE, []byte("!~") + } + default: + if isValidCharAfterOperator(tkn.lastChar) { + return Not, tkn.bytes() + } + tkn.setErr(`unexpected char "%c" (%d) after "!"`, tkn.lastChar, tkn.lastChar) + return LexError, tkn.bytes() + } + case '\'': + return tkn.scanString(ch, String) + case '"': + return tkn.scanString(ch, DoubleQuotedString) + case '`': + return tkn.scanString(ch, ID) + case '%': + if tkn.lastChar == '(' { + return tkn.scanVariableIdentifier('%') + } + if isLetter(tkn.lastChar) { + // format parameter (e.g. '%s') + return tkn.scanFormatParameter('%') + } + // modulo operator (e.g. 'id % 8') + return TokenKind(ch), tkn.bytes() + case '$': + if isDigit(tkn.lastChar) { + // TODO(gbbr): the first digit after $ does not necessarily guarantee + // that this isn't a dollar-quoted string constant. We might eventually + // want to cover for this use-case too (e.g. $1$some text$1$). + return tkn.scanPreparedStatement('$') + } + kind, tok := tkn.scanDollarQuotedString() + if kind == DollarQuotedFunc { + // this is considered an embedded query, we should try and + // obfuscate it + out, err := attemptObfuscation(NewSQLTokenizer(string(tok), tkn.literalEscapes, tkn.cfg)) + if err != nil { + // if we can't obfuscate it, treat it as a regular string + return DollarQuotedString, tok + } + tok = append(append([]byte("$func$"), []byte(out.Query)...), []byte("$func$")...) + } + return kind, tok + case '@': + if tkn.cfg.DBMS == DBMSPostgres { + // For postgres the @ symbol is reserved as an operator + // https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-OPERATORS + // And is used as a json operator + // https://www.postgresql.org/docs/9.5/functions-json.html + switch tkn.lastChar { + case '>': + tkn.advance() + return JSONContains, []byte("@>") + default: + return TokenKind(ch), tkn.bytes() + } + } + fallthrough + case '{': + if tkn.pos == 1 || tkn.curlys > 0 { + // Do not fully obfuscate top-level SQL escape sequences like {{[?=]call procedure-name[([parameter][,parameter]...)]}. + // We want these to display a bit more context than just a plain '?' + // See: https://docs.oracle.com/cd/E13157_01/wlevs/docs30/jdbc_drivers/sqlescape.html + tkn.curlys++ + return TokenKind(ch), tkn.bytes() + } + return tkn.scanEscapeSequence('{') + case '}': + if tkn.curlys == 0 { + // A closing curly brace has no place outside an in-progress top-level SQL escape sequence + // started by the '{' switch-case. + tkn.setErr(`unexpected byte %d`, ch) + return LexError, tkn.bytes() + } + tkn.curlys-- + return TokenKind(ch), tkn.bytes() + default: + tkn.setErr(`unexpected byte %d`, ch) + return LexError, tkn.bytes() + } + } +} + +// SkipBlank moves the tokenizer forward until hitting a non-whitespace character +// The whitespace definition used here is the same as unicode.IsSpace +func (tkn *SQLTokenizer) SkipBlank() { + for unicode.IsSpace(tkn.lastChar) { + tkn.advance() + } + tkn.bytes() +} + +// toUpper is a modified version of bytes.ToUpper. It returns an upper-cased version of the byte +// slice src with all Unicode letters mapped to their upper case. It is modified to also accept a +// byte slice dst as an argument, the underlying storage of which (up to the capacity of dst) +// will be used as the destination of the upper-case copy of src, if it fits. As a special case, +// toUpper will return src if the byte slice is already upper-case. This function is used rather +// than bytes.ToUpper to improve the memory performance of the obfuscator by saving unnecessary +// allocations happening in bytes.ToUpper +func toUpper(src, dst []byte) []byte { + dst = dst[:0] + isASCII, hasLower := true, false + for i := 0; i < len(src); i++ { + c := src[i] + if c >= utf8.RuneSelf { + isASCII = false + break + } + hasLower = hasLower || ('a' <= c && c <= 'z') + } + if cap(dst) < len(src) { + dst = make([]byte, 0, len(src)) + } + if isASCII { // optimize for ASCII-only byte slices. + if !hasLower { + // Just return src. + return src + } + dst = dst[:len(src)] + for i := 0; i < len(src); i++ { + c := src[i] + if 'a' <= c && c <= 'z' { + c -= 'a' - 'A' + } + dst[i] = c + } + return dst + } + // This *could* be optimized, but it's an uncommon case. + return bytes.Map(unicode.ToUpper, src) +} + +func (tkn *SQLTokenizer) scanIdentifier() (TokenKind, []byte) { + tkn.advance() + for isLetter(tkn.lastChar) || isDigit(tkn.lastChar) || strings.ContainsRune(".*$", tkn.lastChar) { + tkn.advance() + } + + t := tkn.bytes() + // Space allows us to upper-case identifiers 256 bytes long or less without allocating heap + // storage for them, since space is allocated on the stack. A size of 256 bytes was chosen + // based on the allowed length of sql identifiers in various sql implementations. + var space [256]byte + upper := toUpper(t, space[:0]) + if keywordID, found := keywords[string(upper)]; found { + return keywordID, t + } + return ID, t +} + +func (tkn *SQLTokenizer) scanVariableIdentifier(prefix rune) (TokenKind, []byte) { + for tkn.advance(); tkn.lastChar != ')' && tkn.lastChar != EndChar; tkn.advance() { + } + tkn.advance() + if !isLetter(tkn.lastChar) { + tkn.setErr(`invalid character after variable identifier: "%c" (%d)`, tkn.lastChar, tkn.lastChar) + return LexError, tkn.bytes() + } + tkn.advance() + return Variable, tkn.bytes() +} + +func (tkn *SQLTokenizer) scanFormatParameter(prefix rune) (TokenKind, []byte) { + tkn.advance() + return Variable, tkn.bytes() +} + +// scanDollarQuotedString scans a Postgres dollar-quoted string constant. +// See: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING +func (tkn *SQLTokenizer) scanDollarQuotedString() (TokenKind, []byte) { + kind, tag := tkn.scanString('$', String) + if kind == LexError { + return kind, tkn.bytes() + } + var ( + got int + buf bytes.Buffer + ) + delim := tag + // on empty strings, tkn.scanString returns the delimiters + if string(delim) != "$$" { + // on non-empty strings, the delimiter is $tag$ + delim = append([]byte{'$'}, delim...) + delim = append(delim, '$') + } + for { + ch := tkn.lastChar + tkn.advance() + if ch == EndChar { + tkn.setErr("unexpected EOF in dollar-quoted string") + return LexError, buf.Bytes() + } + if byte(ch) == delim[got] { + got++ + if got == len(delim) { + break + } + continue + } + if got > 0 { + _, err := buf.Write(delim[:got]) + if err != nil { + tkn.setErr("error reading dollar-quoted string: %v", err) + return LexError, buf.Bytes() + } + got = 0 + } + buf.WriteRune(ch) + } + if tkn.cfg.DollarQuotedFunc && string(delim) == "$func$" { + return DollarQuotedFunc, buf.Bytes() + } + return DollarQuotedString, buf.Bytes() +} + +func (tkn *SQLTokenizer) scanPreparedStatement(prefix rune) (TokenKind, []byte) { + // a prepared statement expect a digit identifier like $1 + if !isDigit(tkn.lastChar) { + tkn.setErr(`prepared statements must start with digits, got "%c" (%d)`, tkn.lastChar, tkn.lastChar) + return LexError, tkn.bytes() + } + + // scanNumber keeps the prefix rune intact. + // read numbers and return an error if any + token, buff := tkn.scanNumber(false) + if token == LexError { + tkn.setErr("invalid number") + return LexError, tkn.bytes() + } + return PreparedStatement, buff +} + +func (tkn *SQLTokenizer) scanEscapeSequence(braces rune) (TokenKind, []byte) { + for tkn.lastChar != '}' && tkn.lastChar != EndChar { + tkn.advance() + } + + // we've reached the end of the string without finding + // the closing curly braces + if tkn.lastChar == EndChar { + tkn.setErr("unexpected EOF in escape sequence") + return LexError, tkn.bytes() + } + + tkn.advance() + return EscapeSequence, tkn.bytes() +} + +func (tkn *SQLTokenizer) scanBindVar() (TokenKind, []byte) { + token := ValueArg + if tkn.lastChar == ':' { + token = ListArg + tkn.advance() + } + if !isLetter(tkn.lastChar) && !isDigit(tkn.lastChar) { + tkn.setErr(`bind variables should start with letters or digits, got "%c" (%d)`, tkn.lastChar, tkn.lastChar) + return LexError, tkn.bytes() + } + for isLetter(tkn.lastChar) || isDigit(tkn.lastChar) || tkn.lastChar == '.' { + tkn.advance() + } + return token, tkn.bytes() +} + +func (tkn *SQLTokenizer) scanMantissa(base int) { + for digitVal(tkn.lastChar) < base { + tkn.advance() + } +} + +func (tkn *SQLTokenizer) scanNumber(seenDecimalPoint bool) (TokenKind, []byte) { + if seenDecimalPoint { + tkn.scanMantissa(10) + goto exponent + } + + if tkn.lastChar == '0' { + // int or float + tkn.advance() + if tkn.lastChar == 'x' || tkn.lastChar == 'X' { + // hexadecimal int + tkn.advance() + tkn.scanMantissa(16) + } else { + // octal int or float + tkn.scanMantissa(8) + if tkn.lastChar == '8' || tkn.lastChar == '9' { + tkn.scanMantissa(10) + } + if tkn.lastChar == '.' || tkn.lastChar == 'e' || tkn.lastChar == 'E' { + goto fraction + } + } + goto exit + } + + // decimal int or float + tkn.scanMantissa(10) + +fraction: + if tkn.lastChar == '.' { + tkn.advance() + tkn.scanMantissa(10) + } + +exponent: + if tkn.lastChar == 'e' || tkn.lastChar == 'E' { + tkn.advance() + if tkn.lastChar == '+' || tkn.lastChar == '-' { + tkn.advance() + } + tkn.scanMantissa(10) + } + +exit: + t := tkn.bytes() + if len(t) == 0 { + tkn.setErr("Parse error: ended up with zero-length number.") + return LexError, nil + } + return Number, t +} + +func (tkn *SQLTokenizer) scanString(delim rune, kind TokenKind) (TokenKind, []byte) { + buf := bytes.NewBuffer(tkn.buf[:0]) + for { + ch := tkn.lastChar + tkn.advance() + if ch == delim { + if tkn.lastChar == delim { + // doubling a delimiter is the default way to embed the delimiter within a string + tkn.advance() + } else { + // a single delimiter denotes the end of the string + break + } + } else if ch == escapeCharacter { + tkn.seenEscape = true + + if !tkn.literalEscapes { + // treat as an escape character + ch = tkn.lastChar + tkn.advance() + } + } + if ch == EndChar { + tkn.setErr("unexpected EOF in string") + return LexError, buf.Bytes() + } + buf.WriteRune(ch) + } + if kind == ID && buf.Len() == 0 || bytes.IndexFunc(buf.Bytes(), func(r rune) bool { return !unicode.IsSpace(r) }) == -1 { + // This string is an empty or white-space only identifier. + // We should keep the start and end delimiters in order to + // avoid creating invalid queries. + // See: https://github.com/DataDog/datadog-trace-agent/issues/316 + return kind, append(runeBytes(delim), runeBytes(delim)...) + } + return kind, buf.Bytes() +} + +func (tkn *SQLTokenizer) scanCommentType1(prefix string) (TokenKind, []byte) { + for tkn.lastChar != EndChar { + if tkn.lastChar == '\n' { + tkn.advance() + break + } + tkn.advance() + } + return Comment, tkn.bytes() +} + +func (tkn *SQLTokenizer) scanCommentType2() (TokenKind, []byte) { + for { + if tkn.lastChar == '*' { + tkn.advance() + if tkn.lastChar == '/' { + tkn.advance() + break + } + continue + } + if tkn.lastChar == EndChar { + tkn.setErr("unexpected EOF in comment") + return LexError, tkn.bytes() + } + tkn.advance() + } + return Comment, tkn.bytes() +} + +// advance advances the tokenizer to the next rune. If the decoder encounters an error decoding, or +// the end of the buffer is reached, tkn.lastChar will be set to EndChar. In case of a decoding +// error, tkn.err will also be set. +func (tkn *SQLTokenizer) advance() { + ch, n := utf8.DecodeRune(tkn.buf[tkn.off:]) + if ch == utf8.RuneError && n < 2 { + tkn.pos++ + tkn.lastChar = EndChar + if n == 1 { + tkn.setErr("invalid UTF-8 encoding beginning with 0x%x", tkn.buf[tkn.off]) + } + return + } + if tkn.lastChar != 0 || tkn.pos > 0 { + // we are past the first character + tkn.pos += n + } + tkn.off += n + tkn.lastChar = ch +} + +// bytes returns all the bytes that were advanced over since its last call. +// This excludes tkn.lastChar, which will remain in the buffer +func (tkn *SQLTokenizer) bytes() []byte { + if tkn.lastChar == EndChar { + ret := tkn.buf[:tkn.off] + tkn.buf = tkn.buf[tkn.off:] + tkn.off = 0 + return ret + } + lastLen := utf8.RuneLen(tkn.lastChar) + ret := tkn.buf[:tkn.off-lastLen] + tkn.buf = tkn.buf[tkn.off-lastLen:] + tkn.off = lastLen + return ret +} + +// Position exports the tokenizer's current position in the query +func (tkn *SQLTokenizer) Position() int { + return tkn.pos +} + +func isLeadingLetter(ch rune) bool { + return unicode.IsLetter(ch) || ch == '_' || ch == '@' +} + +func isLetter(ch rune) bool { + return isLeadingLetter(ch) || ch == '#' +} + +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch) - '0' + case 'a' <= ch && ch <= 'f': + return int(ch) - 'a' + 10 + case 'A' <= ch && ch <= 'F': + return int(ch) - 'A' + 10 + } + return 16 // larger than any legal digit val +} + +func isDigit(ch rune) bool { return '0' <= ch && ch <= '9' } + +// runeBytes converts the given rune to a slice of bytes. +func runeBytes(r rune) []byte { + buf := make([]byte, utf8.UTFMax) + n := utf8.EncodeRune(buf, r) + return buf[:n] +} + +// isValidCharAfterOperator returns true if c is a valid character after an operator +func isValidCharAfterOperator(c rune) bool { + return c == '(' || c == '`' || c == '\'' || c == '"' || c == '+' || c == '-' || unicode.IsSpace(c) || isLetter(c) || isDigit(c) +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/LICENSE b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/LICENSE new file mode 100644 index 00000000..b370545b --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/LICENSE @@ -0,0 +1,200 @@ + 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 2016-present Datadog, Inc. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/configs.go b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/configs.go new file mode 100644 index 00000000..0df551cc --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/configs.go @@ -0,0 +1,479 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022-present Datadog, Inc. + +package state + +import ( + "encoding/json" + "errors" + "fmt" + + "github.com/DataDog/go-tuf/data" +) + +/* + To add support for a new product: + + 1. Add the definition of the product to the const() block of products and the `allProducts` list. + 2. Define the serialized configuration struct as well as a function to parse the config from a []byte. + 3. Add the product to the `parseConfig` function + 4. Add a method on the `Repository` to retrieved typed configs for the product. +*/ + +var allProducts = []string{ProductAPMSampling, ProductCWSDD, ProductCWSCustom, ProductCWSProfiles, ProductASM, ProductASMFeatures, ProductASMDD, ProductASMData, ProductAPMTracing} + +const ( + // ProductAPMSampling is the apm sampling product + ProductAPMSampling = "APM_SAMPLING" + // ProductCWSDD is the cloud workload security product managed by datadog employees + ProductCWSDD = "CWS_DD" + // ProductCWSCustom is the cloud workload security product managed by datadog customers + ProductCWSCustom = "CWS_CUSTOM" + // ProductCWSProfile is the cloud workload security profile product + ProductCWSProfiles = "CWS_SECURITY_PROFILES" + // ProductASM is the ASM product used by customers to issue rules configurations + ProductASM = "ASM" + // ProductASMFeatures is the ASM product used form ASM activation through remote config + ProductASMFeatures = "ASM_FEATURES" + // ProductASMDD is the application security monitoring product managed by datadog employees + ProductASMDD = "ASM_DD" + // ProductASMData is the ASM product used to configure WAF rules data + ProductASMData = "ASM_DATA" + // ProductAPMTracing is the apm tracing product + ProductAPMTracing = "APM_TRACING" +) + +// ErrNoConfigVersion occurs when a target file's custom meta is missing the config version +var ErrNoConfigVersion = errors.New("version missing in custom file meta") + +func parseConfig(product string, raw []byte, metadata Metadata) (interface{}, error) { + var c interface{} + var err error + switch product { + case ProductAPMSampling: + c, err = parseConfigAPMSampling(raw, metadata) + case ProductASMFeatures: + c, err = parseASMFeaturesConfig(raw, metadata) + case ProductCWSDD: + c, err = parseConfigCWSDD(raw, metadata) + case ProductCWSCustom: + c, err = parseConfigCWSCustom(raw, metadata) + case ProductCWSProfiles: + c, err = parseConfigCWSProfiles(raw, metadata) + case ProductASM: + c, err = parseConfigASM(raw, metadata) + case ProductASMDD: + c, err = parseConfigASMDD(raw, metadata) + case ProductASMData: + c, err = parseConfigASMData(raw, metadata) + case ProductAPMTracing: + c, err = parseConfigAPMTracing(raw, metadata) + default: + return nil, fmt.Errorf("unknown product - %s", product) + } + + return c, err +} + +// APMSamplingConfig is a deserialized APM Sampling configuration file +// along with its associated remote config metadata. +type APMSamplingConfig struct { + Config []byte + Metadata Metadata +} + +func parseConfigAPMSampling(data []byte, metadata Metadata) (APMSamplingConfig, error) { + // We actually don't parse the payload here, we delegate this responsibility to the trace agent + return APMSamplingConfig{ + Config: data, + Metadata: metadata, + }, nil +} + +// APMConfigs returns the currently active APM configs +func (r *Repository) APMConfigs() map[string]APMSamplingConfig { + typedConfigs := make(map[string]APMSamplingConfig) + + configs := r.getConfigs(ProductAPMSampling) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(APMSamplingConfig) + if !ok { + panic("unexpected config stored as APMSamplingConfig") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ConfigCWSDD is a deserialized CWS DD configuration file along with its +// associated remote config metadata +type ConfigCWSDD struct { + Config []byte + Metadata Metadata +} + +func parseConfigCWSDD(data []byte, metadata Metadata) (ConfigCWSDD, error) { + return ConfigCWSDD{ + Config: data, + Metadata: metadata, + }, nil +} + +// CWSDDConfigs returns the currently active CWSDD config files +func (r *Repository) CWSDDConfigs() map[string]ConfigCWSDD { + typedConfigs := make(map[string]ConfigCWSDD) + + configs := r.getConfigs(ProductCWSDD) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(ConfigCWSDD) + if !ok { + panic("unexpected config stored as CWSDD Config") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ConfigCWSCustom is a deserialized CWS Custom configuration file along with its +// associated remote config metadata +type ConfigCWSCustom struct { + Config []byte + Metadata Metadata +} + +func parseConfigCWSCustom(data []byte, metadata Metadata) (ConfigCWSCustom, error) { + return ConfigCWSCustom{ + Config: data, + Metadata: metadata, + }, nil +} + +// CWSCustomConfigs returns the currently active CWSCustom config files +func (r *Repository) CWSCustomConfigs() map[string]ConfigCWSCustom { + typedConfigs := make(map[string]ConfigCWSCustom) + + configs := r.getConfigs(ProductCWSCustom) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(ConfigCWSCustom) + if !ok { + panic("unexpected config stored as CWS_CUSTOM Config") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ConfigCWSProfiles is a deserialized CWS Profile configuration file along with its +// associated remote config metadata +type ConfigCWSProfiles struct { + Config []byte + Metadata Metadata +} + +func parseConfigCWSProfiles(data []byte, metadata Metadata) (ConfigCWSProfiles, error) { + return ConfigCWSProfiles{ + Config: data, + Metadata: metadata, + }, nil +} + +// CWSProfilesConfigs returns the currently active CWSProfiles config files +func (r *Repository) CWSProfilesConfigs() map[string]ConfigCWSProfiles { + typedConfigs := make(map[string]ConfigCWSProfiles) + + configs := r.getConfigs(ProductCWSProfiles) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(ConfigCWSProfiles) + if !ok { + panic("unexpected config stored as CWS_SECURITY_PROFILES Config") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ConfigASM is a deserialized ASM configuration file along with its +// associated remote config metadata +type ConfigASM struct { + Config []byte + Metadata Metadata +} + +func parseConfigASM(data []byte, metadata Metadata) (ConfigASMDD, error) { + return ConfigASMDD{ + Config: data, + Metadata: metadata, + }, nil +} + +// ASMConfigs returns the currently active ASM configs +func (r *Repository) ASMConfigs() map[string]ConfigASM { + typedConfigs := make(map[string]ConfigASM) + + configs := r.getConfigs(ProductASM) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(ConfigASM) + if !ok { + panic("unexpected config stored as ASM Config") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ConfigASMDD is a deserialized ASM DD configuration file along with its +// associated remote config metadata +type ConfigASMDD struct { + Config []byte + Metadata Metadata +} + +func parseConfigASMDD(data []byte, metadata Metadata) (ConfigASMDD, error) { + return ConfigASMDD{ + Config: data, + Metadata: metadata, + }, nil +} + +// ASMDDConfigs returns the currently active ASMDD configs +func (r *Repository) ASMDDConfigs() map[string]ConfigASMDD { + typedConfigs := make(map[string]ConfigASMDD) + + configs := r.getConfigs(ProductASMDD) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(ConfigASMDD) + if !ok { + panic("unexpected config stored as ASMDD Config") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ASMFeaturesConfig is a deserialized configuration file that indicates whether ASM should be enabled +// within a tracer, along with its associated remote config metadata. +type ASMFeaturesConfig struct { + Config ASMFeaturesData + Metadata Metadata +} + +// ASMFeaturesData describes the enabled state of ASM features +type ASMFeaturesData struct { + ASM struct { + Enabled bool `json:"enabled"` + } `json:"asm"` +} + +func parseASMFeaturesConfig(data []byte, metadata Metadata) (ASMFeaturesConfig, error) { + var f ASMFeaturesData + + err := json.Unmarshal(data, &f) + if err != nil { + return ASMFeaturesConfig{}, nil + } + + return ASMFeaturesConfig{ + Config: f, + Metadata: metadata, + }, nil +} + +// ASMFeaturesConfigs returns the currently active ASMFeatures configs +func (r *Repository) ASMFeaturesConfigs() map[string]ASMFeaturesConfig { + typedConfigs := make(map[string]ASMFeaturesConfig) + + configs := r.getConfigs(ProductASMFeatures) + + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(ASMFeaturesConfig) + if !ok { + panic("unexpected config stored as ASMFeaturesConfig") + } + + typedConfigs[path] = typed + } + + return typedConfigs +} + +// ApplyState represents the status of a configuration application by a remote configuration client +// Clients need to either ack the correct application of received configurations, or communicate that +// they haven't applied it yet, or communicate any error that may have happened while doing so +type ApplyState uint64 + +const ( + ApplyStateUnknown ApplyState = iota + ApplyStateUnacknowledged + ApplyStateAcknowledged + ApplyStateError +) + +// ApplyStatus is the processing status for a given configuration. +// It basically represents whether a config was successfully processed and apply, or if an error occurred +type ApplyStatus struct { + State ApplyState + Error string +} + +// ASMDataConfig is a deserialized configuration file that holds rules data that can be used +// by the ASM WAF for specific features (example: ip blocking). +type ASMDataConfig struct { + Config ASMDataRulesData + Metadata Metadata +} + +// ASMDataRulesData is a serializable array of rules data entries +type ASMDataRulesData struct { + RulesData []ASMDataRuleData `json:"rules_data"` +} + +// ASMDataRuleData is an entry in the rules data list held by an ASMData configuration +type ASMDataRuleData struct { + ID string `json:"id"` + Type string `json:"type"` + Data []ASMDataRuleDataEntry `json:"data"` +} + +// ASMDataRuleDataEntry represents a data entry in a rule data file +type ASMDataRuleDataEntry struct { + Expiration int64 `json:"expiration,omitempty"` + Value string `json:"value"` +} + +func parseConfigASMData(data []byte, metadata Metadata) (ASMDataConfig, error) { + cfg := ASMDataConfig{ + Metadata: metadata, + } + err := json.Unmarshal(data, &cfg.Config) + return cfg, err +} + +// ASMDataConfigs returns the currently active ASMData configs +func (r *Repository) ASMDataConfigs() map[string]ASMDataConfig { + typedConfigs := make(map[string]ASMDataConfig) + configs := r.getConfigs(ProductASMData) + + for path, cfg := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := cfg.(ASMDataConfig) + if !ok { + panic("unexpected config stored as ASMDataConfig") + } + typedConfigs[path] = typed + } + + return typedConfigs +} + +type APMTracingConfig struct { + Config []byte + Metadata Metadata +} + +func parseConfigAPMTracing(data []byte, metadata Metadata) (APMTracingConfig, error) { + // Delegate the parsing responsibility to the cluster agent + return APMTracingConfig{ + Config: data, + Metadata: metadata, + }, nil +} + +// APMTracingConfigs returns the currently active APMTracing configs +func (r *Repository) APMTracingConfigs() map[string]APMTracingConfig { + typedConfigs := make(map[string]APMTracingConfig) + configs := r.getConfigs(ProductAPMTracing) + for path, conf := range configs { + // We control this, so if this has gone wrong something has gone horribly wrong + typed, ok := conf.(APMTracingConfig) + if !ok { + panic("unexpected config stored as APMTracingConfig") + } + typedConfigs[path] = typed + } + return typedConfigs +} + +// Metadata stores remote config metadata for a given configuration +type Metadata struct { + Product string + ID string + Name string + Version uint64 + RawLength uint64 + Hashes map[string][]byte + ApplyStatus ApplyStatus +} + +func newConfigMetadata(parsedPath configPath, tfm data.TargetFileMeta) (Metadata, error) { + var m Metadata + m.ID = parsedPath.ConfigID + m.Product = parsedPath.Product + m.Name = parsedPath.Name + m.RawLength = uint64(tfm.Length) + m.Hashes = make(map[string][]byte) + for k, v := range tfm.Hashes { + m.Hashes[k] = []byte(v) + } + v, err := fileMetaVersion(tfm) + if err != nil { + return Metadata{}, err + } + m.Version = v + + return m, nil +} + +type fileMetaCustom struct { + Version *uint64 `json:"v"` +} + +func fileMetaVersion(fm data.TargetFileMeta) (uint64, error) { + if fm.Custom == nil { + return 0, ErrNoConfigVersion + } + fmc, err := parseFileMetaCustom(*fm.Custom) + if err != nil { + return 0, err + } + + return *fmc.Version, nil +} + +func parseFileMetaCustom(rawCustom []byte) (fileMetaCustom, error) { + var custom fileMetaCustom + err := json.Unmarshal(rawCustom, &custom) + if err != nil { + return fileMetaCustom{}, err + } + if custom.Version == nil { + return fileMetaCustom{}, ErrNoConfigVersion + } + return custom, nil +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/path.go b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/path.go new file mode 100644 index 00000000..d1a4d69e --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/path.go @@ -0,0 +1,100 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022-present Datadog, Inc. + +package state + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +var ( + // matches datadog//// for datadog//// + datadogPathRegexp = regexp.MustCompile(`^datadog/(\d+)/([^/]+)/([^/]+)/([^/]+)$`) + datadogPathRegexpGroups = 4 + + // matches employee/// for employee//// + employeePathRegexp = regexp.MustCompile(`^employee/([^/]+)/([^/]+)/([^/]+)$`) + employeePathRegexpGroups = 3 +) + +type source uint + +const ( + sourceUnknown source = iota + sourceDatadog + sourceEmployee +) + +type configPath struct { + Source source + OrgID int64 + Product string + ConfigID string + Name string +} + +func parseConfigPath(path string) (configPath, error) { + configType := parseConfigPathSource(path) + switch configType { + case sourceDatadog: + return parseDatadogConfigPath(path) + case sourceEmployee: + return parseEmployeeConfigPath(path) + } + return configPath{}, fmt.Errorf("config path '%s' has unknown source", path) +} + +func parseDatadogConfigPath(path string) (configPath, error) { + matchedGroups := datadogPathRegexp.FindStringSubmatch(path) + if len(matchedGroups) != datadogPathRegexpGroups+1 { + return configPath{}, fmt.Errorf("config file path '%s' has wrong format", path) + } + rawOrgID := matchedGroups[1] + orgID, err := strconv.ParseInt(rawOrgID, 10, 64) + if err != nil { + return configPath{}, fmt.Errorf("could not parse orgID '%s' in config file path: %v", rawOrgID, err) + } + rawProduct := matchedGroups[2] + if len(rawProduct) == 0 { + return configPath{}, fmt.Errorf("product is empty") + } + return configPath{ + Source: sourceDatadog, + OrgID: orgID, + Product: rawProduct, + ConfigID: matchedGroups[3], + Name: matchedGroups[4], + }, nil +} + +func parseEmployeeConfigPath(path string) (configPath, error) { + matchedGroups := employeePathRegexp.FindStringSubmatch(path) + if len(matchedGroups) != employeePathRegexpGroups+1 { + return configPath{}, fmt.Errorf("config file path '%s' has wrong format", path) + } + rawProduct := matchedGroups[1] + if len(rawProduct) == 0 { + return configPath{}, fmt.Errorf("product is empty") + } + return configPath{ + Source: sourceEmployee, + Product: rawProduct, + ConfigID: matchedGroups[2], + Name: matchedGroups[3], + }, nil +} + +func parseConfigPathSource(path string) source { + switch { + case strings.HasPrefix(path, "datadog/"): + return sourceDatadog + case strings.HasPrefix(path, "employee/"): + return sourceEmployee + } + return sourceUnknown +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/repository.go b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/repository.go new file mode 100644 index 00000000..06758cc8 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/repository.go @@ -0,0 +1,442 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022-present Datadog, Inc. + +package state + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "log" + "strings" + + "github.com/DataDog/go-tuf/data" +) + +var ( + // ErrMalformedEmbeddedRoot occurs when the TUF root provided is invalid + ErrMalformedEmbeddedRoot = errors.New("malformed embedded TUF root file provided") +) + +// RepositoryState contains all of the information about the current config files +// stored by the client to be able to make an update request to an Agent +type RepositoryState struct { + Configs []ConfigState + CachedFiles []CachedFile + TargetsVersion int64 + RootsVersion int64 + OpaqueBackendState []byte +} + +// ConfigState describes an applied config by the agent client. +type ConfigState struct { + Product string + ID string + Version uint64 + ApplyStatus ApplyStatus +} + +// CachedFile describes a cached file stored by the agent client +// +// Note: You may be wondering why this exists when `ConfigState` exists +// as well. The API for requesting updates does not mandate that a client +// cache config files. This implementation just happens to do so. +type CachedFile struct { + Path string + Length uint64 + Hashes map[string][]byte +} + +// An Update contains all the data needed to update a client's remote config repository state +type Update struct { + // TUFRoots contains, in order, updated roots that this repository needs to keep up with TUF validation + TUFRoots [][]byte + // TUFTargets is the latest TUF Targets file and is used to validate raw config files + TUFTargets []byte + // TargetFiles stores the raw config files by their full TUF path + TargetFiles map[string][]byte + // ClientcConfigs is a list of TUF path's corresponding to config files designated for this repository + ClientConfigs []string +} + +// isEmpty returns whether or not all the fields of `Update` are empty +func (u *Update) isEmpty() bool { + return len(u.TUFRoots) == 0 && len(u.TUFTargets) == 0 && (u.TargetFiles == nil || len(u.TargetFiles) == 0) && len(u.ClientConfigs) == 0 +} + +// Repository is a remote config client used in a downstream process to retrieve +// remote config updates from an Agent. +type Repository struct { + // TUF related data + latestTargets *data.Targets + tufRootsClient *tufRootsClient + opaqueBackendState []byte + + // Unverified mode + tufVerificationEnabled bool + latestRootVersion int64 + + // Config file storage + metadata map[string]Metadata + configs map[string]map[string]interface{} +} + +// NewRepository creates a new remote config repository that will track +// both TUF metadata and raw config files for a client. +func NewRepository(embeddedRoot []byte) (*Repository, error) { + if embeddedRoot == nil { + return nil, ErrMalformedEmbeddedRoot + } + + configs := make(map[string]map[string]interface{}) + for _, product := range allProducts { + configs[product] = make(map[string]interface{}) + } + + tufRootsClient, err := newTufRootsClient(embeddedRoot) + if err != nil { + return nil, err + } + + return &Repository{ + latestTargets: data.NewTargets(), + tufRootsClient: tufRootsClient, + metadata: make(map[string]Metadata), + configs: configs, + tufVerificationEnabled: true, + }, nil +} + +// NewUnverifiedRepository creates a new remote config repository that will +// track config files for a client WITHOUT verifying any TUF related metadata. +// +// When creating this we pretend we have a root version of 1, as the backend expects +// to not have to send the initial "embedded" root. +func NewUnverifiedRepository() (*Repository, error) { + configs := make(map[string]map[string]interface{}) + for _, product := range allProducts { + configs[product] = make(map[string]interface{}) + } + + return &Repository{ + latestTargets: data.NewTargets(), + metadata: make(map[string]Metadata), + configs: configs, + tufVerificationEnabled: false, + latestRootVersion: 1, // The backend expects us to start with a root version of 1. + }, nil +} + +// Update processes the ClientGetConfigsResponse from the Agent and updates the +// configuration state +func (r *Repository) Update(update Update) ([]string, error) { + var err error + var updatedTargets *data.Targets + var tmpRootClient *tufRootsClient + + // If there's literally nothing in the update, it's not an error. + if update.isEmpty() { + return []string{}, nil + } + + // TUF: Update the roots and verify the TUF Targets file (optional) + // + // We don't want to partially update the state, so we need a temporary client to hold the new root + // data until we know it's valid. Since verification is optional, if the repository was configured + // to not do TUF verification we only deserialize the TUF targets file. + if r.tufVerificationEnabled { + tmpRootClient, err = r.tufRootsClient.clone() + if err != nil { + return nil, err + } + err = tmpRootClient.updateRoots(update.TUFRoots) + if err != nil { + return nil, err + } + + updatedTargets, err = tmpRootClient.validateTargets(update.TUFTargets) + if err != nil { + return nil, err + } + } else { + updatedTargets, err = unsafeUnmarshalTargets(update.TUFTargets) + if err != nil { + return nil, err + } + } + + clientConfigsMap := make(map[string]struct{}) + for _, f := range update.ClientConfigs { + clientConfigsMap[f] = struct{}{} + } + + result := newUpdateResult() + + // 2: Check the config list and mark any missing configs as "to be removed" + for _, configs := range r.configs { + for path := range configs { + if _, ok := clientConfigsMap[path]; !ok { + result.removed = append(result.removed, path) + parsedPath, err := parseConfigPath(path) + if err != nil { + return nil, err + } + result.productsUpdated[parsedPath.Product] = true + } + } + } + + // 3: For all the files referenced in this update + for _, path := range update.ClientConfigs { + targetFileMetadata, ok := updatedTargets.Targets[path] + if !ok { + return nil, fmt.Errorf("missing config file in TUF targets - %s", path) + } + + // 3.a: Extract the product and ID from the path + parsedPath, err := parseConfigPath(path) + if err != nil { + return nil, err + } + + // 3.b and 3.c: Check if this configuration is either new or has been modified + storedMetadata, exists := r.metadata[path] + if exists && hashesEqual(targetFileMetadata.Hashes, storedMetadata.Hashes) { + continue + } + + // 3.d: Ensure that the raw configuration file is present in the + // update payload. + raw, ok := update.TargetFiles[path] + if !ok { + return nil, fmt.Errorf("missing update file - %s", path) + } + + // TUF: Validate the hash of the raw target file and ensure that it matches + // the TUF metadata + err = validateTargetFileHash(targetFileMetadata, raw) + if err != nil { + return nil, fmt.Errorf("error validating %s hash with TUF metadata - %v", path, err) + } + + // 3.e: Deserialize the configuration. + // 3.f: Store the update details for application later + // + // Note: We don't have to worry about extra fields as mentioned + // in the RFC because the encoding/json library handles that for us. + m, err := newConfigMetadata(parsedPath, targetFileMetadata) + if err != nil { + return nil, err + } + config, err := parseConfig(parsedPath.Product, raw, m) + if err != nil { + return nil, err + } + result.metadata[path] = m + result.changed[parsedPath.Product][path] = config + result.productsUpdated[parsedPath.Product] = true + } + + // 4.a: Store the new targets.signed.custom.opaque_client_state + // TUF: Store the updated roots now that everything has validated + if r.tufVerificationEnabled { + r.tufRootsClient = tmpRootClient + } else if update.TUFRoots != nil && len(update.TUFRoots) > 0 { + v, err := extractRootVersion(update.TUFRoots[len(update.TUFRoots)-1]) + if err != nil { + return nil, err + } + r.latestRootVersion = v + } + r.latestTargets = updatedTargets + if r.latestTargets.Custom != nil { + r.opaqueBackendState = extractOpaqueBackendState(*r.latestTargets.Custom) + } + + // Upstream may not want to take any actions if the update result doesn't + // change any configs. + if result.isEmpty() { + return nil, nil + } + + changedProducts := make([]string, 0) + for product, updated := range result.productsUpdated { + if updated { + changedProducts = append(changedProducts, product) + } + } + + // 4.b/4.rave the new state and apply cleanups + r.applyUpdateResult(update, result) + + return changedProducts, nil +} + +// UpdateApplyStatus updates the config's metadata to reflect its processing state +// Can be used after a call to Update() in order to tell the repository which config was acked, which +// wasn't and which errors occurred while processing. +// Note: it is the responsibility of the caller to ensure that no new Update() call was made between +// the first Update() call and the call to UpdateApplyStatus() so as to keep the repository state accurate. +func (r *Repository) UpdateApplyStatus(cfgPath string, status ApplyStatus) { + if m, ok := r.metadata[cfgPath]; ok { + m.ApplyStatus = status + r.metadata[cfgPath] = m + } +} + +func (r *Repository) getConfigs(product string) map[string]interface{} { + configs, ok := r.configs[product] + if !ok { + return nil + } + + return configs +} + +// applyUpdateResult changes the state of the client based on the given update. +// +// The update is guaranteed to succeed at this point, having been vetted and the details +// needed to apply the update stored in the `updateResult`. +func (r *Repository) applyUpdateResult(update Update, result updateResult) { + // 4.b Save all the updated and new config files + for product, configs := range result.changed { + for path, config := range configs { + m := r.configs[product] + m[path] = config + } + } + for path, metadata := range result.metadata { + r.metadata[path] = metadata + } + + // 5.b Clean up the cache of any removed configs + for _, path := range result.removed { + delete(r.metadata, path) + for _, configs := range r.configs { + delete(configs, path) + } + } +} + +// CurrentState returns all of the information needed to +// make an update for new configurations. +func (r *Repository) CurrentState() (RepositoryState, error) { + var configs []ConfigState + var cached []CachedFile + + for path, metadata := range r.metadata { + configs = append(configs, configStateFromMetadata(metadata)) + cached = append(cached, cachedFileFromMetadata(path, metadata)) + } + + var latestRootVersion int64 + if r.tufVerificationEnabled { + root, err := r.tufRootsClient.latestRoot() + if err != nil { + return RepositoryState{}, err + } + latestRootVersion = root.Version + } else { + latestRootVersion = r.latestRootVersion + } + + return RepositoryState{ + Configs: configs, + CachedFiles: cached, + TargetsVersion: r.latestTargets.Version, + RootsVersion: latestRootVersion, + OpaqueBackendState: r.opaqueBackendState, + }, nil +} + +// An updateResult allows the client to apply the update as a transaction +// after validating all required preconditions +type updateResult struct { + removed []string + metadata map[string]Metadata + changed map[string]map[string]interface{} + productsUpdated map[string]bool +} + +func newUpdateResult() updateResult { + changed := make(map[string]map[string]interface{}) + + for _, p := range allProducts { + changed[p] = make(map[string]interface{}) + } + + return updateResult{ + removed: make([]string, 0), + metadata: make(map[string]Metadata), + changed: changed, + productsUpdated: map[string]bool{}, + } +} + +func (ur updateResult) Log() { + log.Printf("Removed Configs: %v", ur.removed) + + var b strings.Builder + b.WriteString("Changed configs: [") + for path := range ur.metadata { + b.WriteString(path) + b.WriteString(" ") + } + b.WriteString("]") + + log.Println(b.String()) +} + +func (ur updateResult) isEmpty() bool { + return len(ur.removed) == 0 && len(ur.metadata) == 0 +} + +func configStateFromMetadata(m Metadata) ConfigState { + return ConfigState{ + Product: m.Product, + ID: m.ID, + Version: m.Version, + ApplyStatus: m.ApplyStatus, + } +} + +func cachedFileFromMetadata(path string, m Metadata) CachedFile { + return CachedFile{ + Path: path, + Length: m.RawLength, + Hashes: m.Hashes, + } +} + +// hashesEqual checks if the hash values in the TUF metadata file match the stored +// hash values for a given config +func hashesEqual(tufHashes data.Hashes, storedHashes map[string][]byte) bool { + for algorithm, value := range tufHashes { + v, ok := storedHashes[algorithm] + if !ok { + continue + } + + if !bytes.Equal(value, v) { + return false + } + } + + return true +} + +func extractOpaqueBackendState(targetsCustom []byte) []byte { + state := struct { + State []byte `json:"opaque_backend_state"` + }{nil} + + err := json.Unmarshal(targetsCustom, &state) + if err != nil { + return []byte{} + } + + return state.State +} diff --git a/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/tuf.go b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/tuf.go new file mode 100644 index 00000000..3cc712d9 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-agent/pkg/remoteconfig/state/tuf.go @@ -0,0 +1,233 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022-present Datadog, Inc. + +package state + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "strconv" + "strings" + + "github.com/DataDog/go-tuf/client" + "github.com/DataDog/go-tuf/data" + "github.com/DataDog/go-tuf/util" + "github.com/DataDog/go-tuf/verify" +) + +type tufRootsClient struct { + rootClient *client.Client + rootLocalStore client.LocalStore + rootRemoteStore *rootClientRemoteStore +} + +func newTufRootsClient(root []byte) (*tufRootsClient, error) { + rootLocalStore := client.MemoryLocalStore() + rootRemoteStore := &rootClientRemoteStore{} + rootClient := client.NewClient(rootLocalStore, rootRemoteStore) + + err := rootClient.InitLocal(root) + if err != nil { + return nil, err + } + + return &tufRootsClient{ + rootClient: rootClient, + rootLocalStore: rootLocalStore, + rootRemoteStore: rootRemoteStore, + }, nil +} + +func (trc *tufRootsClient) clone() (*tufRootsClient, error) { + root, err := trc.latestRootRaw() + if err != nil { + return nil, err + } + + return newTufRootsClient(root) +} + +func (trc *tufRootsClient) updateRoots(newRoots [][]byte) error { + if len(newRoots) == 0 { + return nil + } + + trc.rootRemoteStore.roots = append(trc.rootRemoteStore.roots, newRoots...) + + return trc.rootClient.UpdateRoots() +} + +func (trc *tufRootsClient) latestRoot() (*data.Root, error) { + raw, err := trc.latestRootRaw() + if err != nil { + return nil, err + } + + return unsafeUnmarshalRoot(raw) +} + +func (trc *tufRootsClient) latestRootRaw() ([]byte, error) { + metas, err := trc.rootLocalStore.GetMeta() + if err != nil { + return nil, err + } + rawRoot := metas["root.json"] + + return rawRoot, nil +} + +func (trc *tufRootsClient) validateTargets(rawTargets []byte) (*data.Targets, error) { + root, err := trc.latestRoot() + if err != nil { + return nil, err + } + + db := verify.NewDB() + for _, key := range root.Keys { + for _, id := range key.IDs() { + if err := db.AddKey(id, key); err != nil { + return nil, err + } + } + } + targetsRole, hasRoleTargets := root.Roles["targets"] + if !hasRoleTargets { + return nil, fmt.Errorf("root is missing a targets role") + } + role := &data.Role{Threshold: targetsRole.Threshold, KeyIDs: targetsRole.KeyIDs} + if err := db.AddRole("targets", role); err != nil { + return nil, fmt.Errorf("could not add targets role to db: %v", err) + } + var targets data.Targets + err = db.Unmarshal(rawTargets, &targets, "targets", 0) + if err != nil { + return nil, err + } + + return &targets, nil +} + +type rootClientRemoteStore struct { + roots [][]byte +} + +func (s *rootClientRemoteStore) GetMeta(name string) (stream io.ReadCloser, size int64, err error) { + metaPath, err := parseMetaPath(name) + if err != nil { + return nil, 0, err + } + if metaPath.role != roleRoot || !metaPath.versionSet { + return nil, 0, client.ErrNotFound{File: name} + } + for _, root := range s.roots { + parsedRoot, err := unsafeUnmarshalRoot(root) + if err != nil { + return nil, 0, err + } + if parsedRoot.Version == metaPath.version { + return io.NopCloser(bytes.NewReader(root)), int64(len(root)), nil + } + } + return nil, 0, client.ErrNotFound{File: name} +} + +func (s *rootClientRemoteStore) GetTarget(path string) (stream io.ReadCloser, size int64, err error) { + return nil, 0, client.ErrNotFound{File: path} +} + +type role string + +const ( + roleRoot role = "root" +) + +type metaPath struct { + role role + version int64 + versionSet bool +} + +func parseMetaPath(rawMetaPath string) (metaPath, error) { + splitRawMetaPath := strings.SplitN(rawMetaPath, ".", 3) + if len(splitRawMetaPath) != 2 && len(splitRawMetaPath) != 3 { + return metaPath{}, fmt.Errorf("invalid metadata path '%s'", rawMetaPath) + } + suffix := splitRawMetaPath[len(splitRawMetaPath)-1] + if suffix != "json" { + return metaPath{}, fmt.Errorf("invalid metadata path (suffix) '%s'", rawMetaPath) + } + rawRole := splitRawMetaPath[len(splitRawMetaPath)-2] + if rawRole == "" { + return metaPath{}, fmt.Errorf("invalid metadata path (role) '%s'", rawMetaPath) + } + if len(splitRawMetaPath) == 2 { + return metaPath{ + role: role(rawRole), + }, nil + } + rawVersion, err := strconv.ParseInt(splitRawMetaPath[0], 10, 64) + if err != nil { + return metaPath{}, fmt.Errorf("invalid metadata path (version) '%s': %w", rawMetaPath, err) + } + return metaPath{ + role: role(rawRole), + version: rawVersion, + versionSet: true, + }, nil +} + +func validateTargetFileHash(targetMeta data.TargetFileMeta, targetFile []byte) error { + if len(targetMeta.HashAlgorithms()) == 0 { + return fmt.Errorf("target file has no hash") + } + generatedMeta, err := util.GenerateFileMeta(bytes.NewBuffer(targetFile), targetMeta.HashAlgorithms()...) + if err != nil { + return err + } + err = util.FileMetaEqual(targetMeta.FileMeta, generatedMeta) + if err != nil { + return err + } + return nil +} + +func unsafeUnmarshalRoot(raw []byte) (*data.Root, error) { + var signedRoot data.Signed + err := json.Unmarshal(raw, &signedRoot) + if err != nil { + return nil, err + } + var root data.Root + err = json.Unmarshal(signedRoot.Signed, &root) + if err != nil { + return nil, err + } + return &root, err +} + +func unsafeUnmarshalTargets(raw []byte) (*data.Targets, error) { + var signedTargets data.Signed + err := json.Unmarshal(raw, &signedTargets) + if err != nil { + return nil, err + } + var targets data.Targets + err = json.Unmarshal(signedTargets.Signed, &targets) + if err != nil { + return nil, err + } + return &targets, err +} + +func extractRootVersion(raw []byte) (int64, error) { + root, err := unsafeUnmarshalRoot(raw) + if err != nil { + return 0, err + } + + return root.Version, nil +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/LICENSE.txt b/vendor/github.com/DataDog/datadog-go/v5/LICENSE.txt new file mode 100644 index 00000000..97cd06d7 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2015 Datadog, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/README.md b/vendor/github.com/DataDog/datadog-go/v5/statsd/README.md new file mode 100644 index 00000000..2fc89968 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/README.md @@ -0,0 +1,4 @@ +## Overview + +Package `statsd` provides a Go [dogstatsd](http://docs.datadoghq.com/guides/dogstatsd/) client. Dogstatsd extends Statsd, adding tags +and histograms. diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/aggregator.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/aggregator.go new file mode 100644 index 00000000..ae4723c4 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/aggregator.go @@ -0,0 +1,290 @@ +package statsd + +import ( + "strings" + "sync" + "sync/atomic" + "time" +) + +type ( + countsMap map[string]*countMetric + gaugesMap map[string]*gaugeMetric + setsMap map[string]*setMetric + bufferedMetricMap map[string]*bufferedMetric +) + +type aggregator struct { + nbContextGauge uint64 + nbContextCount uint64 + nbContextSet uint64 + + countsM sync.RWMutex + gaugesM sync.RWMutex + setsM sync.RWMutex + + gauges gaugesMap + counts countsMap + sets setsMap + histograms bufferedMetricContexts + distributions bufferedMetricContexts + timings bufferedMetricContexts + + closed chan struct{} + + client *Client + + // aggregator implements channelMode mechanism to receive histograms, + // distributions and timings. Since they need sampling they need to + // lock for random. When using both channelMode and ExtendedAggregation + // we don't want goroutine to fight over the lock. + inputMetrics chan metric + stopChannelMode chan struct{} + wg sync.WaitGroup +} + +func newAggregator(c *Client) *aggregator { + return &aggregator{ + client: c, + counts: countsMap{}, + gauges: gaugesMap{}, + sets: setsMap{}, + histograms: newBufferedContexts(newHistogramMetric), + distributions: newBufferedContexts(newDistributionMetric), + timings: newBufferedContexts(newTimingMetric), + closed: make(chan struct{}), + stopChannelMode: make(chan struct{}), + } +} + +func (a *aggregator) start(flushInterval time.Duration) { + ticker := time.NewTicker(flushInterval) + + go func() { + for { + select { + case <-ticker.C: + a.flush() + case <-a.closed: + ticker.Stop() + return + } + } + }() +} + +func (a *aggregator) startReceivingMetric(bufferSize int, nbWorkers int) { + a.inputMetrics = make(chan metric, bufferSize) + for i := 0; i < nbWorkers; i++ { + a.wg.Add(1) + go a.pullMetric() + } +} + +func (a *aggregator) stopReceivingMetric() { + close(a.stopChannelMode) + a.wg.Wait() +} + +func (a *aggregator) stop() { + a.closed <- struct{}{} +} + +func (a *aggregator) pullMetric() { + for { + select { + case m := <-a.inputMetrics: + switch m.metricType { + case histogram: + a.histogram(m.name, m.fvalue, m.tags, m.rate) + case distribution: + a.distribution(m.name, m.fvalue, m.tags, m.rate) + case timing: + a.timing(m.name, m.fvalue, m.tags, m.rate) + } + case <-a.stopChannelMode: + a.wg.Done() + return + } + } +} + +func (a *aggregator) flush() { + for _, m := range a.flushMetrics() { + a.client.sendBlocking(m) + } +} + +func (a *aggregator) flushTelemetryMetrics(t *Telemetry) { + if a == nil { + // aggregation is disabled + return + } + + t.AggregationNbContextGauge = atomic.LoadUint64(&a.nbContextGauge) + t.AggregationNbContextCount = atomic.LoadUint64(&a.nbContextCount) + t.AggregationNbContextSet = atomic.LoadUint64(&a.nbContextSet) + t.AggregationNbContextHistogram = a.histograms.getNbContext() + t.AggregationNbContextDistribution = a.distributions.getNbContext() + t.AggregationNbContextTiming = a.timings.getNbContext() +} + +func (a *aggregator) flushMetrics() []metric { + metrics := []metric{} + + // We reset the values to avoid sending 'zero' values for metrics not + // sampled during this flush interval + + a.setsM.Lock() + sets := a.sets + a.sets = setsMap{} + a.setsM.Unlock() + + for _, s := range sets { + metrics = append(metrics, s.flushUnsafe()...) + } + + a.gaugesM.Lock() + gauges := a.gauges + a.gauges = gaugesMap{} + a.gaugesM.Unlock() + + for _, g := range gauges { + metrics = append(metrics, g.flushUnsafe()) + } + + a.countsM.Lock() + counts := a.counts + a.counts = countsMap{} + a.countsM.Unlock() + + for _, c := range counts { + metrics = append(metrics, c.flushUnsafe()) + } + + metrics = a.histograms.flush(metrics) + metrics = a.distributions.flush(metrics) + metrics = a.timings.flush(metrics) + + atomic.AddUint64(&a.nbContextCount, uint64(len(counts))) + atomic.AddUint64(&a.nbContextGauge, uint64(len(gauges))) + atomic.AddUint64(&a.nbContextSet, uint64(len(sets))) + return metrics +} + +func getContext(name string, tags []string) string { + c, _ := getContextAndTags(name, tags) + return c +} + +func getContextAndTags(name string, tags []string) (string, string) { + if len(tags) == 0 { + return name + nameSeparatorSymbol, "" + } + n := len(name) + len(nameSeparatorSymbol) + len(tagSeparatorSymbol)*(len(tags)-1) + for _, s := range tags { + n += len(s) + } + + var sb strings.Builder + sb.Grow(n) + sb.WriteString(name) + sb.WriteString(nameSeparatorSymbol) + sb.WriteString(tags[0]) + for _, s := range tags[1:] { + sb.WriteString(tagSeparatorSymbol) + sb.WriteString(s) + } + + s := sb.String() + + return s, s[len(name)+len(nameSeparatorSymbol):] +} + +func (a *aggregator) count(name string, value int64, tags []string) error { + context := getContext(name, tags) + a.countsM.RLock() + if count, found := a.counts[context]; found { + count.sample(value) + a.countsM.RUnlock() + return nil + } + a.countsM.RUnlock() + + a.countsM.Lock() + // Check if another goroutines hasn't created the value betwen the RUnlock and 'Lock' + if count, found := a.counts[context]; found { + count.sample(value) + a.countsM.Unlock() + return nil + } + + a.counts[context] = newCountMetric(name, value, tags) + a.countsM.Unlock() + return nil +} + +func (a *aggregator) gauge(name string, value float64, tags []string) error { + context := getContext(name, tags) + a.gaugesM.RLock() + if gauge, found := a.gauges[context]; found { + gauge.sample(value) + a.gaugesM.RUnlock() + return nil + } + a.gaugesM.RUnlock() + + gauge := newGaugeMetric(name, value, tags) + + a.gaugesM.Lock() + // Check if another goroutines hasn't created the value betwen the 'RUnlock' and 'Lock' + if gauge, found := a.gauges[context]; found { + gauge.sample(value) + a.gaugesM.Unlock() + return nil + } + a.gauges[context] = gauge + a.gaugesM.Unlock() + return nil +} + +func (a *aggregator) set(name string, value string, tags []string) error { + context := getContext(name, tags) + a.setsM.RLock() + if set, found := a.sets[context]; found { + set.sample(value) + a.setsM.RUnlock() + return nil + } + a.setsM.RUnlock() + + a.setsM.Lock() + // Check if another goroutines hasn't created the value betwen the 'RUnlock' and 'Lock' + if set, found := a.sets[context]; found { + set.sample(value) + a.setsM.Unlock() + return nil + } + a.sets[context] = newSetMetric(name, value, tags) + a.setsM.Unlock() + return nil +} + +// Only histograms, distributions and timings are sampled with a rate since we +// only pack them in on message instead of aggregating them. Discarding the +// sample rate will have impacts on the CPU and memory usage of the Agent. + +// type alias for Client.sendToAggregator +type bufferedMetricSampleFunc func(name string, value float64, tags []string, rate float64) error + +func (a *aggregator) histogram(name string, value float64, tags []string, rate float64) error { + return a.histograms.sample(name, value, tags, rate) +} + +func (a *aggregator) distribution(name string, value float64, tags []string, rate float64) error { + return a.distributions.sample(name, value, tags, rate) +} + +func (a *aggregator) timing(name string, value float64, tags []string, rate float64) error { + return a.timings.sample(name, value, tags, rate) +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/buffer.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/buffer.go new file mode 100644 index 00000000..f7bb8b0a --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/buffer.go @@ -0,0 +1,197 @@ +package statsd + +import ( + "strconv" +) + +// MessageTooLongError is an error returned when a sample, event or service check is too large once serialized. See +// WithMaxBytesPerPayload option for more details. +type MessageTooLongError struct{} + +func (e MessageTooLongError) Error() string { + return "message too long. See 'WithMaxBytesPerPayload' documentation." +} + +var errBufferFull = MessageTooLongError{} + +type partialWriteError string + +func (e partialWriteError) Error() string { return string(e) } + +const errPartialWrite = partialWriteError("value partially written") + +const metricOverhead = 512 + +// statsdBuffer is a buffer containing statsd messages +// this struct methods are NOT safe for concurent use +type statsdBuffer struct { + buffer []byte + maxSize int + maxElements int + elementCount int +} + +func newStatsdBuffer(maxSize, maxElements int) *statsdBuffer { + return &statsdBuffer{ + buffer: make([]byte, 0, maxSize+metricOverhead), // pre-allocate the needed size + metricOverhead to avoid having Go re-allocate on it's own if an element does not fit + maxSize: maxSize, + maxElements: maxElements, + } +} + +func (b *statsdBuffer) writeGauge(namespace string, globalTags []string, name string, value float64, tags []string, rate float64, timestamp int64) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendGauge(b.buffer, namespace, globalTags, name, value, tags, rate) + b.buffer = appendTimestamp(b.buffer, timestamp) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) writeCount(namespace string, globalTags []string, name string, value int64, tags []string, rate float64, timestamp int64) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendCount(b.buffer, namespace, globalTags, name, value, tags, rate) + b.buffer = appendTimestamp(b.buffer, timestamp) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) writeHistogram(namespace string, globalTags []string, name string, value float64, tags []string, rate float64) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendHistogram(b.buffer, namespace, globalTags, name, value, tags, rate) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +// writeAggregated serialized as many values as possible in the current buffer and return the position in values where it stopped. +func (b *statsdBuffer) writeAggregated(metricSymbol []byte, namespace string, globalTags []string, name string, values []float64, tags string, tagSize int, precision int) (int, error) { + if b.elementCount >= b.maxElements { + return 0, errBufferFull + } + + originalBuffer := b.buffer + b.buffer = appendHeader(b.buffer, namespace, name) + + // buffer already full + if len(b.buffer)+tagSize > b.maxSize { + b.buffer = originalBuffer + return 0, errBufferFull + } + + // We add as many value as possible + var position int + for idx, v := range values { + previousBuffer := b.buffer + if idx != 0 { + b.buffer = append(b.buffer, ':') + } + + b.buffer = strconv.AppendFloat(b.buffer, v, 'f', precision, 64) + + // Should we stop serializing and switch to another buffer + if len(b.buffer)+tagSize > b.maxSize { + b.buffer = previousBuffer + break + } + position = idx + 1 + } + + // we could not add a single value + if position == 0 { + b.buffer = originalBuffer + return 0, errBufferFull + } + + b.buffer = append(b.buffer, '|') + b.buffer = append(b.buffer, metricSymbol...) + b.buffer = appendTagsAggregated(b.buffer, globalTags, tags) + b.buffer = appendContainerID(b.buffer) + b.writeSeparator() + b.elementCount++ + + if position != len(values) { + return position, errPartialWrite + } + return position, nil + +} + +func (b *statsdBuffer) writeDistribution(namespace string, globalTags []string, name string, value float64, tags []string, rate float64) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendDistribution(b.buffer, namespace, globalTags, name, value, tags, rate) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) writeSet(namespace string, globalTags []string, name string, value string, tags []string, rate float64) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendSet(b.buffer, namespace, globalTags, name, value, tags, rate) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) writeTiming(namespace string, globalTags []string, name string, value float64, tags []string, rate float64) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendTiming(b.buffer, namespace, globalTags, name, value, tags, rate) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) writeEvent(event *Event, globalTags []string) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendEvent(b.buffer, event, globalTags) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) writeServiceCheck(serviceCheck *ServiceCheck, globalTags []string) error { + if b.elementCount >= b.maxElements { + return errBufferFull + } + originalBuffer := b.buffer + b.buffer = appendServiceCheck(b.buffer, serviceCheck, globalTags) + b.writeSeparator() + return b.validateNewElement(originalBuffer) +} + +func (b *statsdBuffer) validateNewElement(originalBuffer []byte) error { + if len(b.buffer) > b.maxSize { + b.buffer = originalBuffer + return errBufferFull + } + b.elementCount++ + return nil +} + +func (b *statsdBuffer) writeSeparator() { + b.buffer = append(b.buffer, '\n') +} + +func (b *statsdBuffer) reset() { + b.buffer = b.buffer[:0] + b.elementCount = 0 +} + +func (b *statsdBuffer) bytes() []byte { + return b.buffer +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/buffer_pool.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/buffer_pool.go new file mode 100644 index 00000000..7a3e3c9d --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/buffer_pool.go @@ -0,0 +1,40 @@ +package statsd + +type bufferPool struct { + pool chan *statsdBuffer + bufferMaxSize int + bufferMaxElements int +} + +func newBufferPool(poolSize, bufferMaxSize, bufferMaxElements int) *bufferPool { + p := &bufferPool{ + pool: make(chan *statsdBuffer, poolSize), + bufferMaxSize: bufferMaxSize, + bufferMaxElements: bufferMaxElements, + } + for i := 0; i < poolSize; i++ { + p.addNewBuffer() + } + return p +} + +func (p *bufferPool) addNewBuffer() { + p.pool <- newStatsdBuffer(p.bufferMaxSize, p.bufferMaxElements) +} + +func (p *bufferPool) borrowBuffer() *statsdBuffer { + select { + case b := <-p.pool: + return b + default: + return newStatsdBuffer(p.bufferMaxSize, p.bufferMaxElements) + } +} + +func (p *bufferPool) returnBuffer(buffer *statsdBuffer) { + buffer.reset() + select { + case p.pool <- buffer: + default: + } +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/buffered_metric_context.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/buffered_metric_context.go new file mode 100644 index 00000000..41404d98 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/buffered_metric_context.go @@ -0,0 +1,82 @@ +package statsd + +import ( + "math/rand" + "sync" + "sync/atomic" + "time" +) + +// bufferedMetricContexts represent the contexts for Histograms, Distributions +// and Timing. Since those 3 metric types behave the same way and are sampled +// with the same type they're represented by the same class. +type bufferedMetricContexts struct { + nbContext uint64 + mutex sync.RWMutex + values bufferedMetricMap + newMetric func(string, float64, string) *bufferedMetric + + // Each bufferedMetricContexts uses its own random source and random + // lock to prevent goroutines from contending for the lock on the + // "math/rand" package-global random source (e.g. calls like + // "rand.Float64()" must acquire a shared lock to get the next + // pseudorandom number). + random *rand.Rand + randomLock sync.Mutex +} + +func newBufferedContexts(newMetric func(string, float64, string) *bufferedMetric) bufferedMetricContexts { + return bufferedMetricContexts{ + values: bufferedMetricMap{}, + newMetric: newMetric, + // Note that calling "time.Now().UnixNano()" repeatedly quickly may return + // very similar values. That's fine for seeding the worker-specific random + // source because we just need an evenly distributed stream of float values. + // Do not use this random source for cryptographic randomness. + random: rand.New(rand.NewSource(time.Now().UnixNano())), + } +} + +func (bc *bufferedMetricContexts) flush(metrics []metric) []metric { + bc.mutex.Lock() + values := bc.values + bc.values = bufferedMetricMap{} + bc.mutex.Unlock() + + for _, d := range values { + metrics = append(metrics, d.flushUnsafe()) + } + atomic.AddUint64(&bc.nbContext, uint64(len(values))) + return metrics +} + +func (bc *bufferedMetricContexts) sample(name string, value float64, tags []string, rate float64) error { + if !shouldSample(rate, bc.random, &bc.randomLock) { + return nil + } + + context, stringTags := getContextAndTags(name, tags) + + bc.mutex.RLock() + if v, found := bc.values[context]; found { + v.sample(value) + bc.mutex.RUnlock() + return nil + } + bc.mutex.RUnlock() + + bc.mutex.Lock() + // Check if another goroutines hasn't created the value betwen the 'RUnlock' and 'Lock' + if v, found := bc.values[context]; found { + v.sample(value) + bc.mutex.Unlock() + return nil + } + bc.values[context] = bc.newMetric(name, value, stringTags) + bc.mutex.Unlock() + return nil +} + +func (bc *bufferedMetricContexts) getNbContext() uint64 { + return atomic.LoadUint64(&bc.nbContext) +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/container.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/container.go new file mode 100644 index 00000000..b2331e82 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/container.go @@ -0,0 +1,82 @@ +package statsd + +import ( + "bufio" + "fmt" + "io" + "os" + "regexp" + "sync" +) + +const ( + // cgroupPath is the path to the cgroup file where we can find the container id if one exists. + cgroupPath = "/proc/self/cgroup" +) + +const ( + uuidSource = "[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}" + containerSource = "[0-9a-f]{64}" + taskSource = "[0-9a-f]{32}-\\d+" +) + +var ( + // expLine matches a line in the /proc/self/cgroup file. It has a submatch for the last element (path), which contains the container ID. + expLine = regexp.MustCompile(`^\d+:[^:]*:(.+)$`) + + // expContainerID matches contained IDs and sources. Source: https://github.com/Qard/container-info/blob/master/index.js + expContainerID = regexp.MustCompile(fmt.Sprintf(`(%s|%s|%s)(?:.scope)?$`, uuidSource, containerSource, taskSource)) + + // containerID holds the container ID. + containerID = "" +) + +// parseContainerID finds the first container ID reading from r and returns it. +func parseContainerID(r io.Reader) string { + scn := bufio.NewScanner(r) + for scn.Scan() { + path := expLine.FindStringSubmatch(scn.Text()) + if len(path) != 2 { + // invalid entry, continue + continue + } + if parts := expContainerID.FindStringSubmatch(path[1]); len(parts) == 2 { + return parts[1] + } + } + return "" +} + +// readContainerID attempts to return the container ID from the provided file path or empty on failure. +func readContainerID(fpath string) string { + f, err := os.Open(fpath) + if err != nil { + return "" + } + defer f.Close() + return parseContainerID(f) +} + +// getContainerID returns the container ID configured at the client creation +// It can either be auto-discovered with origin detection or provided by the user. +// User-defined container ID is prioritized. +func getContainerID() string { + return containerID +} + +var initOnce sync.Once + +// initContainerID initializes the container ID. +// It can either be provided by the user or read from cgroups. +func initContainerID(userProvidedID string, cgroupFallback bool) { + initOnce.Do(func() { + if userProvidedID != "" { + containerID = userProvidedID + return + } + + if cgroupFallback { + containerID = readContainerID(cgroupPath) + } + }) +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/event.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/event.go new file mode 100644 index 00000000..a2ca4faf --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/event.go @@ -0,0 +1,75 @@ +package statsd + +import ( + "fmt" + "time" +) + +// Events support +// EventAlertType and EventAlertPriority became exported types after this issue was submitted: https://github.com/DataDog/datadog-go/issues/41 +// The reason why they got exported is so that client code can directly use the types. + +// EventAlertType is the alert type for events +type EventAlertType string + +const ( + // Info is the "info" AlertType for events + Info EventAlertType = "info" + // Error is the "error" AlertType for events + Error EventAlertType = "error" + // Warning is the "warning" AlertType for events + Warning EventAlertType = "warning" + // Success is the "success" AlertType for events + Success EventAlertType = "success" +) + +// EventPriority is the event priority for events +type EventPriority string + +const ( + // Normal is the "normal" Priority for events + Normal EventPriority = "normal" + // Low is the "low" Priority for events + Low EventPriority = "low" +) + +// An Event is an object that can be posted to your DataDog event stream. +type Event struct { + // Title of the event. Required. + Title string + // Text is the description of the event. + Text string + // Timestamp is a timestamp for the event. If not provided, the dogstatsd + // server will set this to the current time. + Timestamp time.Time + // Hostname for the event. + Hostname string + // AggregationKey groups this event with others of the same key. + AggregationKey string + // Priority of the event. Can be statsd.Low or statsd.Normal. + Priority EventPriority + // SourceTypeName is a source type for the event. + SourceTypeName string + // AlertType can be statsd.Info, statsd.Error, statsd.Warning, or statsd.Success. + // If absent, the default value applied by the dogstatsd server is Info. + AlertType EventAlertType + // Tags for the event. + Tags []string +} + +// NewEvent creates a new event with the given title and text. Error checking +// against these values is done at send-time, or upon running e.Check. +func NewEvent(title, text string) *Event { + return &Event{ + Title: title, + Text: text, + } +} + +// Check verifies that an event is valid. +func (e *Event) Check() error { + if len(e.Title) == 0 { + return fmt.Errorf("statsd.Event title is required") + } + return nil +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/fnv1a.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/fnv1a.go new file mode 100644 index 00000000..03dc8a07 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/fnv1a.go @@ -0,0 +1,39 @@ +package statsd + +const ( + // FNV-1a + offset32 = uint32(2166136261) + prime32 = uint32(16777619) + + // init32 is what 32 bits hash values should be initialized with. + init32 = offset32 +) + +// HashString32 returns the hash of s. +func hashString32(s string) uint32 { + return addString32(init32, s) +} + +// AddString32 adds the hash of s to the precomputed hash value h. +func addString32(h uint32, s string) uint32 { + i := 0 + n := (len(s) / 8) * 8 + + for i != n { + h = (h ^ uint32(s[i])) * prime32 + h = (h ^ uint32(s[i+1])) * prime32 + h = (h ^ uint32(s[i+2])) * prime32 + h = (h ^ uint32(s[i+3])) * prime32 + h = (h ^ uint32(s[i+4])) * prime32 + h = (h ^ uint32(s[i+5])) * prime32 + h = (h ^ uint32(s[i+6])) * prime32 + h = (h ^ uint32(s[i+7])) * prime32 + i += 8 + } + + for _, c := range s[i:] { + h = (h ^ uint32(c)) * prime32 + } + + return h +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/format.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/format.go new file mode 100644 index 00000000..f3ab9231 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/format.go @@ -0,0 +1,280 @@ +package statsd + +import ( + "strconv" + "strings" +) + +var ( + gaugeSymbol = []byte("g") + countSymbol = []byte("c") + histogramSymbol = []byte("h") + distributionSymbol = []byte("d") + setSymbol = []byte("s") + timingSymbol = []byte("ms") + tagSeparatorSymbol = "," + nameSeparatorSymbol = ":" +) + +func appendHeader(buffer []byte, namespace string, name string) []byte { + if namespace != "" { + buffer = append(buffer, namespace...) + } + buffer = append(buffer, name...) + buffer = append(buffer, ':') + return buffer +} + +func appendRate(buffer []byte, rate float64) []byte { + if rate < 1 { + buffer = append(buffer, "|@"...) + buffer = strconv.AppendFloat(buffer, rate, 'f', -1, 64) + } + return buffer +} + +func appendWithoutNewlines(buffer []byte, s string) []byte { + // fastpath for strings without newlines + if strings.IndexByte(s, '\n') == -1 { + return append(buffer, s...) + } + + for _, b := range []byte(s) { + if b != '\n' { + buffer = append(buffer, b) + } + } + return buffer +} + +func appendTags(buffer []byte, globalTags []string, tags []string) []byte { + if len(globalTags) == 0 && len(tags) == 0 { + return buffer + } + buffer = append(buffer, "|#"...) + firstTag := true + + for _, tag := range globalTags { + if !firstTag { + buffer = append(buffer, tagSeparatorSymbol...) + } + buffer = appendWithoutNewlines(buffer, tag) + firstTag = false + } + for _, tag := range tags { + if !firstTag { + buffer = append(buffer, tagSeparatorSymbol...) + } + buffer = appendWithoutNewlines(buffer, tag) + firstTag = false + } + return buffer +} + +func appendTagsAggregated(buffer []byte, globalTags []string, tags string) []byte { + if len(globalTags) == 0 && tags == "" { + return buffer + } + + buffer = append(buffer, "|#"...) + firstTag := true + + for _, tag := range globalTags { + if !firstTag { + buffer = append(buffer, tagSeparatorSymbol...) + } + buffer = appendWithoutNewlines(buffer, tag) + firstTag = false + } + if tags != "" { + if !firstTag { + buffer = append(buffer, tagSeparatorSymbol...) + } + buffer = appendWithoutNewlines(buffer, tags) + } + return buffer +} + +func appendFloatMetric(buffer []byte, typeSymbol []byte, namespace string, globalTags []string, name string, value float64, tags []string, rate float64, precision int) []byte { + buffer = appendHeader(buffer, namespace, name) + buffer = strconv.AppendFloat(buffer, value, 'f', precision, 64) + buffer = append(buffer, '|') + buffer = append(buffer, typeSymbol...) + buffer = appendRate(buffer, rate) + buffer = appendTags(buffer, globalTags, tags) + buffer = appendContainerID(buffer) + return buffer +} + +func appendIntegerMetric(buffer []byte, typeSymbol []byte, namespace string, globalTags []string, name string, value int64, tags []string, rate float64) []byte { + buffer = appendHeader(buffer, namespace, name) + buffer = strconv.AppendInt(buffer, value, 10) + buffer = append(buffer, '|') + buffer = append(buffer, typeSymbol...) + buffer = appendRate(buffer, rate) + buffer = appendTags(buffer, globalTags, tags) + buffer = appendContainerID(buffer) + return buffer +} + +func appendStringMetric(buffer []byte, typeSymbol []byte, namespace string, globalTags []string, name string, value string, tags []string, rate float64) []byte { + buffer = appendHeader(buffer, namespace, name) + buffer = append(buffer, value...) + buffer = append(buffer, '|') + buffer = append(buffer, typeSymbol...) + buffer = appendRate(buffer, rate) + buffer = appendTags(buffer, globalTags, tags) + buffer = appendContainerID(buffer) + return buffer +} + +func appendGauge(buffer []byte, namespace string, globalTags []string, name string, value float64, tags []string, rate float64) []byte { + return appendFloatMetric(buffer, gaugeSymbol, namespace, globalTags, name, value, tags, rate, -1) +} + +func appendCount(buffer []byte, namespace string, globalTags []string, name string, value int64, tags []string, rate float64) []byte { + return appendIntegerMetric(buffer, countSymbol, namespace, globalTags, name, value, tags, rate) +} + +func appendHistogram(buffer []byte, namespace string, globalTags []string, name string, value float64, tags []string, rate float64) []byte { + return appendFloatMetric(buffer, histogramSymbol, namespace, globalTags, name, value, tags, rate, -1) +} + +func appendDistribution(buffer []byte, namespace string, globalTags []string, name string, value float64, tags []string, rate float64) []byte { + return appendFloatMetric(buffer, distributionSymbol, namespace, globalTags, name, value, tags, rate, -1) +} + +func appendSet(buffer []byte, namespace string, globalTags []string, name string, value string, tags []string, rate float64) []byte { + return appendStringMetric(buffer, setSymbol, namespace, globalTags, name, value, tags, rate) +} + +func appendTiming(buffer []byte, namespace string, globalTags []string, name string, value float64, tags []string, rate float64) []byte { + return appendFloatMetric(buffer, timingSymbol, namespace, globalTags, name, value, tags, rate, 6) +} + +func escapedEventTextLen(text string) int { + return len(text) + strings.Count(text, "\n") +} + +func appendEscapedEventText(buffer []byte, text string) []byte { + for _, b := range []byte(text) { + if b != '\n' { + buffer = append(buffer, b) + } else { + buffer = append(buffer, "\\n"...) + } + } + return buffer +} + +func appendEvent(buffer []byte, event *Event, globalTags []string) []byte { + escapedTextLen := escapedEventTextLen(event.Text) + + buffer = append(buffer, "_e{"...) + buffer = strconv.AppendInt(buffer, int64(len(event.Title)), 10) + buffer = append(buffer, tagSeparatorSymbol...) + buffer = strconv.AppendInt(buffer, int64(escapedTextLen), 10) + buffer = append(buffer, "}:"...) + buffer = append(buffer, event.Title...) + buffer = append(buffer, '|') + if escapedTextLen != len(event.Text) { + buffer = appendEscapedEventText(buffer, event.Text) + } else { + buffer = append(buffer, event.Text...) + } + + if !event.Timestamp.IsZero() { + buffer = append(buffer, "|d:"...) + buffer = strconv.AppendInt(buffer, int64(event.Timestamp.Unix()), 10) + } + + if len(event.Hostname) != 0 { + buffer = append(buffer, "|h:"...) + buffer = append(buffer, event.Hostname...) + } + + if len(event.AggregationKey) != 0 { + buffer = append(buffer, "|k:"...) + buffer = append(buffer, event.AggregationKey...) + } + + if len(event.Priority) != 0 { + buffer = append(buffer, "|p:"...) + buffer = append(buffer, event.Priority...) + } + + if len(event.SourceTypeName) != 0 { + buffer = append(buffer, "|s:"...) + buffer = append(buffer, event.SourceTypeName...) + } + + if len(event.AlertType) != 0 { + buffer = append(buffer, "|t:"...) + buffer = append(buffer, string(event.AlertType)...) + } + + buffer = appendTags(buffer, globalTags, event.Tags) + buffer = appendContainerID(buffer) + return buffer +} + +func appendEscapedServiceCheckText(buffer []byte, text string) []byte { + for i := 0; i < len(text); i++ { + if text[i] == '\n' { + buffer = append(buffer, "\\n"...) + } else if text[i] == 'm' && i+1 < len(text) && text[i+1] == ':' { + buffer = append(buffer, "m\\:"...) + i++ + } else { + buffer = append(buffer, text[i]) + } + } + return buffer +} + +func appendServiceCheck(buffer []byte, serviceCheck *ServiceCheck, globalTags []string) []byte { + buffer = append(buffer, "_sc|"...) + buffer = append(buffer, serviceCheck.Name...) + buffer = append(buffer, '|') + buffer = strconv.AppendInt(buffer, int64(serviceCheck.Status), 10) + + if !serviceCheck.Timestamp.IsZero() { + buffer = append(buffer, "|d:"...) + buffer = strconv.AppendInt(buffer, int64(serviceCheck.Timestamp.Unix()), 10) + } + + if len(serviceCheck.Hostname) != 0 { + buffer = append(buffer, "|h:"...) + buffer = append(buffer, serviceCheck.Hostname...) + } + + buffer = appendTags(buffer, globalTags, serviceCheck.Tags) + + if len(serviceCheck.Message) != 0 { + buffer = append(buffer, "|m:"...) + buffer = appendEscapedServiceCheckText(buffer, serviceCheck.Message) + } + + buffer = appendContainerID(buffer) + return buffer +} + +func appendSeparator(buffer []byte) []byte { + return append(buffer, '\n') +} + +func appendContainerID(buffer []byte) []byte { + if containerID := getContainerID(); len(containerID) > 0 { + buffer = append(buffer, "|c:"...) + buffer = append(buffer, containerID...) + } + return buffer +} + +func appendTimestamp(buffer []byte, timestamp int64) []byte { + if timestamp > noTimestamp { + buffer = append(buffer, "|T"...) + buffer = strconv.AppendInt(buffer, timestamp, 10) + } + return buffer +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/metrics.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/metrics.go new file mode 100644 index 00000000..82f11ac1 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/metrics.go @@ -0,0 +1,181 @@ +package statsd + +import ( + "math" + "sync" + "sync/atomic" +) + +/* +Those are metrics type that can be aggregated on the client side: + - Gauge + - Count + - Set +*/ + +type countMetric struct { + value int64 + name string + tags []string +} + +func newCountMetric(name string, value int64, tags []string) *countMetric { + return &countMetric{ + value: value, + name: name, + tags: copySlice(tags), + } +} + +func (c *countMetric) sample(v int64) { + atomic.AddInt64(&c.value, v) +} + +func (c *countMetric) flushUnsafe() metric { + return metric{ + metricType: count, + name: c.name, + tags: c.tags, + rate: 1, + ivalue: c.value, + } +} + +// Gauge + +type gaugeMetric struct { + value uint64 + name string + tags []string +} + +func newGaugeMetric(name string, value float64, tags []string) *gaugeMetric { + return &gaugeMetric{ + value: math.Float64bits(value), + name: name, + tags: copySlice(tags), + } +} + +func (g *gaugeMetric) sample(v float64) { + atomic.StoreUint64(&g.value, math.Float64bits(v)) +} + +func (g *gaugeMetric) flushUnsafe() metric { + return metric{ + metricType: gauge, + name: g.name, + tags: g.tags, + rate: 1, + fvalue: math.Float64frombits(g.value), + } +} + +// Set + +type setMetric struct { + data map[string]struct{} + name string + tags []string + sync.Mutex +} + +func newSetMetric(name string, value string, tags []string) *setMetric { + set := &setMetric{ + data: map[string]struct{}{}, + name: name, + tags: copySlice(tags), + } + set.data[value] = struct{}{} + return set +} + +func (s *setMetric) sample(v string) { + s.Lock() + defer s.Unlock() + s.data[v] = struct{}{} +} + +// Sets are aggregated on the agent side too. We flush the keys so a set from +// multiple application can be correctly aggregated on the agent side. +func (s *setMetric) flushUnsafe() []metric { + if len(s.data) == 0 { + return nil + } + + metrics := make([]metric, len(s.data)) + i := 0 + for value := range s.data { + metrics[i] = metric{ + metricType: set, + name: s.name, + tags: s.tags, + rate: 1, + svalue: value, + } + i++ + } + return metrics +} + +// Histograms, Distributions and Timings + +type bufferedMetric struct { + sync.Mutex + + data []float64 + name string + // Histograms and Distributions store tags as one string since we need + // to compute its size multiple time when serializing. + tags string + mtype metricType +} + +func (s *bufferedMetric) sample(v float64) { + s.Lock() + defer s.Unlock() + s.data = append(s.data, v) +} + +func (s *bufferedMetric) flushUnsafe() metric { + return metric{ + metricType: s.mtype, + name: s.name, + stags: s.tags, + rate: 1, + fvalues: s.data, + } +} + +type histogramMetric = bufferedMetric + +func newHistogramMetric(name string, value float64, stringTags string) *histogramMetric { + return &histogramMetric{ + data: []float64{value}, + name: name, + tags: stringTags, + mtype: histogramAggregated, + } +} + +type distributionMetric = bufferedMetric + +func newDistributionMetric(name string, value float64, stringTags string) *distributionMetric { + return &distributionMetric{ + data: []float64{value}, + name: name, + tags: stringTags, + mtype: distributionAggregated, + } +} + +type timingMetric = bufferedMetric + +func newTimingMetric(name string, value float64, stringTags string) *timingMetric { + return &timingMetric{ + data: []float64{value}, + name: name, + tags: stringTags, + mtype: timingAggregated, + } +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/noop.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/noop.go new file mode 100644 index 00000000..e92744f4 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/noop.go @@ -0,0 +1,106 @@ +package statsd + +import "time" + +// NoOpClient is a statsd client that does nothing. Can be useful in testing +// situations for library users. +type NoOpClient struct{} + +// Gauge does nothing and returns nil +func (n *NoOpClient) Gauge(name string, value float64, tags []string, rate float64) error { + return nil +} + +// GaugeWithTimestamp does nothing and returns nil +func (n *NoOpClient) GaugeWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error { + return nil +} + +// Count does nothing and returns nil +func (n *NoOpClient) Count(name string, value int64, tags []string, rate float64) error { + return nil +} + +// CountWithTimestamp does nothing and returns nil +func (n *NoOpClient) CountWithTimestamp(name string, value int64, tags []string, rate float64, timestamp time.Time) error { + return nil +} + +// Histogram does nothing and returns nil +func (n *NoOpClient) Histogram(name string, value float64, tags []string, rate float64) error { + return nil +} + +// Distribution does nothing and returns nil +func (n *NoOpClient) Distribution(name string, value float64, tags []string, rate float64) error { + return nil +} + +// Decr does nothing and returns nil +func (n *NoOpClient) Decr(name string, tags []string, rate float64) error { + return nil +} + +// Incr does nothing and returns nil +func (n *NoOpClient) Incr(name string, tags []string, rate float64) error { + return nil +} + +// Set does nothing and returns nil +func (n *NoOpClient) Set(name string, value string, tags []string, rate float64) error { + return nil +} + +// Timing does nothing and returns nil +func (n *NoOpClient) Timing(name string, value time.Duration, tags []string, rate float64) error { + return nil +} + +// TimeInMilliseconds does nothing and returns nil +func (n *NoOpClient) TimeInMilliseconds(name string, value float64, tags []string, rate float64) error { + return nil +} + +// Event does nothing and returns nil +func (n *NoOpClient) Event(e *Event) error { + return nil +} + +// SimpleEvent does nothing and returns nil +func (n *NoOpClient) SimpleEvent(title, text string) error { + return nil +} + +// ServiceCheck does nothing and returns nil +func (n *NoOpClient) ServiceCheck(sc *ServiceCheck) error { + return nil +} + +// SimpleServiceCheck does nothing and returns nil +func (n *NoOpClient) SimpleServiceCheck(name string, status ServiceCheckStatus) error { + return nil +} + +// Close does nothing and returns nil +func (n *NoOpClient) Close() error { + return nil +} + +// Flush does nothing and returns nil +func (n *NoOpClient) Flush() error { + return nil +} + +// IsClosed does nothing and return false +func (n *NoOpClient) IsClosed() bool { + return false +} + +// GetTelemetry does nothing and returns an empty Telemetry +func (n *NoOpClient) GetTelemetry() Telemetry { + return Telemetry{} +} + +// Verify that NoOpClient implements the ClientInterface. +// https://golang.org/doc/faq#guarantee_satisfies_interface +var _ ClientInterface = &NoOpClient{} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/options.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/options.go new file mode 100644 index 00000000..0728a976 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/options.go @@ -0,0 +1,348 @@ +package statsd + +import ( + "fmt" + "math" + "strings" + "time" +) + +var ( + defaultNamespace = "" + defaultTags = []string{} + defaultMaxBytesPerPayload = 0 + defaultMaxMessagesPerPayload = math.MaxInt32 + defaultBufferPoolSize = 0 + defaultBufferFlushInterval = 100 * time.Millisecond + defaultWorkerCount = 32 + defaultSenderQueueSize = 0 + defaultWriteTimeout = 100 * time.Millisecond + defaultTelemetry = true + defaultReceivingMode = mutexMode + defaultChannelModeBufferSize = 4096 + defaultAggregationFlushInterval = 2 * time.Second + defaultAggregation = true + defaultExtendedAggregation = false + defaultOriginDetection = true +) + +// Options contains the configuration options for a client. +type Options struct { + namespace string + tags []string + maxBytesPerPayload int + maxMessagesPerPayload int + bufferPoolSize int + bufferFlushInterval time.Duration + workersCount int + senderQueueSize int + writeTimeout time.Duration + telemetry bool + receiveMode receivingMode + channelModeBufferSize int + aggregationFlushInterval time.Duration + aggregation bool + extendedAggregation bool + telemetryAddr string + originDetection bool + containerID string +} + +func resolveOptions(options []Option) (*Options, error) { + o := &Options{ + namespace: defaultNamespace, + tags: defaultTags, + maxBytesPerPayload: defaultMaxBytesPerPayload, + maxMessagesPerPayload: defaultMaxMessagesPerPayload, + bufferPoolSize: defaultBufferPoolSize, + bufferFlushInterval: defaultBufferFlushInterval, + workersCount: defaultWorkerCount, + senderQueueSize: defaultSenderQueueSize, + writeTimeout: defaultWriteTimeout, + telemetry: defaultTelemetry, + receiveMode: defaultReceivingMode, + channelModeBufferSize: defaultChannelModeBufferSize, + aggregationFlushInterval: defaultAggregationFlushInterval, + aggregation: defaultAggregation, + extendedAggregation: defaultExtendedAggregation, + originDetection: defaultOriginDetection, + } + + for _, option := range options { + err := option(o) + if err != nil { + return nil, err + } + } + + return o, nil +} + +// Option is a client option. Can return an error if validation fails. +type Option func(*Options) error + +// WithNamespace sets a string to be prepend to all metrics, events and service checks name. +// +// A '.' will automatically be added after the namespace if needed. For example a metrics 'test' with a namespace 'prod' +// will produce a final metric named 'prod.test'. +func WithNamespace(namespace string) Option { + return func(o *Options) error { + if strings.HasSuffix(namespace, ".") { + o.namespace = namespace + } else { + o.namespace = namespace + "." + } + return nil + } +} + +// WithTags sets global tags to be applied to every metrics, events and service checks. +func WithTags(tags []string) Option { + return func(o *Options) error { + o.tags = tags + return nil + } +} + +// WithMaxMessagesPerPayload sets the maximum number of metrics, events and/or service checks that a single payload can +// contain. +// +// The default is 'math.MaxInt32' which will most likely let the WithMaxBytesPerPayload option take precedence. This +// option can be set to `1` to create an unbuffered client (each metrics/event/service check will be send in its own +// payload to the agent). +func WithMaxMessagesPerPayload(maxMessagesPerPayload int) Option { + return func(o *Options) error { + o.maxMessagesPerPayload = maxMessagesPerPayload + return nil + } +} + +// WithMaxBytesPerPayload sets the maximum number of bytes a single payload can contain. Each sample, even and service +// check must be lower than this value once serialized or an `MessageTooLongError` is returned. +// +// The default value 0 which will set the option to the optimal size for the transport protocol used: 1432 for UDP and +// named pipe and 8192 for UDS. Those values offer the best performances. +// Be careful when changing this option, see +// https://docs.datadoghq.com/developers/dogstatsd/high_throughput/#ensure-proper-packet-sizes. +func WithMaxBytesPerPayload(MaxBytesPerPayload int) Option { + return func(o *Options) error { + o.maxBytesPerPayload = MaxBytesPerPayload + return nil + } +} + +// WithBufferPoolSize sets the size of the pool of buffers used to serialized metrics, events and service_checks. +// +// The default, 0, will set the option to the optimal size for the transport protocol used: 2048 for UDP and named pipe +// and 512 for UDS. +func WithBufferPoolSize(bufferPoolSize int) Option { + return func(o *Options) error { + o.bufferPoolSize = bufferPoolSize + return nil + } +} + +// WithBufferFlushInterval sets the interval after which the current buffer is flushed. +// +// A buffers are used to serialized data, they're flushed either when full (see WithMaxBytesPerPayload) or when it's +// been open for longer than this interval. +// +// With apps sending a high number of metrics/events/service_checks the interval rarely timeout. But with slow sending +// apps increasing this value will reduce the number of payload sent on the wire as more data is serialized in the same +// payload. +// +// Default is 100ms +func WithBufferFlushInterval(bufferFlushInterval time.Duration) Option { + return func(o *Options) error { + o.bufferFlushInterval = bufferFlushInterval + return nil + } +} + +// WithWorkersCount sets the number of workers that will be used to serialized data. +// +// Those workers allow the use of multiple buffers at the same time (see WithBufferPoolSize) to reduce lock contention. +// +// Default is 32. +func WithWorkersCount(workersCount int) Option { + return func(o *Options) error { + if workersCount < 1 { + return fmt.Errorf("workersCount must be a positive integer") + } + o.workersCount = workersCount + return nil + } +} + +// WithSenderQueueSize sets the size of the sender queue in number of buffers. +// +// After data has been serialized in a buffer they're pushed to a queue that the sender will consume and then each one +// ot the agent. +// +// The default value 0 will set the option to the optimal size for the transport protocol used: 2048 for UDP and named +// pipe and 512 for UDS. +func WithSenderQueueSize(senderQueueSize int) Option { + return func(o *Options) error { + o.senderQueueSize = senderQueueSize + return nil + } +} + +// WithWriteTimeout sets the timeout for network communication with the Agent, after this interval a payload is +// dropped. This is only used for UDS and named pipes connection. +func WithWriteTimeout(writeTimeout time.Duration) Option { + return func(o *Options) error { + o.writeTimeout = writeTimeout + return nil + } +} + +// WithChannelMode make the client use channels to receive metrics +// +// This determines how the client receive metrics from the app (for example when calling the `Gauge()` method). +// The client will either drop the metrics if its buffers are full (WithChannelMode option) or block the caller until the +// metric can be handled (WithMutexMode option). By default the client use mutexes. +// +// WithChannelMode uses a channel (see WithChannelModeBufferSize to configure its size) to receive metrics and drops metrics if +// the channel is full. Sending metrics in this mode is much slower that WithMutexMode (because of the channel), but will not +// block the application. This mode is made for application using many goroutines, sending the same metrics, at a very +// high volume. The goal is to not slow down the application at the cost of dropping metrics and having a lower max +// throughput. +func WithChannelMode() Option { + return func(o *Options) error { + o.receiveMode = channelMode + return nil + } +} + +// WithMutexMode will use mutex to receive metrics from the app throught the API. +// +// This determines how the client receive metrics from the app (for example when calling the `Gauge()` method). +// The client will either drop the metrics if its buffers are full (WithChannelMode option) or block the caller until the +// metric can be handled (WithMutexMode option). By default the client use mutexes. +// +// WithMutexMode uses mutexes to receive metrics which is much faster than channels but can cause some lock contention +// when used with a high number of goroutines sendint the same metrics. Mutexes are sharded based on the metrics name +// which limit mutex contention when multiple goroutines send different metrics (see WithWorkersCount). This is the +// default behavior which will produce the best throughput. +func WithMutexMode() Option { + return func(o *Options) error { + o.receiveMode = mutexMode + return nil + } +} + +// WithChannelModeBufferSize sets the size of the channel holding incoming metrics when WithChannelMode is used. +func WithChannelModeBufferSize(bufferSize int) Option { + return func(o *Options) error { + o.channelModeBufferSize = bufferSize + return nil + } +} + +// WithAggregationInterval sets the interval at which aggregated metrics are flushed. See WithClientSideAggregation and +// WithExtendedClientSideAggregation for more. +// +// The default interval is 2s. The interval must divide the Agent reporting period (default=10s) evenly to reduce "aliasing" +// that can cause values to appear irregular/spiky. +// +// For example a 3s aggregation interval will create spikes in the final graph: a application sending a count metric +// that increments at a constant 1000 time per second will appear noisy with an interval of 3s. This is because +// client-side aggregation would report every 3 seconds, while the agent is reporting every 10 seconds. This means in +// each agent bucket, the values are: 9000, 9000, 12000. +func WithAggregationInterval(interval time.Duration) Option { + return func(o *Options) error { + o.aggregationFlushInterval = interval + return nil + } +} + +// WithClientSideAggregation enables client side aggregation for Gauges, Counts and Sets. +func WithClientSideAggregation() Option { + return func(o *Options) error { + o.aggregation = true + return nil + } +} + +// WithoutClientSideAggregation disables client side aggregation. +func WithoutClientSideAggregation() Option { + return func(o *Options) error { + o.aggregation = false + o.extendedAggregation = false + return nil + } +} + +// WithExtendedClientSideAggregation enables client side aggregation for all types. This feature is only compatible with +// Agent's version >=6.25.0 && <7.0.0 or Agent's versions >=7.25.0. +func WithExtendedClientSideAggregation() Option { + return func(o *Options) error { + o.aggregation = true + o.extendedAggregation = true + return nil + } +} + +// WithoutTelemetry disables the client telemetry. +// +// More on this here: https://docs.datadoghq.com/developers/dogstatsd/high_throughput/#client-side-telemetry +func WithoutTelemetry() Option { + return func(o *Options) error { + o.telemetry = false + return nil + } +} + +// WithTelemetryAddr sets a different address for telemetry metrics. By default the same address as the client is used +// for telemetry. +// +// More on this here: https://docs.datadoghq.com/developers/dogstatsd/high_throughput/#client-side-telemetry +func WithTelemetryAddr(addr string) Option { + return func(o *Options) error { + o.telemetryAddr = addr + return nil + } +} + +// WithoutOriginDetection disables the client origin detection. +// When enabled, the client tries to discover its container ID and sends it to the Agent +// to enrich the metrics with container tags. +// Origin detection can also be disabled by configuring the environment variabe DD_ORIGIN_DETECTION_ENABLED=false +// The client tries to read the container ID by parsing the file /proc/self/cgroup, this is not supported on Windows. +// The client prioritizes the value passed via DD_ENTITY_ID (if set) over the container ID. +// +// More on this here: https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp +func WithoutOriginDetection() Option { + return func(o *Options) error { + o.originDetection = false + return nil + } +} + +// WithOriginDetection enables the client origin detection. +// This feature requires Datadog Agent version >=6.35.0 && <7.0.0 or Agent versions >=7.35.0. +// When enabled, the client tries to discover its container ID and sends it to the Agent +// to enrich the metrics with container tags. +// Origin detection can be disabled by configuring the environment variabe DD_ORIGIN_DETECTION_ENABLED=false +// The client tries to read the container ID by parsing the file /proc/self/cgroup, this is not supported on Windows. +// The client prioritizes the value passed via DD_ENTITY_ID (if set) over the container ID. +// +// More on this here: https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp +func WithOriginDetection() Option { + return func(o *Options) error { + o.originDetection = true + return nil + } +} + +// WithContainerID allows passing the container ID, this will be used by the Agent to enrich metrics with container tags. +// This feature requires Datadog Agent version >=6.35.0 && <7.0.0 or Agent versions >=7.35.0. +// When configured, the provided container ID is prioritized over the container ID discovered via Origin Detection. +// The client prioritizes the value passed via DD_ENTITY_ID (if set) over the container ID. +func WithContainerID(id string) Option { + return func(o *Options) error { + o.containerID = id + return nil + } +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/pipe.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/pipe.go new file mode 100644 index 00000000..84c38e96 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/pipe.go @@ -0,0 +1,13 @@ +// +build !windows + +package statsd + +import ( + "errors" + "io" + "time" +) + +func newWindowsPipeWriter(pipepath string, writeTimeout time.Duration) (io.WriteCloser, error) { + return nil, errors.New("Windows Named Pipes are only supported on Windows") +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/pipe_windows.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/pipe_windows.go new file mode 100644 index 00000000..5ab60f00 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/pipe_windows.go @@ -0,0 +1,75 @@ +// +build windows + +package statsd + +import ( + "net" + "sync" + "time" + + "github.com/Microsoft/go-winio" +) + +type pipeWriter struct { + mu sync.RWMutex + conn net.Conn + timeout time.Duration + pipepath string +} + +func (p *pipeWriter) Write(data []byte) (n int, err error) { + conn, err := p.ensureConnection() + if err != nil { + return 0, err + } + + p.mu.RLock() + conn.SetWriteDeadline(time.Now().Add(p.timeout)) + p.mu.RUnlock() + + n, err = conn.Write(data) + if err != nil { + if e, ok := err.(net.Error); !ok || !e.Temporary() { + // disconnected; retry again on next attempt + p.mu.Lock() + p.conn = nil + p.mu.Unlock() + } + } + return n, err +} + +func (p *pipeWriter) ensureConnection() (net.Conn, error) { + p.mu.RLock() + conn := p.conn + p.mu.RUnlock() + if conn != nil { + return conn, nil + } + + // looks like we might need to connect - try again with write locking. + p.mu.Lock() + defer p.mu.Unlock() + if p.conn != nil { + return p.conn, nil + } + newconn, err := winio.DialPipe(p.pipepath, nil) + if err != nil { + return nil, err + } + p.conn = newconn + return newconn, nil +} + +func (p *pipeWriter) Close() error { + return p.conn.Close() +} + +func newWindowsPipeWriter(pipepath string, writeTimeout time.Duration) (*pipeWriter, error) { + // Defer connection establishment to first write + return &pipeWriter{ + conn: nil, + timeout: writeTimeout, + pipepath: pipepath, + }, nil +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/sender.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/sender.go new file mode 100644 index 00000000..500d53c4 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/sender.go @@ -0,0 +1,111 @@ +package statsd + +import ( + "io" + "sync/atomic" +) + +// senderTelemetry contains telemetry about the health of the sender +type senderTelemetry struct { + totalPayloadsSent uint64 + totalPayloadsDroppedQueueFull uint64 + totalPayloadsDroppedWriter uint64 + totalBytesSent uint64 + totalBytesDroppedQueueFull uint64 + totalBytesDroppedWriter uint64 +} + +type sender struct { + transport io.WriteCloser + pool *bufferPool + queue chan *statsdBuffer + telemetry *senderTelemetry + stop chan struct{} + flushSignal chan struct{} +} + +func newSender(transport io.WriteCloser, queueSize int, pool *bufferPool) *sender { + sender := &sender{ + transport: transport, + pool: pool, + queue: make(chan *statsdBuffer, queueSize), + telemetry: &senderTelemetry{}, + stop: make(chan struct{}), + flushSignal: make(chan struct{}), + } + + go sender.sendLoop() + return sender +} + +func (s *sender) send(buffer *statsdBuffer) { + select { + case s.queue <- buffer: + default: + atomic.AddUint64(&s.telemetry.totalPayloadsDroppedQueueFull, 1) + atomic.AddUint64(&s.telemetry.totalBytesDroppedQueueFull, uint64(len(buffer.bytes()))) + s.pool.returnBuffer(buffer) + } +} + +func (s *sender) write(buffer *statsdBuffer) { + _, err := s.transport.Write(buffer.bytes()) + if err != nil { + atomic.AddUint64(&s.telemetry.totalPayloadsDroppedWriter, 1) + atomic.AddUint64(&s.telemetry.totalBytesDroppedWriter, uint64(len(buffer.bytes()))) + } else { + atomic.AddUint64(&s.telemetry.totalPayloadsSent, 1) + atomic.AddUint64(&s.telemetry.totalBytesSent, uint64(len(buffer.bytes()))) + } + s.pool.returnBuffer(buffer) +} + +func (s *sender) flushTelemetryMetrics(t *Telemetry) { + t.TotalPayloadsSent = atomic.LoadUint64(&s.telemetry.totalPayloadsSent) + t.TotalPayloadsDroppedQueueFull = atomic.LoadUint64(&s.telemetry.totalPayloadsDroppedQueueFull) + t.TotalPayloadsDroppedWriter = atomic.LoadUint64(&s.telemetry.totalPayloadsDroppedWriter) + + t.TotalBytesSent = atomic.LoadUint64(&s.telemetry.totalBytesSent) + t.TotalBytesDroppedQueueFull = atomic.LoadUint64(&s.telemetry.totalBytesDroppedQueueFull) + t.TotalBytesDroppedWriter = atomic.LoadUint64(&s.telemetry.totalBytesDroppedWriter) +} + +func (s *sender) sendLoop() { + defer close(s.stop) + for { + select { + case buffer := <-s.queue: + s.write(buffer) + case <-s.stop: + return + case <-s.flushSignal: + // At that point we know that the workers are paused (the statsd client + // will pause them before calling sender.flush()). + // So we can fully flush the input queue + s.flushInputQueue() + s.flushSignal <- struct{}{} + } + } +} + +func (s *sender) flushInputQueue() { + for { + select { + case buffer := <-s.queue: + s.write(buffer) + default: + return + } + } +} +func (s *sender) flush() { + s.flushSignal <- struct{}{} + <-s.flushSignal +} + +func (s *sender) close() error { + s.stop <- struct{}{} + <-s.stop + s.flushInputQueue() + return s.transport.Close() +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/service_check.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/service_check.go new file mode 100644 index 00000000..e2850465 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/service_check.go @@ -0,0 +1,57 @@ +package statsd + +import ( + "fmt" + "time" +) + +// ServiceCheckStatus support +type ServiceCheckStatus byte + +const ( + // Ok is the "ok" ServiceCheck status + Ok ServiceCheckStatus = 0 + // Warn is the "warning" ServiceCheck status + Warn ServiceCheckStatus = 1 + // Critical is the "critical" ServiceCheck status + Critical ServiceCheckStatus = 2 + // Unknown is the "unknown" ServiceCheck status + Unknown ServiceCheckStatus = 3 +) + +// A ServiceCheck is an object that contains status of DataDog service check. +type ServiceCheck struct { + // Name of the service check. Required. + Name string + // Status of service check. Required. + Status ServiceCheckStatus + // Timestamp is a timestamp for the serviceCheck. If not provided, the dogstatsd + // server will set this to the current time. + Timestamp time.Time + // Hostname for the serviceCheck. + Hostname string + // A message describing the current state of the serviceCheck. + Message string + // Tags for the serviceCheck. + Tags []string +} + +// NewServiceCheck creates a new serviceCheck with the given name and status. Error checking +// against these values is done at send-time, or upon running sc.Check. +func NewServiceCheck(name string, status ServiceCheckStatus) *ServiceCheck { + return &ServiceCheck{ + Name: name, + Status: status, + } +} + +// Check verifies that a service check is valid. +func (sc *ServiceCheck) Check() error { + if len(sc.Name) == 0 { + return fmt.Errorf("statsd.ServiceCheck name is required") + } + if byte(sc.Status) < 0 || byte(sc.Status) > 3 { + return fmt.Errorf("statsd.ServiceCheck status has invalid value") + } + return nil +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/statsd.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/statsd.go new file mode 100644 index 00000000..378581b9 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/statsd.go @@ -0,0 +1,838 @@ +// Copyright 2013 Ooyala, Inc. + +/* +Package statsd provides a Go dogstatsd client. Dogstatsd extends the popular statsd, +adding tags and histograms and pushing upstream to Datadog. + +Refer to http://docs.datadoghq.com/guides/dogstatsd/ for information about DogStatsD. + +statsd is based on go-statsd-client. +*/ +package statsd + +//go:generate mockgen -source=statsd.go -destination=mocks/statsd.go + +import ( + "errors" + "fmt" + "io" + "net/url" + "os" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" +) + +/* +OptimalUDPPayloadSize defines the optimal payload size for a UDP datagram, 1432 bytes +is optimal for regular networks with an MTU of 1500 so datagrams don't get +fragmented. It's generally recommended not to fragment UDP datagrams as losing +a single fragment will cause the entire datagram to be lost. +*/ +const OptimalUDPPayloadSize = 1432 + +/* +MaxUDPPayloadSize defines the maximum payload size for a UDP datagram. +Its value comes from the calculation: 65535 bytes Max UDP datagram size - +8byte UDP header - 60byte max IP headers +any number greater than that will see frames being cut out. +*/ +const MaxUDPPayloadSize = 65467 + +// DefaultUDPBufferPoolSize is the default size of the buffer pool for UDP clients. +const DefaultUDPBufferPoolSize = 2048 + +// DefaultUDSBufferPoolSize is the default size of the buffer pool for UDS clients. +const DefaultUDSBufferPoolSize = 512 + +/* +DefaultMaxAgentPayloadSize is the default maximum payload size the agent +can receive. This can be adjusted by changing dogstatsd_buffer_size in the +agent configuration file datadog.yaml. This is also used as the optimal payload size +for UDS datagrams. +*/ +const DefaultMaxAgentPayloadSize = 8192 + +/* +UnixAddressPrefix holds the prefix to use to enable Unix Domain Socket +traffic instead of UDP. +*/ +const UnixAddressPrefix = "unix://" + +/* +WindowsPipeAddressPrefix holds the prefix to use to enable Windows Named Pipes +traffic instead of UDP. +*/ +const WindowsPipeAddressPrefix = `\\.\pipe\` + +const ( + agentHostEnvVarName = "DD_AGENT_HOST" + agentPortEnvVarName = "DD_DOGSTATSD_PORT" + agentURLEnvVarName = "DD_DOGSTATSD_URL" + defaultUDPPort = "8125" +) + +const ( + // ddEntityID specifies client-side user-specified entity ID injection. + // This env var can be set to the Pod UID on Kubernetes via the downward API. + // Docs: https://docs.datadoghq.com/developers/dogstatsd/?tab=kubernetes#origin-detection-over-udp + ddEntityID = "DD_ENTITY_ID" + + // ddEntityIDTag specifies the tag name for the client-side entity ID injection + // The Agent expects this tag to contain a non-prefixed Kubernetes Pod UID. + ddEntityIDTag = "dd.internal.entity_id" + + // originDetectionEnabled specifies the env var to enable/disable sending the container ID field. + originDetectionEnabled = "DD_ORIGIN_DETECTION_ENABLED" +) + +/* +ddEnvTagsMapping is a mapping of each "DD_" prefixed environment variable +to a specific tag name. We use a slice to keep the order and simplify tests. +*/ +var ddEnvTagsMapping = []struct{ envName, tagName string }{ + {ddEntityID, ddEntityIDTag}, // Client-side entity ID injection for container tagging. + {"DD_ENV", "env"}, // The name of the env in which the service runs. + {"DD_SERVICE", "service"}, // The name of the running service. + {"DD_VERSION", "version"}, // The current version of the running service. +} + +type metricType int + +const ( + gauge metricType = iota + count + histogram + histogramAggregated + distribution + distributionAggregated + set + timing + timingAggregated + event + serviceCheck +) + +type receivingMode int + +const ( + mutexMode receivingMode = iota + channelMode +) + +const ( + writerNameUDP string = "udp" + writerNameUDS string = "uds" + writerWindowsPipe string = "pipe" +) + +// noTimestamp is used as a value for metric without a given timestamp. +const noTimestamp = int64(0) + +type metric struct { + metricType metricType + namespace string + globalTags []string + name string + fvalue float64 + fvalues []float64 + ivalue int64 + svalue string + evalue *Event + scvalue *ServiceCheck + tags []string + stags string + rate float64 + timestamp int64 +} + +type noClientErr string + +// ErrNoClient is returned if statsd reporting methods are invoked on +// a nil client. +const ErrNoClient = noClientErr("statsd client is nil") + +func (e noClientErr) Error() string { + return string(e) +} + +type invalidTimestampErr string + +// InvalidTimestamp is returned if a provided timestamp is invalid. +const InvalidTimestamp = invalidTimestampErr("invalid timestamp") + +func (e invalidTimestampErr) Error() string { + return string(e) +} + +// ClientInterface is an interface that exposes the common client functions for the +// purpose of being able to provide a no-op client or even mocking. This can aid +// downstream users' with their testing. +type ClientInterface interface { + // Gauge measures the value of a metric at a particular time. + Gauge(name string, value float64, tags []string, rate float64) error + + // GaugeWithTimestamp measures the value of a metric at a given time. + // BETA - Please contact our support team for more information to use this feature: https://www.datadoghq.com/support/ + // The value will bypass any aggregation on the client side and agent side, this is + // useful when sending points in the past. + // + // Minimum Datadog Agent version: 7.40.0 + GaugeWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error + + // Count tracks how many times something happened per second. + Count(name string, value int64, tags []string, rate float64) error + + // CountWithTimestamp tracks how many times something happened at the given second. + // BETA - Please contact our support team for more information to use this feature: https://www.datadoghq.com/support/ + // The value will bypass any aggregation on the client side and agent side, this is + // useful when sending points in the past. + // + // Minimum Datadog Agent version: 7.40.0 + CountWithTimestamp(name string, value int64, tags []string, rate float64, timestamp time.Time) error + + // Histogram tracks the statistical distribution of a set of values on each host. + Histogram(name string, value float64, tags []string, rate float64) error + + // Distribution tracks the statistical distribution of a set of values across your infrastructure. + Distribution(name string, value float64, tags []string, rate float64) error + + // Decr is just Count of -1 + Decr(name string, tags []string, rate float64) error + + // Incr is just Count of 1 + Incr(name string, tags []string, rate float64) error + + // Set counts the number of unique elements in a group. + Set(name string, value string, tags []string, rate float64) error + + // Timing sends timing information, it is an alias for TimeInMilliseconds + Timing(name string, value time.Duration, tags []string, rate float64) error + + // TimeInMilliseconds sends timing information in milliseconds. + // It is flushed by statsd with percentiles, mean and other info (https://github.com/etsy/statsd/blob/master/docs/metric_types.md#timing) + TimeInMilliseconds(name string, value float64, tags []string, rate float64) error + + // Event sends the provided Event. + Event(e *Event) error + + // SimpleEvent sends an event with the provided title and text. + SimpleEvent(title, text string) error + + // ServiceCheck sends the provided ServiceCheck. + ServiceCheck(sc *ServiceCheck) error + + // SimpleServiceCheck sends an serviceCheck with the provided name and status. + SimpleServiceCheck(name string, status ServiceCheckStatus) error + + // Close the client connection. + Close() error + + // Flush forces a flush of all the queued dogstatsd payloads. + Flush() error + + // IsClosed returns if the client has been closed. + IsClosed() bool + + // GetTelemetry return the telemetry metrics for the client since it started. + GetTelemetry() Telemetry +} + +// A Client is a handle for sending messages to dogstatsd. It is safe to +// use one Client from multiple goroutines simultaneously. +type Client struct { + // Sender handles the underlying networking protocol + sender *sender + // namespace to prepend to all statsd calls + namespace string + // tags are global tags to be added to every statsd call + tags []string + flushTime time.Duration + telemetry *statsdTelemetry + telemetryClient *telemetryClient + stop chan struct{} + wg sync.WaitGroup + workers []*worker + closerLock sync.Mutex + workersMode receivingMode + aggregatorMode receivingMode + agg *aggregator + aggExtended *aggregator + options []Option + addrOption string + isClosed bool +} + +// statsdTelemetry contains telemetry metrics about the client +type statsdTelemetry struct { + totalMetricsGauge uint64 + totalMetricsCount uint64 + totalMetricsHistogram uint64 + totalMetricsDistribution uint64 + totalMetricsSet uint64 + totalMetricsTiming uint64 + totalEvents uint64 + totalServiceChecks uint64 + totalDroppedOnReceive uint64 +} + +// Verify that Client implements the ClientInterface. +// https://golang.org/doc/faq#guarantee_satisfies_interface +var _ ClientInterface = &Client{} + +func resolveAddr(addr string) string { + envPort := "" + + if addr == "" { + addr = os.Getenv(agentHostEnvVarName) + envPort = os.Getenv(agentPortEnvVarName) + agentURL, _ := os.LookupEnv(agentURLEnvVarName) + agentURL = parseAgentURL(agentURL) + + // agentURLEnvVarName has priority over agentHostEnvVarName + if agentURL != "" { + return agentURL + } + } + + if addr == "" { + return "" + } + + if !strings.HasPrefix(addr, WindowsPipeAddressPrefix) && !strings.HasPrefix(addr, UnixAddressPrefix) { + if !strings.Contains(addr, ":") { + if envPort != "" { + addr = fmt.Sprintf("%s:%s", addr, envPort) + } else { + addr = fmt.Sprintf("%s:%s", addr, defaultUDPPort) + } + } + } + return addr +} + +func parseAgentURL(agentURL string) string { + if agentURL != "" { + if strings.HasPrefix(agentURL, WindowsPipeAddressPrefix) { + return agentURL + } + + parsedURL, err := url.Parse(agentURL) + if err != nil { + return "" + } + + if parsedURL.Scheme == "udp" { + if strings.Contains(parsedURL.Host, ":") { + return parsedURL.Host + } + return fmt.Sprintf("%s:%s", parsedURL.Host, defaultUDPPort) + } + + if parsedURL.Scheme == "unix" { + return agentURL + } + } + return "" +} + +func createWriter(addr string, writeTimeout time.Duration) (io.WriteCloser, string, error) { + addr = resolveAddr(addr) + if addr == "" { + return nil, "", errors.New("No address passed and autodetection from environment failed") + } + + switch { + case strings.HasPrefix(addr, WindowsPipeAddressPrefix): + w, err := newWindowsPipeWriter(addr, writeTimeout) + return w, writerWindowsPipe, err + case strings.HasPrefix(addr, UnixAddressPrefix): + w, err := newUDSWriter(addr[len(UnixAddressPrefix):], writeTimeout) + return w, writerNameUDS, err + default: + w, err := newUDPWriter(addr, writeTimeout) + return w, writerNameUDP, err + } +} + +// New returns a pointer to a new Client given an addr in the format "hostname:port" for UDP, +// "unix:///path/to/socket" for UDS or "\\.\pipe\path\to\pipe" for Windows Named Pipes. +func New(addr string, options ...Option) (*Client, error) { + o, err := resolveOptions(options) + if err != nil { + return nil, err + } + + w, writerType, err := createWriter(addr, o.writeTimeout) + if err != nil { + return nil, err + } + + client, err := newWithWriter(w, o, writerType) + if err == nil { + client.options = append(client.options, options...) + client.addrOption = addr + } + return client, err +} + +// NewWithWriter creates a new Client with given writer. Writer is a +// io.WriteCloser +func NewWithWriter(w io.WriteCloser, options ...Option) (*Client, error) { + o, err := resolveOptions(options) + if err != nil { + return nil, err + } + return newWithWriter(w, o, "custom") +} + +// CloneWithExtraOptions create a new Client with extra options +func CloneWithExtraOptions(c *Client, options ...Option) (*Client, error) { + if c == nil { + return nil, ErrNoClient + } + + if c.addrOption == "" { + return nil, fmt.Errorf("can't clone client with no addrOption") + } + opt := append(c.options, options...) + return New(c.addrOption, opt...) +} + +func newWithWriter(w io.WriteCloser, o *Options, writerName string) (*Client, error) { + c := Client{ + namespace: o.namespace, + tags: o.tags, + telemetry: &statsdTelemetry{}, + } + + hasEntityID := false + // Inject values of DD_* environment variables as global tags. + for _, mapping := range ddEnvTagsMapping { + if value := os.Getenv(mapping.envName); value != "" { + if mapping.envName == ddEntityID { + hasEntityID = true + } + c.tags = append(c.tags, fmt.Sprintf("%s:%s", mapping.tagName, value)) + } + } + + if !hasEntityID { + initContainerID(o.containerID, isOriginDetectionEnabled(o, hasEntityID)) + } + + if o.maxBytesPerPayload == 0 { + if writerName == writerNameUDS { + o.maxBytesPerPayload = DefaultMaxAgentPayloadSize + } else { + o.maxBytesPerPayload = OptimalUDPPayloadSize + } + } + if o.bufferPoolSize == 0 { + if writerName == writerNameUDS { + o.bufferPoolSize = DefaultUDSBufferPoolSize + } else { + o.bufferPoolSize = DefaultUDPBufferPoolSize + } + } + if o.senderQueueSize == 0 { + if writerName == writerNameUDS { + o.senderQueueSize = DefaultUDSBufferPoolSize + } else { + o.senderQueueSize = DefaultUDPBufferPoolSize + } + } + + bufferPool := newBufferPool(o.bufferPoolSize, o.maxBytesPerPayload, o.maxMessagesPerPayload) + c.sender = newSender(w, o.senderQueueSize, bufferPool) + c.aggregatorMode = o.receiveMode + + c.workersMode = o.receiveMode + // channelMode mode at the worker level is not enabled when + // ExtendedAggregation is since the user app will not directly + // use the worker (the aggregator sit between the app and the + // workers). + if o.extendedAggregation { + c.workersMode = mutexMode + } + + if o.aggregation || o.extendedAggregation { + c.agg = newAggregator(&c) + c.agg.start(o.aggregationFlushInterval) + + if o.extendedAggregation { + c.aggExtended = c.agg + + if c.aggregatorMode == channelMode { + c.agg.startReceivingMetric(o.channelModeBufferSize, o.workersCount) + } + } + } + + for i := 0; i < o.workersCount; i++ { + w := newWorker(bufferPool, c.sender) + c.workers = append(c.workers, w) + + if c.workersMode == channelMode { + w.startReceivingMetric(o.channelModeBufferSize) + } + } + + c.flushTime = o.bufferFlushInterval + c.stop = make(chan struct{}, 1) + + c.wg.Add(1) + go func() { + defer c.wg.Done() + c.watch() + }() + + if o.telemetry { + if o.telemetryAddr == "" { + c.telemetryClient = newTelemetryClient(&c, writerName, c.agg != nil) + } else { + var err error + c.telemetryClient, err = newTelemetryClientWithCustomAddr(&c, writerName, o.telemetryAddr, c.agg != nil, bufferPool, o.writeTimeout) + if err != nil { + return nil, err + } + } + c.telemetryClient.run(&c.wg, c.stop) + } + + return &c, nil +} + +func (c *Client) watch() { + ticker := time.NewTicker(c.flushTime) + + for { + select { + case <-ticker.C: + for _, w := range c.workers { + w.flush() + } + case <-c.stop: + ticker.Stop() + return + } + } +} + +// Flush forces a flush of all the queued dogstatsd payloads This method is +// blocking and will not return until everything is sent through the network. +// In mutexMode, this will also block sampling new data to the client while the +// workers and sender are flushed. +func (c *Client) Flush() error { + if c == nil { + return ErrNoClient + } + if c.agg != nil { + c.agg.flush() + } + for _, w := range c.workers { + w.pause() + defer w.unpause() + w.flushUnsafe() + } + // Now that the worker are pause the sender can flush the queue between + // worker and senders + c.sender.flush() + return nil +} + +// IsClosed returns if the client has been closed. +func (c *Client) IsClosed() bool { + c.closerLock.Lock() + defer c.closerLock.Unlock() + return c.isClosed +} + +func (c *Client) flushTelemetryMetrics(t *Telemetry) { + t.TotalMetricsGauge = atomic.LoadUint64(&c.telemetry.totalMetricsGauge) + t.TotalMetricsCount = atomic.LoadUint64(&c.telemetry.totalMetricsCount) + t.TotalMetricsSet = atomic.LoadUint64(&c.telemetry.totalMetricsSet) + t.TotalMetricsHistogram = atomic.LoadUint64(&c.telemetry.totalMetricsHistogram) + t.TotalMetricsDistribution = atomic.LoadUint64(&c.telemetry.totalMetricsDistribution) + t.TotalMetricsTiming = atomic.LoadUint64(&c.telemetry.totalMetricsTiming) + t.TotalEvents = atomic.LoadUint64(&c.telemetry.totalEvents) + t.TotalServiceChecks = atomic.LoadUint64(&c.telemetry.totalServiceChecks) + t.TotalDroppedOnReceive = atomic.LoadUint64(&c.telemetry.totalDroppedOnReceive) +} + +// GetTelemetry return the telemetry metrics for the client since it started. +func (c *Client) GetTelemetry() Telemetry { + return c.telemetryClient.getTelemetry() +} + +func (c *Client) send(m metric) error { + h := hashString32(m.name) + worker := c.workers[h%uint32(len(c.workers))] + + if c.workersMode == channelMode { + select { + case worker.inputMetrics <- m: + default: + atomic.AddUint64(&c.telemetry.totalDroppedOnReceive, 1) + } + return nil + } + return worker.processMetric(m) +} + +// sendBlocking is used by the aggregator to inject aggregated metrics. +func (c *Client) sendBlocking(m metric) error { + m.globalTags = c.tags + m.namespace = c.namespace + + h := hashString32(m.name) + worker := c.workers[h%uint32(len(c.workers))] + return worker.processMetric(m) +} + +func (c *Client) sendToAggregator(mType metricType, name string, value float64, tags []string, rate float64, f bufferedMetricSampleFunc) error { + if c.aggregatorMode == channelMode { + select { + case c.aggExtended.inputMetrics <- metric{metricType: mType, name: name, fvalue: value, tags: tags, rate: rate}: + default: + atomic.AddUint64(&c.telemetry.totalDroppedOnReceive, 1) + } + return nil + } + return f(name, value, tags, rate) +} + +// Gauge measures the value of a metric at a particular time. +func (c *Client) Gauge(name string, value float64, tags []string, rate float64) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalMetricsGauge, 1) + if c.agg != nil { + return c.agg.gauge(name, value, tags) + } + return c.send(metric{metricType: gauge, name: name, fvalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace}) +} + +// GaugeWithTimestamp measures the value of a metric at a given time. +// BETA - Please contact our support team for more information to use this feature: https://www.datadoghq.com/support/ +// The value will bypass any aggregation on the client side and agent side, this is +// useful when sending points in the past. +// +// Minimum Datadog Agent version: 7.40.0 +func (c *Client) GaugeWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error { + if c == nil { + return ErrNoClient + } + + if timestamp.IsZero() || timestamp.Unix() <= noTimestamp { + return InvalidTimestamp + } + + atomic.AddUint64(&c.telemetry.totalMetricsGauge, 1) + return c.send(metric{metricType: gauge, name: name, fvalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace, timestamp: timestamp.Unix()}) +} + +// Count tracks how many times something happened per second. +func (c *Client) Count(name string, value int64, tags []string, rate float64) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalMetricsCount, 1) + if c.agg != nil { + return c.agg.count(name, value, tags) + } + return c.send(metric{metricType: count, name: name, ivalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace}) +} + +// CountWithTimestamp tracks how many times something happened at the given second. +// BETA - Please contact our support team for more information to use this feature: https://www.datadoghq.com/support/ +// The value will bypass any aggregation on the client side and agent side, this is +// useful when sending points in the past. +// +// Minimum Datadog Agent version: 7.40.0 +func (c *Client) CountWithTimestamp(name string, value int64, tags []string, rate float64, timestamp time.Time) error { + if c == nil { + return ErrNoClient + } + + if timestamp.IsZero() || timestamp.Unix() <= noTimestamp { + return InvalidTimestamp + } + + atomic.AddUint64(&c.telemetry.totalMetricsCount, 1) + return c.send(metric{metricType: count, name: name, ivalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace, timestamp: timestamp.Unix()}) +} + +// Histogram tracks the statistical distribution of a set of values on each host. +func (c *Client) Histogram(name string, value float64, tags []string, rate float64) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalMetricsHistogram, 1) + if c.aggExtended != nil { + return c.sendToAggregator(histogram, name, value, tags, rate, c.aggExtended.histogram) + } + return c.send(metric{metricType: histogram, name: name, fvalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace}) +} + +// Distribution tracks the statistical distribution of a set of values across your infrastructure. +func (c *Client) Distribution(name string, value float64, tags []string, rate float64) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalMetricsDistribution, 1) + if c.aggExtended != nil { + return c.sendToAggregator(distribution, name, value, tags, rate, c.aggExtended.distribution) + } + return c.send(metric{metricType: distribution, name: name, fvalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace}) +} + +// Decr is just Count of -1 +func (c *Client) Decr(name string, tags []string, rate float64) error { + return c.Count(name, -1, tags, rate) +} + +// Incr is just Count of 1 +func (c *Client) Incr(name string, tags []string, rate float64) error { + return c.Count(name, 1, tags, rate) +} + +// Set counts the number of unique elements in a group. +func (c *Client) Set(name string, value string, tags []string, rate float64) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalMetricsSet, 1) + if c.agg != nil { + return c.agg.set(name, value, tags) + } + return c.send(metric{metricType: set, name: name, svalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace}) +} + +// Timing sends timing information, it is an alias for TimeInMilliseconds +func (c *Client) Timing(name string, value time.Duration, tags []string, rate float64) error { + return c.TimeInMilliseconds(name, value.Seconds()*1000, tags, rate) +} + +// TimeInMilliseconds sends timing information in milliseconds. +// It is flushed by statsd with percentiles, mean and other info (https://github.com/etsy/statsd/blob/master/docs/metric_types.md#timing) +func (c *Client) TimeInMilliseconds(name string, value float64, tags []string, rate float64) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalMetricsTiming, 1) + if c.aggExtended != nil { + return c.sendToAggregator(timing, name, value, tags, rate, c.aggExtended.timing) + } + return c.send(metric{metricType: timing, name: name, fvalue: value, tags: tags, rate: rate, globalTags: c.tags, namespace: c.namespace}) +} + +// Event sends the provided Event. +func (c *Client) Event(e *Event) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalEvents, 1) + return c.send(metric{metricType: event, evalue: e, rate: 1, globalTags: c.tags, namespace: c.namespace}) +} + +// SimpleEvent sends an event with the provided title and text. +func (c *Client) SimpleEvent(title, text string) error { + e := NewEvent(title, text) + return c.Event(e) +} + +// ServiceCheck sends the provided ServiceCheck. +func (c *Client) ServiceCheck(sc *ServiceCheck) error { + if c == nil { + return ErrNoClient + } + atomic.AddUint64(&c.telemetry.totalServiceChecks, 1) + return c.send(metric{metricType: serviceCheck, scvalue: sc, rate: 1, globalTags: c.tags, namespace: c.namespace}) +} + +// SimpleServiceCheck sends an serviceCheck with the provided name and status. +func (c *Client) SimpleServiceCheck(name string, status ServiceCheckStatus) error { + sc := NewServiceCheck(name, status) + return c.ServiceCheck(sc) +} + +// Close the client connection. +func (c *Client) Close() error { + if c == nil { + return ErrNoClient + } + + // Acquire closer lock to ensure only one thread can close the stop channel + c.closerLock.Lock() + defer c.closerLock.Unlock() + + if c.isClosed { + return nil + } + + // Notify all other threads that they should stop + select { + case <-c.stop: + return nil + default: + } + close(c.stop) + + if c.workersMode == channelMode { + for _, w := range c.workers { + w.stopReceivingMetric() + } + } + + // flush the aggregator first + if c.agg != nil { + if c.aggExtended != nil && c.aggregatorMode == channelMode { + c.agg.stopReceivingMetric() + } + c.agg.stop() + } + + // Wait for the threads to stop + c.wg.Wait() + + c.Flush() + + c.isClosed = true + return c.sender.close() +} + +// isOriginDetectionEnabled returns whether the clients should fill the container field. +// +// If DD_ENTITY_ID is set, we don't send the container ID +// If a user-defined container ID is provided, we don't ignore origin detection +// as dd.internal.entity_id is prioritized over the container field for backward compatibility. +// If DD_ENTITY_ID is not set, we try to fill the container field automatically unless +// DD_ORIGIN_DETECTION_ENABLED is explicitly set to false. +func isOriginDetectionEnabled(o *Options, hasEntityID bool) bool { + if !o.originDetection || hasEntityID || o.containerID != "" { + // originDetection is explicitly disabled + // or DD_ENTITY_ID was found + // or a user-defined container ID was provided + return false + } + + envVarValue := os.Getenv(originDetectionEnabled) + if envVarValue == "" { + // DD_ORIGIN_DETECTION_ENABLED is not set + // default to true + return true + } + + enabled, err := strconv.ParseBool(envVarValue) + if err != nil { + // Error due to an unsupported DD_ORIGIN_DETECTION_ENABLED value + // default to true + return true + } + + return enabled +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/telemetry.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/telemetry.go new file mode 100644 index 00000000..1e2bc0a3 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/telemetry.go @@ -0,0 +1,274 @@ +package statsd + +import ( + "fmt" + "sync" + "time" +) + +/* +telemetryInterval is the interval at which telemetry will be sent by the client. +*/ +const telemetryInterval = 10 * time.Second + +/* +clientTelemetryTag is a tag identifying this specific client. +*/ +var clientTelemetryTag = "client:go" + +/* +clientVersionTelemetryTag is a tag identifying this specific client version. +*/ +var clientVersionTelemetryTag = "client_version:5.3.0" + +// Telemetry represents internal metrics about the client behavior since it started. +type Telemetry struct { + // + // Those are produced by the 'Client' + // + + // TotalMetrics is the total number of metrics sent by the client before aggregation and sampling. + TotalMetrics uint64 + // TotalMetricsGauge is the total number of gauges sent by the client before aggregation and sampling. + TotalMetricsGauge uint64 + // TotalMetricsCount is the total number of counts sent by the client before aggregation and sampling. + TotalMetricsCount uint64 + // TotalMetricsHistogram is the total number of histograms sent by the client before aggregation and sampling. + TotalMetricsHistogram uint64 + // TotalMetricsDistribution is the total number of distributions sent by the client before aggregation and + // sampling. + TotalMetricsDistribution uint64 + // TotalMetricsSet is the total number of sets sent by the client before aggregation and sampling. + TotalMetricsSet uint64 + // TotalMetricsTiming is the total number of timings sent by the client before aggregation and sampling. + TotalMetricsTiming uint64 + // TotalEvents is the total number of events sent by the client before aggregation and sampling. + TotalEvents uint64 + // TotalServiceChecks is the total number of service_checks sent by the client before aggregation and sampling. + TotalServiceChecks uint64 + + // TotalDroppedOnReceive is the total number metrics/event/service_checks dropped when using ChannelMode (see + // WithChannelMode option). + TotalDroppedOnReceive uint64 + + // + // Those are produced by the 'sender' + // + + // TotalPayloadsSent is the total number of payload (packet on the network) succesfully sent by the client. When + // using UDP we don't know if packet dropped or not, so all packet are considered as succesfully sent. + TotalPayloadsSent uint64 + // TotalPayloadsDropped is the total number of payload dropped by the client. This includes all cause of dropped + // (TotalPayloadsDroppedQueueFull and TotalPayloadsDroppedWriter). When using UDP This won't includes the + // network dropped. + TotalPayloadsDropped uint64 + // TotalPayloadsDroppedWriter is the total number of payload dropped by the writer (when using UDS or named + // pipe) due to network timeout or error. + TotalPayloadsDroppedWriter uint64 + // TotalPayloadsDroppedQueueFull is the total number of payload dropped internally because the queue of payloads + // waiting to be sent on the wire is full. This means the client is generating more metrics than can be sent on + // the wire. If your app sends metrics in batch look at WithSenderQueueSize option to increase the queue size. + TotalPayloadsDroppedQueueFull uint64 + + // TotalBytesSent is the total number of bytes succesfully sent by the client. When using UDP we don't know if + // packet dropped or not, so all packet are considered as succesfully sent. + TotalBytesSent uint64 + // TotalBytesDropped is the total number of bytes dropped by the client. This includes all cause of dropped + // (TotalBytesDroppedQueueFull and TotalBytesDroppedWriter). When using UDP This + // won't includes the network dropped. + TotalBytesDropped uint64 + // TotalBytesDroppedWriter is the total number of bytes dropped by the writer (when using UDS or named pipe) due + // to network timeout or error. + TotalBytesDroppedWriter uint64 + // TotalBytesDroppedQueueFull is the total number of bytes dropped internally because the queue of payloads + // waiting to be sent on the wire is full. This means the client is generating more metrics than can be sent on + // the wire. If your app sends metrics in batch look at WithSenderQueueSize option to increase the queue size. + TotalBytesDroppedQueueFull uint64 + + // + // Those are produced by the 'aggregator' + // + + // AggregationNbContext is the total number of contexts flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContext uint64 + // AggregationNbContextGauge is the total number of contexts for gauges flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContextGauge uint64 + // AggregationNbContextCount is the total number of contexts for counts flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContextCount uint64 + // AggregationNbContextSet is the total number of contexts for sets flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContextSet uint64 + // AggregationNbContextHistogram is the total number of contexts for histograms flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContextHistogram uint64 + // AggregationNbContextDistribution is the total number of contexts for distributions flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContextDistribution uint64 + // AggregationNbContextTiming is the total number of contexts for timings flushed by the aggregator when either + // WithClientSideAggregation or WithExtendedClientSideAggregation options are enabled. + AggregationNbContextTiming uint64 +} + +type telemetryClient struct { + c *Client + tags []string + aggEnabled bool // is aggregation enabled and should we sent aggregation telemetry. + tagsByType map[metricType][]string + sender *sender + worker *worker + lastSample Telemetry // The previous sample of telemetry sent +} + +func newTelemetryClient(c *Client, transport string, aggregationEnabled bool) *telemetryClient { + t := &telemetryClient{ + c: c, + tags: append(c.tags, clientTelemetryTag, clientVersionTelemetryTag, "client_transport:"+transport), + aggEnabled: aggregationEnabled, + tagsByType: map[metricType][]string{}, + } + + t.tagsByType[gauge] = append(append([]string{}, t.tags...), "metrics_type:gauge") + t.tagsByType[count] = append(append([]string{}, t.tags...), "metrics_type:count") + t.tagsByType[set] = append(append([]string{}, t.tags...), "metrics_type:set") + t.tagsByType[timing] = append(append([]string{}, t.tags...), "metrics_type:timing") + t.tagsByType[histogram] = append(append([]string{}, t.tags...), "metrics_type:histogram") + t.tagsByType[distribution] = append(append([]string{}, t.tags...), "metrics_type:distribution") + return t +} + +func newTelemetryClientWithCustomAddr(c *Client, transport string, telemetryAddr string, aggregationEnabled bool, pool *bufferPool, writeTimeout time.Duration) (*telemetryClient, error) { + telemetryWriter, _, err := createWriter(telemetryAddr, writeTimeout) + if err != nil { + return nil, fmt.Errorf("Could not resolve telemetry address: %v", err) + } + + t := newTelemetryClient(c, transport, aggregationEnabled) + + // Creating a custom sender/worker with 1 worker in mutex mode for the + // telemetry that share the same bufferPool. + // FIXME due to performance pitfall, we're always using UDP defaults + // even for UDS. + t.sender = newSender(telemetryWriter, DefaultUDPBufferPoolSize, pool) + t.worker = newWorker(pool, t.sender) + return t, nil +} + +func (t *telemetryClient) run(wg *sync.WaitGroup, stop chan struct{}) { + wg.Add(1) + go func() { + defer wg.Done() + ticker := time.NewTicker(telemetryInterval) + for { + select { + case <-ticker.C: + t.sendTelemetry() + case <-stop: + ticker.Stop() + if t.sender != nil { + t.sender.close() + } + return + } + } + }() +} + +func (t *telemetryClient) sendTelemetry() { + for _, m := range t.flush() { + if t.worker != nil { + t.worker.processMetric(m) + } else { + t.c.send(m) + } + } + + if t.worker != nil { + t.worker.flush() + } +} + +func (t *telemetryClient) getTelemetry() Telemetry { + if t == nil { + // telemetry was disabled through the WithoutTelemetry option + return Telemetry{} + } + + tlm := Telemetry{} + t.c.flushTelemetryMetrics(&tlm) + t.c.sender.flushTelemetryMetrics(&tlm) + t.c.agg.flushTelemetryMetrics(&tlm) + + tlm.TotalMetrics = tlm.TotalMetricsGauge + + tlm.TotalMetricsCount + + tlm.TotalMetricsSet + + tlm.TotalMetricsHistogram + + tlm.TotalMetricsDistribution + + tlm.TotalMetricsTiming + + tlm.TotalPayloadsDropped = tlm.TotalPayloadsDroppedQueueFull + tlm.TotalPayloadsDroppedWriter + tlm.TotalBytesDropped = tlm.TotalBytesDroppedQueueFull + tlm.TotalBytesDroppedWriter + + if t.aggEnabled { + tlm.AggregationNbContext = tlm.AggregationNbContextGauge + + tlm.AggregationNbContextCount + + tlm.AggregationNbContextSet + + tlm.AggregationNbContextHistogram + + tlm.AggregationNbContextDistribution + + tlm.AggregationNbContextTiming + } + return tlm +} + +// flushTelemetry returns Telemetry metrics to be flushed. It's its own function to ease testing. +func (t *telemetryClient) flush() []metric { + m := []metric{} + + // same as Count but without global namespace + telemetryCount := func(name string, value int64, tags []string) { + m = append(m, metric{metricType: count, name: name, ivalue: value, tags: tags, rate: 1}) + } + + tlm := t.getTelemetry() + + // We send the diff between now and the previous telemetry flush. This keep the same telemetry behavior from V4 + // so users dashboard's aren't broken when upgrading to V5. It also allow to graph on the same dashboard a mix + // of V4 and V5 apps. + telemetryCount("datadog.dogstatsd.client.metrics", int64(tlm.TotalMetrics-t.lastSample.TotalMetrics), t.tags) + telemetryCount("datadog.dogstatsd.client.metrics_by_type", int64(tlm.TotalMetricsGauge-t.lastSample.TotalMetricsGauge), t.tagsByType[gauge]) + telemetryCount("datadog.dogstatsd.client.metrics_by_type", int64(tlm.TotalMetricsCount-t.lastSample.TotalMetricsCount), t.tagsByType[count]) + telemetryCount("datadog.dogstatsd.client.metrics_by_type", int64(tlm.TotalMetricsHistogram-t.lastSample.TotalMetricsHistogram), t.tagsByType[histogram]) + telemetryCount("datadog.dogstatsd.client.metrics_by_type", int64(tlm.TotalMetricsDistribution-t.lastSample.TotalMetricsDistribution), t.tagsByType[distribution]) + telemetryCount("datadog.dogstatsd.client.metrics_by_type", int64(tlm.TotalMetricsSet-t.lastSample.TotalMetricsSet), t.tagsByType[set]) + telemetryCount("datadog.dogstatsd.client.metrics_by_type", int64(tlm.TotalMetricsTiming-t.lastSample.TotalMetricsTiming), t.tagsByType[timing]) + telemetryCount("datadog.dogstatsd.client.events", int64(tlm.TotalEvents-t.lastSample.TotalEvents), t.tags) + telemetryCount("datadog.dogstatsd.client.service_checks", int64(tlm.TotalServiceChecks-t.lastSample.TotalServiceChecks), t.tags) + + telemetryCount("datadog.dogstatsd.client.metric_dropped_on_receive", int64(tlm.TotalDroppedOnReceive-t.lastSample.TotalDroppedOnReceive), t.tags) + + telemetryCount("datadog.dogstatsd.client.packets_sent", int64(tlm.TotalPayloadsSent-t.lastSample.TotalPayloadsSent), t.tags) + telemetryCount("datadog.dogstatsd.client.packets_dropped", int64(tlm.TotalPayloadsDropped-t.lastSample.TotalPayloadsDropped), t.tags) + telemetryCount("datadog.dogstatsd.client.packets_dropped_queue", int64(tlm.TotalPayloadsDroppedQueueFull-t.lastSample.TotalPayloadsDroppedQueueFull), t.tags) + telemetryCount("datadog.dogstatsd.client.packets_dropped_writer", int64(tlm.TotalPayloadsDroppedWriter-t.lastSample.TotalPayloadsDroppedWriter), t.tags) + + telemetryCount("datadog.dogstatsd.client.bytes_dropped", int64(tlm.TotalBytesDropped-t.lastSample.TotalBytesDropped), t.tags) + telemetryCount("datadog.dogstatsd.client.bytes_sent", int64(tlm.TotalBytesSent-t.lastSample.TotalBytesSent), t.tags) + telemetryCount("datadog.dogstatsd.client.bytes_dropped_queue", int64(tlm.TotalBytesDroppedQueueFull-t.lastSample.TotalBytesDroppedQueueFull), t.tags) + telemetryCount("datadog.dogstatsd.client.bytes_dropped_writer", int64(tlm.TotalBytesDroppedWriter-t.lastSample.TotalBytesDroppedWriter), t.tags) + + if t.aggEnabled { + telemetryCount("datadog.dogstatsd.client.aggregated_context", int64(tlm.AggregationNbContext-t.lastSample.AggregationNbContext), t.tags) + telemetryCount("datadog.dogstatsd.client.aggregated_context_by_type", int64(tlm.AggregationNbContextGauge-t.lastSample.AggregationNbContextGauge), t.tagsByType[gauge]) + telemetryCount("datadog.dogstatsd.client.aggregated_context_by_type", int64(tlm.AggregationNbContextSet-t.lastSample.AggregationNbContextSet), t.tagsByType[set]) + telemetryCount("datadog.dogstatsd.client.aggregated_context_by_type", int64(tlm.AggregationNbContextCount-t.lastSample.AggregationNbContextCount), t.tagsByType[count]) + telemetryCount("datadog.dogstatsd.client.aggregated_context_by_type", int64(tlm.AggregationNbContextHistogram-t.lastSample.AggregationNbContextHistogram), t.tagsByType[histogram]) + telemetryCount("datadog.dogstatsd.client.aggregated_context_by_type", int64(tlm.AggregationNbContextDistribution-t.lastSample.AggregationNbContextDistribution), t.tagsByType[distribution]) + telemetryCount("datadog.dogstatsd.client.aggregated_context_by_type", int64(tlm.AggregationNbContextTiming-t.lastSample.AggregationNbContextTiming), t.tagsByType[timing]) + } + + t.lastSample = tlm + + return m +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/udp.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/udp.go new file mode 100644 index 00000000..e2922a91 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/udp.go @@ -0,0 +1,34 @@ +package statsd + +import ( + "net" + "time" +) + +// udpWriter is an internal class wrapping around management of UDP connection +type udpWriter struct { + conn net.Conn +} + +// New returns a pointer to a new udpWriter given an addr in the format "hostname:port". +func newUDPWriter(addr string, _ time.Duration) (*udpWriter, error) { + udpAddr, err := net.ResolveUDPAddr("udp", addr) + if err != nil { + return nil, err + } + conn, err := net.DialUDP("udp", nil, udpAddr) + if err != nil { + return nil, err + } + writer := &udpWriter{conn: conn} + return writer, nil +} + +// Write data to the UDP connection with no error handling +func (w *udpWriter) Write(data []byte) (int, error) { + return w.conn.Write(data) +} + +func (w *udpWriter) Close() error { + return w.conn.Close() +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/uds.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/uds.go new file mode 100644 index 00000000..fa5f5917 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/uds.go @@ -0,0 +1,88 @@ +// +build !windows + +package statsd + +import ( + "net" + "sync" + "time" +) + +// udsWriter is an internal class wrapping around management of UDS connection +type udsWriter struct { + // Address to send metrics to, needed to allow reconnection on error + addr net.Addr + // Established connection object, or nil if not connected yet + conn net.Conn + // write timeout + writeTimeout time.Duration + sync.RWMutex // used to lock conn / writer can replace it +} + +// newUDSWriter returns a pointer to a new udsWriter given a socket file path as addr. +func newUDSWriter(addr string, writeTimeout time.Duration) (*udsWriter, error) { + udsAddr, err := net.ResolveUnixAddr("unixgram", addr) + if err != nil { + return nil, err + } + // Defer connection to first Write + writer := &udsWriter{addr: udsAddr, conn: nil, writeTimeout: writeTimeout} + return writer, nil +} + +// Write data to the UDS connection with write timeout and minimal error handling: +// create the connection if nil, and destroy it if the statsd server has disconnected +func (w *udsWriter) Write(data []byte) (int, error) { + conn, err := w.ensureConnection() + if err != nil { + return 0, err + } + + conn.SetWriteDeadline(time.Now().Add(w.writeTimeout)) + n, e := conn.Write(data) + + if err, isNetworkErr := e.(net.Error); err != nil && (!isNetworkErr || !err.Temporary()) { + // Statsd server disconnected, retry connecting at next packet + w.unsetConnection() + return 0, e + } + return n, e +} + +func (w *udsWriter) Close() error { + if w.conn != nil { + return w.conn.Close() + } + return nil +} + +func (w *udsWriter) ensureConnection() (net.Conn, error) { + // Check if we've already got a socket we can use + w.RLock() + currentConn := w.conn + w.RUnlock() + + if currentConn != nil { + return currentConn, nil + } + + // Looks like we might need to connect - try again with write locking. + w.Lock() + defer w.Unlock() + if w.conn != nil { + return w.conn, nil + } + + newConn, err := net.Dial(w.addr.Network(), w.addr.String()) + if err != nil { + return nil, err + } + w.conn = newConn + return newConn, nil +} + +func (w *udsWriter) unsetConnection() { + w.Lock() + defer w.Unlock() + w.conn = nil +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/uds_windows.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/uds_windows.go new file mode 100644 index 00000000..077894a3 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/uds_windows.go @@ -0,0 +1,14 @@ +// +build windows + +package statsd + +import ( + "fmt" + "io" + "time" +) + +// newUDSWriter is disabled on Windows as Unix sockets are not available. +func newUDSWriter(_ string, _ time.Duration) (io.WriteCloser, error) { + return nil, fmt.Errorf("Unix socket is not available on Windows") +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/utils.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/utils.go new file mode 100644 index 00000000..8c3ac842 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/utils.go @@ -0,0 +1,32 @@ +package statsd + +import ( + "math/rand" + "sync" +) + +func shouldSample(rate float64, r *rand.Rand, lock *sync.Mutex) bool { + if rate >= 1 { + return true + } + // sources created by rand.NewSource() (ie. w.random) are not thread safe. + // TODO: use defer once the lowest Go version we support is 1.14 (defer + // has an overhead before that). + lock.Lock() + if r.Float64() > rate { + lock.Unlock() + return false + } + lock.Unlock() + return true +} + +func copySlice(src []string) []string { + if src == nil { + return nil + } + + c := make([]string, len(src)) + copy(c, src) + return c +} diff --git a/vendor/github.com/DataDog/datadog-go/v5/statsd/worker.go b/vendor/github.com/DataDog/datadog-go/v5/statsd/worker.go new file mode 100644 index 00000000..952a9fe3 --- /dev/null +++ b/vendor/github.com/DataDog/datadog-go/v5/statsd/worker.go @@ -0,0 +1,150 @@ +package statsd + +import ( + "math/rand" + "sync" + "time" +) + +type worker struct { + pool *bufferPool + buffer *statsdBuffer + sender *sender + random *rand.Rand + randomLock sync.Mutex + sync.Mutex + + inputMetrics chan metric + stop chan struct{} +} + +func newWorker(pool *bufferPool, sender *sender) *worker { + // Each worker uses its own random source and random lock to prevent + // workers in separate goroutines from contending for the lock on the + // "math/rand" package-global random source (e.g. calls like + // "rand.Float64()" must acquire a shared lock to get the next + // pseudorandom number). + // Note that calling "time.Now().UnixNano()" repeatedly quickly may return + // very similar values. That's fine for seeding the worker-specific random + // source because we just need an evenly distributed stream of float values. + // Do not use this random source for cryptographic randomness. + random := rand.New(rand.NewSource(time.Now().UnixNano())) + return &worker{ + pool: pool, + sender: sender, + buffer: pool.borrowBuffer(), + random: random, + stop: make(chan struct{}), + } +} + +func (w *worker) startReceivingMetric(bufferSize int) { + w.inputMetrics = make(chan metric, bufferSize) + go w.pullMetric() +} + +func (w *worker) stopReceivingMetric() { + w.stop <- struct{}{} +} + +func (w *worker) pullMetric() { + for { + select { + case m := <-w.inputMetrics: + w.processMetric(m) + case <-w.stop: + return + } + } +} + +func (w *worker) processMetric(m metric) error { + if !shouldSample(m.rate, w.random, &w.randomLock) { + return nil + } + w.Lock() + var err error + if err = w.writeMetricUnsafe(m); err == errBufferFull { + w.flushUnsafe() + err = w.writeMetricUnsafe(m) + } + w.Unlock() + return err +} + +func (w *worker) writeAggregatedMetricUnsafe(m metric, metricSymbol []byte, precision int) error { + globalPos := 0 + + // first check how much data we can write to the buffer: + // +3 + len(metricSymbol) because the message will include '||#' before the tags + // +1 for the potential line break at the start of the metric + tagsSize := len(m.stags) + 4 + len(metricSymbol) + for _, t := range m.globalTags { + tagsSize += len(t) + 1 + } + + for { + pos, err := w.buffer.writeAggregated(metricSymbol, m.namespace, m.globalTags, m.name, m.fvalues[globalPos:], m.stags, tagsSize, precision) + if err == errPartialWrite { + // We successfully wrote part of the histogram metrics. + // We flush the current buffer and finish the histogram + // in a new one. + w.flushUnsafe() + globalPos += pos + } else { + return err + } + } +} + +func (w *worker) writeMetricUnsafe(m metric) error { + switch m.metricType { + case gauge: + return w.buffer.writeGauge(m.namespace, m.globalTags, m.name, m.fvalue, m.tags, m.rate, m.timestamp) + case count: + return w.buffer.writeCount(m.namespace, m.globalTags, m.name, m.ivalue, m.tags, m.rate, m.timestamp) + case histogram: + return w.buffer.writeHistogram(m.namespace, m.globalTags, m.name, m.fvalue, m.tags, m.rate) + case distribution: + return w.buffer.writeDistribution(m.namespace, m.globalTags, m.name, m.fvalue, m.tags, m.rate) + case set: + return w.buffer.writeSet(m.namespace, m.globalTags, m.name, m.svalue, m.tags, m.rate) + case timing: + return w.buffer.writeTiming(m.namespace, m.globalTags, m.name, m.fvalue, m.tags, m.rate) + case event: + return w.buffer.writeEvent(m.evalue, m.globalTags) + case serviceCheck: + return w.buffer.writeServiceCheck(m.scvalue, m.globalTags) + case histogramAggregated: + return w.writeAggregatedMetricUnsafe(m, histogramSymbol, -1) + case distributionAggregated: + return w.writeAggregatedMetricUnsafe(m, distributionSymbol, -1) + case timingAggregated: + return w.writeAggregatedMetricUnsafe(m, timingSymbol, 6) + default: + return nil + } +} + +func (w *worker) flush() { + w.Lock() + w.flushUnsafe() + w.Unlock() +} + +func (w *worker) pause() { + w.Lock() +} + +func (w *worker) unpause() { + w.Unlock() +} + +// flush the current buffer. Lock must be held by caller. +// flushed buffer written to the network asynchronously. +func (w *worker) flushUnsafe() { + if len(w.buffer.bytes()) > 0 { + w.sender.send(w.buffer) + w.buffer = w.pool.borrowBuffer() + } +} diff --git a/vendor/github.com/DataDog/go-libddwaf/.gitattributes b/vendor/github.com/DataDog/go-libddwaf/.gitattributes new file mode 100644 index 00000000..003a8007 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/.gitattributes @@ -0,0 +1,3 @@ +*.dylib -diff +*.so -diff +*.a -diff diff --git a/vendor/github.com/DataDog/go-libddwaf/.gitignore b/vendor/github.com/DataDog/go-libddwaf/.gitignore new file mode 100644 index 00000000..95311a66 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/.gitignore @@ -0,0 +1,15 @@ +# Binaries for programs and plugins +*.exe +*.exe~ + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +.vscode/ +.idea/ diff --git a/vendor/github.com/DataDog/go-libddwaf/LICENSE b/vendor/github.com/DataDog/go-libddwaf/LICENSE new file mode 100644 index 00000000..9301dd7a --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/LICENSE @@ -0,0 +1,200 @@ + 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 2016-present Datadog, Inc. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/DataDog/go-libddwaf/README.md b/vendor/github.com/DataDog/go-libddwaf/README.md new file mode 100644 index 00000000..84cb1f89 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/README.md @@ -0,0 +1,120 @@ +# go-libddwaf + +This project's goal is to produce a higher level API for the go bindings to [libddwaf](https://github.com/DataDog/libddwaf): DataDog in-app WAF. +It consists of 2 separate entities: the bindings for the calls to libddwaf, and the encoder whose job is to convert _any_ go value to its libddwaf object representation. + +An example usage would be: + +```go +import waf "github.com/DataDog/go-libddwaf" + +//go:embed +var ruleset []byte + +func main() { + var parsedRuleset any + + if err := json.Unmarshal(ruleset, &parsedRuleset); err != nil { + return 1 + } + + wafHandle, err := waf.NewHandle(parsedRuleset, "", "") + if err != nil { + return 1 + } + + defer wafHandle.Close() + + wafCtx := wafHandle.NewContext() + defer wafCtx.Close() + + matches, actions := wafCtx.Run(map[string]any{ + "server.request.path_params": "/rfiinc.txt", + }, time.Minute) +} +``` + +The API documentation details can be found on [pkg.go.dev](https://pkg.go.dev/github.com/DataDog/go-libddwaf). + +Originally this project was only here to provide CGO Wrappers to the calls to libddwaf. +But with the appearance of `ddwaf_object` tree like structure, +but also with the intention to build CGO-less bindings, this project size has grown to be a fully integrated brick in the DataDog tracer structure. +Which in turn made it necessary to document the project, to maintain it in an orderly fashion. + +## Design + +The WAF bindings have multiple moving parts that are necessary to understand: + +- Handle: a object wrapper over the pointer to the C WAF Handle +- Context: a object wrapper over a pointer to the C WAF Context +- Encoder: whose goal is to construct a tree of Waf Objects to send to the WAF +- Allocator: Does all writing and allocation operations for the construction of Waf Objects +- Decoder: Transforms Waf Objects returned from the WAF to usual go objects (e.g. maps, arrays, ...) +- Library: The library which wraps all calls to C code + +```mermaid +flowchart LR + + START:::hidden -->|NewHandle| Handle -->|NewContext| Context + + Context -->|Encode Inputs| Encoder + + Handle -->|Encode Ruleset| Encoder + Handle -->|Init WAF| Library + Context -->|Decode Result| Decoder + + Handle -->|Decode Init Errors| Decoder + + Context -->|Run| Library + Context -->|Store Go References| ContextAllocator + + Encoder -->|Allocate Waf Objects| EncoderAllocator + + EncoderAllocator -->|Copy after each encoding| ContextAllocator + + Library -->|Call C code| libddwaf + + classDef hidden display: none; +``` + +### Allocator + +The cgoRefPool is a pure Go cgoRefPool of `ddwaf_object` C values on the Go memory heap. +the `cgoRefPool` go type is a way to make sure we can safely send go allocated data to the C side of the WAF +The main issue is the following: the `wafObject` uses a C union to store the tree structure of the full object, +union equivalent in go are interfaces and they are not compatible with C unions. The only way to be 100% sure +that the Go `wafObject` struct has the same layout as the C one is to only use primitive types. So the only way to +store a raw pointer is to use the `uintptr` type. But since `uintptr` do not have pointer semantics (and are just +basically integers), we need another structure to store the value as Go pointer because the GC is lurking. That's +where the `cgoRefPool` object comes into play: all new `wafObject` elements are created via this API whose especially +built to make sure there is no gap for the Garbage Collector to exploit. From there, since underlying values of the +`wafObject` are either arrays (for maps, structs and arrays) or string (for all ints, booleans and strings), +we can store 2 slices of arrays and use `runtime.KeepAlive` in each code path to protect them from the GC. + +### Typical call to Run() + +Here is an example of the flow of operations on a simple call to Run(): + +- Encode input data into Waf Objects +- Lock the context mutex until the end of the call +- Call `ddwaf_run` +- Decode the matches and actions + +### CGO-less C Bindings + +The main component used to build C bindings without using CGO is called [purego](https://github.com/ebitengine/purego). The flow of execution on our side is to embed the C shared library using `go:embed`. Then to dump it into a file, load it using `dlopen` and to load the symbols using `dlsym`. And finally to call them. + +⚠️ Keep in mind that **purego only works on linux/darwin for amd64/arm64 and so does go-libddwaf.** + +Another requirement of `libddwaf` is to have a FHS filesystem on your machine and, for linux, to provide `libc.so.6`, `libpthread.so.0` and `libm.so.6`, `libdl.so.2` as dynamic libraries. + +## Contributing usual pitfalls + +- Cannot dlopen twice in the app lifetime on OSX +- `runtime.KeepAlive()` calls are here to prevent the GC from destroying objects too early +- Since there is a stack switch between the go code and the C code, usually the only C stacktrace you will ever get is from gdb +- If a segfault happens during a call to the C code, the goroutine stacktrace which has done the call is the one annotated with `[syscall]`. +- [GoLand](https://www.jetbrains.com/go/) does not support `CGO_ENABLED=0` (as of June 2023) +- Keep in mind that we fully escape the type system. If you send the wrong data it will segfaults in the best cases but not always! +- The structs in `ctypes.go` are here to reproduce the memory layout of the structs in `include/ddwaf.h` because pointer to these structs will be passed directly. +- Do not use `uintptr` as function arguments or results types, coming from `unsafe.Pointer` casts of Go values, because they escape the pointer analysis which can create wrongly optimized code and crash. Pointer arithmetic is of course necessary in such a library but must be kept in the same function scope. diff --git a/vendor/github.com/DataDog/go-libddwaf/cgo_ref_pool.go b/vendor/github.com/DataDog/go-libddwaf/cgo_ref_pool.go new file mode 100644 index 00000000..fccd41c9 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/cgo_ref_pool.go @@ -0,0 +1,90 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package waf + +import ( + "strconv" +) + +// cgoRefPool is a way to make sure we can safely send go allocated data on the C side of the WAF +// The main issue is the following: the wafObject uses a C union to store the tree structure of the full object, +// union equivalent in go are interfaces and they are not compatible with C unions. The only way to be 100% sure +// that the Go wafObject struct have the same layout as the C one is to only use primitive types. So the only way to +// store a raw pointer is to use the uintptr type. But since uintptr do not have pointer semantics (and are just +// basically integers), we need another structure to store the value as Go pointer because the GC is lurking. That's +// where the cgoRefPool object comes into play: All new wafObject elements are created via this API whose especially +// built to make sure there is no gap for the Garbage Collector to exploit. From there, since underlying values of the +// wafObject are either arrays (for maps, structs and arrays) or string (for all ints, booleans and strings), +// we can store 2 slices of arrays and use runtime.KeepAlive in each code path to protect them from the GC. +type cgoRefPool struct { + stringRefs [][]byte + arrayRefs [][]wafObject +} + +func (refPool *cgoRefPool) append(newRefs cgoRefPool) { + refPool.stringRefs = append(refPool.stringRefs, newRefs.stringRefs...) + refPool.arrayRefs = append(refPool.arrayRefs, newRefs.arrayRefs...) +} + +func (refPool *cgoRefPool) AllocCString(str string) uintptr { + goArray := make([]byte, len(str)+1) + copy(goArray, str) + refPool.stringRefs = append(refPool.stringRefs, goArray) + goArray[len(str)] = 0 // Null termination byte for C strings + + return sliceToUintptr(goArray) +} + +func (refPool *cgoRefPool) AllocWafString(obj *wafObject, str string) { + obj._type = wafStringType + + if len(str) == 0 { + obj.nbEntries = 0 + obj.value = 0 + return + } + + goArray := make([]byte, len(str)) + copy(goArray, str) + refPool.stringRefs = append(refPool.stringRefs, goArray) + + obj.value = sliceToUintptr(goArray) + obj.nbEntries = uint64(len(goArray)) +} + +func (refPool *cgoRefPool) AllocWafArray(obj *wafObject, typ wafObjectType, size uint64) []wafObject { + if typ != wafMapType && typ != wafArrayType { + panic("Cannot allocate this waf object data type as an array: " + strconv.Itoa(int(typ))) + } + + obj._type = typ + obj.nbEntries = size + + // If the array size is zero no need to allocate anything + if size == 0 { + obj.value = 0 + return nil + } + + goArray := make([]wafObject, size) + refPool.arrayRefs = append(refPool.arrayRefs, goArray) + + obj.value = sliceToUintptr(goArray) + return goArray +} + +func (refPool *cgoRefPool) AllocWafMapKey(obj *wafObject, str string) { + if len(str) == 0 { + return + } + + goArray := make([]byte, len(str)) + copy(goArray, str) + refPool.stringRefs = append(refPool.stringRefs, goArray) + + obj.parameterName = sliceToUintptr(goArray) + obj.parameterNameLength = uint64(len(goArray)) +} diff --git a/vendor/github.com/DataDog/go-libddwaf/context.go b/vendor/github.com/DataDog/go-libddwaf/context.go new file mode 100644 index 00000000..8fc632d1 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/context.go @@ -0,0 +1,155 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package waf + +import ( + "sync" + "time" + + "go.uber.org/atomic" +) + +// Context is a WAF execution context. It allows running the WAF incrementally +// when calling it multiple times to run its rules every time new addresses +// become available. Each request must have its own Context. +type Context struct { + // Instance of the WAF + handle *Handle + cContext wafContext + // cgoRefs is used to retain go references to WafObjects until the context is destroyed. + // As per libddwaf documentation, WAF Objects must be alive during all the context lifetime + cgoRefs cgoRefPool + // Mutex protecting the use of cContext which is not thread-safe and cgoRefs. + mutex sync.Mutex + + // Stats + // Cumulated internal WAF run time - in nanoseconds - for this context. + totalRuntimeNs atomic.Uint64 + // Cumulated overall run time - in nanoseconds - for this context. + totalOverallRuntimeNs atomic.Uint64 + // Cumulated timeout count for this context. + timeoutCount atomic.Uint64 +} + +// NewContext returns a new WAF context of to the given WAF handle. +// A nil value is returned when the WAF handle was released or when the +// WAF context couldn't be created. +// handle. A nil value is returned when the WAF handle can no longer be used +// or the WAF context couldn't be created. +func NewContext(handle *Handle) *Context { + // Handle has been released + if handle.addRefCounter(1) == 0 { + return nil + } + + cContext := wafLib.wafContextInit(handle.cHandle) + if cContext == 0 { + handle.addRefCounter(-1) + return nil + } + + return &Context{handle: handle, cContext: cContext} +} + +// Run encodes the given addressesToData values and runs them against the WAF rules within the given +// timeout value. It returns the matches as a JSON string (usually opaquely used) along with the corresponding +// actions in any. In case of an error, matches and actions can still be returned, for instance in the case of a +// timeout error. Errors can be tested against the RunError type. +func (context *Context) Run(addressesToData map[string]any, timeout time.Duration) (matches []byte, actions []string, err error) { + if len(addressesToData) == 0 { + return + } + + now := time.Now() + defer func() { + dt := time.Since(now) + context.totalOverallRuntimeNs.Add(uint64(dt.Nanoseconds())) + }() + + encoder := encoder{ + stringMaxSize: wafMaxStringLength, + containerMaxSize: wafMaxContainerSize, + objectMaxDepth: wafMaxContainerDepth, + } + obj, err := encoder.Encode(addressesToData) + if err != nil { + return nil, nil, err + } + + // ddwaf_run cannot run concurrently and the next append write on the context state so we need a mutex + context.mutex.Lock() + defer context.mutex.Unlock() + + // Save the Go pointer references to addressesToData that were referenced by the encoder + // into C ddwaf_objects. libddwaf's API requires to keep this data for the lifetime of the ddwaf_context. + defer context.cgoRefs.append(encoder.cgoRefs) + + return context.run(obj, timeout, &encoder.cgoRefs) +} + +func (context *Context) run(obj *wafObject, timeout time.Duration, cgoRefs *cgoRefPool) ([]byte, []string, error) { + // RLock the handle to safely get read access to the WAF handle and prevent concurrent changes of it + // such as a rules-data update. + context.handle.mutex.RLock() + defer context.handle.mutex.RUnlock() + + result := new(wafResult) + defer wafLib.wafResultFree(result) + + ret := wafLib.wafRun(context.cContext, obj, result, uint64(timeout/time.Microsecond)) + + context.totalRuntimeNs.Add(result.total_runtime) + matches, actions, err := unwrapWafResult(ret, result) + if err == ErrTimeout { + context.timeoutCount.Inc() + } + + return matches, actions, err +} + +func unwrapWafResult(ret wafReturnCode, result *wafResult) (matches []byte, actions []string, err error) { + if result.timeout > 0 { + err = ErrTimeout + } + + if ret == wafOK { + return nil, nil, err + } + + if ret != wafMatch { + return nil, nil, goRunError(ret) + } + + if result.data != 0 { + matches = []byte(gostring(cast[byte](result.data))) + } + + if size := result.actions.size; size > 0 { + actions = decodeActions(result.actions.array, uint64(size)) + } + + return matches, actions, err +} + +// Close calls handle.closeContext which calls ddwaf_context_destroy and maybe also close the handle if it in termination state. +func (context *Context) Close() { + defer context.handle.closeContext(context) + // Keep the Go pointer references until the end of the context + keepAlive(context.cgoRefs) + // The context is no longer used so we can try releasing the Go pointer references asap by nulling them + context.cgoRefs = cgoRefPool{} +} + +// TotalRuntime returns the cumulated WAF runtime across various run calls within the same WAF context. +// Returned time is in nanoseconds. +func (context *Context) TotalRuntime() (overallRuntimeNs, internalRuntimeNs uint64) { + return context.totalOverallRuntimeNs.Load(), context.totalRuntimeNs.Load() +} + +// TotalTimeouts returns the cumulated amount of WAF timeouts across various run calls within the same WAF context. +func (context *Context) TotalTimeouts() uint64 { + return context.timeoutCount.Load() +} diff --git a/vendor/github.com/DataDog/go-libddwaf/ctypes.go b/vendor/github.com/DataDog/go-libddwaf/ctypes.go new file mode 100644 index 00000000..f5ab1ea2 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/ctypes.go @@ -0,0 +1,176 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package waf + +import ( + "reflect" + "unsafe" +) + +const ( + wafMaxStringLength = 4096 + wafMaxContainerDepth = 20 + wafMaxContainerSize = 256 + wafRunTimeout = 5000 +) + +type wafReturnCode int32 + +const ( + wafErrInternal wafReturnCode = -3 + wafErrInvalidObject = -2 + wafErrInvalidArgument = -1 + wafOK = 0 + wafMatch = 1 +) + +// wafObjectType is an enum in C which has the size of DWORD. +// But DWORD is 4 bytes in amd64 and arm64 so uint32 it is. +type wafObjectType uint32 + +const ( + wafInvalidType wafObjectType = 0 + wafIntType = 1 << 0 + wafUintType = 1 << 1 + wafStringType = 1 << 2 + wafArrayType = 1 << 3 + wafMapType = 1 << 4 +) + +type wafObject struct { + parameterName uintptr + parameterNameLength uint64 + value uintptr + nbEntries uint64 + _type wafObjectType + _ [4]byte + // Forced padding + // We only support 2 archs and cgo generated the same padding to both. + // We don't want the C struct to be packed because actually go will do the same padding itself, + // we just add it explicitly to not take any chance. + // And we cannot pack a struct in go so it will get tricky if the struct is + // packed (apart from breaking all tracers of course) +} + +type wafConfig struct { + limits wafConfigLimits + obfuscator wafConfigObfuscator + freeFn uintptr +} + +type wafConfigLimits struct { + maxContainerSize uint32 + maxContainerDepth uint32 + maxStringLength uint32 +} + +type wafConfigObfuscator struct { + keyRegex uintptr // char * + valueRegex uintptr // char * +} + +type wafResult struct { + timeout byte + data uintptr + actions wafResultActions + total_runtime uint64 +} + +type wafResultActions struct { + array uintptr // char ** + size uint32 + _ [4]byte // Forced padding +} + +type wafRulesetInfo struct { + loaded uint16 + failed uint16 + errors wafObject + version uintptr // char * +} + +// wafHandle is a forward declaration in ddwaf.h header +// We basically don't need to modify it, only to give it to the waf +type wafHandle uintptr + +// wafContext is a forward declaration in ddwaf.h header +// We basically don't need to modify it, only to give it to the waf +type wafContext uintptr + +// gostring copies a char* to a Go string. +func gostring(ptr *byte) string { + if ptr == nil { + return "" + } + var length int + for { + if *(*byte)(unsafe.Add(unsafe.Pointer(ptr), uintptr(length))) == '\x00' { + break + } + length++ + } + //string builtin copies the slice + return string(unsafe.Slice(ptr, length)) +} + +func gostringSized(ptr *byte, size uint64) string { + if ptr == nil { + return "" + } + return string(unsafe.Slice(ptr, size)) +} + +// cstring converts a go string to *byte that can be passed to C code. +func cstring(name string) *byte { + var b = make([]byte, len(name)+1) + copy(b, name) + return &b[0] +} + +// cast is used to centralize unsafe use C of allocated pointer. +// We take the address and then dereference it to trick go vet from creating a possible misuse of unsafe.Pointer +func cast[T any](ptr uintptr) *T { + return (*T)(*(*unsafe.Pointer)(unsafe.Pointer(&ptr))) +} + +// castWithOffset is the same as cast but adding an offset to the pointer by a multiple of the size +// of the type pointed. +func castWithOffset[T any](ptr uintptr, offset uint64) *T { + return (*T)(unsafe.Add(*(*unsafe.Pointer)(unsafe.Pointer(&ptr)), offset*uint64(unsafe.Sizeof(*new(T))))) +} + +// ptrToUintptr is a helper to centralize of usage of unsafe.Pointer +// do not use this function to cast interfaces +func ptrToUintptr[T any](arg *T) uintptr { + return uintptr(unsafe.Pointer(arg)) +} + +func sliceToUintptr[T any](arg []T) uintptr { + return (*reflect.SliceHeader)(unsafe.Pointer(&arg)).Data +} + +func stringToUintptr(arg string) uintptr { + return (*reflect.StringHeader)(unsafe.Pointer(&arg)).Data +} + +// keepAlive() globals +var ( + alwaysFalse bool + escapeSink any +) + +// keepAlive is a copy of runtime.KeepAlive +// keepAlive has 2 usages: +// - It forces the deallocation of the memory to take place later than expected (just like runtime.KeepAlive) +// - It forces the given argument x to be escaped on the heap by saving it into a global value (Go doesn't provide a standard way to do it as of today) +// It is implemented so that the compiler cannot optimize it. +// +//go:noinline +func keepAlive[T any](x T) { + if alwaysFalse { + escapeSink = x + } +} diff --git a/vendor/github.com/DataDog/go-libddwaf/decoder.go b/vendor/github.com/DataDog/go-libddwaf/decoder.go new file mode 100644 index 00000000..b8770253 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/decoder.go @@ -0,0 +1,73 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package waf + +// decodeErrors transforms the wafObject received by the wafRulesetInfo after the call to wafDl.wafInit to a map where +// keys are the error message and the value is a array of all the rule ids which triggered this specific error +func decodeErrors(obj *wafObject) (map[string][]string, error) { + if obj._type != wafMapType { + return nil, errInvalidObjectType + } + + if obj.value == 0 && obj.nbEntries > 0 { + return nil, errNilObjectPtr + } + + wafErrors := map[string][]string{} + for i := uint64(0); i < obj.nbEntries; i++ { + objElem := castWithOffset[wafObject](obj.value, i) + if objElem._type != wafArrayType { + return nil, errInvalidObjectType + } + + errorMessage := gostringSized(cast[byte](objElem.parameterName), objElem.parameterNameLength) + ruleIds, err := decodeRuleIdArray(objElem) + if err != nil { + return nil, err + } + + wafErrors[errorMessage] = ruleIds + } + + return wafErrors, nil +} + +func decodeRuleIdArray(obj *wafObject) ([]string, error) { + if obj._type != wafArrayType { + return nil, errInvalidObjectType + } + + if obj.value == 0 && obj.nbEntries > 0 { + return nil, errNilObjectPtr + } + + var ruleIds []string + for i := uint64(0); i < obj.nbEntries; i++ { + objElem := castWithOffset[wafObject](obj.value, i) + if objElem._type != wafStringType { + return nil, errInvalidObjectType + } + + ruleIds = append(ruleIds, gostringSized(cast[byte](objElem.value), objElem.nbEntries)) + } + + return ruleIds, nil +} + +func decodeActions(cActions uintptr, size uint64) []string { + if size == 0 { + return nil + } + + actions := make([]string, size) + for i := uint64(0); i < size; i++ { + // This line does the following operation without casts: + // gostring(*(cActions + i * sizeof(ptr))) + actions[i] = gostring(*castWithOffset[*byte](cActions, i)) + } + + return actions +} diff --git a/vendor/github.com/DataDog/go-libddwaf/embed_darwin_amd64.go b/vendor/github.com/DataDog/go-libddwaf/embed_darwin_amd64.go new file mode 100644 index 00000000..952d4130 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/embed_darwin_amd64.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +//go:build darwin && amd64 && !go1.21 + +package waf + +import _ "embed" // Needed for go:embed + +//go:embed lib/darwin-amd64/_libddwaf.dylib +var libddwaf []byte diff --git a/vendor/github.com/DataDog/go-libddwaf/embed_darwin_arm64.go b/vendor/github.com/DataDog/go-libddwaf/embed_darwin_arm64.go new file mode 100644 index 00000000..0a3bc72a --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/embed_darwin_arm64.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +//go:build darwin && arm64 && !go1.21 + +package waf + +import _ "embed" // Needed for go:embed + +//go:embed lib/darwin-arm64/_libddwaf.dylib +var libddwaf []byte diff --git a/vendor/github.com/DataDog/go-libddwaf/embed_linux_amd64.go b/vendor/github.com/DataDog/go-libddwaf/embed_linux_amd64.go new file mode 100644 index 00000000..55d6693b --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/embed_linux_amd64.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +//go:build linux && amd64 && !go1.21 + +package waf + +import _ "embed" // Needed for go:embed + +//go:embed lib/linux-amd64/libddwaf.so +var libddwaf []byte diff --git a/vendor/github.com/DataDog/go-libddwaf/embed_linux_arm64.go b/vendor/github.com/DataDog/go-libddwaf/embed_linux_arm64.go new file mode 100644 index 00000000..fe55f81e --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/embed_linux_arm64.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +//go:build linux && arm64 && !go1.21 + +package waf + +import _ "embed" // Needed for go:embed + +//go:embed lib/linux-arm64/libddwaf.so +var libddwaf []byte diff --git a/vendor/github.com/DataDog/go-libddwaf/encoder.go b/vendor/github.com/DataDog/go-libddwaf/encoder.go new file mode 100644 index 00000000..153c1245 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/encoder.go @@ -0,0 +1,256 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package waf + +import ( + "math" + "reflect" + "strconv" + "strings" + "unicode" +) + +// Encode Go values into wafObjects. Only the subset of Go types representable into wafObjects +// will be encoded while ignoring the rest of it. +// The encoder allocates the memory required for new wafObjects into the Go memory, which must be kept +// referenced for their lifetime in the C world. This lifetime depends on the ddwaf function being used with. +// the encoded result. The Go references of the allocated wafObjects, along with every Go pointer they may +// reference now or in the future, are stored and referenced in the `cgoRefs` field. The user MUST leverage +// `keepAlive()` with it according to its ddwaf use-case. +type encoder struct { + containerMaxSize int + stringMaxSize int + objectMaxDepth int + cgoRefs cgoRefPool +} + +func newMaxEncoder() *encoder { + return &encoder{ + containerMaxSize: math.MaxInt, + stringMaxSize: math.MaxInt, + objectMaxDepth: math.MaxInt, + } +} + +func (encoder *encoder) Encode(data any) (*wafObject, error) { + value := reflect.ValueOf(data) + wo := &wafObject{} + + if err := encoder.encode(value, wo, encoder.objectMaxDepth); err != nil { + return nil, err + } + + return wo, nil +} + +func (encoder *encoder) encode(value reflect.Value, obj *wafObject, depth int) error { + switch kind := value.Kind(); { + // Terminal cases (leafs of the tree) + case kind == reflect.Invalid: + return errUnsupportedValue + + // Booleans + case kind == reflect.Bool && value.Bool(): // true + return encoder.encodeString("true", wafStringType, obj) + case kind == reflect.Bool && !value.Bool(): // false + return encoder.encodeString("false", wafStringType, obj) + + // Numbers + case value.CanInt(): // any int type or alias + return encoder.encodeString(strconv.FormatInt(value.Int(), 10), wafStringType, obj) + case value.CanUint(): // any Uint type or alias + return encoder.encodeString(strconv.FormatUint(value.Uint(), 10), wafStringType, obj) + case value.CanFloat(): // any float type or alias + return encoder.encodeString(strconv.FormatInt(int64(math.Round(value.Float())), 10), wafStringType, obj) + + // Strings + case kind == reflect.String: // string type + return encoder.encodeString(value.String(), wafStringType, obj) + case value.Type() == reflect.TypeOf([]byte(nil)): // byte array -> string + return encoder.encodeString(string(value.Bytes()), wafStringType, obj) + + // Recursive cases (internal nodes of the tree) + case kind == reflect.Interface || kind == reflect.Pointer: // Pointer and interfaces are not taken into account + return encoder.encode(value.Elem(), obj, depth) + case kind == reflect.Array || kind == reflect.Slice: // either an array or a slice of an array + return encoder.encodeArray(value, obj, depth) + case kind == reflect.Map: + return encoder.encodeMap(value, obj, depth) + case kind == reflect.Struct: + return encoder.encodeStruct(value, obj, depth) + + default: + return errUnsupportedValue + } +} + +func (encoder *encoder) encodeString(str string, typ wafObjectType, obj *wafObject) error { + if len(str) > encoder.stringMaxSize { + str = str[:encoder.stringMaxSize] + } + + encoder.cgoRefs.AllocWafString(obj, str) + return nil +} + +func getFieldNameFromType(field reflect.StructField) (string, bool) { + fieldName := field.Name + + // Private and synthetics fields + if len(fieldName) < 1 || unicode.IsLower(rune(fieldName[0])) { + return "", false + } + + // Use the json tag name as field name if present + if tag, ok := field.Tag.Lookup("json"); ok { + if i := strings.IndexByte(tag, byte(',')); i > 0 { + tag = tag[:i] + } + if len(tag) > 0 { + fieldName = tag + } + } + + return fieldName, true +} + +// encodeStruct takes a reflect.Value and a wafObject pointer and iterates on the struct field to build +// a wafObject map of type wafMapType. The specificities are the following: +// - It will only take the first encoder.containerMaxSize elements of the struct +// - If the field has a json tag it will become the field name +// - Private fields and also values producing an error at encoding will be skipped +func (encoder *encoder) encodeStruct(value reflect.Value, obj *wafObject, depth int) error { + if depth < 0 { + return errMaxDepth + } + + typ := value.Type() + nbFields := typ.NumField() + capacity := nbFields + length := 0 + if capacity > encoder.containerMaxSize { + capacity = encoder.containerMaxSize + } + + objArray := encoder.cgoRefs.AllocWafArray(obj, wafMapType, uint64(capacity)) + for i := 0; length < capacity && i < nbFields; i++ { + fieldType := typ.Field(i) + fieldName, usable := getFieldNameFromType(fieldType) + if !usable { + continue + } + + objElem := &objArray[length] + if encoder.encodeMapKey(reflect.ValueOf(fieldName), objElem) != nil { + continue + } + + if encoder.encode(value.Field(i), objElem, depth-1) != nil { + continue + } + + length++ + } + + // Set the length to the final number of successfully encoded elements + obj.nbEntries = uint64(length) + return nil +} + +// encodeMap takes a reflect.Value and a wafObject pointer and iterates on the map elements and returns +// a wafObject map of type wafMapType. The specificities are the following: +// - It will only take the first encoder.containerMaxSize elements of the map +// - Values and keys producing an error at encoding will be skipped +func (encoder *encoder) encodeMap(value reflect.Value, obj *wafObject, depth int) error { + if depth < 0 { + return errMaxDepth + } + + capacity := value.Len() + length := 0 + if capacity > encoder.containerMaxSize { + capacity = encoder.containerMaxSize + } + + objArray := encoder.cgoRefs.AllocWafArray(obj, wafMapType, uint64(capacity)) + for iter := value.MapRange(); iter.Next(); { + if length == capacity { + break + } + + objElem := &objArray[length] + if encoder.encodeMapKey(iter.Key(), objElem) != nil { + continue + } + + if encoder.encode(iter.Value(), objElem, depth-1) != nil { + continue + } + + length++ + } + + // Fix the size because we skipped map entries + obj.nbEntries = uint64(length) + return nil +} + +// encodeMapKey takes a reflect.Value and a wafObject and returns a wafObject ready to be considered a map key +// We use the function cgoRefPool.AllocWafMapKey to store the key in the wafObject. But first we need +// to grab the real underlying value by recursing through the pointer and interface values. +func (encoder *encoder) encodeMapKey(value reflect.Value, obj *wafObject) error { + kind := value.Kind() + for ; kind == reflect.Pointer || kind == reflect.Interface; value, kind = value.Elem(), value.Elem().Kind() { + if value.IsNil() { + return errInvalidMapKey + } + } + + if kind != reflect.String && value.Type() != reflect.TypeOf([]byte(nil)) { + return errInvalidMapKey + } + + if value.Type() == reflect.TypeOf([]byte(nil)) { + encoder.cgoRefs.AllocWafMapKey(obj, string(value.Bytes())) + } + + if reflect.String == kind { + encoder.cgoRefs.AllocWafMapKey(obj, value.String()) + } + + return nil +} + +// encodeArray takes a reflect.Value and a wafObject pointer and iterates on the elements and returns +// a wafObject array of type wafArrayType. The specificities are the following: +// - It will only take the first encoder.containerMaxSize elements of the array +// - Values producing an error at encoding will be skipped +func (encoder *encoder) encodeArray(value reflect.Value, obj *wafObject, depth int) error { + if depth < 0 { + return errMaxDepth + } + + length := value.Len() + capacity := length + if capacity > encoder.containerMaxSize { + capacity = encoder.containerMaxSize + } + + currIndex := 0 + objArray := encoder.cgoRefs.AllocWafArray(obj, wafArrayType, uint64(capacity)) + for i := 0; currIndex < capacity && i < length; i++ { + objElem := &objArray[currIndex] + if encoder.encode(value.Index(i), objElem, depth-1) != nil { + continue + } + + currIndex++ + } + + // Fix the size because we skipped map entries + obj.nbEntries = uint64(currIndex) + return nil +} diff --git a/vendor/github.com/DataDog/go-libddwaf/handle.go b/vendor/github.com/DataDog/go-libddwaf/handle.go new file mode 100644 index 00000000..c7652a81 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/handle.go @@ -0,0 +1,169 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package waf + +import ( + "errors" + "fmt" + "sync" + + "github.com/DataDog/go-libddwaf/internal/noopfree" + "go.uber.org/atomic" +) + +// Handle represents an instance of the WAF for a given ruleset. +type Handle struct { + // Instance of the WAF + cHandle wafHandle + + // Lock-less reference counter avoiding blocking calls to the Close() method + // while WAF contexts are still using the WAF handle. Instead, we let the + // release actually happen only when the reference counter reaches 0. + // This can happen either from a request handler calling its WAF context's + // Close() method, or either from the appsec instance calling the WAF + // handle's Close() method when creating a new WAF handle with new rules. + // Note that this means several instances of the WAF can exist at the same + // time with their own set of rules. This choice was done to be able to + // efficiently update the security rules concurrently, without having to + // block the request handlers for the time of the security rules update. + refCounter *atomic.Int32 + + // RWMutex protecting the R/W accesses to the internal rules data (stored + // in the handle). + mutex sync.RWMutex + + // rulesetInfo holds information about rules initialization + rulesetInfo RulesetInfo +} + +// NewHandle creates and returns a new instance of the WAF with the given security rules and configuration +// of the sensitive data obfuscator. The returned handle is nil in case of an error. +// Rules-related metrics, including errors, are accessible with the `RulesetInfo()` method. +func NewHandle(rules any, keyObfuscatorRegex string, valueObfuscatorRegex string) (*Handle, error) { + // The order of action is the following: + // - Open the ddwaf C library + // - Encode the security rules as a ddwaf_object + // - Create a ddwaf_config object and fill the values + // - Run ddwaf_init to create a new handle based on the given rules and config + // - Check for errors and streamline the ddwaf_ruleset_info returned + + if ok, err := Load(); !ok { + return nil, err + // The case where ok == true && err != nil is ignored on purpose, as + // this is out of the scope of NewHandle which only requires a properly + // loaded libddwaf in order to use it + } + + encoder := newMaxEncoder() + obj, err := encoder.Encode(rules) + if err != nil { + return nil, fmt.Errorf("could not encode the WAF ruleset into a WAF object: %w", err) + } + + config := newConfig(&encoder.cgoRefs, keyObfuscatorRegex, valueObfuscatorRegex) + cRulesetInfo := new(wafRulesetInfo) + + cHandle := wafLib.wafInit(obj, config, cRulesetInfo) + keepAlive(encoder.cgoRefs) + // Note that the encoded obj was copied by libddwaf, so we don't need to keep them alive + // for the lifetime of the handle (ddwaf API guarantee). + if cHandle == 0 { + return nil, errors.New("could not instantiate the WAF") + } + + defer wafLib.wafRulesetInfoFree(cRulesetInfo) + + errorsMap, err := decodeErrors(&cRulesetInfo.errors) + if err != nil { // Something is very wrong + return nil, fmt.Errorf("could not decode the WAF ruleset errors: %w", err) + } + + return &Handle{ + cHandle: cHandle, + refCounter: atomic.NewInt32(1), // We count the handle itself in the counter + rulesetInfo: RulesetInfo{ + Loaded: cRulesetInfo.loaded, + Failed: cRulesetInfo.failed, + Errors: errorsMap, + Version: gostring(cast[byte](cRulesetInfo.version)), + }, + }, nil +} + +// RulesetInfo returns the rules initialization metrics for the current WAF handle +func (handle *Handle) RulesetInfo() RulesetInfo { + return handle.rulesetInfo +} + +// Addresses returns the list of addresses the WAF rule is expecting. +func (handle *Handle) Addresses() []string { + return wafLib.wafRequiredAddresses(handle.cHandle) +} + +// closeContext calls ddwaf_context_destroy and eventually ddwaf_destroy on the handle +func (handle *Handle) closeContext(context *Context) { + wafLib.wafContextDestroy(context.cContext) + if handle.addRefCounter(-1) == 0 { + wafLib.wafDestroy(handle.cHandle) + } +} + +// Close puts the handle in termination state, when all the contexts are closed the handle will be destroyed +func (handle *Handle) Close() { + if handle.addRefCounter(-1) > 0 { + // There are still Contexts that are not closed + return + } + + wafLib.wafDestroy(handle.cHandle) +} + +// addRefCounter add x to Handle.refCounter. +// It relies on a CAS spin-loop implementation in order to avoid changing the +// counter when 0 has been reached. +func (handle *Handle) addRefCounter(x int32) int32 { + for { + current := handle.refCounter.Load() + if current == 0 { + // The object was released + return 0 + } + if swapped := handle.refCounter.CompareAndSwap(current, current+x); swapped { + return current + x + } + } +} + +func newConfig(cgoRefs *cgoRefPool, keyObfuscatorRegex string, valueObfuscatorRegex string) *wafConfig { + config := new(wafConfig) + *config = wafConfig{ + limits: wafConfigLimits{ + maxContainerDepth: wafMaxContainerDepth, + maxContainerSize: wafMaxContainerSize, + maxStringLength: wafMaxStringLength, + }, + obfuscator: wafConfigObfuscator{ + keyRegex: cgoRefs.AllocCString(keyObfuscatorRegex), + valueRegex: cgoRefs.AllocCString(valueObfuscatorRegex), + }, + // Prevent libddwaf from freeing our Go-memory-allocated ddwaf_objects + freeFn: noopfree.NoopFreeFn, + } + return config +} + +func goRunError(rc wafReturnCode) error { + switch rc { + case wafErrInternal: + return ErrInternal + case wafErrInvalidObject: + return ErrInvalidObject + case wafErrInvalidArgument: + return ErrInvalidArgument + default: + return fmt.Errorf("unknown waf return code %d", int(rc)) + } +} diff --git a/vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.go b/vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.go new file mode 100644 index 00000000..3c6b7eac --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.go @@ -0,0 +1,15 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +// Package noopfree provides a noop-ed free function. A separate package is +// needed to avoid the special go-build case with CGO enabled where it compiles +// .s files with CC instead of the Go assembler that we want here. +package noopfree + +import "unsafe" + +//go:linkname _noop_free _noop_free +var _noop_free byte +var NoopFreeFn uintptr = uintptr(unsafe.Pointer(&_noop_free)) diff --git a/vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.s b/vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.s new file mode 100644 index 00000000..afabadb3 --- /dev/null +++ b/vendor/github.com/DataDog/go-libddwaf/internal/noopfree/noopfree.s @@ -0,0 +1,10 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +#include "textflag.h" + +TEXT _noop_free(SB), NOSPLIT, $0-0 + RET + diff --git a/vendor/github.com/DataDog/go-libddwaf/lib/darwin-amd64/_libddwaf.dylib b/vendor/github.com/DataDog/go-libddwaf/lib/darwin-amd64/_libddwaf.dylib new file mode 100644 index 0000000000000000000000000000000000000000..4224d100819618dac19df51d0e6bafb236e7c3c4 GIT binary patch literal 1375480 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⁡kQsV}ol&H+`K4#SIliFGy@KGnVJibNU~WY=RVfRs=N&LHq~3w!S6$qgadb zVJ7>Ll=oQWwenJS$=Ej^do6tr_+SyXb7Wp(`koyTH)T~HEz!=)k*j!s@(dV@%|=^# z^7ZnwzELT2wAn|VGV-5jOPfGiEhwH%?1fpN+*fPFS*mvyXU93To}WPRl2%tu@>W$X z99k8@6WF7w5uK%KkBT9d7Y7^yTOZDk4_ki-&Y>m)`#^-LX@QmlYo1 zz>&a%?XB-?;UGUR0NJxH$E^)YLCgola^EyTc*Wx#}p{DN>D6cmY0hPf|nm27?D#K=VX zdwaAZLPN}DUras-Tu+$H#j4t?;+a!p^*!EUeery%62iId5kk5Y7x{5(pB~g>_fBS^>*P}+*~a#|y~h8}%J;;zw-TCy*b|6k zo0UkmI3|)kVvA&LQyK5s%GrBAanTUpjG zV`Slq^^2%n;ePRN7+DPto%G)z_Tx|(%&1=XXJAz}VvdtkY6cm8(A8!l8$Cxi*uaVV zm4@nic=RW-;xV6*nku4y^%|MP$T{gTsw4AQ{lfpp`{ReBqA&d$rEEkh434a!)f4^^ z$@EIXI#}9a)jrx{+DA4^lRc{Cjs3%F|5;kBv099-h|8MHOD(Cyey%b8#ufbU(wm-#@?6H@`<2DU2-vw=Q{Wv!Tv)X~Ps z`WQv|KYG(4y_w(7qBo^nWAr8--wgv^J#@WUVBHVDxud}yHFlfPA4`U7eq7SKPrq?pf_Swa}jshs{AlqcMnaN40U#>mgcg@=A7 zqFUJIMdz#Fwx8o;Am_@iON1cq!J5uzT<$~9;E^!4Fb3$%#NQyv#3nL~7Fs`20^$9O zI;WUBNQRpr_w2{5;kD$@D*A|BCAO7f`A8oLELDb^+BqcTkatN3VIoI*#l|)NGyew! zMMu=q;0@2rNUom!C)Af{Wb=VYYf3%t9_NT+87LkzeeQeAav03>3^%`ne|S($`UsH>@qe2ocA zG)+03sO8hY@4C%rYV`9QIu5 zoEKOj6L>lDgcW852@MckAOoGWO4LW62Q3<%ko)ttjPhFfT>01tR8n-g6y4sgXkd zT$2%^9ln_|QHILE3aYIZcV2}pL=+0&nNc>MRI?S`vBk!I$YZ=I*7yaPErCnTP77%$ zvb#qemx!F^A2+tUP0T7Y&2Z*G}cIn?6y-ajt z(Hz1G&OzafG+IB-xpB81>P%gG_)4o-W??22c43v7UKU&L8+FDIlb;DZ!fLoEN>{OU$FXp>pVC-IVDE`D1UPm-Xl1=c<=?!6EIj_^XfpRISaDX+u^lE%N?!6+2~x9 z3=RNPSt<~vc!6AZtZISi&|$G{HyUGt?I!E+|5mhXLJo%yR(6s+8)!!acj-A{Fne5W z%d}4`nf6Ueru|k&Vz`a$SxJmL%03wy|4`+`WZEJqh|9FW+Jn7lCnU$ETHVP|6IKm$Iu#RzcmcclalD z`zK8AT6Z0u)pKWg!lU6%c*=uWm-&7MRr3&A0cBJ&_Tjep z$=d??Q4rD;!RElH#Adx27>PqMlh&Q#5!hocT!<%p`v6Wj`^?`+?M(Zf z64}G9gk(fT4UTAr66>PgVTNCz7M8w9Jz-O*Ym@5Lu+mzSWlQE{aI;}fLPhF;0dSC z-d)PR%0lv0sUn1=CFpF2V7lE2oF+N}l-G$_PMTAJ%IySJZf7#EyiTAs4`}(FZNcSs z0x!2S8DL%~5Ss_Y{LVHY3;Ug=^ad$LXR%b%^J^@|*YY25j$W=gzq3+v-nv?Iez!{N zeK&u%tk!x@SgG~)EZ2Iw2t4B2FVG;gK?Bbk2zRhwH@?4L>phBhqpWwmT_)w4?Q$mN zOv*J=u9QY6L47%RTm{)#F3^(9&f<39XU8FR6?hM(p-U!o7J|)Q=tirsBFkVR z=sy!9VJ?la0GhR7OyZETaGlvK`(1EL!b@4sk>7s+tZ#e14j#hag?aoRB#*eD^uHsI zc!;mgRvz&jkmx`jG5&sN!*%So$s1z3^WiEcw7opSp)Gxa6_t=cXyuRcJ4p%=(|3J6 z`NN$@#I=d+;JxDVhlr$H7V=n|(g{YWKsXavO7lkHL&E9ar((3(7D1f*^M5UZIJhuQ znCAc-2y-hDL^lE0nMDx)#n);>wnY$wr8uDi9#ZspF>l+6ATHZ%Z79D4<{ilZI*X}_jj z3w|R1u-l!)RnZ%fcd7U+%SuYi7L_6Zs2*M)IG30Ntnq#3)6xk(vMaKqI?Z6El>n=!;_VK+)Hz z5GbAjAY_{Fe_I>^v25wb;8y~x)#wjTo0oq- zK9#^X1;u|;VWq>*(fY|~oJ zl16bhS3p?|C`F*B1J ziCI;s)P4evP=*DLAlIb*__yiv&xZmf9n=3;>+^pvNDZ71+yjWtPM^;* z58<(bl#)-eTbUqHDL4*?=4Q)LK!``S`5Un(lP94Y^W;o$?)`1C&`gOxdP%1$W$_K$ z&2mXvu%XWO{Bw=XKhbfL>LvHzDW$d+Z5_kci3jnd}L~tJbmxYHVds;5(x|fh*abfb${I2*six`V|%hPb66s z1fwq`Sri1|d}b_9*b}fhc5F{@U4o&L_P5*i1a|va6wp3DI<_eIb&`hfr*VsdpQc(! z{}|Uq?eYC8=1+UqbVb%=`3_aU8uo`*l}zDcxv;(aDS&s7+>YT^>3gQ0(VzB#+4$2| z^Ii|7|JM#`_zHhop}&aN!~y6oXS8SB-U`JdO2=dVyY+A(z~c-Xnv12YMHNgl+^ndA z2~}tos_^Bkwp4-g4N`s$Ti70o?U!P2wJR3=sqIvDAwq{NDf2?RGD+LFfXLO!0&2c} z9l|vcU&;0l9xe(%rFlVqEye62e2PX~^s5&{-r%9zR153TEt@!Zo73ReURNRzawCTj ze@%k_xTBt_7USDt_8U)V5;H)A8T*YhD%!~g@+r4|gXB=`uf){%;EPO&+J=WGX+8vi zDGuA1SCy+#<@T8)?-nG)|1BlPudqLa@5&<-Q(j8oS^_j`YsM8wD3ESq(T2r)cj<(# zbBmpq%F6?+Yt3pAWOEEaCR3FoS|XblNRGhNX1iKj4R2>PqHDxmKG4&hxI3G25i~pAr z_p)7tkCS?C4R%&ZrlMGi6E|7RMRD83)JoY0?n<^3#b~rcJJIfFgFh-Hfv=&~ky7iL&m`WlvTVULB$AhbR%8$N8HYS! z+@!)AvSe6L(vWWz+WXb!8--HfBgDxfC=5TT-Xmx68K3!#Mzey+qp1cV7qeiL$~HKu zAjLnEszkS7K6@D_hYC@QJNyIn(36&m{KYEikQ^cYF-<_Dv@=*9+7Fql2=59)F;g=sue^=*H6m*T_D~5w5FX6-f0v*`rysU|xl=-H}&>ao6sVTLE;60Rf37NQB>AG2%kZ2akX7n(m zh%WFNubJOKounTAQ64HfT~rl$h9AE00~y4NE6G^p2;lthlYEIHSC{ZjtWhX#@TZqc*5;SW$|w+NYpWYUvyJp*5P9ju8}iTHZ%*M9+W5`rf+rtm-Qqov06CGF`Ja zL^wflJNzpNW#my)L6*aRsoddL3R;vBfD3Z>`CV;SwJJ;;u1l=4Y|5ns=b`BK_C>+y zHIr!`nB7kDBDqfF8t0cKzGaNRQ}XCh1qzA9PQ@$X@OCI|6p5oogQ31v*iTInJ}^3* z{cU^(16XCI{)QeB%K@%eVns#Fn$MZ-vc>aL0*eF#O6Y*-(WPep-DL}8!xt-+U}0v9 z{{k2;nA$*o^o?Y8-pvBfy@igCD1;3tr!)v|6lTiTfk&*`)QA43rN4Hpp2&O<+E#hb zPl;ZyhZnAvIDYTlEHgkr#(H=TEvIO;XmX|izAE_eQbELA_?cK_D?T#&Wed@6hEGmr z^=gTsY$0$9V``7U2da`0_+0rF>hr@*76NyY;ot=&fbkRJfbOjCC(D{>YyN)1tD`ls z=G<{-+c_8eGylb&(D{_HCi}fR+LjUWwe2Qpq|SVx$(rnYxZ3`8N%GG5WsBywm3MAX zNAj4w^LEb4Q_KtKUlU_iLOf7%uGPKowrg4l#l^}r9a zsS1pp5lY&!wBj7zLjLp-WHx(crMc{d(2tbkT-Nt?46hsT9 zc9|(WXL5^6si&0hc~`97(S>Az=a|ne7!`7j$xo8j10L$Am|2?N0det2sHOVYl4v6M z9_yf}A=)p_KMAUTcaos`!~xb9VtQzy`}5ohx(9O28)b$RRxjsa0;{zO!SdM0{y!6K zI4$t|#G<{&rvLxNc({%z~Hz9*+l)9oSe=K{4hG zBEtnM3-jVaW4RF=H#?Q}C8om9dmu)E`#~2nG7*5v$uDaZSum()v34cz>fl z`||(d{r#_wH#YV=tzvZ{96rlFF9ngX7HI7 zllpAJEDXT7);&P1YxlRet|hOlhvcXRUI)qswCtgr6hBMz!R*zJD7F-VDflmk$0D!^ z%V`?x{Lt&vYeh-I;hFLTJ8p{=fV>vM30#0#haxqa)0L$;JunFqhQkOzT*rud z4zhb&f)Rkt6A~+2o-hJ>SboDx*gCu5=J}ZKz&tCcL>`9yNhX&C^jE=B5A~J+FA|Vu z)8S98e;DrU6RSFX<0aO=PI~?k8OqX~a){5xI#WfbsUuuRiYI?3-XTZy^}Vfs5@;Cj zkS5O4{=VjUgd^k7?wQ>*KgpVhx|BiB>|^r@RG#OVy>q@~au02=AoxgL0)%OK9RcuZ z3xEp%;3Ij!DHW68JV1C6e3A`9AnF{$s~Z8~#5`c=%>#(;JfL`c9$<9mmC9rYUm=eH zjgB_de#Q*xRo z)xrwBsIW%%`Bm+{htqU+=^1F<02Jsk?N3S6p19`3Iq`u z;-w(cj2u_lq8wS_*_7}YsNO4bRlUVIjz~Z5JP;0#IB6JR)hDB3vRzj;b@imK>{wlp zwW1u#=26x{cLjo4C3MQDs~EzE{)bAZ*Q#KDDZX%EIMz6MJQXF*O_!s};G8)`TchWw zz~4uNl!-isI4vS(H`Ji0T;SNGYIOv@5xrc3P} z3Aqtx+a}Q{U8wdKvA+-o`3=sv2;u^Vk>C)`N8A~(PJ@H{{kS-~*c==*ah2lnQ{rSX zR3YmaKY#VKC-tuo<9Jk6TKP46q0&7Nk~(mqN4&!%#RE1{1dLfp^yfKSqs)Lh zx`DeSf=GV%JmTHup4^={6sBR~K_sVUZRr~6MD7k`CB!#O!-X&v??5&QGwxy7h1^d* zt?;n85aRi-Hez;L^An#MAcRA&{x}XmQBWDU_MJrXEh|v?5)bdkhDToIss1R<<9Khh zG4!g@#>A^2&vEG5aS#D*i}`{sXUV{F!lYfrN&y5IOsh~_lU7Q2C_rq}_yqJw3xSMG zP;0!^tt5;7$jiKn?ejTmA!|8LmI}~w?kKa#Bgco^2XIj8J#j!b{}&$?$t=c}vz!}| z7=b|^R6iKpRDrC^ldw;77Ohf+CQ}Fp825mgih*)OUTP8;>3JaU@D3NWRxt?j82PrM zk+E{E)|^&RDJ33PC6t1~{CyEJ?5@z|<>pFmweE7r$@u8YmgpF{JN*ytz@b`uG5d$d zh{oz-KKv#ji72&)QgUsuul4q|imS>`Nd>GDR(Okq6p!lQoyWFSfoH z#@F{NW7;CWnrji;|B`PoytNh#^R=>FQSx%puiK(4M~9-Ry3uhM z#JbT|H1%w|B1twi*Vs)D=GrDctSA>RPwqs9`OeRzwFL+;*|4V#z*f+o9(jpTkO3}k zKNpj)&c{kZ+-v^7s6vY(Awb@Mq1x2vr5KY)6)Psy|6( zvDJH1=VwLd^4WtQdBZOXS0b}_@8hz~qt9i2=<}z_>*k30`I9QoQ$S?4Su9KbCbQRX z24ZQypw?>5nO4nSvs@2Dn2f+mbPYe}xTuGHD{-^Vb4pJSER@nd3X9Np6iL`Hil5{J9OdZS*^1fGX%MGRK`l~eubYNkW3E^I~X2#k~C%STP}ApjK@6aVGD(EZuMJX2R2L!mL(D`p z(-)ox_>Xx*gDhTjkovK(o(XTT9{RI}ydM3YD0$==WM-XR*xWRnk(ka=VjHtn;z(&u z_P*XlI1?7-@k%6u@*5>jfGuK>N*R!OCDAuze8ub5Y=^e_12f3fjOI-uvGQyw`899wDnUGPI; zLKmuRJp!XcJW(zv^g=R+ZQ=KyNzx_KX$(m=T}%z~{J(h4)4;Glm${T4u*g`H>8c#- zbgd=tc6xui8zYJu0s{$qM(>l=0Ma$$>OXJwl|ue^&5_iYn9bPuf{Qa#{GIOD9O`0} z^r$O=?Sf!f=7D7;&M9>znH)P)Bw<>@-Zn-r^w_|qvB&Mk01P{^RxY_WLHmt^1tbjo zlLA(Z&=xuFpwjc@e&Gpzfzz0hG6cW4LR%^}cNnwi$9J*vE?|!*MAbhf){(ZfkI4QF z-wH)a_CrdrFezGY!y6ZskucA|J53tF5Juud;&N^-;v#^h zwTkEIHXz?1w7JN*UxA!PwcuW!Kw4Jljy*754sY&<%Hpzcj}_UnMqU%uQVX8uODnP^ z{J=A!tgj%WZA!!nuYHPfia&NcRPo#(s4|^i#-dwR^TbA#kEQQF=eM9l=f7kVfUAG2 z{x7uNX%!J#|4W(jS#=r3bpK8#G|Azgp0?Cb@2iLsft^sD_Tw{*UC!s02Mi>3x11NAtk9-D)N4NhDRK^(WO!PL)Zwe^tXbgtx5E-maDJg8__g zG%uxEvw*jXd0J`C8fh_4R@_5!331R3(--lx0qypgtNCI6ng2x=0GY&^QugRE`@Y4z zSLNgOeQ!Q1{p?dL7i#$l1r$jpCNHmo;sB?Fc+oc|9c#0OH)l3f4YyK1+kAJLwW287h#hjQ3^+D72+4~&1De~*6&1`5;)eA?cR6w_>f@C}N<h^uo$mTwwqEGxtD{( zEBUO~sd5@@z0nKbW0nqQMSq!{EDf~r3rk3aei$;U^+?qJJblo(9Af8ZDHseQhQ3U} zx}+(n(H-OrYh&*iJj8zaB}R?ZS1$I^IIYOy%tiVebD=~c4flqj>V7?Uj}lp|PpTGX z=)pYipa*l*QQfgqD{mA?!h%wPl0<^z>&)rb3(r3spja{b!b1yUatw70XAd(FoESwb zN!&+b)*kgB`D*sdDqz8Vt)BljXR2VWN%s<~MeGIdYSxiRO9z66(Sb=5gUl`a|19lwm&U4}Tau zhy+DK&V0}haABS73*93k5B~)$QVcM`%c#kCO{Aza!DSlf8=J>hrU#u2N!oAH7mfy&7=7n>ZR zlODVin++<Ij}XBG_hlL(?)cf+sWl-w2*`1{m;&6hEa_3%xq zR`W2DIu7>Y9x5;JzOGXKbX`5L)~#XVDR165i6wsCoyd~W{dm*iGzx6AS*`g-)@Xy@pK(Jb*8XZNIf zr>cG&)ko8#EOhceQ^i!OkS%b-(02P>a{T_`*sLo1hPX%d+-pcOmhEcV0;g8Pta*@_ zdUhRxk%aLQ2m8Ws+JH*ZY|M73xFyGU6p;kPo{hHTubbq6jD_z{T3hh!62AYawsgE~ zgv$N7efWMmC11Mb{(M9d9L9}uz+ZJLTS;@~0gT$tum*_^#4^MNjRQ>dAs={2_lb?Z zA7u1}3W#~ZU>;QwQ6ZZW>xoAnH=1H6XG!K&1WooMs-X_i4tRn)Im3`6WGc8QCsLAw zLMJ~k7Y^&3QdsLAXs-~7A|^R8VS-o}t62NDkxoDWm*R6AlJh)&s|oQ1SxDO|j|p%VK)=RAzixtl=@$JefPNL&^lQA(FIl2o8=!!JU7ip&Pm382H$O){52oN^PyTWCpMb4$O?? zFrAiKZS9@bwy(X4woB(TM#no>oKuk z7K|22x7+N+Z=Ch-J~M+SjZnv|U-<0kKw(yg%qPo5F9hWgT0h}A#gmkNndYAWeQ+-n zB*J1RMIxiUk--*5%@XB@(*lY*#9!_h>exwA><#|7|DK|b)a4e(QwNt@6n}2&*yFZ> z12obA0~hLeQwuHP#aw$?f;!$(nQ0QrOQ;XyB}E{(adr{zA$}th108UgnLD_z(|p+a zSVWqzZqx=xn-zZlo##{H_y4v0AJzH)Z~kvpnZowZo>_%77xXEphdj%L?oUT^_` zW#OY%%-mO>`aES%_?PShzmk6cAG8nD{Hyi<2lfGgr$lwa2$HlDbP9h*j#_qtR$OL* zZ*rwxi8D`d6~e|9xegOSn-+XpBv0i2LQiyf;L2zz>elTj1oLGIR+zuy7>rDTIw-=b zRSU_TN0SfMyk9~XvjET2gAcyX>VB@L;`T-#@k6UhGqms>O2)9di%b~>({z^|N-p-V zV66`qR#(lXiRBI465--1LW~xZl}Q4ZCRX{|>Tgg{*Q)JRzATKVjADN;xE6kT^C%95 zNsB&>OP{LK@FP(Lri+`gT)a+4x${Yus~@m#j{QU4)2#s;NFW&PziJJ@R~u2OECJt@ z8f;5I)rH_0LR;L5QYL`4R~V(kFaZopng9kegKaD;+PIAwQ-Jv+^_?iaZ*!l|Fw3Yh z1v9`EKoM|=F&dg+!EwlJF2e{gkQW*G@rHm_^Q*%!1boB-HDT}mzj6IPQnA+mr`G?( z3q1My{{Z9tFJJ$EgrzyP{=Yyts=fX{gyk)5{ZH2CT>pPam7jb4KlIr3KOP9_>woe; z_xk_6e|`N=^*z@ARH4@YrRn0$wy%ALe4C2<$SLHT*bn4-2xE)ye6q;5U5w7in0A-gjb3Ee7qj%ufc!wCpEHm(nTyVHO8DJdm zpbfV1*LR^>8HssMjK8t~Ot5@6^Uv~!)qSht{8_T0BVI#Te?0^jHvVTU_QIO6s;BU? zkz(W(Gw?u`7uZn}#^4t7F>2zhh&tJKH@sgY=*?mP_Oa4#F*h;?G8Y^6A;-k;$DDs2 zjJ|j8bc?UTznQV+pPuYKNlTV|U0mdh4-ZZeVLns&%RNwtjQj$R1Ru~*uJnsC#dzyp zosiXT?Wq>*PS_+DT|_Z%h8=|`#W=!|V@W`A-PKw@&}|fRhiy%%JuT~4N`2Lu7IxXN zH(%y1<9PBucT+cRT36a}-Wo0qCZdr&{6jI<-o;Sk*<(%@9*JJK}~Nvy^j6UjhiN9OmC@~pnB+aysvO4{O0_= z%mxq1Vbr=taKZF&Dz@o*b}ZK~DUqri;a{ti~-#yHoGT+>RWV#Ka#l?AJ1 zNsd&H;&}z0R-M8%LUmLaoLf?8sawe#|Gq@BCo&h;kJ`3KwUdwn9&Kuu(%q`ba;clb ztX<)0!3Qtt$nbq(){-ltrI%p)>OlEhs?64rxuO6rHJ>=!qTrFFHcqRkxy1CJPZWs8 z4BzBw5xxf5>D{%B=C;Ag(_)0hAGjt<3$+V<;4h|n%!Pz_`wbIIgVn4*65lSl0Jm#W z#CZuMf1$GfatV!o5s^x+MarykC`~baQ)nX-@B12T!7uf6X87(>P!;D`88Oj=ny@W% zDG_=VOAIFMmd>PYOx<}%K{xQ-U|GU@;`Xb0#a3-$mC)54Zz7h&(!u=ST8)GJFx_y0 z?5Jy^x6@jyocYHde=kvsKjc^;49NEPXO$$36JsSjPVD)+{O`i-(hX^5^SRLN)fml> z-T#B)pZnM`QkWwm?V3=}9USE;2cj1+3`_3nb)$*OM$IuULluB`K zZW7fS#6;iEC!8{#ko%MOJ7EoOPh6%jNL`|Eh!Mc9-s1bM z#q58p&fUd;D0`Qb#n_7Fi7?vuc}v_y?t8B|!exJCu@$q#iV<1gMQlmzm(xwg#BYyy zktQ)B-4%!YFWcX{jdM|iu`x}-}kk>W5CgkD2EwA&b`vgl1lwgH9ACLBv0t zW=V}R=xbs?yn3U}9r?L;3BRc_WPu0gzT&$Q^mJ&XUc+ z-6BejEr@0~)&k1(`FhT%m{_hwFe`njnb0BbrcV&e9*I{hH?km^ zf8IkfE3Jyi>>`=F0s1C@e)w3Ri^!1>&axNE<*h`vS#-0K&fN;=MQ10ZbE7CtwuF9@ z8utP8_oo}aAtIrN*b)``R4l#e z`@mPUP}~MFhV+op1VplB^u3_yu`-(A?8nOJ)^uk=+rDCnY?Qy_MRubIKuc0u87z@c zEcu+(KP8`Akaf}}wGAW{|d;iN6 zu>F^Q&!Y%{_gM0z*^`97C;XQ-os0j{U>egS*#!%z0Zm@#zCdBc>Gn)kZ!Fua;AB&g zS)KlJ3A=~BI*{|gMdHdI=7_juI!@g)f3x^!KzN>t16)%V)schK3ls5f*xHNSi;E;~ z-R{)4AeA_QgV%*|Hc?y5ozGfM-LLSQ2=^4rqUOSDx2`++e$R$07 zw*v)pTTO$wyU#C?wcv1U^yq=xi0jpXlkof9Ge$`?F%IcS+37`M;bPz=>HxL*n{pN* z$@ZkRaloir0UJQqcIwgW4IzQK_%C@uEpLZ(M+*xoa{nk4{+jQ84-P5nUc!9%MfrM> zS8UokdplQG4dgavG(9)>qO-@_UL889h4+hGG1}Z^t=hxcBC>Hf&=y{8Jr!!fkI0vc zzv*a47wSrHPWR2y?#bT93YXtL9qM=X=J;jhxc6*wR~*(tZFo5_el7HpJVbK4XAFz2 z;V}{47))pTs*@mIRQ{nhzxWbriqFzMG5LLKmbPopEX~L7{JjS^i=uzeEbaZh+{D>` zuR~t%SC5%IYT<_&x_Zr0uis0&I@Rma#A~*C{bS-aN4-9mc+Hj9&@9$Qu{ESEq2(Qc zH6;!G=~r6AzD3f~4u@o2bBQC>i_kauROMw_d6}s$h3-n^Wm$PyDo^z z&nBRfc&UD<-P6B_516n|I{1BkmbPO%^U3f09SZJm+i>3@v#Eu}cS&{Fn$b@auhxu; z-lKA@89g)cYR#x<j(elKr0!4UY;x$h-G(GW}uU>CRy!KMBwqCjxKI-*biPzKA>kkvJn!JYI6_EZyrOn?gvmgKw%u%_8_T+805UEHZ(hfEFP*x(( zLZl*vNIMiHLI>@M-E1LJkwT;$79zzGc@`oSDMZ>~A=2xKJPVPE6e8`g5NT5)&qAak zg-AOrL|T)`vk<8$SB*h|G9*!w{s?VnSa{8sL&l(4d0K1?DQ+aqXpeDy(VvmRHi?YlSg2xSB{1ZtzA4g=z$mqy{u&kCa2$fm zb+9o{3%_!Nf{p|6GtcEk+=Dg!9!Dps-e6RWYzUk7^Ue6}^ zzulb0|8G<>wWR7>oNXP=x<6i>VB?(IM1*ngny~Nqm3-kV!*MjlI{drimsBqv(@S!4 zs~g7j@(?i-Z=;H}{;A?&n%nH`g|K>2H@=(#rvGifE0O!eBhY+hrX47 zYcwG;a~qt!r1#qLn$Zs4ciZprt>!(2IT_Y|rY$cE?OH8({ce6jUIH_tR>@2M4Ib@4h-x zH`e!|yL}xceD8Z#JeRl`YNIcQYRcn3m-h15Ja;ffO}cSqa*DdN@I<&!%-SkzrE^-i zpCsJKAG4dKu!6T`U#}qmsw>#-^cTw@&a^bPBJ<8$p#w2%95nAG7>krp@lTTm^HgVh ztf$reDKmiBv^f^UP^i#){%4+=#iiDL5>~5}u!lhWZeIm{)M#L}kJo6+*}L^W zUc-Li!y}kBqq#QJ?axC=e;offl)QN?ratkXZco`6wW8bXBgyw(&pB(IotU$2{=ym- zNx^k9#MrK4nwwpH(n&U9zet{kVFV5K_v}%s?pBGgD(iHTtHN zZ|(_?KvmzHIF%{(yNWe+2jX+AV?1M%U222XfJWANpY$^hoClf4!64BxH_G>azA5nW zP5!cYj|-f{%vz`|FYYTPBtO5orf>Jf(j#eak1IH@#96I9iaT1L*aHH3Ip22sQp}r; zg7_Gu<|(j`6_CTzKto(f&loQ7ZjrVXyxj)%+3-HYf_DsWD9-Y9+aP}jkZYmyNV7;K zhQXxU{7FGNY)_0I7y8rjW1Z?`?a~I$CEES8^mLb4Q&80jM8?8lytp4FFokZjKDhRA z^Qr#`O@84!6`Hj7w$@JK03EGeDlS`n%vGOc1Jd1QYrZUkgmcK-bG#+=<0L*M>0!Lx zj71OE*yHUn*dFvC1GhJp}OXiM6agT`|VvqOz-1PD8;q5cWd!yZ& zHD2GpHQu)|Y5x23yY0SHjW_Q^Ek`X+sVdj$8Xf(k9XMZi4R9KJJTMq zq7v4(*19$y71|OhV!R?=D?BfO)*_ce8B#!YbL3zh8%vM>jbG)@85uI??mijuGt_z- zO9+B=twZ)zf*q8YjAAh{)HwGHwo5}*D>GQ_a<3srWkY1LPF>ZtO47`1aFz3At0ymZ zPOQ4f_t&b6eSfZ+;J=58>MPt8JJF=v+SHe(NBd7)B`qi76%lXO!D;yY^=IkPdmVwQ z%n8Jgj}}~p64M>eCWeu5SWHyGuB>#HQHjC@e75v#pd$Y2?88T%(?y|%4>q>_&3>XCX)TZJ&9Rv z^Y^RabV+bsy7(|l1a*(a>u8rX&u3<*&vQO+_IQ)@n>N1gXauWPaM+_d@qv)s5{Az_m+G0FtHqy5iS6KvUMbkqUI zu4Cqxok_w`Sn~^BFs)ihtP>I@gfrx^FENp#AhN>f_PJ#Wr`c0DDKUi~Rm%9SDOAf3 zbd_%Z%ki@rv^Y&a*2sy6EbY;?C5rP%=3kRjdnWj9txMYcW0ZE8KC?B(o-_nwkF{cr zu1)Dg8_~6zPPgNu_|MGqWqyyH{ACBN$sd@NKKTW_r6!@r{LipxR~G7OZXaT9k@C5U zLT@7)p{KN4UqQGE`L|jW>_-~)=U8Fc@9o+m!2_B9@XI{7qcx?Odg}Pop*>>2V>hjz z96B{0aaxve!IG=CeogPv%1!|5sc3VK|Vi%Ea0-n2inX|FT5 zm&hK=J-O(toAjploqGPO!95yD#kp*S5qzD<`~{1HZ(Kf!t>>J{4cCkn4C_Bmo*Xe^(NXsZ5BQ9{$g{sB_Bb7~k1nE2TDxv*=^;F!qQf_j zK1P+vL{c{IRdhqbzGpV>bq4m1GCppKJM*@nUF&k(Bbxn(emNPF78f|A?F`xV z4{pfRmcJ-TE=hWNg4C27+^4w~7px#@0Hx4qTUAH#GSAMKKo9W`9t)YVDR&Xm>oM*u z^ceVvU|xT$G3I7^68tea-%0)CM|WDtXUVTIqMiNA^7>%ae>gCso=9KUGf#lp z|NPKG?aMRLQM;VC6ly2!v1-3BIo{uWJ$=0EL_0g>coSSLeSI?f^8aMK!|WcMc)T|_ z(g%^4ud5Yp`oAO_mG)BPN-vkK%363z&0;Xl73dm)=HEh4o{Gb>C)@lTjI4-GYOBhh zQ^I!6kM(HrBv@LT&>zM89rBfb3TB7<&qTSmRwW77D3y1iJ9rpEd91~^7rOTE6nQlj z1E+onhA11J=KY*JW#JNE!yhT~oD?agh@D?Xe*D)bkvBz3+ka54u&f2)z1)mZBqous z5_AjKi5G~bSKA8h319Ku=7|zeB6|DF@d8UfkUjQm!T6)*;AyypbangQHP!~Zj{1hR z)Cv#EP$x`eLHo8jXu2@Are$aphl!G2IrC-TYTJ;X?u|viiR@qw_Ha7y&6D9%BAzw+ z&<%GaFse*D=^wG63IX{f1v`sWcg=^@;wx;Btz%He*S>G73{+AQ5Z?o@4 zxJtaQH9p}K&CJyYzAD&>^D^|9c-8s7(N&lG-;NJYm@Tx>`O=1P>k@ge4EFS>dwVxe3|T62D?e(6phC5(#wR= z2j#SDZTV|nP|9ti7ST-cyi!uWG<^}ixJsq4M?QRhu=c53X5Y)IMy5ysd?c4ARX%G@VrS(8R! z4J|wp2-#Mh6l(_}CG~lXIo8J5y#&V$zR}^1PVW%ISW`S()KX(xu!9Y-!?)BsiFR@y zy`M<$@705Ed;)=#Z`KNH`YzE5J$;uF(8PHre>`V$cCDuGGD&RYz2?jkl{!jN+a$F^ zrBrS>ru|W*QWqLfV7V3w#O`?2xCw~jdxyiIs>zhwT ziQe7lf6I#jFeD&w9c(J{UFtEmSwrf&GCG`jFUa+jZJV`ZTBLuuZeU($;!sgzp8tLM zEX-ASSjG7xWn&*>Yc-!{DSV8*bH?onI_MNS7^2WowsmYefK*1SGdx0=lTa zSJ8#&yp7ODhhhnApjj4|i{+R$au>QNM*mx0jNRjWAJ(+X#V#t=zBPX0?X~H~R19H| z^J{8b7vEf2o=38u`=7)_clysxGu@H(^Hi4aEps<(z#jI`3-#`+HUu<*zO1?q;`Y{?+_G#Mz+s~Ptvlx%}7}h~8RG$NBvcL@AOm1v2$-(Z2wD0t#4(_}Oc3-Y7 zI*mkTX*B-l`fUX(*aYp~!~6KJDy+jYA;((1jjrH)*^tE=f|2bytWHE@|CE)aH*%e| zDeJ%^qx>Mi9G%#YReagcG2E@vm+(Fs^2&Z}r}l6^3S0ZJf9|86*pJ;U6?DgT^j2e~ zJKDEp7nQNfVTI6dfe6nf^8BLpT+MU%3VK9;m7bQSso4FkqKlkb5u+X#r>Gag;abK$ z%Xsv~OMuJ=3V6Vj%70>2PSaZGJ?j}|TMNI%*ECfAwFF>p2QarM0JDV}k_|Phmtz`g zJdcLtawkTS;iU3ctjaU;cq(Q2mFKtqRO9FCPecv8f!kT9fOx9{i)cC!6IR-VJ~%6&e#KOXU2BH6d5SJsh#vT^)Ka3Yd@NqXsLPFngKc*v=y z=h32IIZ$6JatL$+1e}bXmmtV%6b9MDpQ>IgsEch}K%qion2XNZMj?jgw% zwXv;st~kc{_r_mDu~0@l|JL|wI@C+Fer5%!51S;sf+auN!8AmMh<+`!PQ9pAnijfR zW)v&Mq20=6fcRg27OIREa*%;KqlLNzOO+PTh!)V|-xV877Hyqt1G@)9@n6aXz99d4 z-w3#hts)IPxq^fPaZ*9b{?(V#fPX%MOG)%}vy;M(=!o;bf-SbU1u%f=L+7~5#zb2* z_$vt!FGT1YotOl*TLTuBuQz-5x6rTlacMs>13mU#75LNlU5Q{8x&dwA_@=58OxS^mNdOS+Xa(BsQ69QYz7`CCMEuEi{ZQHRl}lOzdLGxkAARvGi%-cTjX=ZTwNX zSnT&8gn*zzG^VZWrrSSah2iJmob0f! z!tiUXjeP^nx_q;sz@yv}xK%G}c2^vjJydtRs*r_+`)FH-BN$vlhdU%X+)?!1p6Z*| zxWd{Gw$?lsNYj1zQ@yxqbTyr4yT1x=fn97|vHR>FA)C!?_m2jb58!5Qe~YbJ3&$lo zZM#IL4YshUf7rJLZxEp@=)k_Doey zoV4Y&JyS}0vXtx1_N<;oojr>>t)j}?W_xzeqB%W_=2%6QgU$Bbo<;L|7R|GYDxaF| z`8|vF>RGgxRaCjrZ13H(XhF}S1y)hzIkUY_&!VUGEP9$%R5{CR*HqpjS-eTG3dF9AtK{Nb}oo4|sRW!>gYR!X!W~!(HV5(@gRaChvZCB7t6;%LC70tDZ zDi5XY3Yw{+3V^Ai`BqWol(bzzGgVXpFjcg-RaE&QZCB7t6;%LC742gcRjx}`*l~ZKtn?jyW$A8z5;ELDChR6 zq3D2o(W-ANSgbqR#jr5;x+A^e0+_~kn12WM;YQ`+9{Z|N<;FH0PUim1%FU=ot9Dzt zOH#Q3m8*rStehFCT4&kcu|kdYwQ_GweW%;soo40CPUVcWbB0IprC#Q-CZpcPm6D*6Ims2^fs+^S>STSM?C3l6t?i)3?-*(UcxG%|ZMTkVS;K1$I z-u*Q_ABQ~gzUA|^T}dcBZdd#xD`!xu;`w&PCBUc5%3YQE?iTyI8Y}0cRL>=L?dv z;>-2-)qQ!^*So#e3`~9ZCp%}Im2-0{=TW;x0=UN6QXac7m32Q^ zDzVB{r_xxU*|h``PbJA*DzzSl>Lx1CoCwqonR3ABOIap*vGvY2k{2^Bvo4c%hY}CYKzBQ5SJM6a@qTI z&KK>*O7Gue@9rdaw5AC8m!g)%+c6Mir= zHcHZy`-|#)j9D!8p;W8WFtHNe68>-L0er0QGkbi$S|D#`$oJ7cPkcd|&PzW}!vZj> zQgddmRo|xt1hVRT=FRl}EOvMznVbak-R_B;R(>#j0J6p|C=WCt*VKs;v0!%k-@*46 z$W?L8*Xik{YrtUa#h!}h`l0H>=>4m!1KnrMi6PKk4F%=26W@tfZ!cMdG_%({bL}!m z`f!y!ol*V$BL;`ogB`yDhM?87NH}upm;N)pa~PkbsQ2^=tnqDrBYk`pyxK^k=ByLK z>%FT4iYJBF!XEW4#^Yu@LeO`sCz5k4yaH9Dl18~h{!W%$Kx!h_u-CirB{@O-VA+xA zsxK9IWrWuI_5-I;%IY2&AKwG4&K3`jqc*Iho}*M+%mS>1;qLnK? zqyK%<`>#h%6D!l)&}QEQY_X<$BrloL&|f3pYc#p>x(}X#Aee&Bf#&60f-7)jq<kb^g*m4eZJu{LG*UY*<1rCq&|5nN$z1aVYn1ufg zeBdzJX5wnInJWV0rRf|hV^V`NSH&}xK5TGTtk;4PntIY==b7Hy*T%gFN; zi~q^o;RkE}I*}WJR7$3#3{)vv_%D2w8oKH~&JY>CA5j$%Ae!sHD^-1q53eb91orL@ z9Jy8te-jNwrDTRSYYn2W9IW}lM66S{CNi=l1Amu9hFtcgzHmy$_*BNliHvN?7@W#D zgGX54Yp&<%VTK%TM0EHIVl|?v8*33Gy(RDtzFaOzk;^X6=K-t1ITyVvsBzDbORV1! zmDcar$^3FA#ck|NrCLL&PQ(HcMa!V*Kt0Q-}p92bcoqZ_elQ7g`_al`ExRE5>FDvXE*>3 zxoy_M8M3GsI_rkcJdx}-FPCAqaAo!}-y_8Y4!DXRzKL`0=yPMiQ9L)n>pa)Nng&Q= zs-$E?a*dgwpr3#o&G0shJ{mmdph-ZB#%_0HqK6|dxOY|@t@}+ZLd!UOTG{f+>z?Q> znNKs7pJ+kxCBYT`njsm&O2WL+))I(lo*tc%^)xhkq`r=3uNgprxp&x^w~*<4I!iLI zO=eEFGbfXo{WQK*N9xBVGe_E)L&?l}8X`VYe|9nxr=;bcB@+XC7`)@@oWS-B=to$e zZ)`?%K4iGD1XBDhO9sLBZiVxc4)Jr8^49f2#!&)OLFNw*%Zy&n7n}H^<+p(&5btLB zMw@g*e)10m2>2h0F;3$MZok49hGm_)jr>;whqExz_V~v6+21&=Xg#TRvOoKqY~NL> z@;RSfKF2qha374KW?1eCn3M2?7T^dOubUPf!{u6g^|Br2ra|~CXv@3Yj@{nMq4k3& zYpWg{k`X47M0U-DJ{fZd8C{%;2;eVYtxiRh;Pgn|F!EwQXA!dI-B$cdi;YJ&R0L%Qqp@id;m4yS>iTMs6Z=HGdoei7?O zlPUev;va>i!9UhcIT8Q(qe?v~|5)=%dVQaRfB1ztoGg52Fx3Zp-tWObFWL+~zsZH<8+rgSgBKr9c5~t+oC}aO0wz{8uAl2Iczw(}gb% z$`fU#+Jc5pvDrcSFlb@34Am!Q7SEtw%v~`lGI#y$xht>-9Txu!c*6M};~h`gUN6_R zt~gr=@`%MQz_I}9Tb9~%TtdN<*`6L zULudZ)Z;LD?4uqZ_K z^m)MoVWdq>`+7Mx zEojLoUHXai*xYs&Q>Az-WLp4M({U#q2XwUnH|Ar@+x2&zGSr$6R@hJITj==_?#P6C zl@mEJx9anRei{4FW4Pgx#{th1{Few0iT{5}drqXK|E@eHf1UjoU^duWz6a9&b;0Nu{2Yzka1heV>EBwutfa6#Vsh+B*S%H8?DHnk@V0Xkr(5 ztZ9s+q%{`A{H!7YeuBB|9(UAz6!RkfR+q9QJUg%kPv1kZuDUB|klWFYD&rbn47C`S z#tij$LT_Un=le|<&^1FdjV*x}O9CIy^>ZY8J}Ou*5v|{$zE5?FL zMqJ(3oLFIaBN{hkdL{fik`H+QM9ynWHPEpTM0e+%-wYD}>Ed@cL}$VXnL zo4yX8ytrVDP{ZN5{u0+>PjMFP;Y@9LJ3U9^)56uzd*XbLYT*gKmXCzZAIaAiiLzMU ztsV;~D~Gs0jP_qGYA4)3T6I;hrA>S``)1T#>>=plg{dI}r-I@@Q(NG0{+!d5o{H1R zJFyw6N!I@q*Mbro&$YOqShd%y?pLufBv|qdEE>fFLg-Z|3=Q2LJ%)_vrwS}2R=0!O}~ zh2?(6NsF&JKT|E z?a#MHJTYDa44v9SiEXLiCngS;e|idJUjM|@hco=;^1`__ikf@{Z7p6X*;Xfz+<3j7>rLn0f z8nWIKTfxv}puJil&w|qj=DnODrn$I=akAp2%iTLsJD)prNc=Lwz`jYlD;-(PS@MTZrT(QiB1`0~3dkCz@=w#xL)V8UE z)$W!TfPe&W0G~X@%+`3h(mySl+eZDK$V^DnC(-sS;}HJykY=~Ha!jcfTrV>Ud%7gt zJ@-ZKs*Uv7JgUdxT&Vg5=<*WGN6&LcX=T*}Ega?}Z=`>z7yJAacf}5lNMecKaAnjv zo|7^}yd!v_qceTS1^fH~PC~$`*>{-$bNB7{a;8R(U3O>9E{;zvC+zUigw5=ZV zHu41zyIcfUaqoj`tNkp3Hw4x=8gAL+HSUmIH#oqU77SG&Yv-sNg zL!13Y@!wkfRvF1(D_>vE;Ug56?`f-EYkH%fwrV}FT)khNm;eAe-Z-S@d=X?eo5d!|Q_}nCBpv z|I?BefznB^mI-H`Ok>YDBldl$#buGjR#vW0ivsP#}-6Tw_=F+xr!I+I5c%QTR#S+ zP7F7>4!*!q^~Ms6l08@;7xSi3m+WJ1BS?gwtiKjW)y`l)0C;Z*eVN7U^k z{Ty#E*!#lq^W8xj^Zh-(JYJujr&3Qk-;eaD?{nz0mwrb7?@I4~5`Tmr8`r+fWwkC9 zasW?)KU~x&!?hx#8Zo(gFo?vz{zP4Ejh|uBYhdkaVYq>h&(a?5BGVh4k1ukLvK?F~ zs*bkmrZKpzHEY2pvI8Fv*FtUTp;8OA@Gwes>&uQFbiXye9X+nAGVLkm|@lyrJj`D&g)U% z=b*QFubrA-%%i;|zvw}4@M}3eT>{ae+0fxkw0k`|;d`vIWc_w6%SFg-ESt!@#%>^4 z?C{)=V9Dc(Pa_n84EVG~GNTiuj20~7ueah;Ehw&M?&wShV)i2C{h87hW-ak>PGI3Q zDItO&`ek@_w-%Jx-*9cnp{BUoxwGo5IURycMZt8jM*W$HJf)K^{TZ;gG8vZ)&N z=+sOMiS^4Qd$9kvEM}`5BmBRR-^>yIAHr1G)A=+$-?q2n8Ko`U03Sd-9iz^4%gQt| zksUX>!e+wS`fpg>i0V7Vne|mxe0VE`ijRHxzPu4@Xh`m@jJ+)|LGm0|g6gD@ zY}?1gyU_Ktsy9)^G63(J8~b1Nc}w@xOe3wPa)AZ~u8%!z*MEWn)bG1ACQ(8Y;3G;$ zVjP*v94zt^y^_{AUP@7mKiA}~*TQ{xl>kH!Z$wh!nBuRqi0wQnmbN=8>tW*vn{{5t zTSV(#bs^kdYx6buZ(($n4Bqf%j~U}dPksN1gZ)q`u`TMO6m)0wZq|Wt8-FE zKf8{>slL@4s$c$v_UR9Fz<;n(f)(4e0x=O-z5X=d+6$IEhGAd&46Yp#ZX~bm81BPo zR{6TN`0F>rpT5X&KI{JsyUe#gN7-ZRTFN)C@c%yg{8|6+u*>}PbCf-{E{TM5lJ(#7 z$Me$?(%>;$ST-HcPoGz*C*`M`|DIl-@IO`@=i;>{5ktFumkJdo;zg_%2NY2Yi=caF zZ#!OuQ{qKn+wz|t$JP6=JmvG1D^RIoLEy4tw0b3wbR(!G2bWbWh~9450&OOVC=FRy zCopWIiO7~33k|Qa$=Fy^w$aN?O^3F+9UHx6L@sfF>k2#!qrhxMMacG?&yM!IrN2Z(mT3F*-6Fb)Ox5z?VcLOL|YADSL5=Kk2V#9VlrkPf>z z)s#l?)fvQF$XY_whODK8W^iUne1@z-Nn9q0jS{sXt3;)alGHXy?NF)JDs_gWb`q~a zKCQ{RMJ3Xh8K5sJz(cohsK>Dl2oc|5H}EX1$x{Iy^0dCy1bD#Rr;z{;EfV0NO$!}@ zzBrIld&WBE$msU$^X7x0$89s_G1 zfBDq%dFIG8`Fy;7(eJr*{I&Q0NTcS-e0e-Qj8Lg3rH3_`qAdJS>kZ3$b1Z&JJ*P+E zPeD%Lu*8cvoQxOI;wN52mo9iQb1lk}^^jIyw9hS{G2ZuB*Cq9l_pmvh5 zA~v}lO%f&rPC%MG|O zIx^};H<|qkIva9~t|qgf^zwp0!xV=+=UC5~)q#DNr1<|Bdv7ivMg1astOt#a?)}f%Q96?3P93dIQS5&lXK27x`xPEB(U?xvyYCCkfhPYm_a|wSp2B2UKe)A3ZA3Ad z^8~xTnGc=|(zhuT75s2sR@zt<@HYrAmq;h?)fi2xafQDEZ)9iA3XpSH@&D2(95gl9(EOhf*W3;FGp67ZxlOQbdu_`sudr}EO^jdt7 zO6^*3ScX98thLq{R@!4&U(5OC@I&M=jP+dVRX5v(cguric${s24wW)Zr(`?@rw8^l z1`Y@OGbHA(yJCw!UK?6Jf08Teb||oHF){0{uNmC-jAPakV=eYQwy%l%QV1+^gB_RW zZ^MSDE#Fb`;)8pD)Oxq0mC-RIdz?J=#7DKhx`x;+M}=-+5(m}MXKqU3rbFZ71>Jp0 zn7?An#-SnveoF@0;w+Vnn2b!>TG549j`4}A&}hE-t!%a{@ZD~N!*tc(j9KEUhhb{L zxxKo5H)(&(crwf9=C%SnQv4UCy0gR;srrfezXk>j!}$~BFaSV*5MS^R&CsgkA8I%z zpAdP;fX__G1*r;E`Rl2V(;baHKl80una_nex$#$e)|KgNSN++o(jTETADzv&@s#~d z@F}$(UGOem0E`ot*6c~eFnYPOk|?Rh^WqcgiCiq#T9t)o@S?YbZ{bJAu)2{yX2zdk zksKS$mN(t_sVZdrR2(jJLzQ($oTd7N45zs0@Q29Z2(bt9^p?qTfF#45q-sESSxW#I z^`ScL{_9cFw(&cZzz|^xI=%O`o$n`{? zEtDVQ19JwScpUX?P&}4Lk_yCK`Ixk(g``X*^qBMyi>09o_(o0;=`iO4qiMk&;k*kD zizkQgOk6RwMH2L^AuLU(J>mEnOJ=pGR~T^kZjzs02^iQqQJo_s0TU9HW?1GEnF2?? zE^VPqy&kb<5bb&4S-g89&(Dw_Zd@$;SY5uEe$(GBR^bl)xx@u`m|3+&ZvbIWS(n^N z$t8AdW{;5|16ZFhI3+a;Ux5zJkipf(khpV(Sg~-1$}|eg{5gA0o>F*V;gn9%p-Vf#A5&U$N68DW zBYz|IL_hmv&kE3W3x_<$uhp9ozCjX=$AlcY&XB1QoYX=;m)0YSdQwEgU9lzvW}0iC z0(S7C{VMuYkg~BagY(DK8c}1k>DR8z?!MiQMCH?CrF=Sp^PCxVZUOW9jug<7FczR& zFcxUX7D{VY_f&|QJ*-A0bkA@8#3ALEd6DT^-)L22eJ3@n#HgGRo5sfqenwZYqhmrN zY5r^ka$J*y&IuioFwnIutNgWe$|u&t*w}gkzDlWth+b<+=M^BBi0H96Oww+3f!iLZwD&VD>n<9m`m2{#{xT>(ORD)s3v4 zUBexjkc`|FSro6bzf|wOB$JnF9C#KJFXj3|bF|fGX~CWKWkPGU6v@|Y%odmS=&#R} zpb}1ArkU`Ur11X_g8#ey+%KsHDgF!K-}6FD=6Pfy0xut6i9lj3`YYukh6U?HKBl>z z%Vu;ENL;+OL6551%wPTvF`I3|j54&|W)1blo$<^#AmCuVDk6rD0tA2%vH8N!Xb_#^ zVm|AEPf9)~?n8U(_fks2vY2B8oRP7g_LCkCxLbbsd>sYs`_O*Oqma|i-=^27^xMRJ zXse&@oniK+MTYvx>C|wN`_Ob_!ed*t3}ft9U(r}K9@jrU_me-fyJLx}Kc!Cu-_^P7 z&&}Oj#wY4V%-ojRWlBSAsr?HBXsK;v9P+y&1MbmWyBuV}mMY9!%-%ZY@71l8Q1BF1 z9~DD47t8{JTi?jSv!=MzYYZ=yduP~}+HHEcNKSrlVOZYC@KP?6z{n92#~MAFy^#Uv z!Eq!klV+pYkG-sA1jjkG?=0orb+A@<_f3{9|; zn!}Cr>$sN8s9mBgmTWOSEMR0O>PyUzJ5o@3&?Qx|!qdf^6?f_pw^a3Ks-k;@XQig! z$T!ikZITupVDPhAc+kqB{NW}_PsF>#{0Txx#?xPw%|5KY=Vr#1+BR{WwSW_5j*kIO z&E69L=i+@9a3)he1)T7O07tRlemoGMi~M!@9dG9Zz|368V{D{ z3E&4v2e;rGEWi7nl)A}r$z8izXcfH#(ANNH3-S_Si-fbc*pUAz@2-PWEy%Y3`4$EF zhXh>vo=ZUfFz}j9XMp@Y+%&*8BTJlaQzIz_c28;EN#Oo7DpGJiN!=Dp+%|C?@E0K9m znm?u{Ug3R!J9#fRAh%po1o_>pTKF0ukoXu6Li4d-D>fj_JW3VEeeQc9uEz`F7s4ti z6VHp6sHgYM3r|@32l0XAA6JVOdH~iXPn zV$BG%H2YQX-4Z==xiH8wi9T+~vE^&K5+jZJJJm@_j6dc}#D8RdN|YT;{ibuL8vA^< zs_!9i^|LE{@VE+X!%UieMvqJ>)QzcyT49dXH&^ks9NpIWwZ2n{_BeHz%!yXmOY3_j zF~cTF@nKruOuc22QWNE#O=IdPuBJxtPDNH;MTzUHB}Obai(ilAoIw}>$#f6~HxH9{ zlu~@*j)2Bfb$6s%KAb_@sEops6YEKl7ys@3OUZ`?@5)J9ZsN5r&KAd&a3KmF4Cu+g z{e_IxyVTbg-kHZ9dgYZR{sC$m&P_yGOyneJp{>H%jhPK#$ddRu$anAKaNI>aS4M?tza)DUy5KbKR zF7rgAl4(BU5=Bd`7L^Ju?ofz!$xB-s3(jSmo1cJ<5V1$z&Pm5mQU{rTkz9Oa!moko zk$KBt?joL`Y5Dg1yezf~wSey?yEXvYCp7hAGdC~#7XLJv@ z;n{bT@|D~(dN3@5!0|~USn!1!QsmiAd6O@mI_`_uAIM8}nEhfX*GZ4O1`7u+zm=VP zZ)7A_LywZXnorkT8cFHybZbpDA{`oi=eQ0|DRlVYAM;Dh^}j?B`dg~PC1MjGm|XXa zLjIcL$hM0AAkNJp-lfeBlu$oGG3SUJEz+a&mcgOT-+&`{-?d8pw;(Y_p}1Lt;VxV5 zu~jr#yG%EpHDzo@REFq@DqvAZqg;Hi8y3Wja0VU5mCpz((8>MG(W^Kv)6P|0gWKZQ zyP9({T+LHPWyHQH(64B%tKmqZp1*Wj1gb*9{Zc)VQNJlRG6jqHGz_U>QSk+8BBz$B<+74U})Oc?;gV zjNOsoFA~+HM30|5s>$Jn5U;GPT5FInRorfSD^n$qX=+T4-8d=A0nz(OP7MS_~o~P1QnaPk$9g2sZ4ep)S%V!fSY3oS5fzFUQT4(h*>&5GR04^lSAn@jFyVtF z1graZ`-hsXGPp=o^|;cNr$x7t7jYFDuKt1hrR)avacv-SZy~EIk+NE-Rw#u%s&+GJ z-MLmDOc#&nWrT=q(^p<%|C7|FcQW|S! zAGl-A=_}}OH>+l&(>1tJMk0y~Mk_8Lo7py}zj{7eS74wo96IDO+E|}+llZiV6GjX~ zmnteES~KA~ALW^I9Q7sQVG;j&Ql3`S7iyvPV67fGn}WW3xK2YZ5ca)|ZLE$ZN0Xj^ zm>!k*G$A6QX0>@L8h!2YDbl9(vW{6v(2uI`{#1Q~QuPh)k}vnAPhd6ueO{2n?9V-j zvh9zqkG&*FM;Zk2!T7fY>w`k}q*dYXvy zRsGJ*v-GldZmKch9IY)ityqGr7W>w;V*B*9f~dY$xPz~?gvnW&CnWCUgbtM2#OK3mzB6_#BfW zV-IG)f|QYn0nQ+yMfJl*7(J>~FO*unrJBx4i|_fa<2aJCG85&u$;31NF%TLjAT#nK z!C#KGhwq>!er}PUsB;^S_wvZc^ZT*J!9lKp1Bd1T%6lE}qb{iOBB&ACdKsK)jox%5 zOJTCy@(~u7;5JW|f0?J^11irEeFS8>1@%8U*;@DvC_Yv$WDj)BJnq@H z6uVVoVSY}C4FyWpa28-aMm6eGBcLjo6z%_lK#@gio?gC2U-h*S~&H2jE%Sj&FKvnvRUm`wWAa%?i9{E$(DDDP2)=;Y+7+>RJ9{YRU44t(C}~n>7I(o zh5oj9z~a-w(%*AOYD$YBJ;&VK4|VNA&PvMQ+TRIwIQ0BBmGq%@L!(Hs_IJdDEXmC8 z+(OBF^+RmDt?}AHSZW(Sl5>kf+@Op804Zq6r z<3sJ{CgODTYV4&AYyD6w9IzkG_n~&v2C5t0t`lU#a-Ky+V8SG^lPcAgNku0=ouWg( zBL}Z!s@Ph9-zXXUoV~+>42H`jWbmq#4DPgK@CQl;%iUzi;H~L0xVeW6rucqj@KMK{ zYZV?0Zn9>=DH^%|Zh<4{nBz5k{K~Fh3A!HVcx(h}v$`jcbrw!P*rL?ug=&mM;iujZYK)!xE?! zFO^;*`P2KTDGnEV3j(&Wt*Il+oh2)uQSKl(=MW2#@J)-)i@kk=82RN-Pky3Dvk5~9 zIg1ffD4T?~)nZC>Xx|aPw$ zSi<81>k*4a_AK?7;aXWCl`%=QFg8LWrm}JTtQ@ZDYBV$75isvFzezjsUM_W?!_T^e ze<9vKmvD98*5mr)fXK32c6Xx=BjSZ?J}oPAJe$BEB2AZ%2m>&BwDbOQlxWbP;4MHI?ktMzNX$nEhMe~1tHf$uGS@EUfneLLe9c#T8eiv4xH!D5cU z9Qr2;iL``dptdg2KEe~28MFKG1j9T=5UkUU8;}6^vbQcngV5yb>SK9ZlinUvOsrM- z73}ARMr_<9s)I5xw^jx=x8H|u?Lxd0YlS80B^=Bdl4NhmR9|14!Og)gd^9HAqbiRh zrdS=S1gy>-y%tvI4!?3DR+shozsBl73551;^JA0*Pvp)#8~R%K8OG}#+#HiAR0?`Z zB_|yGOCmoN_=nOvrbYl6`m3a3hw~r+@FzFxw!rf}`R|Ct@UJf4>^k&M*7mDbTq0mJ zYEcJ1^i`&4QuNc0zAIR@7D>K~_&cIcuqwF7`#9E+U=s{1mZcv;IfgkJ zP@%b!Ph&se>6rQ6YGIFqwF<(m(U-57TtR94EA$oCDy-vHxD%>WR5I@DLB^N-EcjdF=gGJrsU}Z;Os!Q|@Pk%jw8*tbsKb#|n^_KzQKIlAu~@7TZA6Yb zM&^R(qBOT!>m?41&_;`Y#!7n7UE?@hW4tl=MQUji;6@6z3*HySzmbC0tR*!Sw}St3 z4+zi|{$F9?|6Yavdc_X#ztUs8;jP#=2gQxwPwIMcTdZ{Rkg-MjA&b{Y!8Sz(UuPy$ z)w8}^EgF&OTcVaVHO4Ja!7XW2z{fTfoB`igSf3tV4EqC9mmrEn35zZcE4r|RK6KGN zw^X}+vyg_+CbC{gV_5w1^xj~9mNE%lAX(0LR)ScV%GYCEbUCp;gbP~Qfm>+@ZlxW# zPploZ!Oi{^?EsQN`tLT2LZ32=4}c@q{9V7on!hgB;C1o41vO+DD^cshe}p=$DSP4l z#FS~FA0%m}LujVUrWvJWSv14SH@-^daF9&kz{CW)j2_VlfR8nydEogTkyK%iYDPJ{ z5LOQz!efk{X7t~aP#eaoe8KN4!M#mM{O+>x+ggh&{FXsj_)TwY{BF~;9I^e}Xd`RB z<92hKT}6)7C4xY;-)47)1#@5Q>@C%TQ}ndY1qTa6Ot3P`V?*bQ|Ku$)VDm@(7%isG zCvns{WhF9y`7PPrk@Q}}#m-dQW?uEZ1h-CCZ{HU6_H3ozwwSvv`VuD;{ z&?VB)kL}O(;Jk(mU$N*T=0K^tZ@hP$^=fTfY;K}RVlggufn#g}!UQon?TX1}lrj+9 zxn`DJZd=xZ7tI#6PKY{Jd!oaePij(-FUp!c(JI5;v@gq(Rkek~CI0+)t(+(Mlt{{v zc}h#@<2L3MnSMYm)v{+hOs2K0Q=ibu?PPu$^PvU@*U_JU#&HumrKw?ry?&@POQ|qf z_!RaA9~U8XW%>)1ogtpxLqv>Au74`cmm~kWeDL))f68ZU91AkQa@`Ssq1dky_R*~G z9zVYc`zvKL+%2_C08_vRgP=0x|BO8Ir6tx^J#D1Sb({GYgIF(G`k07MYw-@Fv}{-YZLu)!Mp?moxRZ$gA~f6L6R3clu38zEZ50qJqx#CK z#kLHDJ^@F?GBB9o#J)=bHg~uMZdv?1w^8Kg$bi(DV$%5L<#{XK)4iBeAdS zQ|cfgP|H$fMSuI7uu5Z>aj5D2LE(eC=3b*m`X7-m*n;`yFwtFK*CTZ$+VV?-&0GDi zDi0x+CBbe7r}$czV0!mO@U)@idh~KOhCCs;(Mk?Zx{s#t5NTT+&oN; zSG@2hN**S1cUdRey}Rj?EV-Q;FFWZF{{|7CQd?xmD9X6m4L*1{%iYvX1eO+$HmNH) z6&kmpdbG($#Hl9~U@q8ReG-@~byvKqExLy9r$wtiB|XC&2?#L-p@1)?UP7ImsmaCW;gTJsh#z6+pRb0-LRnz-HL4YZ*_YQ(eQt`%4m zmc`~HNN}-B)cnwI;?IJrjiN%hjars3wUDm2@EGhtlRgF;6qH@cq$ybBSIw-W3O=u8 z<>K7NFZQ`^>AT!qgln()7Nxw7PrSzM^cSbNb>q@@2##&RGM5(fiD(G2Q~;Z(o9?MD zLP9L!yM50>53T0jMUd|AFc>wOKg3HoUSNJS5OZ9%`5r$a7Vr_72WfWu&S$(UbYpH_ zynoU?$f^mJOHGeclgR8ds7CNl_IK0i@di078Nse%%v^#irtfZv!)Cn9w@dZl$9ZgF zMQWFz^d!jgAu%)^Lzc3a(kL@7W|TYO-R`ENSz@+Z^d&Ld(RwMpfGnA2ObqD2hV;3% zF@BrOOy68KycJRMy*T=W_R|Qb<|HI!Q#XE9vWTCcg@%$WE5?VzkY+YjLz?lDp7aI2 zKgot(o~Lr&5-s$7>}fcpJn5D&`VWZq>D#67%Hqmx@&4k)IVjxd*4(?jk*ZBnqRJbY zGYowicUreL^%bE_IMYKVa)WXlFk+!tU*1Ro-x}?Ea;C!3h?j5tS;hZxy1{_|q817Q z4^O1ts^}dzLDi^8dgt@#k$NiIXa0=Jq&zzJxD*}Ett9XfB>X@%nYF0OUtJslz*l$`WCpAB-h1VHJjIB-k2ZcAof16kf91vy- z|Gf{cdQkZ9Rq)?_!8Pz-Wx>EWgPBS3UqVu7p&yHP&q;W&#E~Q%YJvy9s(7#;bm^=| zSx-%#oN0wmF&~V0trBDsucjwE&IHVun^5Lt!XPWyaWm|=Gks>@&yznuX=DHHNl;$q z+3>dsn!CmExy@q9|5VfR z2O44HOJzCgHQ4SKM`oK@r+A7uG>Ab<1b<8{$8ZMNhJ1)bcjCc>u}}u*Qgih;v1SX; zS+-ERgY%%O*jWnm>5>;Tzt@C~BT)9s`QLM;+m2mgYs`z!IbqEf^Zqgw+RPifTb#JW zAD*Igd8)Kx^>mccSwjTSGA35#C_m;u7ceIn+JftDNE0A1|7GS+0xN@pSXu z{&GKn`Ih`-o4fe2#X%K5jNQHqs0fd8Mp6{dN%I&@Z!b)H0-!8vO!`}1J;QAr{Tt}U z0_CVf980HQo^ST|Wt3csih1MX+2^R6)S*3d44)!|>F32s#*B(+tzxc79kk5uZz1rLp%n?Pq7WT_3zvcVLS;FHIM1rCd6cm?guvm#$3yLifl|+cl=tObH1;GV`DuQH2sESgP zsf^QU=|W2vJ|C>hhuZpSYzu-GO$3v;M@5T!#O*zfmbd|Rf$#Hm?)yD6A<)+Er=LH5 zzsJ{yWZv)lzRS7io_p@O=bm$}MDy7LQ08w7hgP>Yd@y>`3r_3)Y^Tp16+EC)QQ5N{hTxYhuTNt&(kIc#UXnp}3#aCk zheypWk7XlC?hi#W>(Aza`#&&n!}z`gMfS+-j}0{04YbD^vVV*w`?m;$WJ@N_!Z&qc z4xSjAKwufvrJNa6*KpiJwEFkh@%hnJ`;YpHHoyI=t$ki-vM-A#Jj}hg_J2c*1l?DQ z*`HZxEA0tSI>7A-PvAFS`;O$%kw8_!++)i>uOoC*N;qq1{w2nW717k?oFm={F|b!p zW6>H;PD0MRaUkX0PSoy=(d~og%8xjMSmhzv~K!n$-|c zQ8ZMW(T2hfs(X=>4b}Uk7kRH-rzNe;YWF&LsY?%j?X+~s#%NVmD|-A}w8F~UNndc; z2z~FTYGMb7XzAP~i~|b@U>$Cj>%ylj#_hHcr>|s{;!L^m6$*25kR6^MG1>3EfnFZ+ z-Xe`!at!-|HDHxJ!^_c8*OXxxPbqYE@#pKR9hE8mt`XkuQ^q$0u?bB>0_ z=69+GD~Qz1_xCQ?k^cHx;cOC;R2JRfLwLQeM`E$Ye+uePO_vOp}aajk3 zZaRf@>^5GECJ8L@`j$v~1hMilYpMFM{(zIyeP18}Gkp@QOcYhX%>yYy$MIz96@jPK zCEFtnou5b2VdCaK6>ixG?%Rr!TZt6Gw!LrtUc;Zs2oH3N-e;B~Dxt;Y4vLmp+$BrU zh1Z5Zle7Qfh`3~(&WYDy?lt!5g~VHU8ab$Z?79j|9j4SKrK0a3wc1k0E44$Zot8S; zQfDc(E7Y&=)12;?D~<%@$zpI4rX1^}r-blKnh&S@|20~S5KOL?w@Zmlk>mfgQKj$= zRn&E?>N=KsDhS}OcnmG^Qg(gW(-kkJimY(bEq88h|U%%6QTMqL2$LU zEACEk1Fedk5Zu-O8o~WZINXll{?oY5KOwjs(c9V3+iub18PMCe>HLX~-kcI?5AWQ# zh>bj{Ys>3IY$ukNWfYYtnygzXWe&U)Hn)ajKTQl+9J|W&)%<>FHX-=zD{=s=ZfoEA z-PvT|c3}c2kN*B1Hn#yb_aa{wj)9>(UdG?(;{(UQQ`$-C7j0i^=|e1iq@_1mdb6d6 zEq#KecUXF-rBAc;xt89=-@Y(nPG1@xDv8S2Y2MGMi1-=J!dcZWufaPWO80 z@J)bol=$0G!168eH!#o&fBPW*7FbzEI0CdQP4PWYS)h_6oY`^ge&L_bV1LCYp=h(E ze`Ew#xAIG%OW3Vv$0(F#Z`dKetegLzLRY+>5SByNJSZuTF8_m%vf+I5K7(gx_wYXE zM||KtenXH^D}1uqyKlCZgU_=ZJ)B`+5XG%7>O9YLZ*r`Mi&8!o2Jf0C21ZmXBY^FS2*K${#B1^e5Ig4CJS z>gDt~kI_ArglM||dX}y(B2fv1D^E+0IHV2{*{xegux_o-uUnOFZDrkRq;c5D3;w!A zK=*56wq||Kn)Qa(tT%!+E3aRR4WPyRg7vpZa&#SwRb6rp{6UKq!5>WBp#H`Bc>4fi z9q47RBo-X;SF0g~x(?JJJ?BO9&e#a^g7~@OBRbdgRZ|5_q;P%J1bKoeqUF&i%8d^! zH2z@xm3p!s+7Ur#t_hHg>WH_?3$x@fT@;NDoJ2Iz};;n};g7Mj2zt85xr*D?{ z!(t56TN!tI^F+3-b5LyKZ^q4UbvpJe5YwaS5uAK-J?hh2PfZ_zZt+7d+u$CE%I7$| zktY28nJmauP?wxp24S-`9>)+v(FaQyk^+*De7R-5rYAY?MLyh1ptJ&d{_H9(^9bb+ zali{n_l2a{+DxRjH!!$oZl0Pxa3~6LN$v83ydxvH(-*sg{Ajdm@S)ctXVr4O_8CQEO&^lD2VZ|NPD-f8KR zEq#`yck#Dxmr0zcP*A8Rh;6(jb_%@nV_#H%7}%K3BQ}SNbw?-**oN++y2X<#kk?Pp zdZzestY@Fvde(u)ICeZN;W^dCzATdNzfRlSh<42B5p1uY3|qwVpuauj^}6J~B8j@> zBuL}5f!KQ+AK*&Ucf8$aIDTlXpcdvdu8jR-w@|I#?lhdAAx=LT_^)rgQrxc4fBpD% zW<&Ac&&r14HLrvQv^Mbg5_z=%eC3M51;FYH{MWb5#(({EzK2t#$2~_4W;D-uqs%jx z$g$4x@D(BWeV@urU=#P zfWB~7Gxl{xzAc5SQ(5H&7QS7uk#_GQb^wvoL6I~bUD_NVX*c5V4gyg1H#Aq1*d*V{ z?0&)cvaUr(%~*;E!`Z@W%Q}X#E!vE5!7bQ+!s&%0Ux630{XBV;Gp`!isnN)QOm1HyZebw}Xr?AJ`FSc(uJ;v-8QdqX1 z2&XxjgQgu+Ab%je*PAVsg56*7MSG~gyk-BLj0@-yH?(`5l_P$?;rkN}Mf|Vxw zaM%)Nn~!0~{;IHpN&QIkT}V-hPR?oI#Ykdp{8Y>?r8_ZA7>6P$cGH-x^~+AN{zj|5 zgT2}e@kBeBikZEd?9^nh86I_ZbL{2pvHAW-tKOJRAJ$7J$U-W!3n<&_?a+ZsLMQC` z>? zY&zHN$folftOj4sKn)tdRy#+3#B886N)zxK$X@D@iZR!yT1>@SSUcVDNPX>wC)D^m zZTjR_UA11eX`Qp5F?&w=DpkZEkaqQB%)(aZ<_F`&dAvVfW?;yWA={N;y{P@V`Ok6C z?Z@k4)6kSNObaLbzu*khVztibGCCNmw8x!Q+F-SQFas3r^SUXD%_{9- zXm>eG{l-ZTttUc*?P0YY@qThS2j)lVq^{d;7O&|xdAzlWPtGI{8##`K8|JMnlEElP zQ|FUtb*AQ4>v*Z(LirnyRcg-Pm=@C$29k?@j|}XE$y@3jXr)J~Ab3!|Srs~Q8*+iG zbyHC>CQ$m2np^JuZK@ddHt)(Qg$!Hr%*4z!1f^k#?ZJIul&Kl|axg-gN?Jsv}(qauE7)c77aG(s|`^L_Lus z-~W)jkop!(d51pU1s>qF<{oF>rSknI9**z(oqRFuT)(4f0(1PS7u1)Uu@nnwcWoMN zF2s;xA+!kp6aHQX6IkrY4@n9A&HfwwuT^>u|2y^=UrL^w*SGEm0ty-WdcQm3AA5ag z@d|g&K^F20ldzoExATzh;q|?$M~Tb|CXpL2nNsx!7UWK2pStO{E;WT6L424D4fiT= z_-0XJ%HZ!^>-@dvRd_F42322 z32)^k&}=vQ{Bq~1Z&Lo>c%Hg>+W-H~Q(Gcxsd# zr)sXv;{6{VoF0l2X1a<5r=}`arE31)`RM;UAAKY^pZ(J3qaG)GVjhiR{LVfv*zatc zWNbmqX$0TGsblKeY`^nBtK0ANpPbw8WXY>_{OcDLE}z}@JE5uUcP{2T`<-a}zqa3* zK;F5^D=`!XTf216w%S{-nKHY+t@if%=`*ittz8Clj4$=hK<=`=*Rz{ymlm4<(d6x? z9>_mF!qx%s9yn6{KnD1=eP|9f4&#H2L{UF9Y(eQ>VHrP^d7btb^N$@C=RjP6U!RMA zn4J)1PK0j`^+0WP9k7IXHP32?RVKypDZfuwJ>{eQPVP(FaE8l}p~YK5EMGhBdpy zZ>!nVS{$pi!X^B@@PYpP9lTOGH;{9!zN{<{s^t#&t+=PoYX2J#+$le+N6n5We&g5V-GmN{coR zzNIcy-9c!7DCF?smf45b+_IZp+_>B9gNwH?sP{Z9GIoR7I8=(W_b)6hDsHKN-T7?% zh&KrM!C_SG&E^GyUla^oN9GtboBQnI*PvFoy8@mkaZsWD~Q-sl)G?C_A`*VF$_ z@V?%=`KL&7h?4sPa)r3(RAfA-XtHY%yjC!q`7VFJU&E)n#77FUCA9A_doxek3F-e= zJ(;yJLbtS7k9+Z>ZOSjmldWm^v^f546`pKGT3z{Zh2<5M_nalPpE~9=S4DfXtKuB8 z*;z(b2O6sMYovGw@FzQflw5L1$tCbg;&IXZkVh*Bag%uMNZ~ z@;+7Z^fASgN#eD))fPreQP&wFG1ZmoEV8F#|#XWv#IKb-YHeO zPCapOY^v>WWY+2Zk<6R$uC`UD-Mh`omM+fcW$?%Q)<}?CM{#^lWse^sOni2ZdN{As zyE3RHlf|lud{l_?2c5zhs*tQ5WX&sI0{bPWPfV3g%eB{g)3`DN=DLC2K7QHHK{Ry$ z3EIU>5vd9Z7tnXj*)?aK8Fulr$0loUCz6JRqDY?I9!@T|U=zu$trnA_Z<}4WHRYNq zR}qa_W?ixR*2Els!Sp;1U)|p1L)PO>R=}ZUzW04WfC+ebXnYydygi&=*~AFc%tPg=Ojl$!mfQ`L8dCpLM$ob;l-;!0?W_;=1hO9kcJ!9+(4< z_GrolPm3$$i3?P$J=%Ubei2Q5%e$RXg4ht}6%WmzAnsMU5Tx$vXkS?Kt|wo{g%?D@ zhICU{&!h@VyWkmOADo4px#QAieQZ=Nk$ zNf_bDa;55(ZTu(^MS8&PbT8a+Y*DE3X=`!7 z6*tn~V+k_QqW4N!>69>{P0^vX%OW~>%2A+rc zt8q=Mg}E7mw6XvB5?} zh~MX+KfXW5L3LqV>X?@MNJtGhRzGyF8MtIqj>qYbc+7rN%Sqyc&$nfb+_GQOr%eW# z?8H+p;_)!D);4a6F%w?%CaG&ah6-*k3G`Pb`uq>^wY%3z7o77V6&cnJ6xOoXqpNk{ zIACkbt+&wZQKy&Y{F_W(z+gbT|Kw+(6}xR}L2OVEXo5c?Hbm0rA~s~0w}=gOoe~?= z&${nB$>A$ba(In(dFo(ZeyHFTPT|V;E-WwkVV^}NKZINr3;ZhfAzNO45aQnk1Kvyg$;%H)eoDz} z`J*Mc?|1>%=KXPFPJZA%En9!aM^lGke_O7j+mlhM5id&7p-$g!_5Nu-$7fi_FOa^2;eEG~R{BD6LyTWPG8k$Le zHd3`N{&HRFFteIS_KqY^bA|;~Z^aKse<-I5%Vq=I@!Bzf9f*Dv@3^o>x}; zPT9Tms?qYT6gSJXta^{0#)z*-xa{d9r4WYUL1_YcFeC}QbGK!CnK-<}Gqq;g)#*ZY zr7c*v1kGb=#hBpfZ;3;tOFy|bSe`U)B>d$&{_^xo-Zxo`a2abdM!-qeV0yrkOLI(m zAc$n8no+=@?*Uvf=<_5^?X-^bsDqJkeE1m^Ngs2r($WJyxdc9}C2Q4e{`h?Ok=ul& z*Ss1-#v&nO(?bMr8+QnhrP%J=8ym-CXQ1Wqc`Q

<1tLFaT*rlh&`m6JqBG@6l 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

-YQr``lt_-rTwNy0tP*4GNR0JjMS&PAN`Ld_ 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ÏRLGB4#xT39>)2; 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 z

~bmE>@PnreZv+LB=SeOa@YQO?`# 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ΞC z#+NJ5$uD&G=X?MHBB!t0GydzGJ}mP9Mn{EsxyMH{LF5-Ri6^iS8H|#W#EqiqgoIOX z+xNg;>Ld46~ z`(y-N&aKs@#%6vLI`8Swkq^z8s(pBBR}StwMIDKKG;Ar5PFB9HG>WLdOpW}4QnP7Sxjkm@7M+U9UcPl<7 zGX&&n_Ei?nzCl0~%sw<5dFs)AG+&%JNn(5i7D+8~NI}8xqo*v=aMHly%<~^Hc32nO zFPQFG3to#1m#a$NyR67PeO%rkuV$vcw5 ztEcZn4jpYD3Tj*7yoK-BcBcZWfjHy+GrAL=^}H@M+L-b>QAK(VxAxh^aT?7*7^y)b ziqBQ8{n;D10f?%FwKLXjU?~}>XYFdCYUvFUXS$w^L?sqjjd3^~&XNpis2~Nfx&y!c7He?!e;vQ_= ztRgmvrh#Cec*&JhE^8~Aa@EC`xGUbsq2@7&H@&ogbM+%->Vr4n)ot4rnD+OU+VTa7 zM@VZmp$6#0*ssm5&95n`l#sL2+y7%7`r zsj_<$BV|*vBR_nSAJdDh8KR~G3R}Bdk#;TB3 z5o)!)fRq?lO|q+6fc;i-wkCedU$nbvUqq_#3xJX#syC;Bg3l|9cf)k8-KM7yrJhL3 z14-{`kFdQxc+H!VcOg1egD|R6-Vr2jGT4gagM2wF{&k;B<5jFSSgzx)q?I#!5{0z` z@;1GZ6Ut)Gszwdj>z3$f3hxa!haV@=uOvPvN8iw5TkTS+^eOjF%jHyVzL2?4?figr z`YK%7o=RMPpgFYNBmek@-KoKS}H`akt&k8hw3 z`Lhd9Fe~`HXGm0%2-NS>VxGPGTzV&YNJsbF{6>jzOB$#&jf+^8dGZirtOf}t+3Kz0P(6ZtL(?3(j z1k-ynSTM8x(gBwZ!Bn2%k*D9oxLmqx6HKq-A(FlZ>U=Xc48gR6AbRc7#+Xs z@w0a(3T%kqBT-o7mt9L%L11-)z~n+f1x%pYZB71# z2s|jOGK|sdNQ9l}&Rk1`ie-##xa4!-~OEncJ)seu(WAY+3rCj9i$x8&KI* zeAC}mY_(m*Iku~Ken-2CiE!jEwX1LkSP~3BTn@uZUBl+$BsLeV@zThkhqJ@PG=~;2 zO}w}q(~Kma%kCBM&6?zMx%JZLpJi;eGVo3!8!J}f?%9i=<5`SQIED2IN|5~tOqh{6 zggmuwOLZy@KPj=NJ$s0l0imgh)(2j6SoC9q~z{*`?J30^+WB-g{c5PjEKVr5TXI5-zo z35h~!v zd2;C4NR1jR>%9VS#NXddj8#|w49)?|6@Wt;N;hDO4HmakYyYbe%rcUEn$_2xfO9u+ z0M6G0&L4!(aR8C|5WbI9B1#G*Mep^t&ylZsJEPPJ??`nQY58mXW-*gg9#Gg$_q`Ql z&Addc2S3^E8B}$|8Kmt1>^dCBU{7+5&1^XFrkKUD!UsHV>=lRK6e= zi>6i&R3!-Xh>x4ICw%F6QlC8U%ijV!)+@)7@m zE*Hm74R%0R1RM3lgY+tM9m0C5S}h8#cI`z2ER|mp97u zp`b*lvBe||E0t;DIrDo7u`UniouS4vEp)}arc5ml?gOo;J)uYHeoZy6M8H{rrl7!Y zc*sah&sV4L8?FOKDaJ*Ua5v4*@3lN9EV!P$uGkv_RIxW)(vv~wenCFm zeNf{vYS}&$2r^CiEN%H3*YTM7S^-SK*$Fl}0%ZHMoJ2~gg$ESjbyOZFH8)m<)=MoP z<8U?)KKQu)1dl(>J-Si&TolPUbmnh4SoFb8Mw`5IXhZbz03X$%o7Cn#xtxI>EU%YR zWR3p8*bT2~_`FyAjLb7aF{io0?3PFJgV&iSVK;P71w;4hvna?^ctBf%jIo~8E86*=k*=1-0}oX2+yFX1y9khaj9PofuB$vH6Qfb=qt#SKr1yYb z5$S63iAY}&w#71BPQYkZqy6l}pO6lm_}@U5>^E7d+r#Ozo4woG)Y!7(_=YSIhmG&$ z=fD|Oy>8}#{&{A}nMK#7GsEf5w-o4-eZ}VN4$g~T?GY@ZSdB}6rfOJa=4yp|uS4@< z7F{ne7WgZPrWZ+;`v%m=8{ft z#=G8x8vjEG%$<~n8gDd&&RAHNd@H*<`%iaX9=iYn=dAoq-H)WR@=o24^iFU;(#t*W z>*+@`1?S_JcX`{Mg08poU&@lk{YdVJ8~+Jyu@pLjfN$=&`%y9!9C!b-=$Vyd50=K< zx%c<14qL^IY=_TE=QuOA~lgExDuYAue5-SEUfgP- za((M|e$DuFJ!!+dz#nGSw~%LVJ?V_kLN`9KZx?7RF@D*ctt$i{dic`vPALua&^KP< zpjlWzEv9cg*`@pX#=N5ODAHlg7z`@t3-&VJcv8^V$ifS}IWrr(_zj;AJ3z$jbN=7= z#H8q094^=JcJh`ziyDqC3H|z^iWe0FsZmB7jaVN2K}b(8k)DitFw&klKavXKO8Dm5 zHxdRi7gyp3w2jgBwFPk{4in&PWI1Rgu7p4;j;8N+R^L!rL51*KJ31I}1XbpON{pg> zV6^(pHzafq7{t%2TVY0iP>G`s(M;av-G!XW3Au%VsoB&9k7MJ`7{=!_c2YrR)FE|@ z(^Xc3?RxU2^`r&c^EN7?8svRv5|83TB~r_}U-tNB@_YYcsO zZyMy_{S-L|9#*&;KVfP^^)AKPZ$+No$a$Esly6KrINX6w6eP~p)>&Hm(J!vNndlei zNpw24OZ9gVEmb}c1<_KSKhe?OCM1zX?s?d&B!AYtjJ`su$+I>@#@y$7>mIYV*86kA z=2WxN@^iH3o`I)l$2#3?MJNICgPs?VFey?+-?nh2bSKBD?tHTS-b z&(_o-I#`I~;@>)if5m9>5$Sd(O5@{SCRJaXShqUmFHd2P2MxA(~oGW(Re)Kr4@Uo%q8`OXIo zpO=LaKc(H8zYtsy59;Z&+_7M!YS&QWIuTrY-a^xEe2OOA@KuX! z=AxenS7j=YiE|u9O5)^eMu+!BJ6o0m9FHf+&XuoC%tH z-$xcX>pBuH{}2{Gvbg2}z5}iPhJN@We?=tWblpAXg468t^kLKn8*HX-*x+RaE;#3r zq@ftEljm+lnXb9JA4yY zre;shk08bd=;7vGd}$1vhKIL@R|VJ&f44<(_aaB1+AG|rrA85!>FGWE&6j5WrAvQ7 zuN@jrL(nE+@&`gguh0)i^X_+c4p5CvzFtSHiDvH!Kmm_GIGFFrHPQ4H$ow0x2x>A4$I8EjYk&{vxtw?q@UDlRggp zZ|Gw(eetHZ_MnfEJExC5*yl0V7fSYVA>sC=d}zhlO>+IjV1@WPsk2vRd)w(_{2u&% zhEbaU@LHydNw?Oe<~cjL;YMcv%XV^{K%UD95x@cAY4$datmTFW^ArLosFhv++(MZ7in-Yk2B+qwPfccay)5vj~V<7 z2h|FZUGhcm)wM>ZjaQM&hcz}Q2V)PDw$ln>jGqd8QS`HguBoN+3bwn&nsj3L6Z|`M ze^*}|P|w<XJDhSAAb~*qNyp%9vn&6y+5yEs+hBKb2vGMvqJn~`i$CyzwJ&v!1placSJr9sa@J{OkwLAQ<3S{3AG&D-4|&oLHOg!= zApeXOU*`|pZTuh7B5BkCGrqznfl%Wt7Umoo_y^Ju<#{Ck!$E&QgZ>|d7GqPpjsJh- z#y=N6aN@FD>_Dt}HMt7aW0fs1IIS->)4r0QU$F(~+ulNc3^RyXCS1MiGjjzbM{@gH;ejTlZe~Jcaw4268ZrZupb1-iSyZW zUQa$PpX^OwFwZD5oy4>$Bxlz0mRHEOBIFKJ8>L?AUROEM0oW&bQC>6RYT1(PSF%$O z8BBR%A*Y&%Q>~S?KNb2X0#xJ{2OO{FEzVw^Jvuv_TT%Qnd4*>UPAARrx^R*x${Za& zr3ix5G=Un~mPkF*O2lA-Pw6QT`H-9KvSLLHw)DIx`6GdnN0n_M<~i_oj;7ci-g#=! z9cHw;4enT*7n{AAe34!*UApSsV13^r^rlPaXSBYTgnsDpeoJi=N~OJz+XefU%VH@eUee|EMb?(*wR**j$);`CmOc<`M2y;QNvMta@1-!^Ke?y|)u2 z?tK7-;AQ*~VP#~52IpYor_D~m#!rI=w`=vP$Xc*3_;|HS)^-q{*Y;(@+)MXO*;8a< z|KZhP`65zy(B9vW4hqKq)hGmtA!q(VmE3K=-S0%%hhnyGyWjS0-{Cdeq;Q*4}&Vwbx#^om*bn^V@$IfAOQO)XL->jNY))OH9T$R{pUbmM4=-B7;%0 zuXE8i6eei3e`Yo8^&-ZcQOd?)ECxm=U4GO0uJbocuD|FUE!d;p`mBj_zo{R_rBFS} z#i{F{2$i|=x968vz^cD=0bcT`dtDWygDU<)wp@@WRr&)`{09DXk5hMrk}u+qCg!gD zH8Jh}*S?lNfZgM(Ec)jypoA$+CzWxZ0*l&ILc~7sl3~z;^C48`W%i;SSA$^8c%EUQ zsZXip+F)=ptLIoM)`au$0|MQhhYLu_9GdkvNTz10kc(nqRlD+$#)Yar@dW+D8dRD5 z8+QLlK?X!nWo22S-!{7v%ek?+t1)u=UY7G|PiuwN)WcIOLAb9ekbyw)yKdeO0H`vJ z$}^)0kZ@1S9tHG&cEXyV^y0Q$X*;_)w?);k`W>r*8*f#sg`p%IOq;*^7eDH%w@XqB zV&kRy1V}U3TcUi}Z}JX{=FmL>#MT{9~zwtZ1N>nx_c=M70L9*H%+6%Y#MUeRJa%&6;;s>}+Rw zF!#J!v9_9&Vaq6|wa4|9b_5Z}e-lFD@hDtK{2j9%zu@=kL{_pZ8LAz2uf0#?rrwDm zmikS+GEi1NdABd@ATUYeSC|=ZRNGEnuScu5Th0(8ahoe=ZuU%kCztR&Xb%}Q*|GKq~Fh^Bev8m%UCth%ze>7i}f-LMQ z;|~3DQZj9hUnCL;;{XP!J4lM`u1|zT&Pc&aEm(pS#?9ede&n}?dcp>L0l&ci!vh!g zygvT?8ydmDl=vm;?%mH{!IY?Gq`+TyzQXy~*M!|X-HP4g- z(_EbG<$MV#1%?qJrHGxBMtX5t&`@?P&pn`N~@YJw%@X{tq!BNTv*hGvX`JSTEh(WZ{4UXxW^CNsJB;^ zSzL+Aa%Xqs(Uz#)v^$N|p3Wc9}H;j_-ce2q)V%zSM$Z6nF7_aC^! zz^crFrBAy8>zBZTE!6%3>sK_LJ`=Faeb`G(?}WL60Ig(Hb&*9+in|~AjS_v1Z_E6F zyk>^`SNu-xcgq`pCi8qyT`yAg4B(1nr=up0u{QJev%C4+_<}OTOVWqrvKW=;+`pFZ z={-p|EqZ#BaKHe^*guQ>N97^^{vpy!0@w}dgE0ObjFx{q)rRO^mxu0X*R$x3HR`tD z!i3&B@Q?l|9EV!uBe+kZ^)-_12p2o`-qTyimp2A~42xB<$}?gA(qH5)Z6*e8rh=i3 z?~P5v$Y7(4G}SXA83N_HD{E#`RpSe>myl7qLXy3vRDZCsPRqcy+9ZT2_|0^iOpeKA z2A|t%BaPys3;_m^oc<1P+E+hZDWv`z>ooS4XmVJOeRTt0yYH)ONXc-r4v?-p6LC8q z^A^39Y7Zu2Pd}*&!fw&uOF=R%2ty* zm@~vq!7w>nd^p9!4d-B`riK}{fO(#XA{xSSXe;LPqM#Of? zMGxs%ly_3r>FZ&CFY-D4W#76$f0-ru#yI}z58dXxH=&OW^nXeo;s7J5a67O6{@KDs zXNmU)&l<$-zn9u+_=IlpdWnWPI-1y~IG75*n>?>Xp>`X-%iyB3>Nh*lr>(kwL0ffM zK~??LWd$*8X{r$}p48vYcbKm^qgce9Bn_V2A4?I=aMh(;kR3W*P`J=?SC1qduSB<0 zU2+l;ASRC_`#7=_?sD*?k;J&PuTZ8+Mc_=otHH(DbJWvB2Fc!qCuT!wkqag8$xLCg)x|uL-#U&%Pn81eA)REMGzM4r*g=Abe(>+rDx?7aHp@sQsGBd6qHc_&;-`-iNh1tC& zi*L)N$c!s990v;70R{34Yu6QzG`@AHaMgX57~=zfF!>{0p{$H>tAc#D6T zW=Hx-As6KLm(MzS{Jk2|p3yv{_L%hyB)J0Br)ic_b*;{#r>-*)c<$S3YTGr`D^VwW zyAyRTG?IL_noF#vLiS98;9%sB);L>7mNu_#v0A=M_K+|?O_G-ydeJHfa}lrv%HIV$ zb{JiL_qSpvvg7a#UZIionnSV6hYaJa9h_f=`xEpv;IGrW>r*yBi}by#|01D|6REV@ zmWRHU#>0qI8b$x6&2Fk}z%D@tE87blOvS0&FozN-Ld!J`)`y)$muo_k+ohr=fD)IX zc7n63Z3h_7t8A*S-hWAP&2WFzjxXKp6939u=(Pdr4#pDw__Il5W3o!zA;!cbr--WV zLOfyz>N`$lw@%ub5B@op&!4_sTwmQLg ztyMpUu!XLuW(hWi9>!~O#uD*LdwDrMfnDwy`xy!TaYeS2msraule_RUwx~204HIj!iZ*yL?^YUm zKUl72kHgd#(7I;P2_H+dQ@<0@Skr;Z+jH($8rd<4iX11%Vsrn>vYvB)HGSzd_ZM0R zT}VBytXEwUjeY53=6$xbKWb$q`&fKe9W}sUy+4)ysj$pPm`C}y*&qIe-{clXR z8CQK$EZsR(Grqi1J&?kDv2fe*rHs?)V4O7L#r~Z)t1n_M9UhP5$^Rb`L3cAn*biWw zd_?EtMt#Yik6921si@syg67}<207BQ$X+U@Z5nSVwoJYMEfP^TY^_EB#>5j}{b;`C z$zu-XHBTP1YCaYFEw^|=GpR847qR(C^aNbRT zYF0nX*V%O5Jd;`g_I&HPtQZ$85ogpi8>*$H-86#-GHB*76NdEJx#C!p)<>E~_74y7 zqp6zXvV-_=HkaZ%|17F(kkhpS@4idQW?yhoY!=!@zIIJ-Km6stp|=;1fi+)7hgs;NxBr*OmmqkT+tC9P*?E^ zP9A&F)qu(nVN=+Vu*jbwc34$8K8nf66Ht$6*#wHO*!@%!dYxU8p3D z_>cdS8}Ib3e1OWv_fB`fw&wV$Ta2O3U*9ji@gX5#JQ`D^ohZNEBeGi9M=kPFKG^}l zBGCIkyM{A>m23sHQ3I?`YWlg#8EMExLcC!-iB$3SP09L`}UAOK)NJXN?BdlSndiGtbL1Pdw3rf7q)eumcSa*J5nm%Un zf2Z_pmMS@%eCeS7La2C4l zZfE~WtvU-yQdC74!PG_NW)5ml>A3X;!);>G@3b-icUGcjy6V)^&>}WQ5{IJG?%+^l zam*9z>Jl&c=WlU`qD{Y`KWhOf%jBL&3S*kZ+C3xP7eFOnhx_Hq6^vIpgQqzQ*{$w? ziC9oCJ|UUX!eDiaU8qa!P=Jr@a;_vT#G4+=IZ~3^&R4=56kIhNQMm_SYcxuciC z(dcef=-)vi;jK^S8MnYr!GVjLoyxyi3SqftdP``3i(qO(u?d} zUST%;cm2$!xYzLif^?=h9R4%&hTjCxRh-X0_4q%#Y$xM?q*`+0pB?zO2#5Ud2YyY3 z2A&XC8u&SwFyV!~7aX$;s4xY-Z+h^Lm>U@E{1-zn5&cl1m)#x(e#U|Gj|?U{KZ#gjCIXVjnFqf zpq<^i9>xdtKR!O_%3a3?eQQ_oK?mi>Uz$vdIcw^bG2(;HS_z1-sjJSX5B|A75k=>= z40N56$C^oXOU|S^D{KTQM1;sOl1C#%iE8Zm+4n@J2D&%;)r6Y{c!q6;Hy!`1P>PRCy3rV z)4kgoNOLUAV?Xdev3OC2UthRRWYX{&wH7inx4KF+@ZDoYt&B9i5BBdWR@7T@ixqVf zmfG3-mj=ae53RFt+chI8qW?mDeX57>3Kd`jgdDN4vpKSBl4pC7g{!&U0Rx8YdIw=>ZqjohTw(o0 zUyWrx&3^mJk3{ctbnn@Ga!|>D22?N`Pic4JDWS|rr)U+SrV0O(yCIOMO&qC^O7bWY z1({>tE2S|rTX3R+b)-)u(IU83>8qkEnMru0@pHU~R4!f43$b>!WVxWM>3o|(vR`LQ zD~yTv7?;uni@G*R41K&Nj1vEp1l@$iYN=UiQIo@XQ31XCZ63Xw zYZZ$gZ;u_KI8a0K;y{@viVF&7D?QRwP4?dO`1F7tTSz?1i8D$mS-I{EXB0=1FEE;{ zka+mr2{h<(CB04SQXzNV3g8=%2cL;P45PQ>fUS7V0VMbBlpa4pT{---^+F(^2mP)e zihZbAsmaO(R|{$Kc5Or5yIyDeq{YLt2IIB6T0sxS?~t#-2C{nED z$YW()VwPyI$T6=|b(eUwy@vLLK}LBiKPlP80J3B!G1iRa5@XGgTn~~vsu#)iVnaix zm_d*XA#++t{AmKLeR%DsCc9cb{#|j`RWV`FAi^4Cw>^C#02ps1%aVNF=n(gAbB^C> zdIawwy*2zQ}f4nr$jGx z@;Z=O)AxWvA*r$pv;%4-a`_%~FeY+I_&KwBhg_P1G%o_(d!p}TJHJ;1x*9FN$~?+* zM7aDip9`587lCf3M!OG(X0RV*Zm2xJFf$@tUM`D~&>%>iWvML86V{wUpK{0ESkLhIv#Ao8UT2c zuEgO_zr8!zht~4rKl^8m*g^2HoZH~PPy ziAHv7Q90U=XmVkhKaMIi*`xWbOMIAKO*zZ`P#`Uh55U%Hzx2i0&zvaNFCwpkwS1Md zuxz@Pm-KAtUboU%*#?E4q?;=A4Pa8C4|q>c=f&mc*j2Cdy;E%7$j6}lNTX+4gGrIo zU)n{1%km3k@(QfyIen&JD~F{>A8u!2?uKPN!XD;eJd9eRi4AE^g9YhP6xtbVee;{r z5ClC;d%Gy`?Dz6I^I=|rj1_oZTzP|8x);dL#FoC6``~b`Zy%Sp))!M7A?*U=FL$qs zSMhvh8nnQrLBATzf(!?B1!xKwG{ibS z3qWppipalnK5c0NoDE=(G+sls5GrF4k2Qb(_)q{82}?^gURz;_;@i$dPSR#_lGj6q zkcLbP9ADRs6+D6_GBSG7CKxiD{vLEHtxG*!57I+y2yHU4YKSy)k2UkLU}<`5i1o;% zLK$MD@r&Rm!r`e@sd#EC$LC%`%FohvAf${mc0p6gWP-|pd`Q1RLbhxruzy$;FHv2Zg~AwD>zL<<{~(E(!~L#$qf4VzM>m~lyd(3NYa(-0*p$L$=fn>tHhvl4N$b8n`@ejVvd(`KG+v-rJn2U)3E);ch8H2upHedmkHGVu@`r(61B zuURB6SDv)%yv1~s>&!LMnd8Hl6YU zEg-U%Ioxo)e3DNe-^(HXt!i@*S9i9We7g8ORnq++#T|cc9y_ejys^(TfvhX|m>u?i zi>#lc{$9vBR8Sr6Kef=N;8P>(bAXZScu!<)*4LdN>k86839|m}i~l`jy}$9_BWwR| zz1cak{)2jUhOBEy&mpS?y9~w2|6#Dp{(>0gTQ_0yEE204J|dXYyh^6 zQ~`al4eZF|!Z_V`yYw4j7^j9mpy0?4<8&t&q-aMKqJya!fwk6*&YVqcpzk>Tdf83= z6(0?3av!Bh4qiXdH63}*u4j>Kr{|2}WxJR(RcijTc~xdzTGKzzt29pO&>-wVeMk-c z`p?jPNVXHWv|hxiBmLa~Wc~I6^Ioe_cEg7lj257&F6EqYS2Y-XL4c;vn>P#1mD#ed zlQ9J4OAeIIWq>j?2g*y&??9SQG$pe7efg8Vz+AN9PZvETyT%>{!w+Q!Di+^E{(3gK zJnr>6UYX*0t#3Fa+W{6S?c-S1*g^gb@?;K>^WtJ6E$a8`;P(oCZR^7(^RUaXDga0B zW-sD=(cRy(;h$JVzKyL}r(FPlxm^HH6p(oUaY}goJF$Wmboi?evNm+8MFXJ-AjBAI zrYMmGdTSwCl{BiuyYGv^KSfX<@hAqsyCFvL3XxH^5}v=vD{S?eBf&p?xvwzz=S6PE zUN}9@Yk05liaqO6mv%)*e3TiT{-f>AAJtZL&Hbz=QMd~QvIoy5e}Ncg20GabQt)R5 zua}ev+{uL{8wo>!%ofIT;)vW+YSBQh0iE!1#*})F?s$)U2ZKql8RMoF`!b_b@ihqX zL0tIWLhfp79_a#N@JQ31S{Gr24?OXR@R8}8C!fBajVy?9fE`C?{5R>p(ME7CqK4Rm z>BrRQ+KdUmWsqBkv{BGB{s`RSj>MJeu{;C;ACTy*_y1-5#)1|}M2^Wd5NW)Ms6PcDn? z5lAp1-~BC(e2l=DTe5O@PEmG`@lcb z#pY)-%h%s=wy^EWFr)|KycS(L1>3tj7^(2?@uSj5f+`4(b>&-5rM4T1Ih7h{92ST) z>Qf-Ytm82c0qSr{NHdgm2_Gi8h2~ZY6=d&{4gPT%WG0IWgK9^#7`jR;{;?CkN)vzW zm`C#F`}eu|ew<;@9Otc%Y}G}sY8UIK#I1xuS^Nq0HA!m7Uk~@Db*ELHST}D3nlK9H zcwH?bRT52bTjacw6B9*&x2K)Xs@9fi+*k*$RpqAR@|X_Pdik*LUWAU}MlsDM zIB=sV%DGV-7isc@2F=g~{flJXD2i~S=+o1UqF>-ff$TkSo7jueT79jr75Rs#J93+7 zeVHZ(mEtNv}vVT*b3LNE=%f?$IE}Aw&Hyklr)q_C+C9smu>cv zbGP#=pM}l%C2R&)NPjDeYW;5%txH}aA-vYRya+)5_~+!~c^(@oW8XhF_UX$R*PKkh zuHwxYFEj>%wpghAwm8lGta}?akDcFQ8~+G2%r%y`Uk33do+KEMhw3-+ zLFAr+ED1STp9)e>>7VI`!nTmBEAWO`hgZfXwEO(F`#-;njS~skU`DM>dpbb^Ud7Z; zo^?C?h|(9X)BK2-YkDvL9b0g+ZWyk8hUMTm7XJ>cC5rM}OLiFybzVKo2x2PmC9 z>e`n~Y_tbI;z_P2o8maGRx5O`%l{@R{!FWCqkqeMhpSUc^Kn)BUE>c`9WtTahKg!2MPNl6JFQV^cT*tL1hEjq_Yh zi~Xj?zwb3{?;BbC27xW2i6?QlxC7%c@0_AVUSUTU2y;~N4-~HtbNluF2>Ju@ZfYg7 zoBFGPTwK1cG*BGC;&mDY`hZFRlK&3k{<;x1lv!8}4aSlq>_5EGBskV4F<2g~^+8}9L6jBM61 zYq-D|fu|8P5`YsX@y~Hy{!gF#!7|9chgv zVT4akWk+}w`8C34?XK2}PrgPc5khRV*DOQ0L=rI-Svc!g+WL(&u7WRNxXWONmueAj zA%=)^#(w4U9y2p#<4$JARhKbEh6#HJW`JxL7J6BFp&n94{V|z^ZiIubv0Mn4I_h3< zH^7X30o=dA`3AUu2F~mZ?t?)BxD!1OnagO# z1-;nQ#k{z5PV9pArfHzc1(#kj&xJLm4kjvfom&(s6M(WV)(rw98Z5X(0kK0(B$@Tq z-HCt8T``fdjqvWo`)W5!3Lz}o6w?Rm_V$IUBz0m}qO*ZZc^cm96KQx8BpmZdx|%P< zykvJKSgZXz0R%T;P{O=ZSq+l=)E;|x3-l*`bb29cKg(Ywz6dW-giFFm^2m4@VXgAz zYKt@uqd--|!m^@B(>16E*qh<3mfI3Lc6kZqV$AVj)B_)2$?3I#@8~r)UTR%xOZ_;I zyiu5<{LL7V)P(ZF9MSM9IwFgoF%`syXzPyMq7`kpdv4BSV=5lP-E)f}*#%&JwBm`# z;@2o}V(PeeHE8~~<_SOAPf8sA8Uu8y{^XHu*JTexLfc?E1r!kew^}j z^ET_|kLIeIZAtrFof!LTI;&o?)OKil=`*FBzYT9qEY+ait8dBNMVOrKLmIi}x0FcVAzaB$uBt-WU;~*9sjNCcmY`i> zrlX2aUS>1p7PEX{wPy`mAFkVe#Dx&CU7`Ng9%e|431;GD9ESVkkJ;+T;&luS)X%@l zs)XODfyz^wJ%Qg9u(b=ZB;hhA>#QzY@X1+M_-YQ#MWWoEHAnCUE=6=k0MopB5&KGA z;#G&28zPG@3mWZ5RmO!h%~#2US+t*+Dq2a?_13f&x0@+7eKGlK3twifD8Jj4<02z! zSX0n3Q;XkGr@(evIsNa?p`mWUS-)*5SwXWx+Gv>lZ@BaVo(6f<&ANC0|zdy69>w7bnvK{=80cp{; zz;8Qy#R>>9K94~>ck{!m_kVM#!ub9Rd`tgWObY$A-Qy~~H2nR;eC@g9B~I_;wHL{X zFZVj(321(|cX6!w-?6JzjjctTed5jHz=v6V*NKc%-=o2I&U!6f@z)^CJ|8SmfwqFs zTFjH>PdH;armNWh$0eF4-MLOwiG;afiD?Lm-U5cGCS(RRE8iw|*Jibs2sVh8*nwV( z`)yOE_xE({OP#_bK23Cz5uKT8P3K8@{Ik?SF|`-$ADJV)igj~`*@cAbbNAUI!|TlS z<<7siu}BG&hKaEc8n0MrI2HECdT%Vc+XQFa$iOBATcjUhkHrK&Z=1dEVyknA*L?8>mz;IctV_;Qo#4gK zV&}KjTn}@ci=)-MzH6utBA8d-1=Od_VaY3?iz74Vlhlo2_~Wx7iOI6XNG;Ydn1_aC|_H(w$C;8sC)LlK*S70N?gJi(eQAS!StHhp|XbgUys?))2^`>wS*SGz99 z?S-g1Ba1&o=?B-Xo)Keb#v+Tiq{u(x?XjS}a`@Z}E;&yzcB<}06fb_p#=$@Rn}VPQ z3?}453DJ56%jdCp?`PcTaWG?zaFSgoL5EL>8-|;8eQ_2T}Z+!EJ@x=k1#+ zI$()m2ysPZIw>CN^O<7^xm^-%cxAJ;?(?ly_5|}#iZ(pXJl&?MS(>NwV|(VS+B2Ua zXH{F#XF%PdzvC<#fG}pO|9OB2ZjK{VQFcIkT^^Skz5T63&5CGZl8s)tzdfU2vNKsf zVbW1WdQT2ru-2W+`v5|^nR)hqyqS*vK{Kw{+NWGV`U-oqeZe2E1PP?w&|RnILK(p2 z_F~-y1EiA#1Jq-t{f?^*10p;wv&VwA%HeraZ(}}#%6BsLr2*{OshK-rhX#r zTHMKAq~j?ntZD3u7iUfgj^iJak~uPS1h1N;8eaALTO}Wm*++^Hx2}mQ$?e8JR60>m zh!s1Bj-ctE<~E1=^h6%)gFv_Y984SLpQ$39=^GfMppi}IyGAC2mEj7@c?IUDpH;?r z1un5-dwgJKgq>41_PY0HfQl0HNShMJGU0CK)S&uBLG`cjYp^OC1R&CQi||$Xf3Ez8 zWXjX^K$V`Tw^AvSt*ennh1yeh)6znan!eQi2A$T8YSzj47qFyhx>j{a!b_2Q|592F z$NeR#+}m`Wnj4d~P#Jb%_J1;A&NCyukE@t;4X3EoV74IRG7jkhzM14K^CKi{hOR%) z{dVz7@v@+}mtG7wnagb~y8Hvlo&KXz&dq#7{d3b6?gr9hmsN0ZghTZ_BIUG27C)`*qtb31e!a|a=5h|4p$wjB0l?xrY7n-Cp$5|w5XScWQ%Yoz^X`-JlC zdR1f`%Z;96E_Wux%DV^0NzLs*z0?s1oUaFf+T^7S_Mu+lB%q&U0_VexG$>j#v(Q~2 zoGzqyCXb9JUQ}qUXX=u1?$g?;`?P9s9tq;N9vsL!dflhhdamdQ_!Uhq@aq!s&HnAA zL{l?5s{*wNGJe-^t0V z4lVVksTxJ3;)`H3tU7^2t>*{6VeFAz1j_OD%2NMeL4tBYUvF?Bo zV2#_>yhOhl>G?ns>i>lAPQIHgK0TMopGF?7DarC@r0?J@C*P&M;#}4l>5;prZ_{Jh zM*X60^?jpTeYyL48va>Y$IVNL$GyaKW*EhJ0^%1erErwHsUvV zsre<+erwrz8VUkwi9MOOurB!p<3RR?1F2d%l(>(PnXxQhxDR*z-|IGj6UxWw z=D#{_As-n{oKZfSb~vvF5{WZt7`|f|e9HIfHRsCr}LAm9l;O>-f^{P`CDJ#trly5!Uw$sv`S_GYimcKJiYzNtjd2_ zUFu964?jRZ+~FnrqAp!0b?I^G_3Y(!i4QRP(x)rXnr_ef!~KeHyqlqMH1Tw<9M`rR z3xKm33iO}y%#k2gUQ(HLeA6J5)+H}0FEiD@b~`T0jGa_#Ru1u&^l&Jb{AsFnX9t{e zb!ny;en0SUILNA($4-1$`b)e7_RF;u>tc^t)JKQ^l!Fj<_e*%j;5EyEb+P|Rzb6{L z_6^hf%L|#o)8qYODogz2Zp}v3Z5USlE8z=*b~~tzCz%vas0J&q`=#>#lIVr zVK7k`&uIRnGmO->@rb-eSjT;f6L(2CIGa;wN&@jH2o zG<}0U<9OlXE#&!MT*qOaU9KaZN#Dxs4!C4c|CghtpB7(v9sKeu|8ME;_8hX zviJqNhWT+R#v6AA@10qA4e5r_^)XMS4+b}K2KV_W+B8E}JV@kmlK@%|!YR?qo2QqJ1j$mw;&st-buf=t^s}9r^4w(S zwGnBW1(s)i5+Jee5ApiofmY@#b-RmJwm zcP`We25AG{HwoGvW1jN1ZDX>`I};(=HXbLEr!IL2Chc$pZQNvXbe$P1T%stOvHe2+ z2lk>_yY5&NSQz!k-;{~PA+~>avtn5JHJRn~4eKCRe0>il&#&LqL0F z$jScRuj<@tjm3V<=}ICQ|3(tC4aXO|O*Ectt7+-qUeju!s%st&`m;iMf_7bqhfbZ4 zB!VzCy#*=iQpF*gyyXLkCW2TFk$XA$+XQMC?`irrozc6=J`WK;Ftx)>Fq-B_>vC?d%U>8x0dk?d*XBBJi4?BTOj*>T@)z`)9J}H{t#>rwKT_ ze{)LrSortz#bODq)8_2o%4_Cv2vH!wek&)yHd-kGHvXoyA{dgr^VF>R?Zj<|@Qp(-_*jl0?dO+D zrdHF6*m|w*ym;DTo=Fx+RL#Ms3ZR-5wn`AA+IVxqdF(Il@M4k95Cnek0Po46F@7XR zc%NdDrJ04aLDcDgpES8pNv@(i&Ag{?vgv6LQQSIwj@k@6Y$Dyd7EgM?NBzH@L>ZZM zTh&?HjWLu6R$-*^*L)7fFu1zCJ#(N0v%38+#Ag`J0boFCI37ld^^{^xce6_rIzkE zH&Hd|=2v(B!k2i>i}#n^FQ=X2jPZz@%r0?K2_|!q1|dULvR_rAs9e#Ib@VB<_`l35 zry#eSCSjsF$(B-B%Y|!SLit)XneYDvv!YhpocPwLuc&n>ogU`(W-T^}4qz+~L`VUsFX+ z40N5SZ%z#4rG^dgDzH%DkBnQ;CIe~-x|zJ2$P2$SX_KWTsX2j8?=<+Gllv#H*q*p7pWnF* ze#hu_$nR{<<98gvHGW3~H{^GqxdFd}O{e&sR#1P>y2KQWGbh6De9)WUnE)&nVjdw{ ztc-Ok8Y<((blb_|boL2L^F6*P{Ahx#^QI!my7qb06~hC2L+tHNnd*4Z(b`{*k(Dib zR+)9!=))Xpt=c-Ve__1Ru}x+u$$k$#n8vqSBm!h?t4$ueH5dEy7{27~KZo&}d7R3z zEEjiX@a{umPUaQThyUE(^LO7fd$Dfzo|khQb=KZu z-ts+VXMGHe?t-&WSQcscvyg!Z_Jrb&Cck8Iv%O4iR#Q@!S}<5sdQ|3kkErK_Ux#x# z2l3fIHj5{^m9e0ESTG_)UV{K_R!KB5qm=kIEjppmHTC%bT1S93oUXnpxtKVs&))Z8 zS0GROOyr(ZN`m-V^U5Sl$n--ZKG^QCWe4lO85R-aYOfuEl(trh+wu=q{`xvMeC_^m z|M~!xGh1OzGorTmzR~1oLWcx;F;-*!O)?u(_BTeg+xOU}%wFnEewo;ss``Z`1+mZM zq2;eAXlSVjwPpUbHai>r@AIn$1`3+tje<4juQLr>VC0z}M(*u9JJGL}2=#4~h+fa; zQ@@bl{(I43&e+@h7p7`lCX|;IMpN2Kh_E9zc^Y+PS0OM~)pJj5L2ML7G@3P@Yx@g@VG(d5qV#{HL6)BgyKREmEP5fDD$*;)*2Bsrr-Ke>V&l2@D%q!s^Pf}`4Q(0% zb@xgjC8?Ao)b*Bh$3#=B=sxg~6pcUZi2kc}34;9_Imi>gcKNN79fQ`E`Ha*dL;0iI zKKcjZ*HV82P1GgML%MOO&U|0gasZ`uI?S^H49|x{&=cADFq%9;rTiNx4rKm;w38dt z?0tr|9y!mSU`mST85KD@nG%EebRR_;*IQCeXZ~T^^bJ>)cSr=?>3>-OD(fv|Rp_?l z#i%g;6|0CQ&nQQSk%=7y{S3~pF|NC?cs_C`@iT-wb@<1Mt4mx|zS(~hI2GHlMYzG8 z0ynFc4sj3H%crB0?Kb`ysBz{yx!wQ|i_JoDo+~~rHOJpt=@-VFJ?L_3#2&Q!(6jK^ z9>>)t=J%MC^d%ao?&HJxc)s@GAOLB?>^4{?=mBNb1s6W!E|E!c)O5DhEF%KurE_M@ zJv(+O0gP*Y)>iXN_Hd3->>*>Z(lLB{erwG#3mv`S7XO12WxcWt>yu z#xdZRbLX|y{EEU4oUe9L)2U;F-+8=DOtYmQpfov_T8@-5Lc(<$`?9s{efKo!!!2Bk z;ezWx3M{5OekD$%+;jl;XF3Lr3PaUP7t2%%q(NBFTyV*pIIt||1|_U=Xvy@Nsk=jv z{H5D=(tyv*hwp(|1XlVR($8;N)o1?6(do21il5|wXW;&W7JTgp0 zC{Mq!$oknWW~rMoHzYF|3l0$yN@z$psnpjcu)VYvy;Mry{S%(h;lR%JVh$$K)cK^# z1Rw&T&5RQNfW7j@Ui!O2U<~h5Q&kv|s-&NWPUcPVdS1cUdJg1EkW9x8ML(dO2o>qt z*E9XVe=j+;zj69Cj2(s{$hlkN>m6f>xCEI=34ah@SyXl}!ovl63g^deMlSARNIY2WuF0AX z8*KU)N>GB^DOfcAUN32I9Yl<*g9u{VmH9#rqFs&eFX>Kqc&;I3Yt0I`^j7-yuD{q< zcEvnuU-IetTa{OTJ^fwce?j#d(z&p*{WYEYlgQ9l^2{+5ABx!U9PADskuSV6kzBd+ z>uBZ9c{oro()jF$)V79v>Bo3txNb1448$v|>Ur~5@!3XOV#z%w-wtJJXf5F~P5HvY zaz{p5U=PgC%4nhYvX7KpcMGcujL?rEjYL2TZtxQGXL^Y_U!^Bzy8sK8m@_ANMgPQ{ z`H{gM$F!+jN>e%7Yp<*nSdqa~y|&8J3wS?Y?`@S=F$&jpsPe=>EZu-FYu%Q;M)8dr zA&d)0`rT?)w9zd$m@6piKdubP2j;69W^HJ8{O;0+-1r%NYPUE;YCSmrTjAo{{^01f z*~1;J11YZ5koaB_nntU0b(>j1VX`>u;yJNzm3QCp2`dP=?c;whu!i1yD?e-&U#9W&PXNnFi?&k> zdj}V}>>mPh_POj7i@fHtv(G(u?yPz9c>8W!%@3U5h~~NEZe6u&I}jW#3k63%Qd?$0 z*4He^9#o^rp~vzgexa4dEC8Hq`zqJAvkRP|?j)Lo&KQPO%>>^@xjS)7icgzihGD~y zXH~jKSqUC&k6^&zSPE-+1+HT)!Z5PJ( z!zhXy{+6#a+(eEw2GmNQB>Zx#-!Gv6x5~XB!!C|m+x%lm$Sfx;z`vXt0;;LqkF2=dV`^NO5&}M6sDffDDOZiR9Hc zDJ=)zPU&Gid2|-saeV&qpeO%}y$gr8!;kSvZNX}w!zL6tK;LiY$ta|(!kz7) zRmdnVcAN>~PfV@MqCT4JSI4m9Jc`y4%;C8B6lo=1Il)ei5_ED} zD=Iff;zE3Y&L}V8#IbNMdg3MHlzrVliH_A3a;Pw!@Fv**9)>UeB)Xh|e&Te=QTjMk zu3fPqQRVk9q@hgz45O!y4Ikhkt3hgT?K`rgJTjIsiHX?lZ+*ukCUbvngd%e@KOpC~ z$Yug~SxzBe+2}_}@sH<^s{AgCND`C7U(A=7^d5i2z0V}#YY=_3Aelh*6JO(Zz`H{D z>gSgh#P>C6LrWkVCAvYPFH(zAtblZi)fgaMn}IT^nR^{G19cuVf!iTo63z7~oG9b) zYeZRn$^YZ-s`lZ=r{e3Q4GT&N;!kJF#cK}Nl<4@Ils(~_{s3!!MxgwuA)Lj676K=a zOU_tRhwxdeu`U{fP(1NIR&CdW!Yx&a7pq1*&JAiOCI=Ch;E{MFbGqb16<;mkejy`G z14z~-yeAX?VtwpYZ^VPO6|cuOWJV*{>CAi{OF35Z6$n7En0tHfz{EOJZd(iv%y$M6 zf8&uz(@~;h99ek=ggsYAY7ixF7wIa2q${lK|nS-bG8suPRABv z1j6sn5xe2^r?8Hga(Z6uU~|;KbRJu z-t4Ae^N7`%Gjhf<#1MG~QexwOFYtLujXz$f+QPVli1T*r?=m}h1{rtl0F&&-TLOE6 z%qmUAo|=aN!92(sD&i%J{wnn@hfOeXP zw@<{2F@?!kNYw-L>>LJ$0B8DjGiB)KOc|!`B#?r{em5R#6wog_CZD>6@<=aPTyqnv z)HpEg4f~Tjlt)ND8`>L|xaO2_l$pIBf*Caly8nGrSDl+UP4cPvfncd-;P;n&$#ToaT#=H^(4~XD< zu~)nit+f>|#a_%DkvWV|m58pc*xP>JoV$BqMDs3j?XjPv_D$3tX*v~ZvPyI1e*<8l z`V$fubT+h9+BvIw9Q=GK|D)&DC0)!Y5zcE9SB8?{XmTQ&fKNtd&^whPW2Jc7%&z>< z?CM|hBZ@flECD@Brj)_l9F(IqmXt?q>WFszDsY$)=5+SMbZud}nNAS*^`ky>iTOXh zYfMYD>DkD2Exk;zS|OI7hU5rYzD(T~Ya^Jc(*k1SS79%8mKN{3W_P$L(sUPu#m$al z!iKhk|6}CF#gcxBP%(3#w$+b|Yq~7HN^AaIjGX?W$-=0*+e|%gc;KSQa-xJK+#O#E zOsfL^#-Hn`jkOmuY9oLhwV`DhPDT6l^%6*W*;UyF zIqk}BDldWvd`O$tpa{=$PUp4+_t5gwM&Ym5ft^*m=a;l>U&x1I)ZO037zo$xsY5>c&%>`k87 zVyu2RmLbY!ocnw(OCALa_$`sb4@4Ou;wZs3!+CxgTLfk!>lXeEjX1QHa3YZ8V!x7i zIGy`#ZAEIHBSsL0EO`$0^9~;KNag|+aati)Y=Ek1=h|fcr4JL^)59fIY+2S9mB*|f zsy!RWY*{8eVHN_&b)Dp+2PUZmj34gFIuS=c?t?zlmNUM_m zgP>~B=Flt~D*-M-_Ayr9F6%|Jn{3UDs;k&C7emL6z>Ye`?JFI&u}2eYGtgdMh-6=t zz|W}9iHYO5{P!4!E7CX+aI3(BdD63VrLSkuq6y3--PeC=rg3oXY3@8ZaITFfldrn%bx6BIUAVGn&p!#^d?(~kGaSNjAj@Xwl%XKxpAB~KE&IHt=DI$tG zLfk|p$|xi6Uy{ym;zs*UB#4VwB2aCvO_4RVfM5s)172-It-gDA7P>N^)h`Yq+$guHscUInQWvjwR#1V%9WJ(J?kZ zzsVfzXl$U#d9qyIhdvW$uIG-KiUU;}P<8ps zEO+dw`Ojva>oK1AlOTV<8|lMU;}{eF#V?q|&t@G_LC!#6gT^^At0VNP8EV!66U)%v zqF@>!PVwN(n0&vQA6Zp6>rBM*N1inpge1-!DFv$w^U)8m%&A5)4UV`Sz>1k#r|boE zTZRkr7~5ZdQrJ)~9PJ-LmBPP+`2|hj%j;U4xC6U}DJ6t{i|T}A$6QWFJdRdqZt2X&<_@=LvWFlVT__T;^bS?G|5Au0>XNKJb`k=F# z1UOo$Yw0$pY0v@nKNG&U5sJ)Sxz>r#7vLwv;{%rd28Ld=D7G*8KP$ER=zN8;?myc$ z_xj9Nv+_ErfaUL}paPx2R9sF^+1`dkmdJH2Gc>H<;Oa6j#Th{gFfKmg9wdzy6Tw9b4>*MFln*0wKu(3WFej*UMrQIn{;5m1 zX=wP}_JjJ-G~JhSp&V2u<5ko2)>E79W}! zFEDW~!L$a4OeMy?0D6LYqZRdFtN#=pt-{y7ha+Pu^W37!8D}v~-iTzAS zkmS6IG{Izk$uX#|6C1P<_4glMtL1_Su@H?5ZUs16Oh~-NjOCl%2>$GPkUi#(+T_(E z1=-;oxJOGewlCzqSx`OmSJ@|QjK8T9xRxc_I@a`853|F0nTELcz2lc)v8U>;u7kic zlJR{gmzmUkykC>)#u???Aw-*1&A-9`+*vX23p$}>#k{f4F+Q+B#{+_j%_IGsH-*Mgg`;T?G{u&ulf5-V3Sgi|7Rp_hqs!Y9tbaiFMJNyS9 zK4pJy8s+*!r4U)aA1zdE?OPZhkcFBdF9~1LuaP}BfW7z|_5f+wIhn3nW~M`!XIo z==A!)Lo(kj@tNs8XuPiCjd??4Vwd|cDg6#47oNLzfX|7eEH;ei;K=-3UcTY!HRQt) z%bkYvK1CYu;7fSNlN3NTk$VWm#~n|x{pv*TBm!2fVG;aD!zQRsri2TYvMCCB1GVkS z3=ix}Ye)EU?eW0-H=H9mz-TN67GoqGyMioSk6~?fK%c2r8?qRFB}PqvlC*dC&F_vgeSe49HCgj z09{E!C``D?o*kg4ekwqtG#|Tg%p>7_I>7h4EPR=ha|kIB#p0ZZB4TRaKunSTCJ?Hk z5xG9xe`vQp=;{gVo!Jw`VRqZ#IkOIbIA0lH`)^3UKAn8v+JkK)`ftexeghT!-zFcp z437Vk$_GOGL-k*j6@lGAA#1(M){0hp>t!$Cifz1NR(A48j)^8H6w0 zWCjmuZ_RV13;4Yus;_(Ss@LlX?ui5e^}ttwp)SS78%Mn0YTjmh2V#C}K8t?(q3le9W=fL3p zxlDgO6Pk*^z2a7jHrFM`7@KvgBrK{TAsY;Zldo&Zr`PAtLFV)&5Lgc+N>>nSsb7Qj;Xm zE*!Jfu+fpGe+VEBXp6P0J{x6B(*w#D@&{neSvDs$$*v__65cxuh zwmCK@?4QtEZiFRf=Fq=$oDf9A8-Y?x2dY@GLH7eBdFvOxDH1sD@N8}?bWluRE=aly z9sDPMoj>>8_Jgdx1eO*J?0F^G^BVTKvZ(F!mzRk{RPgH$BaJr;7S?SGCtk#V7nS?c zu;7jnnCc!H`j-U!@I#n3eyqLj3Dh2#>i%5yb*R3jI%IXSN5((PnIawQhPwto^nq&8 z(D2FY9>4Wp!(kLR!uT=_rud5F1Tg7NKIUE(%-M}^xIc#Hu}{t)ex>FA=MVqC%^#lm znQpw*|0nswpC8z*46jgPv-s4bWk2)g9%tHbhO}|}K7yhw@@C81 zk*oWlA$6Kg4ik$WQk8jIzn3b0_XvfgNAcU{e~p<$$nvn){5$t=pemUixf*e5drc=r z;ekw^6@=?VdZl=D-{c%ajOCA%fumcczli=K+$OU3)pe=k9x_KlGz#d82z*PVQevcg zDYJ=1isRRC>lNM}W)_=F$t)I{fuE3Ub&+XA8gH9-JRcL@F$KlJXKHGj?p_#|C`C&29X%Kn#L5(LJT7~HzA3gVmuu2YKtJ)JT!ZiK;x zneAk>=3&}gvr=wyn6l#{hw|cTJS^Kw8Jv!^LN4VFDDbl_(NQq_A6S^}`)>{Ujw>Eq z|K!5jiY<}Ff73~16l!*EXNcVXAi-cbS3OP?!E{zMSIj8ZMXKL`t0Vxu2Vk6`nqw8X zUQOi%y;NlJ3aVia|COD?2Zn;PNy~t+Ptd|zuLPv#%=8q;AxQNIe(sEo}!SWZBtgAJrFcrjd))NNu5SUV^FG4fK6hi`&@Pl|F?+g(&k{F-({YmqH!2hF!Ox82=|KN1s zuOVOhF`jb6y%drE3ja<%1og)_P2i34OI4X|DE_m|Z@2;#7aEi*Bnxdh+(aXnJTyBp zr-hiA7Rgpi59=jXX^$0T%J@soj>WktjkoI2k_fg_?E_c19WMAhy%E2}-?SI({2+gK zkU3NA7x81UU8SS2Vv0?hmgAvKRgfqPal2tw=HJX<)(HLEX(`=E3;Q`dxQNz;K5dde zOzAEo!TZ-dlV$p+emHdJehI3iwv-hJ+;3#iU3mYqe&QTv8Ie- z5?=Me_~-ozY+#b#&CVA!_USqW3-RJ57x67oozn@ETovC zN>E(m|NaO0zqj=ibqaEg?xlNbM%w+MWXs|UF&_}Q+evAHD57sEIgCvu3<5FY+ z**RTg&+nLbxJc9)+Hew&A(l_9_tO_>cyv8v89Q~Vl5dGe2Rs;Aax_mhV_K@r`pv8O z>%4Mr8TKZT#T9%Q)hczxIgiw(iuy&lrF2wlwBixs+&1)EYADXYC^2|a|jtXmoxIekTBrc{Rx?Ao?d*#jysA}u0;G^?dA)DdY>Zv7E=&knC z#?G|+Rlir5gm%Az-(AaZY7qrW#@_HA;p9#Lo;q%_N<1dRyoUGoo#*1E7M06RfcwQ? zh*xI_p^589Y91`ftDB+0VP}xWn#dh~4G$W8LvU_jyGL~0@B~H{W6NdWVzPMYzjg20 zdVetZM|6V&CFH)S9J8}7plGE#JkfY{s_2BOB{fLWW)#9K#E;KR#$KtD+e4}JmCgPi z_6i#hT7JWPcd!thpa`#z(=4^hH>HdqT`d2NOaeS6KHGZ~6^w5yIu_Ld3jb|gQ%9=I zXbb5RCY33vQb`_|#EefU7bZ+7pD7)|9H3J8)1Q26`gdXO>bs!*o6=o+|7h#(c}<<77^3bvOUx*o0jj&fo}Pp`a3t(Q~1ph z>rfvr+ltg40~?L%dB`tu6zwnQ#S`^m#Aeu*Fqp!&{{{5DcwK`^z=f)Wv!Qe)pn8m? zk@@s*=%cXg>EDWinEqeojnrc6A^|v-HwbOn2@`Uy%JggNQ_xmDpHj}Sm#yOSp?J~S zhot@;(mv*?8LPwhFO>}}xSw0Z3i30D{Uh3pqn9TbEcyG}b#skS_SFxY+B7l*`^#ZG zY6vgJy{1R|;r>>20Q<`?`3}v#b{;kSoBgHXpLG0fEv8g)Q80Gx1ohBJCr&GAuj$Zo z$Hjk5K|y=XI;Hc1NWQIRBUY+9JrMz<=81wOb$?sc!B_tb<`;M)_w+HIBk>?^=!6)E z)WC`mG?s@`V0))G%M=guIxw3^WaD=OsnK}V5tRzL?h82M(e;-n?Pf!;jsBQj3^zno z7R2{p8mDGyhvP-Ilg0K7RQ#AHdF)`Pd{);hELi6MoNsr^=a%+x8h^RJM#nCC)wKzt zmYA(1isju{8lzR*O`zYW>6IEknZ|Rt zk+(ng-NpW>6OuGW+7mb0v+aouS63E9nx3$PC!!VT_9Ba0ctgqJCG0jbu6q)5>NYGL zPD4lEQFbd+;5^Pxf%~>uI+0O!^%y_$66eQ)I*e+PQ!H=t;pRvFi~Q8PpE>Slru&)7 z5Bg6aVRG$WzuHtviDRC^x`?gWKMxn{s}H2it}xu?^eS3*vC`#$dZ*iKP&1!`xyrvW{(dx)AF$5#N)v z4NnTT;TjR;Nx?QeiEVgB-ZngmZTRy~e9Sg{*`S`3_v5zV>R!3E4fkXBnxt)bJKL~k zKf9Df6Ib2j$nw4X2Kt_We@+#@yig*;4DL(t!ui2gN(ZXBkolaV`cxQu_&JRr3(1bmN6k}(wb57=gCD4_+cnb1(n z2|R%t6dLLcG}L#%2cjk&CCMsG)EXo!@lglc37w4ks*FLzRPeDLd|XPdQ-zOHgpU)2 zkDzJI3cUy)k=}?coUsC2Ua8`aE&Ly%No=)N3S$Su>#032X>Q)O%WoLa8zlvBVN9H% zfgaqyDL!&#uiSZ@Aw+oe#csq2z7Xd+HF1hk<>txu{I3@YJK+CsbeOsazdM`n>iwAS zeiZJG4&Chih~86A4m%$(zq+Mbx1#E-@Y(GAdWq*b75FzVaFZ${*dCPRJ?Ku&m`D7t zylWHr|0=eA!y_Lz-j=V!W3zzzTO!Yiwb_xfgTJ*JA!xRSR-KNs0#@uPj1IyUmu9>2H8De!SD z!IY*qIb8nZ3ODr)+?-e9Gq4OJf{=m3zOzK%Cdv~B4@bA2SF#LRC=5mVyPt0PsH?Fh z_H5*y=`Fg0l|+tm@A*G`gjVHxmDn-nDgRe%`V?gT2o_&>VGfI{p@Uu?{yMhLD-^$? zgZ3kkB@NVDT^u=+N8NC~iViK|N89j_;xL z6oG-px7HqKEcFtwbQ)vbUt(i?1!Md+7ifoLyr;Ft_?9XigI*h7EG|oSGR94-Y>e0T z9OEN8G%z(wvDVNy%Ypxx#~5e?x5b44z#H7dOx$0Qtud$-0-?;ccV8{v$Wu^~=NY{>d)Jd(l5-nPWCO#p7+V zfhyQvWZx4_JYn=l(duN#+OV*H0k`z>#%|MN*w}Jb+Lp7`|I!0CdW^k%W8U=p{e`uf zs#_Ld>l^piTYZoF8#v0Cfi#vw{@EH^L_{1SANCsN6OHe5ze?kC-wR{!dHy>a4yg9F zVT6Q_qkjToroFJqidIZ7n|EZEjbIY4vXKlfkQ=8h&sYm}GY{_}nPm`?aPQj^O{~Lw z$sfMiNakohp*GOor(Enwuwase=#4E+->DBoX!2ZE2}8!YtS3nrqGvMdt1=SFXey79 zktUpoj9fm)Qi0gF0lpv()gq8SRuM%mwzWVh679DfFBbrC@>+H4NdHBN1 zwIVs2?&>^TNP%wW;c-^t-<*ek`k_PK)j!Xkhgtr=+Y9Dhml)%M>Xf^ zg<3(<`2(rixvbJ+&Sf=BHLq1XRSy)&{5Vh5&CXL5)4A8=PT~K8ORRNAgy<4B*zp6P z*!gC+sIm5~OYFe4IQGh_kwEUx|3Cw_8bi2!>H-t z7vJg`vXMQ|57l&FH-$R}7N*^7MgO2&5MhdzNUDV89J8|CfB)S+w%ZJOuTK!)kn7ua zLBAUQc{+kNuI>Ouj*Qt3A>Scpfn`+FUw??lJh+A!1vTT;@v8QkN;kQe_m3WSG!FY^ z5WHKw)*alto;SzX%F31R;tv0@BJC#xDmkogp#NL_N#`H0<(kTz*YaRd^-qEep3dt( z2HSBMH#Zht?OTEE;zU%PImMl9;2A+8?GY@^JC+dm*&ak1b-S&X9AnW*l2r_BO=n$_ zV6w@YQoD}UU6?G%(1 z(NP~N-ZuWTFUuv!sYzQTI349;nnrG4&1Gw-NuNYb`d&{p=?;XEkwz)c;MC+2wfJY0 ztxLRNuAon&zsxDRmu(j|aYTMY?uZxWbJy?>Dv*tJpWjw49V0tEgpYQ-^JK zL-o42ZH8*zehkwRE(JM9V-%m1IVH!xajkM~>OvE*nwWO_3jeung6JWLdh?XTxtsZ> zJ2?;Irh*kGCZ=s>tzXP4qFmxNb>Pc@1+3ESGup_eidq422#aPm<@3~%%nAsdd))t6YWcvJ^7$o|&xeqrnlFZu25{+6v!f|t7$1PUFV8Rl*NQ+&qx zvcyrS=k%6nCn~Y8sKkTpZj$8Jw`caio)`G|UuWhVW=9ie0nBMk$a!Uusut0uQ+_In zqgeAgMuFQ4ZqY$#4ToqdjWoS&T3zEwr_r8#)P$Mrad_mTH)(i^47G`K%F>)cNPXz^ zJbr+Y_g{U7E^)^#@w}eZBOLBVf32R1{a2yND2Qq@hh+xXQUVjdq6e>GL32U8uVye) zMcHQmd66%@9;xqo5?W=-!#A2BJu^hy-^L${0+S0y`Uc7oMcGJck9aJNe9EJzw@CNV zu0b#Xbg_S~z9-?n%+XwNP~shapDjv+%&&PHI+_&_XYEg?oznAioILW^fem$}0m&*+ z_Jibsb~(<|B$+q@sf%5UbKKHt4a0Y9IPRy-s82{Si|$kjPy^C#W{Kxj@K!i z&X;IBIGZG9haw|4{cX@KIIQ;(sO?AkpXv ziW(K$P-B}YwxFm)P%>nOoRJx&1u9ihZc~+3Z4qVwg^=JRlH+j{TdnlAR@&NIY-^>h zB2ph2z$73_c&I2U!53#7)bKC~0m=Wn_BrziuiE~4|DVtGBbjsd+0V7tUVH7e*W(14 z9mUKN;8&R0%dHSIaZG0R>Y^Ei8N&VftEENf?wbkT0y${Ylh=1_d#!$BjrF4sg{@O^ zL%BqCuJ5$|IlvyCRh^rA-`A>N4cPAcJBL2Q`v8O$YK=dX3zog{D#3vAfbf_no3*cE(o?s>k?BTPMo?tHKosC*u`1+6P z3FZbVlIaPiNBZa7V#Zf0o>45j{#X3J;2WZVbAeWO4ebP?6>w!3jUa$M#CS`RN_!b^ zHHqtr{=~kO%w0`xxuDL) z{x*Pbk`Jg2CoJt*q1*kY@;E0}u%Q|1!do{diOEvvR(uU=_4mj&EH-ZJL(7B4huk)z z--i(ot8Bj<{)8356Qh;*MC8Qb@B2+ct$i*V(se5Ddw~&C3ZXH=JBD6Pd`~wwoOqD|$6BYc(Auhuq%tDdPm}+Oki4hJRL!TxFk}Yu>bAh2~qf=)F|HyfN@=_U^ zIT0?`-AZv7O;A!Sj$wV!EFhZb4#>KK)LCg_F7zk^USifO_BzUe4xL}=c=^-nehoO% zPIS6LYm@G5w7NwKQrH~Ucfe_(==yV&Frk(^{S5#(UMw4) zF><8>dUL$c0eVLQGkOJdVZojAjd`(D{65mR40yv618@B2t2Q#=eaV-C_a9^%?d^WR zV)*KQDy0wbt%M@mvfVoRZq?smyE0Gt^xLv)ZL_>&0H5UXOdf^xpB&F*H#6lw7meDL zmt{S`cO5z1cxpJ7K7b?7fxe*;fYU$0Y4JD*N2{A^>lb;6j{HK<#@P_Hx+_>zBJzV$ zWLV9&h^kX5#-6QuDoii_8zt^8j=*}w-OV)fjOi&)QBVr9$DtHhTM~=+Cq&r%0!F*h zj+1Gzw1~wkhVMut{ADmR;l^2KA}I^xaUiyeKs-4-+H?dDF|Vb|5kpTtnP4Nv>xOzp zXkv~74=3VmVp^dxf3Jq7+{Fw9qc>x;-4X6DLFXuD+q}zdplDYH2DM?%rqz$;Jy15I zFpNhbh^bN#-fg|DfM30o&NdNy^$f^sCU%2wdSnhr_I|S3{WO@aHnctdvGjn}PmceV zC(dt9`x}!P2|&f!CKkxsCkkt!VX`jKdkUq6$^eOb0#2Gd{?@W4Tb<1RG^|uH` z67BG$Q^aGss8jwyl$k8sL(&yukL?Qajg%|IGel%)yIr+iA?EGTzPCa9=E|A3;%s%4 zac|LsONS+Uyp*k7-&stq9b>%<&->nt@caBtXHy#IwX$EEQv?{O@l2roW zSuy|13#8H?t;7x*J(0c;`7T);*ZF&UIwWWtzE!(r8vxpM>TG4&VPwk?a^jStD{(8K z#ipN@UPK|{m#K{ygufi8)y0r2E~p?^zqorpkjLSQun7B@C1fF@_tu+4;n<_? zKj_%wR6h=H03xn~1x)QS1>+O*#63=b}MyI$m;wo5@H5D|Jc$#l$|8p$jCM%zLD|=qRKz)l)pb! z-Y>gn*di{c@`Y#j>1*)_^C3vWcnR5qBav%lCsvJXbyxD7tl;aa10QB~;Jy!19e5@2 zKlXkdC~KSkjKaX}LjS_Q6YScHhtA*jYGp6PCD{u1e5qED4N5mZh>N|k;(w^`m5lnH zP1d(uknz{^Gm$al{Py$-CvsK7{vhXJw%aFqz1MRa*XO4sp#aycFX(f>^A-53^E3J} zk)6Pqn-e(3OO%sI#2!9&-m41q(wLHdM0t%OkC5PKE3Ml1fCZWJ133cZ8M%rXjI2hf z8!v$ANzSYvh&!7*wHiU>K5Wu!+4K-{Omr%5w!ZGvoU7+dw!}v&Y>QoMa=db$POU$< zUgt`{#8Uu08b-%k{bsPx?l`v*6S+_hf#&-)+Z{iFj<*Jla6$ZZwoZhXMQq0* zn5hb32kGgXM=rm>DSwfa7hh0HSniJ;$o0IK3vvau$^($TZ|IS>E+n@=bYp0^-JK1I z3lGU>1`%4?c}1|aUWxBJ-_l(hkntBKa2>=jA~7o4j!G&)EF-ISAo}h?z^QAMTaX`? zpcM^k2*1N+a3Crw!K>RSR-_w&LMF>w2$;QvYzcDi z8#qdtw%2u3QlH8ewv4(~*g_b75QkWo+_5nOTSFJ7ryqV{MlRBPj6q<)&tx@~=%x6< zT3JNDQRHTR1@7T3Y*~Ui@doJunEuo}xem1TWyF*&(%pYLqS)6b$LEn_a(p^}dwt)h zzP~y-9#G%Qdwsuz8^Iw=PF8c}aQWf2Tz;D?b@}0Soc%h2PZ)3BFtvW`Y=n;oTw9SA#df%@Tem4myXdD*@mEbKo~Fm% za|1q^%bk1^P3|c|S966W7)*)>-!4{w^dr5#=I<;KKGWFmHE*8kHEX8% z%682Cp%LE9qHXc9zcu_s77w29tG4-EA9%Ucly1HDt~w^*c7&K~QzRM!&2twch+wR; zzC%A)Idtq3=m+`&KO?`_oHNa9R86G?IXRl)&DAsgRn7Gsv#;=B_U6;0I_w#u$k=wb zr)*eW_`+b7H_z>#-v#BY37vylL0)dah458EyS@<~fF+!0=ea#-=y?r0D6of*USrNQ z(2p7OZ1iF_cINS;LQ<{x2}#zCW6>~-J}(-hd_Ju!FKfjB zNq=IJq+fKVB*^L))cpl%=8S3bcH4OC%gIktQ(?q*-4 zqAY#W4qf|Q%Z#rK?I^GP$OR&pzRmPdTFK~PkUb)=d8{##onxEzI2M6s#kBgyd26^k z2)Kyp1u;O7!D%*n&d-2;0;5Jp{!T`wp1hA@+ag9V+udB~AbN(qni8lA^luNC-u_+U z>!)F<`TGq-*X-IlE?cYJ>!YlC>%-gq zmq<;QQd7E(|V?hSf4oH~Z_RKUW-R8*GqzZe-5z?78*{=Gj7OPWopt z$5Yh|^3Of7OE-s|sFxC#d+u>vL>oSiiNZu_JcsHS?sZz{Zd~dze4B%?VRcV|BoGN{ zJ$!cje|UqPk{NheW@ulwR@Y4<@>#3@f~SfO_oiH}{uMHMFno#^3sYtEEXfUj!xOz7 zhIE^9()Mb=nAjLJ-m!{_KN&ReG%c@qh4i&3=yDWkI7oFPDkf>s&w224zG)A4fZ(pz zcr|FeF6BQUJ|yLX+$mFbY?b$Ox8%c_Q!M^GB`ZU2JzEqm|oBV)Vn0m;6ST8(w<5($nBNtD0(90}K1GU` z+NAhdKCd`g(!Vx7o7m;U-i>?&L)2_N`G%sSQqH>Mq-+dGHj^tWK9^!oCY0x7zNLr5foBi%7#DL?ZghUP}6JCo|iuk-b)j#6Y@R|3FbJcB>9c@;jKWA1E z9*6un9OMxh_ebEWE|*f~Q`)jUb!(I*l;+#zX_!@_E!*wG0zti$dK#`iH)vcn#An<* zob7tvWwxe_%M+<#^$u3@hi3}_OPXGoSECf=R!h}ib#-c~?x2?*^U7R>6Z(*-XH@ii z^O!OJmdL*O+I@F`NwNKXiK63=eTb3vXVwP5i09yP?(oY+=O@p4LZws^{rv`=84?x1 zW8kicmshfev%2^l5XjHaX= z<1K3vl`}>4Lj{FJ23R5wC`C~D%wNaPP;XtX@G0i362Zs<24Pnjej@P~Y2>DkR3pDm z{K9Gm`WgDo4!_6^_F{(ZGw>qaVTNtBSEb00Y&`miXej!%tL&%++Eq;+9NBxc2SJ^t zfaZPKu^H!HRom>l zUs8}7;GfN#8x!^Q`VTzFy$pA;woL3*#fCsw*hg7(Xg;4V_z@;nL5`kN!F-+Q&$*K2 z&=UHt*h=9B!fDc;@-drP`0SX;e%Yx*?9^1}?bI_!Me2ho3O!13#n@~0t~LC}#1ld( zdZ&v2!%aeDWOqJjy|v8&nfJ{hs`JY_s#8NKtyLHyBw>Ur+G-18P%EUQ;tnN_V^AN7tA^JFb0V&Xyb80(FKdF&~eeKzz%sffDq98%paEZ_@iOVCCQQn%9Wj#&t z!}5i;SdWk{nZ+JkGM`N5L-=?6%Y!$yHF{RKzsKnGnlq+WMh9Q+9dXO8^9D9m=q}F- zER`O7??S&a)kZnrc*8q12d%rvmb`urxIXh5ZQjy$y^6ck zk8-Tn7*)WyWs)o&>yNz1AbhS)pYcVa2n82pGX&HynkhwS52w&#RcOv64un&@#w}Ch zXD~`@TzT4lK=xX01p15|p2XvRRvX{(xsUt6St!n3%}lhy#^?B-{aLa9r|SRC?cxQz z^v%$1`YkJm2RNpbHV2~aO@2HWMBP2XoU8dA34YiGJGTd;R}GP@{?e7`=WP_3v7Y1J zl!l;Q)*LG4%*l?1Fl)Cyzq?V(Lhk67oh8zki|it?Rci4Ikp^<2T^!k$GyR*k{E%yR z>p>_-vfpe2Xg=LgVE5C>ojq%d+(Y416izr?uzWZbCHgEM$PZgxiP$#`Px0R)EU!=^ zsi*ASF#f_}J&c(DysHXA#Qcb{KH@og=LW_L*elrtYjS1t6TCm(QDVuV0{aom@Ft}5 zh!1+K?d3L}o_-rb$mIRD&^P=a2v?-`MiSm#%?f`ezd$RQY4r?rS6q4N8y zS7qEUCRg16IZuhcP95p#^;R?6-;Bv1|JgMACRM72RcDhQJ9QkXscl?oiEV^)v-z{h z@tZ)ObpI4Rw8WL2v?Bb}}QO=y=L0{I99JNHEz|ottc9YM{Ur8{TNL#;1S6{9EFMRPt_Gy|TjDBMmEO=4W zeX$qq#rg;MXojBxWECEx#e=LO@ipn6$8>iaO|ehi#>&Whx!$~$)Rx!k;bw)bg+}Lw z&&oTRT%j!!Np_&&JD z_jZGCr}m8Rotq5bC-?ZaHTXWWV+3+zz#VE)ZOyo>5b~hOt9^+3Dm}(759joR=u3Ib zkt;pMeorjnHugu}r-v^`cJ#~J=HWmfna}VVTQ*ppj#aMEW}kW8O8OXD>E=uLBbtB8 zQ`G9IZF7mX9Ubw~jl`|A^OO|5%44ii?F>#YzlHxsdx3O&tGz`lYu`hTp_*%$xRX8r zhKW{he=I3^iqb#laD!tCW8y-ldlA#U82OY|SIdOq2SV7n1w01Dm&5C9q4wT%4kt0J z2<|j|e};4>cPOv&_p#GaCevVmR zYG;0m%&YJ5J=fq{$E-iktiN)P@5Kh+`UDqnEeS$m#}a)&rgpb|^T^8Kwr{P`sOPl? z^FH^-J}L6le&{lTe`WzlUEYS<*3k(%f(}Tem+EbL?o#U~EpNnswa0ixg$O#pT>*ez z0-%@LFx(E?3=GfpK$2pg6=lHDSNBP1#88f2?|8W#UE=c^5?afzCXjxdqo3>EvX~+ky?zkQl~j! zpV5k}$k+t3=j}mQl=qe~U?15}F`74gh9jhROz%Fo*9h%%b8(gM)b2n6DJto{b>4>R z&Ge^*{-9XgE1pj;`g#a_);T7L4sbw=_ll+ugP_`AT7f|?V1jJClmyYdNxr%d;FdeQ zMz?j%qXHi9`B{kxh^*eG9Na5zVWxBJ;00vk`NEbL2;QJPgkGot>?T1MnAv2I(06nJ}+f|W)Kq<~JT)!*b>C#@t`|B%$dDr0`+ z#<2tuq&*3Jv0VmdFZCGBnM0o^L%)Wua~GX4^lJJu`Ryj(2hz$GM%k7)J9z|D&O(H| zZI-2OFD-*ia>=OFpOj;G9ipxpO~{ti>0F>g1fP?jFq*a<`$rJHnjwfurQ(p?*MlE@cXU6ewhBs`MyH9TXR zkmW7wjVV-H$QLgl=H`UC+g{(5va||^=)p;>znGYo z$#-2@OY_C>bC{KSO$S&y~FqXjfGTC z^WBT(Bma?_6fr0*gkJcYv={Y3VuGs;IHu22 zmiVYehoLk~#N>=cP6&aclOoQ#it9-K%FYP)7zz@bT(I|XM&U!aFYNvx#UIIjxks4k z-446YhWWZ|m|H_N#TeVrfUB*T|Z>`_3 z>+dacNT09L^rC>6nf@v^t+xIK5xU>Y^BOOEjI~$_UK7lF!=Hx`xOz( z2L%Y%D0#?Xkvjqi>PmYlf3MO9ZQ_8BN+*#!An`|3{`NnYRQ|?zvCSVNLQ3QS0W^Zq z@jbyo1nVT4vbz;=ZFqRRO}b!o2g~-)I#cOLZ4n(Qt?miZ9X%N^JkC!_F_VJ&iAUmGwu397bfe92L^4CQachw=Cy^15svN_u_Q7(TR)yzEZ3HG zfZ=#LSYvHNzABim)Gw_5bj~OQ%1YnHwzWDu{`e1WJrQGv4(@i3^>0*EZBG8|rfu9w_ZJmTIrK*AMf__PzC^ z7lc+}1~|K*xm=MG9&;UYIdr+Wb|Jp?F;zMLc|_|A4prkEac*)F2KYt)GTD{zMRDni#HH>9RPp8DpfW(s2vP00 zc~D`hmD^hfhkAz`4;RJjI420Eey%XJO{XS)LqUSLJXQx}q>`Q$J zO!fCxApQR>R5o(;?B{G@dhLo#VR~{u3789N1-8QTvm+pMZbDIxU1CDaO$5t8tdI6g zDAqUfkqfp{wiAT-T@lT{LeJZ!=fwgXolytP3``_Ry~*4Ei*3u-{7NyQ=c{zn z74r|mZl`iKSlS|luFMwZ7;F4xEuypD63Bx@3!!^bCeV(3+)nJ{j6zzSh^xe!PlO%6 z`DAE%>rS!eiiGzPURgXqPaVjb{Lm6(7Q&5-U*?0=v}+Qq89YNzb*8x zUFcm)XjP&jDbJ+7&~QQuNnPJe)&;$5lzcl9XWGG;+f{Jp)DX3Lk?sxUcCCkdrA(n+ zl7AdOPD$1O3x*a6yZOvwddx<7MPyFE6)u4Lf!DXLA`yl^F^qSc>z-^WP60l+*=D=- zoH>)sze{N;aPWQ?`}e^_4&J=IhDwH-I<|qRXWIH~ndkXJw9sv)+CmJ3I2V!H2ch#g z_M)8lp-5IZRju=(DK)`gwb~Dwc{*Nlg-3hMVKEP4z{F)f3CHRjW?$H0v$}Gn(CaYk zH9iv2$o2G(V`ThzzI)A3jC*%34?3)`BP$iRb$2n2RAsk2mB~2*X^6>%Yjotx!K$Xw z+Op6p1b6Z8gc~X!;rMe?_x<4^^<+R!&8i_J&DF zE(2BVqs?J^fQcH^$JPT-AmlJb0yMat(dK|%#_N%fa`T!*O0#>kF<_VJTj%JlW?r5M z#N%^7Afz@iw;d%YQ{FAM!AdW#>eYZui0NKqtb%`v?9UF5^4#NHDaHHbE zYae;;6Q1fpJ7`1Sn>-hK*We*LJW0fk&79BpugSMFD=sqMCH?F`s%Sp!-k>xeS{cTQ zo7q6Ewqm9Eutg|q^rDM5CN&>QE>P)`(F*KxWi=}Yhf*y*X*QE8k4^P&%af_TDPgbr z1V{S8J?fJZ`PRQfCMET)-^LSyUrr%y9I>sW9@^wpfvS}i_dx2@{*DTnzbdfC?HN8{ zjXV4mIE(An^r^V?x>%oZf3%^li^+JeThmwg)Eh)@tkq2hvJzGrA*OrHl78XijaQfS z3oVQ1N&0#!+UK@o-~zjS)a8Yq)|c>6w5wEo-hIH2fMKK|=hL~;iESU0IDuzTFj87$ zMNnBK)(w83V0#gHl8IFFcqT7>)GYS5 zC-Fk>F6qOA5SO7sU^4MTHy11x;F}N2hL}lx()uFm4kA($$PSm!KPVGabAH+DHKp^r z<$1aM(E=;AWv#Gj!m-g;Ie>hVBX{i_Ju6g{NmjTsckVH48|2xPW_8+R38HqoB5DK4 zBsA(y?rMz4V)7(bI5Y~sVMziv_kBg+&N>Q#JIi!s33X#>{6nfZB!pIae97~9AtsH+ z#C2t_&(r8~<|>moXGYKbgSAu>{;Fp_B&Z-uMX2qaF@A?zHk+E7pJj2G%a|47m7&I zA+3!d14X4*)#DxLgVnE5LT2F4LRzgUTEF6#I z-(x6*hIzu$@4#wC-r5w^95Zb=L=8ji>R!L ztqH7qi}iRbich#3i6TvohSyoYkav5jjinpxC)$0hc+i$XdY4VyOuvS%k+FnMn$?tVJHJ^;y0-8J=~ynHp$=c zx#T!Uo-UI=THPm-tIW>TlOwtKtJO*9Ku_LYZP}Z&?ls;+f;|I#@vo@6IXpI~=}Kx* zW#CpmHr|Z4+wV4HZr`RzK~biJ(P>iX$Vm&(uD~c&cpaai7^wK^lut8*nf%W9ahYTe zmg{JgP7t&5Q-{nQpF!pr&`~Jb5(MWCMO&YwXkw#k595#T9+RSty}LI>OWd0|0NXxB z?*F(?5KRm&KEE$juLO}+Y~zo;lpgv-wwG-$)JpP;D%oQ+TJuO2dac!G+vt@XfmSDm zm5MIUrkud@J!IgFF)k9!L#h&(Tu4=XKBR4FhiT3iY^1+G>Fw1(SMd#exUguAW1by8?YT#UFgm|<#Y zqsbMY@yCYTwL6apIq#8^&nH;`8ooXg9eQ)^zd&Bk*9@-x4{zI;e3Sv|s;|Adb~@TF z9Tg1#yQ6OnJaTf~k&|yD*+vKn`H(RNt!_98GFMu?C^@P5+HJkUhHs;G{5%E8 zvUUHv;=%IpmzJ#B-D;L!zV@5 z3}w^T2_ew4Yp_b!%iesa|x zm*z}THwKx@**<>>|6ZtIOmvfr%qGQVTkI?=3Ug@jj?)!8-A)3Z-{7=dud8&) zXnpvh3!nVDtGQlY`6{gTPUo?yUd;XA|I|mc{!~@-S4*2H7T9d4s^-^J!$_^dKf;D8 zep=3_O_fyq<#bS#zL>BhcwcSGI(Dg4{h8-a-DA9A>@mWR;Q+7EtPDiD@H2@fXsFcD z^5le~wDp>NPcb6j5PWQ%x5-A*-3$L$1o!8}Ax# z2{G%am2)U}L(XNHS4A>Q->nPWH@?B)<65Jwwr%YwE`Z<`N$E;s9D`p6u zull)O9sAuD)v*A*$`tNbb6a(gYjJyxU$6Sr>zcKffM41b32*fUarc+&o#fW;l`v9X zjP8u!LXUzIej*y<)uh5e8qI*|3!VkOje5>(y2NSyJ-bUU*CekMcW|xPtgaQS*GYN% zY7xUmb(tpad4E+Oi*9 z^c-dF`J4NOfJrlcK=va7-)RrkKU5f66L(X`5~g7(O|x0+vg{_SV+i67Z(3i^J`dRE zW`(b#o9maSm(FvkrL$U|0;V#63Ybrb#g&NSsr@iRC_L11g>%n|wXvSseFL-w5|<8t zhnVIUC_Um+&dvh>Rr&W|Pua5_ji_Q&?w^@ZoE>=&wy@I@ZYN$#ArD$Mg(A&c0i2H2 zFY??sMF2^GB6CQu+I~xI=rI}(DI+liTn!J&SUi!r#f8~(uU0&@U2fQ-UIl-s3UVK+ zO4|Au9Ad5Cu#}Eap<=taiX!MJgh@jW;cCYm1fI(3{eGsA2 zC992LFM(myfnoFNo^UK)F8#`AWk~NF?Rj*|x$PT*Jrw)1(# z8PsDvS_JXYmf?K{ZRT(OJ|`=Fugm~yLxm0uP#tMFpDw52dERz4UOa@v2k^lkc|qN5 zYISos_GaADo@(z8azFb6YG&84^^u#8a6hZnT}a_xceGlBOIEZ6r-&`Oe92RL04tR@ppR)yn0Z30xrxtJeX%k$3vO$PiuCcok#-P1?7k0v+aF^VBuJ_>QEX=G1)Djq*&1W0i+PZ zgtOv0*&TfM;H@`>dHq3=49qJKoNNE>KgGHAP|`zi?go;;x&P+Jho*dC3g)M5uqWs) z8c&}u)dX99jERg#WVOLl9dlzy%wu)F{9Jlqe^Es>Y(&t&7r_qe%I!mQX z#nw4*b9ikUqr2kaeg7I5?TyJ$8GP7L9| z5j0;|Os|6GUqsd!|28_B$3n{91JVt9c=n!2-GntDEQ$38*2*D!Kx>+d2@HxO-1Qr; z#NU_LCI1n%lYbW;!Z{QO=O7%viju_A4&CfGwk6IR+NdpK&2?J29Cp+Bi+}|-O5`{p8a-5&9cbBJ8S+L>GsV1^HNvj;I(uA z5b2&WZ*gL=d7(L;+m24=;;}ewz!emTiGn}JTZ~fwDvYF7h2M%#qJ;!IhDg5^_J89| z``GcDM{-bl&zgz+qyw~K#1$jEg5t>Iq> z|1RC%(=&;GyZCn_3{9py99dscs9$qs05U)~uAYVp(Yy;WWt`vrEPKH8v-J5Zb^0hV z?qZ+jkPK(hPk0KKHm1p_yw$j0mf7T0%NHZ8$#~DuC(Pt8@h7XadpN#1<9!(rcT{E< zg^p{kcT>6Dkw@fGfn9Xoxzd;YsxQU*{8e^e-c*JXI9y5h1uba13-#j8EgkE|+wep# z2{6&t+p{1tu+?J!H-l5jA~YDMLgnRPZoeJZH!G`w7|7=2Ma{li#wE&cb@JQfyO;YJ zshX|LoLGxOc!QzNlFmRd{gcyE?kNIB-(r*^`F!+2VQ7eS@ndiPhdN5nYy7Er4|;ChC!T#pWTO@=4IB}8Qw8J02z zw5|aCM9IyM$&J5iuQC_yVUnCdNS_lIHPy>tU5RN@ST|HyO3~L# z*71GmhiN;xHB?_Xw;GSgQ1O4b&`<#qe0Y}lme=T%p6fX(s4-LZ3f9(K|A|TAI_Y!f z8S5yTUA+%P$(b_4izRl;JFf^OLzS<-3k3HzOwC4@Y$=D+)#$7n2QkyteCx{_hBWAC zg-^*Xuj|n2eXI#*KGE!3tksK%$9zO4al|7shgwt=lA;yP^p(A=-8+{u=-um8NEdud z)3dh_yc1n`pYge;^qqOT7`4{$2QoV&x6b|LA# z0N|_qRiCR#+x6d4iHZ)cV|i(<;@$2romBpDoGClvi4tgw0=z&Sg?tBqvKX_hgY2Xk zXIX%%4|+9YCy=ligIfH!?X*`q$c1kk>*jU6pl(dbcfO0A=3BxVr)l9>XoFZ{9(KA^ zgEWFmY|OF;nkxeZnZRJdP!mfB<7vSw8>eJFoGx!_J*2QIgN^>;CoWv>qjLdu**-|_ zD8;8?(9s~YArY6W5UYx_Yod>J9Y1&?C$dArO~BgBo(nRJRiDC#q1 zk!?tdG=xCG&Pb4CO}|(|rRJ*h_e~2?_F`1o)9G!1J<=TcrgaA`_zgFfV5?kqF}BU= zuWQe=+d~$zeokqslW)OBO47T4JuV)@WMI~6QV%oESJNeV|3+S!sv$q`ecgPBK1g!D z?C`*;`I?-Zuah(9OUQ)NU70Vrze>&*BkMI^&(Qm0%-8HQ4h3=Md~LD8oSLsYOH!a% z&qOm{&#U=T;G7%lvPuuD?lfn{jNUW$7oZ_*9!8+{K>S9axl5PnDN}PcbnB7kYYp<* zL*|Q32QMyq*~@d+_nNjJe6G%P!wC#V$p0+z46h5hz-ly(^ zL?0jTRgV3_nAO7Z&-Na6))Z!$QuY}-i+Mfd42jmNvSfg&gi|{D0&!sqxj$?SnFj}QbgtLu!V#5Vnr&TgSf@FqpC^HA$hKW1moAvj{ zU0EHzMwf&$U_I5+D6%2Cux4JF)T&pFE6}6E6eppV?$XU^lXTZc9cO8HGtj)R>#ns9 z8;O(Z`i;8gUyBkm1v%dqu=pAlN-vr#%2jXDrXXwu8O`QNvnm{>dF&DG;mKgQ<(yZM#hsFH;ae^>S zXow0lb`%PSDf?Vj=xls0IKwCa>+P*m-E5>KzYYg@Q*)Nfg&r9CUSOEld}6qCa>NtT zJc{29TJ-O9$rJU#$P6J(EY|Op2{wFB`Kw-nlgZ#io%QGNpWA$;pV|DUTyZ-5=k-jQ z&41dAePif`-ux$y6>a|0x6pb;G7JA09r=<#2E%oK72F^u>tEwjz<5GcVpcD-_C6pC zsOr6RHu0^ddVz&2F-KK^6{yW4*rh)pH|dMu5u^sJt&B%xbcTxJ1vqAVy~bw_+bKDE z(TKNicC7P6E7@idnAS#kgw?if49f_kO5sHtrQ1yGYWdCl2$`V3M2?sW-E3Cs@68!= z43{K6kQ%JZRtcws`l{k*yv8(q{Y(>XNwlO0mu3+QojDd<((1BFYx2FpTJCe&pAou< zQ5YOuzH}q%15@t1? z-QYL65X$^(60Mub3)9n!<&h3qzmC~Otot(W%O=O~KG55~```4p@hy5FgGG8fOvYed zRNZ+TKc{@!!4F;Zl0m@5DE>B3fz^$* z;=a@72Lf0~7$}t`-*uy1UTW!5#{T2nVMc0(088=YBn}ax7j1o7iNm%4t`!ea!206> zz#DzOjRZaqT822RK+<>TK_#NkOGfL|HJCq{xH=Hi#+Ui(ea>GY8vy&Z`MW)-(=9IltX!ASxxX=Lk7k($2Q)4z&u zu-0!um7W~^mY(6N4I%B`Zr$~=UJA#CufIso zH0`b%Sw|``hb|RHDhs>to;1W}&zy@_`%+4#*BSJn78~z=dG8VUXBF?lx?VtGUZ0C2 z<$^%j{?G;7SB$Veh%%)}SNvt$!uVH^;Bxp^xH9(${uRampvy&xMTVPnukaY<9rp?u z_+m<+x>c)T?CLTl9S-?d`~ZZ6}N24YsEI(YsH2j%KCV%2;^K_!Vx-_EY*)jV60DUmGXWrQu$9sO5+eQ{k-J; zLz(pf023(P8`F%>SWEHwN=6^h_i}=hd8UyjS5?FQP5e~_Y8a<2Q&2# zwGB#PNYEH|!lrP4?EA!xHPD}VR{TWJ9FH2-1XC?k=YzJOgPOF+>9PpKa`?f--EMTXu3h`wZe5j#FMnxaess-_q$SeI$_ zKVvqM7x-4TKs+O=NE_AT&|?K4&pLWk5qviFjw%k zIldq$F|_3ns7L4EA?Au)C%#BV)Bsjc`@iFo+nP zWW*O~5fd6b7Hp9CBD|>hA{bocTw&l2M+NrM>V$3ga2%S!jcij-{Fef21CzB&#jc_5 zQ(na&B2d=uxZp<*8W;RQRkdSRflFbO=tjm^Hr*i)_MKwYagx|@9w*dBA2Gckl<*rT zNdygZz)JaMz?kEt&y735;fbHBuGv-@k;LBu#sDPm-2@JghatH)Ell+XwK(a^pmwp# zh$jPbU?3m5EIqr@KEXQj#G#PW{_U!LUT88O*&&99_KV&AZ)tI*-D2YB%Bs`ycd5<3 zH~mP;f8{LWHGI$c#ReD!WAVplHB&-7xz*JQ1f#g+6G+M zGNV$z`A~$vhF)fj8_Cyl`3iW3i2WRA!6Aur)Om=l9FHC=2XiEC1RyZ!clObZ3nJc@ zTIEF|Ha3i+Z0#)@Z7i@nnrPC+y81 zYXIksXm2^usc~2a&JBYGNH==M z7Ygqz9J;89Ok9T~t-5cvc9%x&PRr#*<9)4H`D)_50B3$aaC?Nu+tNA790)z4*x z`V(vzN1Pk<5yN6y-5?>Vivs50ScO(VKaz+l=CR^z{hy)vAVG6Z?hCEoz_M#4NLUX= zcbt!>FkY+k(&_Y+9s%X!#pEEG@o-lfM5!t18CP-$EK@oVVnSTM9)`3g5#ljekiTzf+B zN+>G^VatVTWQKdFF<~g91WhLl&5z`$D$)RqpCEuRf=eN9Zsrm8nDcV$UBW9=FVv$~ zw;QixkR@(z@$?cJsdv5$ubf^$H!W-iH-sE{-16Jx$%iArIdD%?m@o!-ZHaVGn{jGf z%>UKN-cHf(5~T&fXjgZ-GKDXP*VpWkqwg7B>linx|O79PEyEDn#-W#wR+hGt^PVWs2F|Y z;*VJACz>~MM{IFd#0`XOUKt8>_E|*{|1g}3oH{?N$vkZycK?b0Bz9qV?5^SHbGB-C znREa;)`DyPqJVib4!~<*eufo`eF7BehTOo2nnJC<1L*4}5m2|l|7dr|S@|mXaa4D~ zQjF4F(0nYbHgw_c&)@lux??up_Lr{qmu?H;K6M9TBSH{Zv*)XsZzUQ)ZqS9Wucm<5 zz6n~-jsH}&F^ev6$icT$=^j0{AAiGFK@3~;^ZLnj#=3L#vQ0BeUlb>L0b-KY&7hQ3 zUrV)Icp@lV3}UrfGua*EeyLF18sR2GU`F# ztZKK0@Dhv`Z@Vh${wz?I0NYx_mk2E)FbiV|ly+%%KPXMax^nbG01<1;R`DH5#YsnF z0`)io+lVtniKKjMF(<=UwYqmGi~ub$G>xKi|L{JN9oRVzsC_vPA?{uURPlNBc3{NJ zT&->?rGjM#!mkI*UYao(IY6M4p&Z_YNE_iU^Xp|?0arX&`XOGudFHY%Pzu1eA-q9d z&u^^96PeWp+Mrm0dW8%VoAvme;9;<|ElA+xSWh;l%*$=idAl6VyPlq}5{E@w@DB{E zlKQFEfq4S68*==yM7G~pNu=a0eq)Pj{6WfJ8Fil*j0U?TG_3KSKeDe-yGu-v#zqGa z&v}hRvG7NS<--J^nXr4tnHWUBNdnG>Nl;}1Wglq^M4HIJafg@V$6-+rKU|SEf@uG7d&Q5>JZxGfpD1mB4{vG5YvoHh-w?ThNhddSu4|y>r{pjj8)Fd@j2; z^Cz&mKl&EG6!47j}`69m)rMgU>8r$!fQtBzf z*K_#8U|B5O$8R(yMgk`e@&oYW3sAlQ`tRqkdn8z^0axqLj!gVQ%!0Fzkwa}5w}(Hw zDmu6ufBdY`pt0I2t#%M$yC6b5#J+=&Z>Cn;9x$$SD z($p-eYfZxXyqR9Mocgr|1wy%!KE#YStkH9X^ufe#fp8tb$F@%pGw9k$SQ&+*0arq< z$8uFZuA;&;ekJ3a2?#$H@bw~Y^=HfeWz#YQbmrv&<8s}&o>hD$`9%c70d)y0u{T`f zkKZZS@}&{Z$3}E0!p&Ay;GXM92zUFJL%6>S3=cuLM-|oiCkO|Fa~Qr&1mBJe7~cWk ze#GEM+xSKlb3}e8SkK%c$VMLXP8-=q7Z7Gdt-IiIROpvNOCfV&k}3-W5+^DLxATj` z9KsbwR=SK0k?oMWgZVR#M@WVcJzm4y$%TH@&B|(o%)JMh!?I${LSg#X5r?86u&%HI zn$ki_|3J%Pm0qIKhpY6ZD!oyq>neScN^e!^Z7O}LN}sLL+xeRhA%;1NtaOJTmLvRS z5T$jz7P6W@7kuIuPI=@IXc&}kd!L~lbms!0Zx_&)ON73$+?t?oyM(`+xWr$!iF=5p z;S&Nxz88`a9|=bZ{oDv%@<~8Mz)RBiD1-|x{};d|(4B!dT>)8Q-Vx!YhWURAT;cu# zuoSqe!K5^}oDUAjhVsoi6E6;l6RZLJz>HY={A!>PS3cE^))}*8J2;Ryfdu)r{b9=; zVisTIdShNVli@tvzPrTsun2Ei5EyYYByb|j$Zu*v^CzqaOYJC=TV`H&G&0!a=SYCc zV!&WKTNNzb8A1RB^YW=^PnAmdsL1bnJ80Z2Bv4^lz-4h1Oeq&US z%_?Zjf>F#m5RQO>0~{g2-Zl zM}H057gD}Wiq(bBgXH`q{lldE7o_l;E&dxJrs>0Ywe0dJZXp=4C5UBBGlF_4XqINv zk!NwA(&X}QICy1rFhcd+fztOvC;3ZpB=DJBtOi4D$W#zCev%7fBd4rnioxiws@idX zQVLe5n6bmrnQ$dYpRNbfGVuA@8M4j8l&=g#2ZPf2pfpFD$<+3~R)=?6c=Uni1)?+H z!#E_tqaTDvzlL-`-zZMU)4W-VM~^WVFi1@-Xepz3^l!*AM_E@Hlc{2|bG6ziCvs?Z zu9!=rC)qm}8)Wm)4#lVQ#9C{#agGhI^G#UTB>Z8l-Ft<*-do^d%V=N7-$46f;kx%0 zsq`T#eW^-sRO#g^eVj^fRq1UieTqt-rqbK_o8PWDPTUQK(a+sT6rIpm&_U!f!m7Un z;<22Eb?Pqs9Kf2!-s{b(i#`bbNb&2J%YMe~p7874YCmiBm%Sdk43hAg)Wx~XA04n+ zj=4Az&f%m3TllK(YR?$&Vf=c~I89I@h!1!ow-gdYRM7#XyF08~Znx>7A_YE(Q)Mpa z$6j7FEU_nAnEp@jxxC@B-~aLi^rw#?FVHzM;pvnRcF>@v%6!Oy9M946w^q>_;;VYR z%W&v>zKapr;bZDQ;1PJ%i=q-tBY7VtFDf02C4WCbOyiM8FvQ8<%A@3Oli%ige6R3d z?I=m=az5o!NZ!#jQNJjep)NpVnCe_t(5%LYsj$mvvPpH3g7%y zn?-#n_Fguk`jz~v<)7*;yma+(o+e+uOL>rhbzT1Aa5``8{)ucHc>ky@zz&rrZRwxZ za5D88zRl>}V%wT6TWGV&ipH!_k&B-qgYfpG{*_dJG%6tEL!tUmgvVN=qJ*digN=$I zO%=m%W^=mT-d&R2z=eEGf!C~rmC79eJ64S(jZm*66?_p{}Y@;$pXWD#R>eFo7} zN%N_~V+whv3Hmms#An2Y~_Q=T4` zr}aD`l<_x@u@y%oPQ+bQn>bT+1D(4<*%GZ=CH15P936fmI}>m*&FYT~aU9=*(WeE| z=%*l>bg)1C`d6)Cd?Sw&zvFU$Gj}-20TjwNvwE?$o(B$yCtCA(NL(f}ExmHa+^oi& zF1GzPRcyJnNEHi18hfno+{%bYk)Rzf$IM;FtFYx(oZl3Ell3?`J`*O_zE4l?H!7Y* zz{TVBUEM~Feyy8c^hq#nwx@@nt`iH6@0pi-=O(S+tJIPf5h^qIpsC=b%71J z#?YB5`%mm?XBSxQj7<)Yco^O3kGyCBVAM`F@|Oq>NpPRU{T}dMt@1kXZdO&2kBkp* zQS*WT{XX7%*^12&AF|gRdK=9BqWO%>Y1*Z%^P2K1n|c?%fi_a_Hsl=NvdiW0KTz&# z%!i%&M5YYV;t*S0%I@$tFHnP0m83?*mi$#~?=3R+B>udpaIATO{K$XyLTDwAKl)-9 z3058B$Iad)Kt?SXYF0Uuc^{L!oR9=(CfRvUV)Z25#90UUoee{BE0W@_@jlFlT)NoD?qP+5BZUg$M{FB~#|Zk0DVe|O7Q`46|U|IYj^>pg$Y zYij;d@6P@{Zvu{Y8sD95);N^|?N$e)sS@CKR z##aAbjDFx!nFa>l4G>+eD0BRPBQhs9OS`X$3Ioy0 zKAkVKa^qs(&`*$GCQ8)(kK9E>FM4k2aaq;~%Jab=d5NHtW0A?fqD9qxh!eTGh^@9IcjGuaiki zO`z1_@&OJ77^zKM#C24Q*PK~mjv4HAwQCK3cdG@aTnA-ak5LEG$w1ZF9x--e2mAox z>r$=mPq2XjTpD-c&tI^rehpv!u@AC`c6gQxUBcmuZ|Fu5@SNm5e!>PfjJw-kwpXhw z6GqZ>U+C$Gxk9IT%9^zM@ZSQcf-R9dz@j?EX_ht33+h!YzF>=PqGx{9v<~lvuG~;Q z0gWYCu*dK|lEp2sirM21{VLMcC;Y2gTypsEFyYg@Es6Wm#6a}xBo@qlvzS_cRWtT6 z^#_oHPURK7e^pH4u9UL$_jwfWSF%ZY|c|+On-`c$#-h@A^~Y`yQkB zF+Opuc$!a!S4j$(&=Q#~!z+{T4DZK&LZXo>@m-sg}TSdpSelZ`taLaOagS$pEzXjjj9-L=-o(Ga>CUy4>UB}<-L{*BvQRBb5 z_xSZAjDIPtt#5Jsd_LK=3HoVu^Ql-OU6sVKqeOPDTD2pX;6rUSC(Bsj3%~*H%P@Fo$XKeNoq?jr7=Cy|h*|(1ICIBwU;=xZ~ zKlB4TLui|T-z?9iE_L}YZa$H2M)~20nBeYFyZcc|L-LCwoWbqF8hg6Z#0|0K~r4UmO2D}qiU%HpeI$M=OPndc^yi68X{>YDzf z(-{GX8iaY{Vh~_Sq$?+UmRR~lhdCYlR8+VnlIL%zMGV$Nr=9a%U5vgGVwdoI(JWwv zB1D1clLg^3;57u(K&kR+4Dlhh-JXtB?(oHds(#SiMm3Xt!UIN|fkrmU4yGoXxI#~Z zX5408g-_W|*K+%X94TB-<9U3HAH#6xlw@Q~KFS{sR9>>x@md9-5p~G3Ydcj|HMnDlR4} zW&)TKM#C(!&nyjn0bx{;R?RMm@8Px$d}u|Q>NgiOf>U~xe*h8|7lB^_RqqS+@I*)M zRkHRSMRsVW5~ezm8gk)!Rl z(CL_kl7;(}PtRACi*iU35#ZUKt zKu1)6F&TzH*PcX8{xj4JdxR{t%mUQc_XGxQ5-<3##V>)t1&mF>vfb0qCJteS$|yIV zsElIVo;c2H@Pf)Hm}UA{ZEg-`jff;!orIqy0ey2c`Gp}?=l#Y=Pqr3$ov92)uf$SK zyYFZ6Y#@yEEf1nU=4ILv`L<@JR;RAVOb?o+RwzF(s6{W^qSgOeReU>o@CUWJtGSr- zmW{~|ucQ95F}YzBAujiumze!V^bIc`irjUjR(AoJ%Z}vbBhTad9Vcf{1-1Q@tUmP=iXRM*`B)j#E zFV(H^*T`>o>0Oyp8w7uMy7Z?w)*CXJFUpb0nlxD`(kh9FfL3Ta6hd9Gpo8e~99ubF zguol(cnOcRx%9ji*1_zP_xQDQUq@@c;NIePDhZ#KIImYo1Uor&YBDSW*Lk-!3T=&x zbP8>ZixoG6v^i&bz8?>yU`YMzxMrt;J=*oLv?~7FP?8K){Ixb!qY_l{*NQ5ByY|hP zu2t;T%i8&Amqx5-ZfE??y7gl?;Ky(v&p${Ac}wE_VA<#LAR5?K#&WV00-z);8rZxj z4eZy@g2GLHT&OS?Ox$N5pZLB%T36i0u>IzP>Q^^T_8Y%aj|3$^*EvVBU(TjSFor8> z{ncCy0Ask?CeSQj^;{wwT+lwIw}?@4;v% z`GKVT2>+zE!G<}y#27s!GEWXlwZP3UQ3&yq)-!Z#;xzPSYv&EiA|4E)J#iO;jDJ=2 zb(rcDn*$a_x_d&~BHaf=WAR@UC`RPW6@Q22r|u)pe5!~K9K($^(A+fF2r-tw-bzIKV=q(M{_wBeMP#A6h6 zZs5@1QFdbi+@O;KGS!keP4 zL~OmWg@GzddO5tTqG%?1?c;N=s2cFc5hu^+Q|5jk^c*7AEctSlXur?M#U=b-^s1BT zJDQG(Txm~ou-*ga_or2u!*&|GgoTOqz-DR-HVJsE^6v}a`FA^x<&9lvEJb#?TrHw& zF6X%nOx&i;k@-rEIsON}1Vj@k`utMK6usy>A(YX7$4Z&Q-7F}BENRSINNz#& zlkivmz0AK8fkE;)h3^v2XuD+_D z-6f*)a%@Mj$#0?dDWCZ2O8d;QAC-3h!jWVo7M(ezOL6wBI#O ze+tVHt?m`_b7~F2MePY1uP`%<04Z~K$8;uEsb*Sybz(omq1G;tTNG1HHQ7nUp1gu5fgW@EB-FuF`Ry!dm?nr| zk&p-$5RHDe%^UN)d-`*T=j>>)k%Rd0c$W#Uoz2Wu=7tu?vF=yWdgA9c{k7+3ilCu0 zKcWemIX~kdP7`E)aF?k}J-?TpA8~gPsA}|>1MK;MU`Ff-`ne|}6C~&P(H-7IUzgF6 zoE@zqCjQbBZZ1ym6;pHd)`z$IWxk>99DXtCnhlgjn;siRFjze zFrF}!P!qh4 z2cjs~AXxNHQ1=R@&`3qacH8!;;`3&QHOT(hpCe0Z%eDT-K&>bElNbmSA=$cl;cg;V z1kAtvHec^2!Mn9q4m;E)?9dfZlAv6`3pX^PlMT7`Xxz{S zJ~Nn)yv+?}{X`r`YwUCTYv12iyXwXAXI!=W&zOFyCtA~5UfXk=_S03k^t_>5dk}k-ZQcfq zv?nh2bjGr1PkV4B_tWJ=x^cn0+k<(G2UQABUPtGKK}cG*2hGQdx6mdk@4ESmHlDoo z?V)NU5sl4sk;6?z33uO~$jIWX(3qe&jZ7~$=&i>@mOG(1V@LlC+XLCre~T{;xqtCj zxiRXJ9o<_jH!$IKe)AD&GHCw3O@55u+Z}jB-jpNddKo!)2~qjA^>fhk^@_Iq&t|gf6HpLvz{gv@GI=+%1 z?yT8)2)#*{4vt@i?%n`NfFRrDub7fcm>{_gCV-)*WWL~Ed;NJh>skZ)8B2v*I@eHJ#I<7AiK zx!r5bDbSm7i^5*5dAh9Asa!`#$Im%7wgY7vv`o6~_0tKy1WD(9R&qbU9L zF#jC?@BJ~x9=kusf7$-j))Z!iSaZ5rqx?{OJ~@6Sbt`^d&NoN+zW<7h@3NZa?<`OY zfek*LElPv~=7sRD@Ftzs5-Nm{+%5+HoTM?hH^&aJK84UBi_-ZrlI^SSO=|mU zgUYV>fQhh9T&^}Aiv&LZk5Xj;{wiIy z*6=6sEosX3bYgiaCF;yd64q(u*oBejY_tBPQ(%z{P^sx$VcBfYXnyVc%gJ%!9gZxo zpu^C%>q~UAZvguUxx_-Fl3!sTIsf{Wc2u0e-B!2-aqJSU{ysJ};-3uN8We#np?DZe zc%i!LL*MmRw z4K5^m=x%u2R&GXfH03zcgPpMmSZ-x?1VzS-&?0db@*`sa+)V*OgGd&nAE#?v*J=03 z`OjY!YCv>#5b^NEvZmxZ2o zM1m;c4|EEz+TA~8_)WfAh=8wwM;MEIqkb-*0#&!*<>-mo@@QC!AV3ZDW_$}#jaD8L zCO97?q2_6l1eV7>q++?OfhG`HP(IpC4<`cwg|laUM~~Kv`z}Qxut6WkGc@A&llZl# zJHC)!kW1=xa`|e3|KtYsebFH`&ispA2?MB?N@NUjf@Tx}Uj0>aK7K^*R#_288O4}N zH45pMpEI?sBPc#oo8fP)wenS6*iA!7glfo(T~ro*UchPPaCc`f-4KF?=VhGMXPlS? zS8kBpT&f7Vjom}t+?kP_?|BB4s9v5G9-o*(nG$@5kCSVj) zEJ4u{K_!ZnH9@mv7iMu6u!^PD)I*fgRxO2HKp_y^EHX@&rmeQL)s`M?>A}~$wOYg~ z8^9!w$wM9F%;&`N2FU%DK~f@a7d()fgFg z%~Am`q6ur3=T7fx=`;$glLjYXR58b@<>X@4%?A`XL=Q2aLxgCr%smQn{2ag!XF(yw}qyp?*j%P5aTTug2?@P61e?*f1I+JSsCHJ=J*lC2i(q0)h>NA2S!7-Z)4+2_e)`kVt5tiClx zS9d77`rvGV$}H0Qlvlx_K)xR_Tr8J@D%Ek?X^r-Qy!)#op$-Rc;pE(IABzSC!NeR0 zJ(CpGK#GFUn@|%7*pXy74UJFkNzEXHdnjV^ezrO}5#qA=21R=WCRe^A!1%-eRzT;# z;ZrvPq$Pl+wbd4qc=Bo~Qyx0Sek{05 zH}ndbN}(8(R3n@3soh1|;60E-Axl{j!f~A)KrLh| z`72D3$@;9xC%=z@m>p2dvz@fV$^J>KA?c>)rK#BV-BpX^QHumqP}7hc&W*{_=D|mMIQwV zly1Xqj38QKHGNAJZI+T5&}MW|w>$JXXuOsjkWHSwatHKz(o(JNJav0joZwQThWsE6 z=<~U(lp@c?+2lFYQ}9yaSMd7v0b|l4fmfx#*=hBn(w)FCwsb|P+4@C^+1%)mM*3S6 zDy<#$*0+T`4*6$DqvRI{`Eh0xZ4~UMUt9n5$IHO@lF&z&TEBU_^~?Anxr3>EZOIn*iYDF{SJW39SnS*K2C z{^@w65vK!(GT!j1gzn=+DKZN^%_zZ|GDw0%$}>hCr~tYRMwz_^iaSm8?bMx=o8-rQV;G1^$bw z5H_%CQArT39yg)_$cj2m>x2s&{!*}k;xBEs5`nAj4dVep4B13IQJzKx!dwdDpkh!I zZ+XWkXnG0nTW)hHx7R1GW&k#kmy>S489IM!t@x~&GlvUWw8{k`I!CQmjvdEpvRrZ4 z%~!3|j6z*uHamII@OV585XGjjhZDVsDkF`*toGSIZ)DOp7UiLZ%w z8_XBEpT&ADskO*PguYn$4H@eBNz0(n!%$r)aZ0%CA-1j+S>5y!?}wHG7lE2qYT;U; zT{i5MV(?ieDao~kf8-of)y##;Lrlk_Y=%VnS`Jho@KcE(^rHk?2F@4*5SN46Q5W1I zRQp1?sJkR3gh0zD%C$d+tKfE^-4SZx{33_C%)B|9^EN#WYF@)^N$Ls9e-$bh5S zfwUw`ccx5fxe9hesQ~4+R&z)44Ez-7%!2B;!`MKP&DOaxwn2(h-bz#KzPKj~Gs?ONt_*)Q zc?VAx+ahbl)hW6?;lT{uc7)xr*Fd*_@)w0?Z<2mZ;GW%-Wnwq(aiJ`8aViJAz0URFLM>saMtpcg{T&tWLNHkXW zwvF^z8#FD@BeM0QLeKHLPzH|C)e7K(kQ=^%gqUEj$pKTv?PklrML!jN&wy-w&paX~ zuNPg&!;_(}MQB&Nr&%e!Avq!6c5v%9}+Y@w~A zg3{fHi9HMr>?WsD@y>~R0VvoOZoN*IP-rCVZ_4oz6;=2Kffjt$8S*tu8~+k}*!^q_ zd$Opfa@j&#Jtf0UVOWMcN2#TDx@V~2UJ0Q`ErpxNOEO$UABO8UM$2#q+mu@dCKUJY zN_>WMlKgtNtr5+eZMH-`sf0{+ca6 zi)vFSt#H5Dly?3l;+KmPm=cdgg3h9}d0*m$3{eNbN!y6|j+ELCt(`_+B2dFsEJC6q z)z(U^({AitH+!q3Y{vO6GfwQ zw!e971rKA~OisZ4>Tw*%jq*pbwK{-FiX{Y0I%;+NfJxEgW~qm~Re(wPj|5EQRQZhw z701$Eo2;rCue=?yYHOlpx|8hbj%T__Z`N%;lG}PFNj149dAhWxg<%#)XzEgH%EjOZ zg&0Ie1~Eu;+?pWGklL3@9sA!W$;ZnDD9t;dub0~lezccOT+v2P$%niBqF|G>I$Kd8 zA#_R(YY~TWWK7Q5kCs1*)2S^&%556&Mj+vG04fKz#e66HCLpSaQ~@ zHlrej?+{TK`Ks0W77oyC3~v)T6J~#z!1Jtt9#f<gDV%wKt$sUo-#OWb1~Z!t%I`-PX%p!!Lhz6@su3$rEdc2Qvd3wFpt|gj)U}(-V{+ zbrMj)S-$|i=`po<*3P$6s4g^{HkqQejy54GC{`6Bp{A|iAM4!LWDKezMInGsN+%`8 zwTG`wilW%j!R@{>MOY6!kRhz%2?(}%KLBC9{7(v#$ok4tmRYm;7OAfhET;*_Nt7~F^k0%(47mR(xw5XV$RY@KZK*(lma{%n0 z@WqM)Sflz3>7D=zX;vAzmHZ zN4T1V008qDf_fV-RtM5o%j-Ckx=${hah1LPa9B zUYmkhXmuZ%Q|uCoS_+jE*tW^(-k&L8ci{ibaVc`@28TO0T2**ciSu4sj6D$Q&7wHu z^pf+H6dSrq@gJJt((u62XLzSzIf0MRWegnM| z4xM5D$|g^SodeeG!t)_3ah_y%8JTB|L@ zT!{3EiTPKsZ!!lV#TmTj1MMr7+%~zIEho1MQgTFqqSvKkMWNH?-W+MONrR&1UQ)7M z|FTg1W@#?)D7ALHleu@0H$}yV|2RX%9TGpp2Nj=9IVj$%Oi1_N%y&n$Ko7|AusPg} zZ7puyF+>JVK52)vuMpDyRn;i!MVVmL3Y6L@AhVU*KZll*KSUzm7K-YT0t=+mp ztNWv9pG}|b{eZR{ar$1RflleOrJj(-oB-X|mfXenAZJ+|AO@Vs|6!8!m=ZFzx-qJ^ ze?p%f)Wv2la*F_i(r4f7p)8`vE?>3nfuP$gm$2jNvp>5%dOs#Fg@U3rDz73Y^YC(i znXgbOpKpT4n8wLhBw9}XaHS{{Cd1J)|B(evUdQ61os*C>zfo0zE9J7pWt?xpW1M$! zqa~>zPAqaI`vu`&I(-ZIf66vWXZp^NfBaeYS?^E`T2O}#omy0E6M{2U7b)ZPM`T*M zbwy_bwQ`o2E2lx6C9?Se#XV%R1Ov_$mVk5Oh}bD-33YOQ#l_?)iu`98sBcA{mUA{- zaGn(rZ08)NW;s}#5U{j!aQ0bJ|J^xYUB!?qit7UvofOwcB?2bR51%(WMe@fi%bb{R z-5@02Clp_~6}2k~nlk}WYqv(9qwLUX#T8N)J&Gd#BWwk>M4t=nE4Yh?YEo<;x|ZeP zTWr>^D#iMpt9XQ)g6ytvEw_9w3T*5pEy-T29Z4mWeITXF_Myw(jV}A(apdVVifB)g zLO!j=uKGIkuA>@zoHV7>*zHP<&ElZOZttMRM!lAeV|v2*gL&$0Nr4AMwywAKpG`B& zz^t=AgZ)|j!yIM+MgXO6iV;u@SZ_rfTG0e1#F#*|kQft$Ihnz7NcM)@@HZWkR>~b^ z@RV$S6n}L$qkMsc*QFd%B+B}djP~L@B5hOgd9Qlh^NMF~3Yyo7qHCqc?B;Q=nXv*D z#!th4Nj_zJ%d{f+!?gI8gBB!EMyuPar0v^nv9m$ynG=5Jm6Jzi!ZKW~AiG-Kei4^I zz8rIkVTJl~){|e&umkAdWlB=Y0_X~qY)vsLuUl(9?9y4;jLLRv2#cNU9iU$9!b%tw z^*)hJ1wSv~O~KgL#mIg^7E7Wu_^>2v6-&|=AdV+~DlAEAy+Cr%Sqbt7nY?2?u+Bc2 zHcvu+1GB0=G1cZt8k9N#JwEpKP(b(+$KK8aj^~P|wn~fMDLjeHGNrQreE1P_kU*Y7 zHyM6pnZu710*=l*ZGPmRaX@SM6bCfHs4|OGkH_anKAQvD)5U5QHb;`eslEn>Bk{`| zkv|;GeT#LuAV~*_-VLYWAk68s$*8P5qz%M+lWeJ@wtx2dG)K}KP0=Hwxo^k`PfFg* zQ;se&R+i#P?vEYAliXVlPx6*6Y$={3|2pydc}+&9G@iJM2v=fz{5Vc%WPTVZgU=Y- z6<4x`Mu92&ST(@TuMmCaBp_IfSSfzwXB>RRk7#ud3+I3!t~@dEXyeYMihEFbYEW1$ z=2warnaB4OFH&sB+a2G&{;%;PrHCM}CcmV}dR=emEK9K55!&Z+NT4dH2`9ya=IIO> zdUFKJIV{z3$obRigU8d%oY}+SixKeJwWD;Yt;y3 zqY3ahY`yWUY_viL(K35*=|iU+KdV;Ey#2U3_CWOvoBB&W2XXvu6&MIId5rd2AA7P zrQ{8Clne-i;IHnB{lydMa(n}f-@MB2vHo4txJg~JOv_b60!G98Mc{6_gy zQxIP@TSYIvYR9PPRZz;bT(FN7IZdXa3qD3$94_SBTD;`qg=UV%GO|q5kl>o7Ex-SmIss$pa2m?ZD07y$s0ITj`;2yk)os5 z5FnUx<#sfbflHvH_x~u3tgQH#vyl?Qit16=ZpUM-#rjcynSe@nt~|LF5uHaPZ~_hh zPLyi{`-p%~QiZ-kM6)V{DbYq-*acX!Ek)Z!Tc*{$tVpOYPEHQ7a@*<9QlgF)9m@Sm z)X|m{^VJb|61!w)9qs?^O8fr}oAS=PAw_kwoXb-5_w%ujPpL>q={Dd#E`qbj;#%EL z7!aqAlbDgkm3dq#{GDU?EHhAcQ4!XdBh&v#O~j}4vd8hi`xkWgtYl27+b|&{gmgP2 z%Gkw4JK&6Hq`K}PhMm?BicH&ZrA5zFmw;H#xaekP-rDhOb1>v=-_Su?=a^^F>hGSK z(%y5nof9FaK^^M@Tm;bx5q6aK2?>a|RriZ{7l*ZGnNr;&xN}^d6Rai2rSEfm=^(W4 zwC-4)8aed&ueQ+cDOL12qo?;r6v#WLAbe4ZKL3C$3C_{69-WXD+TRlWuTs-<3gDsI ztR<%iX-0h&ULG2uWc5NNDGn2Vkpl@~7L^?C2^wM4^v9~kg%T1^>Zt8+Ppj>#Z87rt zlo*K(+*d(wqOpJcbJEz$m=fOvrO2Awq&RV%{8U1^tdg|?jZT&Y9M5)U9u#$bW!7Ck zl)D^tz4)LVi!7!Tfh-h>7W=nDj2o;8(#%f21aeUEub)nT&lURX5MI+Eya?iu<6ZwV z^!Me9j-|hD#%zmh9au(v~gSFf_+SCQXaJConvjQXd@ zZ{z1iexGAEK7ss>KUpq!CYJyAk>5NujT4YxLoRkAzjFlH2|iifB!|EzU&oN&2jwEj zCY$`ao{|SXiTpMVOOfA~=N&_SUpOD~d*=5tILCA4r;^{IJ~Dw$gya_)q67J@ zaOiIVSpAdfFA5#rl+v$X!Y_yZp2yb|{oNy&?*AP99hyylbA1E?2eG{eZPWXY85;+& z_}`im|Kf=hhlk}#Gc$j1D9_Z0%)Ac@T_-{V`!Hft->*UZ>}5yM#@oamK|j7oGf?7F8SuUnI&5yOZHvZ{LGR~U`1DcffrhjM>9+In%6~&Jn?K!JkJuA-++il zcX_SlJ+y`Sd_x(vg3fXhh5SeY9b&pstNm*p6<`_ABU^`(-fxxPO*gyPb}B6@zA5C= zwTrq-q6bNPi>}1F0ARy&f38SP_RZm|bn_9(&SK{PGRF*|&`D{WR6i`jy>Uv-o7XIW zP1^1?-mt#?FtfLBr=@g*v|aie+CV_v{Dv6T!R6w-kAIDrtHlIsKuXB&%RfWR;m; zkQ3@jPOs8!iE3cRM|N9D#PlJn;w5up6YIL5`5sVZoTa}7L@ujnc8E%AJ`})_`?(mne-#QhZOArg>-#1A}HkgE~H{h4XC}S zi?OB_uYVa*Xkb$g>y_#9IgOhdSYw8g8OS#4d396xRQ$3dYo}&8 zBUzJWN3WJgFHumP>N#9!{X{)P(wh--`Bdv3^*gKp;X*w8tN}FGfUxdC8xWfKwC!C2 z|B}0A2%AZ^)R0G1<#(&Stg>`7BKkwtvpqCbk3FG&#C&_$iB>dH7N1-AM7Z|tpj1T8 zSs|dM~O~OYlFY+3N3mXGpndO z5aO^AYm`d?AoB`;E;&=kcpSA=D&hWh8?^gYOU{dX$kg6| z5#?vck`hoF6c)07yX<>I{UlR)E>B}3(o5Fs1~o&*=O-zmq}ff+>PBzfxHdoe*R*}M z1HLEAj1XT|LU5cG{Yt)gmi$AoeF~u|J7AM?amum22viAL^KzePcuJxTLf@OCLgr<$ zX^Hc-IVu!K8gx652)S$rElp8N+PQ0w`lapygQ#AdfJZRfY_fkbCW*TFX?KxU6dNJh zEA8$@G}x~$1`pDc(7ER5aQ=d+uK*eu7L_bYe9ItwauIR8bc6NR9&!?JUoxd|WutBg zCd0l$f(cCUns+^BwH7YM1Fko8_p{;t?A9{tsk7~;vMyp85IU4c(b|QNB3rJWGh$7A6=WUUPbv3z}xn^!Y8rv z-sI(I4?U*G?sR!Z*7f?M+-DpLy`B6W$zF>*&3OyO<48?kQ9VWOWa6Xk8K26G$HzuE z(`~c5s~PxeslvSiidYYU50HOeJOd9{2V62e+>7lcR^bqPIPOeJ&4&OWSrTWfp{VS$ zY*SIIv2MXG*(fRs?~_OewNcpDQ~)D6V__Ailh+3Xcfgv?TX-AJ+RO9x1-^I=;0hS3 z&9lQ9*#R+INWQy^6Fa&vKb!x~^4_3 zdH%>`{yW-qI!z-S@er@nHM^G_dyX6sqKWHmYC^;H); z|MWp5&!;T%pu@uS8!u51AWwI_q_5DNfBK*``iiVv`&+nUq^M74T^Njc+Wq9^c4yHO zsF7#EM*nd$h&v`DJ(y?(}Fs`E{T@HqUT9lj>sEmG}T z+)pt>&lpIJ#U<5 zJy@s7!8&_^5wHd5n{tTmO%B%42d1A&U*y0wzAxxz&w`yc6x)Gr#)wui5~~PM`=#Jh zfg$TJU`pqdz=1o99@ZrF;mMgH1FzpJm1E9!m=wHthSAg-d5g0lHaZ^q7ciZJ70s6k znzM^p-SD}TqRBE3RpemDq9^t(>#ooho&!y;uy~)gs= zFYXu$_7?>yZ{FRR1ax(C`^4euadO<>N_Kp5^Yn-F^_q{Wg*IzyWtV%vdM~n`__zyG zwvQ=|1w`)%9<+X=+N*GzkZ>x(m9~Vg7hLaPhd``=x(bSOB)+;SkDa-?A_vT zw0hX+okEwn<8lku=$dJq`)!y&MlXBe6qma1qAUo#8-7f!yH;^Yfgh$x%vs!}k+YQ_WZBcYKg_@uwJ zA2DtE!6hvG0gDVP(x?xGGdda2;P@tT^|tkpjTRn;>9$>Hx>_-L%zRSls4U?rHa##0 zS|PdM)ZgO6YbP;`L&y0NqCc{q^>*%k|lgk{9NwA zX504D!|hTeMtluA0K^}U93LQlsM@mu0vWdRrVUf{jrF}H>+Vn7uQ_VJ=Gpr-Lz1uy zMiu%KD|$&cDI<~ru|oksENFw6$A&RKFg6|-%bchw^#S)ft?nk-ffUTWn1VTyij2!w znBQ2J+}r^=F6#hqzhwpg1^BpK9y=aF_P8v3gbdYx(%x>>LnmM~nHtd{o&+~0(rj1uTHd(bXr zm#%`IYz@7w4_Yl6sMnI0ArMJnx7P#i{WJOs_A(3haIY4{A|R3e#ulge329F<7cWrI zOBlBC(W+ujmeu=^tSi1aQ>i(NGrKW4Q%%H6MB2YnN~ADdN+dA2I9!w*+@X#LZK1xY zA|g)rts2HVJK4T51L1FXXd>k z+NONn1oigDtv==@=#MCXLPRLP5t2`CLFvg|SK!j{FO?bb=aOB_819d-btnltR5=iq z7RLUhHg%9J;~y+wMt`gFkt=;%!2FW9(81`9j(rwr_Zu(z8$YRU(O z3kCc!AJtNx4(pO=73dXcAFy5mh5IH;KpE(N1MV5Xdxe7cGsLH@59KT<5d=T44{Fri z>qD=R?V~k$xq^9?H|YMrf%yTzJYGsc1@q7|*+|Z+4fD>$;hkar^aHX4tj4s$=8FF8 zF^tIU&kXhnRYAu}RnU14;@&!2f&R-J>(ar%sq7C|PejnLZYH6Za=Ut6by1b@d_bl3N$Bg+ z=L7x43U*2L`YGJD$+OOzm zKWiLc5^;uX{Y*7!(J}l;v36N0ZtJC<@^9%pL$8VJN~xR`C%2HRPEte0l*OGf$!Sak zrm>aO1v##84~owExF<<{Jf;4_y#-AWM)q^I z#vR;3P1fiJNGx-RNkeR0yA+T?IeREqRpXx6xf-|4f0A3YId7fahkSP`IWsr)1L;G0 zw|^)E3e%q_DlEw>8agMlG!B11N&1s5fhTl|alZpZhzv+S=`BBy>k4D*> z_F}73+wDUsv1Bo~W2m8OCaUn7dW1f!f&`)L>3qTm?1l@aA;;x;N(6^wPni$<(>~){ zSsQcG0|H{o3uCMg5zUae-dMgi$| z>#DwBd=|r_-G_W&L+Q=zuhJ+WOIk-h;H-tL59Q-_ z>pl6HV(pTT83|(5 zweFXmPO(0)e-E<0C%?N|Q9f*D_foo*?l0t1^=XS}C#!g#f!14U+S`Rr?_nL-KgVRG z&TkV}1(kZ=lf`Ma-uYg(kt>ZavFAqK9iFP!B(^KD=IQ1=$FnbN;m~7iQkIQ4pDXy? zf`#LC(W1t}E!HS`nfb&r_7#U_*a@i!aU-V}Ts>THh{_+&_~rdq!?(A}3(fmP_XlHD z`b_)8;uLYH$`W{N{C@4#s|2hqO--DF2+h_A_24B{ldwCPr>wh%50KI9N-pBT`Vo=6|x*%fBjBIMe_4R4LAY z+1m&I?=!zz;E!E>HRWmN&GwU}Mrv*5QRyV$Gl0$=M@zS*FSuKj7$eJ#G_ZF$ANwIS58tQ3zQuV++)p@@_8|Mfy zT3r#CR`Ge-!#iR7sI0mBb1bC!#Br5-{e$rBL6n1LcSk!H9+@z~o97RB9wwMWH&+#~ zv|r!Y>Gg8HPw@U9Co3I(e9!a+it$n<4YjDaemW9P;#R(699KW(h^6;JQ}s~@O35lt z)Dga=e#22A(VPOJODKy@4g$(J_Q5t5H0QClM`oUxP%%jys%sL0Th=%i>{?h_MC^Cu zW+b{K{>ddS;laN?rZ`h{@*9HrGJNxD{c*-2|0p`yD4cX$Q$;5mg+6O{Kfsj$#bMSb zvbELEN)uMEm1$MAlKD|puh$1{65kXGYf{i!ckR_zX0+AM>W^muG}@WONUV#q%7rlJ>ZxL7G*?ALso zg2pUN@Y$TiIh1C7Dn@pGRQe3?Cm!7nd!fEM+=cU9 zF&EDF4!i}aps=c{=ldPQP9%fo1Y*vxRBQymq_DBy{4So?pIdF;>>b3ZDS^F#E$rbJ z7#`G=q{!=m>1VN^4gx}tYV2{2@}^`D`7X75H(`9$jq*J~bC5D4eUZVEX>rCGf_f4- z5F?X=&M2W|U+*rHp&$TfW6$*dS!YsJen_DT)E1#<#R3~CZ_L3~!-^}VgDi*gEGM8h zNUgoXpz(IHAN9u9X?F`%l=?)XGpeiMN6>gj6>R!yq2IkN^p?lGvY_nBg7CNbl3#XZ ze)wkM!`4auUGoeNi0$O?RSF^$KG`Hf`f`t1-k`^>b(NJr5=th2>R=4fsnm&Al5!aj z7zK^Y50z6w*_Mo*lESnnFPF55@XkS_MA?!H8qvJ?jh^a9USq&0PV7b)6@D&jeRj*h zrHWv1(0;#re~2Wr-N!}Bx3CJ5VoQ8cfEuk%@c?QSZW~;PXH_z*;uP!g;&fu+x(IxI z*KcfqLQ;;8Wq2)=kX%D$l?CCiONuC2hDj`gQ<3=$Dg<8~_A358!}1D#Z`0j-L(9Ep z9t_Pa*v7mkLhmG(jyDRnFm{5U6XmQ&(AZhJA;}y!l)|HnPOguPUJ5;%a2Q>jA2Rb^ z+-@K4bkRy{3>NDw{7U^6(eqWHVd}qXBw%A*{I<=gm=SySjX>=cSpD_&hir_3iF*AE zks2Qnh*6bRlvcZ^GE5_@mDKzr;<7b2RP#iO+a_CFeZHnsfYK>z!VE zORs6^DTANjnbK46E}qlHp2lq*UPHp(P+xoa3j8dMcO{Fl-+{@P9rne8S(iC6)_c>{ z9G5Y&ECi`Mdbra%%xGk;vv)EoMgLO#*k_|xzvcPQkzV}`^!fi9y;|_bKTofKXBg6#`cbLw!F!z0%E-kEK@u$|n(otJP7B4EbhGp#;f(e)P(pwvWT5$FV7r zy!@a;ul$1=lO;j-Ua6MdlBQRDSMYvNcn0G>7mf5Z2Ti8S=-R!y#KrE{rupSiVo?9{lk9$uX*EY`;Aij z`s-A>dz>`pAP;eB%<^YW`L8jGVttfYR7L*P?pC^(uHxXK8)J(D<~Q;K=6nEv1nV(q znQq*WA1IsOpQ_I|h=|4J)vpkvVyq<1Q&mYdr05drj#>$(UWT z)?czcbSmmBO^jrtP;a>z`a+i`wmZ8>tCl^!?z6ae3^7_QHM1r;gb#x5^iG= zZagGZ)$^qAjseY=kQBy><7|g7tz}AgQ86JZq4Nf-qPDA#PU7}xXGg*ZVlt$ zhzVN4MGpr`4r&YQ`2~25j*gThz<% zW!WhzJTw>!9whSte2+hJsK0i%mSX|&*+gi4*FvwP=MiHK;GLk@PK-ShMuAI=8m$$ob)vMkO6v~QdZTKcCart4J_Y!UtuACxd4Q&EbuHM)>w)|7*JRx=k8cjR zHmJKAcXchzcG52N!m}0@xasRM>FYB3DaJ!I{C3dY7)B2lPnNSzYgogz{O~t^%<8|H zOM;yw=afnhr3X6T7qk2#nEq0GjrW8uO{ zfBJCN0fy-nfrD|e5rY_GA#k8Y&?mD-1&4%T6dx1!E80RJjegeyow<7B?%Z*)qISLH zS)KWA=s4dIXf8+eQGNpMR`Cy!2u9Knd<6>k9k9&U{*=^_BPuL+p@_1ftu}^Ih*0V~ zjxEH`VC~2(+kkbm+>=H(RjtCc?GTS65+s_{ATS}KX&ibTIP@-X=ovB*vu6s2_63lS zcXmG&ht{eQlB&YI&c>m4IXHB5e&TP^X&T)LMaON?_e$p2BBg8h6bjaIzz+mu{qPk* zdrvE!elkH@6A5uY>myc(jGg-oSWcfNEw&)jCnm2{Z z3>=y+4;Yv0#@8VylF{VTyKEwuCrv@BEYLsa`n)!v}mi7^mFqcma zFcL?yxb>}_vlol2)E?&U*&+jkRy2Dg+he~>J@%a_~eCR z)jnLcH>mcwy1zoTPgL!#s(puQzfrYMQ|){B+Zmq(S+N&H#tpdM(PJYNT{;$}WQK=6 z@RRXN9Q?v+t_b(w(6lCg06~(&0)PH89_O@NMT<3+LM^HNN$F!!@Qq;Nz&9lRiy^k@ z?L>_duBs4IXQBBWOFVbejG$hEemlda2Vx`emu+(S*B>1p8;15<@+XD*`b%E6>%m(O zY=9usLD2Y4K7ftgXe?U{L=RNG;~+qhk~Eq391G4^gV8;I9Z1W9=Rd6%G7nR}IuIKM zNEZOoh&5I8_NG?1jI&8~;h}-p4EQhvBzW|r@aWgk&eF#NSQIk6S(-<0WG`TlnmEw% zjN;M1D960tSE%-hs=ZaU?@;YGs`hEB zeGh*N_9%`M_kpnZD)^0qp(_E04;@zhX~xEJ9?_<|n$(SrJ3F%K;y=bX(){}6LeDO@ z`Srt!p0)bjn?j>N2`@`u$YuUm5jN2yumGyd86}ls{M1C^K-WP8L5>I{)u-{pU5Kl)+e&m{#ee3Zd{Bl zlRD_ll?D9FnbKUz5!d=u_J_B$#3qVHY9doIrxjYGGtPT&`^o^8`DS< z_C3U)C)1ib-n3q2w^qTK`G^OyxLJj7l3yf?Zbe0uUS$G=CiLI;eC(EMUJL~DMQ$Lt;Z zZo9|$5+>>S7!hMD7=z#F9W)-bzir}F|CB5m{R7oI0@(u=edv09jCr^bswEy;Vea^_P4<9ZtD|M#F+gM8|%V+ z!9=y_8~jKdm90)29P3jLF}MSbsCOTcduH)RenrK(Qk3eVZK+-db(0B`lD`MFP(lo#!d@6=>gkSZy|1yR+f^cszWTdK4{D^|NRR#BKeU$16=9S5Z;QEsz&2xBP$3 z$!Tki5=0!`hJ+~V))`O|YXM6&LeVdM`fC#P+$OWg3^#Tan+td~=+#XKczMLha*wEU zLauxVY($4}8b#*)MpR&@*(G=Qt0xsCx=Mf8(EVmqVG%R7luLppdsaU2ydQnGL5Ec?AQ@^$^*K)F@)tvLJ#w`$MBT_+Hwo_ zB)i}`BHRo|BK3N8d+aKP>bxo@uYxov;$aqWT!V{L@(2S5)L0&VM!u!Zc~Xmq8TlY{ zzS_rSN68ngH#f32_~BGwVrsVbKCP(YQuHBL{RA7R2(9Jtpw3+$5 z0V!~ubwiWjvN7C-wuq{Rx>10JspDyvjm1Bxbb~t6T68p;mBbDF(aDGn1mZC`dS`yl z%6*K=+K4~M%APX5*pt)ji*;PI22{9mD$NnQIae~)KdkMNv$9ZbBVlOllH25#Lsv-b zzv|LD6HnMg6ly_IK|yUHb649@>0rC{-8I;q2j<+*{gR3LAN(HyM83-BPx!oz z_73z0e5uo^AUTlTawGV6kR)*5(9DSdPA|t5<1P`4P>o4hMp63ONUkLq`wm2-sx>(* zb2t_Kmiwv^qITp3Tv#W_(B*#GZ@i$@mC{kry!9X)c<2@Qf-!}-x}W8#eX2#?73%Ld zm&ExZo+DCVLoe&8-MxX)`K!Zw{AO=u@Gn!6;JiBu-2ES5ZagQ})Zd>+Wva-KDf^(QEiC z?2}$LHeb6(GGivlijR;O#K-WE7FE#$jql`{1)D`M>mE7W&5pv39PR=xU}y%Fxttg(wsWZsDu=fNM^s+PvA%~RV+xMM5(AJ- z-T{zoWay*K5l0+2x@k3Vq>h7vqYAm@zq!Tf(t4Tn7>QcmO38?c^UDeBL zJb3oRbZB0|V2N$`ehaY4{WiJ7+GqSuz9#;gX4}?J(C>n^0;yTx4=oppe!S`Yki|&7 zu;aVt_dWJKL@vW53&H3nP^;&T>5rj~3Jej$r+S`}PBdjm9P+j7PhK z1_)`4Rtfr1kYIx++dqyb(|aT@;o(c>jHtJDcvI+pbRLR#f78qd%NvEl2@r;}L{@>+ zJAOkgO>*sVC;MRI2^ag*=iX`F1PO)DvS*xF1h9ci{1GZcW{>yj(CZ?sh^+BxWfidJ;jo5u=b%!$k+)yR^Kd_&*LmJ>k`N4!d& zW&69zvAN`{uL18#`i5ui;&oRSXiI*>16P_wyM<-idZiiI&5)mws-%_uh31tsqBr8n z^LetANP(SX_|aVcar`=NC|iL*Vm(A3)5+v z^-ab>3`C}3G7SfOaZ)rWI1$;(vxktB|Njrz)_%qz6s;Z1VuRBk;!e>{~_B;hMs-Q6sZ%@aFWd5D*9 z5air5V3twCY{n_cbG5=;$&Mmd?8fOQ2jDJ)uA|I)MZmQa{mjgXETey0zTleK?Dfj$ z1#fK}s*q2ujk50D3O+lN7g__{s$FihDh^7LHIB9nD(h$q|1Md<7k9&OAIc-e+AFp5 zTsfg$0r$S}I%@0mad{eC<|GJ+cAsxEtl}c7Q0K(*`g#msfp3wo5SF_au}1|Udpr4C zK3M{m!ZWm-fMIOrqo>VW_qPw`Mwq|oq=%hednHJs5&*atIH)FgfQa(5*Jl1d4 zFm{|(IGL9PN)D%z%OAB4LW+ng2G=?@=i03*CYD4fK59LIR@e@73g@9SC=QxR?vQ9_ zib#-QO|g=m=58`b#Y>8&Kf}l^<=1EBBfH~j@_&MlM2Xy|BM-Us1n}_C6LQuF!7|}O zZ62}|hH)PMAC1e5g>0VpcR{^4^&2CloUy&-Wi`dAJs$zh|3Lgkoc*4NqY?Fe6zS{D zZiu+2R@ZNIbHqIX2eqGC-K8uzDkiN?oZTTCuAmt%#;r%R%o+I7?!F%~nfN(>B8R$# zXF{Ts09U<-3dz$(n|b?Nz0J z!NII*%=ovNPsZtiIO6+P2o)EvFNM*bTiPF4 z8ykSwdRxPfH@G|pgrKYdg;XrZFxF2u0{!w6KjubBd12FJ zg?<|mRD@WR{p~pVJ=t%a=k4ngAy3r^uHanzTA zShxXCvHe0blnMnEz*>*w;kvicuX$gWpOKo4Ctv#?BZDAL|U}FQ`unT zHLs}nK-kRFrH3%`K{tQy7#1mrV2ZL62SSOU>Ow&wXCMtk0OM`9V66-~i=NnXR%4B+ zAmQ!S*vCXtLf_Gm|5)(uNFKEv;A$Go8w!b|Ui4+~FqlK>V}-u|g!O`ypmlAtOuqYZ z13^l#^^pOy0#$1~RL;gXnErg>4&394XAaY=*Rvy#fLZy?d6KLcjfqA%mX`KLL({8^ ze(Y)Xw&qED_-qc0HBjCn)c#cYvS6(YENf2qb4g4oEJ|88qUIwABw%{_;}c2fDC1fI z#OL#JEGGnuw}yUW782;_erYCR+CF(fbDji^qamA=V_U@tf5mEZpEQd1)hgzSD}0`6 zz*G!dOkNB;FucZyyZzNo9wQKyFimn6tjXgyw~AE?YmFtIGj-n*E~mOo)+1ovBxL(cR;|=FyxG zY*(;#j1hV~&nT1^OP48o7lI1u@U(@Z3PVnp@-)>&cYDPvN+Ps9?!bLWcBA;32=E8c zS!S~+_iO;U{92ICX=i6dF6D9)yW|-zS~nqzA-aF$Af5OBipbSh7Du|pF?99P3 zlX2D8tYjVb$vQ9%$_LTNI;_ky^3?_aYqH~!iabV9ZJ#9yYLUR|)H+1sMPGf`v@PK%zz z7ZqCTu3^PLh6MSmUv!pyv5fO1pL;ILUAL1<($4G_dySEab^NyOX6ax&k^|(ACM<}( z7gh<5$Z`VCWPt@hts=gN<>H5b>5?P*zIXU9UCRG^*hKjh0x0?iInV!c{OF61$jQ!* zA3gI76+gP-Qz zmcOyU>i-^p<7;FQSoY7^-}ok3hqMDAyZSHs8=po$0E_K!T)>b2KlmHR0kY4--}u!A zS+D>28!JzSjni<5_&4)6?(wh#2%nq3@iYIW@YuhTzi}Qz77X=C{>J+r%0@T;yZwy| z)d=A|J~w~kvzU)Cn((*y?w{D-*!r{F_dn)uY|#DxM}OnVs*8Ucf8(G0Nr3G?{>K0D zH~xIwvp=i9@z>Ck;BR~lAL4Hu;4|ZIe0aH#gX8%d@8F8Cr(gelHhY?h*G>6jqGTi4!(?tIIzuDjTT6W++{>E7$4A~ls&&A((O|?#NuPr~DGlGB zv%m5Azk|?z?*7JQ4=VEgAAe)zon$c@&|Uqy}8qbtsYxa8>O(d`spvj@IDQdl(G$8;I!(wQJs5(<^@44GsLY9K~bzlb?$3cVm_z=5>c)? z)E0>jp&?+zhV!9C#XT!%Jexc{vzxX(-9;p_7Ws}?_b8i#*}1OUa^B%FufH2#we6nB z?khqUu~sr?Su1h!C!N3a8Zgy6oRwpV+FCu)W|BP7nM$B@BVUXyjaH%duo`lpx;5x} zR*gE|wx*UiH&pTYjXh&B1uc39Y9+Oe$$qK)V=6g(i;5GMl$FL-qw%G84y-N?Vdnbt z)3P`c!ES7|8&QJ)`DuY4DGC1INWNgurPu^tn0w-9thUqcGY6r^&sC*X1ZX1hqqtjO zWsT-{dMcTnj}rd_m(O@rEm?rxIxLyboO^ekmqI*mUJ)9TwPJsR7Mys+qH98@d7cnJ zmlXbykA{bbCeC5Al>VIbSeez+mj+`+E}uC7Px+6AYju*AkiuV)H!8fwmdK7PdXPpe zDc}+7&m6qQn+zmi+*int?D2Sw2L{k&6*DZaslEqHb=M~iQd6#SY~9?O0XbPwW>~8} z9&MEm^FCQQud&Vg`7be38{0mmQ%~Dk8vx=xRd+oV9BXx=*a!T@CPd8`d-H6V&IuPr zo|LJfG8e~1;8&%+kjQ@B+5N`JRZ8t%(J@m3*s}@y37Yo)3F3vL1$kt6Zwwxmi6q+Ev#+mmO zrx&M>ZLhJ{M{+O?GhSyZ?^hgX>U`KMC+LckY=T;Ucn{gN1c^;R9V{ z2I-v@du1gn=GZAu65HgXBV}Q3@)^`hdgJJ-{xZ8%bIPCo{!x=f-&Q)WVlMC+!EZXyODf=E~+`zk7XnrERQyT5eTV%I}?`Za4paitLQ| z`5OhNV&yzFU!@zc?!8~wdhu_JbKUB%Jl_D-~Ko!XFfx1>S9(Fc^zc0n|4y9n1|dn z)cWxg19`AZu(}1e|3D9kZYZXt!%zKfhe(fAQ(U@D*&OA?S(`6uPWEtp?hbQ~H+N1& z?wmlRopL>=6Z4LLOD)t?>dQkoNAiJnUxM4hQ>p_~tZOYCpOgdu8#4A&mFsEHC8+|O2?_2Hf%jEky`#W#i zZLPMyH{e<2b%&SE#EsauXmoR4gLK08WnN>r=kLrhr?S~Ar+`o(MT>;0OEzOY78}A| zkwXwqTdOP6^b$r&Qjf>wA!UlX11>_k3K+Muma)k^!zWxKFHhf!MG-&+BrFDEX_V~Cd1&^NFf*_c(2dArTL(b;^-eqVe(+yoV3v>TA){xye8P- zH3lyb6WFAUW6i;Bp2m0cD7%9*tk^NzjF!lb?l{Co4&okv6w*t|)7>)3>b$$jtkAwg zY_kE=&By1Hz4jD&0Zx>#m)7xxgpuyr|5#dF8qCAmq>a>~i84d=X}Tnn)eM{inj6Rp~qJw!fj@YEi@YsFps_G*=_ zUiT(#$ro5SXL))2kW>I-bfb-ACKdf(zv704E{O(Mz>m+811oVd_7+A^k__;lail( zSo3XgkN_-}4u)&ByGe_kD|4@Ihg&TZZk3`Uf?pn&KUDd8ky}}sXUUq7ji4(y5hKXJ zaxqPu|3|Sneo2ZVZ5Owj5V|*v0J7Uds0v!qSOVCAWBK{R_pmLI1?x@ z0lU627a!!JRfOn;GeMifxLBaO3FE*Z0%A24V%4HQ!{bMLI3`pkP`x)$@<=^H6qVp+d6)S_t=fo) z`XJb>z^{uzu4K=9 zdGaJ2m~f>R;vo@=4c3t#;lrWc{Jj z^DWj-qy;fW-nhatq!T!i?mz63Q$GpMxBp_5&vO31=6v4FE~d^?M|nN+?nplo77~?K z31Rn3yy zYUm||h!+ufL&3Ju>viQ_#|mG8(5tWFi~O62a9KPr)cpXfI@L~itN~-$0qKuOVkmnL?U|px+j60iUv>7?pQrV`{0== z+Q^*7D|rd$dbnh^itIjWC#y=kNKL8Vug&+KN(B!7?ofaC@Hg*N_=gHmSeNj2f|WKL zXmo`J(szOM-I(s1w8Y#hf4!%YLmJAro#DaT4$$fZO$3b9k~xMD_)~d!ggo3dMY}P+ zPn#A;cBz9bs7d=+o@`t^y>W773Y%8QlCWv(!>{_? z&xCs<&((7|sm3OBOswKwSw64Yq`bk46hN_l>%%Nk4I&2z{>zM!d?*uQ1z;0W;Zb7h zV4x&UMnk>K*Q!N?feMn}z2tC!j{T9t#WR@gp~QK#>t!{qGy0IWtRDy4Za$f2g0=vf z+gY1!LGTENgrsi3&I|s=_kbPIoFqMwHzlpxjjCkC?M(4>U}2g+^7cn09V9NV(A&G7 z^boz5X?^lEazki^($pYLMC^IBVrd&LZLQL_L)t2&ZQ_3IJKo+LpYIg(mW9=B z7WtJrs-)J#M{+bMbu(C|d#G5diPmx{b$&`2KKtKB{xs5wm+Zs&zWem6OXKy<`4YB@ zb9TKe{e?=!c1v#Ri$o5nd%C8+bW45duADl-9SsVd?;(UFJKGvFu+gWmqbkDWxae~n z-E~5rQU@)v3yku*1J4TQovgOzg2+nNk62=MllW}J1dGNeeCxKBEXzU-V zR25Tq5hPe}F+QgR(1E`gQn{SJ=JfdkV{Xa=gz;i^H-)$R-4xswHCVzW9YuBx47j#{ z%o5)e)(a0?>-UR0`7{5^{(!4Yq4waYbUle)`>D2Lo-%KrU36z7H#q))f8wifSMM3w zI*JbdfG_?4#%~a#LrGuoAw8U+o`f;#7mpU?*!8!Ce=shU2%SCziIKpBu&81IwC1rx zFczpu!7U(RQJ z-!}H*nD-t2;xX@&d@fQ9oZ@ZiDHMe-N=>1J)?%5MO#a)Wv5gp&{r$0dg+vhdw-%Ql zMor&l-NDOn&rvyLGx#XQ|B)YCSgoT^2}efq?hn;E6=~5w@r9^*!gi3zf58urIdhox z528P$mB>J`-jqw6WVBY@I=0Yj&K@A^zlU-Qs{{(HJoWB19up;6^HWg99BW1o7qaA> z{>h*)mhy-vHg;9y;AykU@!2i*68du^fgJeP50k!ro9=7HA_esH6?qnQu+!aOr@Pv+ zQ)W>hZ@cxIYFEypN+P<)6tf(KMVXN&W-6G*HXs)o~``y7@ItcgE_IQKCV4XQ?oQ_f1A{0%EecA zA!N_i%X(C$`PxId;j=wvxIb}XIYi0(M5#$J17ERxiq!E<(nv1OHD~lM&kd7C=>uyr z4asY~2+Gj|^M>LbpV_{8;suL|G-;6ghI60fXVRDI^McEHjH2*&bijTYj6l+%6%g!vvy*STB#+GySe$*ZqY`8JF_=7fBzdLviNFNhp!4;71D zu{^0$1se<$Dp_y{W~3rK(r6s2!8?b~HyRrg16_^qrpD@$XQkLpKi*okCUrvrMVGp& z7PMzoYg{cdxmwvEg|80kv0j^3vXs?*gxCB!Db>DA#-}cU+^&CrmjY<9UeP~rvU@-; zjD0M{Fk{pD_Zj|7su&pV=K1)?dyTxBA$;A=ew9G03uXpm1qQ`-*O3NxMghjMP3w+ntTg&&kZ4t0+xL`SXSFM1BF zrJS!9pi4s5yu{_s^F%)G87@IRbWRTPacH1@@_R-d3e>DJnql^^?j+em@?sq3y~g|U z+dxbuhH{wwz$sDc49vg`U_qf4 zyhW&eTb05LU`b%YB*NizByF{|t-hrfEv;6muR^?l6F?F`C4jXc%0(2;I2Hkw5K!{{ z);?!00pI`E_kF(S`#zqB%sKn)>)LCtwf5R;uhk1pxL@CGIZ;Fd(P8$cYPkrYFO=Im zX?(Hx6M!>ppnM)xV?4I57;7uNV@)4ANt1VQB%9*sk=a|bTG%@Zt~ZZ+Ei!;O@Y`d_Kf z78p|aFk!s1%d)D!%o-1K*03w21|WRaY@(6mSu!4CMCO?Fs!cV851!s;dNgf}LPj%^ zR#W#S6g{3efe?ruz4j;?d)<+ zS?l)~fKFChy{xvPCkw)7GnH$^C7R%4h!&GKxh+JM4=F_b9v`ftTL6KLsJB!IqQZ;x zJ%f(D#O+l0rz9crxQ$z`TGLxn?j!|Z%OJkNAhHI)jQaIGX>Xrh=3P`RbGvsz_S~KZ zZ;M}X*#;JPEQG_98>3z4%{*USS!~UbPAIXjssKGmJ8yEGUtbsfw2B*t9)ebNh5Kl$ z#==ruo3(~#$q;SrF((K z9*#NRPMu`IkGi1VI-yLWg-d#RWm1m@hbB@q_lr zjlIHsjIpJS8|M}h!zJ(69i3Cx8Dsl5Zd~wL^79NywbrNJ=0#`n(0+#Q(KouIodxKU zwk2A47d7*7YkQAQ#uuB(S*65LlKlmm7W4`NNDw}yJi?RW{cV{Bn%Mi?U$O#KldD}G zr>rQJ=biHGSwYCEA+ELZ99S_>o;R~ULT`Xxsdc#{)Gt$5WtwOe-XuBEGRt7A?MBf z7H_2%vP19Hb1%B16+5)PRk&3Bmj|D>(e;zFPFB$vwZSDYF>*&guktp;J(|a~Q2a}J zWuf>Qsl}szWc~=(I9`2vf46>Hsg3Peq?SoQQbBg)O^`11UF1Wxb#X`Pa!SIZ`OKn> zhukT-Q7{5~D)Zj!g;01)Ep^dcY>{S^nu`Y#ju9P}`9s>LIt%-?MY8)w$s=1=v{&Yj zCky>JX03oZW$qWms>HFNP(s-Kv;^r&`Mto6RA28h{x@y##+j1*_d8{;$+6bCi~n52 zLFW3Z5gO@ri`8MKc_I4|dfG=)%!_a0^ll?_m;oiquQnT;D$B|7Wci~^KYNSB-88GF zm%{t_B6EA?JVh5}G5)63T8yP6W&BCtzmBY#_q06E{Nukv{3BZPajz;4TSSEo4>?Z| zZ5N(s2+TBq^@g{G0qmrL#*ONpdxX!*1i`$Ha@=tb;-Cpt#$hd5&nM2q+j#3Y>%8ii z^LqDUaTIe<-HUHL7QQA~8PKP-2V>KV{m~B&%Zc`3`Yg-~^&KIiNq!y2Yh_eR>}ckL z@ryHtqvmZiR=vUbZ5pU4L(CVRJravj#j~^hB1!{NaquVLzPNl&_EgBms(X}%Rl0YV>%PNG^M{;^&8(r%U8 z^pV{;CJ$?*0(O?aq3^P55&Tta>~fp_(`{-akP1@)DabL$(=Zb*GT+U#$m1FguX9Y_ z1*BVBQYRzwj`ksPh&N&97SW?Ip!kkyAzCNs$wISnQoB3f&etQ4;1T zVSKSqpTz$M_&=tM=FE}A*G<~}n4H~@e$rmsiF7~SIGi3iHHQ1qLP@9xfAhlZI>(fm zUvPq#B&4{Um00yBx1@!eB+wBI{=wYt@`L5CHJk3(eR-V%-C5H4bq+lX*kr;Ts z^iy%Edb_2rIoXq)nh*3P$Scf=IaMt*cK7OVr@G9nr2kSWr$0I79=4A}KY+P@pf&uC z6p3&TO@a;mj5l}W#`CnsMLfYF8E zQ~gg8I^NRlu}~xI6bbP;9xW|JU8@R^9YpGZ+UCdR#o?yj-n`hlZ4!)gUH8L2VW-> z>bc|<9&OdET{Ka$`g9GGA}fx(iy(X7*ndZRUDr0!itEfN{v4diA(UgW`oBVyvTCkIw1^*Qwkw{ zRw=q57JK-ciQ7`Sk*o8~tFp4$N~H~XL=l24prb?Kv3fa#BoMp0_7?>?$;-ZaPJT-z zO>`SQqJ%RaZA|%axf;Qo3vf_w<4t&XcKF2UO&N>|uQz`O@jDHpX5EJ9w@ez>5505~ znnm-(z8uRVo$%1ub@$UFbL1y1sa3NGz|?BKJ&PgRSNU(_?1bSfY-B)*+h9@I6IO*` z={2MU^)F9DT-jv}>?HydA3tH_3x7^Kr;t(;=TiW&!Gbl%NrRXAY6LNJ&0m9n0<^}> zitOfhy=zT5$3Wq;&-9^TUQK>WxRnu_EBqmVYXBqkb zX*YmqXj$J$Jy_qZ;73ZQ;Bd?-lX&$me)Pv*;bZcATYn+vuWUbl(Eik4|N2+AKC%3G zz<5F?TTa&Z3JKpU?hsA!2-U#tZEWN`Y*1S^;oGihzp%|f6W`% z8KA{qz$wg$S>FoQ9K(Z79`?P)*`xK6!^$;a=i z!NEtX2iN_HkLC>aN^UsvyMoqTGZb1&*UUvI?Yp<2HHw*=g4sGAf;DYG3?O;*R!;>Y z<(s~aw*!P2jvmYlU7nc`@dq>opczhfiY<=Oy7N<|V8)mV|M$^T1T+32)uqB~5X0pS z8FZGvdo?=%o#jw+)aPJ3%VgLSQ7RLm(qo<>Y{JuDCYHji$WAh1MOJdU76`9=0IfL5 z#8x4?!AZov+MoFy$2ibTyscPoqhM0N7y@QHK$K)2XcW|ex0en64h)eLrqP*qW8)F_ zCjv<96SYOJF$B=KQC!4yf!?*{xP+vHDWQyIu1WKhn|PDe8pL<0Sn1c6znh0oP2Lh4 z`IA-XKafX~8#4*u%&*w}C07Ov%eRa1xU46*8sX=>(hj}A&TJXIfQIZ9LX8`}d8YaF z{W8VX?I5BmQB&Q9o8=Wix5}f3wwADE(W~36<&hBMpA0g65CfS`2r}(@_Y7p3^bp8& z=|@?}^xSj&k?@C^Qd`Y}JeDj4$12Jfx-Fw2* z(fdQxncVBM1|859$1rzFLq`6we`W~bxgIngXSmZeFJbV>^OOB>KX^_OZ@X#Z>)$Mw zsg(p9p7e?E-!BNMGvE6U>PM*P_z}G4dQt>kYx%#F|7m$m8SEvd#iCiIn_#_$9w_v3M``>*pbS@-vpWZ@a@+ig-Gf=|FtT z+PEg(VscXSlFeR#Sj+zi#Abs(^A+}kKl4rV8FD4}W>?v`EBsvds?^?R)DMZmFt|zv zRCOAEjD9><{2#J`S^N}>fmjJBgM@0sV+L&-bj&+w7lvRMqAd^TFU$qY*;7Z71N5z2 zA;VHgYe0g}(KloWB=XE_+?V=XYxo}Z1zjJ`x^1jc`H36JI6riD@*2Lk;^%)jW&@;z zG1^)+N+e-N=)iQgskd+}o%tNv$LDdmmCn%B9Q_R!3NE)=a-#bjDA|T4B0LY;C|%^} zqz%8t;kv{t5H`1QJ4%WLWmdj(lHXI+sC+6ZJeo785gcPa#GO!28js8*h(Ef|G#-0ox`~YiP!ij{u>075aSq*Cq9%(n`#x(9VTmkZ; z+^}HffL}_&B4Ra!`Bsyc+Z;x4S%6sVvhC-@6Ya;WvE+*T z#bMzs1z!EOVl>F2yXt~(q2wiOyJ1bNF)f1e*Q3VGuZz1YCf5kQmADUZXC_zR5ilIV z3Swn_=5Ha$)0(U$eZaCUOfA}8ELv^R-D-8mRU8NHS$vHR#`f_|3>=U6UQAI5v3=C4 zkD|?GZLbK8!gv2qxs@e1BDkX`2B>&6*A{)9s^D*O^2{%b{nZ}`EfYJ><=nHAd|arK zQn>p6DXV|ixLEn!giqQp5P((hAFEH?UocXivcGslt7pH0LZIRp+xPipVmz&f;{gf& zh1J{!^SD%QgyTVoFAZ4p;;fo9QI5BG=n-n`7G6K!%dym|y`fcTlPlzGX(Gjs{D zf6UJ@{sy=ttFNF1aF<2|zAPCnx(Z(9)e}MeBu8(X63cnjx7wK2_)BP z2dRTiAurgU^DNc}pG7(gXI%m{#c`#18M=uEXcTt1Vt-E$wMKDlm;7F3ukaY7y8lqw zkYv7wtF4_EF4|yhD>3ysUNZY^oUp2`B->$?GN<>81;xeK&;PMy<}WMH3jJK<=}aYX zN->x^4l9j~5F=Tw;bWemnahR9>)XxS5Gq*t&4C)M*iOyA${)Mkkr|xKKkNOy}MF3yJ8!rm@9BrfcQR&1;1Wf7@)zR(KA@FUbL+e zJT!Zap7P_{F3nf1B`TGQU84l=`nQ(o;?TDVvGFHtNFi(9Cbc+QsHEHC{Q7jYI5GZX z%Nl%?2poU1mSp7uq+|B?-e#8M$+3FiBujGQNm-I7?In2-MnC_2)}q99LGBz)Qdg_x#) z{chHd=E`0>UvXYi|M7CDkbX1sS=THpNv_9Y`>Pn|=N99{tLAF4`j?Bf-gfzmhetgO ztnOWwoD$T}3+iJF-1_{lpu}V{?p-Fgg(>fgtsc*h`A$DMt$0M}ThR3}gD1q-2qFx5 z+ePKUErKB7j2f;{?DpeX!$HXA(MHKW(fVGu1T9VpT4gp}6-#>YBhMw_i-G6?NpU-t7Ep&~v{AUPCJorrCI~^RaUFz~$T%=rW&GbypXw zi^h4?DxwWlhu=|Wf!2Q4xTO?!K9=j-UHaQ5UY2qae**bZ@)A%R$P!?`=vat||9dAQ z{_%E1d^u0%;}Gj(10T(*-SBK}<@K^%Y`+WdkPH9-NMMHtL5uN*ynabyQ zM0}1DqCCu4Z(f}2X*mwB7peM__v9W{#KHc=sB1EdYCt}#Kc@3>kyJTtFhLk(BsnJ= z3a=L{@Wxg}CA!R4FO*$%s{|?e({Vv8<^o@yVvijw!jN_v*V_(O>>+`dG?&*F{u!iB zG3L)DLUOl7e~17Gr!RUeqyA@$J{}sS*FDW;c}ogZd{(Xe?ZAu$+HLV)1~35}Yt`n+ z+?$qiM%~jw1jfe7@1>MP-z7F6Y`KL0f&B!*sm)@|!HUm?HFMMdlMGwFlbRJvMtaJS zfD}7son6t59a{@Z0Eb8q7Zs8)`%VndAC=u;{d!r=-MMI+S$YR@b-tN*9Z1zXc}?=_ z(l%gdl6*8 zf3mfTp6FFOE_$lhg3;VPcA|RYu0`m^=&8a57)W#|Z^8dRhT&-{J4DzJ))?`ZAsh@Z`)0+?Uj3aQro;|Cm=8~45r1z9fp$oWgy^S=XZ9xP;~C4UU#fk8Ds19GN- z_|R?Yn0C-Ex1nLGhMdF^g1Z?|=9nS;BBEr zQTL>E>XKPJ`9!iH$%Ub5?eerTr4 zFWpYMIearPx73S#?!#rXmoAacF502eC8PP&uiyZ(PjPcIQGZMS6xQ5sPQ$znV+L*M zM7}hDYF3=Z{6So!3e*e`v(<+fCQ(0~iWG_SV+TpEy+>( z?&tvr@s_ge2U{z)4BCbRaeQMlC+&{4j@=&ph}j?DyNz*9xy=w8_7J7@%^uf2Z7D+m zz|6%**)hDD^tIT3-k`T{HQ5_g5r%A)Yp2*lPFdxwtLAYJJI;!=LhFLD%0+s6^37~? zsmciqt!tY#Q}j;vGOMo5wN2g63n;Y;d!wJuR{a`9ptCszn0C0e;CgO(Y7Ji}9b5iW zI3UJ*ZR2(Fx>JlncZxCSI~AJ-9m5>7N_%)i$8LRX$F}JEjzlq;Af7UH8KkhSPSl+A z`=zWE?*HG)l&3FqoheU^uWC4^>GKt2P%(`|6Wy6R^T()-#I9pX`1`(C{*~Bhc#JZ< zmCv6nI}~5+qSBp(IZ5nzl)NIEC(ckpoV5)VFc3Jo%X}DILxj%_b4lcrP;Uf=p3?~; zmJ>#1dM!7oe^bOLHuI-M9V09$eTJ4cpghf9F-;GZlZ%cGIS3Y7!zLyEvCfgeqhI7| z3tv~yyJjee0Erf7|SCWU@4)7ISTApVlRGqP`wsw2`lUTf6(3WbfF98YA7I7Df= zFZPpMkz~1NNAEaygdMD*u^ep#$|kNfo|vl)NQV23Z(|_RZeB6R!FIA;Y?_2d4aM+Ukkxk@AaLMsx|(d1hMtk2orIZR6Qw9cvymz?u>TM(;ELk5>Q-I z$1es7-@ONNr!Jt6WX6NW<+vtC!;Co-!XJ3<*ZcV^m^-3%!2MYK&FCXhs5@TwRcwaL zFa90PsjXU29-=2x~dh|qN%{`{-F4hV0>{KS1Y4yiHg=0TA;Ug>=?8$GL-YMSuD~P&TT){JniDU0=G6W zgJ!MqLk0*wnb9JC^4qz`%9RzZ0Sg^Y$9i1nzK`FPV{@ZN9++N;Zd-14$rUb~3y}R{ zEf2&Tg2}k{kcThIQ;q;3@m~slseH%!r1LFhSDKUPC)LCtE^BJ2w=KLk$w|0+!YO&U+3)&HWk4Ek zGhd#ZO9#WN@yP%|S%z_pM^Bim1d-y2$1HH`G~zSx)e#Tvhz!XIZBMlqPOvPOi?~a; zA5c@UKBX^BPUX&{2WR3~6P>dSqSh74*Bl6d((64iamC?Q&ySlb(v3v1k zZM#es12}Dbs`N*noi;vq{Xr3f5p|uRbEF^2I8X&uGh_5fb?r0EV0{w4f<09mma!zp zMa^SARd7P2AMOTt2f$kW3<;Mn$qQ_HZcNg(^5Y5L-ks9+?up-0;b*9}d~&B4b9@e~6g`)$?USiyg`FzUYY*aXo5o zg_N+yuJRdjxxmc*F=Cye*?gkV-P%(vm9vDhaw9}u!k2v2+F-G#TU-ZW_c?m|D#pkv z{B=C}K?d2rV!c@Mof;OLjLvWm>SVyU#$xXpT*VQ-ik>jtI0oPWJhr*fC?PUu2pKp} z5rf589n5Da3>=_h>ygDG&0P$WhOTDR;KW;I?-|g?y0_{X9_+CYXEK>#pI_glhTT^L zhbEdAW|*iI@kZkD^p?AzI`LU25T6ALf(bI_#nbp48`T~??wjLBDy;$d_%(Tuu;yKy z&Tw(~X$G;xQGUE~pw=i6=cBFd2_L^qlo*Mxa3sp9f;VZ6xAS<5b}i7B&XUYLJor~0 z)`(4rc@6lIc*-g)rt)Mzh}27AvFhS&CvU1%3|(Otnd#?3y}5<4)8&SXWJESRP9iI# zeNOQUQBcY(6xp&t!x5=aMnBZ&Kqo%*w9$WG@{5o#?6mgGyX?lqmLk>ILsny=0!uYG z&u;Ln`a0qWGTRLcREsIJYW2n$nRI*cNk!37-Y_Xw(;P-utc)?*nn7Is(hm!S!^2{g zrvNbLHedv7{cVoEL5f)gp-Z(j12g%~wexYOUZzx>ZZV%8*TMN0Fz<*H!jb|Nro^5X z4Ps(Gjl1<50r6~kYQ=w;0{A`FTW{;_R^EKZSu0l+<}}NMUFvzU68`tJoIws_bUAad zggWb2d_Lx>ALb1I!man9%1fmfV`<2qF|+J`Yr5`Jl?wW0nyHs8~R!e8k`u$>+%PRa6&5y>XO|SkfZ|B@W-i>+4k8oTbV_pu9m5~MeOzZ$igT-D*D zi2W>vpWTnzEU}3sk<6gR4~#=-u*#Z_B_ahNsuIe{(Sj(i_C@m*x^PFH-D<;+)e8&z zl(SjMyw!)zUf_@*@nkh9Yf)eSBQ7Jg2#}GthAF_rzRq_n)wD)&Z${7vTRbe_#uw(?Fs=K+Ep8JKxHqRFaeUbXsb*gj_jdt05>Sj&@Wbroh5Dz`CG_IJ$HoFc32UnrZL z41lk?S8b7HF04uD|4KIe`^x0Vl$dvK%uK>($la+)s9h{-1Mo>k!Cry93K#B|1Pc?~ z(e)d-ww9bCNfsWE^cP7Ig7=pnoz{h4zntBLhv=czg?(+R3mydenOQwJu_zl2+}LTjBsq2?j0jfH4LB*eIunPebj2 zs(=h~!fW2#A!7~wkq>ZD_fW0wH;hF{j$#9Q*)YHcMiwXQr3~(K>@D~aa~^i1LXK2; zZ;`A%F_(W|h8E1RMJtJ9nWN~l7_oI@uKk4(Tive^Y2txs;v$kVGE`bWoYIf6T-gI{ zvApWad5|wUU!s9tM_(nho6#dOiPxCC) zP?&PaVUCsYCuHP~1sP0-#Fv8$1oS(~5PxMWQs7e|zi%eX1`c#F?FjzE!f{S~(?ri+hQu+)-3kIU~#+ z3d|p_6)Z)XNf2ipqimnqyUt-0*qSM1a4~NmC88SQ7Sk zBS-hHU}fpA%47;ub?-8k3;LqJsUd~s>HxZ;-|-f$i?B76Yk-_-M%a^Iv4K7L*{SiT z_R68z_TC(Q*Fp17{*1osGo|msDUN$+57BpRK;IRXe$u2hL)O6NmWf=e??!oGp2u|( z%Kh;LT+iz|Np*thc@ark!FdcS&Xf*^kCb z`XkM8ACUd6Ym>Is-Q^UJ_v1(_uZaHvGNE6YMUxcrLlO29d6cM6v z=%buA3E_*lSX>KvK#s&?O1vw)FY%ld;zk!IxJ?v$kzz`5(?{~4P(+O?b}sDI&^)18 z;#9P5S*XP9<6~Cv_(wHg_*^@}?aAJ;QRIZ3qW6%ABCsW9ub;R(||C zn=Dj*XKu2D$Yg19lw=?Q*6hTk8?4oG``lcE{A2VHSCm*=y+3oLD`~0 zbF_u8k%r%K$ru?j!18(#nd=yCdl8BG*o(yED~QB?BvleCVhsC1MHIx)%bdvEyh^R{ zpj2iVioZmQIcsj@kNFBmW{?t~^&*MfpTqm5)aZ|Ssj+c}dK|^ZsBx}5qW#8<4lTmp z?%)*ydyk}IbA$PCqb0;EGjHA^D#OXd!>Zlup1VtleQ{D>>H~#0|L}L!pEeR$6r*bp z`@SJP`e=8Z>?cjBJbA?Cr@9?biA$3ZSfP?MBTe4zaqo_%BA%O&~Zxf)WTG zStf9-ctns#(0ePt(awqUua34n745uOTO`Mn_U%f-m)GzAMAAOY zO1m(+*^zjQg!=uj$~U>h8r@u+Xi-Tbc_dcyNUQ<=$^uuOVq`}z(vfIBtV0KHLE-?3 z*(fOYOO5*wJsy{`wt9Svzv2yn%Zp@IRXs$<{n0PewB~csaqR};!lRc7Se3ra?9I)c z>`ADrlL<(x$CGoTofV<$qn$T|hg%ZSJ#LYRUUM5I?y@>9Knk9@x_TRA3XUMB z!}Gc?k}mUkz#@?Pjg*qJ;8W(lDM0E4fqDHY*;3cdArv*RDyTmt6BwGwZT|a2-B7X4 z?_hgB>>gS+U&c@cZzaDWxVey#)*RV>swfaLf?hJT*bCAr;RW;8N#|lhm3(iUv^0oKOzu4)vP0dH<<$Oy1!mcQ4FJHs$;8tYTjQMFO&HAC!H+3VQaoGC!E7x<;PrKiAs4p%O=U4u64=M zBr_>yOxeYzQ;hseCI4dbiy~(I4f4zR?kDE8cGBOiBnr#gFw15$L*)Do$!t z|EK=%IIX_*r@g1zd7AX>{XsW*ZoHfw=wBY|;RtJ@yATe7QAxNo3Gp6Tyn%Q7Dy~Wo zRmlk!aVulf-b(Gi*uHTl>@4L53QI=Gvy+j)YOtJEo@V+BNWfD6(5VG8w^;`#Y0U-u z&2Ie>`4U9;<1J19thLd{yz;671N2qGJ699Mp|d2isC+S%1uKDN0nKw*e?c|@T5(UU zZ=>woFfv`t_N+;AH>X_;;+d)pH-oKSp$gnecuWdZc%hKOK2o}XQl8EG=sTPb#;oj`$fF#uzrkS}J%2+%y60-BeThwt)nSLnQBdCHJ-Ua`4OY5=ib<`?4)Y&N|) z_-DZZiI>|V_ZH*W0h3A}KGY1Q+F+v=XT#P81C%Y0Xrci_Zn#`2neXKk1{${QR-29w zAq%1r_T&jPnE)D*ua1Y8W%D4Xo(xz)TG^Wzoal)vq54yE2E!CqGgvC*u7Gg3$8ZbF zme1m#TI_5-SpuKpp;|+M5xKMh%wmOiMI{G2qP`I)JM4Y6h7O8rE3p|j&fWH(a)_~H7{LPekt+I& znHNSn2ZqnnR*uRg!{1egg=A=qlOYfrdFo~A&hb@zI%pf$h}8L@8-HzkKhM{eK28?D zt6gh&SRV9u@NHim>#uuaMc;KtTiUgifqujzS?ln}Zl(47iK_C&9HFd^bY7)3j+VtM z#cx(kInnRLbA1(Z{Bz1K+lg-dHL|?~9J>G9+&B0=GoSLjdyG{t$p9wyr3IpPgjsB=Zl5o=HF4OpaN-J4jv`0ru3Pe;JK+TTh}q*~OIuPbeG!d;J^T0ljppy6{L4&AdX{`*#E&0lUu+~okhkqv zIaFN?T_hs(r|5t<0lRW_I5wyKqs>Qwd|iEC(x%b#-hx|~N;O_kuCVJ8Rl7QyqLfC#<=lW zo-Mc`P~Wl5)y>f-SheG8FaW zjEt53j==Cc?^yb|?TDPBTWe^gVb-43xPgbnH0gEr#_c)WWXS5Bov&aHG_iPi@1}0c zcLLwKEnmN6?!J7dNRmBYyIGkDvF>8%R-)c|mVk>r7^Hlm)mog9UJ{sa*;n`{oO>PZ?Dz7;hIB z$^P=E0IUb1yz-9t)Y{?R#tQH z3#+%kgQ(srf1)*h2@YB1PhFetzwLMKzV7Ak zm-4bH70UYDi$W$9efJno$ZGU9e4y!PQ?1fQiT+sWR0RbCkYl&fsiM@*iLMqJk68I3 zFNn_a7KjaNUx8*d%U74We-mxBrD&RCANMt3MIQy6V1IzW^(R-`q)iy0qp%Trv*;zqWQJ0BOm(oXJXV=`uy`RH3|RR8fiYGliO`s6Y< z0SDMO(QmpUpuKxndWMAOfKpR7*qHb&4k*HE-W7<5oOTbhCc|QL~86 zB@i1M8*HZ1_!LzohNV|(kj~i%XM1E^{am*RU$dP2<3%bxjrL&5je(>ibiR0Hf+?QZ0d*$4)&v{JL%Hm%*5 zyh>-2hG*n%i13GAAZ=PLO@?7g19M%Kt4a~af5EO-8G zf7bITh<|D0aV2(kmoaa*E1krzTq);r2;IoiimTpcgmBHfwl$|WSppTE_$y<3hBjh6 zV-Q-^gPtWMc$<=T2})*5?)VN$6*_4Znp~W?kbKGSCBK{Ga=7TEmz&$aNk0S0vgF0d z{z&S04zqI!Vwt+E_IQ72`TgVvy17OT3{-@HPl=Q58|C{Hc ztor^p<^QK;&Y?ZiZu6i2FSjjyeG=HN0&b`8cP)QiYr#!sS#3e5CL&Bv%0A$K?O*?P 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