From b07cf16d737bb5e9d86a477c1ca7b0c856353a8a Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 16:30:11 -0400 Subject: [PATCH 01/15] use non forked syft Signed-off-by: Benji Visser --- cmd/xeol/cli/commands/completion.go | 4 +- cmd/xeol/cli/commands/root.go | 9 +- cmd/xeol/cli/options/search.go | 63 +- .../cli/ui/handle_eol_scanning_started.go | 6 +- .../ui/handle_eol_scanning_started_test.go | 2 +- cmd/xeol/cli/ui/handle_update_eol_database.go | 6 +- .../cli/ui/handle_update_eol_database_test.go | 2 +- cmd/xeol/internal/ui/ui.go | 6 +- go.mod | 233 ++++---- go.sum | 548 ++++++++++-------- internal/xeolio/source.go | 8 +- test/integration/match_by_image_test.go | 21 +- xeol/distro/distro.go | 23 +- xeol/distro/distro_test.go | 180 +----- xeol/distro/type.go | 3 + xeol/pkg/apk_metadata.go | 10 + xeol/pkg/golang_bin_metadata.go | 9 - xeol/pkg/golang_metadata.go | 13 +- xeol/pkg/package.go | 224 +++++-- xeol/pkg/package_test.go | 513 ++++++++++++---- xeol/pkg/provider.go | 15 +- xeol/pkg/provider_config.go | 4 +- xeol/pkg/provider_test.go | 40 +- xeol/pkg/purl_provider.go | 21 +- xeol/pkg/qualifier/qualifier.go | 7 +- xeol/pkg/qualifier/rpmmodularity/qualifier.go | 55 +- .../qualifier/rpmmodularity/qualifier_test.go | 104 +++- xeol/pkg/rpm_metadata.go | 4 +- xeol/pkg/syft_provider.go | 69 +-- xeol/pkg/syft_sbom_provider.go | 18 +- xeol/pkg/syft_sbom_provider_test.go | 149 ++++- xeol/pkg/upstream_package.go | 13 +- xeol/pkg/upstream_package_test.go | 17 +- xeol/presenter/internal/test_helpers.go | 17 +- xeol/presenter/models/document_test.go | 2 +- xeol/presenter/models/package.go | 2 +- xeol/presenter/models/source.go | 6 +- 37 files changed, 1466 insertions(+), 960 deletions(-) create mode 100644 xeol/pkg/apk_metadata.go delete mode 100644 xeol/pkg/golang_bin_metadata.go diff --git a/cmd/xeol/cli/commands/completion.go b/cmd/xeol/cli/commands/completion.go index 8b7ac9c2..b8a98bdf 100644 --- a/cmd/xeol/cli/commands/completion.go +++ b/cmd/xeol/cli/commands/completion.go @@ -5,8 +5,8 @@ import ( "os" "strings" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" "github.com/spf13/cobra" ) @@ -76,7 +76,7 @@ func listLocalDockerImages(prefix string) ([]string, error) { // Only want to return tagged images imageListArgs := filters.NewArgs() imageListArgs.Add("dangling", "false") - images, err := cli.ImageList(ctx, types.ImageListOptions{All: false, Filters: imageListArgs}) + images, err := cli.ImageList(ctx, image.ListOptions{All: false, Filters: imageListArgs}) if err != nil { return repoTags, err } diff --git a/cmd/xeol/cli/commands/root.go b/cmd/xeol/cli/commands/root.go index 98fa6be0..afcdd6d3 100644 --- a/cmd/xeol/cli/commands/root.go +++ b/cmd/xeol/cli/commands/root.go @@ -10,7 +10,8 @@ import ( "github.com/CycloneDX/cyclonedx-go" "github.com/anchore/clio" - "github.com/anchore/syft/syft/formats/common/cyclonedxhelpers" + "github.com/anchore/syft/syft" + "github.com/anchore/syft/syft/format/common/cyclonedxhelpers" "github.com/anchore/syft/syft/linux" syftPkg "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/sbom" @@ -187,7 +188,7 @@ func runXeol(app clio.Application, opts *options.Xeol, userInput string) error { var failScan bool var imageVerified bool var sourceIsImageType bool - if _, ok := s.Source.Metadata.(source.StereoscopeImageSourceMetadata); ok { + if _, ok := s.Source.Metadata.(source.ImageMetadata); ok { sourceIsImageType = true } @@ -347,10 +348,12 @@ func getMatchers(opts *options.Xeol) []matcher.Matcher { } func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { + cfg := syft.DefaultCreateSBOMConfig() + return pkg.ProviderConfig{ SyftProviderConfig: pkg.SyftProviderConfig{ RegistryOptions: opts.Registry.ToOptions(), - CatalogingOptions: opts.Search.ToConfig(), + SBOMOptions: cfg, Platform: opts.Platform, Name: opts.Name, DefaultImagePullSource: opts.DefaultImagePullSource, diff --git a/cmd/xeol/cli/options/search.go b/cmd/xeol/cli/options/search.go index 12c2d3fb..82c56d36 100644 --- a/cmd/xeol/cli/options/search.go +++ b/cmd/xeol/cli/options/search.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/anchore/clio" - "github.com/anchore/syft/syft/pkg/cataloger" + "github.com/anchore/syft/syft/cataloging" "github.com/anchore/syft/syft/source" ) @@ -14,10 +14,13 @@ type search struct { IncludeIndexedArchives bool `yaml:"indexed-archives" json:"indexed-archives" mapstructure:"indexed-archives"` } -var _ clio.PostLoader = (*search)(nil) +var _ interface { + clio.PostLoader + clio.FieldDescriber +} = (*search)(nil) func defaultSearch(scope source.Scope) search { - c := cataloger.DefaultSearchConfig() + c := cataloging.DefaultArchiveSearchConfig() return search{ Scope: scope.String(), IncludeUnindexedArchives: c.IncludeUnindexedArchives, @@ -33,52 +36,14 @@ func (cfg *search) PostLoad() error { return nil } -func (cfg search) GetScope() source.Scope { - return source.ParseScope(cfg.Scope) +func (cfg *search) DescribeFields(descriptions clio.FieldDescriptionSet) { + descriptions.Add(&cfg.IncludeUnindexedArchives, `search within archives that do contain a file index to search against (zip) +note: for now this only applies to the java package cataloger`) + descriptions.Add(&cfg.IncludeIndexedArchives, `search within archives that do not contain a file index to search against (tar, tar.gz, tar.bz2, etc) +note: enabling this may result in a performance impact since all discovered compressed tars will be decompressed +note: for now this only applies to the java package cataloger`) } -func (cfg search) ToConfig() cataloger.Config { - return cataloger.Config{ - Search: cataloger.SearchConfig{ - IncludeIndexedArchives: cfg.IncludeIndexedArchives, - IncludeUnindexedArchives: cfg.IncludeUnindexedArchives, - Scope: cfg.GetScope(), - }, - Catalogers: []string{ - "alpm-db-cataloger", - "apkdb-cataloger", - "binary-cataloger", - "cargo-auditable-binary-cataloger", - "cocoapods-cataloger", - "conan-cataloger", - "dartlang-lock-cataloger", - "dotnet-deps-cataloger", - "dpkgdb-cataloger", - "javascript-cataloger", - "elixir-mix-lock-cataloger", - "erlang-rebar-lock-cataloger", - "go-module-file-cataloger", - "go-module-binary-cataloger", - "graalvm-native-image-cataloger", - "haskell-cataloger", - "java-cataloger", - "java-gradle-lockfile-cataloger", - "java-pom-cataloger", - "linux-kernel-cataloger", - "nix-store-cataloger", - "php-composer-installed-cataloger", - "php-composer-lock-cataloger", - "portage-cataloger", - "python-package-cataloger", - "python-installed-package-cataloger", - "rpm-db-cataloger", - "rpm-archive-cataloger", - "ruby-gemfile-cataloger", - "ruby-installed-gemspec-cataloger", - "rust-cargo-lock-cataloger", - "sbom-cataloger", - "spm-cataloger", - }, - ExcludeBinaryOverlapByOwnership: true, - } +func (cfg search) GetScope() source.Scope { + return source.ParseScope(cfg.Scope) } diff --git a/cmd/xeol/cli/ui/handle_eol_scanning_started.go b/cmd/xeol/cli/ui/handle_eol_scanning_started.go index 6701d09c..d1345c0c 100644 --- a/cmd/xeol/cli/ui/handle_eol_scanning_started.go +++ b/cmd/xeol/cli/ui/handle_eol_scanning_started.go @@ -64,11 +64,11 @@ func (p eolScanningAdapter) Stage() string { return fmt.Sprintf("%d eol matches", p.mon.MatchesDiscovered.Current()) } -func (m *Handler) handleEolScanningStarted(e partybus.Event) []tea.Model { +func (m *Handler) handleEolScanningStarted(e partybus.Event) ([]tea.Model, tea.Cmd) { mon, err := parsers.ParseEolScanningStarted(e) if err != nil { log.WithFields("error", err).Warn("unable to parse event") - return nil + return nil, nil } tsk := m.newTaskProgress( @@ -87,7 +87,7 @@ func (m *Handler) handleEolScanningStarted(e partybus.Event) []tea.Model { return []tea.Model{ tsk, neweolProgressTree(mon, textStyle), - } + }, nil } func (l eolProgressTree) Init() tea.Cmd { diff --git a/cmd/xeol/cli/ui/handle_eol_scanning_started_test.go b/cmd/xeol/cli/ui/handle_eol_scanning_started_test.go index 4080d80b..527fefe9 100644 --- a/cmd/xeol/cli/ui/handle_eol_scanning_started_test.go +++ b/cmd/xeol/cli/ui/handle_eol_scanning_started_test.go @@ -49,7 +49,7 @@ func TestHandler_handleEolScanningStarted(t *testing.T) { Height: 80, } - models := handler.Handle(e) + models, _ := handler.Handle(e) require.Len(t, models, 2) t.Run("task line", func(t *testing.T) { diff --git a/cmd/xeol/cli/ui/handle_update_eol_database.go b/cmd/xeol/cli/ui/handle_update_eol_database.go index 5b7ca4c2..6d0a30eb 100644 --- a/cmd/xeol/cli/ui/handle_update_eol_database.go +++ b/cmd/xeol/cli/ui/handle_update_eol_database.go @@ -32,11 +32,11 @@ func (s dbDownloadProgressStager) Stage() string { return stage } -func (m *Handler) handleUpdateEolDatabase(e partybus.Event) []tea.Model { +func (m *Handler) handleUpdateEolDatabase(e partybus.Event) ([]tea.Model, tea.Cmd) { prog, err := parsers.ParseUpdateEolDatabase(e) if err != nil { log.WithFields("error", err).Warn("unable to parse event") - return nil + return nil, nil } tsk := m.newTaskProgress( @@ -49,5 +49,5 @@ func (m *Handler) handleUpdateEolDatabase(e partybus.Event) []tea.Model { tsk.HideStageOnSuccess = false - return []tea.Model{tsk} + return []tea.Model{tsk}, nil } diff --git a/cmd/xeol/cli/ui/handle_update_eol_database_test.go b/cmd/xeol/cli/ui/handle_update_eol_database_test.go index 63db7d65..0075d4c7 100644 --- a/cmd/xeol/cli/ui/handle_update_eol_database_test.go +++ b/cmd/xeol/cli/ui/handle_update_eol_database_test.go @@ -78,7 +78,7 @@ func TestHandler_handleUpdateEolDatabase(t *testing.T) { Height: 80, } - models := handler.Handle(e) + models, _ := handler.Handle(e) require.Len(t, models, 1) model := models[0] diff --git a/cmd/xeol/internal/ui/ui.go b/cmd/xeol/internal/ui/ui.go index cc3f31a7..1a43563d 100644 --- a/cmd/xeol/internal/ui/ui.go +++ b/cmd/xeol/internal/ui/ui.go @@ -144,7 +144,11 @@ func (m *UI) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, nil } - for _, newModel := range m.handler.Handle(msg) { + models, cmd := m.handler.Handle(msg) + if cmd != nil { + cmds = append(cmds, cmd) + } + for _, newModel := range models { if newModel == nil { continue } diff --git a/go.mod b/go.mod index 7e3d75af..2d4dfc2e 100644 --- a/go.mod +++ b/go.mod @@ -1,31 +1,33 @@ module github.com/xeol-io/xeol -go 1.21.1 +go 1.22.0 + +toolchain go1.22.6 require ( - github.com/CycloneDX/cyclonedx-go v0.7.2 + github.com/CycloneDX/cyclonedx-go v0.9.0 github.com/Masterminds/semver v1.5.0 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d - github.com/adrg/xdg v0.4.0 - github.com/anchore/bubbly v0.0.0-20230801194016-acdb4981b461 - github.com/anchore/clio v0.0.0-20230915181724-f1acbce87918 + github.com/adrg/xdg v0.5.0 + github.com/anchore/bubbly v0.0.0-20231115134915-def0aba654a9 + github.com/anchore/clio v0.0.0-20240522144804-d81e109008aa + github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537 github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 - github.com/anchore/packageurl-go v0.1.1-0.20230104203445-02e0a6721501 - github.com/anchore/stereoscope v0.0.0-20230919183137-5841b53a0375 - github.com/anchore/syft v0.92.0 + github.com/anchore/packageurl-go v0.1.1-0.20240507183024-848e011fc24f + github.com/anchore/stereoscope v0.0.3-0.20240725180315-50ce3be7aa1f + github.com/anchore/syft v1.10.0 github.com/bmatcuk/doublestar/v2 v2.0.4 - github.com/charmbracelet/bubbletea v0.24.2 - github.com/charmbracelet/lipgloss v0.8.0 - github.com/docker/distribution v2.8.2+incompatible - github.com/docker/docker v24.0.6+incompatible + github.com/charmbracelet/bubbletea v0.26.6 + github.com/charmbracelet/lipgloss v0.12.1 + github.com/docker/distribution v2.8.3+incompatible + github.com/docker/docker v27.1.1+incompatible github.com/dustin/go-humanize v1.0.1 - github.com/facebookincubator/nvdtools v0.1.5 - github.com/gabriel-vasile/mimetype v1.4.2 - github.com/gkampitakis/go-snaps v0.4.10 + github.com/gabriel-vasile/mimetype v1.4.4 + github.com/gkampitakis/go-snaps v0.5.6 github.com/glebarez/sqlite v1.9.0 github.com/go-git/go-git/v5 v5.12.0 - github.com/go-test/deep v1.1.0 + github.com/go-test/deep v1.1.1 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/gookit/color v1.5.4 @@ -43,43 +45,40 @@ require ( github.com/notaryproject/notation-go v1.0.0 github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/go-digest v1.0.0 - github.com/opencontainers/image-spec v1.1.0-rc5 + github.com/opencontainers/image-spec v1.1.0 github.com/oras-project/oras-credentials-go v0.3.1 github.com/pkg/errors v0.9.1 github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e - github.com/sigstore/sigstore v1.7.3 - github.com/spf13/afero v1.9.5 - github.com/spf13/cobra v1.7.0 + github.com/sigstore/sigstore v1.8.4 + github.com/spf13/afero v1.11.0 + github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b - github.com/wagoodman/go-progress v0.0.0-20230911172108-cf810b7e365c + github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 gorm.io/gorm v1.25.6 oras.land/oras-go/v2 v2.3.0 ) -replace github.com/anchore/syft => github.com/noqcks/syft v0.0.0-20240109150718-1b286b681098 - require ( - cloud.google.com/go v0.110.2 // indirect - cloud.google.com/go/compute v1.20.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.0 // indirect - cloud.google.com/go/storage v1.29.0 // indirect + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/iam v1.1.6 // indirect + cloud.google.com/go/storage v1.38.0 // indirect dario.cat/mergo v1.0.0 // indirect - github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect - github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 // indirect - github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect - github.com/DataDog/zstd v1.4.5 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/DataDog/zstd v1.5.5 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/Microsoft/hcsshim v0.10.0-rc.7 // indirect + github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/acobaugh/osrelease v0.1.0 // indirect - github.com/anchore/fangs v0.0.0-20230818131516-2186b10924fe // indirect + github.com/anchore/fangs v0.0.0-20240508143433-f016b099950f // indirect github.com/anchore/go-macholibre v0.0.0-20220308212642-53e6d0aaf6fb // indirect github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 // indirect github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04 // indirect @@ -90,55 +89,64 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/becheran/wildmatch-go v1.0.0 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect - github.com/bmatcuk/doublestar/v4 v4.6.0 // indirect - github.com/charmbracelet/bubbles v0.16.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect + github.com/charmbracelet/bubbles v0.18.0 // indirect github.com/charmbracelet/harmonica v0.2.0 // indirect - github.com/cloudflare/circl v1.3.7 // indirect + github.com/charmbracelet/x/ansi v0.1.4 // indirect + github.com/charmbracelet/x/input v0.1.0 // indirect + github.com/charmbracelet/x/term v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.1.0 // indirect + github.com/cloudflare/circl v1.3.8 // indirect github.com/containerd/cgroups v1.1.0 // indirect - github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect - github.com/containerd/containerd v1.7.0 // indirect - github.com/containerd/continuity v0.3.0 // indirect + github.com/containerd/containerd v1.7.11 // indirect + github.com/containerd/continuity v0.4.2 // indirect github.com/containerd/fifo v1.1.0 // indirect + github.com/containerd/log v0.1.0 // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect - github.com/containerd/ttrpc v1.2.1 // indirect - github.com/containerd/typeurl/v2 v2.1.0 // indirect + github.com/containerd/ttrpc v1.2.2 // indirect + github.com/containerd/typeurl/v2 v2.1.1 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da // indirect - github.com/docker/cli v24.0.0+incompatible // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/cli v27.0.3+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/elliotchance/phpserialize v1.4.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/etdub/goparsetime v0.0.0-20160315173935-ea17b0ac3318 // indirect + github.com/facebookincubator/nvdtools v0.1.5 // indirect github.com/felixge/fgprof v0.9.3 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect - github.com/github/go-spdx/v2 v2.2.0 // indirect - github.com/gkampitakis/ciinfo v0.2.5 // indirect + github.com/github/go-spdx/v2 v2.3.1 // indirect + github.com/gkampitakis/ciinfo v0.3.0 // indirect github.com/gkampitakis/go-diff v1.3.2 // indirect github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-ldap/ldap/v3 v3.4.5 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-restruct/restruct v1.2.0-alpha // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect - github.com/google/go-containerregistry v0.16.1 // indirect + github.com/google/go-containerregistry v0.20.1 // indirect github.com/google/licensecheck v0.3.1 // indirect - github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect @@ -153,33 +161,36 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/kastenhq/goversion v0.0.0-20230811215019-93b2f8823953 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.16.5 // indirect + github.com/klauspost/compress v1.17.8 // indirect github.com/klauspost/pgzip v1.2.5 // indirect - github.com/knqyf263/go-rpmdb v0.0.0-20230301153543-ba94b245509b // indirect + github.com/knqyf263/go-rpmdb v0.1.1 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf // indirect - github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 // indirect + github.com/letsencrypt/boulder v0.0.0-20230907030200-6d76a0f91e1e // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/maruel/natural v1.1.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/microsoft/go-rustaudit v0.0.0-20220808201409-204dfee52032 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/locker v1.0.1 // indirect - github.com/moby/sys/mountinfo v0.6.2 // indirect + github.com/moby/sys/mountinfo v0.7.2 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/signal v0.7.0 // indirect github.com/moby/term v0.5.0 // indirect - github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.2 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/notaryproject/notation-core-go v1.0.0 // indirect github.com/nwaples/rardecode v1.1.2 // indirect github.com/opencontainers/runc v1.1.12 // indirect @@ -187,77 +198,83 @@ require ( github.com/opencontainers/selinux v1.11.0 // indirect github.com/pborman/indent v1.2.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect - github.com/pierrec/lz4/v4 v4.1.17 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pierrec/lz4/v4 v4.1.19 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/profile v1.7.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/saferwall/pe v1.4.5 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/saferwall/pe v1.5.4 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/sassoftware/go-rpmutils v0.2.0 // indirect + github.com/sassoftware/go-rpmutils v0.4.0 // indirect + github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d // indirect + github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spdx/tools-golang v0.5.3 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spdx/tools-golang v0.5.5 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.16.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - github.com/sylabs/sif/v2 v2.11.5 // indirect - github.com/sylabs/squashfs v0.6.1 // indirect + github.com/spf13/viper v1.18.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/sylabs/sif/v2 v2.17.1 // indirect + github.com/sylabs/squashfs v1.0.0 // indirect github.com/therootcompany/xz v1.0.1 // indirect - github.com/theupdateframework/go-tuf v0.5.2 // indirect - github.com/tidwall/gjson v1.16.0 // indirect + github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect - github.com/ulikunitz/xz v0.5.10 // indirect - github.com/vbatts/go-mtree v0.5.3 // indirect + github.com/ulikunitz/xz v0.5.12 // indirect + github.com/vbatts/go-mtree v0.5.4 // indirect github.com/vbatts/tar-split v0.11.3 // indirect github.com/veraison/go-cose v1.1.0 // indirect github.com/vifraa/gopom v1.0.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect - github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.14.0 // indirect - go.opentelemetry.io/otel/trace v1.14.0 // indirect - go.uber.org/goleak v1.2.1 // indirect - golang.org/x/crypto v0.21.0 // indirect - golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.22.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.128.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/grpc v1.56.3 // indirect - google.golang.org/protobuf v1.31.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/crypto v0.25.0 // indirect + golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.27.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.22.0 // indirect + golang.org/x/term v0.22.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/api v0.169.0 // indirect + google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.2 // indirect + gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.4.0 // indirect - modernc.org/libc v1.24.1 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.6.0 // indirect - modernc.org/sqlite v1.25.0 // indirect + modernc.org/libc v1.55.3 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/sqlite v1.31.1 // indirect ) diff --git a/go.sum b/go.sum index 24aefb5b..a7a7c3d4 100644 --- a/go.sum +++ b/go.sum @@ -3,7 +3,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 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= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -16,7 +15,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 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= @@ -33,8 +31,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA= -cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -71,10 +69,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.20.1 h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg= -cloud.google.com/go/compute v1.20.1/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/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -113,8 +109,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94= -cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -172,12 +168,11 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo 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.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg= +cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -192,10 +187,10 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= -github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 h1:+vTEFqeoeur6XSq06bs+roX3YiT49gUniJK7Zky7Xjg= -github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= @@ -203,12 +198,14 @@ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzS github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CycloneDX/cyclonedx-go v0.7.2 h1:kKQ0t1dPOlugSIYVOMiMtFqeXI2wp/f5DBIdfux8gnQ= -github.com/CycloneDX/cyclonedx-go v0.7.2/go.mod h1:K2bA+324+Og0X84fA8HhN2X066K7Bxz4rpMQ4ZhjtSk= +github.com/CycloneDX/cyclonedx-go v0.9.0 h1:inaif7qD8bivyxp7XLgxUYtOXWtDez7+j72qKTMQTb8= +github.com/CycloneDX/cyclonedx-go v0.9.0/go.mod h1:NE/EWvzELOFlG6+ljX/QeMlVt9VKcTwu8u0ccsACEsw= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= @@ -221,8 +218,8 @@ github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBa github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= 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/Microsoft/hcsshim v0.10.0-rc.7 h1:HBytQPxcv8Oy4244zbQbe6hnOnx544eL5QPUqhJldz8= -github.com/Microsoft/hcsshim v0.10.0-rc.7/go.mod h1:ILuwjA+kNW+MrN/w5un7n3mTqkwsFu4Bp05/okFUZlE= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= @@ -230,20 +227,22 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpH github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/acobaugh/osrelease v0.1.0 h1:Yb59HQDGGNhCj4suHaFQQfBps5wyoKLSSX/J/+UifRE= github.com/acobaugh/osrelease v0.1.0/go.mod h1:4bFEs0MtgHNHBrmHCt67gNisnabCRAlzdVasCEGHTWY= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY= +github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4= 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/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/anchore/bubbly v0.0.0-20230801194016-acdb4981b461 h1:xGu4/uMWucwWV0YV3fpFIQZ6KVfS/Wfhmma8t0s0vRo= -github.com/anchore/bubbly v0.0.0-20230801194016-acdb4981b461/go.mod h1:Ger02eh5NpPm2IqkPAy396HU1KlK3BhOeCljDYXySSk= -github.com/anchore/clio v0.0.0-20230915181724-f1acbce87918 h1:6OAq04XkelroCdjhjv54sMGNTaeNRf78LSSqAQKxId0= -github.com/anchore/clio v0.0.0-20230915181724-f1acbce87918/go.mod h1:XryJ3CIF1T7SbacQV+OPykfKKIbfXnBssYfpjy2peUg= -github.com/anchore/fangs v0.0.0-20230818131516-2186b10924fe h1:pVpLCGWdNeskAw7vGNdCAcGMezrNljHIqOc9HaOja5M= -github.com/anchore/fangs v0.0.0-20230818131516-2186b10924fe/go.mod h1:82EGoxZTfBXSW0/zollEP+Qs3wkiKmip5yBT5j+eZpY= +github.com/anchore/bubbly v0.0.0-20231115134915-def0aba654a9 h1:p0ZIe0htYOX284Y4axJaGBvXHU0VCCzLN5Wf5XbKStU= +github.com/anchore/bubbly v0.0.0-20231115134915-def0aba654a9/go.mod h1:3ZsFB9tzW3vl4gEiUeuSOMDnwroWxIxJelOOHUp8dSw= +github.com/anchore/clio v0.0.0-20240522144804-d81e109008aa h1:pwlAn4O9SBUnlgfa69YcqIynbUyobLVFYu8HxSoCffA= +github.com/anchore/clio v0.0.0-20240522144804-d81e109008aa/go.mod h1:nD3H5uIvjxlfmakOBgtyFQbk5Zjp3l538kxfpHPslzI= +github.com/anchore/fangs v0.0.0-20240508143433-f016b099950f h1:NOhzafCyNYFi88qxkBFjMzQo4dRa1vDhBzx+0Uovx8Q= +github.com/anchore/fangs v0.0.0-20240508143433-f016b099950f/go.mod h1:sVpRS2yNCw6tLVpvA1QSDVWTJVpCuAm8JNZgn4Sjz/k= +github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537 h1:GjNGuwK5jWjJMyVppBjYS54eOiiSNv4Ba869k4wh72Q= +github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537/go.mod h1:1aiktV46ATCkuVg0O573ZrH56BUawTECPETbZyBcqT8= github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a h1:nJ2G8zWKASyVClGVgG7sfM5mwoZlZ2zYpIzN2OhjWkw= github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a/go.mod h1:ubLFmlsv8/DFUQrZwY5syT5/8Er3ugSr4rDFwHsE3hg= github.com/anchore/go-macholibre v0.0.0-20220308212642-53e6d0aaf6fb h1:iDMnx6LIjtjZ46C0akqveX83WFzhpTD3eqOthawb5vU= @@ -254,10 +253,12 @@ github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04 h1:VzprUTpc0v github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04/go.mod h1:6dK64g27Qi1qGQZ67gFmBFvEHScy0/C8qhQhNe5B5pQ= github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 h1:rmZG77uXgE+o2gozGEBoUMpX27lsku+xrMwlmBZJtbg= github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4/go.mod h1:Bkc+JYWjMCF8OyZ340IMSIi2Ebf3uwByOk6ho4wne1E= -github.com/anchore/packageurl-go v0.1.1-0.20230104203445-02e0a6721501 h1:AV7qjwMcM4r8wFhJq3jLRztew3ywIyPTRapl2T1s9o8= -github.com/anchore/packageurl-go v0.1.1-0.20230104203445-02e0a6721501/go.mod h1:Blo6OgJNiYF41ufcgHKkbCKF2MDOMlrqhXv/ij6ocR4= -github.com/anchore/stereoscope v0.0.0-20230919183137-5841b53a0375 h1:lpeR4D5PMFXg80QVJgwlJs0QyS8FTBVuFW45Y+3Tat0= -github.com/anchore/stereoscope v0.0.0-20230919183137-5841b53a0375/go.mod h1:75uRHom5WV5ENe3iSK2B37BQvB+47o9HYjpCYaSwlPQ= +github.com/anchore/packageurl-go v0.1.1-0.20240507183024-848e011fc24f h1:B/E9ixKNCasntpoch61NDaQyGPDXLEJlL+B9B/PbdbA= +github.com/anchore/packageurl-go v0.1.1-0.20240507183024-848e011fc24f/go.mod h1:Blo6OgJNiYF41ufcgHKkbCKF2MDOMlrqhXv/ij6ocR4= +github.com/anchore/stereoscope v0.0.3-0.20240725180315-50ce3be7aa1f h1:xuBvotcht1Ns8IdaC4UuYV1U8MFln9c5ELeo5bzDEO8= +github.com/anchore/stereoscope v0.0.3-0.20240725180315-50ce3be7aa1f/go.mod h1:DcQdMes8SwpFli3rDH0v+Vd9qU9Jariq7JSHNJV5X/A= +github.com/anchore/syft v1.10.0 h1:zZ8BWhrajaIIRyFe7zj3hWASEdeo/2kYUfEx7c9twZs= +github.com/anchore/syft v1.10.0/go.mod h1:+i4dtOhJc9o+t7o8TKwsIkOeCQKgRaDk7N8YqwhsU10= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= @@ -276,6 +277,8 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.288 h1:Ln7fIao/nl0ACtelgR1I4AiEw/GLNkKcXfCaHupUW5Q= github.com/aws/aws-sdk-go v1.44.288/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= @@ -292,11 +295,13 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmatcuk/doublestar/v2 v2.0.4 h1:6I6oUiT/sU27eE2OFcWqBhL1SwjyvQuOssxT4a1yidI= github.com/bmatcuk/doublestar/v2 v2.0.4/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw= -github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc= -github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= +github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= 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/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -305,14 +310,22 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL 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/charmbracelet/bubbles v0.16.1 h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY= -github.com/charmbracelet/bubbles v0.16.1/go.mod h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc= -github.com/charmbracelet/bubbletea v0.24.2 h1:uaQIKx9Ai6Gdh5zpTbGiWpytMU+CfsPp06RaW2cx/SY= -github.com/charmbracelet/bubbletea v0.24.2/go.mod h1:XdrNrV4J8GiyshTtx3DNuYkR1FDaJmO3l2nejekbsgg= +github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= +github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= +github.com/charmbracelet/bubbletea v0.26.6 h1:zTCWSuST+3yZYZnVSvbXwKOPRSNZceVeqpzOLN2zq1s= +github.com/charmbracelet/bubbletea v0.26.6/go.mod h1:dz8CWPlfCCGLFbBlTY4N7bjLiyOGDJEnd2Muu7pOWhk= github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ= github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= -github.com/charmbracelet/lipgloss v0.8.0 h1:IS00fk4XAHcf8uZKc3eHeMUTCxUH6NkaTrdyCQk84RU= -github.com/charmbracelet/lipgloss v0.8.0/go.mod h1:p4eYUZZJ/0oXTuCQKFF8mqyKCz0ja6y+7DniDDw5KKU= +github.com/charmbracelet/lipgloss v0.12.1 h1:/gmzszl+pedQpjCOH+wFkZr/N90Snz40J/NR7A0zQcs= +github.com/charmbracelet/lipgloss v0.12.1/go.mod h1:V2CiwIuhx9S1S1ZlADfOj9HmxeMAORuz5izHb0zGbB8= +github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= +github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/input v0.1.0 h1:TEsGSfZYQyOtp+STIjyBq6tpRaorH0qpwZUj8DavAhQ= +github.com/charmbracelet/x/input v0.1.0/go.mod h1:ZZwaBxPF7IG8gWWzPUVqHEtWhc1+HXJPNuerJGRGZ28= +github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= +github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= +github.com/charmbracelet/x/windows v0.1.0 h1:gTaxdvzDM5oMa/I2ZNF7wN78X/atWemG9Wph7Ika2k4= +github.com/charmbracelet/x/windows v0.1.0/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -321,8 +334,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= +github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= 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= @@ -335,25 +348,26 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= -github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/containerd/containerd v1.7.0 h1:G/ZQr3gMZs6ZT0qPUZ15znx5QSdQdASW11nXTLTM2Pg= -github.com/containerd/containerd v1.7.0/go.mod h1:QfR7Efgb/6X2BDpTPJRvPTYDE9rsF0FsXX9J8sIs/sc= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= +github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 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/containerd/ttrpc v1.2.1 h1:VWv/Rzx023TBLv4WQ+9WPXlBG/s3rsRjY3i9AJ2BJdE= -github.com/containerd/ttrpc v1.2.1/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= -github.com/containerd/typeurl/v2 v2.1.0 h1:yNAhJvbNEANt7ck48IlEGOxP7YAp6LLpGn5jZACDNIE= -github.com/containerd/typeurl/v2 v2.1.0/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 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.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -364,12 +378,14 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8Yc github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da h1:ZOjWpVsFZ06eIhnh4mkaceTiVoktdU67+M7KDHJ268M= github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da/go.mod h1:B3tI9iGHi4imdLi4Asdha1Sc6feLMTfPLXh9IUYmysk= github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1/go.mod h1:+hnT3ywWDTAFrW5aE+u2Sa/wT555ZqwoCS+pk3p6ry4= -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.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= +github.com/docker/cli v27.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+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-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -387,6 +403,8 @@ github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elliotchance/phpserialize v1.4.0 h1:cAp/9+KSnEbUC8oYCE32n2n84BeW8HOY3HMDI8hG2OY= +github.com/elliotchance/phpserialize v1.4.0/go.mod h1:gt7XX9+ETUcLXbtTKEuyrqW3lcLUAeS/AnGZ2e49TZs= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -401,14 +419,10 @@ github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPO github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/etdub/goparsetime v0.0.0-20160315173935-ea17b0ac3318 h1:iguwbR+9xsizl84VMHU47I4OOWYSex1HZRotEoqziWQ= github.com/etdub/goparsetime v0.0.0-20160315173935-ea17b0ac3318/go.mod h1:O/QFFckzvu1KpS1AOuQGgi6ErznEF8nZZVNDDMXlDP4= -github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= -github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= -github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01 h1:IeaD1VDVBPlx3viJT9Md8if8IxxJnO+x0JCGb054heg= -github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01/go.mod h1:ypD5nozFk9vcGw1ATYefw6jHe/jZP++Z15/+VTMcWhc= -github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52 h1:a4DFiKFJiDRGFD1qIcqGLX/WlUMD9dyLSLDt+9QZgt8= -github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52/go.mod h1:yIquW87NGRw1FU5p5lEkpnt/QxoH5uPAOUlOVkAUuMg= github.com/facebookincubator/flog v0.0.0-20190930132826-d2511d0ce33c/go.mod h1:QGzNH9ujQ2ZUr/CjDGZGWeDAVStrWNjHeEcjJL96Nuk= github.com/facebookincubator/nvdtools v0.1.5 h1:jbmDT1nd6+k+rlvKhnkgMokrCAzHoASWE5LtHbX2qFQ= github.com/facebookincubator/nvdtools v0.1.5/go.mod h1:Kh55SAWnjckS96TBSrXI99KrEKH4iB0OJby3N8GRJO4= @@ -419,24 +433,26 @@ github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA= github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI= github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= -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/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= +github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/github/go-spdx/v2 v2.2.0 h1:yBBLMasHA70Ujd35OpL/OjJOWWVNXcJGbars0GinGRI= -github.com/github/go-spdx/v2 v2.2.0/go.mod h1:hMCrsFgT0QnCwn7G8gxy/MxMpy67WgZrwFeISTn0o6w= -github.com/gkampitakis/ciinfo v0.2.5 h1:K0mac90lGguc1conc46l0YEsB7/nioWCqSnJp/6z8Eo= -github.com/gkampitakis/ciinfo v0.2.5/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/github/go-spdx/v2 v2.3.1 h1:ffGuHTbHuHzWPt53n8f9o8clGutuLPObo3zB4JAjxU8= +github.com/github/go-spdx/v2 v2.3.1/go.mod h1:2ZxKsOhvBp+OYBDlsGnUMcchLeo2mrpEBn2L1C+U3IQ= +github.com/gkampitakis/ciinfo v0.3.0 h1:gWZlOC2+RYYttL0hBqcoQhM7h1qNkVqvRCV1fOvpAv8= +github.com/gkampitakis/ciinfo v0.3.0/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= -github.com/gkampitakis/go-snaps v0.4.10 h1:rUcTH4k6+rzw6ylDALMifzw2c/f9cG3NZe/n+7Ygdr4= -github.com/gkampitakis/go-snaps v0.4.10/go.mod h1:N4TpqxI4CqKUfHzDFqrqZ5UP0I0ESz2g2NMslh7MiJw= +github.com/gkampitakis/go-snaps v0.5.6 h1:kAal5JbqTycI+6xeS3K0nPqvNDAxqKX5W3dRXKxIJpA= +github.com/gkampitakis/go-snaps v0.5.6/go.mod h1:ZABkO14uCuVxBHAXAfKG+bqNz+aa1bGPAg8jkI0Nk8Y= github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo= github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k= github.com/glebarez/sqlite v1.9.0 h1:Aj6bPA12ZEx5GbSF6XADmCkYXlljPNUY+Zf1EQxynXs= @@ -463,16 +479,16 @@ github.com/go-ldap/ldap/v3 v3.4.5/go.mod h1:bMGIq3AGbytbaMwf8wdv5Phdxz0FWHTIYMSz 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-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.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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-restruct/restruct v1.2.0-alpha h1:2Lp474S/9660+SJjpVxoKuWX09JsXHSrdV7Nv3/gkvc= github.com/go-restruct/restruct v1.2.0-alpha/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -511,8 +527,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw 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/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 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= @@ -536,8 +552,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/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-containerregistry v0.20.1 h1:eTgx9QNYugV4DN5mz4U8hiAGTi1ybXn0TPi4Smd8du0= +github.com/google/go-containerregistry v0.20.1/go.mod h1:YCMFNQeeXeLF+dnhhWkqDItx/JSkH01j1Kis4PsjzFI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= @@ -557,18 +573,17 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 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-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/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= 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/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -577,8 +592,8 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= 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= @@ -588,14 +603,16 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +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.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= 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.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= @@ -630,7 +647,10 @@ github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mO github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= @@ -641,10 +661,6 @@ github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/honeycombio/beeline-go v1.10.0 h1:cUDe555oqvw8oD76BQJ8alk7FP0JZ/M/zXpNvOEDLDc= -github.com/honeycombio/beeline-go v1.10.0/go.mod h1:Zz5WMeQCJzFt2Mvf8t6HC1X8RLskLVR/e8rvcmXB1G8= -github.com/honeycombio/libhoney-go v1.16.0 h1:kPpqoz6vbOzgp7jC6SR7SkNj7rua7rgxvznI6M3KdHc= -github.com/honeycombio/libhoney-go v1.16.0/go.mod h1:izP4fbREuZ3vqC4HlCAmPrcPT9gxyxejRjGtCYpmBn0= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -672,8 +688,8 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y 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/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo= +github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= +github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -691,15 +707,14 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -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/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/knqyf263/go-rpmdb v0.0.0-20230301153543-ba94b245509b h1:boYyvL3tbUuKcMN029mpCl7oYYJ7yIXujLj+fiW4Alc= -github.com/knqyf263/go-rpmdb v0.0.0-20230301153543-ba94b245509b/go.mod h1:9LQcoMCMQ9vrF7HcDtXfvqGO4+ddxFQ8+YF/0CVGDww= +github.com/knqyf263/go-rpmdb v0.1.1 h1:oh68mTCvp1XzxdU7EfafcWzzfstUZAEa3MW0IJye584= +github.com/knqyf263/go-rpmdb v0.1.1/go.mod h1:9LQcoMCMQ9vrF7HcDtXfvqGO4+ddxFQ8+YF/0CVGDww= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -711,16 +726,19 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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= -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/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 h1:bqDmpDG49ZRnB5PcgP0RXtQvnMSgIF14M7CBd2shtXs= +github.com/letsencrypt/boulder v0.0.0-20230907030200-6d76a0f91e1e h1:RLTpX495BXToqxpM90Ws4hXEo4Wfh81jr9DX1n/4WOo= +github.com/letsencrypt/boulder v0.0.0-20230907030200-6d76a0f91e1e/go.mod h1:EAuqr9VFWxBi9nD5jc/EA2MT1RFty9288TF6zdtYoCU= github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= 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.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= 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/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -736,15 +754,15 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75 h1:P8UmIzZMYDR+NGImiFvErt6VWfIRPuGM+vyjiEdkmIw= github.com/mattn/go-localereader v0.0.2-0.20220822084749-2491eb6c1c75/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -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-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 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= @@ -776,10 +794,12 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= +github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= @@ -793,8 +813,8 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 h1:kMlmsLSbjkikxQJ1IPwaM+7LJ9ltFu/fi8CRzvSnQmA= -github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= @@ -802,8 +822,8 @@ github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKt github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/noqcks/syft v0.0.0-20240109150718-1b286b681098 h1:+TJ4eFgWFdZgO/ltg7DMjNeoT5w1AnGoNS4pUvJfNo4= -github.com/noqcks/syft v0.0.0-20240109150718-1b286b681098/go.mod h1:JTwDULqhUlXmeOJXhbesxhY6zG2due9cefe0E01pneE= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/notaryproject/notation v1.0.0 h1:CJ17obUMRJOljApN8NCgYNmxfJQ878UrN0VbKACvDW0= github.com/notaryproject/notation v1.0.0/go.mod h1:BrPDyD390EOKkzLDS/3tEbg79wLIkNc0vCLfKHTd0Hw= github.com/notaryproject/notation-core-go v1.0.0 h1:FgOAihtFW4XU9JYyTzItg1xW3OaN4eCasw5Bp00Ydu4= @@ -819,8 +839,8 @@ github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= 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-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= github.com/opencontainers/runtime-spec v1.1.0-rc.1 h1:wHa9jroFfKGQqFHj0I1fMRKLl0pfj+ynAqBxo3v6u9w= @@ -836,11 +856,11 @@ github.com/pborman/indent v1.2.1/go.mod h1:FitS+t35kIYtB5xWTZAPhnmrxcciEEOdbyrrp github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -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/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= -github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4= +github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -851,7 +871,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= 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 v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -860,52 +879,62 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -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.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/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.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/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.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 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.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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/saferwall/pe v1.4.5 h1:ACIe9QnLTdiRIbuN3BbEUI8SqCQmNrPBb7O2lJTmsK4= -github.com/saferwall/pe v1.4.5/go.mod h1:SNzv3cdgk8SBI0UwHfyTcdjawfdnN+nbydnEL7GZ25s= +github.com/saferwall/pe v1.5.4 h1:tLmMggEMUfeqrpJ25zS/okUQmyFdD5xWKL2+z9njCqg= +github.com/saferwall/pe v1.5.4/go.mod h1:mJx+PuptmNpoPFBNhWs/uDMFL/kTHVZIkg0d4OUJFbQ= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f h1:MvTmaQdww/z0Q4wrYjDSCcZ78NoftLQyHBSLW/Cx79Y= +github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/sassoftware/go-rpmutils v0.2.0 h1:pKW0HDYMFWQ5b4JQPiI3WI12hGsVoW0V8+GMoZiI/JE= -github.com/sassoftware/go-rpmutils v0.2.0/go.mod h1:TJJQYtLe/BeEmEjelI3b7xNZjzAukEkeWKmoakvaOoI= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/sassoftware/go-rpmutils v0.4.0 h1:ojND82NYBxgwrV+mX1CWsd5QJvvEZTKddtCdFLPWhpg= +github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jNYPjT5mVcQcIsYzI= github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e h1:7q6NSFZDeGfvvtIRwBrU/aegEYJYmvev0cHAwo17zZQ= github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e/go.mod h1:DkpGd78rljTxKAnTDPFqXSGxvETQnJyuSOQwsHycqfs= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y= github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d h1:RQqyEogx5J6wPdoxqL132b100j8KjcVHO1c0KLRoIhc= +github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d/go.mod h1:PegD7EVqlN88z7TpCqH92hHP+GBpfomGCCnw1PFtNOA= +github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA= +github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= @@ -914,8 +943,8 @@ github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sigstore/sigstore v1.7.3 h1:HVVTfrMezJeLyl2xhJ8edzkrEGBa4KxjQZB4FlQ4JLU= -github.com/sigstore/sigstore v1.7.3/go.mod h1:cl0c7Dtg3MM3c13L8pqqrfrmBa0eM3POcdtBepjylmw= +github.com/sigstore/sigstore v1.8.4 h1:g4ICNpiENFnWxjmBzBDWUn62rNFeny/P77HUC8da32w= +github.com/sigstore/sigstore v1.8.4/go.mod h1:1jIKtkTFEeISen7en+ZPWdDHazqhxco/+v9CNjc7oNg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -925,28 +954,29 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spdx/gordf v0.0.0-20201111095634-7098f93598fb/go.mod h1:uKWaldnbMnjsSAXRurWqqrdyZen1R7kxl8TkmWk2OyM= -github.com/spdx/tools-golang v0.5.3 h1:ialnHeEYUC4+hkm5vJm4qz2x+oEJbS0mAMFrNXdQraY= -github.com/spdx/tools-golang v0.5.3/go.mod h1:/ETOahiAo96Ob0/RAIBmFZw6XN0yTnyr/uFZm2NTMhI= +github.com/spdx/tools-golang v0.5.5 h1:61c0KLfAcNqAjlg6UNMdkwpMernhw3zVRwDZ2x9XOmk= +github.com/spdx/tools-golang v0.5.5/go.mod h1:MVIsXx8ZZzaRWNQpUDhC4Dud34edUYJYecciXgrw5vE= 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.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -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/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -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.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 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.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -962,26 +992,23 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -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/sylabs/sif/v2 v2.11.5 h1:7ssPH3epSonsTrzbS1YxeJ9KuqAN7ISlSM61a7j/mQM= -github.com/sylabs/sif/v2 v2.11.5/go.mod h1:GBoZs9LU3e4yJH1dcZ3Akf/jsqYgy5SeguJQC+zd75Y= -github.com/sylabs/squashfs v0.6.1 h1:4hgvHnD9JGlYWwT0bPYNt9zaz23mAV3Js+VEgQoRGYQ= -github.com/sylabs/squashfs v0.6.1/go.mod h1:ZwpbPCj0ocIvMy2br6KZmix6Gzh6fsGQcCnydMF+Kx8= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/sylabs/sif/v2 v2.17.1 h1:p6Sl0LWyShXBj2SBsS1dMOMIMrZHe8pwBnBrYt6uo4M= +github.com/sylabs/sif/v2 v2.17.1/go.mod h1:XUGB6AQUXGkms3qPOPdevctT3lBLRLWZNWHVnt5HMKE= +github.com/sylabs/squashfs v1.0.0 h1:xAyMS21ogglkuR5HaY55PCfqY3H32ma9GkasTYo28Zg= +github.com/sylabs/squashfs v1.0.0/go.mod h1:rhWzvgefq1X+R+LZdts10hfMsTg3g74OfGunW8tvg/4= github.com/terminalstatic/go-xsd-validate v0.1.5 h1:RqpJnf6HGE2CB/lZB1A8BYguk8uRtcvYAPLCF15qguo= github.com/terminalstatic/go-xsd-validate v0.1.5/go.mod h1:18lsvYFofBflqCrvo1umpABZ99+GneNTw2kEEc8UPJw= github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= -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/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg= -github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= @@ -994,28 +1021,25 @@ github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHT github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/vbatts/go-mtree v0.5.3 h1:S/jYlfG8rZ+a0bhZd+RANXejy7M4Js8fq9U+XoWTd5w= -github.com/vbatts/go-mtree v0.5.3/go.mod h1:eXsdoPMdL2jcJx6HweWi9lYQxBsTp4lNhqqAjgkZUg8= +github.com/vbatts/go-mtree v0.5.4 h1:OMAb8jaCyiFA7zXj0Zc/oARcxBDBoeu2LizjB8BVJl0= +github.com/vbatts/go-mtree v0.5.4/go.mod h1:5GqJbVhm9BBiCc4K5uc/c42FPgXulHaQs4sFUEfIWMo= 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/veraison/go-cose v1.1.0 h1:AalPS4VGiKavpAzIlBjrn7bhqXiXi4jbMYY/2+UC+4o= github.com/veraison/go-cose v1.1.0/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= github.com/vifraa/gopom v1.0.0 h1:L9XlKbyvid8PAIK8nr0lihMApJQg/12OBvMA28BcWh0= github.com/vifraa/gopom v1.0.0/go.mod h1:oPa1dcrGrtlO37WPDBm5SqHAT+wTgF8An1Q71Z6Vv4o= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 h1:jIVmlAFIqV3d+DOxazTR9v+zgj8+VYuQBzPgBZvWBHA= github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651/go.mod h1:b26F2tHLqaoRQf8DywqzVaV1MQ9yvjb0OMcNl7Nxu20= github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b h1:uWNQ0khA6RdFzODOMwKo9XXu7fuewnnkHykUtuKru8s= github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b/go.mod h1:ewlIKbKV8l+jCj8rkdXIs361ocR5x3qGyoCSca47Gx8= -github.com/wagoodman/go-progress v0.0.0-20230911172108-cf810b7e365c h1:mM8T8YhiD19d2wYv3vqZn8xpe1ZFJrUJCGlK4IV05xM= -github.com/wagoodman/go-progress v0.0.0-20230911172108-cf810b7e365c/go.mod h1:jLXFoL31zFaHKAAyZUh+sxiTDFe1L1ZHrcK2T1itVKA= +github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 h1:0KGbf+0SMg+UFy4e1A/CPVvXn21f1qtWdeJwxZFoQG8= +github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0/go.mod h1:jLXFoL31zFaHKAAyZUh+sxiTDFe1L1ZHrcK2T1itVKA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -1028,8 +1052,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1039,8 +1063,6 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak= -go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= 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= @@ -1050,16 +1072,33 @@ 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/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= -go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= -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/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +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/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 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= @@ -1070,18 +1109,14 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/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-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -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.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= 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= @@ -1092,8 +1127,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-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= +golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w= +golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= 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= @@ -1122,8 +1157,8 @@ 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.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1158,7 +1193,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY 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-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= @@ -1182,8 +1216,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= 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.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1210,8 +1244,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -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/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -1227,8 +1261,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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= @@ -1274,7 +1308,6 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1282,7 +1315,6 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-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-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1290,6 +1322,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc 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-20210809222454-d867a43fc93e/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-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1316,23 +1349,21 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc 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-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.2.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.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= 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.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= 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= @@ -1342,17 +1373,16 @@ 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.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/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= 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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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= @@ -1369,7 +1399,6 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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-20191012152004-8de300cfc20a/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-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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1402,7 +1431,6 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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= @@ -1411,8 +1439,8 @@ 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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 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= @@ -1420,8 +1448,9 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T 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-20220609144429-65e65417b02f/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= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 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= @@ -1472,15 +1501,14 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 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.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-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1517,9 +1545,7 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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= @@ -1589,12 +1615,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 h1:0+ozOGcrp+Y8Aq8TLNN2Aliibms5LEzsq99ZZmAGYm0= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1631,8 +1657,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -1649,11 +1675,9 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ 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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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/alexcesaro/statsd.v2 v2.0.0/go.mod h1:i0ubccKGzBVNBpdGV5MocxyA/XlLUJzA7SLonnE4drU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1661,11 +1685,11 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs= +gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/ini.v1 v1.66.2/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/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/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1692,17 +1716,35 @@ 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= -modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= -modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o= -modernc.org/memory v1.6.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/sqlite v1.25.0 h1:AFweiwPNd/b3BoKnBOfFm+Y260guGMF+0UFk0savqeA= -modernc.org/sqlite v1.25.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y= +modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= +modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U= +modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.31.1 h1:XVU0VyzxrYHlBhIs1DiEgSl0ZtdnPtbLVy8hSkzxGrs= +modernc.org/sqlite v1.31.1/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= oras.land/oras-go/v2 v2.3.0 h1:lqX1aXdN+DAmDTKjiDyvq85cIaI4RkIKp/PghWlAGIU= oras.land/oras-go/v2 v2.3.0/go.mod h1:GeAwLuC4G/JpNwkd+bSZ6SkDMGaaYglt6YK2WvZP7uQ= 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/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/internal/xeolio/source.go b/internal/xeolio/source.go index 23664744..733cc634 100644 --- a/internal/xeolio/source.go +++ b/internal/xeolio/source.go @@ -22,7 +22,7 @@ func (s *DirectorySource) Serialize() map[string]interface{} { } } -func NewDirectorySource(dirSource source.DirectorySourceMetadata) *DirectorySource { +func NewDirectorySource(dirSource source.DirectoryMetadata) *DirectorySource { return &DirectorySource{ Type: "DirectoryScheme", Target: dirSource.Path, @@ -36,7 +36,7 @@ type ImageSource struct { ImageLabels map[string]string } -func NewImageSource(imageSource source.StereoscopeImageSourceMetadata) *ImageSource { +func NewImageSource(imageSource source.ImageMetadata) *ImageSource { return &ImageSource{ Type: "ImageScheme", ImageName: imageSource.UserInput, @@ -56,9 +56,9 @@ func (s *ImageSource) Serialize() map[string]interface{} { func NewEventSource(sbomSource source.Description) (map[string]interface{}, error) { switch v := sbomSource.Metadata.(type) { - case source.DirectorySourceMetadata: + case source.DirectoryMetadata: return NewDirectorySource(v).Serialize(), nil - case source.StereoscopeImageSourceMetadata: + case source.ImageMetadata: return NewImageSource(v).Serialize(), nil default: return nil, fmt.Errorf("unsupported source type: %s", v) diff --git a/test/integration/match_by_image_test.go b/test/integration/match_by_image_test.go index eeadb4bf..3e18d5b6 100644 --- a/test/integration/match_by_image_test.go +++ b/test/integration/match_by_image_test.go @@ -1,13 +1,14 @@ package integration import ( + "context" "testing" "time" "github.com/anchore/stereoscope/pkg/imagetest" "github.com/anchore/syft/syft" + "github.com/anchore/syft/syft/cataloging/pkgcataloging" syftPkg "github.com/anchore/syft/syft/pkg" - "github.com/anchore/syft/syft/pkg/cataloger" "github.com/anchore/syft/syft/source" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -344,27 +345,21 @@ func TestMatchByImage(t *testing.T) { imagetest.GetFixtureImage(t, "docker-archive", test.fixtureImage) tarPath := imagetest.GetFixtureImageTarPath(t, test.fixtureImage) - userImage := "docker-archive:" + tarPath - - detection, err := source.Detect(userImage, source.DetectConfig{}) - require.NoError(t, err) - // this is purely done to help setup mocks - theSource, err := detection.NewSource(source.DetectionSourceConfig{}) + theSource, err := syft.GetSource(context.Background(), tarPath, syft.DefaultGetSourceConfig().WithSources("docker-archive")) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, theSource.Close()) }) // TODO: relationships are not verified at this time - config := cataloger.DefaultConfig() - config.Search.Scope = source.SquashedScope - // enable all catalogers to cover non default cases - config.Catalogers = []string{"all"} + config := syft.DefaultCreateSBOMConfig().WithCatalogerSelection(pkgcataloging.NewSelectionRequest().WithDefaults("all")) + config.Search.Scope = source.SquashedScope - collection, _, theDistro, err := syft.CatalogPackages(theSource, config) + s, err := syft.CreateSBOM(context.Background(), theSource, config) require.NoError(t, err) + require.NotNil(t, s) matchers := matcher.NewDefaultMatchers(matcher.Config{}) @@ -374,7 +369,7 @@ func TestMatchByImage(t *testing.T) { Provider: ep, } - actualResults, err := xeol.FindEol(str, theDistro, matchers, pkg.FromCollection(collection, pkg.SynthesisConfig{}), false, time.Now()) + actualResults, err := xeol.FindEol(str, s.Artifacts.LinuxDistribution, matchers, pkg.FromCollection(s.Artifacts.Packages, pkg.SynthesisConfig{}), false, time.Now()) require.NoError(t, err) // build expected matches from what's discovered from the catalog diff --git a/xeol/distro/distro.go b/xeol/distro/distro.go index de635263..9f28e8c2 100644 --- a/xeol/distro/distro.go +++ b/xeol/distro/distro.go @@ -4,8 +4,9 @@ import ( "fmt" "strings" - "github.com/anchore/syft/syft/linux" hashiVer "github.com/hashicorp/go-version" + + "github.com/anchore/syft/syft/linux" ) // Distro represents a Linux Distribution. @@ -61,6 +62,14 @@ func NewFromRelease(release linux.Release) (*Distro, error) { } } + if t == Debian && release.VersionID == "" && release.Version == "" && strings.Contains(release.PrettyName, "sid") { + return &Distro{ + Type: t, + RawVersion: "unstable", + IDLike: release.IDLike, + }, nil + } + return New(t, release.CPEName, selectedVersion, release.IDLike...) } @@ -91,5 +100,15 @@ func (d Distro) String() string { } func (d Distro) IsRolling() bool { - return d.Type == Wolfi || d.Type == ArchLinux || d.Type == Gentoo + return d.Type == Wolfi || d.Type == Chainguard || d.Type == ArchLinux || d.Type == Gentoo +} + +// Unsupported Linux distributions +func (d Distro) Disabled() bool { + switch { + case d.Type == ArchLinux: + return true + default: + return false + } } diff --git a/xeol/distro/distro_test.go b/xeol/distro/distro_test.go index 92f1ff5a..6acf962c 100644 --- a/xeol/distro/distro_test.go +++ b/xeol/distro/distro_test.go @@ -3,12 +3,13 @@ package distro import ( "testing" - "github.com/anchore/syft/syft/linux" - "github.com/anchore/syft/syft/source" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/xeol-io/xeol/internal" + "github.com/anchore/syft/syft/linux" + "github.com/anchore/syft/syft/source" + "github.com/anchore/syft/syft/source/directorysource" + "github.com/xeol-io/xeol/internal/stringutil" ) func Test_NewDistroFromRelease(t *testing.T) { @@ -17,7 +18,6 @@ func Test_NewDistroFromRelease(t *testing.T) { release linux.Release expectedVersion string expectedRawVersion string - expectedCpe string expectedType Type expectErr bool }{ @@ -67,6 +67,21 @@ func Test_NewDistroFromRelease(t *testing.T) { }, expectErr: true, }, + { + // syft -o json debian:testing | jq .distro + name: "unstable debian", + release: linux.Release{ + ID: "debian", + VersionID: "", + Version: "", + PrettyName: "Debian GNU/Linux trixie/sid", + VersionCodename: "trixie", + Name: "Debian GNU/Linux", + }, + expectedType: Debian, + expectedRawVersion: "unstable", + expectedVersion: "", + }, } for _, test := range tests { @@ -209,10 +224,14 @@ func Test_NewDistroFromRelease_Coverage(t *testing.T) { fixture: "test-fixtures/os/wolfi", Type: Wolfi, }, + { + fixture: "test-fixtures/os/chainguard", + Type: Chainguard, + }, } - observedDistros := internal.NewStringSet() - definedDistros := internal.NewStringSet() + observedDistros := stringutil.NewStringSet() + definedDistros := stringutil.NewStringSet() for _, distroType := range All { definedDistros.Add(string(distroType)) @@ -224,7 +243,7 @@ func Test_NewDistroFromRelease_Coverage(t *testing.T) { for _, test := range tests { t.Run(test.fixture, func(t *testing.T) { - s, err := source.NewFromDirectory(source.DirectoryConfig{Path: test.fixture}) + s, err := directorysource.NewFromPath(test.fixture) require.NoError(t, err) resolver, err := s.FileResolver(source.SquashedScope) @@ -244,7 +263,6 @@ func Test_NewDistroFromRelease_Coverage(t *testing.T) { if test.Version != "" { assert.Equal(t, d.Version.String(), test.Version) } - }) } @@ -334,149 +352,3 @@ func TestDistro_MajorVersion(t *testing.T) { } } - -func TestDistro_CpeName(t *testing.T) { - tests := []struct { - fixture string - expectedCpe string - }{ - { - fixture: "test-fixtures/os/ubuntu", - expectedCpe: "cpe:2.3:o:canonical:ubuntu_linux:20.04", - }, - { - fixture: "test-fixtures/os/redhat", - expectedCpe: "cpe:/o:redhat:enterprise_linux:7.3:GA:server", - }, - { - fixture: "test-fixtures/os/debian", - expectedCpe: "cpe:2.3:o:debian:debian_linux:8", - }, - { - fixture: "test-fixtures/os/fedora", - expectedCpe: "cpe:/o:fedoraproject:fedora:31", - }, - { - fixture: "test-fixtures/os/photon", - expectedCpe: "cpe:2.3:o:vmware:photon_os:2.0", - }, - { - fixture: "test-fixtures/os/almalinux", - expectedCpe: "cpe:/o:almalinux:almalinux:8.4:GA", - }, - { - fixture: "test-fixtures/os/alpine", - expectedCpe: "cpe:2.3:o:alpinelinux:alpine_linux:3.11.6", - }, - { - fixture: "test-fixtures/os/amazon", - expectedCpe: "cpe:2.3:o:amazon:amazon_linux:2", - }, - { - fixture: "test-fixtures/os/arch", - expectedCpe: "", - }, - { - fixture: "test-fixtures/os/busybox", - expectedCpe: "cpe:2.3:o:busybox:busybox:1.31.1", - }, - { - fixture: "test-fixtures/os/centos", - expectedCpe: "cpe:/o:centos:centos:8", - }, - { - fixture: "test-fixtures/os/gentoo", - expectedCpe: "", - }, - { - fixture: "test-fixtures/os/oraclelinux", - expectedCpe: "cpe:/o:oracle:linux:8:3:server", - }, - { - fixture: "test-fixtures/os/opensuse-leap", - expectedCpe: "cpe:/o:opensuse:leap:15.2", - }, - { - fixture: "test-fixtures/os/sles", - expectedCpe: "cpe:/o:suse:sles:15:sp2", - }, - { - fixture: "test-fixtures/os/mariner", - expectedCpe: "cpe:2.3:o:microsoft:mariner:1.0", - }, - } - - for _, test := range tests { - t.Run(test.fixture, func(t *testing.T) { - s, err := source.NewFromDirectory(source.DirectoryConfig{Path: test.fixture}) - require.NoError(t, err) - - resolver, err := s.FileResolver(source.SquashedScope) - require.NoError(t, err) - - // make certain syft and pick up on the raw information we need - release := linux.IdentifyRelease(resolver) - require.NotNil(t, release, "empty linux release info") - - // craft a new distro from the syft raw info - d, err := NewFromRelease(*release) - require.NoError(t, err) - - assert.Equal(t, d.CPEName.String(), test.expectedCpe) - }) - } - -} - -func TestDistro_CpeNameDestructured(t *testing.T) { - testCases := []struct { - name string - input string - expectedShortCpe string - expectedVersion string - }{ - { - name: "Exact CPE 2.2", - input: "cpe:/a:apache:struts:2.5.10", - expectedShortCpe: "cpe:/a:apache:struts", - expectedVersion: "2.5.10", - }, - { - name: "Exact CPE 2.3", - input: "cpe:2.3:a:apache:struts:2.5.10", - expectedShortCpe: "cpe:2.3:a:apache:struts", - expectedVersion: "2.5.10", - }, - { - name: "CPE 2.2", - input: "cpe:/a:apache:struts:2.5:*:*:*:*:*:*:*", - expectedShortCpe: "cpe:/a:apache:struts", - expectedVersion: "2.5", - }, - { - name: "CPE 2.3", - input: "cpe:2.3:a:apache:struts:2.5:*:*:*:*:*:*:*", - expectedShortCpe: "cpe:2.3:a:apache:struts", - expectedVersion: "2.5", - }, - { - name: "Empty CPE", - input: "", - expectedShortCpe: "", - expectedVersion: "", - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - gotCpe, gotVersion := CPEName(tc.input).Destructured() - - if gotVersion != tc.expectedVersion { - t.Errorf("Expected version '%v', got '%v'", tc.expectedVersion, gotVersion) - } - if gotCpe != tc.expectedShortCpe { - t.Errorf("Expected short CPE '%v', got '%v'", tc.expectedShortCpe, gotCpe) - } - }) - } -} diff --git a/xeol/distro/type.go b/xeol/distro/type.go index fdd2771f..44e1c13a 100644 --- a/xeol/distro/type.go +++ b/xeol/distro/type.go @@ -29,6 +29,7 @@ const ( AlmaLinux Type = "almalinux" Gentoo Type = "gentoo" Wolfi Type = "wolfi" + Chainguard Type = "chainguard" ) // All contains all Linux distribution options @@ -52,6 +53,7 @@ var All = []Type{ AlmaLinux, Gentoo, Wolfi, + Chainguard, } // IDMapping connects a distro ID like "ubuntu" to a Distro type @@ -75,6 +77,7 @@ var IDMapping = map[string]Type{ "almalinux": AlmaLinux, "gentoo": Gentoo, "wolfi": Wolfi, + "chainguard": Chainguard, } // CpeOsVendorMapping connects a distro type to a CPE OS vendor string diff --git a/xeol/pkg/apk_metadata.go b/xeol/pkg/apk_metadata.go new file mode 100644 index 00000000..5a0ac001 --- /dev/null +++ b/xeol/pkg/apk_metadata.go @@ -0,0 +1,10 @@ +package pkg + +type ApkMetadata struct { + Files []ApkFileRecord `json:"files"` +} + +// ApkFileRecord represents a single file listing and metadata from a APK DB entry (which may have many of these file records). +type ApkFileRecord struct { + Path string `json:"path"` +} diff --git a/xeol/pkg/golang_bin_metadata.go b/xeol/pkg/golang_bin_metadata.go deleted file mode 100644 index 41f3e794..00000000 --- a/xeol/pkg/golang_bin_metadata.go +++ /dev/null @@ -1,9 +0,0 @@ -package pkg - -type GolangMetadata struct { - BuildSettings map[string]string `json:"goBuildSettings,omitempty"` - GoCompiledVersion string `json:"goCompiledVersion"` - Architecture string `json:"architecture"` - H1Digest string `json:"h1Digest,omitempty"` - MainModule string `json:"mainModule,omitempty"` -} diff --git a/xeol/pkg/golang_metadata.go b/xeol/pkg/golang_metadata.go index 0a126afc..706c9983 100644 --- a/xeol/pkg/golang_metadata.go +++ b/xeol/pkg/golang_metadata.go @@ -1,11 +1,14 @@ package pkg +import "github.com/anchore/syft/syft/pkg" + type GolangBinMetadata struct { - BuildSettings map[string]string `json:"goBuildSettings,omitempty"` - GoCompiledVersion string `json:"goCompiledVersion"` - Architecture string `json:"architecture"` - H1Digest string `json:"h1Digest,omitempty"` - MainModule string `json:"mainModule,omitempty"` + BuildSettings pkg.KeyValues `json:"goBuildSettings,omitempty" cyclonedx:"goBuildSettings"` + GoCompiledVersion string `json:"goCompiledVersion" cyclonedx:"goCompiledVersion"` + Architecture string `json:"architecture" cyclonedx:"architecture"` + H1Digest string `json:"h1Digest,omitempty" cyclonedx:"h1Digest"` + MainModule string `json:"mainModule,omitempty" cyclonedx:"mainModule"` + GoCryptoSettings []string `json:"goCryptoSettings,omitempty" cyclonedx:"goCryptoSettings"` } type GolangModMetadata struct { diff --git a/xeol/pkg/package.go b/xeol/pkg/package.go index 7542c5bb..2bf0f41d 100644 --- a/xeol/pkg/package.go +++ b/xeol/pkg/package.go @@ -8,6 +8,7 @@ import ( "github.com/anchore/syft/syft/artifact" "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/file" + "github.com/anchore/syft/syft/linux" "github.com/anchore/syft/syft/pkg" cpes "github.com/anchore/syft/syft/pkg/cataloger/common/cpe" @@ -44,7 +45,7 @@ type Package struct { } func New(p pkg.Package) Package { - metadataType, metadata, upstreams := dataFromPkg(p) + metadata, upstreams := dataFromPkg(p) licenseObjs := p.Licenses.ToSlice() // note: this is used for presentation downstream and is a collection, thus should always be allocated @@ -57,18 +58,17 @@ func New(p pkg.Package) Package { } return Package{ - ID: ID(p.ID()), - Name: p.Name, - Version: p.Version, - Locations: p.Locations, - Licenses: licenses, - Language: p.Language, - Type: p.Type, - CPEs: p.CPEs, - PURL: p.PURL, - Upstreams: upstreams, - MetadataType: metadataType, - Metadata: metadata, + ID: ID(p.ID()), + Name: p.Name, + Version: p.Version, + Locations: p.Locations, + Licenses: licenses, + Language: p.Language, + Type: p.Type, + CPEs: p.CPEs, + PURL: p.PURL, + Upstreams: upstreams, + Metadata: metadata, } } @@ -97,7 +97,7 @@ func (p Package) String() string { return fmt.Sprintf("Pkg(type=%s, name=%s, version=%s, upstreams=%d)", p.Type, p.Name, p.Version, len(p.Upstreams)) } -func removePackagesByOverlap(catalog *pkg.Collection, relationships []artifact.Relationship) *pkg.Collection { +func removePackagesByOverlap(catalog *pkg.Collection, relationships []artifact.Relationship, distro *linux.Release) *pkg.Collection { byOverlap := map[artifact.ID]artifact.Relationship{} for _, r := range relationships { if r.Type == artifact.OwnershipByFileOverlapRelationship { @@ -106,11 +106,12 @@ func removePackagesByOverlap(catalog *pkg.Collection, relationships []artifact.R } out := pkg.NewCollection() + comprehensiveDistroFeed := distroFeedIsComprehensive(distro) for p := range catalog.Enumerate() { r, ok := byOverlap[p.ID()] if ok { - from, ok := r.From.(pkg.Package) - if ok && excludePackage(p, from) { + from := catalog.Package(r.From.ID()) + if from != nil && excludePackage(comprehensiveDistroFeed, p, *from) { continue } } @@ -120,46 +121,125 @@ func removePackagesByOverlap(catalog *pkg.Collection, relationships []artifact.R return out } -func excludePackage(p pkg.Package, parent pkg.Package) bool { +// distroFeedIsComprehensive returns true if the distro feed +// is comprehensive enough that we can drop packages owned by distro packages +// before matching. +func distroFeedIsComprehensive(distro *linux.Release) bool { + // TODO: this mechanism should be re-examined once https://github.com/anchore/grype/issues/1426 + // is addressed + if distro == nil { + return false + } + if distro.ID == "amzn" { + // AmazonLinux shows "like rhel" but is not an rhel clone + // and does not have an exhaustive vulnerability feed. + return false + } + for _, d := range comprehensiveDistros { + if strings.EqualFold(d, distro.ID) { + return true + } + for _, n := range distro.IDLike { + if strings.EqualFold(d, n) { + return true + } + } + } + return false +} + +// computed by: +// sqlite3 vulnerability.db 'select distinct namespace from vulnerability where fix_state in ("wont-fix", "not-fixed") order by namespace;' | cut -d ':' -f 1 | sort | uniq +// then removing 'github' and replacing 'redhat' with 'rhel' +var comprehensiveDistros = []string{ + "debian", + "mariner", + "rhel", + "ubuntu", +} + +func excludePackage(comprehensiveDistroFeed bool, p pkg.Package, parent pkg.Package) bool { // NOTE: we are not checking the name because we have mismatches like: // python 3.9.2 binary // python3.9 3.9.2-1 deb // If the version is not effectively the same, keep both - return !strings.HasPrefix(parent.Version, p.Version) + if !strings.HasPrefix(parent.Version, p.Version) { + return false + } + + // If the parent is an OS package and the child is not, exclude the child + // for distros that have a comprehensive feed. That is, distros that list + // vulnerabilities that aren't fixed. Otherwise, the child package might + // be needed for matching. + if comprehensiveDistroFeed && isOSPackage(parent) && !isOSPackage(p) { + return true + } + + // filter out binary packages, even for non-comprehensive distros + if p.Type != pkg.BinaryPkg { + return false + } + + return true +} + +func isOSPackage(p pkg.Package) bool { + switch p.Type { + case pkg.DebPkg, pkg.RpmPkg, pkg.PortagePkg, pkg.AlpmPkg, pkg.ApkPkg: + return true + default: + return false + } } -func dataFromPkg(p pkg.Package) (MetadataType, interface{}, []UpstreamPackage) { +func dataFromPkg(p pkg.Package) (interface{}, []UpstreamPackage) { var metadata interface{} var upstreams []UpstreamPackage - var metadataType MetadataType - switch p.MetadataType { - case pkg.GolangBinMetadataType, pkg.GolangModMetadataType: - metadataType, metadata = golangMetadataFromPkg(p) - case pkg.DpkgMetadataType: + switch p.Metadata.(type) { + case pkg.GolangModuleEntry, pkg.GolangBinaryBuildinfoEntry: + metadata = golangMetadataFromPkg(p) + case pkg.DpkgDBEntry: upstreams = dpkgDataFromPkg(p) - case pkg.RpmMetadataType: + case pkg.RpmArchive, pkg.RpmDBEntry: m, u := rpmDataFromPkg(p) upstreams = u if m != nil { metadata = *m - metadataType = RpmMetadataType } - case pkg.JavaMetadataType: + case pkg.JavaArchive: if m := javaDataFromPkg(p); m != nil { metadata = *m - metadataType = JavaMetadataType } - case pkg.ApkMetadataType: + case pkg.ApkDBEntry: + metadata = apkMetadataFromPkg(p) upstreams = apkDataFromPkg(p) } - return metadataType, metadata, upstreams + return metadata, upstreams } -func golangMetadataFromPkg(p pkg.Package) (MetadataType, interface{}) { +func apkMetadataFromPkg(p pkg.Package) interface{} { + if m, ok := p.Metadata.(pkg.ApkDBEntry); ok { + metadata := ApkMetadata{} + + fileRecords := make([]ApkFileRecord, 0, len(m.Files)) + for _, record := range m.Files { + r := ApkFileRecord{Path: record.Path} + fileRecords = append(fileRecords, r) + } + + metadata.Files = fileRecords + + return metadata + } + + return nil +} + +func golangMetadataFromPkg(p pkg.Package) interface{} { switch value := p.Metadata.(type) { - case pkg.GolangBinMetadata: + case pkg.GolangBinaryBuildinfoEntry: metadata := GolangBinMetadata{} if value.BuildSettings != nil { metadata.BuildSettings = value.BuildSettings @@ -168,17 +248,17 @@ func golangMetadataFromPkg(p pkg.Package) (MetadataType, interface{}) { metadata.Architecture = value.Architecture metadata.H1Digest = value.H1Digest metadata.MainModule = value.MainModule - return GolangBinMetadataType, metadata - case pkg.GolangModMetadata: + return metadata + case pkg.GolangModuleEntry: metadata := GolangModMetadata{} metadata.H1Digest = value.H1Digest - return GolangModMetadataType, metadata + return metadata } - return "", nil + return nil } func dpkgDataFromPkg(p pkg.Package) (upstreams []UpstreamPackage) { - if value, ok := p.Metadata.(pkg.DpkgMetadata); ok { + if value, ok := p.Metadata.(pkg.DpkgDBEntry); ok { if value.Source != "" { upstreams = append(upstreams, UpstreamPackage{ Name: value.Source, @@ -192,30 +272,48 @@ func dpkgDataFromPkg(p pkg.Package) (upstreams []UpstreamPackage) { } func rpmDataFromPkg(p pkg.Package) (metadata *RpmMetadata, upstreams []UpstreamPackage) { - if value, ok := p.Metadata.(pkg.RpmMetadata); ok { - if value.SourceRpm != "" { - name, version := getNameAndELVersion(value.SourceRpm) - if name == "" && version == "" { - log.Warnf("unable to extract name and version from SourceRPM=%q ", value.SourceRpm) - } else if name != p.Name { - // don't include matches if the source package name matches the current package name - upstreams = append(upstreams, UpstreamPackage{ - Name: name, - Version: version, - }) - } + switch m := p.Metadata.(type) { + case pkg.RpmDBEntry: + if m.SourceRpm != "" { + upstreams = handleSourceRPM(p.Name, m.SourceRpm) } metadata = &RpmMetadata{ - Epoch: value.Epoch, - ModularityLabel: value.ModularityLabel, + Epoch: m.Epoch, + ModularityLabel: m.ModularityLabel, + } + case pkg.RpmArchive: + if m.SourceRpm != "" { + upstreams = handleSourceRPM(p.Name, m.SourceRpm) + } + + metadata = &RpmMetadata{ + Epoch: m.Epoch, + ModularityLabel: m.ModularityLabel, } - } else { - log.Warnf("unable to extract RPM metadata for %s", p) } return metadata, upstreams } +func handleSourceRPM(pkgName, sourceRpm string) []UpstreamPackage { + var upstreams []UpstreamPackage + name, version := getNameAndELVersion(sourceRpm) + if name == "" && version == "" { + log.Warnf("unable to extract name and version from SourceRPM=%q ", sourceRpm) + } else if name != pkgName { + // don't include matches if the source package name matches the current package name + if name != "" && version != "" { + upstreams = append(upstreams, + UpstreamPackage{ + Name: name, + Version: version, + }, + ) + } + } + return upstreams +} + func getNameAndELVersion(sourceRpm string) (string, string) { groupMatches := stringutil.MatchCaptureGroups(rpmPackageNamePattern, sourceRpm) version := groupMatches["version"] + "-" + groupMatches["release"] @@ -223,15 +321,17 @@ func getNameAndELVersion(sourceRpm string) (string, string) { } func javaDataFromPkg(p pkg.Package) (metadata *JavaMetadata) { - if value, ok := p.Metadata.(pkg.JavaMetadata); ok { - var artifact, group, name string + if value, ok := p.Metadata.(pkg.JavaArchive); ok { + var artifactID, groupID, name string if value.PomProperties != nil { - artifact = value.PomProperties.ArtifactID - group = value.PomProperties.GroupID + artifactID = value.PomProperties.ArtifactID + groupID = value.PomProperties.GroupID } if value.Manifest != nil { - if n, ok := value.Manifest.Main["Name"]; ok { - name = n + for _, kv := range value.Manifest.Main { + if kv.Key == "Name" { + name = kv.Value + } } } @@ -247,8 +347,8 @@ func javaDataFromPkg(p pkg.Package) (metadata *JavaMetadata) { metadata = &JavaMetadata{ VirtualPath: value.VirtualPath, - PomArtifactID: artifact, - PomGroupID: group, + PomArtifactID: artifactID, + PomGroupID: groupID, ManifestName: name, ArchiveDigests: archiveDigests, } @@ -259,7 +359,7 @@ func javaDataFromPkg(p pkg.Package) (metadata *JavaMetadata) { } func apkDataFromPkg(p pkg.Package) (upstreams []UpstreamPackage) { - if value, ok := p.Metadata.(pkg.ApkMetadata); ok { + if value, ok := p.Metadata.(pkg.ApkDBEntry); ok { if value.OriginPackage != "" { upstreams = append(upstreams, UpstreamPackage{ Name: value.OriginPackage, diff --git a/xeol/pkg/package_test.go b/xeol/pkg/package_test.go index a5b9f583..3a310de6 100644 --- a/xeol/pkg/package_test.go +++ b/xeol/pkg/package_test.go @@ -1,15 +1,20 @@ package pkg import ( + "fmt" + "strings" "testing" + "github.com/stretchr/testify/assert" + + "github.com/anchore/syft/syft/artifact" "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/file" syftFile "github.com/anchore/syft/syft/file" + "github.com/anchore/syft/syft/linux" syftPkg "github.com/anchore/syft/syft/pkg" - "github.com/scylladb/go-set" - "github.com/scylladb/go-set/strset" - "github.com/stretchr/testify/assert" + "github.com/anchore/syft/syft/sbom" + "github.com/anchore/syft/syft/testutil" ) func TestNew(t *testing.T) { @@ -22,8 +27,7 @@ func TestNew(t *testing.T) { { name: "alpm package with source info", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.AlpmMetadataType, - Metadata: syftPkg.AlpmMetadata{ + Metadata: syftPkg.AlpmDBEntry{ BasePackage: "base-pkg-info", Package: "pkg-info", Version: "version-info", @@ -37,8 +41,7 @@ func TestNew(t *testing.T) { { name: "dpkg with source info", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.DpkgMetadataType, - Metadata: syftPkg.DpkgMetadata{ + Metadata: syftPkg.DpkgDBEntry{ Package: "pkg-info", Source: "src-info", Version: "version-info", @@ -66,10 +69,47 @@ func TestNew(t *testing.T) { }, }, { - name: "rpm with source info", + name: "rpm archive with source info", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.RpmArchive{ + Name: "name-info", + Version: "version-info", + Epoch: intRef(30), + Arch: "arch-info", + Release: "release-info", + SourceRpm: "sqlite-3.26.0-6.el8.src.rpm", + Size: 40, + Vendor: "vendor-info", + Files: []syftPkg.RpmFileRecord{ + { + Path: "path-info", + Mode: 20, + Size: 10, + Digest: file.Digest{ + Algorithm: "algo-info", + Value: "digest-info", + }, + UserName: "user-info", + GroupName: "group-info", + Flags: "flag-info", + }, + }, + }, + }, + metadata: RpmMetadata{ + Epoch: intRef(30), + }, + upstreams: []UpstreamPackage{ + { + Name: "sqlite", + Version: "3.26.0-6.el8", + }, + }, + }, + { + name: "rpm db entry with source info", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.RpmMetadataType, - Metadata: syftPkg.RpmMetadata{ + Metadata: syftPkg.RpmDBEntry{ Name: "name-info", Version: "version-info", Epoch: intRef(30), @@ -78,7 +118,7 @@ func TestNew(t *testing.T) { SourceRpm: "sqlite-3.26.0-6.el8.src.rpm", Size: 40, Vendor: "vendor-info", - Files: []syftPkg.RpmdbFileRecord{ + Files: []syftPkg.RpmFileRecord{ { Path: "path-info", Mode: 20, @@ -105,45 +145,48 @@ func TestNew(t *testing.T) { }, }, { - name: "rpm with source info that matches the package info", + name: "rpm archive with source info that matches the package info", syftPkg: syftPkg.Package{ - Name: "sqlite", - MetadataType: syftPkg.RpmMetadataType, - Metadata: syftPkg.RpmMetadata{ + Name: "sqlite", + Metadata: syftPkg.RpmArchive{ SourceRpm: "sqlite-3.26.0-6.el8.src.rpm", }, }, metadata: RpmMetadata{}, }, { - name: "rpm with modularity label", + name: "rpm archive with modularity label", syftPkg: syftPkg.Package{ - Name: "sqlite", - MetadataType: syftPkg.RpmMetadataType, - Metadata: syftPkg.RpmMetadata{ + Name: "sqlite", + Metadata: syftPkg.RpmArchive{ SourceRpm: "sqlite-3.26.0-6.el8.src.rpm", - ModularityLabel: "abc:2", + ModularityLabel: strRef("abc:2"), }, }, - metadata: RpmMetadata{ModularityLabel: "abc:2"}, + metadata: RpmMetadata{ModularityLabel: strRef("abc:2")}, }, { name: "java pkg", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.JavaMetadataType, - Metadata: syftPkg.JavaMetadata{ + Metadata: syftPkg.JavaArchive{ VirtualPath: "virtual-path-info", Manifest: &syftPkg.JavaManifest{ - Main: map[string]string{ - "Name": "main-section-name-info", + Main: syftPkg.KeyValues{ + { + Key: "Name", + Value: "main-section-name-info", + }, }, - NamedSections: map[string]map[string]string{ - "named-section": { - "named-section-key": "named-section-value", + Sections: []syftPkg.KeyValues{ + { + { + Key: "named-section-key", + Value: "named-section-value", + }, }, }, }, - PomProperties: &syftPkg.PomProperties{ + PomProperties: &syftPkg.JavaPomProperties{ Path: "pom-path-info", Name: "pom-name-info", GroupID: "pom-group-ID-info", @@ -173,8 +216,7 @@ func TestNew(t *testing.T) { { name: "apk with source info", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.ApkMetadataType, - Metadata: syftPkg.ApkMetadata{ + Metadata: syftPkg.ApkDBEntry{ Package: "libcurl-tools", OriginPackage: "libcurl", Maintainer: "somone", @@ -191,13 +233,13 @@ func TestNew(t *testing.T) { Name: "libcurl", }, }, + metadata: ApkMetadata{Files: []ApkFileRecord{}}, }, // the below packages are those that have no metadata or upstream info to parse out { name: "npm-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.NpmPackageJSONMetadataType, - Metadata: syftPkg.NpmPackageJSONMetadata{ + Metadata: syftPkg.NpmPackage{ Author: "a", Homepage: "a", Description: "a", @@ -208,8 +250,7 @@ func TestNew(t *testing.T) { { name: "python-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.PythonPackageMetadataType, - Metadata: syftPkg.PythonPackageMetadata{ + Metadata: syftPkg.PythonPackage{ Name: "a", Version: "a", Author: "a", @@ -222,8 +263,7 @@ func TestNew(t *testing.T) { { name: "gem-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.GemMetadataType, - Metadata: syftPkg.GemMetadata{ + Metadata: syftPkg.RubyGemspec{ Name: "a", Version: "a", Homepage: "a", @@ -233,8 +273,7 @@ func TestNew(t *testing.T) { { name: "kb-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.KbPackageMetadataType, - Metadata: syftPkg.KbPackageMetadata{ + Metadata: syftPkg.MicrosoftKbPatch{ ProductID: "a", Kb: "a", }, @@ -243,8 +282,7 @@ func TestNew(t *testing.T) { { name: "rust-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.RustCargoPackageMetadataType, - Metadata: syftPkg.CargoPackageMetadata{ + Metadata: syftPkg.RustCargoLockEntry{ Name: "a", Version: "a", Source: "a", @@ -255,16 +293,15 @@ func TestNew(t *testing.T) { { name: "golang-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.GolangBinMetadataType, - Metadata: syftPkg.GolangBinMetadata{ - BuildSettings: map[string]string{}, + Metadata: syftPkg.GolangBinaryBuildinfoEntry{ + BuildSettings: syftPkg.KeyValues{}, GoCompiledVersion: "1.0.0", H1Digest: "a", MainModule: "myMainModule", }, }, metadata: GolangBinMetadata{ - BuildSettings: map[string]string{}, + BuildSettings: syftPkg.KeyValues{}, GoCompiledVersion: "1.0.0", H1Digest: "a", MainModule: "myMainModule", @@ -273,8 +310,7 @@ func TestNew(t *testing.T) { { name: "golang-mod-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.GolangModMetadataType, - Metadata: syftPkg.GolangModMetadata{ + Metadata: syftPkg.GolangModuleEntry{ H1Digest: "h1:as234NweNNTNWEtt13nwNENTt", }, }, @@ -283,10 +319,18 @@ func TestNew(t *testing.T) { }, }, { - name: "php-composer-metadata", + name: "php-composer-lock-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.PhpComposerJSONMetadataType, - Metadata: syftPkg.PhpComposerJSONMetadata{ + Metadata: syftPkg.PhpComposerLockEntry{ + Name: "a", + Version: "a", + }, + }, + }, + { + name: "php-composer-installed-metadata", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.PhpComposerInstalledEntry{ Name: "a", Version: "a", }, @@ -295,8 +339,7 @@ func TestNew(t *testing.T) { { name: "dart-pub-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.DartPubMetadataType, - Metadata: syftPkg.DartPubMetadata{ + Metadata: syftPkg.DartPubspecLockEntry{ Name: "a", Version: "a", }, @@ -305,8 +348,7 @@ func TestNew(t *testing.T) { { name: "dotnet-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.DotnetDepsMetadataType, - Metadata: syftPkg.DotnetDepsMetadata{ + Metadata: syftPkg.DotnetDepsEntry{ Name: "a", Version: "a", Path: "a", @@ -318,32 +360,44 @@ func TestNew(t *testing.T) { { name: "cpp conan-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.ConanMetadataType, - Metadata: syftPkg.ConanMetadata{ + Metadata: syftPkg.ConanfileEntry{ Ref: "catch2/2.13.8", }, }, }, { - name: "cpp conan lock metadata", + name: "cpp conan v1 lock metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.ConanLockMetadataType, - Metadata: syftPkg.ConanLockMetadata{ + Metadata: syftPkg.ConanV1LockEntry{ Ref: "zlib/1.2.12", - Options: map[string]string{ - "fPIC": "True", - "shared": "False", + Options: syftPkg.KeyValues{ + { + Key: "fPIC", + Value: "True", + }, + { + Key: "shared", + Value: "false", + }, }, Path: "all/conanfile.py", Context: "host", }, }, }, + { + name: "cpp conan v2 lock metadata", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.ConanV2LockEntry{ + Ref: "zlib/1.2.12", + PackageID: "some-id", + }, + }, + }, { name: "cocoapods cocoapods-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.CocoapodsMetadataType, - Metadata: syftPkg.CocoapodsMetadata{ + Metadata: syftPkg.CocoaPodfileLockEntry{ Checksum: "123eere234", }, }, @@ -351,28 +405,32 @@ func TestNew(t *testing.T) { { name: "portage-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.PortageMetadataType, - Metadata: syftPkg.PortageMetadata{ + Metadata: syftPkg.PortageEntry{ InstalledSize: 1, Files: []syftPkg.PortageFileRecord{}, }, }, }, { - name: "hackage-metadata", + name: "hackage-stack-lock-metadata", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.HackageStackYamlLockEntry{ + PkgHash: "some-hash", + }, + }, + }, + { + name: "hackage-stack-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.HackageMetadataType, - Metadata: syftPkg.HackageMetadata{ - Name: "hackage", - Version: "v0.0.1", + Metadata: syftPkg.HackageStackYamlEntry{ + PkgHash: "some-hash", }, }, }, { name: "rebar-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.RebarLockMetadataType, - Metadata: syftPkg.RebarLockMetadata{ + Metadata: syftPkg.ErlangRebarLockEntry{ Name: "rebar", Version: "v0.1.1", }, @@ -381,8 +439,7 @@ func TestNew(t *testing.T) { { name: "npm-package-lock-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.NpmPackageLockJSONMetadataType, - Metadata: syftPkg.NpmPackageLockJSONMetadata{ + Metadata: syftPkg.NpmPackageLockEntry{ Resolved: "resolved", Integrity: "sha1:ab7d8979989b7a98d97", }, @@ -391,8 +448,7 @@ func TestNew(t *testing.T) { { name: "mix-lock-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.MixLockMetadataType, - Metadata: syftPkg.MixLockMetadata{ + Metadata: syftPkg.ElixirMixLockEntry{ Name: "mix-lock", Version: "v0.1.2", }, @@ -401,8 +457,7 @@ func TestNew(t *testing.T) { { name: "pipfile-lock-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.PythonPipfileLockMetadataType, - Metadata: syftPkg.PythonPipfileLockMetadata{ + Metadata: syftPkg.PythonPipfileLockEntry{ Hashes: []string{ "sha1:ab8v88a8b88d8d8c88b8s765s47", }, @@ -413,8 +468,7 @@ func TestNew(t *testing.T) { { name: "python-requirements-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.PythonRequirementsMetadataType, - Metadata: syftPkg.PythonRequirementsMetadata{ + Metadata: syftPkg.PythonRequirementsEntry{ Name: "a", Extras: []string{"a"}, VersionConstraint: "a", @@ -426,8 +480,7 @@ func TestNew(t *testing.T) { { name: "binary-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.BinaryMetadataType, - Metadata: syftPkg.BinaryMetadata{ + Metadata: syftPkg.BinarySignature{ Matches: []syftPkg.ClassifierMatch{ { Classifier: "node", @@ -439,8 +492,7 @@ func TestNew(t *testing.T) { { name: "nix-store-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.NixStoreMetadataType, - Metadata: syftPkg.NixStoreMetadata{ + Metadata: syftPkg.NixStoreEntry{ OutputHash: "a", Output: "a", Files: []string{ @@ -452,8 +504,7 @@ func TestNew(t *testing.T) { { name: "linux-kernel-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.LinuxKernelMetadataType, - Metadata: syftPkg.LinuxKernelMetadata{ + Metadata: syftPkg.LinuxKernel{ Name: "a", Architecture: "a", Version: "a", @@ -471,8 +522,7 @@ func TestNew(t *testing.T) { { name: "linux-kernel-module-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.LinuxKernelModuleMetadataType, - Metadata: syftPkg.LinuxKernelModuleMetadata{ + Metadata: syftPkg.LinuxKernelModule{ Name: "a", Version: "a", SourceVersion: "a", @@ -494,8 +544,7 @@ func TestNew(t *testing.T) { { name: "r-description-file-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.RDescriptionFileMetadataType, - Metadata: syftPkg.RDescriptionFileMetadata{ + Metadata: syftPkg.RDescription{ Title: "a", Description: "a", Author: "a", @@ -513,8 +562,7 @@ func TestNew(t *testing.T) { { name: "dotnet-portable-executable-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.DotnetPortableExecutableMetadataType, - Metadata: syftPkg.DotnetPortableExecutableMetadata{ + Metadata: syftPkg.DotnetPortableExecutableEntry{ AssemblyVersion: "a", LegalCopyright: "a", Comments: "a", @@ -526,41 +574,107 @@ func TestNew(t *testing.T) { }, }, { - name: "dotnet-portable-executable-metadata", + name: "swift-package-manager-metadata", syftPkg: syftPkg.Package{ - MetadataType: syftPkg.SwiftPackageManagerMetadataType, - Metadata: syftPkg.SwiftPackageManagerMetadata{ + Metadata: syftPkg.SwiftPackageManagerResolvedEntry{ Revision: "a", }, }, }, + { + name: "conaninfo-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.ConaninfoEntry{ + Ref: "a", + PackageID: "a", + }, + }, + }, + { + name: "rust-binary-audit-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.RustBinaryAuditEntry{ + Name: "a", + Version: "a", + Source: "a", + }, + }, + }, + { + name: "python-poetry-lock-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.PythonPoetryLockEntry{Index: "some-index"}, + }, + }, + { + name: "yarn-lock-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.YarnLockEntry{ + Resolved: "some-resolution", + Integrity: "some-digest", + }, + }, + }, + { + name: "wordpress-plugin-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.WordpressPluginEntry{ + PluginInstallDirectory: "a", + Author: "a", + AuthorURI: "a", + }, + }, + }, + { + name: "elf-binary-package", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.ELFBinaryPackageNoteJSONPayload{ + Type: "a", + Vendor: "a", + System: "a", + SourceRepo: "a", + Commit: "a", + }, + }, + }, + { + name: "Php-pecl-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.PhpPeclEntry{ + Name: "a", + Version: "a", + License: []string{"a"}, + }, + }, + }, + { + name: "lua-rocks-entry", + syftPkg: syftPkg.Package{ + Metadata: syftPkg.LuaRocksPackage{ + Name: "a", + Version: "a", + License: "a", + Homepage: "a", + Description: "a", + URL: "a", + Dependencies: map[string]string{"b": "c"}, + }, + }, + }, } // capture each observed metadata type, we should see all of them relate to what syft provides by the end of testing - expectedMetadataTypes := set.NewStringSet() - for _, ty := range syftPkg.AllMetadataTypes { - expectedMetadataTypes.Add(string(ty)) - } + tester := testutil.NewPackageMetadataCompletionTester(t) // run all of our cases - observedMetadataTypes := set.NewStringSet() for _, test := range tests { t.Run(test.name, func(t *testing.T) { - if string(test.syftPkg.MetadataType) != "" { - observedMetadataTypes.Add(string(test.syftPkg.MetadataType)) - } - assert.Equal(t, test.metadata, New(test.syftPkg).Metadata, "unexpected metadata") - assert.Equal(t, test.upstreams, New(test.syftPkg).Upstreams, "unexpected upstream") + tester.Tested(t, test.syftPkg.Metadata) + p := New(test.syftPkg) + assert.Equal(t, test.metadata, p.Metadata, "unexpected metadata") + assert.Equal(t, test.upstreams, p.Upstreams, "unexpected upstream") }) } - - // did we see all possible metadata types? if not, then there is an uncovered case and this test should error out - if !expectedMetadataTypes.IsEqual(observedMetadataTypes) { - t.Errorf("did not observe all possible package metadata types: missing: %+v extra: %+v", - strset.Difference(expectedMetadataTypes, observedMetadataTypes), - strset.Difference(observedMetadataTypes, expectedMetadataTypes), - ) - } } func TestFromCollection_DoesNotPanic(t *testing.T) { @@ -651,3 +765,174 @@ func Test_getNameAndELVersion(t *testing.T) { func intRef(i int) *int { return &i } + +func Test_RemovePackagesByOverlap(t *testing.T) { + tests := []struct { + name string + sbom *sbom.SBOM + expectedPackages []string + }{ + { + name: "includes all packages without overlap", + sbom: catalogWithOverlaps( + []string{":go@1.18", "apk:node@19.2-r1", "binary:python@3.9"}, + []string{}), + expectedPackages: []string{":go@1.18", "apk:node@19.2-r1", "binary:python@3.9"}, + }, + { + name: "excludes single package by overlap", + sbom: catalogWithOverlaps( + []string{"apk:go@1.18", "apk:node@19.2-r1", "binary:node@19.2"}, + []string{"apk:node@19.2-r1 -> binary:node@19.2"}), + expectedPackages: []string{"apk:go@1.18", "apk:node@19.2-r1"}, + }, + { + name: "does not exclude if OS package owns OS package", + sbom: catalogWithOverlaps( + []string{"rpm:perl@5.3-r1", "rpm:libperl@5.3"}, + []string{"rpm:perl@5.3-r1 -> rpm:libperl@5.3"}), + expectedPackages: []string{"rpm:libperl@5.3", "rpm:perl@5.3-r1"}, + }, + { + name: "does not exclude if owning package is non-OS", + sbom: catalogWithOverlaps( + []string{"python:urllib3@1.2.3", "python:otherlib@1.2.3"}, + []string{"python:urllib3@1.2.3 -> python:otherlib@1.2.3"}), + expectedPackages: []string{"python:otherlib@1.2.3", "python:urllib3@1.2.3"}, + }, + { + name: "excludes multiple package by overlap", + sbom: catalogWithOverlaps( + []string{"apk:go@1.18", "apk:node@19.2-r1", "binary:node@19.2", "apk:python@3.9-r9", "binary:python@3.9"}, + []string{"apk:node@19.2-r1 -> binary:node@19.2", "apk:python@3.9-r9 -> binary:python@3.9"}), + expectedPackages: []string{"apk:go@1.18", "apk:node@19.2-r1", "apk:python@3.9-r9"}, + }, + { + name: "does not exclude with different types", + sbom: catalogWithOverlaps( + []string{"rpm:node@19.2-r1", "apk:node@19.2"}, + []string{"rpm:node@19.2-r1 -> apk:node@19.2"}), + expectedPackages: []string{"apk:node@19.2", "rpm:node@19.2-r1"}, + }, + { + name: "does not exclude if OS package owns OS package", + sbom: catalogWithOverlaps( + []string{"rpm:perl@5.3-r1", "rpm:libperl@5.3"}, + []string{"rpm:perl@5.3-r1 -> rpm:libperl@5.3"}), + expectedPackages: []string{"rpm:libperl@5.3", "rpm:perl@5.3-r1"}, + }, + { + name: "does not exclude if owning package is non-OS", + sbom: catalogWithOverlaps( + []string{"python:urllib3@1.2.3", "python:otherlib@1.2.3"}, + []string{"python:urllib3@1.2.3 -> python:otherlib@1.2.3"}), + expectedPackages: []string{"python:otherlib@1.2.3", "python:urllib3@1.2.3"}, + }, + { + name: "python bindings for system RPM install", + sbom: withDistro(catalogWithOverlaps( + []string{"rpm:python3-rpm@4.14.3-26.el8", "python:rpm@4.14.3"}, + []string{"rpm:python3-rpm@4.14.3-26.el8 -> python:rpm@4.14.3"}), "rhel"), + expectedPackages: []string{"rpm:python3-rpm@4.14.3-26.el8"}, + }, + { + name: "amzn linux doesn't remove packages in this way", + sbom: withDistro(catalogWithOverlaps( + []string{"rpm:python3-rpm@4.14.3-26.el8", "python:rpm@4.14.3"}, + []string{"rpm:python3-rpm@4.14.3-26.el8 -> python:rpm@4.14.3"}), "amzn"), + expectedPackages: []string{"rpm:python3-rpm@4.14.3-26.el8", "python:rpm@4.14.3"}, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + catalog := removePackagesByOverlap(test.sbom.Artifacts.Packages, test.sbom.Relationships, test.sbom.Artifacts.LinuxDistribution) + pkgs := FromCollection(catalog, SynthesisConfig{}) + var pkgNames []string + for _, p := range pkgs { + pkgNames = append(pkgNames, fmt.Sprintf("%s:%s@%s", p.Type, p.Name, p.Version)) + } + assert.EqualValues(t, test.expectedPackages, pkgNames) + }) + } +} + +func catalogWithOverlaps(packages []string, overlaps []string) *sbom.SBOM { + var pkgs []syftPkg.Package + var relationships []artifact.Relationship + + toPkg := func(str string) syftPkg.Package { + var typ, name, version string + s := strings.Split(strings.TrimSpace(str), ":") + if len(s) > 1 { + typ = s[0] + str = s[1] + } + s = strings.Split(str, "@") + name = s[0] + if len(s) > 1 { + version = s[1] + } + + p := syftPkg.Package{ + Type: syftPkg.Type(typ), + Name: name, + Version: version, + } + p.SetID() + + return p + } + + for _, pkg := range packages { + p := toPkg(pkg) + pkgs = append(pkgs, p) + } + + for i, overlap := range overlaps { + parts := strings.Split(overlap, "->") + if len(parts) < 2 { + panic("invalid overlap, use -> to specify, e.g.: pkg1->pkg2") + } + from := toPkg(parts[0]) + to := toPkg(parts[1]) + + // The catalog will type check whether To or From is a pkg.Package or a *pkg.Package. + // Previously, there was a bug where Grype assumed that From was always a pkg.Package. + // Therefore, intentionally mix pointer and non-pointer packages to prevent Grype from + // assuming which is which again. (The correct usage, calling catalog.Package, always + // returns a *pkg.Package, and doesn't rely on any type assertion.) + if i%2 == 0 { + relationships = append(relationships, artifact.Relationship{ + From: &from, + To: &to, + Type: artifact.OwnershipByFileOverlapRelationship, + }) + } else { + relationships = append(relationships, artifact.Relationship{ + From: from, + To: to, + Type: artifact.OwnershipByFileOverlapRelationship, + }) + } + } + + catalog := syftPkg.NewCollection(pkgs...) + + return &sbom.SBOM{ + Artifacts: sbom.Artifacts{ + Packages: catalog, + }, + Relationships: relationships, + } +} + +func withDistro(s *sbom.SBOM, id string) *sbom.SBOM { + s.Artifacts.LinuxDistribution = &linux.Release{ + ID: id, + } + return s +} + +func strRef(s string) *string { + return &s +} diff --git a/xeol/pkg/provider.go b/xeol/pkg/provider.go index 4602c189..41f4cf6d 100644 --- a/xeol/pkg/provider.go +++ b/xeol/pkg/provider.go @@ -4,9 +4,10 @@ import ( "errors" "fmt" + "github.com/bmatcuk/doublestar/v2" + "github.com/anchore/syft/syft/file" "github.com/anchore/syft/syft/sbom" - "github.com/bmatcuk/doublestar/v2" ) var errDoesNotProvide = fmt.Errorf("cannot provide packages from the given source") @@ -16,9 +17,10 @@ func Provide(userInput string, config ProviderConfig) ([]Package, Context, *sbom packages, ctx, s, err := syftSBOMProvider(userInput, config) if !errors.Is(err, errDoesNotProvide) { if len(config.Exclusions) > 0 { - packages, err = filterPackageExclusions(packages, config.Exclusions) - if err != nil { - return nil, ctx, s, err + var exclusionsErr error + packages, exclusionsErr = filterPackageExclusions(packages, config.Exclusions) + if exclusionsErr != nil { + return nil, ctx, s, exclusionsErr } } return packages, ctx, s, err @@ -26,8 +28,9 @@ func Provide(userInput string, config ProviderConfig) ([]Package, Context, *sbom packages, err = purlProvider(userInput) if !errors.Is(err, errDoesNotProvide) { - return packages, ctx, s, err + return packages, Context{}, s, err } + return syftProvider(userInput, config) } @@ -73,7 +76,7 @@ func locationMatches(location file.Location, exclusion string) (bool, error) { if err != nil { return false, err } - matchesVirtualPath, err := doublestar.Match(exclusion, location.VirtualPath) + matchesVirtualPath, err := doublestar.Match(exclusion, location.AccessPath) if err != nil { return false, err } diff --git a/xeol/pkg/provider_config.go b/xeol/pkg/provider_config.go index 2fd8d97e..978f5da3 100644 --- a/xeol/pkg/provider_config.go +++ b/xeol/pkg/provider_config.go @@ -2,7 +2,7 @@ package pkg import ( "github.com/anchore/stereoscope/pkg/image" - "github.com/anchore/syft/syft/pkg/cataloger" + "github.com/anchore/syft/syft" ) type ProviderConfig struct { @@ -11,7 +11,7 @@ type ProviderConfig struct { } type SyftProviderConfig struct { - CatalogingOptions cataloger.Config + SBOMOptions *syft.CreateSBOMConfig RegistryOptions *image.RegistryOptions Platform string Exclusions []string diff --git a/xeol/pkg/provider_test.go b/xeol/pkg/provider_test.go index 410586e3..9b913a24 100644 --- a/xeol/pkg/provider_test.go +++ b/xeol/pkg/provider_test.go @@ -3,10 +3,11 @@ package pkg import ( "testing" - "github.com/anchore/stereoscope/pkg/imagetest" - "github.com/anchore/syft/syft/pkg/cataloger" - "github.com/anchore/syft/syft/source" "github.com/stretchr/testify/assert" + + "github.com/anchore/stereoscope/pkg/imagetest" + "github.com/anchore/syft/syft" + "github.com/anchore/syft/syft/file" ) func TestProviderLocationExcludes(t *testing.T) { @@ -15,6 +16,7 @@ func TestProviderLocationExcludes(t *testing.T) { fixture string excludes []string expected []string + wantErr assert.ErrorAssertionFunc }{ { name: "exclude everything", @@ -40,17 +42,30 @@ func TestProviderLocationExcludes(t *testing.T) { excludes: []string{}, expected: []string{"charsets", "tomcat-embed-el"}, }, + { + name: "exclusions must not hide parsing error", + fixture: "test-fixtures/bad-sbom.json", + excludes: []string{"**/some-glob/*"}, + wantErr: assert.Error, + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { cfg := ProviderConfig{ SyftProviderConfig: SyftProviderConfig{ - Exclusions: test.excludes, - CatalogingOptions: cataloger.DefaultConfig(), + Exclusions: test.excludes, + SBOMOptions: syft.DefaultCreateSBOMConfig(), }, } - pkgs, _, _, _ := Provide(test.fixture, cfg) + if test.wantErr == nil { + test.wantErr = assert.NoError + } + pkgs, _, _, err := Provide(test.fixture, cfg) + test.wantErr(t, err) + if err != nil { + return + } var pkgNames []string @@ -101,8 +116,8 @@ func TestSyftLocationExcludes(t *testing.T) { userInput := imagetest.GetFixtureImageTarPath(t, test.fixture) cfg := ProviderConfig{ SyftProviderConfig: SyftProviderConfig{ - Exclusions: test.excludes, - CatalogingOptions: cataloger.DefaultConfig(), + Exclusions: test.excludes, + SBOMOptions: syft.DefaultCreateSBOMConfig(), }, } pkgs, _, _, err := Provide(userInput, cfg) @@ -157,9 +172,11 @@ func Test_filterPackageExclusions(t *testing.T) { t.Run(test.name, func(t *testing.T) { var packages []Package for _, pkg := range test.locations { - locations := source.NewLocationSet() + locations := file.NewLocationSet() for _, l := range pkg { - locations.Add(source.NewVirtualLocation(l, l)) + locations.Add( + file.NewVirtualLocation(l, l), + ) } packages = append(packages, Package{Locations: locations}) } @@ -218,8 +235,7 @@ func Test_matchesLocation(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - matches, err := locationMatches(source.NewVirtualLocation(test.realPath, test.virtualPath), test.match) - + matches, err := locationMatches(file.NewVirtualLocation(test.realPath, test.virtualPath), test.match) assert.NoError(t, err) assert.Equal(t, test.expected, matches) }) diff --git a/xeol/pkg/purl_provider.go b/xeol/pkg/purl_provider.go index c91ffe37..28d48fa2 100644 --- a/xeol/pkg/purl_provider.go +++ b/xeol/pkg/purl_provider.go @@ -7,11 +7,11 @@ import ( "os" "strings" + "github.com/mitchellh/go-homedir" + "github.com/anchore/packageurl-go" - syftCpe "github.com/anchore/syft/syft/cpe" + "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/pkg" - "github.com/facebookincubator/nvdtools/wfn" - "github.com/mitchellh/go-homedir" ) const ( @@ -52,18 +52,27 @@ func decodePurlFile(reader io.Reader) ([]Package, error) { return nil, fmt.Errorf("unable to decode purl %s: %w", rawLine, err) } - cpes := []wfn.Attributes{} + cpes := []cpe.CPE{} + epoch := "0" for _, qualifier := range purl.Qualifiers { if qualifier.Key == cpesQualifierKey { rawCpes := strings.Split(qualifier.Value, ",") for _, rawCpe := range rawCpes { - cpe, err := syftCpe.New(rawCpe) + c, err := cpe.New(rawCpe, "") if err != nil { return nil, fmt.Errorf("unable to decode cpe %s in purl %s: %w", rawCpe, rawLine, err) } - cpes = append(cpes, cpe) + cpes = append(cpes, c) } } + + if qualifier.Key == "epoch" { + epoch = qualifier.Value + } + } + + if purl.Type == packageurl.TypeRPM && !strings.HasPrefix(purl.Version, fmt.Sprintf("%s:", epoch)) { + purl.Version = fmt.Sprintf("%s:%s", epoch, purl.Version) } packages = append(packages, Package{ diff --git a/xeol/pkg/qualifier/qualifier.go b/xeol/pkg/qualifier/qualifier.go index d04ddbb6..e5760711 100644 --- a/xeol/pkg/qualifier/qualifier.go +++ b/xeol/pkg/qualifier/qualifier.go @@ -1,7 +1,10 @@ package qualifier -import "github.com/xeol-io/xeol/xeol/pkg" +import ( + "github.com/xeol-io/xeol/xeol/distro" + "github.com/xeol-io/xeol/xeol/pkg" +) type Qualifier interface { - Satisfied(p pkg.Package) (bool, error) + Satisfied(d *distro.Distro, p pkg.Package) (bool, error) } diff --git a/xeol/pkg/qualifier/rpmmodularity/qualifier.go b/xeol/pkg/qualifier/rpmmodularity/qualifier.go index c8ba480c..e1af2443 100644 --- a/xeol/pkg/qualifier/rpmmodularity/qualifier.go +++ b/xeol/pkg/qualifier/rpmmodularity/qualifier.go @@ -3,6 +3,7 @@ package rpmmodularity import ( "strings" + "github.com/xeol-io/xeol/xeol/distro" "github.com/xeol-io/xeol/xeol/pkg" "github.com/xeol-io/xeol/xeol/pkg/qualifier" ) @@ -15,33 +16,47 @@ func New(module string) qualifier.Qualifier { return &rpmModularity{module: module} } -func (r rpmModularity) Satisfied(p pkg.Package) (bool, error) { - if p.MetadataType == pkg.RpmMetadataType { +func (r rpmModularity) Satisfied(d *distro.Distro, p pkg.Package) (bool, error) { + if p.Metadata == nil { // If unable to determine package modularity, the constraint should be considered satisfied - if p.Metadata == nil { - return true, nil - } + return true, nil + } - m, ok := p.Metadata.(pkg.RpmMetadata) + m, ok := p.Metadata.(pkg.RpmMetadata) + if !ok { + return false, nil + } - // If the package metadata was the rpm type but casting failed - // we assume it would have been satisfied to - // avoid dropping potential matches - if !ok { - return true, nil - } + if m.ModularityLabel == nil { + // If the package modularity is empty (null), the constraint should be considered satisfied. + // this is the case where the package source does not support expressing modularity. + return true, nil + } - // If the package modularity is empty (""), the constraint should be considered satisfied - if m.ModularityLabel == "" { - return true, nil - } + if d != nil && d.Type == distro.OracleLinux && *m.ModularityLabel == "" { + // For oraclelinux, the default stream of an installed appstream package does not currently set + // the MODULARITYLABEL property in the rpm metadata; however, in their advisory data they do specify + // modularity information, so this ends up in a case where the vuln entries have modularity but the + // packages coming from the sbom won't, so for now we need to treat the constraint as satisfied when the + // modularity label from an oraclelinux package is "". + // TODO: remove this once we have a way of obtaining and parsing the module information from the DISTTAG + // in syft. + return true, nil + } - if r.module == "" { - return false, nil + if r.module == "" { + if *m.ModularityLabel == "" { + // the DB has a modularity label, but it's empty... we also have a modularity label from a package source + // that supports being able to express modularity, but it's empty. This is a match. + return true, nil } - return strings.HasPrefix(m.ModularityLabel, r.module), nil + // The package source is able to express modularity, and the DB has a package quality that is empty. + // Since we are doing a prefix match against the modularity label (which is guaranteed to be non-empty), + // and we are checking for an empty prefix, this will always match, however, semantically this makes no sense. + // We don't want package modularities of any value to match this qualifier. + return false, nil } - return false, nil + return strings.HasPrefix(*m.ModularityLabel, r.module), nil } diff --git a/xeol/pkg/qualifier/rpmmodularity/qualifier_test.go b/xeol/pkg/qualifier/rpmmodularity/qualifier_test.go index 64c74ba0..675c9261 100644 --- a/xeol/pkg/qualifier/rpmmodularity/qualifier_test.go +++ b/xeol/pkg/qualifier/rpmmodularity/qualifier_test.go @@ -5,97 +5,145 @@ import ( "github.com/stretchr/testify/assert" + "github.com/xeol-io/xeol/xeol/distro" "github.com/xeol-io/xeol/xeol/pkg" "github.com/xeol-io/xeol/xeol/pkg/qualifier" ) func TestRpmModularity_Satisfied(t *testing.T) { + oracle, _ := distro.New(distro.OracleLinux, "test", "8") + tests := []struct { name string rpmModularity qualifier.Qualifier pkg pkg.Package + distro *distro.Distro satisfied bool }{ { name: "non rpm metadata", rpmModularity: New("test:1"), - pkg: pkg.Package{MetadataType: pkg.UnknownMetadataType}, - satisfied: false, - }, - { - name: "invalid rpm metadata", - rpmModularity: New("test:1"), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: pkg.GolangBinMetadata{ - BuildSettings: nil, - GoCompiledVersion: "", - Architecture: "", - H1Digest: "", - MainModule: "", - }}, - satisfied: true, + pkg: pkg.Package{ + Metadata: pkg.JavaMetadata{}, + }, + distro: nil, + satisfied: false, }, { name: "module with package rpm metadata lacking actual metadata 1", rpmModularity: New("test:1"), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: nil}, + pkg: pkg.Package{Metadata: nil}, + distro: nil, satisfied: true, }, { name: "empty module with rpm metadata lacking actual metadata 2", rpmModularity: New(""), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: nil}, + pkg: pkg.Package{Metadata: nil}, + distro: nil, satisfied: true, }, { name: "no modularity label with no module", rpmModularity: New(""), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: pkg.RpmMetadata{ + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ Epoch: nil, }}, + distro: nil, satisfied: true, }, { name: "no modularity label with module", rpmModularity: New("abc"), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: pkg.RpmMetadata{ + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ Epoch: nil, }}, + distro: nil, satisfied: true, }, { name: "modularity label with no module", rpmModularity: New(""), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: pkg.RpmMetadata{ - Epoch: nil, - ModularityLabel: "x:3:1234567:abcd", + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef("x:3:1234567:abcd"), }}, + distro: nil, satisfied: false, }, { name: "modularity label in module", rpmModularity: New("x:3"), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: pkg.RpmMetadata{ - Epoch: nil, - ModularityLabel: "x:3:1234567:abcd", + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef("x:3:1234567:abcd"), }}, + distro: nil, satisfied: true, }, { name: "modularity label not in module", rpmModularity: New("x:3"), - pkg: pkg.Package{MetadataType: pkg.RpmMetadataType, Metadata: pkg.RpmMetadata{ - Epoch: nil, - ModularityLabel: "x:1:1234567:abcd", + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef("x:1:1234567:abcd"), }}, + distro: nil, + satisfied: false, + }, + { + name: "modularity label is positively blank", + rpmModularity: New(""), + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef(""), + }}, + distro: nil, + satisfied: true, + }, + { + name: "modularity label is missing (assume we cannot verify that capability)", + rpmModularity: New(""), + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: nil, + }}, + distro: nil, + satisfied: true, + }, + { + name: "default appstream for oraclelinux (treat as missing)", + rpmModularity: New("nodejs:16"), + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef(""), + }}, + distro: oracle, + satisfied: true, + }, + { + name: "non-default appstream for oraclelinux matches vuln modularity", + rpmModularity: New("nodejs:16"), + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef("nodejs:16:blah"), + }}, + distro: oracle, + satisfied: true, + }, + { + name: "non-default appstream for oraclelinux does not match vuln modularity", + rpmModularity: New("nodejs:17"), + pkg: pkg.Package{Metadata: pkg.RpmMetadata{ + ModularityLabel: strRef("nodejs:16:blah"), + }}, + distro: oracle, satisfied: false, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { - s, err := test.rpmModularity.Satisfied(test.pkg) + s, err := test.rpmModularity.Satisfied(test.distro, test.pkg) assert.NoError(t, err) assert.Equal(t, test.satisfied, s) }) } } + +func strRef(s string) *string { + return &s +} diff --git a/xeol/pkg/rpm_metadata.go b/xeol/pkg/rpm_metadata.go index da0cced5..7905f3a0 100644 --- a/xeol/pkg/rpm_metadata.go +++ b/xeol/pkg/rpm_metadata.go @@ -1,6 +1,6 @@ package pkg type RpmMetadata struct { - Epoch *int `json:"epoch"` - ModularityLabel string `json:"modularityLabel"` + Epoch *int `json:"epoch"` + ModularityLabel *string `json:"modularityLabel"` } diff --git a/xeol/pkg/syft_provider.go b/xeol/pkg/syft_provider.go index 5f028b6e..b0b5b9e7 100644 --- a/xeol/pkg/syft_provider.go +++ b/xeol/pkg/syft_provider.go @@ -1,11 +1,16 @@ package pkg import ( + "context" + "errors" + + "github.com/anchore/go-collections" + "github.com/anchore/stereoscope" "github.com/anchore/stereoscope/pkg/image" "github.com/anchore/syft/syft" "github.com/anchore/syft/syft/sbom" "github.com/anchore/syft/syft/source" - + "github.com/anchore/syft/syft/source/sourceproviders" "github.com/xeol-io/xeol/internal/log" ) @@ -23,44 +28,34 @@ func syftProvider(userInput string, config ProviderConfig) ([]Package, Context, } }() - catalog, relationships, theDistro, err := syft.CatalogPackages(src, config.CatalogingOptions) + s, err := syft.CreateSBOM(context.Background(), src, config.SBOMOptions) if err != nil { return nil, Context{}, nil, err } - catalog = removePackagesByOverlap(catalog, relationships) + if s == nil { + return nil, Context{}, nil, errors.New("no SBOM provided") + } + + pkgCatalog := removePackagesByOverlap(s.Artifacts.Packages, s.Relationships, s.Artifacts.LinuxDistribution) srcDescription := src.Describe() - packages := FromCollection(catalog, config.SynthesisConfig) - context := Context{ + packages := FromCollection(pkgCatalog, config.SynthesisConfig) + pkgCtx := Context{ Source: &srcDescription, - Distro: theDistro, + Distro: s.Artifacts.LinuxDistribution, } - sbom := &sbom.SBOM{ - Source: srcDescription, - Relationships: relationships, - Artifacts: sbom.Artifacts{ - Packages: catalog, - }, - } - - return packages, context, sbom, nil + return packages, pkgCtx, s, nil } func getSource(userInput string, config ProviderConfig) (source.Source, error) { - if config.CatalogingOptions.Search.Scope == "" { + if config.SBOMOptions.Search.Scope == "" { return nil, errDoesNotProvide } - detection, err := source.Detect(userInput, source.DetectConfig{ - DefaultImageSource: config.DefaultImagePullSource, - }) - if err != nil { - return nil, err - } - + var err error var platform *image.Platform if config.Platform != "" { platform, err = image.NewPlatform(config.Platform) @@ -69,14 +64,22 @@ func getSource(userInput string, config ProviderConfig) (source.Source, error) { } } - return detection.NewSource(source.DetectionSourceConfig{ - Alias: source.Alias{ - Name: config.Name, - }, - RegistryOptions: config.RegistryOptions, - Platform: platform, - Exclude: source.ExcludeConfig{ - Paths: config.Exclusions, - }, - }) + var sources []string + schemeSource, newUserInput := stereoscope.ExtractSchemeSource(userInput, allSourceTags()...) + if schemeSource != "" { + sources = []string{schemeSource} + userInput = newUserInput + } + + return syft.GetSource(context.Background(), userInput, syft.DefaultGetSourceConfig(). + WithSources(sources...). + WithDefaultImagePullSource(config.DefaultImagePullSource). + WithAlias(source.Alias{Name: config.Name}). + WithRegistryOptions(config.RegistryOptions). + WithPlatform(platform). + WithExcludeConfig(source.ExcludeConfig{Paths: config.Exclusions})) +} + +func allSourceTags() []string { + return collections.TaggedValueSet[source.Provider]{}.Join(sourceproviders.All("", nil)...).Tags() } diff --git a/xeol/pkg/syft_sbom_provider.go b/xeol/pkg/syft_sbom_provider.go index 14903183..a222b18b 100644 --- a/xeol/pkg/syft_sbom_provider.go +++ b/xeol/pkg/syft_sbom_provider.go @@ -7,11 +7,11 @@ import ( "os" "strings" - "github.com/anchore/syft/syft" - "github.com/anchore/syft/syft/sbom" "github.com/gabriel-vasile/mimetype" "github.com/mitchellh/go-homedir" + "github.com/anchore/syft/syft/format" + "github.com/anchore/syft/syft/sbom" "github.com/xeol-io/xeol/internal" "github.com/xeol-io/xeol/internal/log" ) @@ -30,7 +30,7 @@ func syftSBOMProvider(userInput string, config ProviderConfig) ([]Package, Conte return nil, Context{}, nil, err } - catalog := removePackagesByOverlap(s.Artifacts.Packages, s.Relationships) + catalog := removePackagesByOverlap(s.Artifacts.Packages, s.Relationships, s.Artifacts.LinuxDistribution) return FromCollection(catalog, config.SynthesisConfig), Context{ Source: &s.Source, @@ -56,19 +56,19 @@ func getSBOM(userInput string) (*sbom.SBOM, error) { return nil, err } - s, format, err := syft.Decode(reader) + s, fmtID, _, err := format.Decode(reader) if err != nil { return nil, fmt.Errorf("unable to decode sbom: %w", err) } - if format == nil { + if fmtID == "" || s == nil { return nil, errDoesNotProvide } return s, nil } -func getSBOMReader(userInput string) (r io.Reader, err error) { +func getSBOMReader(userInput string) (r io.ReadSeeker, err error) { r, _, err = extractReaderAndInfo(userInput) if err != nil { return nil, err @@ -77,7 +77,7 @@ func getSBOMReader(userInput string) (r io.Reader, err error) { return r, nil } -func extractReaderAndInfo(userInput string) (io.Reader, *inputInfo, error) { +func extractReaderAndInfo(userInput string) (io.ReadSeeker, *inputInfo, error) { switch { // the order of cases matter case userInput == "": @@ -97,7 +97,7 @@ func extractReaderAndInfo(userInput string) (io.Reader, *inputInfo, error) { } } -func parseSBOM(scheme, path string) (io.Reader, *inputInfo, error) { +func parseSBOM(scheme, path string) (io.ReadSeeker, *inputInfo, error) { r, err := openFile(path) if err != nil { return nil, nil, err @@ -106,7 +106,7 @@ func parseSBOM(scheme, path string) (io.Reader, *inputInfo, error) { return r, info, nil } -func decodeStdin(r io.Reader) (io.Reader, *inputInfo, error) { +func decodeStdin(r io.Reader) (io.ReadSeeker, *inputInfo, error) { b, err := io.ReadAll(r) if err != nil { return nil, nil, fmt.Errorf("failed reading stdin: %w", err) diff --git a/xeol/pkg/syft_sbom_provider_test.go b/xeol/pkg/syft_sbom_provider_test.go index 91cc080d..a0b0018b 100644 --- a/xeol/pkg/syft_sbom_provider_test.go +++ b/xeol/pkg/syft_sbom_provider_test.go @@ -5,13 +5,14 @@ import ( "strings" "testing" + "github.com/go-test/deep" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/file" "github.com/anchore/syft/syft/linux" "github.com/anchore/syft/syft/source" - "github.com/go-test/deep" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestParseSyftJSON(t *testing.T) { @@ -38,7 +39,7 @@ func TestParseSyftJSON(t *testing.T) { }, Type: "apk", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:a:alpine:alpine_baselayout:3.2.0-r6:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:a:alpine:alpine_baselayout:3.2.0-r6:*:*:*:*:*:*:*", ""), }, PURL: "pkg:alpine/alpine-baselayout@3.2.0-r6?arch=x86_64", Upstreams: []UpstreamPackage{ @@ -46,6 +47,107 @@ func TestParseSyftJSON(t *testing.T) { Name: "alpine-baselayout", }, }, + Metadata: ApkMetadata{ + Files: []ApkFileRecord{ + {Path: "/dev"}, + {Path: "/dev/pts"}, + {Path: "/dev/shm"}, + {Path: "/etc"}, + {Path: "/etc/fstab"}, + {Path: "/etc/group"}, + {Path: "/etc/hostname"}, + {Path: "/etc/hosts"}, + {Path: "/etc/inittab"}, + {Path: "/etc/modules"}, + {Path: "/etc/motd"}, + {Path: "/etc/mtab"}, + {Path: "/etc/passwd"}, + {Path: "/etc/profile"}, + {Path: "/etc/protocols"}, + {Path: "/etc/services"}, + {Path: "/etc/shadow"}, + {Path: "/etc/shells"}, + {Path: "/etc/sysctl.conf"}, + {Path: "/etc/apk"}, + {Path: "/etc/conf.d"}, + {Path: "/etc/crontabs"}, + {Path: "/etc/crontabs/root"}, + {Path: "/etc/init.d"}, + {Path: "/etc/modprobe.d"}, + {Path: "/etc/modprobe.d/aliases.conf"}, + {Path: "/etc/modprobe.d/blacklist.conf"}, + {Path: "/etc/modprobe.d/i386.conf"}, + {Path: "/etc/modprobe.d/kms.conf"}, + {Path: "/etc/modules-load.d"}, + {Path: "/etc/network"}, + {Path: "/etc/network/if-down.d"}, + {Path: "/etc/network/if-post-down.d"}, + {Path: "/etc/network/if-pre-up.d"}, + {Path: "/etc/network/if-up.d"}, + {Path: "/etc/opt"}, + {Path: "/etc/periodic"}, + {Path: "/etc/periodic/15min"}, + {Path: "/etc/periodic/daily"}, + {Path: "/etc/periodic/hourly"}, + {Path: "/etc/periodic/monthly"}, + {Path: "/etc/periodic/weekly"}, + {Path: "/etc/profile.d"}, + {Path: "/etc/profile.d/README"}, + {Path: "/etc/profile.d/color_prompt.sh.disabled"}, + {Path: "/etc/profile.d/locale.sh"}, + {Path: "/etc/sysctl.d"}, + {Path: "/home"}, + {Path: "/lib"}, + {Path: "/lib/firmware"}, + {Path: "/lib/mdev"}, + {Path: "/lib/modules-load.d"}, + {Path: "/lib/sysctl.d"}, + {Path: "/lib/sysctl.d/00-alpine.conf"}, + {Path: "/media"}, + {Path: "/media/cdrom"}, + {Path: "/media/floppy"}, + {Path: "/media/usb"}, + {Path: "/mnt"}, + {Path: "/opt"}, + {Path: "/proc"}, + {Path: "/root"}, + {Path: "/run"}, + {Path: "/sbin"}, + {Path: "/sbin/mkmntdirs"}, + {Path: "/srv"}, + {Path: "/sys"}, + {Path: "/tmp"}, + {Path: "/usr"}, + {Path: "/usr/lib"}, + {Path: "/usr/lib/modules-load.d"}, + {Path: "/usr/local"}, + {Path: "/usr/local/bin"}, + {Path: "/usr/local/lib"}, + {Path: "/usr/local/share"}, + {Path: "/usr/sbin"}, + {Path: "/usr/share"}, + {Path: "/usr/share/man"}, + {Path: "/usr/share/misc"}, + {Path: "/var"}, + {Path: "/var/run"}, + {Path: "/var/cache"}, + {Path: "/var/cache/misc"}, + {Path: "/var/empty"}, + {Path: "/var/lib"}, + {Path: "/var/lib/misc"}, + {Path: "/var/local"}, + {Path: "/var/lock"}, + {Path: "/var/lock/subsys"}, + {Path: "/var/log"}, + {Path: "/var/mail"}, + {Path: "/var/opt"}, + {Path: "/var/spool"}, + {Path: "/var/spool/mail"}, + {Path: "/var/spool/cron"}, + {Path: "/var/spool/cron/crontabs"}, + {Path: "/var/tmp"}, + }, + }, }, { Name: "fake", @@ -62,8 +164,8 @@ func TestParseSyftJSON(t *testing.T) { }, Type: "dpkg", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:a:*:fake:1.2.0:*:*:*:*:*:*:*"), - cpe.Must("cpe:2.3:a:fake:fake:1.2.0:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:a:*:fake:1.2.0:*:*:*:*:*:*:*", ""), + cpe.Must("cpe:2.3:a:fake:fake:1.2.0:*:*:*:*:*:*:*", ""), }, PURL: "pkg:deb/debian/fake@1.2.0?arch=x86_64", Upstreams: []UpstreamPackage{ @@ -88,11 +190,10 @@ func TestParseSyftJSON(t *testing.T) { }, Type: "java-archive", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:a:*:gmp:6.2.0-r0:*:*:*:*:*:*:*"), - cpe.Must("cpe:2.3:a:gmp:gmp:6.2.0-r0:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:a:*:gmp:6.2.0-r0:*:*:*:*:*:*:*", ""), + cpe.Must("cpe:2.3:a:gmp:gmp:6.2.0-r0:*:*:*:*:*:*:*", ""), }, - PURL: "pkg:alpine/gmp@6.2.0-r0?arch=x86_64", - MetadataType: JavaMetadataType, + PURL: "pkg:alpine/gmp@6.2.0-r0?arch=x86_64", Metadata: JavaMetadata{ PomArtifactID: "aid", PomGroupID: "gid", @@ -102,9 +203,9 @@ func TestParseSyftJSON(t *testing.T) { }, Context: Context{ Source: &source.Description{ - Metadata: source.StereoscopeImageSourceMetadata{ + Metadata: source.ImageMetadata{ UserInput: "alpine:fake", - Layers: []source.StereoscopeLayerMetadata{ + Layers: []source.LayerMetadata{ { MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip", Digest: "sha256:50644c29ef5a27c9a40c393a73ece2479de78325cae7d762ef3cdc19bf42dd0a", @@ -136,7 +237,7 @@ func TestParseSyftJSON(t *testing.T) { t.Fatalf("unable to parse: %+v", err) } - if m, ok := context.Source.Metadata.(source.StereoscopeImageSourceMetadata); ok { + if m, ok := context.Source.Metadata.(source.ImageMetadata); ok { m.RawConfig = nil m.RawManifest = nil @@ -191,12 +292,11 @@ var springImageTestCase = struct { Licenses: []string{}, Type: "java-archive", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:a:charsets:charsets:*:*:*:*:*:java:*:*"), - cpe.Must("cpe:2.3:a:charsets:charsets:*:*:*:*:*:maven:*:*"), + cpe.Must("cpe:2.3:a:charsets:charsets:*:*:*:*:*:java:*:*", ""), + cpe.Must("cpe:2.3:a:charsets:charsets:*:*:*:*:*:maven:*:*", ""), }, - PURL: "", - MetadataType: JavaMetadataType, - Metadata: JavaMetadata{VirtualPath: "/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar"}, + PURL: "", + Metadata: JavaMetadata{VirtualPath: "/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar"}, }, { Name: "tomcat-embed-el", @@ -211,19 +311,18 @@ var springImageTestCase = struct { Licenses: []string{}, Type: "java-archive", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:a:tomcat_embed_el:tomcat-embed-el:9.0.27:*:*:*:*:java:*:*"), - cpe.Must("cpe:2.3:a:tomcat-embed-el:tomcat_embed_el:9.0.27:*:*:*:*:maven:*:*"), + cpe.Must("cpe:2.3:a:tomcat_embed_el:tomcat-embed-el:9.0.27:*:*:*:*:java:*:*", ""), + cpe.Must("cpe:2.3:a:tomcat-embed-el:tomcat_embed_el:9.0.27:*:*:*:*:maven:*:*", ""), }, - PURL: "", - MetadataType: JavaMetadataType, - Metadata: JavaMetadata{VirtualPath: "/app/libs/tomcat-embed-el-9.0.27.jar"}, + PURL: "", + Metadata: JavaMetadata{VirtualPath: "/app/libs/tomcat-embed-el-9.0.27.jar"}, }, }, Context: Context{ Source: &source.Description{ - Metadata: source.StereoscopeImageSourceMetadata{ + Metadata: source.ImageMetadata{ UserInput: "springio/gs-spring-boot-docker:latest", - Layers: []source.StereoscopeLayerMetadata{ + Layers: []source.LayerMetadata{ { MediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip", Digest: "sha256:42a3027eaac150d2b8f516100921f4bd83b3dbc20bfe64124f686c072b49c602", diff --git a/xeol/pkg/upstream_package.go b/xeol/pkg/upstream_package.go index c500cd71..73326cda 100644 --- a/xeol/pkg/upstream_package.go +++ b/xeol/pkg/upstream_package.go @@ -3,8 +3,9 @@ package pkg import ( "strings" - syftCpe "github.com/anchore/syft/syft/cpe" "github.com/scylladb/go-set/strset" + + "github.com/anchore/syft/syft/cpe" ) type UpstreamPackage struct { @@ -29,20 +30,20 @@ func UpstreamPackages(p Package) (pkgs []Package) { // for each cpe, replace pkg name with origin and add to set cpeStrings := strset.New() - for _, cpe := range tmp.CPEs { + for _, c := range tmp.CPEs { if u.Version != "" { - cpe.Version = u.Version + c.Attributes.Version = u.Version } - updatedCPEString := strings.ReplaceAll(cpe.BindToFmtString(), p.Name, u.Name) + updatedCPEString := strings.ReplaceAll(c.Attributes.BindToFmtString(), p.Name, u.Name) cpeStrings.Add(updatedCPEString) } // with each entry in set, convert string to CPE and update the new CPEs - var updatedCPEs []syftCpe.CPE + var updatedCPEs []cpe.CPE for _, cpeString := range cpeStrings.List() { - updatedCPE, _ := syftCpe.New(cpeString) + updatedCPE, _ := cpe.New(cpeString, "") updatedCPEs = append(updatedCPEs, updatedCPE) } tmp.CPEs = updatedCPEs diff --git a/xeol/pkg/upstream_package_test.go b/xeol/pkg/upstream_package_test.go index 0d1cc7cf..05a96652 100644 --- a/xeol/pkg/upstream_package_test.go +++ b/xeol/pkg/upstream_package_test.go @@ -3,8 +3,9 @@ package pkg import ( "testing" - "github.com/anchore/syft/syft/cpe" "github.com/stretchr/testify/assert" + + "github.com/anchore/syft/syft/cpe" ) func TestUpstreamPackages(t *testing.T) { @@ -27,7 +28,7 @@ func TestUpstreamPackages(t *testing.T) { Name: "name", Version: "version", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:*:name:name:version:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:*:name:name:version:*:*:*:*:*:*:*", ""), }, Upstreams: []UpstreamPackage{ { @@ -41,7 +42,7 @@ func TestUpstreamPackages(t *testing.T) { Version: "version", // original CPEs: []cpe.CPE{ // name and vendor replaced - cpe.Must("cpe:2.3:*:new-name:new-name:version:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:*:new-name:new-name:version:*:*:*:*:*:*:*", ""), }, // no upstreams }, @@ -53,7 +54,7 @@ func TestUpstreamPackages(t *testing.T) { Name: "name", Version: "version", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:*:name:name:version:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:*:name:name:version:*:*:*:*:*:*:*", ""), }, Upstreams: []UpstreamPackage{ { @@ -68,7 +69,7 @@ func TestUpstreamPackages(t *testing.T) { Version: "new-version", // new CPEs: []cpe.CPE{ // name, vendor, and version replaced - cpe.Must("cpe:2.3:*:new-name:new-name:new-version:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:*:new-name:new-name:new-version:*:*:*:*:*:*:*", ""), }, // no upstreams }, @@ -80,7 +81,7 @@ func TestUpstreamPackages(t *testing.T) { Name: "name", Version: "version", CPEs: []cpe.CPE{ - cpe.Must("cpe:2.3:*:name:name:version:*:*:*:*:*:*:*"), + cpe.Must("cpe:2.3:*:name:name:version:*:*:*:*:*:*:*", ""), }, Upstreams: []UpstreamPackage{ { @@ -95,9 +96,7 @@ func TestUpstreamPackages(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var actual []Package - for _, upstream := range UpstreamPackages(tt.pkg) { - actual = append(actual, upstream) - } + actual = append(actual, UpstreamPackages(tt.pkg)...) assert.Equalf(t, tt.expected, actual, "UpstreamPackages(%v)", tt.pkg) }) } diff --git a/xeol/presenter/internal/test_helpers.go b/xeol/presenter/internal/test_helpers.go index b517f1b5..4c5f67e8 100644 --- a/xeol/presenter/internal/test_helpers.go +++ b/xeol/presenter/internal/test_helpers.go @@ -10,6 +10,9 @@ import ( syftPkg "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/sbom" syftSource "github.com/anchore/syft/syft/source" + "github.com/anchore/syft/syft/source/directorysource" + "github.com/anchore/syft/syft/source/filesource" + "github.com/anchore/syft/syft/source/stereoscopesource" "github.com/google/uuid" "github.com/xeol-io/xeol/xeol/eol" @@ -166,9 +169,7 @@ func generateContext(t *testing.T, scheme SyftSource) pkg.Context { switch scheme { case FileSource: var err error - src, err = syftSource.NewFromFile(syftSource.FileConfig{ - Path: "user-input", - }) + src, err = filesource.NewFromPath("user-input") if err != nil { t.Fatalf("failed to generate mock file source from mock image: %+v", err) } @@ -207,7 +208,9 @@ func generateContext(t *testing.T, scheme SyftSource) pkg.Context { } var err error - src, err = syftSource.NewFromStereoscopeImageObject(&img, "user-input", nil) + src = stereoscopesource.New(&img, stereoscopesource.ImageConfig{ + Reference: "user-input", + }) if err != nil { t.Fatalf("failed to generate mock image source from mock image: %+v", err) } @@ -216,15 +219,13 @@ func generateContext(t *testing.T, scheme SyftSource) pkg.Context { // note: the dir must exist for the source to be created d := t.TempDir() var err error - src, err = syftSource.NewFromDirectory(syftSource.DirectoryConfig{ - Path: d, - }) + src, err = directorysource.NewFromPath(d) if err != nil { t.Fatalf("failed to generate mock directory source from mock dir: %+v", err) } desc = src.Describe() - if m, ok := desc.Metadata.(syftSource.DirectorySourceMetadata); ok { + if m, ok := desc.Metadata.(syftSource.DirectoryMetadata); ok { m.Path = "/some/path" desc.Metadata = m } diff --git a/xeol/presenter/models/document_test.go b/xeol/presenter/models/document_test.go index 8c3da741..800e70b8 100644 --- a/xeol/presenter/models/document_test.go +++ b/xeol/presenter/models/document_test.go @@ -69,7 +69,7 @@ func TestPackagesAreSorted(t *testing.T) { ctx := pkg.Context{ Source: &syftSource.Description{ - Metadata: syftSource.DirectorySourceMetadata{}, + Metadata: syftSource.DirectoryMetadata{}, }, Distro: &linux.Release{ ID: "centos", diff --git a/xeol/presenter/models/package.go b/xeol/presenter/models/package.go index 08476bec..ef436fe9 100644 --- a/xeol/presenter/models/package.go +++ b/xeol/presenter/models/package.go @@ -30,7 +30,7 @@ type UpstreamPackage struct { func newPackage(p pkg.Package) Package { var cpes = make([]string, 0) for _, c := range p.CPEs { - cpes = append(cpes, c.BindToFmtString()) + cpes = append(cpes, c.Attributes.BindToFmtString()) } licenses := p.Licenses diff --git a/xeol/presenter/models/source.go b/xeol/presenter/models/source.go index bdfecbe3..f97871e0 100644 --- a/xeol/presenter/models/source.go +++ b/xeol/presenter/models/source.go @@ -14,7 +14,7 @@ type source struct { // newSource creates a new source object to be represented into JSON. func newSource(src syftSource.Description) (source, error) { switch m := src.Metadata.(type) { - case syftSource.StereoscopeImageSourceMetadata: + case syftSource.ImageMetadata: // ensure that empty collections are not shown as null if m.RepoDigests == nil { m.RepoDigests = []string{} @@ -27,12 +27,12 @@ func newSource(src syftSource.Description) (source, error) { Type: "image", Target: m, }, nil - case syftSource.DirectorySourceMetadata: + case syftSource.DirectoryMetadata: return source{ Type: "directory", Target: m.Path, }, nil - case syftSource.FileSourceMetadata: + case syftSource.FileMetadata: return source{ Type: "file", Target: m.Path, From 16a1a091b3a3ff8ba65ceb2dbbe4fc373a0f3016 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 16:34:39 -0400 Subject: [PATCH 02/15] update grpc Signed-off-by: Benji Visser --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2d4dfc2e..92c49c1d 100644 --- a/go.mod +++ b/go.mod @@ -266,7 +266,7 @@ require ( google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/grpc v1.64.0 // indirect + google.golang.org/grpc v1.64.1 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/go-jose/go-jose.v2 v2.6.3 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index a7a7c3d4..250da88b 100644 --- a/go.sum +++ b/go.sum @@ -1657,8 +1657,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= -google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= +google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= From b19c1960c9312344111e01b1019d1efdf586308d Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 16:53:22 -0400 Subject: [PATCH 03/15] update snap Signed-off-by: Benji Visser --- xeol/presenter/json/__snapshots__/presenter_test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xeol/presenter/json/__snapshots__/presenter_test.snap b/xeol/presenter/json/__snapshots__/presenter_test.snap index 8ce55396..7e268289 100755 --- a/xeol/presenter/json/__snapshots__/presenter_test.snap +++ b/xeol/presenter/json/__snapshots__/presenter_test.snap @@ -1,10 +1,10 @@ [TestJsonImgsPresenter - 1] -[]uint8{0x7b, 0xa, 0x20, 0x22, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x38, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x32, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x65, 0x62, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x49, 0x54, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x32, 0x2e, 0x30, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x70, 0x6d, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x70, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x32, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x30, 0x34, 0x2d, 0x30, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x61, 0x62, 0x35, 0x36, 0x30, 0x38, 0x64, 0x36, 0x33, 0x34, 0x64, 0x62, 0x32, 0x37, 0x31, 0x36, 0x61, 0x32, 0x39, 0x37, 0x61, 0x64, 0x62, 0x66, 0x61, 0x36, 0x61, 0x35, 0x64, 0x64, 0x35, 0x64, 0x38, 0x66, 0x38, 0x66, 0x35, 0x61, 0x37, 0x64, 0x30, 0x63, 0x61, 0x62, 0x37, 0x33, 0x36, 0x34, 0x39, 0x65, 0x61, 0x37, 0x66, 0x62, 0x62, 0x38, 0x63, 0x38, 0x64, 0x61, 0x35, 0x34, 0x34, 0x66, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x63, 0x61, 0x37, 0x33, 0x38, 0x61, 0x62, 0x62, 0x38, 0x37, 0x61, 0x38, 0x64, 0x35, 0x38, 0x66, 0x31, 0x31, 0x32, 0x64, 0x33, 0x34, 0x30, 0x30, 0x65, 0x62, 0x62, 0x30, 0x37, 0x39, 0x62, 0x36, 0x31, 0x63, 0x65, 0x61, 0x65, 0x37, 0x64, 0x63, 0x32, 0x39, 0x30, 0x62, 0x65, 0x62, 0x33, 0x34, 0x62, 0x64, 0x61, 0x37, 0x33, 0x35, 0x62, 0x65, 0x34, 0x62, 0x31, 0x39, 0x34, 0x31, 0x64, 0x35, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2b, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x74, 0x61, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x36, 0x35, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x2e, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x74, 0x61, 0x72, 0x2e, 0x67, 0x7a, 0x69, 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x63, 0x61, 0x37, 0x33, 0x38, 0x61, 0x62, 0x62, 0x38, 0x37, 0x61, 0x38, 0x64, 0x35, 0x38, 0x66, 0x31, 0x31, 0x32, 0x64, 0x33, 0x34, 0x30, 0x30, 0x65, 0x62, 0x62, 0x30, 0x37, 0x39, 0x62, 0x36, 0x31, 0x63, 0x65, 0x61, 0x65, 0x37, 0x64, 0x63, 0x32, 0x39, 0x30, 0x62, 0x65, 0x62, 0x33, 0x34, 0x62, 0x64, 0x61, 0x37, 0x33, 0x35, 0x62, 0x65, 0x34, 0x62, 0x31, 0x39, 0x34, 0x31, 0x64, 0x35, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x32, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x2e, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x74, 0x61, 0x72, 0x2e, 0x67, 0x7a, 0x69, 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x61, 0x30, 0x35, 0x63, 0x64, 0x39, 0x65, 0x62, 0x66, 0x38, 0x38, 0x61, 0x66, 0x39, 0x36, 0x34, 0x35, 0x30, 0x66, 0x31, 0x65, 0x32, 0x35, 0x33, 0x36, 0x37, 0x32, 0x38, 0x31, 0x61, 0x62, 0x32, 0x33, 0x32, 0x61, 0x63, 0x30, 0x36, 0x34, 0x35, 0x66, 0x33, 0x31, 0x34, 0x31, 0x32, 0x34, 0x66, 0x65, 0x30, 0x31, 0x61, 0x66, 0x37, 0x35, 0x39, 0x62, 0x39, 0x33, 0x66, 0x33, 0x30, 0x30, 0x36, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x2e, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x74, 0x61, 0x72, 0x2e, 0x67, 0x7a, 0x69, 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x61, 0x62, 0x35, 0x36, 0x30, 0x38, 0x64, 0x36, 0x33, 0x34, 0x64, 0x62, 0x32, 0x37, 0x31, 0x36, 0x61, 0x32, 0x39, 0x37, 0x61, 0x64, 0x62, 0x66, 0x61, 0x36, 0x61, 0x35, 0x64, 0x64, 0x35, 0x64, 0x38, 0x66, 0x38, 0x66, 0x35, 0x61, 0x37, 0x64, 0x30, 0x63, 0x61, 0x62, 0x37, 0x33, 0x36, 0x34, 0x39, 0x65, 0x61, 0x37, 0x66, 0x62, 0x62, 0x38, 0x63, 0x38, 0x64, 0x61, 0x35, 0x34, 0x34, 0x66, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x32, 0x37, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x70, 0x6f, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x22, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x69, 0x73, 0x74, 0x72, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x38, 0x2e, 0x30, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x69, 0x64, 0x4c, 0x69, 0x6b, 0x65, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0xa, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x78, 0x65, 0x6f, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x5d, 0x22, 0xa, 0x20, 0x7d, 0xa, 0x7d, 0xa} +[]uint8{0x7b, 0xa, 0x20, 0x22, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x38, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x32, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x65, 0x62, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x49, 0x54, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x32, 0x2e, 0x30, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x70, 0x6d, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x70, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x32, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x30, 0x34, 0x2d, 0x30, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x61, 0x62, 0x35, 0x36, 0x30, 0x38, 0x64, 0x36, 0x33, 0x34, 0x64, 0x62, 0x32, 0x37, 0x31, 0x36, 0x61, 0x32, 0x39, 0x37, 0x61, 0x64, 0x62, 0x66, 0x61, 0x36, 0x61, 0x35, 0x64, 0x64, 0x35, 0x64, 0x38, 0x66, 0x38, 0x66, 0x35, 0x61, 0x37, 0x64, 0x30, 0x63, 0x61, 0x62, 0x37, 0x33, 0x36, 0x34, 0x39, 0x65, 0x61, 0x37, 0x66, 0x62, 0x62, 0x38, 0x63, 0x38, 0x64, 0x61, 0x35, 0x34, 0x34, 0x66, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x63, 0x61, 0x37, 0x33, 0x38, 0x61, 0x62, 0x62, 0x38, 0x37, 0x61, 0x38, 0x64, 0x35, 0x38, 0x66, 0x31, 0x31, 0x32, 0x64, 0x33, 0x34, 0x30, 0x30, 0x65, 0x62, 0x62, 0x30, 0x37, 0x39, 0x62, 0x36, 0x31, 0x63, 0x65, 0x61, 0x65, 0x37, 0x64, 0x63, 0x32, 0x39, 0x30, 0x62, 0x65, 0x62, 0x33, 0x34, 0x62, 0x64, 0x61, 0x37, 0x33, 0x35, 0x62, 0x65, 0x34, 0x62, 0x31, 0x39, 0x34, 0x31, 0x64, 0x35, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x2e, 0x76, 0x32, 0x2b, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x74, 0x61, 0x67, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x36, 0x35, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x2e, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x74, 0x61, 0x72, 0x2e, 0x67, 0x7a, 0x69, 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x63, 0x61, 0x37, 0x33, 0x38, 0x61, 0x62, 0x62, 0x38, 0x37, 0x61, 0x38, 0x64, 0x35, 0x38, 0x66, 0x31, 0x31, 0x32, 0x64, 0x33, 0x34, 0x30, 0x30, 0x65, 0x62, 0x62, 0x30, 0x37, 0x39, 0x62, 0x36, 0x31, 0x63, 0x65, 0x61, 0x65, 0x37, 0x64, 0x63, 0x32, 0x39, 0x30, 0x62, 0x65, 0x62, 0x33, 0x34, 0x62, 0x64, 0x61, 0x37, 0x33, 0x35, 0x62, 0x65, 0x34, 0x62, 0x31, 0x39, 0x34, 0x31, 0x64, 0x35, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x32, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x2e, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x74, 0x61, 0x72, 0x2e, 0x67, 0x7a, 0x69, 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x61, 0x30, 0x35, 0x63, 0x64, 0x39, 0x65, 0x62, 0x66, 0x38, 0x38, 0x61, 0x66, 0x39, 0x36, 0x34, 0x35, 0x30, 0x66, 0x31, 0x65, 0x32, 0x35, 0x33, 0x36, 0x37, 0x32, 0x38, 0x31, 0x61, 0x62, 0x32, 0x33, 0x32, 0x61, 0x63, 0x30, 0x36, 0x34, 0x35, 0x66, 0x33, 0x31, 0x34, 0x31, 0x32, 0x34, 0x66, 0x65, 0x30, 0x31, 0x61, 0x66, 0x37, 0x35, 0x39, 0x62, 0x39, 0x33, 0x66, 0x33, 0x30, 0x30, 0x36, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x31, 0x36, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x66, 0x73, 0x2e, 0x64, 0x69, 0x66, 0x66, 0x2e, 0x74, 0x61, 0x72, 0x2e, 0x67, 0x7a, 0x69, 0x70, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x3a, 0x61, 0x62, 0x35, 0x36, 0x30, 0x38, 0x64, 0x36, 0x33, 0x34, 0x64, 0x62, 0x32, 0x37, 0x31, 0x36, 0x61, 0x32, 0x39, 0x37, 0x61, 0x64, 0x62, 0x66, 0x61, 0x36, 0x61, 0x35, 0x64, 0x64, 0x35, 0x64, 0x38, 0x66, 0x38, 0x66, 0x35, 0x61, 0x37, 0x64, 0x30, 0x63, 0x61, 0x62, 0x37, 0x33, 0x36, 0x34, 0x39, 0x65, 0x61, 0x37, 0x66, 0x62, 0x62, 0x38, 0x63, 0x38, 0x64, 0x61, 0x35, 0x34, 0x34, 0x66, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3a, 0x20, 0x32, 0x37, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x70, 0x6f, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x22, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x69, 0x73, 0x74, 0x72, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x38, 0x2e, 0x30, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x69, 0x64, 0x4c, 0x69, 0x6b, 0x65, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0xa, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x78, 0x65, 0x6f, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x5d, 0x22, 0xa, 0x20, 0x7d, 0xa, 0x7d, 0xa} --- [TestJsonDirsPresenter - 1] -[]uint8{0x7b, 0xa, 0x20, 0x22, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x38, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x32, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x65, 0x62, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x49, 0x54, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x32, 0x2e, 0x30, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x70, 0x6d, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x70, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x32, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x30, 0x34, 0x2d, 0x30, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x22, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x69, 0x73, 0x74, 0x72, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x38, 0x2e, 0x30, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x69, 0x64, 0x4c, 0x69, 0x6b, 0x65, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0xa, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x78, 0x65, 0x6f, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x5d, 0x22, 0xa, 0x20, 0x7d, 0xa, 0x7d, 0xa} +[]uint8{0x7b, 0xa, 0x20, 0x22, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x38, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x2e, 0x32, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x65, 0x62, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x32, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x49, 0x54, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x32, 0x2e, 0x30, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x2e, 0x31, 0x2e, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x70, 0x6d, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x66, 0x6f, 0x6f, 0x2f, 0x62, 0x61, 0x72, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x31, 0x2e, 0x74, 0x78, 0x74, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x33, 0x2e, 0x32, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x70, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x32, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x50, 0x65, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x45, 0x6f, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x30, 0x34, 0x2d, 0x30, 0x32, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2d, 0x33, 0x31, 0x22, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x49, 0x44, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x50, 0x45, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x55, 0x52, 0x4c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0xa, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x31, 0x36, 0x2e, 0x30, 0x34, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x72, 0x6c, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x5d, 0x2c, 0xa, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x2f, 0x73, 0x6f, 0x6d, 0x65, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x22, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x69, 0x73, 0x74, 0x72, 0x6f, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x38, 0x2e, 0x30, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x69, 0x64, 0x4c, 0x69, 0x6b, 0x65, 0x22, 0x3a, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x6e, 0x74, 0x6f, 0x73, 0x22, 0xa, 0x20, 0x20, 0x5d, 0xa, 0x20, 0x7d, 0x2c, 0xa, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x22, 0x3a, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x78, 0x65, 0x6f, 0x6c, 0x22, 0x2c, 0xa, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x5b, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x5d, 0x22, 0xa, 0x20, 0x7d, 0xa, 0x7d, 0xa} --- [TestEmptyJsonPresenter - 1] From 004f336ac6852a8dd89d886df7205466f851b05d Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 16:56:28 -0400 Subject: [PATCH 04/15] update distribution reference Signed-off-by: Benji Visser --- go.mod | 4 ++-- xeol/policy/notary/notary.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 92c49c1d..17113092 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/bmatcuk/doublestar/v2 v2.0.4 github.com/charmbracelet/bubbletea v0.26.6 github.com/charmbracelet/lipgloss v0.12.1 - github.com/docker/distribution v2.8.3+incompatible + github.com/distribution/reference v0.6.0 github.com/docker/docker v27.1.1+incompatible github.com/dustin/go-humanize v1.0.1 github.com/gabriel-vasile/mimetype v1.4.4 @@ -108,8 +108,8 @@ require ( github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da // indirect - github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v27.0.3+incompatible // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect diff --git a/xeol/policy/notary/notary.go b/xeol/policy/notary/notary.go index d8b4c97b..c5cde27a 100644 --- a/xeol/policy/notary/notary.go +++ b/xeol/policy/notary/notary.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/docker/distribution/reference" + "github.com/distribution/reference" "github.com/wagoodman/go-partybus" "github.com/xeol-io/xeol/internal/bus" From 19c2b77a8b18882390f5283bf554434e1148e54f Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 17:03:19 -0400 Subject: [PATCH 05/15] make format Signed-off-by: Benji Visser --- xeol/distro/distro.go | 3 +-- xeol/distro/distro_test.go | 6 +++--- xeol/pkg/package_test.go | 3 +-- xeol/pkg/provider.go | 3 +-- xeol/pkg/provider_test.go | 3 +-- xeol/pkg/purl_provider.go | 3 +-- xeol/pkg/syft_provider.go | 1 + xeol/pkg/syft_sbom_provider.go | 4 ++-- xeol/pkg/syft_sbom_provider_test.go | 7 +++---- xeol/pkg/upstream_package.go | 3 +-- xeol/pkg/upstream_package_test.go | 3 +-- 11 files changed, 16 insertions(+), 23 deletions(-) diff --git a/xeol/distro/distro.go b/xeol/distro/distro.go index 9f28e8c2..a7249f9b 100644 --- a/xeol/distro/distro.go +++ b/xeol/distro/distro.go @@ -4,9 +4,8 @@ import ( "fmt" "strings" - hashiVer "github.com/hashicorp/go-version" - "github.com/anchore/syft/syft/linux" + hashiVer "github.com/hashicorp/go-version" ) // Distro represents a Linux Distribution. diff --git a/xeol/distro/distro_test.go b/xeol/distro/distro_test.go index 6acf962c..40b2c694 100644 --- a/xeol/distro/distro_test.go +++ b/xeol/distro/distro_test.go @@ -3,12 +3,12 @@ package distro import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/anchore/syft/syft/linux" "github.com/anchore/syft/syft/source" "github.com/anchore/syft/syft/source/directorysource" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/xeol-io/xeol/internal/stringutil" ) diff --git a/xeol/pkg/package_test.go b/xeol/pkg/package_test.go index 3a310de6..bce8be1c 100644 --- a/xeol/pkg/package_test.go +++ b/xeol/pkg/package_test.go @@ -5,8 +5,6 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" - "github.com/anchore/syft/syft/artifact" "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/file" @@ -15,6 +13,7 @@ import ( syftPkg "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/sbom" "github.com/anchore/syft/syft/testutil" + "github.com/stretchr/testify/assert" ) func TestNew(t *testing.T) { diff --git a/xeol/pkg/provider.go b/xeol/pkg/provider.go index 41f4cf6d..2b06dffe 100644 --- a/xeol/pkg/provider.go +++ b/xeol/pkg/provider.go @@ -4,10 +4,9 @@ import ( "errors" "fmt" - "github.com/bmatcuk/doublestar/v2" - "github.com/anchore/syft/syft/file" "github.com/anchore/syft/syft/sbom" + "github.com/bmatcuk/doublestar/v2" ) var errDoesNotProvide = fmt.Errorf("cannot provide packages from the given source") diff --git a/xeol/pkg/provider_test.go b/xeol/pkg/provider_test.go index 9b913a24..e6d8cd17 100644 --- a/xeol/pkg/provider_test.go +++ b/xeol/pkg/provider_test.go @@ -3,11 +3,10 @@ package pkg import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/anchore/stereoscope/pkg/imagetest" "github.com/anchore/syft/syft" "github.com/anchore/syft/syft/file" + "github.com/stretchr/testify/assert" ) func TestProviderLocationExcludes(t *testing.T) { diff --git a/xeol/pkg/purl_provider.go b/xeol/pkg/purl_provider.go index 28d48fa2..90f608d6 100644 --- a/xeol/pkg/purl_provider.go +++ b/xeol/pkg/purl_provider.go @@ -7,11 +7,10 @@ import ( "os" "strings" - "github.com/mitchellh/go-homedir" - "github.com/anchore/packageurl-go" "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/pkg" + "github.com/mitchellh/go-homedir" ) const ( diff --git a/xeol/pkg/syft_provider.go b/xeol/pkg/syft_provider.go index b0b5b9e7..8b11209c 100644 --- a/xeol/pkg/syft_provider.go +++ b/xeol/pkg/syft_provider.go @@ -11,6 +11,7 @@ import ( "github.com/anchore/syft/syft/sbom" "github.com/anchore/syft/syft/source" "github.com/anchore/syft/syft/source/sourceproviders" + "github.com/xeol-io/xeol/internal/log" ) diff --git a/xeol/pkg/syft_sbom_provider.go b/xeol/pkg/syft_sbom_provider.go index a222b18b..37134932 100644 --- a/xeol/pkg/syft_sbom_provider.go +++ b/xeol/pkg/syft_sbom_provider.go @@ -7,11 +7,11 @@ import ( "os" "strings" + "github.com/anchore/syft/syft/format" + "github.com/anchore/syft/syft/sbom" "github.com/gabriel-vasile/mimetype" "github.com/mitchellh/go-homedir" - "github.com/anchore/syft/syft/format" - "github.com/anchore/syft/syft/sbom" "github.com/xeol-io/xeol/internal" "github.com/xeol-io/xeol/internal/log" ) diff --git a/xeol/pkg/syft_sbom_provider_test.go b/xeol/pkg/syft_sbom_provider_test.go index a0b0018b..ee0b1678 100644 --- a/xeol/pkg/syft_sbom_provider_test.go +++ b/xeol/pkg/syft_sbom_provider_test.go @@ -5,14 +5,13 @@ import ( "strings" "testing" - "github.com/go-test/deep" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/anchore/syft/syft/cpe" "github.com/anchore/syft/syft/file" "github.com/anchore/syft/syft/linux" "github.com/anchore/syft/syft/source" + "github.com/go-test/deep" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestParseSyftJSON(t *testing.T) { diff --git a/xeol/pkg/upstream_package.go b/xeol/pkg/upstream_package.go index 73326cda..dbccc18f 100644 --- a/xeol/pkg/upstream_package.go +++ b/xeol/pkg/upstream_package.go @@ -3,9 +3,8 @@ package pkg import ( "strings" - "github.com/scylladb/go-set/strset" - "github.com/anchore/syft/syft/cpe" + "github.com/scylladb/go-set/strset" ) type UpstreamPackage struct { diff --git a/xeol/pkg/upstream_package_test.go b/xeol/pkg/upstream_package_test.go index 05a96652..4628078d 100644 --- a/xeol/pkg/upstream_package_test.go +++ b/xeol/pkg/upstream_package_test.go @@ -3,9 +3,8 @@ package pkg import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/anchore/syft/syft/cpe" + "github.com/stretchr/testify/assert" ) func TestUpstreamPackages(t *testing.T) { From 6f5890332458984b2ae05f78a69ddbfb4e6f8017 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 17:05:43 -0400 Subject: [PATCH 06/15] add os test Signed-off-by: Benji Visser --- xeol/distro/test-fixtures/os/chainguard/etc/os-release | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 xeol/distro/test-fixtures/os/chainguard/etc/os-release diff --git a/xeol/distro/test-fixtures/os/chainguard/etc/os-release b/xeol/distro/test-fixtures/os/chainguard/etc/os-release new file mode 100644 index 00000000..e053e4f0 --- /dev/null +++ b/xeol/distro/test-fixtures/os/chainguard/etc/os-release @@ -0,0 +1,5 @@ +ID=chainguard +NAME="Chainguard" +PRETTY_NAME="Chainguard" +VERSION_ID="20230214" +HOME_URL="https://chainguard.dev/" \ No newline at end of file From 5f5bae115760295ecb736d6ccd64093b391b24b3 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 17:36:27 -0400 Subject: [PATCH 07/15] update cli tests Signed-off-by: Benji Visser --- test/cli/registry_auth_test.go | 34 +++++++++++++++++----------------- test/cli/sbom_input_test.go | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/test/cli/registry_auth_test.go b/test/cli/registry_auth_test.go index 5a7ffadf..4c97960f 100644 --- a/test/cli/registry_auth_test.go +++ b/test/cli/registry_auth_test.go @@ -14,55 +14,55 @@ func TestRegistryAuth(t *testing.T) { }{ { name: "fallback to keychain", - args: []string{"-vv", "registry:localhost:5000/something:latest"}, + args: []string{"-vv", "redis:latest"}, assertions: []traitAssertion{ assertInOutput("source=OciRegistry"), - assertInOutput("localhost:5000/something:latest"), - assertInOutput(`no registry credentials configured for "localhost:5000", using the default keychain`), + assertInOutput("redis:latest"), + assertInOutput(`no registry credentials configured for "index.docker.io", using the default keychain`), }, }, { name: "use creds", - args: []string{"-vv", "registry:localhost:5000/something:latest"}, + args: []string{"-vv", "redis:latest"}, env: map[string]string{ - "XEOL_REGISTRY_AUTH_AUTHORITY": "localhost:5000", + "XEOL_REGISTRY_AUTH_AUTHORITY": "index.docker.io", "XEOL_REGISTRY_AUTH_USERNAME": "username", "XEOL_REGISTRY_AUTH_PASSWORD": "password", }, assertions: []traitAssertion{ assertInOutput("source=OciRegistry"), - assertInOutput("localhost:5000/something:latest"), - assertInOutput(`using basic auth for registry "localhost:5000"`), + assertInOutput("redis:latest"), + assertInOutput(`using basic auth for registry "index.docker.io"`), }, }, { name: "use token", - args: []string{"-vv", "registry:localhost:5000/something:latest"}, + args: []string{"-vv", "redis:latest"}, env: map[string]string{ - "XEOL_REGISTRY_AUTH_AUTHORITY": "localhost:5000", + "XEOL_REGISTRY_AUTH_AUTHORITY": "index.docker.io", "XEOL_REGISTRY_AUTH_TOKEN": "my-token", }, assertions: []traitAssertion{ assertInOutput("source=OciRegistry"), - assertInOutput("localhost:5000/something:latest"), - assertInOutput(`using token for registry "localhost:5000"`), + assertInOutput("redis:latest"), + assertInOutput(`using token for registry "index.docker.io"`), }, }, { name: "not enough info fallsback to keychain", - args: []string{"-vv", "registry:localhost:5000/something:latest"}, + args: []string{"-vv", "redis:latest"}, env: map[string]string{ - "XEOL_REGISTRY_AUTH_AUTHORITY": "localhost:5000", + "XEOL_REGISTRY_AUTH_AUTHORITY": "index.docker.io", }, assertions: []traitAssertion{ assertInOutput("source=OciRegistry"), - assertInOutput("localhost:5000/something:latest"), - assertInOutput(`no registry credentials configured for "localhost:5000", using the default keychain`), + assertInOutput("redis:latest"), + assertInOutput(`no registry credentials configured for "index.docker.io", using the default keychain`), }, }, { name: "allows insecure http flag", - args: []string{"-vv", "registry:localhost:5000/something:latest"}, + args: []string{"-vv", "redis:latest"}, env: map[string]string{ "XEOL_REGISTRY_INSECURE_USE_HTTP": "true", }, @@ -72,7 +72,7 @@ func TestRegistryAuth(t *testing.T) { }, { name: "use tls configuration", - args: []string{"-vvv", "registry:localhost:5000/something:latest"}, + args: []string{"-vvv", "redis:latest"}, env: map[string]string{ "XEOL_REGISTRY_AUTH_TLS_CERT": "place.crt", "XEOL_REGISTRY_AUTH_TLS_KEY": "place.key", diff --git a/test/cli/sbom_input_test.go b/test/cli/sbom_input_test.go index d3d21f47..854a3293 100644 --- a/test/cli/sbom_input_test.go +++ b/test/cli/sbom_input_test.go @@ -70,7 +70,7 @@ func TestSBOMInput_FromStdin(t *testing.T) { input: "./test-fixtures/empty.json", args: []string{"-c", "../xeol-test-config.yaml"}, wantErr: require.Error, - wantOutput: "unable to decode sbom: unable to identify format", + wantOutput: "unable to decode sbom: sbom format not recognized", }, { name: "sbom", From c79d5eca5098ba835f1c4460bf777810254ca768 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 17:56:57 -0400 Subject: [PATCH 08/15] update cli tests Signed-off-by: Benji Visser --- test/cli/cmd_test.go | 35 ++++++++++++++-------------- test/cli/registry_auth_test.go | 42 +++++++++++++++++----------------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/test/cli/cmd_test.go b/test/cli/cmd_test.go index 55bd4fbb..974fa159 100644 --- a/test/cli/cmd_test.go +++ b/test/cli/cmd_test.go @@ -37,23 +37,24 @@ func TestCmd(t *testing.T) { assertInOutput("sha256:1ee006886991ad4689838d3a288e0dd3fd29b70e276622f16b67a8922831a853"), // linux/arm64 image digest }, }, - { - name: "responds-to-search-options", - args: []string{"--help"}, - env: map[string]string{ - "XEOL_SEARCH_UNINDEXED_ARCHIVES": "true", - "XEOL_SEARCH_INDEXED_ARCHIVES": "false", - "XEOL_SEARCH_SCOPE": "all-layers", - }, - assertions: []traitAssertion{ - // the application config in the log matches that of what we expect to have been configured. Note: - // we are not testing further wiring of this option, only that the config responds to - // package-cataloger-level options. - assertInOutput("unindexed-archives: true"), - assertInOutput("indexed-archives: false"), - assertInOutput("scope: 'all-layers'"), - }, - }, + // TODO: uncomment this test when we can use `grype config` + // { + // name: "responds-to-search-options", + // args: []string{"--help"}, + // env: map[string]string{ + // "XEOL_SEARCH_UNINDEXED_ARCHIVES": "true", + // "XEOL_SEARCH_INDEXED_ARCHIVES": "false", + // "XEOL_SEARCH_SCOPE": "all-layers", + // }, + // assertions: []traitAssertion{ + // // the application config in the log matches that of what we expect to have been configured. Note: + // // we are not testing further wiring of this option, only that the config responds to + // // package-cataloger-level options. + // assertInOutput("unindexed-archives: true"), + // assertInOutput("indexed-archives: false"), + // assertInOutput("scope: 'all-layers'"), + // }, + // }, } for _, test := range tests { diff --git a/test/cli/registry_auth_test.go b/test/cli/registry_auth_test.go index 4c97960f..9a96e026 100644 --- a/test/cli/registry_auth_test.go +++ b/test/cli/registry_auth_test.go @@ -14,55 +14,55 @@ func TestRegistryAuth(t *testing.T) { }{ { name: "fallback to keychain", - args: []string{"-vv", "redis:latest"}, + args: []string{"-vv", "registry:localhost:5000/something:latest"}, assertions: []traitAssertion{ - assertInOutput("source=OciRegistry"), - assertInOutput("redis:latest"), - assertInOutput(`no registry credentials configured for "index.docker.io", using the default keychain`), + assertInOutput("from registry"), + assertInOutput("localhost:5000/something:latest"), + assertInOutput(`no registry credentials configured for "localhost:5000", using the default keychain`), }, }, { name: "use creds", - args: []string{"-vv", "redis:latest"}, + args: []string{"-vv", "registry:localhost:5000/something:latest"}, env: map[string]string{ - "XEOL_REGISTRY_AUTH_AUTHORITY": "index.docker.io", + "XEOL_REGISTRY_AUTH_AUTHORITY": "localhost:5000", "XEOL_REGISTRY_AUTH_USERNAME": "username", "XEOL_REGISTRY_AUTH_PASSWORD": "password", }, assertions: []traitAssertion{ - assertInOutput("source=OciRegistry"), - assertInOutput("redis:latest"), - assertInOutput(`using basic auth for registry "index.docker.io"`), + assertInOutput("from registry"), + assertInOutput("localhost:5000/something:latest"), + assertInOutput(`using basic auth for registry "localhost:5000"`), }, }, { name: "use token", - args: []string{"-vv", "redis:latest"}, + args: []string{"-vv", "registry:localhost:5000/something:latest"}, env: map[string]string{ - "XEOL_REGISTRY_AUTH_AUTHORITY": "index.docker.io", + "XEOL_REGISTRY_AUTH_AUTHORITY": "localhost:5000", "XEOL_REGISTRY_AUTH_TOKEN": "my-token", }, assertions: []traitAssertion{ - assertInOutput("source=OciRegistry"), - assertInOutput("redis:latest"), - assertInOutput(`using token for registry "index.docker.io"`), + assertInOutput("from registry"), + assertInOutput("localhost:5000/something:latest"), + assertInOutput(`using token for registry "localhost:5000"`), }, }, { name: "not enough info fallsback to keychain", - args: []string{"-vv", "redis:latest"}, + args: []string{"-vv", "registry:localhost:5000/something:latest"}, env: map[string]string{ - "XEOL_REGISTRY_AUTH_AUTHORITY": "index.docker.io", + "XEOL_REGISTRY_AUTH_AUTHORITY": "localhost:5000", }, assertions: []traitAssertion{ - assertInOutput("source=OciRegistry"), - assertInOutput("redis:latest"), - assertInOutput(`no registry credentials configured for "index.docker.io", using the default keychain`), + assertInOutput("from registry"), + assertInOutput("localhost:5000/something:latest"), + assertInOutput(`no registry credentials configured for "localhost:5000", using the default keychain`), }, }, { name: "allows insecure http flag", - args: []string{"-vv", "redis:latest"}, + args: []string{"-vv", "registry:localhost:5000/something:latest"}, env: map[string]string{ "XEOL_REGISTRY_INSECURE_USE_HTTP": "true", }, @@ -72,7 +72,7 @@ func TestRegistryAuth(t *testing.T) { }, { name: "use tls configuration", - args: []string{"-vvv", "redis:latest"}, + args: []string{"-vvv", "registry:localhost:5000/something:latest"}, env: map[string]string{ "XEOL_REGISTRY_AUTH_TLS_CERT": "place.crt", "XEOL_REGISTRY_AUTH_TLS_KEY": "place.key", From 59bbda62020f8174b743ab1c24dea57590b648a4 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 18:08:43 -0400 Subject: [PATCH 09/15] fix integration tests Signed-off-by: Benji Visser --- test/integration/match_by_image_test.go | 47 ++++--------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/test/integration/match_by_image_test.go b/test/integration/match_by_image_test.go index 3e18d5b6..fe9f9ddd 100644 --- a/test/integration/match_by_image_test.go +++ b/test/integration/match_by_image_test.go @@ -148,7 +148,7 @@ func addPostgres9Matches(t *testing.T, theResult *match.Matches) { ID: "2ba17cf1680ce4f2", Version: "9.6.24-1.pgdg90+1", Type: syftPkg.DebPkg, - PURL: "pkg:deb/debian/postgresql-9.6@9.6.24-1.pgdg90+1?arch=amd64&distro=debian-9", + PURL: "pkg:deb/debian/postgresql-9.6@9.6.24-1.pgdg90%2B1?arch=amd64&distro=debian-9", }, Cycle: eol.Cycle{ ProductName: "PostgreSQL", @@ -158,49 +158,14 @@ func addPostgres9Matches(t *testing.T, theResult *match.Matches) { }) } -func addElaticsearch6Matches(t *testing.T, theResult *match.Matches) { - // TODO: tracking issue https://github.com/anchore/syft/issues/2153 - // theResult.Add(match.Match{ - // Package: pkg.Package{ - // Name: "python", - // ID: "2ba17cf1680ce4f2", - // Version: "2.7.5", - // Type: syftPkg.BinaryPkg, - // Language: "", - // PURL: "pkg:generic/python@2.7.5", - // }, - // Cycle: eol.Cycle{ - // ProductName: "Python", - // ReleaseCycle: "2.7", - // Eol: "2020-01-01", - // }, - // }) - theResult.Add(match.Match{ - Package: pkg.Package{ - Name: "elasticsearch", - ID: "2ba17cf1680ce4f2", - Version: "6.8.21", - Type: syftPkg.JavaPkg, - Language: syftPkg.Java, - PURL: "pkg:maven/org.elasticsearch%23server/elasticsearch@6.8.21", - }, - Cycle: eol.Cycle{ - ReleaseCycle: "6", - ProductName: "Elasticsearch", - Eol: "2022-02-10", - }, - }) -} - func addNodejs6Matches(t *testing.T, theResult *match.Matches) { theResult.Add(match.Match{ Package: pkg.Package{ - Name: "node", - ID: "2ba17cf1680ce4f2", - Version: "6.13.1", - Type: syftPkg.BinaryPkg, - Language: syftPkg.JavaScript, - PURL: "pkg:generic/node@6.13.1", + Name: "node", + ID: "2ba17cf1680ce4f2", + Version: "6.13.1", + Type: syftPkg.BinaryPkg, + PURL: "pkg:generic/node@6.13.1", }, Cycle: eol.Cycle{ ProductName: "Node.js", From 3b3422400e7f45e60d57cbf0a6df622dc1936fd0 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Thu, 8 Aug 2024 18:09:29 -0400 Subject: [PATCH 10/15] remove reference to old test Signed-off-by: Benji Visser --- test/integration/match_by_image_test.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/integration/match_by_image_test.go b/test/integration/match_by_image_test.go index fe9f9ddd..81b7e3a7 100644 --- a/test/integration/match_by_image_test.go +++ b/test/integration/match_by_image_test.go @@ -285,14 +285,6 @@ func TestMatchByImage(t *testing.T) { return expectedMatches }, }, - { - fixtureImage: "image-elasticsearch-6", - expectedFn: func() match.Matches { - expectedMatches := match.NewMatches() - addElaticsearch6Matches(t, &expectedMatches) - return expectedMatches - }, - }, { fixtureImage: "image-redis-5", expectedFn: func() match.Matches { From 77ff8aa07d0330757f7af97afb9c11730b12ebeb Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Fri, 9 Aug 2024 11:57:09 -0400 Subject: [PATCH 11/15] add catalogers Signed-off-by: Benji Visser --- cmd/xeol/cli/commands/root.go | 40 ++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/cmd/xeol/cli/commands/root.go b/cmd/xeol/cli/commands/root.go index afcdd6d3..4d29fc62 100644 --- a/cmd/xeol/cli/commands/root.go +++ b/cmd/xeol/cli/commands/root.go @@ -11,6 +11,7 @@ import ( "github.com/CycloneDX/cyclonedx-go" "github.com/anchore/clio" "github.com/anchore/syft/syft" + "github.com/anchore/syft/syft/cataloging/pkgcataloging" "github.com/anchore/syft/syft/format/common/cyclonedxhelpers" "github.com/anchore/syft/syft/linux" syftPkg "github.com/anchore/syft/syft/pkg" @@ -348,7 +349,44 @@ func getMatchers(opts *options.Xeol) []matcher.Matcher { } func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { - cfg := syft.DefaultCreateSBOMConfig() + cfg := syft.DefaultCreateSBOMConfig().WithCatalogerSelection( + pkgcataloging.NewSelectionRequest().WithRemovals( + "dotnet-portable-executable-cataloger", + ).WithAdditions( + "alpm-db-cataloger", + "apkdb-cataloger", + "binary-cataloger", + "cargo-auditable-binary-cataloger", + "cocoapods-cataloger", + "conan-cataloger", + "dartlang-lock-cataloger", + "dotnet-deps-cataloger", + "dpkgdb-cataloger", + "javascript-cataloger", + "elixir-mix-lock-cataloger", + "erlang-rebar-lock-cataloger", + "go-module-file-cataloger", + "go-module-binary-cataloger", + "graalvm-native-image-cataloger", + "haskell-cataloger", + "java-cataloger", + "java-gradle-lockfile-cataloger", + "java-pom-cataloger", + "linux-kernel-cataloger", + "nix-store-cataloger", + "php-composer-installed-cataloger", + "php-composer-lock-cataloger", + "portage-cataloger", + "python-package-cataloger", + "python-installed-package-cataloger", + "rpm-db-cataloger", + "rpm-archive-cataloger", + "ruby-gemfile-cataloger", + "ruby-installed-gemspec-cataloger", + "rust-cargo-lock-cataloger", + "sbom-cataloger", + "spm-cataloger", + )) return pkg.ProviderConfig{ SyftProviderConfig: pkg.SyftProviderConfig{ From 76a52bbc1c49b7db627e5f21a95e823e36c750e4 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Fri, 9 Aug 2024 11:58:24 -0400 Subject: [PATCH 12/15] add comment about dotnet cataloger Signed-off-by: Benji Visser --- cmd/xeol/cli/commands/root.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/xeol/cli/commands/root.go b/cmd/xeol/cli/commands/root.go index 4d29fc62..9df6a055 100644 --- a/cmd/xeol/cli/commands/root.go +++ b/cmd/xeol/cli/commands/root.go @@ -351,6 +351,8 @@ func getMatchers(opts *options.Xeol) []matcher.Matcher { func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { cfg := syft.DefaultCreateSBOMConfig().WithCatalogerSelection( pkgcataloging.NewSelectionRequest().WithRemovals( + // the dotnet-executable-parser has myriad issues with naming as well as + // incorrect versioning, excluding it for now until the quality is better. "dotnet-portable-executable-cataloger", ).WithAdditions( "alpm-db-cataloger", From 3eb9a0b5b92f385b5cc155691fee0ed0c82b2d01 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Fri, 9 Aug 2024 11:58:59 -0400 Subject: [PATCH 13/15] add pr link Signed-off-by: Benji Visser --- cmd/xeol/cli/commands/root.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/xeol/cli/commands/root.go b/cmd/xeol/cli/commands/root.go index 9df6a055..3618fca6 100644 --- a/cmd/xeol/cli/commands/root.go +++ b/cmd/xeol/cli/commands/root.go @@ -353,6 +353,7 @@ func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { pkgcataloging.NewSelectionRequest().WithRemovals( // the dotnet-executable-parser has myriad issues with naming as well as // incorrect versioning, excluding it for now until the quality is better. + // https://github.com/xeol-io/xeol/pull/232 "dotnet-portable-executable-cataloger", ).WithAdditions( "alpm-db-cataloger", From 6e44065e0ed4667e7f8e27cdc9a68fd24ba4579e Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Sat, 10 Aug 2024 17:02:13 -0400 Subject: [PATCH 14/15] change catalogers Signed-off-by: Benji Visser --- cmd/xeol/cli/commands/root.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/xeol/cli/commands/root.go b/cmd/xeol/cli/commands/root.go index 3618fca6..e20c2947 100644 --- a/cmd/xeol/cli/commands/root.go +++ b/cmd/xeol/cli/commands/root.go @@ -357,22 +357,23 @@ func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { "dotnet-portable-executable-cataloger", ).WithAdditions( "alpm-db-cataloger", - "apkdb-cataloger", + "apk-db-cataloger", "binary-cataloger", "cargo-auditable-binary-cataloger", "cocoapods-cataloger", "conan-cataloger", - "dartlang-lock-cataloger", + "dart-pubspec-lock-cataloger", "dotnet-deps-cataloger", - "dpkgdb-cataloger", - "javascript-cataloger", + "dpkg-db-cataloger", + "javascript-package-cataloger", + "javascript-lock-cataloger", "elixir-mix-lock-cataloger", "erlang-rebar-lock-cataloger", "go-module-file-cataloger", "go-module-binary-cataloger", "graalvm-native-image-cataloger", "haskell-cataloger", - "java-cataloger", + "java-archive-cataloger", "java-gradle-lockfile-cataloger", "java-pom-cataloger", "linux-kernel-cataloger", @@ -388,7 +389,6 @@ func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { "ruby-installed-gemspec-cataloger", "rust-cargo-lock-cataloger", "sbom-cataloger", - "spm-cataloger", )) return pkg.ProviderConfig{ From 959e9c563dea1b2762a03596ecf6cfbf211af4c6 Mon Sep 17 00:00:00 2001 From: Benji Visser Date: Sat, 10 Aug 2024 17:31:37 -0400 Subject: [PATCH 15/15] remove binary cataloger Signed-off-by: Benji Visser --- cmd/xeol/cli/commands/root.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/xeol/cli/commands/root.go b/cmd/xeol/cli/commands/root.go index e20c2947..4e926831 100644 --- a/cmd/xeol/cli/commands/root.go +++ b/cmd/xeol/cli/commands/root.go @@ -358,7 +358,6 @@ func getProviderConfig(opts *options.Xeol) pkg.ProviderConfig { ).WithAdditions( "alpm-db-cataloger", "apk-db-cataloger", - "binary-cataloger", "cargo-auditable-binary-cataloger", "cocoapods-cataloger", "conan-cataloger",